summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/build.yml44
-rw-r--r--INSTALL.md560
-rw-r--r--Makefile252
-rw-r--r--README.md5
-rw-r--r--asm/macros/event.inc17
-rwxr-xr-xasmdiff.sh10
-rw-r--r--berry_fix/Makefile53
-rw-r--r--berry_fix/payload/Makefile51
-rw-r--r--berry_fix/payload/include/gba/m4a_internal.h2
-rw-r--r--data/battle_ai_scripts.s255
-rw-r--r--data/battle_anim_scripts.s30
-rw-r--r--data/battle_scripts_1.s456
-rw-r--r--data/event_scripts.s2
-rw-r--r--data/maps/BattleFrontier_BattlePyramidFloor/scripts.inc2
-rw-r--r--data/maps/BattleFrontier_BattlePyramidTop/scripts.inc6
-rw-r--r--data/maps/BirthIsland_Exterior/scripts.inc2
-rw-r--r--data/maps/EverGrandeCity_ChampionsRoom/scripts.inc6
-rw-r--r--data/maps/EverGrandeCity_DrakesRoom/scripts.inc2
-rw-r--r--data/maps/EverGrandeCity_GlaciasRoom/scripts.inc2
-rw-r--r--data/maps/EverGrandeCity_PhoebesRoom/scripts.inc2
-rw-r--r--data/maps/EverGrandeCity_SidneysRoom/scripts.inc2
-rw-r--r--data/maps/LavaridgeTown/scripts.inc4
-rw-r--r--data/maps/LilycoveCity/scripts.inc6
-rw-r--r--data/maps/LilycoveCity_ContestLobby/scripts.inc18
-rw-r--r--data/maps/LilycoveCity_LilycoveMuseum_2F/scripts.inc12
-rw-r--r--data/maps/LilycoveCity_PokemonTrainerFanClub/scripts.inc2
-rw-r--r--data/maps/LittlerootTown_BrendansHouse_1F/scripts.inc2
-rw-r--r--data/maps/LittlerootTown_BrendansHouse_2F/scripts.inc2
-rw-r--r--data/maps/LittlerootTown_MaysHouse_1F/scripts.inc2
-rw-r--r--data/maps/LittlerootTown_MaysHouse_2F/scripts.inc2
-rw-r--r--data/maps/MagmaHideout_2F_2R/map.json2
-rw-r--r--data/maps/MagmaHideout_4F/map.json2
-rw-r--r--data/maps/MagmaHideout_4F/scripts.inc2
-rw-r--r--data/maps/MeteorFalls_1F_1R/scripts.inc4
-rw-r--r--data/maps/MtChimney/scripts.inc2
-rw-r--r--data/maps/MtPyre_Summit/scripts.inc2
-rw-r--r--data/maps/OldaleTown/scripts.inc2
-rw-r--r--data/maps/PetalburgCity/scripts.inc2
-rw-r--r--data/maps/PetalburgCity_Gym/scripts.inc4
-rw-r--r--data/maps/PetalburgWoods/scripts.inc4
-rw-r--r--data/maps/Route101/scripts.inc2
-rw-r--r--data/maps/Route103/scripts.inc4
-rw-r--r--data/maps/Route104/scripts.inc4
-rw-r--r--data/maps/Route110/scripts.inc4
-rw-r--r--data/maps/Route119/scripts.inc4
-rw-r--r--data/maps/Route121/scripts.inc2
-rw-r--r--data/maps/RustboroCity/scripts.inc6
-rw-r--r--data/maps/RustboroCity_DevonCorp_3F/scripts.inc2
-rw-r--r--data/maps/RusturfTunnel/scripts.inc2
-rw-r--r--data/maps/SeafloorCavern_Room9/scripts.inc2
-rw-r--r--data/maps/SlateportCity/scripts.inc2
-rw-r--r--data/maps/SlateportCity_OceanicMuseum_2F/scripts.inc2
-rw-r--r--data/maps/map_groups.json138
-rw-r--r--data/script_cmd_table.inc2
-rw-r--r--data/scripts/contest_hall.inc2
-rw-r--r--data/scripts/gabby_and_ty.inc6
-rw-r--r--data/scripts/item_ball_scripts.inc4
-rw-r--r--data/scripts/players_house.inc4
-rw-r--r--data/scripts/tv.inc8
-rw-r--r--data/specials.inc20
-rw-r--r--data/text/berry_descriptions.inc258
-rw-r--r--data/text/contest_painting.inc2
-rw-r--r--data/text/tv.inc26
-rw-r--r--docs/legacy_WSL1_INSTALL.md41
-rw-r--r--gflib/bg.c56
-rw-r--r--gflib/bg.h2
-rw-r--r--gflib/sprite.c7
-rw-r--r--gflib/text.c6
-rw-r--r--graphics/contest/results_screen/bg.bin (renamed from graphics/contest/misc_2_tilemap_3.bin)0
-rw-r--r--graphics/contest/results_screen/interface.bin (renamed from graphics/contest/misc_2_tilemap_2.bin)bin2048 -> 2048 bytes
-rw-r--r--graphics/contest/results_screen/text_window.pal (renamed from graphics/unknown/unknown_58D6B0.pal)0
-rw-r--r--graphics/contest/results_screen/text_window.png (renamed from graphics/unknown/unknown_58D6D0.png)bin223 -> 223 bytes
-rw-r--r--graphics/contest/results_screen/tiles.pal (renamed from graphics/contest/results_screen.pal)0
-rw-r--r--graphics/contest/results_screen/tiles.png (renamed from graphics/contest/results_screen.png)bin1775 -> 1775 bytes
-rw-r--r--graphics/contest/results_screen/title.bin (renamed from graphics/contest/results_screen.bin)bin24 -> 24 bytes
-rw-r--r--graphics/contest/results_screen/title_beauty.bin (renamed from graphics/contest/results_screen_beauty.bin)0
-rw-r--r--graphics/contest/results_screen/title_cool.bin (renamed from graphics/contest/results_screen_cool.bin)bin20 -> 20 bytes
-rw-r--r--graphics/contest/results_screen/title_cute.bin (renamed from graphics/contest/results_screen_cute.bin)0
-rw-r--r--graphics/contest/results_screen/title_hyper.bin (renamed from graphics/contest/results_screen_hyper.bin)bin40 -> 40 bytes
-rw-r--r--graphics/contest/results_screen/title_link.bin (renamed from graphics/contest/results_screen_link.bin)bin20 -> 20 bytes
-rw-r--r--graphics/contest/results_screen/title_master.bin (renamed from graphics/contest/results_screen_master.bin)bin40 -> 40 bytes
-rw-r--r--graphics/contest/results_screen/title_normal.bin (renamed from graphics/contest/results_screen_normal.bin)bin40 -> 40 bytes
-rw-r--r--graphics/contest/results_screen/title_smart.bin (renamed from graphics/contest/results_screen_smart.bin)0
-rw-r--r--graphics/contest/results_screen/title_super.bin (renamed from graphics/contest/results_screen_super.bin)bin40 -> 40 bytes
-rw-r--r--graphics/contest/results_screen/title_tough.bin (renamed from graphics/contest/results_screen_tough.bin)0
-rw-r--r--graphics/contest/results_screen/winner_banner.bin (renamed from graphics/contest/misc_2_tilemap_1.bin)bin2048 -> 2048 bytes
-rw-r--r--graphics/picture_frame/beauty.png (renamed from graphics/picture_frame/frame1.png)bin1422 -> 1422 bytes
-rw-r--r--graphics/picture_frame/beauty_map.bin (renamed from graphics/picture_frame/frame1_map.bin)bin2048 -> 2048 bytes
-rw-r--r--graphics/picture_frame/cool.png (renamed from graphics/picture_frame/frame0.png)bin1920 -> 1920 bytes
-rw-r--r--graphics/picture_frame/cool_map.bin (renamed from graphics/picture_frame/frame0_map.bin)bin2048 -> 2048 bytes
-rw-r--r--graphics/picture_frame/cute.png (renamed from graphics/picture_frame/frame2.png)bin1238 -> 1238 bytes
-rw-r--r--graphics/picture_frame/cute_map.bin (renamed from graphics/picture_frame/frame2_map.bin)bin2048 -> 2048 bytes
-rw-r--r--graphics/picture_frame/lobby.png (renamed from graphics/picture_frame/frame5.png)bin666 -> 666 bytes
-rw-r--r--graphics/picture_frame/lobby_map.bin (renamed from graphics/picture_frame/frame5_map.bin)bin2048 -> 2048 bytes
-rw-r--r--graphics/picture_frame/smart.png (renamed from graphics/picture_frame/frame3.png)bin2287 -> 2287 bytes
-rw-r--r--graphics/picture_frame/smart_map.bin (renamed from graphics/picture_frame/frame3_map.bin)bin2048 -> 2048 bytes
-rw-r--r--graphics/picture_frame/tough.png (renamed from graphics/picture_frame/frame4.png)bin2030 -> 2030 bytes
-rw-r--r--graphics/picture_frame/tough_map.bin (renamed from graphics/picture_frame/frame4_map.bin)bin2048 -> 2048 bytes
-rw-r--r--graphics_file_rules.mk2
-rw-r--r--include/battle_anim.h2
-rw-r--r--include/battle_pyramid_bag.h54
-rw-r--r--include/constants/battle_ai.h28
-rw-r--r--include/constants/battle_frontier.h15
-rw-r--r--include/constants/battle_string_ids.h2
-rw-r--r--include/constants/contest.h17
-rw-r--r--include/constants/easy_chat.h2
-rwxr-xr-xinclude/constants/map_groups.h68
-rw-r--r--include/constants/metatile_labels.h2
-rw-r--r--include/constants/trainer_hill.h5
-rw-r--r--include/constants/tv.h53
-rw-r--r--include/contest.h16
-rw-r--r--include/contest_util.h4
-rw-r--r--include/data.h10
-rw-r--r--include/daycare.h2
-rwxr-xr-xinclude/ereader_helpers.h24
-rw-r--r--include/event_object_lock.h4
-rw-r--r--include/event_scripts.h26
-rw-r--r--include/gba/m4a_internal.h2
-rw-r--r--include/global.fieldmap.h16
-rw-r--r--include/global.h8
-rw-r--r--include/global.tv.h22
-rw-r--r--include/graphics.h28
-rw-r--r--include/international_string_util.h2
-rw-r--r--include/link.h2
-rw-r--r--include/list_menu.h2
-rw-r--r--include/mauville_old_man.h2
-rw-r--r--include/menu.h4
-rw-r--r--include/menu_helpers.h2
-rw-r--r--include/pokemon.h1
-rw-r--r--include/region_map.h2
-rw-r--r--include/strings.h7
-rw-r--r--include/tv.h30
-rw-r--r--ld_script_modern.txt23
-rw-r--r--libagbsyscall/Makefile52
-rw-r--r--make_tools.mk11
-rwxr-xr-xmap_data_rules.mk4
-rw-r--r--src/apprentice.c27
-rw-r--r--src/battle_ai_script_commands.c58
-rw-r--r--src/battle_anim_dark.c10
-rwxr-xr-xsrc/battle_anim_effects_2.c16
-rwxr-xr-xsrc/battle_anim_effects_3.c8
-rw-r--r--src/battle_anim_mons.c6
-rw-r--r--src/battle_anim_sound_tasks.c8
-rwxr-xr-xsrc/battle_anim_throw.c7
-rw-r--r--src/battle_dome.c65
-rw-r--r--src/battle_factory.c2
-rw-r--r--src/battle_factory_screen.c5
-rw-r--r--src/battle_gfx_sfx_util.c6
-rw-r--r--src/battle_interface.c25
-rw-r--r--src/battle_main.c15
-rw-r--r--src/battle_message.c8
-rw-r--r--src/battle_pyramid.c6
-rw-r--r--src/battle_pyramid_bag.c978
-rw-r--r--src/battle_script_commands.c26
-rw-r--r--src/battle_tower.c1
-rw-r--r--src/battle_transition.c27
-rw-r--r--src/bike.c29
-rw-r--r--src/contest.c109
-rw-r--r--src/contest_painting.c255
-rw-r--r--src/contest_util.c302
-rw-r--r--src/data.c277
-rw-r--r--src/data/contest_opponents.h16
-rw-r--r--src/data/pokemon_graphics/unknown_table.h444
-rw-r--r--src/daycare.c18
-rw-r--r--src/decoration.c10
-rw-r--r--src/easy_chat.c4
-rw-r--r--src/egg_hatch.c5
-rwxr-xr-xsrc/ereader_helpers.c510
-rwxr-xr-xsrc/ereader_screen.c10
-rw-r--r--src/event_object_lock.c8
-rw-r--r--src/evolution_scene.c12
-rw-r--r--src/field_specials.c3
-rw-r--r--src/fldeff_misc.c1
-rw-r--r--src/frontier_util.c26
-rw-r--r--src/graphics.c32
-rw-r--r--src/hall_of_fame.c23
-rw-r--r--src/international_string_util.c2
-rw-r--r--src/item.c21
-rwxr-xr-xsrc/item_menu.c19
-rwxr-xr-xsrc/item_use.c20
-rw-r--r--src/m4a.c15
-rw-r--r--src/main_menu.c19
-rw-r--r--src/mauville_old_man.c48
-rw-r--r--src/menu.c25
-rw-r--r--src/menu_helpers.c2
-rw-r--r--src/menu_specialized.c2
-rw-r--r--src/mystery_gift.c24
-rw-r--r--src/new_game.c8
-rw-r--r--src/overworld.c6
-rwxr-xr-xsrc/party_menu.c4
-rw-r--r--src/player_pc.c19
-rw-r--r--src/pokeball.c100
-rw-r--r--src/pokemon.c5
-rw-r--r--src/pokemon_animation.c15
-rw-r--r--src/pokemon_size_record.c2
-rw-r--r--src/pokemon_storage_system.c7
-rw-r--r--src/pokemon_summary_screen.c20
-rwxr-xr-xsrc/pokenav_region_map.c4
-rw-r--r--src/post_battle_event_funcs.c1
-rw-r--r--src/record_mixing.c106
-rw-r--r--src/region_map.c20
-rw-r--r--src/rotating_gate.c3
-rw-r--r--src/roulette.c40
-rw-r--r--src/safari_zone.c2
-rw-r--r--src/scrcmd.c16
-rw-r--r--src/script_menu.c2
-rwxr-xr-xsrc/script_pokemon_util.c1
-rw-r--r--src/secret_base.c1
-rwxr-xr-xsrc/shop.c15
-rw-r--r--src/siirtc.c29
-rw-r--r--src/slot_machine.c2
-rw-r--r--src/strings.c19
-rwxr-xr-xsrc/trainer_card.c4
-rw-r--r--src/trainer_hill.c11
-rw-r--r--src/trainer_pokemon_sprites.c2
-rw-r--r--src/tv.c6103
-rw-r--r--src/union_room.c26
-rwxr-xr-xsrc/union_room_chat.c2
-rw-r--r--src/wild_encounter.c4
-rw-r--r--tools/aif2pcm/Makefile10
-rw-r--r--tools/bin2c/Makefile10
-rw-r--r--tools/gbafix/Makefile10
-rw-r--r--tools/gbagfx/Makefile12
-rwxr-xr-xtools/jsonproc/Makefile10
-rw-r--r--tools/mapjson/Makefile10
-rw-r--r--tools/mapjson/mapjson.cpp2
-rw-r--r--tools/mid2agb/Makefile10
-rw-r--r--tools/preproc/Makefile10
-rw-r--r--tools/preproc/c_file.cpp55
-rw-r--r--tools/preproc/c_file.h5
-rw-r--r--tools/preproc/preproc.cpp22
-rw-r--r--tools/ramscrgen/Makefile10
-rw-r--r--tools/rsfont/Makefile10
-rw-r--r--tools/scaninc/Makefile10
234 files changed, 6977 insertions, 6424 deletions
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 822b386ea..a8bd016cb 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -7,11 +7,29 @@ on:
jobs:
build:
- runs-on: ubuntu-18.04
+ runs-on: ubuntu-latest
+ env:
+ GAME_VERSION: EMERALD
+ GAME_REVISION: 0
+ GAME_LANGUAGE: ENGLISH
+ MODERN: 0
+ COMPARE: 1
steps:
- name: Checkout
uses: actions/checkout@master
+ - name: Checkout syms
+ uses: actions/checkout@master
+ with:
+ path: symbols
+ ref: symbols
+
+ - name: Checkout agbcc
+ uses: actions/checkout@master
+ with:
+ path: agbcc
+ repository: pret/agbcc
+
- name: Install binutils
run: sudo apt install gcc-arm-none-eabi binutils-arm-none-eabi
# build-essential, git, and libpng-dev are already installed
@@ -20,16 +38,18 @@ jobs:
- name: Install agbcc
run: |
- git clone https://github.com/pret/agbcc.git
- cd agbcc
./build.sh
./install.sh ../
+ working-directory: agbcc
- name: Compare
- run: make -j${nproc} compare
+ run: make -j${nproc} all syms
- name: Modern
- run: make -j${nproc} modern
+ env:
+ MODERN: 1
+ COMPARE: 0
+ run: make -j${nproc} all
- name: Webhook
if: ${{ github.event_name == 'push' }}
@@ -38,3 +58,17 @@ jobs:
CALCROM_DISCORD_WEBHOOK_AVATAR_URL: https://i.imgur.com/38BQHdd.png
CALCROM_DISCORD_WEBHOOK_URL: ${{ secrets.CALCROM_DISCORD_WEBHOOK_URL }}
run: sh .github/calcrom/webhook.sh pokeemerald
+
+ - name: Move symfiles
+ if: ${{ github.event_name == 'push' }}
+ run: |
+ cp -v *.sym symbols/
+
+ - name: Update symfiles
+ if: ${{ github.event_name == 'push' }}
+ uses: EndBug/add-and-commit@v7
+ with:
+ branch: symbols
+ cwd: "./symbols"
+ add: "*.sym"
+ message: ${{ github.event.pull_request.title }}
diff --git a/INSTALL.md b/INSTALL.md
index 20d55e134..1ad3b4b0c 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -1,95 +1,569 @@
-# Prerequisites
+# Instructions
-| Linux | macOS | Windows 10
-| - | - | -
-| none | [Xcode Command Line Tools Package][xcode] | [Windows Terminal][terminal] and [Windows Subsystem for Linux (WSL)][wsl]
+These instructions explain how to set up the tools required to build **pokeemerald**, which assembles the source files into a ROM.
-[xcode]: https://developer.apple.com/library/archive/technotes/tn2339/_index.html
-[terminal]: https://docs.microsoft.com/windows/terminal/get-started
-[wsl]: https://docs.microsoft.com/windows/wsl/install-win10
+These instructions come with notes which can be expanded by clicking the "<i>Note...</i>" text.
+In general, you should not need to open these unless if you get an error or if you need additional clarification.
-Independently from the specific OS, make sure that the `gcc`, `g++`, `make`, `git`, and `libpng-dev` packages or their equivalents are installed and accessible to the development tools that are used by the project (this means that, for example, on Windows, the packages have to be installed in the WSL environment). The package names and installation methods may vary with each OS.
+If you run into trouble, ask for help on Discord or IRC (see [README.md](README.md)).
-Install the devkitARM toolchain of devkitPro as per [the instructions on their wiki](https://devkitpro.org/wiki/devkitPro_pacman). On Windows, follow the Linux instructions inside WSL as any steps about the Windows installer do not apply.
+## Windows
+Windows has instructions for building with three possible terminals, providing 3 different options in case the user stumbles upon unexpected errors.
+- [Windows 10 (WSL1)](#windows-10-wsl1) (**Fastest, highly recommended**, Windows 10 only)
+- [Windows (msys2)](#windows-msys2) (Second fastest)
+- [Windows (Cygwin)](#windows-cygwin) (Slowest)
-**Debian-based distro users:** This applies to Debian, Ubuntu, and similar distros, including in WSL. If necessary, install the `libarchive13`, `pkg-config`, and `gdebi-core` packages to be able to install devkitPro.
+Unscientific benchmarks suggest **msys2 is 2x slower** than WSL1, and **Cygwin is 5-6x slower** than WSL1.
+<details>
+ <summary><i>Note for advanced users: <b>WSL2</b>...</i></summary>
-**Windows 10 users:** WSL 2 is available in the 1903 release (build 18362) and later, therefore existing WSL 1 and [prerelease WSL](https://docs.microsoft.com/windows/wsl/install-legacy) users are recommended to update. Right-click the Start button or press `Win`+`X`, choose Run, and run `ms-settings:about` to determine the Windows version. Also check Windows Update to make sure your installation is up-to-date.
+> <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
+> 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>
+> may <a href="https://bugreports.qt.io/browse/QTBUG-86277">have problems with parsing the <code>\\wsl$</code> network drive path</a>.
+</details>
-**Windows 7 and 8.1 users:** pret is no longer focusing on support in pokeemerald for [old versions of Windows](https://support.microsoft.com/help/13853) so consider upgrading to a current release of Windows 10 or try a third-party guide like [this one](https://www.pokecommunity.com/showthread.php?t=425246) instead.
+All 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.
+**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.
-# Installation
+## Windows 10 (WSL1)
+WSL1 is the preferred terminal to build **pokeemerald**. The following instructions will explain how to install WSL1 (referred to interchangeably as WSL).
+- If WSL (Debian or Ubuntu) is **not installed**, then go to [Installing WSL1](#Installing-WSL1).
+- Otherwise, if WSL is installed, but it **hasn't previously been set up for another decompilation project**, then go to [Setting up WSL1](#Setting-up-WSL1).
+- Otherwise, **open WSL** and go to [Choosing where to store pokeemerald (WSL1)](#Choosing-where-to-store-pokeemerald-WSL1).
-To set up the repository:
+### Installing WSL1
+1. 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).
- git clone https://github.com/pret/pokeemerald
- git clone https://github.com/pret/agbcc
+ ```powershell
+ dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
+ ```
- cd ./agbcc
- ./build.sh
- ./install.sh ../pokeemerald
+2. Once the process finishes, restart your machine.
- cd ../pokeemerald
+3. 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.
+ <details>
+ <summary><i>Note for advanced users...</i></summary>
+
+ > You can pick a preferred Linux distribution, but setup instructions may differ. Debian should work with the given instructions, but has not been tested.
+ </details>
-To build **pokeemerald.gba** for the first time and confirm it matches the official ROM image:
+4. Open the [Microsoft Store Linux Selection](https://aka.ms/wslstore), click Ubuntu, then click Get, which will install the Ubuntu distribution.
+ <details>
+ <summary><i>Notes...</i></summary>
- make compare
+ > Note 1: If a dialog pops up asking for you to sign into a Microsoft Account, then just close the dialog.
+ > 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).
+ </details>
-If an OK is returned, then the installation went smoothly.
+### Setting up WSL1
+Some tips before proceeding:
+- In WSL, Copy and Paste is either done via
+ - **right-click** (selection + right click to Copy, right click with no selection to Paste)
+ - **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").
+- 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.
-**Windows users:** Consider adding exceptions for the `pokeemerald` and `agbcc` folders in Windows Security using [these instructions](https://support.microsoft.com/help/4028485). This prevents Microsoft Defender from scanning them which might improve performance while building.
+1. Open **Ubuntu** (e.g. using Search).
+2. 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).
+ <details>
+ <summary><i>Note...</i></summary>
+ > When typing in the password, there will be no visible response, but the terminal will still read in input.
+ </details>
-# Start
+3. Update WSL/Ubuntu before continuing. Do this by running the following command. These commands will likely take a long time to finish:
-To build **pokeemerald.gba** with your changes:
+ ```bash
+ sudo apt update && sudo apt upgrade
+ ```
- make
+> Note: If the repository you plan to build has an **[older revision of the INSTALL.md](https://github.com/pret/pokeemerald/blob/571c598/INSTALL.md)**, then follow the [legacy WSL1 instructions](docs/legacy_WSL1_INSTALL.md) from here.
-**macOS users:** If the base tools are not found in new Terminal sessions after the first successful build, run `echo "if [ -f ~/.bashrc ]; then . ~/.bashrc; fi" >> ~/.bash_profile` once to prevent the issue from occurring again. Verify that the `devkitarm-rules` package is installed as well; if not, install it by running `sudo dkp-pacman -S devkitarm-rules`.
+4. Certain packages are required to build pokeemerald. Install these packages by running the following command:
+ ```bash
+ sudo apt install build-essential binutils-arm-none-eabi git libpng-dev
+ ```
+ <details>
+ <summary><i>Note...</i></summary>
-# Building guidance
+ > If the above command does not work, try the above command but replacing `apt` with `apt-get`.
+ </details>
+
+### Choosing where to store pokeemerald (WSL1)
+WSL 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 pokeemerald within Windows.
+
+For example, say you want to store pokeemerald (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:
+
+```bash
+cd /mnt/c/Users/<user>/Desktop/decomps
+```
+
+<details>
+ <summary><i>Notes...</i></summary>
+
+> Note 1: The Windows C:\ drive is called /mnt/c/ in WSL.
+> 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"`.
+> Note 3: Windows path names are case-insensitive so adhering to capitalization isn't needed
+</details>
+
+If this works, then proceed to [Installation](#installation).
+
+Otherwise, ask for help on Discord or IRC (see [README.md](README.md)), or continue reading below for [Windows instructions using msys2](#windows-msys2).
+
+## Windows (msys2)
+
+- If devkitARM is **not installed**, then go to [Installing devkitARM](#installing-devkitarm).
+- 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).
+- Otherwise, **open msys2** and go to [Choosing where to store pokeemerald (msys2)](#choosing-where-to-store-pokeemerald-msys2).
+
+### Installing devkitARM
+1. Download the devkitPro installer [here](https://github.com/devkitPro/installer/releases).
+2. 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.
+
+### Setting up msys2
+
+Note that in msys2, Copy is Ctrl+Insert and Paste is Shift+Insert.
+
+1. Open msys2 at C:\devkitPro\msys2\msys2_shell.bat.
+
+2. Certain packages are required to build pokeemerald. Install these by running the following command:
+
+ ```bash
+ pacman -S make gcc zlib-devel git
+ ```
+ <details>
+ <summary><i>Note...</i></summary>
+
+ > This command will ask for confirmation, just enter the yes action when prompted.
+ </details>
+
+3. Download [libpng](https://sourceforge.net/projects/libpng/files/libpng16/1.6.37/libpng-1.6.37.tar.xz/download).
+
+4. 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:
+
+ ```bash
+ cd Downloads
+ ```
+
+ <details>
+ <summary><i>Notes...</i></summary>
+
+ > Note 1: While not shown, msys uses forward slashes `/` instead of backwards slashes `\` as the directory separator.
+ > Note 2: If the path has spaces, then the path must be wrapped with quotations, e.g. `cd "Downloads/My Downloads"`.
+ > Note 3: Windows path names are case-insensitive so adhering to capitalization isn’t needed.
+ > 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.
+ </details>
+
+5. Run the following commands to uncompress and install libpng.
+
+ ```bash
+ tar xf libpng-1.6.37.tar.xz
+ cd libpng-1.6.37
+ ./configure --prefix=/usr
+ make check
+ make install
+ ```
+
+6. Then finally, run the following command to change back to the user profile folder.
+
+ ```bash
+ cd
+ ```
+
+### Choosing where to store pokeemerald (msys2)
+At this point, you can choose a folder to store pokeemerald into. If you're okay with storing pokeemerald in the user profile folder, then proceed to [Installation](#installation). Otherwise, you'll need to account for where pokeemerald is stored when changing directory to the pokeemerald folder.
+
+For example, if you want to store pokeemerald (and agbcc) in **C:\Users\\_\<user>_\Desktop\decomps** (where *\<user>* is your **Windows** username), enter this command:
+
+```bash
+cd Desktop/decomps
+```
+
+If this works, then proceed to [Installation](#installation).
+
+Otherwise, ask for help on Discord or IRC (see [README.md](README.md)), or continue reading below for [Windows instructions using Cygwin](#windows-cygwin).
+
+## Windows (Cygwin)
+1. 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!*
+
+2.
+ - If Cygwin is **not installed**, or does not have all of the required packages installed, then go to [Installing Cygwin](#installing-cygwin).
+ - If Cygwin is installed, but **is not configured to work with devkitARM**, then go to [Configuring devkitARM for Cygwin](#configuring-devkitarm-for-cygwin).
+ - Otherwise, **open Cygwin** and go to [Choosing where to store pokeemerald (Cygwin)](#choosing-where-to-store-pokeemerald-cygwin)
+
+### Installing Cygwin
+1. Download [Cygwin](https://cygwin.com/install.html): setup-x86_64.exe for 64-bit Windows, setup-x86.exe for 32-bit.
+
+2. Run the Cygwin setup. Within the Cygwin setup, leave the default settings until the "Choose A Download Site" screen.
+
+3. At "Choose a Download Site", select any mirror within the Available Download Sites.
+
+4. At "Select Packages", set the view to "Full" (top left) and search for the following packages:
+ - `make`
+ - `git`
+ - `gcc-core`
+ - `gcc-g++`
+ - `libpng-devel`
+
+ 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`.
+
+5. 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.
+
+6. Once all required packages have been selected, finish the installation.
+
+### Configuring devkitARM for Cygwin
+
+Note that in Cygwin, Copy is Ctrl+Insert and Paste is Shift+Insert.
+
+1. Open **Cygwin**.
+
+2. Run the following commands to configure devkitPro to work with Cygwin.
+
+ ```bash
+ export DEVKITPRO=/cygdrive/c/devkitpro
+ echo export DEVKITPRO=$DEVKITPRO >> ~/.bashrc
+ export DEVKITARM=$DEVKITPRO/devkitARM
+ echo export DEVKITARM=$DEVKITARM >> ~/.bashrc
+ ```
+
+ <details>
+ <summary><i>Note...</i></summary>
+
+ > Replace the drive letter c with the actual drive letter if it is not c.
+ </details>
+
+### Choosing where to store pokeemerald (Cygwin)
+
+Cygwin has its own file system that's within Windows, at **C:\cygwin64\home\\_\<user>_**. If you don't want to store pokeemerald there, you'll need to account for where pokeemerald is stored when **changing directory** to the pokeemerald folder.
+For example, if you want to store pokeemerald (and agbcc) in **C:\Users\\_\<user>_\Desktop\decomps**, enter this command, where *\<user>* is your **Windows** username:
+```bash
+cd c:/Users/<user>/Desktop/decomps
+```
+Note that the directory **must exist** in Windows. If you want to store pokeemerald 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.
+
+<details>
+ <summary><i>Notes...</i></summary>
+
+> Note 1: If the path has spaces, then the path must be wrapped with quotations, e.g. `cd "c:/users/<user>/Desktop/decomp folder"`.
+> Note 2: Windows path names are case-insensitive so adhering to capitalization isn't needed
+</details>
+
+If this works, then proceed to [Installation](#installation). Otherwise, ask for help on Discord or IRC (see [README.md](README.md)).
+
+## macOS
+1. 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:
+
+ ```bash
+ xcode-select --install
+ ```
+
+2. - If libpng is **not installed**, then go to [Installing libpng (macOS)](#installing-libpng-macos).
+ - If devkitARM is **not installed**, then go to [Installing devkitARM (macOS)](#installing-devkitarm-macos).
+ - Otherwise, **open the Terminal** and go to [Choosing where to store pokeemerald (macOS)](#choosing-where-to-store-pokeemerald-macos)
+
+### Installing libpng (macOS)
+<details>
+ <summary><i>Note for advanced users...</i></summary>
+
+> 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.
+</details>
+
+1. Open the Terminal.
+2. If Homebrew is not installed, then install [Homebrew](https://brew.sh/) by following the instructions on the website.
+3. Run the following command to install libpng.
+
+ ```bash
+ brew install libpng
+ ```
+ libpng is now installed.
+
+ Continue to [Installing devkitARM (macOS)](#installing-devkitarm-macos) if **devkitARM is not installed**, otherwise, go to [Choosing where to store pokeemerald (macOS)](#choosing-where-to-store-pokeemerald-macos).
+
+### Installing devkitARM (macOS)
+1. Download the `devkitpro-pacman-installer.pkg` package from [here](https://github.com/devkitPro/pacman/releases).
+2. Open the package to install devkitPro pacman.
+3. In the Terminal, run the following commands to install devkitARM:
+
+ ```bash
+ sudo dkp-pacman -Sy
+ sudo dkp-pacman -S gba-dev
+ sudo dkp-pacman -S devkitarm-rules
+ ```
+
+ 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.
+
+4. After the tools are installed, devkitARM must now be made accessible from anywhere by the system. To do so, run the following commands:
+
+ ```bash
+ export DEVKITPRO=/opt/devkitpro
+ echo "export DEVKITPRO=$DEVKITPRO" >> ~/.bashrc
+ export DEVKITARM=$DEVKITPRO/devkitARM
+ echo "export DEVKITARM=$DEVKITARM" >> ~/.bashrc
+
+ echo "if [ -f ~/.bashrc ]; then . ~/.bashrc; fi" >> ~/.bash_profile
+ ```
+
+### Choosing where to store pokeemerald (macOS)
+At this point, you can choose a folder to store pokeemerald into. If you're okay with storing pokeemerald in the user folder, then proceed to [Installation](#installation). Otherwise, you'll need to account for where pokeemerald is stored when changing directory to the pokeemerald folder.
+
+For example, if you want to store pokeemerald (and agbcc) in **~/Desktop/decomps**, enter this command to **change directory** to the desired folder:
+```bash
+cd Desktop/decomps
+```
+Note that the directory **must exist** in the folder system. If you want to store pokeemerald 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.
+
+<details>
+ <summary><i>Note..</i>.</summary>
+
+> Note: If the path has spaces, then the path must be wrapped with quotations, e.g. `cd "Desktop/decomp folder"`
+</details>
+
+If this works, then proceed to [Installation](#installation). Otherwise, ask for help on Discord or IRC (see [README.md](README.md)).
+
+## Linux
+Open Terminal and enter the following commands, depending on which distro you're using.
+
+### Debian/Ubuntu-based distributions
+Run the following command to install the necessary packages:
+```bash
+sudo apt install build-essential binutils-arm-none-eabi git libpng-dev
+```
+Then proceed to [Choosing where to store pokeemerald (Linux)](#choosing-where-to-store-pokeemerald-linux).
+<details>
+ <summary><i>Note for legacy repos...</i></summary>
+
+> If the repository you plan to build has an **[older revision of the INSTALL.md](https://github.com/pret/pokeemerald/blob/571c598/INSTALL.md)**,
+> then you will have to install devkitARM. Install all the above packages except binutils-arm-none-eabi, and follow the instructions to
+> [install devkitARM on Debian/Ubuntu-based distributions](#installing-devkitarm-on-debianubuntu-based-distributions).
+</details>
+
+### Other distributions
+_(Specific instructions for other distributions would be greatly appreciated!)_
+
+1. Try to find the required software in its repositories:
+ - `gcc`
+ - `g++`
+ - `make`
+ - `git`
+ - `libpng-dev`
+
+2. 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.
+3. Once devkitPro pacman is configured, run the following commands:
+
+ ```bash
+ sudo pacman -Sy
+ sudo pacman -S gba-dev
+ ```
+
+ 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.
+
+### Choosing where to store pokeemerald (Linux)
+At this point, you can choose a folder to store pokeemerald (and agbcc) into. If so, you'll have to account for the modified folder path when changing directory to the pokeemerald folder.
+
+If this works, then proceed to [Installation](#installation). Otherwise, ask for help on Discord or IRC (see [README.md](README.md)).
+
+## Installation
+
+<details>
+ <summary><i>Note for Windows users...</i></summary>
+
+> Consider adding an exception for the `pokeemerald` and/or `decomps` folder in Windows Security using
+> [these instructions](https://support.microsoft.com/help/4028485). This prevents Microsoft Defender from
+> scanning them which might improve performance while building.
+</details>
+
+1. If pokeemerald is not already downloaded (some users may prefer to download pokeemerald via a git client like GitHub Desktop), run:
+
+ ```bash
+ git clone https://github.com/pret/pokeemerald
+ ```
+
+ <details>
+ <summary><i>Note for WSL1...</i></summary>
+
+ > If you get an error stating `fatal: could not set 'core.filemode' to 'false'`, then run the following commands:
+ > ```bash
+ > cd
+ > sudo umount /mnt/c
+ > sudo mount -t drvfs C: /mnt/c -o metadata,noatime
+ > cd <folder where pokeemerald is to be stored>
+ > ```
+ > Where *\<folder where pokeemerald is to be stored>* is the path of the folder [where you chose to store pokeemerald](#Choosing-where-to-store-pokeemerald-WSL1). Then run the `git clone` command again.
+ </details>
+
+2. Install agbcc into pokeemerald. The commands to run depend on certain conditions. **You should only follow one of the listed instructions**:
+- If agbcc has **not been built before** in the folder where you chose to store pokeemerald, run the following commands to build and install it into pokeemerald:
+
+ ```bash
+ git clone https://github.com/pret/agbcc
+ cd agbcc
+ ./build.sh
+ ./install.sh ../pokeemerald
+ ```
+
+- **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 pokeemerald:
+
+ ```bash
+ cd agbcc
+ git clean -fX
+ ./build.sh
+ ./install.sh ../pokeemerald
+ ```
+
+- **Otherwise**, if agbcc has been built before on the same terminal, run the following commands to install agbcc into pokeemerald:
+
+ ```bash
+ cd agbcc
+ ./install.sh ../pokeemerald
+ ```
+
+ <details>
+ <summary><i>Note...</i></summary>
+
+ > If building agbcc or pokeemerald results in an error, try deleting the agbcc folder and re-installing agbcc as if it has not been built before.
+ </details>
+
+3. Once agbcc is installed, change directory back to the base directory where pokeemerald and agbcc are stored:
+
+ ```bash
+ cd ..
+ ```
+
+Now you're ready to [build **pokeemerald**](#build-pokeemerald)
+## Build pokeemerald
+If you aren't in the pokeemerald directory already, then **change directory** to the pokeemerald folder:
+```bash
+cd pokeemerald
+```
+To build **pokeemerald.gba** for the first time and confirm it matches the official ROM image (Note: to speed up builds, see [Parallel builds](#parallel-builds)):
+```bash
+make compare
+```
+If an OK is returned, then the installation went smoothly.
+<details>
+<summary>Note for Windows...</summary>
+> 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.
+</details>
+
+To build **pokeemerald.gba** with your changes:
+```bash
+make
+```
+
+# Building guidance
## Parallel builds
See [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.
-To speed up building, run:
-
- make -j$(nproc)
+To speed up building, first get the value of `nproc` by running the following command:
+```bash
+nproc
+```
+Builds can then be sped up by running the following command:
+```bash
+make -j<output of nproc>
+```
+Replace `<output of nproc>` with the number that the `nproc` command returned.
`nproc` is not available on macOS. The alternative is `sysctl -n hw.ncpu` ([relevant Stack Overflow thread](https://stackoverflow.com/questions/1715580)).
-
## Debug info
To build **pokeemerald.elf** with enhanced debug info:
+```bash
+make DINFO=1
+```
- make DINFO=1
+## devkitARM's C compiler
+This 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:
+```bash
+make modern
+```
+Otherwise, follow the instructions below to install devkitARM.
+### Installing devkitARM on WSL1
-## devkitARM's C compiler
+1. `gdebi-core` must be installed beforehand in order to install devkitPro pacman (which facilitates the installation of devkitARM). Install this with the following command:
-This project supports the `arm-none-eabi-gcc` compiler included with devkitARM r52. To build this target, simply run:
+ ```bash
+ sudo apt install gdebi-core
+ ```
+ <details>
+ <summary><i>Note...</i></summary>
- make modern
+ > If the above command does not work, try the above command but replacing `apt` with `apt-get`.
+ </details>
+2. 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`.
+3. 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:
-## Other toolchains
+ ```bash
+ cd /mnt/c/Users/<user>/Downloads
+ ```
-To build using a toolchain other than devkitARM, override the `TOOLCHAIN` environment variable with the path to your toolchain, which must contain the subdirectory `bin`.
+4. Once the directory has been changed to the folder containing the devkitPro pacman package, run the following commands to install devkitARM.
- make TOOLCHAIN="/path/to/toolchain/here"
+ ```bash
+ sudo gdebi devkitpro-pacman.amd64.deb
+ sudo dkp-pacman -Sy
+ sudo dkp-pacman -S gba-dev
+ ```
+ 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.
-The following is an example:
+ <details>
+ <summary><i>Note...</i></summary>
- make TOOLCHAIN="/usr/local/arm-none-eabi"
+ > 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.
+ </details>
-To compile the `modern` target with this toolchain, the subdirectories `lib`, `include`, and `arm-none-eabi` must also be present.
+5. Run the following command to set devkitPro related environment variables (alternatively, close and re-open WSL):
+
+ ```bash
+ source /etc/profile.d/devkit-env.sh
+ ```
+
+devkitARM is now installed.
+### Installing devkitARM on Debian/Ubuntu-based distributions
+1. If `gdebi-core` is not installed, run the following command:
+
+ ```bash
+ sudo apt install gdebi-core
+ ```
+2. Download the devkitPro pacman package [here](https://github.com/devkitPro/pacman/releases). The file to download is `devkitpro-pacman.amd64.deb`.
+3. Change directory to where the package was downloaded. Then, run the following commands to install devkitARM:
+
+ ```bash
+ sudo gdebi devkitpro-pacman.amd64.deb
+ sudo dkp-pacman -Sy
+ sudo dkp-pacman -S gba-dev
+ ```
+ 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.
+
+ > 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.
+
+4. Run the following command to set devkitPro related environment variables (alternatively, close and re-open the Terminal):
+
+ ```bash
+ source /etc/profile.d/devkit-env.sh
+ ```
+
+devkitARM is now installed.
+
+## Other toolchains
+
+To build using a toolchain other than devkitARM, override the `TOOLCHAIN` environment variable with the path to your toolchain, which must contain the subdirectory `bin`.
+```bash
+make TOOLCHAIN="/path/to/toolchain/here"
+```
+The following is an example:
+```bash
+make TOOLCHAIN="/usr/local/arm-none-eabi"
+```
+To compile the `modern` target with this toolchain, the subdirectories `lib`, `include`, and `arm-none-eabi` must also be present.
# Useful additional tools
diff --git a/Makefile b/Makefile
index d97634399..7b2f79877 100644
--- a/Makefile
+++ b/Makefile
@@ -1,29 +1,34 @@
TOOLCHAIN := $(DEVKITARM)
COMPARE ?= 0
-ifeq ($(CC),)
-HOSTCC := gcc
-else
-HOSTCC := $(CC)
+ifeq (compare,$(MAKECMDGOALS))
+ COMPARE := 1
endif
-ifeq ($(CXX),)
-HOSTCXX := g++
-else
-HOSTCXX := $(CXX)
-endif
+# don't use dkP's base_tools anymore
+# because the redefinition of $(CC) conflicts
+# with when we want to use $(CC) to preprocess files
+# thus, manually create the variables for the bin
+# files, or use arm-none-eabi binaries on the system
+# if dkP is not installed on this system
-ifneq (,$(wildcard $(TOOLCHAIN)/base_tools))
-include $(TOOLCHAIN)/base_tools
-else
+ifneq (,$(TOOLCHAIN))
+ifneq ($(wildcard $(TOOLCHAIN)/bin),)
export PATH := $(TOOLCHAIN)/bin:$(PATH)
+endif
+endif
+
PREFIX := arm-none-eabi-
OBJCOPY := $(PREFIX)objcopy
-export CC := $(PREFIX)gcc
-export AS := $(PREFIX)as
-endif
-export CPP := $(PREFIX)cpp
-export LD := $(PREFIX)ld
+OBJDUMP := $(PREFIX)objdump
+AS := $(PREFIX)as
+
+LD := $(PREFIX)ld
+
+# note: the makefile must be set up so MODERNCC is never called
+# if MODERN=0
+MODERNCC := $(PREFIX)gcc
+PATH_MODERNCC := PATH=$(TOOLCHAIN)/bin:PATH $(MODERNCC)
ifeq ($(OS),Windows_NT)
EXE := .exe
@@ -37,10 +42,42 @@ MAKER_CODE := 01
REVISION := 0
MODERN ?= 0
+ifeq (modern,$(MAKECMDGOALS))
+ MODERN := 1
+endif
+
+# use arm-none-eabi-cpp for macOS
+# as macOS's default compiler is clang
+# and clang's preprocessor will warn on \u
+# when preprocessing asm files, expecting a unicode literal
+# we can't unconditionally use arm-none-eabi-cpp
+# as installations which install binutils-arm-none-eabi
+# don't come with it
+ifneq ($(MODERN),1)
+ ifeq ($(shell uname -s),Darwin)
+ CPP := $(PREFIX)cpp
+ else
+ CPP := $(CC) -E
+ endif
+else
+ CPP := $(PREFIX)cpp
+endif
+
+ROM_NAME := pokeemerald.gba
+ELF_NAME := $(ROM_NAME:.gba=.elf)
+MAP_NAME := $(ROM_NAME:.gba=.map)
+OBJ_DIR_NAME := build/emerald
+
+MODERN_ROM_NAME := pokeemerald_modern.gba
+MODERN_ELF_NAME := $(MODERN_ROM_NAME:.gba=.elf)
+MODERN_MAP_NAME := $(MODERN_ROM_NAME:.gba=.map)
+MODERN_OBJ_DIR_NAME := build/modern
+
SHELL := /bin/bash -o pipefail
ELF = $(ROM:.gba=.elf)
MAP = $(ROM:.gba=.map)
+SYM = $(ROM:.gba=.sym)
C_SUBDIR = src
GFLIB_SUBDIR = gflib
@@ -64,26 +101,26 @@ ASFLAGS := -mcpu=arm7tdmi --defsym MODERN=$(MODERN)
ifeq ($(MODERN),0)
CC1 := tools/agbcc/bin/agbcc$(EXE)
override CFLAGS += -mthumb-interwork -Wimplicit -Wparentheses -Werror -O2 -fhex-asm -g
-ROM := pokeemerald.gba
-OBJ_DIR := build/emerald
+ROM := $(ROM_NAME)
+OBJ_DIR := $(OBJ_DIR_NAME)
LIBPATH := -L ../../tools/agbcc/lib
+LIB := $(LIBPATH) -lgcc -lc -L../../libagbsyscall -lagbsyscall
else
-CC1 = $(shell $(CC) --print-prog-name=cc1) -quiet
+CC1 = $(shell $(PATH_MODERNCC) --print-prog-name=cc1) -quiet
override CFLAGS += -mthumb -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -fno-toplevel-reorder -Wno-pointer-to-int-cast -g
-ROM := pokeemerald_modern.gba
-OBJ_DIR := build/modern
-LIBPATH := -L "$(dir $(shell $(CC) -mthumb -print-file-name=libgcc.a))" -L "$(dir $(shell $(CC) -mthumb -print-file-name=libc.a))"
+ROM := $(MODERN_ROM_NAME)
+OBJ_DIR := $(MODERN_OBJ_DIR_NAME)
+LIBPATH := -L "$(dir $(shell $(PATH_MODERNCC) -mthumb -print-file-name=libgcc.a))" -L "$(dir $(shell $(PATH_MODERNCC) -mthumb -print-file-name=libnosys.a))" -L "$(dir $(shell $(PATH_MODERNCC) -mthumb -print-file-name=libc.a))"
+LIB := $(LIBPATH) -lc -lnosys -lgcc -L../../libagbsyscall -lagbsyscall
endif
CPPFLAGS := -iquote include -iquote $(GFLIB_SUBDIR) -Wno-trigraphs -DMODERN=$(MODERN)
-ifeq ($(MODERN),0)
-CPPFLAGS += -I tools/agbcc/include -I tools/agbcc
+ifneq ($(MODERN),1)
+CPPFLAGS += -I tools/agbcc/include -I tools/agbcc -nostdinc -undef
endif
LDFLAGS = -Map ../../$(MAP)
-LIB := $(LIBPATH) -lgcc -lc -L../../libagbsyscall -lagbsyscall
-
SHA1 := $(shell { command -v sha1sum || command -v shasum; } 2>/dev/null) -c
GFX := tools/gbagfx/gbagfx$(EXE)
AIF := tools/aif2pcm/aif2pcm$(EXE)
@@ -95,6 +132,8 @@ FIX := tools/gbafix/gbafix$(EXE)
MAPJSON := tools/mapjson/mapjson$(EXE)
JSONPROC := tools/jsonproc/jsonproc$(EXE)
+PERL := perl
+
TOOLDIRS := $(filter-out tools/agbcc tools/binutils,$(wildcard tools/*))
TOOLBASE = $(TOOLDIRS:tools/%=%)
TOOLS = $(foreach tool,$(TOOLBASE),tools/$(tool)/$(tool)$(EXE))
@@ -111,18 +150,34 @@ MAKEFLAGS += --no-print-directory
# Secondary expansion is required for dependency variables in object rules.
.SECONDEXPANSION:
-.PHONY: all rom clean compare tidy tools mostlyclean clean-tools $(TOOLDIRS) berry_fix libagbsyscall modern
+.PHONY: all rom clean compare tidy tools mostlyclean clean-tools $(TOOLDIRS) berry_fix libagbsyscall modern tidymodern tidynonmodern
infoshell = $(foreach line, $(shell $1 | sed "s/ /__SPACE__/g"), $(info $(subst __SPACE__, ,$(line))))
# Build tools when building the rom
# Disable dependency scanning for clean/tidy/tools
-ifeq (,$(filter-out all rom compare modern berry_fix libagbsyscall,$(MAKECMDGOALS)))
-$(call infoshell, $(MAKE) tools)
+# Use a separate minimal makefile for speed
+# Since we don't need to reload most of this makefile
+ifeq (,$(filter-out all rom compare modern berry_fix libagbsyscall syms,$(MAKECMDGOALS)))
+$(call infoshell, $(MAKE) -f make_tools.mk)
else
-NODEP := 1
+NODEP ?= 1
endif
+# check if we need to scan dependencies based on the rule
+ifeq (,$(MAKECMDGOALS))
+ SCAN_DEPS ?= 1
+else
+ # clean, tidy, tools, mostlyclean, clean-tools, $(TOOLDIRS), tidymodern, tidynonmodern don't even build the ROM
+ # berry_fix and libagbsyscall do their own thing
+ ifeq (,$(filter-out clean tidy tools mostlyclean clean-tools $(TOOLDIRS) tidymodern tidynonmodern berry_fix libagbsyscall,$(MAKECMDGOALS)))
+ SCAN_DEPS ?= 0
+ else
+ SCAN_DEPS ?= 1
+ endif
+endif
+
+ifeq ($(SCAN_DEPS),1)
C_SRCS_IN := $(wildcard $(C_SUBDIR)/*.c $(C_SUBDIR)/*/*.c $(C_SUBDIR)/*/*/*.c)
C_SRCS := $(foreach src,$(C_SRCS_IN),$(if $(findstring .inc.c,$(src)),,$(src)))
C_OBJS := $(patsubst $(C_SUBDIR)/%.c,$(C_BUILDDIR)/%.o,$(C_SRCS))
@@ -152,17 +207,19 @@ OBJS := $(C_OBJS) $(GFLIB_OBJS) $(C_ASM_OBJS) $(ASM_OBJS) $(DATA_ASM_OBJS) $
OBJS_REL := $(patsubst $(OBJ_DIR)/%,%,$(OBJS))
SUBDIRS := $(sort $(dir $(OBJS)))
+$(shell mkdir -p $(SUBDIRS))
+endif
AUTO_GEN_TARGETS :=
-$(shell mkdir -p $(SUBDIRS))
-
all: rom
tools: $(TOOLDIRS)
+syms: $(SYM)
+
$(TOOLDIRS):
- @$(MAKE) -C $@ CC=$(HOSTCC) CXX=$(HOSTCXX)
+ @$(MAKE) -C $@
rom: $(ROM)
ifeq ($(COMPARE),1)
@@ -170,14 +227,14 @@ ifeq ($(COMPARE),1)
endif
# For contributors to make sure a change didn't affect the contents of the ROM.
-compare: ; @$(MAKE) COMPARE=1
+compare: all
clean: mostlyclean clean-tools
clean-tools:
@$(foreach tooldir,$(TOOLDIRS),$(MAKE) clean -C $(tooldir);)
-mostlyclean: tidy
+mostlyclean: tidynonmodern tidymodern
rm -f $(SAMPLE_SUBDIR)/*.bin
rm -f $(CRY_SUBDIR)/*.bin
rm -f $(MID_SUBDIR)/*.s
@@ -189,13 +246,16 @@ mostlyclean: tidy
@$(MAKE) clean -C berry_fix
@$(MAKE) clean -C libagbsyscall
-tidy:
- rm -f $(ROM) $(ELF) $(MAP)
- rm -r $(OBJ_DIR)
-ifeq ($(MODERN),0)
- @$(MAKE) tidy MODERN=1
-endif
+tidy: tidynonmodern tidymodern
+tidynonmodern:
+ rm -f $(ROM_NAME) $(ELF_NAME) $(MAP_NAME)
+ rm -rf $(OBJ_DIR_NAME)
+
+tidymodern:
+ rm -f $(MODERN_ROM_NAME) $(MODERN_ELF_NAME) $(MODERN_MAP_NAME)
+ rm -rf $(MODERN_OBJ_DIR_NAME)
+
ifneq ($(MODERN),0)
$(C_BUILDDIR)/berry_crush.o: override CFLAGS += -Wno-address-of-packed-member
endif
@@ -223,7 +283,7 @@ sound/%.bin: sound/%.aif ; $(AIF) $< $@
ifeq ($(MODERN),0)
-$(C_BUILDDIR)/libc.o: CC1 := tools/agbcc/bin/old_agbcc
+$(C_BUILDDIR)/libc.o: CC1 := tools/agbcc/bin/old_agbcc$(EXE)
$(C_BUILDDIR)/libc.o: CFLAGS := -O2
$(C_BUILDDIR)/siirtc.o: CFLAGS := -mthumb-interwork
@@ -232,57 +292,89 @@ $(C_BUILDDIR)/agb_flash.o: CFLAGS := -O -mthumb-interwork
$(C_BUILDDIR)/agb_flash_1m.o: CFLAGS := -O -mthumb-interwork
$(C_BUILDDIR)/agb_flash_mx.o: CFLAGS := -O -mthumb-interwork
-$(C_BUILDDIR)/m4a.o: CC1 := tools/agbcc/bin/old_agbcc
+$(C_BUILDDIR)/m4a.o: CC1 := tools/agbcc/bin/old_agbcc$(EXE)
$(C_BUILDDIR)/record_mixing.o: CFLAGS += -ffreestanding
-$(C_BUILDDIR)/librfu_intr.o: CC1 := tools/agbcc/bin/agbcc_arm
+$(C_BUILDDIR)/librfu_intr.o: CC1 := tools/agbcc/bin/agbcc_arm$(EXE)
$(C_BUILDDIR)/librfu_intr.o: CFLAGS := -O2 -mthumb-interwork -quiet
else
$(C_BUILDDIR)/librfu_intr.o: CFLAGS := -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -fno-toplevel-reorder -Wno-pointer-to-int-cast
endif
-ifeq ($(NODEP),1)
-$(C_BUILDDIR)/%.o: c_dep :=
-else
-$(C_BUILDDIR)/%.o: c_dep = $(shell [[ -f $(C_SUBDIR)/$*.c ]] && $(SCANINC) -I include -I tools/agbcc/include -I gflib $(C_SUBDIR)/$*.c)
-endif
-
ifeq ($(DINFO),1)
override CFLAGS += -g
endif
-$(C_BUILDDIR)/%.o : $(C_SUBDIR)/%.c $$(c_dep)
+# The dep rules have to be explicit or else missing files won't be reported.
+# As a side effect, they're evaluated immediately instead of when the rule is invoked.
+# It doesn't look like $(shell) can be deferred so there might not be a better way.
+
+ifeq ($(SCAN_DEPS),1)
+ifeq ($(NODEP),1)
+$(C_BUILDDIR)/%.o: $(C_SUBDIR)/%.c
+ifeq (,$(KEEP_TEMPS))
+ @echo "$(CC1) <flags> -o $@ $<"
+ @$(CPP) $(CPPFLAGS) $< | $(PREPROC) $< charmap.txt -i | $(CC1) $(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $(AS) $(ASFLAGS) -o $@ -
+else
@$(CPP) $(CPPFLAGS) $< -o $(C_BUILDDIR)/$*.i
@$(PREPROC) $(C_BUILDDIR)/$*.i charmap.txt | $(CC1) $(CFLAGS) -o $(C_BUILDDIR)/$*.s
@echo -e ".text\n\t.align\t2, 0\n" >> $(C_BUILDDIR)/$*.s
$(AS) $(ASFLAGS) -o $@ $(C_BUILDDIR)/$*.s
-
-ifeq ($(NODEP),1)
-$(GFLIB_BUILDDIR)/%.o: c_dep :=
+endif
+else
+define C_DEP
+$1: $2 $$(shell $(SCANINC) -I include -I tools/agbcc/include -I gflib $2)
+ifeq (,$$(KEEP_TEMPS))
+ @echo "$$(CC1) <flags> -o $$@ $$<"
+ @$$(CPP) $$(CPPFLAGS) $$< | $$(PREPROC) $$< charmap.txt -i | $$(CC1) $$(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $$(AS) $$(ASFLAGS) -o $$@ -
else
-$(GFLIB_BUILDDIR)/%.o: c_dep = $(shell [[ -f $(GFLIB_SUBDIR)/$*.c ]] && $(SCANINC) -I include -I tools/agbcc/include -I gflib $(GFLIB_SUBDIR)/$*.c)
+ @$$(CPP) $$(CPPFLAGS) $$< -o $$(C_BUILDDIR)/$3.i
+ @$$(PREPROC) $$(C_BUILDDIR)/$3.i charmap.txt | $$(CC1) $$(CFLAGS) -o $$(C_BUILDDIR)/$3.s
+ @echo -e ".text\n\t.align\t2, 0\n" >> $$(C_BUILDDIR)/$3.s
+ $$(AS) $$(ASFLAGS) -o $$@ $$(C_BUILDDIR)/$3.s
+endif
+endef
+$(foreach src, $(C_SRCS), $(eval $(call C_DEP,$(patsubst $(C_SUBDIR)/%.c,$(C_BUILDDIR)/%.o,$(src)),$(src),$(patsubst $(C_SUBDIR)/%.c,%,$(src)))))
endif
-$(GFLIB_BUILDDIR)/%.o : $(GFLIB_SUBDIR)/%.c $$(c_dep)
+ifeq ($(NODEP),1)
+$(GFLIB_BUILDDIR)/%.o: $(GFLIB_SUBDIR)/%.c $$(c_dep)
+ifeq (,$(KEEP_TEMPS))
+ @echo "$(CC1) <flags> -o $@ $<"
+ @$(CPP) $(CPPFLAGS) $< | $(PREPROC) $< charmap.txt -i | $(CC1) $(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $(AS) $(ASFLAGS) -o $@ -
+else
@$(CPP) $(CPPFLAGS) $< -o $(GFLIB_BUILDDIR)/$*.i
@$(PREPROC) $(GFLIB_BUILDDIR)/$*.i charmap.txt | $(CC1) $(CFLAGS) -o $(GFLIB_BUILDDIR)/$*.s
@echo -e ".text\n\t.align\t2, 0\n" >> $(GFLIB_BUILDDIR)/$*.s
$(AS) $(ASFLAGS) -o $@ $(GFLIB_BUILDDIR)/$*.s
+endif
+else
+define GFLIB_DEP
+$1: $2 $$(shell $(SCANINC) -I include -I tools/agbcc/include -I gflib $2)
+ifeq (,$$(KEEP_TEMPS))
+ @echo "$$(CC1) <flags> -o $$@ $$<"
+ @$$(CPP) $$(CPPFLAGS) $$< | $$(PREPROC) $$< charmap.txt -i | $$(CC1) $$(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $$(AS) $$(ASFLAGS) -o $$@ -
+else
+ @$$(CPP) $$(CPPFLAGS) $$< -o $$(GFLIB_BUILDDIR)/$3.i
+ @$$(PREPROC) $$(GFLIB_BUILDDIR)/$3.i charmap.txt | $$(CC1) $$(CFLAGS) -o $$(GFLIB_BUILDDIR)/$3.s
+ @echo -e ".text\n\t.align\t2, 0\n" >> $$(GFLIB_BUILDDIR)/$3.s
+ $$(AS) $$(ASFLAGS) -o $$@ $$(GFLIB_BUILDDIR)/$3.s
+endif
+endef
+$(foreach src, $(GFLIB_SRCS), $(eval $(call GFLIB_DEP,$(patsubst $(GFLIB_SUBDIR)/%.c,$(GFLIB_BUILDDIR)/%.o, $(src)),$(src),$(patsubst $(GFLIB_SUBDIR)/%.c,%, $(src)))))
+endif
ifeq ($(NODEP),1)
-$(C_BUILDDIR)/%.o: c_asm_dep :=
+$(C_BUILDDIR)/%.o: $(C_SUBDIR)/%.s
+ $(PREPROC) $< charmap.txt | $(CPP) -I include - | $(AS) $(ASFLAGS) -o $@
else
-$(C_BUILDDIR)/%.o: c_asm_dep = $(shell [[ -f $(C_SUBDIR)/$*.s ]] && $(SCANINC) -I "" $(C_SUBDIR)/$*.s)
+define SRC_ASM_DATA_DEP
+$1: $2 $$(shell $(SCANINC) -I include -I "" $2)
+ $$(PREPROC) $$< charmap.txt | $$(CPP) -I include - | $$(AS) $$(ASFLAGS) -o $$@
+endef
+$(foreach src, $(C_ASM_SRCS), $(eval $(call SRC_ASM_DATA_DEP,$(patsubst $(C_SUBDIR)/%.s,$(C_BUILDDIR)/%.o, $(src)),$(src))))
endif
-$(C_BUILDDIR)/%.o: $(C_SUBDIR)/%.s $$(c_asm_dep)
- $(AS) $(ASFLAGS) -o $@ $<
-
-# The dep rules have to be explicit or else missing files won't be reported.
-# As a side effect, they're evaluated immediately instead of when the rule is invoked.
-# It doesn't look like $(shell) can be deferred so there might not be a better way.
-
-
ifeq ($(NODEP),1)
$(ASM_BUILDDIR)/%.o: $(ASM_SUBDIR)/%.s
$(AS) $(ASFLAGS) -o $@ $<
@@ -296,14 +388,10 @@ endif
ifeq ($(NODEP),1)
$(DATA_ASM_BUILDDIR)/%.o: $(DATA_ASM_SUBDIR)/%.s
- $(PREPROC) $< charmap.txt | $(CPP) -I include | $(AS) $(ASFLAGS) -o $@
+ $(PREPROC) $< charmap.txt | $(CPP) -I include - | $(AS) $(ASFLAGS) -o $@
else
-define DATA_ASM_DEP
-$1: $2 $$(shell $(SCANINC) -I include -I "" $2)
- $$(PREPROC) $$< charmap.txt | $$(CPP) -I include | $$(AS) $$(ASFLAGS) -o $$@
-endef
-$(foreach src, $(REGULAR_DATA_ASM_SRCS), $(eval $(call DATA_ASM_DEP,$(patsubst $(DATA_ASM_SUBDIR)/%.s,$(DATA_ASM_BUILDDIR)/%.o, $(src)),$(src))))
-$(foreach src, $(C_ASM_SRCS), $(eval $(call DATA_ASM_DEP,$(patsubst $(C_SUBDIR)/%.s,$(C_BUILDDIR)/%.o, $(src)),$(src))))
+$(foreach src, $(REGULAR_DATA_ASM_SRCS), $(eval $(call SRC_ASM_DATA_DEP,$(patsubst $(DATA_ASM_SUBDIR)/%.s,$(DATA_ASM_BUILDDIR)/%.o, $(src)),$(src))))
+endif
endif
$(SONG_BUILDDIR)/%.o: $(SONG_SUBDIR)/%.s
@@ -330,19 +418,27 @@ $(OBJ_DIR)/ld_script.ld: $(LD_SCRIPT) $(LD_SCRIPT_DEPS)
cd $(OBJ_DIR) && sed "s#tools/#../../tools/#g" ../../$(LD_SCRIPT) > ld_script.ld
$(ELF): $(OBJ_DIR)/ld_script.ld $(OBJS) berry_fix libagbsyscall
- cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ld_script.ld -o ../../$@ $(OBJS_REL) $(LIB)
+ @echo "cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ld_script.ld -o ../../$@ <objects> <lib>"
+ @cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ld_script.ld -o ../../$@ $(OBJS_REL) $(LIB)
$(FIX) $@ -t"$(TITLE)" -c$(GAME_CODE) -m$(MAKER_CODE) -r$(REVISION) --silent
$(ROM): $(ELF)
$(OBJCOPY) -O binary $< $@
$(FIX) $@ -p --silent
-modern: ; @$(MAKE) MODERN=1
+modern: all
berry_fix/berry_fix.gba: berry_fix
berry_fix:
- @$(MAKE) -C berry_fix COMPARE=$(COMPARE) TOOLCHAIN=$(TOOLCHAIN)
+ @$(MAKE) -C berry_fix COMPARE=$(COMPARE) TOOLCHAIN=$(TOOLCHAIN) MODERN=$(MODERN)
libagbsyscall:
- @$(MAKE) -C libagbsyscall TOOLCHAIN=$(TOOLCHAIN)
+ @$(MAKE) -C libagbsyscall TOOLCHAIN=$(TOOLCHAIN) MODERN=$(MODERN)
+
+###################
+### Symbol file ###
+###################
+
+$(SYM): $(ELF)
+ $(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' > $@
diff --git a/README.md b/README.md
index 2c3447abc..7adbb3e2d 100644
--- a/README.md
+++ b/README.md
@@ -1,10 +1,5 @@
# Pokémon Emerald
-[![Build Status][travis-badge]][travis]
-
-[travis]: https://travis-ci.org/pret/pokeemerald
-[travis-badge]: https://travis-ci.org/pret/pokeemerald.svg?branch=master
-
This is a decompilation of Pokémon Emerald.
It builds the following ROM:
diff --git a/asm/macros/event.inc b/asm/macros/event.inc
index 84fdd592a..73aef33b5 100644
--- a/asm/macros/event.inc
+++ b/asm/macros/event.inc
@@ -345,11 +345,12 @@
.byte 0x32
.endm
- @ Plays the specified (song_number) song. The byte is apparently supposed to be 0x00.
- .macro playbgm song_number:req, unknown:req
+ @ Plays the specified (song_number) song. If save_song is TRUE, the
+ @ specified (song_number) will be saved as if savebgm was called with it.
+ .macro playbgm song_number:req, save_song:req
.byte 0x33
.2byte \song_number
- .byte \unknown
+ .byte \save_song
.endm
@ Saves the specified (song_number) song to be played later.
@@ -812,12 +813,12 @@
.byte 0x68
.endm
- @ Ceases movement for all Objects on-screen.
+ @ Freezes all objects immediately except the player. The player is frozen once their movement is finished.
.macro lockall
.byte 0x69
.endm
- @ If the script was called by an Object, then that Object's movement will cease.
+ @ Freezes all objects immediately except the player and the selected object. The player and selected object are frozen once their movement is finished.
.macro lock
.byte 0x6a
.endm
@@ -918,10 +919,10 @@
.byte 0x76
.endm
- @ Draws an image of the winner of the contest. In FireRed, this command is a nop. (The argument is discarded.)
- .macro showcontestwinner a:req
+ @ Draws an image of the winner of the contest. winnerId is any CONTEST_WINNER_* constant.
+ .macro showcontestpainting winnerId:req
.byte 0x77
- .byte \a
+ .byte \winnerId
.endm
@ Displays the string at pointer as braille text in a standard message box. The string must be formatted to use braille
diff --git a/asmdiff.sh b/asmdiff.sh
index 6ea588131..f5a701074 100755
--- a/asmdiff.sh
+++ b/asmdiff.sh
@@ -1,11 +1,19 @@
#!/bin/bash
-OBJDUMP="$DEVKITARM/bin/arm-none-eabi-objdump -D -bbinary -marmv4t -Mforce-thumb"
+if [[ -d "$DEVKITARM/bin/" ]]; then
+ OBJDUMP_BIN="$DEVKITARM/bin/arm-none-eabi-objdump"
+else
+ OBJDUMP_BIN="arm-none-eabi-objdump"
+fi
+
+OBJDUMP="$OBJDUMP_BIN -D -bbinary -marmv4t -Mforce-thumb"
+
if [ $(($1)) -ge $((0x8000000)) ]; then
OPTIONS="--adjust-vma=0x8000000 --start-address=$(($1)) --stop-address=$(($1 + $2))"
else
OPTIONS="--start-address=$(($1)) --stop-address=$(($1 + $2))"
fi
+
$OBJDUMP $OPTIONS baserom.gba > baserom.dump
$OBJDUMP $OPTIONS pokeemerald.gba > pokeemerald.dump
diff -u baserom.dump pokeemerald.dump
diff --git a/berry_fix/Makefile b/berry_fix/Makefile
index 0ead3804f..464e5f9e9 100644
--- a/berry_fix/Makefile
+++ b/berry_fix/Makefile
@@ -1,29 +1,27 @@
TOOLCHAIN := $(DEVKITARM)
COMPARE ?= 0
-ifeq ($(CC),)
-HOSTCC := gcc
-else
-HOSTCC := $(CC)
+# don't use dkP's base_tools anymore
+# because the redefinition of $(CC) conflicts
+# with when we want to use $(CC) to preprocess files
+# thus, manually create the variables for the bin
+# files, or use arm-none-eabi binaries on the system
+# if dkP is not installed on this system
+
+ifneq (,$(TOOLCHAIN))
+ifneq ($(wildcard $(TOOLCHAIN)/bin),)
+export PATH := $(TOOLCHAIN)/bin:$(PATH)
endif
-
-ifeq ($(CXX),)
-HOSTCXX := g++
-else
-HOSTCXX := $(CXX)
endif
-ifneq (,$(wildcard $(TOOLCHAIN)/base_tools))
-include $(TOOLCHAIN)/base_tools
-else
-export PATH := $(TOOLCHAIN)/bin:$(PATH)
PREFIX := arm-none-eabi-
OBJCOPY := $(PREFIX)objcopy
-export CC := $(PREFIX)gcc
-export AS := $(PREFIX)as
-endif
-export CPP := $(PREFIX)cpp
-export LD := $(PREFIX)ld
+AS := $(PREFIX)as
+LD := $(PREFIX)ld
+
+# note: the makefile must be set up so MODERNCC is never called
+# if MODERN=0
+MODERNCC := $(PREFIX)gcc
ifeq ($(OS),Windows_NT)
EXE := .exe
@@ -31,6 +29,23 @@ else
EXE :=
endif
+# use arm-none-eabi-cpp for macOS
+# as macOS's default compiler is clang
+# and clang's preprocessor will warn on \u
+# when preprocessing asm files, expecting a unicode literal
+# we can't unconditionally use arm-none-eabi-cpp
+# as installations which install binutils-arm-none-eabi
+# don't come with it
+ifneq ($(MODERN),1)
+ ifeq ($(shell uname -s),Darwin)
+ CPP := $(PREFIX)cpp
+ else
+ CPP := $(CC) -E
+ endif
+else
+ CPP := $(PREFIX)cpp
+endif
+
GAME_CODE := AGBJ
MAKER_CODE := 01
REVISION := 0
@@ -166,7 +181,7 @@ $(DATA_ASM_BUILDDIR)/%.o: data_dep = $(shell $(SCANINC) $(DATA_ASM_SUBDIR)/$*.s)
endif
payload:
- @$(MAKE) -C payload COMPARE=$(COMPARE) TOOLCHAIN=$(TOOLCHAIN)
+ @$(MAKE) -C payload COMPARE=$(COMPARE) TOOLCHAIN=$(TOOLCHAIN) MODERN=$(MODERN)
payload/payload.gba: payload
diff --git a/berry_fix/payload/Makefile b/berry_fix/payload/Makefile
index a121fda93..2779c43ba 100644
--- a/berry_fix/payload/Makefile
+++ b/berry_fix/payload/Makefile
@@ -1,29 +1,27 @@
TOOLCHAIN := $(DEVKITARM)
COMPARE ?= 0
-ifeq ($(CC),)
-HOSTCC := gcc
-else
-HOSTCC := $(CC)
+# don't use dkP's base_tools anymore
+# because the redefinition of $(CC) conflicts
+# with when we want to use $(CC) to preprocess files
+# thus, manually create the variables for the bin
+# files, or use arm-none-eabi binaries on the system
+# if dkP is not installed on this system
+
+ifneq (,$(TOOLCHAIN))
+ifneq ($(wildcard $(TOOLCHAIN)/bin),)
+export PATH := $(TOOLCHAIN)/bin:$(PATH)
endif
-
-ifeq ($(CXX),)
-HOSTCXX := g++
-else
-HOSTCXX := $(CXX)
endif
-ifneq (,$(wildcard $(TOOLCHAIN)/base_tools))
-include $(TOOLCHAIN)/base_tools
-else
-export PATH := $(TOOLCHAIN)/bin:$(PATH)
PREFIX := arm-none-eabi-
OBJCOPY := $(PREFIX)objcopy
-export CC := $(PREFIX)gcc
-export AS := $(PREFIX)as
-endif
-export CPP := $(PREFIX)cpp
-export LD := $(PREFIX)ld
+AS := $(PREFIX)as
+LD := $(PREFIX)ld
+
+# note: the makefile must be set up so MODERNCC is never called
+# if MODERN=0
+MODERNCC := $(PREFIX)gcc
ifeq ($(OS),Windows_NT)
EXE := .exe
@@ -31,6 +29,23 @@ else
EXE :=
endif
+# use arm-none-eabi-cpp for macOS
+# as macOS's default compiler is clang
+# and clang's preprocessor will warn on \u
+# when preprocessing asm files, expecting a unicode literal
+# we can't unconditionally use arm-none-eabi-cpp
+# as installations which install binutils-arm-none-eabi
+# don't come with it
+ifneq ($(MODERN),1)
+ ifeq ($(shell uname -s),Darwin)
+ CPP := $(PREFIX)cpp
+ else
+ CPP := $(CC) -E
+ endif
+else
+ CPP := $(PREFIX)cpp
+endif
+
SHELL := /bin/bash -o pipefail
CPPFLAGS := -I ../../tools/agbcc/include -I ../../tools/agbcc -iquote include -nostdinc -undef
diff --git a/berry_fix/payload/include/gba/m4a_internal.h b/berry_fix/payload/include/gba/m4a_internal.h
index 339a0774e..1aca67585 100644
--- a/berry_fix/payload/include/gba/m4a_internal.h
+++ b/berry_fix/payload/include/gba/m4a_internal.h
@@ -419,7 +419,7 @@ void SetPokemonCryPitch(s16 val);
void SetPokemonCryLength(u16 val);
void SetPokemonCryRelease(u8 val);
void SetPokemonCryProgress(u32 val);
-int IsPokemonCryPlaying(struct MusicPlayerInfo *mplayInfo);
+bool32 IsPokemonCryPlaying(struct MusicPlayerInfo *mplayInfo);
void SetPokemonCryChorus(s8 val);
void SetPokemonCryStereo(u32 val);
void SetPokemonCryPriority(u8 val);
diff --git a/data/battle_ai_scripts.s b/data/battle_ai_scripts.s
index 56be92c5e..4867f4261 100644
--- a/data/battle_ai_scripts.s
+++ b/data/battle_ai_scripts.s
@@ -7,6 +7,7 @@
#include "constants/hold_effects.h"
#include "constants/pokemon.h"
.include "asm/macros/battle_ai_script.inc"
+ .include "constants/constants.inc"
.section script_data, "aw", %progbits
@@ -17,11 +18,11 @@ gBattleAI_ScriptsTable:: @ 82DBEF8
.4byte AI_CheckViability @ AI_SCRIPT_CHECK_VIABILITY
.4byte AI_SetupFirstTurn @ AI_SCRIPT_SETUP_FIRST_TURN
.4byte AI_Risky @ AI_SCRIPT_RISKY
- .4byte AI_PreferStrongestMove @ AI_SCRIPT_PREFER_STRONGEST_MOVE
+ .4byte AI_PreferPowerExtremes @ AI_SCRIPT_PREFER_POWER_EXTREMES
.4byte AI_PreferBatonPass @ AI_SCRIPT_PREFER_BATON_PASS
.4byte AI_DoubleBattle @ AI_SCRIPT_DOUBLE_BATTLE
.4byte AI_HPAware @ AI_SCRIPT_HP_AWARE
- .4byte AI_Unknown @ AI_SCRIPT_UNKNOWN
+ .4byte AI_TrySunnyDayStart @ AI_SCRIPT_TRY_SUNNY_DAY_START
.4byte AI_Ret
.4byte AI_Ret
.4byte AI_Ret
@@ -50,8 +51,7 @@ AI_CheckBadMove:
if_move MOVE_FISSURE, AI_CBM_CheckIfNegatesType
if_move MOVE_HORN_DRILL, AI_CBM_CheckIfNegatesType
get_how_powerful_move_is
- if_equal 0, AI_CheckBadMove_CheckSoundproof
-
+ if_equal MOVE_POWER_OTHER, AI_CheckBadMove_CheckSoundproof
AI_CBM_CheckIfNegatesType: @ 82DBF92
if_type_effectiveness AI_EFFECTIVENESS_x0, Score_Minus10
get_ability AI_TARGET
@@ -84,11 +84,9 @@ CheckIfWonderGuardCancelsMove: @ 82DBFE4
CheckIfLevitateCancelsGroundMove: @ 82DBFEF
get_curr_move_type
if_equal_ TYPE_GROUND, Score_Minus10
-
AI_CheckBadMove_CheckSoundproof_: @ 82DBFF7
get_how_powerful_move_is
- if_equal 0, AI_CheckBadMove_CheckSoundproof
-
+ if_equal MOVE_POWER_OTHER, AI_CheckBadMove_CheckSoundproof @ Pointless check
AI_CheckBadMove_CheckSoundproof: @ 82DBFFE
get_ability AI_TARGET
if_not_equal ABILITY_SOUNDPROOF, AI_CheckBadMove_CheckEffect
@@ -101,7 +99,6 @@ AI_CheckBadMove_CheckSoundproof: @ 82DBFFE
if_move MOVE_UPROAR, Score_Minus10
if_move MOVE_METAL_SOUND, Score_Minus10
if_move MOVE_GRASS_WHISTLE, Score_Minus10
-
AI_CheckBadMove_CheckEffect: @ 82DC045
if_effect EFFECT_SLEEP, AI_CBM_Sleep
if_effect EFFECT_EXPLOSION, AI_CBM_Explosion
@@ -247,7 +244,6 @@ AI_CBM_DreamEater: @ 82DC330
AI_CBM_BellyDrum: @ 82DC341
if_hp_less_than AI_USER, 51, Score_Minus10
-
AI_CBM_AttackUp: @ 82DC348
if_stat_level_equal AI_USER, STAT_ATK, MAX_STAT_STAGE, Score_Minus10
end
@@ -307,7 +303,6 @@ AI_CBM_AccDown: @ 82DC3D9
AI_CBM_EvasionDown: @ 82DC3EE
if_stat_level_equal AI_TARGET, STAT_EVASION, MIN_STAT_STAGE, Score_Minus10
-
CheckIfAbilityBlocksStatChange: @ 82DC3F6
get_ability AI_TARGET
if_equal ABILITY_CLEAR_BODY, Score_Minus10
@@ -368,7 +363,6 @@ AI_CBM_OneHitKO: @ 82DC4D0
AI_CBM_Magnitude: @ 82DC4E5
get_ability AI_TARGET
if_equal ABILITY_LEVITATE, Score_Minus10
-
AI_CBM_HighRiskForDamage: @ 82DC4ED
if_type_effectiveness AI_EFFECTIVENESS_x0, Score_Minus10
get_ability AI_TARGET
@@ -486,7 +480,6 @@ AI_CBM_Safeguard: @ 82DC635
AI_CBM_Memento: @ 82DC640
if_stat_level_equal AI_TARGET, STAT_ATK, MIN_STAT_STAGE, Score_Minus10
if_stat_level_equal AI_TARGET, STAT_SPATK, MIN_STAT_STAGE, Score_Minus8
-
AI_CBM_BatonPass: @ 82DC650
count_usable_party_mons AI_USER
if_equal 0, Score_Minus10
@@ -510,7 +503,7 @@ AI_CBM_FutureSight: @ 82DC669
AI_CBM_FakeOut: @ 82DC680
is_first_turn_for AI_USER
- if_equal 0, Score_Minus10
+ if_equal FALSE, Score_Minus10
end
AI_CBM_Stockpile: @ 82DC689
@@ -558,7 +551,7 @@ AI_CBM_Ingrain: @ 82DC6F4
AI_CBM_Recycle: @ 82DC6FF
get_used_held_item AI_USER
- if_equal 0, Score_Minus10
+ if_equal ITEM_NONE, Score_Minus10
end
AI_CBM_Imprison: @ 82DC708
@@ -788,7 +781,6 @@ AI_CV_Sleep: @ 82DCA92
AI_CV_SleepEncourageSlpDamage: @ 82DCAA5
if_random_less_than 128, AI_CV_Sleep_End
score +1
-
AI_CV_Sleep_End: @ 82DCAAD
end
@@ -800,7 +792,6 @@ AI_CV_Absorb: @ 82DCAAE
AI_CV_AbsorbEncourageMaybe: @ 82DCABF
if_random_less_than 50, AI_CV_Absorb_End
score -3
-
AI_CV_Absorb_End: @ 82DCAC7
end
@@ -810,7 +801,6 @@ AI_CV_SelfKO: @ 82DCAC8
if_stat_level_less_than AI_TARGET, STAT_EVASION, 10, AI_CV_SelfKO_Encourage1
if_random_less_than 128, AI_CV_SelfKO_Encourage1
score -1
-
AI_CV_SelfKO_Encourage1: @ 82DCAE2
if_hp_less_than AI_USER, 80, AI_CV_SelfKO_Encourage2
if_target_faster AI_CV_SelfKO_Encourage2
@@ -821,7 +811,6 @@ AI_CV_SelfKO_Encourage2: @ 82DCAFA
if_hp_more_than AI_USER, 50, AI_CV_SelfKO_Encourage4
if_random_less_than 128, AI_CV_SelfKO_Encourage3
score +1
-
AI_CV_SelfKO_Encourage3: @ 82DCB09
if_hp_more_than AI_USER, 30, AI_CV_SelfKO_End
if_random_less_than 50, AI_CV_SelfKO_End
@@ -831,7 +820,6 @@ AI_CV_SelfKO_Encourage3: @ 82DCB09
AI_CV_SelfKO_Encourage4: @ 82DCB1D
if_random_less_than 50, AI_CV_SelfKO_End
score -1
-
AI_CV_SelfKO_End: @ 82DCB25
end
@@ -842,7 +830,6 @@ AI_CV_DreamEater: @ 82DCB26
AI_CV_DreamEater_ScoreDown1: @ 82DCB37
score -1
-
AI_CV_DreamEater_End: @ 82DCB39
end
@@ -859,7 +846,6 @@ AI_CV_MirrorMove2: @ 82DCB58
if_in_hwords AI_CV_MirrorMove_EncouragedMovesToMirror, AI_CV_MirrorMove_End
if_random_less_than 80, AI_CV_MirrorMove_End
score -1
-
AI_CV_MirrorMove_End: @ 82DCB6B
end
@@ -915,15 +901,12 @@ AI_CV_AttackUp2: @ 82DCBD1
if_hp_not_equal AI_USER, 100, AI_CV_AttackUp3
if_random_less_than 128, AI_CV_AttackUp3
score +2
-
AI_CV_AttackUp3: @ 82DCBE0
if_hp_more_than AI_USER, 70, AI_CV_AttackUp_End
if_hp_less_than AI_USER, 40, AI_CV_AttackUp_ScoreDown2
if_random_less_than 40, AI_CV_AttackUp_End
-
AI_CV_AttackUp_ScoreDown2: @ 82DCBF4
score -2
-
AI_CV_AttackUp_End: @ 82DCBF6
end
@@ -937,11 +920,9 @@ AI_CV_DefenseUp2: @ 82DCC0C
if_hp_not_equal AI_USER, 100, AI_CV_DefenseUp3
if_random_less_than 128, AI_CV_DefenseUp3
score +2
-
AI_CV_DefenseUp3: @ 82DCC1B
if_hp_less_than AI_USER, 70, AI_CV_DefenseUp4
if_random_less_than 200, AI_CV_DefenseUp_End
-
AI_CV_DefenseUp4: @ 82DCC28
if_hp_less_than AI_USER, 40, AI_CV_DefenseUp_ScoreDown2
get_last_used_bank_move AI_TARGET
@@ -951,13 +932,10 @@ AI_CV_DefenseUp4: @ 82DCC28
get_move_type_from_result
if_not_in_bytes AI_CV_DefenseUp_PhysicalTypes, AI_CV_DefenseUp_ScoreDown2
if_random_less_than 60, AI_CV_DefenseUp_End
-
AI_CV_DefenseUp5: @ 82DCC4A
if_random_less_than 60, AI_CV_DefenseUp_End
-
AI_CV_DefenseUp_ScoreDown2: @ 82DCC50
score -2
-
AI_CV_DefenseUp_End: @ 82DCC52
end
@@ -981,7 +959,6 @@ AI_CV_SpeedUp: @ 82DCC5D
AI_CV_SpeedUp2: @ 82DCC6A
if_random_less_than 70, AI_CV_SpeedUp_End
score +3
-
AI_CV_SpeedUp_End: @ 82DCC72
end
@@ -995,15 +972,12 @@ AI_CV_SpAtkUp2: @ 82DCC88
if_hp_not_equal AI_USER, 100, AI_CV_SpAtkUp3
if_random_less_than 128, AI_CV_SpAtkUp3
score +2
-
AI_CV_SpAtkUp3: @ 82DCC97
if_hp_more_than AI_USER, 70, AI_CV_SpAtkUp_End
if_hp_less_than AI_USER, 40, AI_CV_SpAtkUp_ScoreDown2
if_random_less_than 70, AI_CV_SpAtkUp_End
-
AI_CV_SpAtkUp_ScoreDown2: @ 82DCCAB
score -2
-
AI_CV_SpAtkUp_End: @ 82DCCAD
end
@@ -1017,11 +991,9 @@ AI_CV_SpDefUp2: @ 82DCCC3
if_hp_not_equal AI_USER, 100, AI_CV_SpDefUp3
if_random_less_than 128, AI_CV_SpDefUp3
score +2
-
AI_CV_SpDefUp3: @ 82DCCD2
if_hp_less_than AI_USER, 70, AI_CV_SpDefUp4
if_random_less_than 200, AI_CV_SpDefUp_End
-
AI_CV_SpDefUp4: @ 82DCCDF
if_hp_less_than AI_USER, 40, AI_CV_SpDefUp_ScoreDown2
get_last_used_bank_move AI_TARGET
@@ -1031,13 +1003,10 @@ AI_CV_SpDefUp4: @ 82DCCDF
get_move_type_from_result
if_in_bytes AI_CV_SpDefUp_PhysicalTypes, AI_CV_SpDefUp_ScoreDown2
if_random_less_than 60, AI_CV_SpDefUp_End
-
AI_CV_SpDefUp5: @ 82DCD01
if_random_less_than 60, AI_CV_SpDefUp_End
-
AI_CV_SpDefUp_ScoreDown2: @ 82DCD07
score -2
-
AI_CV_SpDefUp_End: @ 82DCD09
end
@@ -1057,11 +1026,9 @@ AI_CV_AccuracyUp:
if_stat_level_less_than AI_USER, STAT_ACC, 9, AI_CV_AccuracyUp2
if_random_less_than 50, AI_CV_AccuracyUp2
score -2
-
AI_CV_AccuracyUp2:
if_hp_more_than AI_USER, 70, AI_CV_AccuracyUp_End
score -2
-
AI_CV_AccuracyUp_End:
end
@@ -1069,46 +1036,37 @@ AI_CV_EvasionUp:
if_hp_less_than AI_USER, 90, AI_CV_EvasionUp2
if_random_less_than 100, AI_CV_EvasionUp2
score +3
-
AI_CV_EvasionUp2:
if_stat_level_less_than AI_USER, STAT_EVASION, 9, AI_CV_EvasionUp3
if_random_less_than 128, AI_CV_EvasionUp3
score -1
-
AI_CV_EvasionUp3:
if_not_status AI_TARGET, STATUS1_TOXIC_POISON, AI_CV_EvasionUp5
if_hp_more_than AI_USER, 50, AI_CV_EvasionUp4
if_random_less_than 80, AI_CV_EvasionUp5
-
AI_CV_EvasionUp4:
if_random_less_than 50, AI_CV_EvasionUp5
score +3
-
AI_CV_EvasionUp5:
if_not_status3 AI_TARGET, STATUS3_LEECHSEED, AI_CV_EvasionUp6
if_random_less_than 70, AI_CV_EvasionUp6
score +3
-
AI_CV_EvasionUp6:
if_not_status3 AI_USER, STATUS3_ROOTED, AI_CV_EvasionUp7
if_random_less_than 128, AI_CV_EvasionUp7
score +2
-
AI_CV_EvasionUp7:
if_not_status2 AI_TARGET, STATUS2_CURSED, AI_CV_EvasionUp8
if_random_less_than 70, AI_CV_EvasionUp8
score +3
-
AI_CV_EvasionUp8:
if_hp_more_than AI_USER, 70, AI_CV_EvasionUp_End
if_stat_level_equal AI_USER, STAT_EVASION, DEFAULT_STAT_STAGE, AI_CV_EvasionUp_End
if_hp_less_than AI_USER, 40, AI_CV_EvasionUp_ScoreDown2
if_hp_less_than AI_TARGET, 40, AI_CV_EvasionUp_ScoreDown2
if_random_less_than 70, AI_CV_EvasionUp_End
-
AI_CV_EvasionUp_ScoreDown2:
score -2
-
AI_CV_EvasionUp_End:
end
@@ -1121,11 +1079,9 @@ AI_CV_AlwaysHit:
AI_CV_AlwaysHit_ScoreUp1:
score +1
-
AI_CV_AlwaysHit2:
if_random_less_than 100, AI_CV_AlwaysHit_End
score +1
-
AI_CV_AlwaysHit_End:
end
@@ -1134,16 +1090,13 @@ AI_CV_AttackDown: @ 82DCDF8
score -1
if_hp_more_than AI_USER, 90, AI_CV_AttackDown2
score -1
-
AI_CV_AttackDown2: @ 82DCE0B
if_stat_level_more_than AI_TARGET, STAT_ATK, 3, AI_CV_AttackDown3
if_random_less_than 50, AI_CV_AttackDown3
score -2
-
AI_CV_AttackDown3: @ 82DCE1B
if_hp_more_than AI_TARGET, 70, AI_CV_AttackDown4
score -2
-
AI_CV_AttackDown4: @ 82DCE24
get_target_type1
if_in_bytes AI_CV_AttackDown_UnknownTypeList, AI_CV_AttackDown_End
@@ -1151,7 +1104,6 @@ AI_CV_AttackDown4: @ 82DCE24
if_in_bytes AI_CV_AttackDown_UnknownTypeList, AI_CV_AttackDown_End
if_random_less_than 50, AI_CV_AttackDown_End
score -2
-
AI_CV_AttackDown_End: @ 82DCE42
end
@@ -1167,15 +1119,12 @@ AI_CV_AttackDown_UnknownTypeList:
AI_CV_DefenseDown:
if_hp_less_than AI_USER, 70, AI_CV_DefenseDown2
if_stat_level_more_than AI_TARGET, STAT_DEF, 3, AI_CV_DefenseDown3
-
AI_CV_DefenseDown2:
if_random_less_than 50, AI_CV_DefenseDown3
score -2
-
AI_CV_DefenseDown3:
if_hp_more_than AI_TARGET, 70, AI_CV_DefenseDown_End
score -2
-
AI_CV_DefenseDown_End:
end
@@ -1193,7 +1142,6 @@ AI_CV_SpeedDown: @ 82DCE81
AI_CV_SpeedDown2: @ 82DCE8E
if_random_less_than 70, AI_CV_SpeedDown_End
score +2
-
AI_CV_SpeedDown_End: @ 82DCE96
end
@@ -1202,16 +1150,13 @@ AI_CV_SpAtkDown:
score -1
if_hp_more_than AI_USER, 90, AI_CV_SpAtkDown2
score -1
-
AI_CV_SpAtkDown2:
if_stat_level_more_than AI_TARGET, STAT_SPATK, 3, AI_CV_SpAtkDown3
if_random_less_than 50, AI_CV_SpAtkDown3
score -2
-
AI_CV_SpAtkDown3:
if_hp_more_than AI_TARGET, 70, AI_CV_SpAtkDown4
score -2
-
AI_CV_SpAtkDown4:
get_target_type1
if_in_bytes AI_CV_SpAtkDown_SpecialTypeList, AI_CV_SpAtkDown_End
@@ -1219,7 +1164,6 @@ AI_CV_SpAtkDown4:
if_in_bytes AI_CV_SpAtkDown_SpecialTypeList, AI_CV_SpAtkDown_End
if_random_less_than 50, AI_CV_SpAtkDown_End
score -2
-
AI_CV_SpAtkDown_End: @ 82DCEE1
end
@@ -1237,76 +1181,61 @@ AI_CV_SpAtkDown_SpecialTypeList: @ 82DCEE2
AI_CV_SpDefDown: @ 82DCEEB
if_hp_less_than AI_USER, 70, AI_CV_SpDefDown2
if_stat_level_more_than AI_TARGET, STAT_SPDEF, 3, AI_CV_SpDefDown3
-
AI_CV_SpDefDown2: @ 82DCEFA
if_random_less_than 50, AI_CV_SpDefDown3
score -2
-
AI_CV_SpDefDown3: @ 82DCF02
if_hp_more_than AI_TARGET, 70, AI_CV_SpDefDown_End
score -2
-
AI_CV_SpDefDown_End: @ 82DCF0B
end
AI_CV_AccuracyDown: @ 82DCF0C
if_hp_less_than AI_USER, 70, AI_CV_AccuracyDown2
if_hp_more_than AI_TARGET, 70, AI_CV_AccuracyDown3
-
AI_CV_AccuracyDown2:
if_random_less_than 100, AI_CV_AccuracyDown3
score -1
-
AI_CV_AccuracyDown3:
if_stat_level_more_than AI_USER, STAT_ACC, 4, AI_CV_AccuracyDown4
if_random_less_than 80, AI_CV_AccuracyDown4
score -2
-
AI_CV_AccuracyDown4:
if_not_status AI_TARGET, STATUS1_TOXIC_POISON, AI_CV_AccuracyDown5
if_random_less_than 70, AI_CV_AccuracyDown5
score +2
-
AI_CV_AccuracyDown5:
if_not_status3 AI_TARGET, STATUS3_LEECHSEED, AI_CV_AccuracyDown6
if_random_less_than 70, AI_CV_AccuracyDown6
score +2
-
AI_CV_AccuracyDown6:
if_not_status3 AI_USER, STATUS3_ROOTED, AI_CV_AccuracyDown7
if_random_less_than 128, AI_CV_AccuracyDown7
score +1
-
AI_CV_AccuracyDown7:
if_not_status2 AI_TARGET, STATUS2_CURSED, AI_CV_AccuracyDown8
if_random_less_than 70, AI_CV_AccuracyDown8
score +2
-
AI_CV_AccuracyDown8:
if_hp_more_than AI_USER, 70, AI_CV_AccuracyDown_End
if_stat_level_equal AI_TARGET, STAT_ACC, DEFAULT_STAT_STAGE, AI_CV_AccuracyDown_End
if_hp_less_than AI_USER, 40, AI_CV_AccuracyDown_ScoreDown2
if_hp_less_than AI_TARGET, 40, AI_CV_AccuracyDown_ScoreDown2
if_random_less_than 70, AI_CV_AccuracyDown_End
-
AI_CV_AccuracyDown_ScoreDown2:
score -2
-
AI_CV_AccuracyDown_End:
end
AI_CV_EvasionDown:
if_hp_less_than AI_USER, 70, AI_CV_EvasionDown2
if_stat_level_more_than AI_TARGET, STAT_EVASION, 3, AI_CV_EvasionDown3
-
AI_CV_EvasionDown2:
if_random_less_than 50, AI_CV_EvasionDown3
score -2
-
AI_CV_EvasionDown3:
if_hp_more_than AI_TARGET, 70, AI_CV_EvasionDown_End
score -2
-
AI_CV_EvasionDown_End:
end
@@ -1326,7 +1255,6 @@ AI_CV_Haze:
AI_CV_Haze2:
if_random_less_than 50, AI_CV_Haze3
score -3
-
AI_CV_Haze3:
if_stat_level_more_than AI_TARGET, STAT_ATK, 8, AI_CV_Haze4
if_stat_level_more_than AI_TARGET, STAT_DEF, 8, AI_CV_Haze4
@@ -1345,14 +1273,12 @@ AI_CV_Haze3:
AI_CV_Haze4:
if_random_less_than 50, AI_CV_Haze_End
score +3
-
AI_CV_Haze_End:
end
AI_CV_Bide:
if_hp_more_than AI_USER, 90, AI_CV_Bide_End
score -2
-
AI_CV_Bide_End:
end
@@ -1368,19 +1294,16 @@ AI_CV_Roar:
AI_CV_Roar2:
if_random_less_than 128, AI_CV_Roar_End
score +2
-
AI_CV_Roar_End:
end
AI_CV_Conversion:
if_hp_more_than AI_USER, 90, AI_CV_Conversion2
score -2
-
AI_CV_Conversion2:
get_turn_count
if_equal 0, AI_CV_Conversion_End
if_random_less_than 200, Score_Minus2
-
AI_CV_Conversion_End:
end
@@ -1393,7 +1316,6 @@ AI_CV_HealWeather:
AI_CV_HealWeather_ScoreDown2:
score -2
-
AI_CV_Heal:
if_hp_equal AI_USER, 100, AI_CV_Heal3
if_target_faster AI_CV_Heal4
@@ -1404,7 +1326,6 @@ AI_CV_Heal2:
if_hp_less_than AI_USER, 50, AI_CV_Heal5
if_hp_more_than AI_USER, 80, AI_CV_Heal3
if_random_less_than 70, AI_CV_Heal5
-
AI_CV_Heal3:
score -3
goto AI_CV_Heal_End
@@ -1418,11 +1339,9 @@ AI_CV_Heal4:
AI_CV_Heal5:
if_doesnt_have_move_with_effect AI_TARGET, EFFECT_SNATCH, AI_CV_Heal6
if_random_less_than 100, AI_CV_Heal_End
-
AI_CV_Heal6:
if_random_less_than 20, AI_CV_Heal_End
score +2
-
AI_CV_Heal_End:
end
@@ -1431,12 +1350,10 @@ AI_CV_Toxic:
if_hp_more_than AI_USER, 50, AI_CV_Toxic2
if_random_less_than 50, AI_CV_Toxic2
score -3
-
AI_CV_Toxic2:
if_hp_more_than AI_TARGET, 50, AI_CV_Toxic3
if_random_less_than 50, AI_CV_Toxic3
score -3
-
AI_CV_Toxic3:
if_has_move_with_effect AI_USER, EFFECT_SPECIAL_DEFENSE_UP, AI_CV_Toxic4
if_has_move_with_effect AI_USER, EFFECT_PROTECT, AI_CV_Toxic4
@@ -1445,7 +1362,6 @@ AI_CV_Toxic3:
AI_CV_Toxic4:
if_random_less_than 60, AI_CV_Toxic_End
score +2
-
AI_CV_Toxic_End:
end
@@ -1456,10 +1372,8 @@ AI_CV_LightScreen:
get_target_type2
if_in_bytes AI_CV_LightScreen_SpecialTypeList, AI_CV_LightScreen_End
if_random_less_than 50, AI_CV_LightScreen_End
-
AI_CV_LightScreen_ScoreDown2:
score -2
-
AI_CV_LightScreen_End:
end
@@ -1484,7 +1398,6 @@ AI_CV_Rest2:
if_hp_less_than AI_USER, 40, AI_CV_Rest6
if_hp_more_than AI_USER, 50, AI_CV_Rest3
if_random_less_than 70, AI_CV_Rest6
-
AI_CV_Rest3:
score -3
goto AI_CV_Rest_End
@@ -1493,7 +1406,6 @@ AI_CV_Rest4:
if_hp_less_than AI_USER, 60, AI_CV_Rest6
if_hp_more_than AI_USER, 70, AI_CV_Rest5
if_random_less_than 50, AI_CV_Rest6
-
AI_CV_Rest5:
score -3
goto AI_CV_Rest_End
@@ -1501,11 +1413,9 @@ AI_CV_Rest5:
AI_CV_Rest6:
if_doesnt_have_move_with_effect AI_TARGET, EFFECT_SNATCH, AI_CV_Rest7
if_random_less_than 50, AI_CV_Rest_End
-
AI_CV_Rest7:
if_random_less_than 10, AI_CV_Rest_End
score +3
-
AI_CV_Rest_End:
end
@@ -1515,7 +1425,6 @@ AI_CV_OneHitKO:
AI_CV_SuperFang:
if_hp_more_than AI_TARGET, 50, AI_CV_SuperFang_End
score -1
-
AI_CV_SuperFang_End:
end
@@ -1529,7 +1438,6 @@ AI_CV_Trap:
AI_CV_Trap2:
if_random_less_than 128, AI_CV_Trap_End
score +1
-
AI_CV_Trap_End:
end
@@ -1543,28 +1451,23 @@ AI_CV_HighCrit:
AI_CV_HighCrit2:
if_random_less_than 128, AI_CV_HighCrit_End
score +1
-
AI_CV_HighCrit_End:
end
AI_CV_Swagger:
if_has_move AI_USER, MOVE_PSYCH_UP, AI_CV_SwaggerHasPsychUp
-
AI_CV_Flatter:
if_random_less_than 128, AI_CV_Confuse
score +1
-
AI_CV_Confuse:
if_hp_more_than AI_TARGET, 70, AI_CV_Confuse_End
if_random_less_than 128, AI_CV_Confuse2
score -1
-
AI_CV_Confuse2:
if_hp_more_than AI_TARGET, 50, AI_CV_Confuse_End
score -1
if_hp_more_than AI_TARGET, 30, AI_CV_Confuse_End
score -1
-
AI_CV_Confuse_End:
end
@@ -1578,7 +1481,6 @@ AI_CV_SwaggerHasPsychUp:
AI_CV_SwaggerHasPsychUp_Minus5:
score -5
-
AI_CV_SwaggerHasPsychUp_End:
end
@@ -1589,10 +1491,8 @@ AI_CV_Reflect:
get_target_type2
if_in_bytes AI_CV_Reflect_PhysicalTypeList, AI_CV_Reflect_End
if_random_less_than 50, AI_CV_Reflect_End
-
AI_CV_Reflect_ScoreDown2:
score -2
-
AI_CV_Reflect_End:
end
@@ -1611,10 +1511,8 @@ AI_CV_Reflect_PhysicalTypeList:
AI_CV_Poison:
if_hp_less_than AI_USER, 50, AI_CV_Poison_ScoreDown1
if_hp_more_than AI_TARGET, 50, AI_CV_Poison_End
-
AI_CV_Poison_ScoreDown1:
score -1
-
AI_CV_Poison_End:
end
@@ -1627,7 +1525,6 @@ AI_CV_Paralyze:
AI_CV_Paralyze2:
if_random_less_than 20, AI_CV_Paralyze_End
score +3
-
AI_CV_Paralyze_End:
end
@@ -1636,11 +1533,9 @@ AI_CV_VitalThrow:
if_hp_more_than AI_USER, 60, AI_CV_VitalThrow_End
if_hp_less_than AI_USER, 40, AI_CV_VitalThrow2
if_random_less_than 180, AI_CV_VitalThrow_End
-
AI_CV_VitalThrow2:
if_random_less_than 50, AI_CV_VitalThrow_End
score -1
-
AI_CV_VitalThrow_End:
end
@@ -1650,15 +1545,12 @@ AI_CV_Substitute:
if_hp_more_than AI_USER, 50, AI_CV_Substitute2
if_random_less_than 100, AI_CV_Substitute2
score -1
-
AI_CV_Substitute2:
if_random_less_than 100, AI_CV_Substitute3
score -1
-
AI_CV_Substitute3:
if_random_less_than 100, AI_CV_Substitute4
score -1
-
AI_CV_Substitute4:
if_target_faster AI_CV_Substitute_End
get_last_used_bank_move AI_TARGET
@@ -1682,11 +1574,9 @@ AI_CV_Substitute6:
AI_CV_Substitute7:
if_status3 AI_TARGET, STATUS3_LEECHSEED, AI_CV_Substitute_End
-
AI_CV_Substitute8:
if_random_less_than 100, AI_CV_Substitute_End
score +1
-
AI_CV_Substitute_End:
end
@@ -1699,10 +1589,8 @@ AI_CV_Recharge:
AI_CV_Recharge2:
if_hp_less_than AI_USER, 60, AI_CV_Recharge_End
-
AI_CV_Recharge_ScoreDown1:
score -1
-
AI_CV_Recharge_End:
end
@@ -1717,7 +1605,6 @@ AI_CV_Disable:
AI_CV_Disable2:
if_random_less_than 100, AI_CV_Disable_End
score -1
-
AI_CV_Disable_End:
end
@@ -1728,12 +1615,10 @@ AI_CV_Counter:
if_hp_more_than AI_USER, 30, AI_CV_Counter2
if_random_less_than 10, AI_CV_Counter2
score -1
-
AI_CV_Counter2:
if_hp_more_than AI_USER, 50, AI_CV_Counter3
if_random_less_than 100, AI_CV_Counter3
score -1
-
AI_CV_Counter3:
if_has_move AI_USER, MOVE_MIRROR_COAT, AI_CV_Counter7
get_last_used_bank_move AI_TARGET
@@ -1742,7 +1627,6 @@ AI_CV_Counter3:
if_target_not_taunted AI_CV_Counter4
if_random_less_than 100, AI_CV_Counter4
score +1
-
AI_CV_Counter4:
get_last_used_bank_move AI_TARGET
get_move_type_from_result
@@ -1755,24 +1639,20 @@ AI_CV_Counter5:
if_target_not_taunted AI_CV_Counter6
if_random_less_than 100, AI_CV_Counter6
score +1
-
AI_CV_Counter6:
get_target_type1
if_in_bytes AI_CV_Counter_PhysicalTypeList, AI_CV_Counter_End
get_target_type2
if_in_bytes AI_CV_Counter_PhysicalTypeList, AI_CV_Counter_End
if_random_less_than 50, AI_CV_Counter_End
-
AI_CV_Counter7:
if_random_less_than 100, AI_CV_Counter8
score +4
-
AI_CV_Counter8:
end
AI_CV_Counter_ScoreDown1:
score -1
-
AI_CV_Counter_End:
end
@@ -1794,7 +1674,6 @@ AI_CV_Encore:
get_last_used_bank_move AI_TARGET
get_move_effect_from_result
if_not_in_bytes AI_CV_Encore_EncouragedMovesToEncore, AI_CV_Encore_ScoreDown2
-
AI_CV_Encore2:
if_random_less_than 30, AI_CV_Encore_End
score +3
@@ -1802,7 +1681,6 @@ AI_CV_Encore2:
AI_CV_Encore_ScoreDown2:
score -2
-
AI_CV_Encore_End:
end
@@ -1885,7 +1763,6 @@ AI_CV_PainSplit2:
AI_CV_PainSplit_ScoreDown1:
score -1
-
AI_CV_PainSplit_End:
end
@@ -1896,7 +1773,6 @@ AI_CV_Snore:
AI_CV_LockOn:
if_random_less_than 128, AI_CV_LockOn_End
score +2
-
AI_CV_LockOn_End:
end
@@ -1911,17 +1787,14 @@ AI_CV_DestinyBond:
if_hp_more_than AI_USER, 70, AI_CV_DestinyBond_End
if_random_less_than 128, AI_CV_DestinyBond2
score +1
-
AI_CV_DestinyBond2:
if_hp_more_than AI_USER, 50, AI_CV_DestinyBond_End
if_random_less_than 128, AI_CV_DestinyBond3
score +1
-
AI_CV_DestinyBond3:
if_hp_more_than AI_USER, 30, AI_CV_DestinyBond_End
if_random_less_than 100, AI_CV_DestinyBond_End
score +2
-
AI_CV_DestinyBond_End:
end
@@ -1939,7 +1812,6 @@ AI_CV_Flail2:
AI_CV_Flail_ScoreUp1:
score +1
-
AI_CV_Flail3:
if_random_less_than 100, AI_CV_Flail_End
score +1
@@ -1947,7 +1819,6 @@ AI_CV_Flail3:
AI_CV_Flail_ScoreDown1:
score -1
-
AI_CV_Flail_End:
end
@@ -1955,7 +1826,6 @@ AI_CV_HealBell:
if_status AI_TARGET, STATUS1_ANY, AI_CV_HealBell_End
if_status_in_party AI_TARGET, STATUS1_ANY, AI_CV_HealBell_End
score -5
-
AI_CV_HealBell_End:
end
@@ -1968,7 +1838,6 @@ AI_CV_Thief:
AI_CV_Thief_ScoreDown2:
score -2
-
AI_CV_Thief_End:
end
@@ -1990,12 +1859,10 @@ AI_CV_Curse:
if_stat_level_more_than AI_USER, STAT_DEF, 9, AI_CV_Curse_End
if_random_less_than 128, AI_CV_Curse2
score +1
-
AI_CV_Curse2:
if_stat_level_more_than AI_USER, STAT_DEF, 7, AI_CV_Curse_End
if_random_less_than 128, AI_CV_Curse3
score +1
-
AI_CV_Curse3:
if_stat_level_more_than AI_USER, STAT_DEF, DEFAULT_STAT_STAGE, AI_CV_Curse_End
if_random_less_than 128, AI_CV_Curse_End
@@ -2005,7 +1872,6 @@ AI_CV_Curse3:
AI_CV_Curse4:
if_hp_more_than AI_USER, 80, AI_CV_Curse_End
score -1
-
AI_CV_Curse_End:
end
@@ -2033,11 +1899,9 @@ AI_CV_Protect:
AI_CV_Protect_ScoreUp2:
score +2
-
AI_CV_Protect2:
if_random_less_than 128, AI_CV_Protect4
score -1
-
AI_CV_Protect4:
get_protect_count AI_USER
if_equal 0, AI_CV_Protect_End
@@ -2050,10 +1914,8 @@ AI_CV_Protect3:
get_last_used_bank_move AI_TARGET
get_move_effect_from_result
if_not_equal EFFECT_LOCK_ON, AI_CV_Protect_End
-
AI_CV_Protect_ScoreDown2:
score -2
-
AI_CV_Protect_End:
end
@@ -2078,18 +1940,15 @@ AI_CV_Foresight:
AI_CV_Foresight2:
if_random_less_than 80, AI_CV_Foresight_End
-
AI_CV_Foresight3:
if_random_less_than 80, AI_CV_Foresight_End
score +2
-
AI_CV_Foresight_End:
end
AI_CV_Endure:
if_hp_less_than AI_USER, 4, AI_CV_Endure2
if_hp_less_than AI_USER, 35, AI_CV_Endure3
-
AI_CV_Endure2:
score -1
goto AI_CV_Endure_End
@@ -2097,7 +1956,6 @@ AI_CV_Endure2:
AI_CV_Endure3:
if_random_less_than 70, AI_CV_Endure_End
score +1
-
AI_CV_Endure_End:
end
@@ -2116,7 +1974,6 @@ AI_CV_BatonPass2:
AI_CV_BatonPass3:
if_hp_more_than AI_USER, 70, AI_CV_BatonPass_End
-
AI_CV_BatonPass4:
if_random_less_than 80, AI_CV_BatonPass_End
score +2
@@ -2137,10 +1994,8 @@ AI_CV_BatonPass7:
AI_CV_BatonPass8:
if_hp_less_than AI_USER, 70, AI_CV_BatonPass_End
-
AI_CV_BatonPass_ScoreDown2:
score -2
-
AI_CV_BatonPass_End:
end
@@ -2160,7 +2015,6 @@ AI_CV_Pursuit:
AI_CV_Pursuit2:
if_random_less_than 128, AI_CV_Pursuit_End
score +1
-
AI_CV_Pursuit_End:
end
@@ -2168,7 +2022,6 @@ AI_CV_RainDance:
if_user_faster AI_CV_RainDance2
get_ability AI_USER
if_equal ABILITY_SWIFT_SWIM, AI_CV_RainDance3
-
AI_CV_RainDance2:
if_hp_less_than AI_USER, 40, AI_CV_RainDance_ScoreDown1
get_weather
@@ -2185,7 +2038,6 @@ AI_CV_RainDance3:
AI_CV_RainDance_ScoreDown1:
score -1
-
AI_CV_RainDance_End:
end
@@ -2203,7 +2055,6 @@ AI_CV_SunnyDay2:
AI_CV_SunnyDay_ScoreDown1:
score -1
-
AI_CV_SunnyDay_End:
end
@@ -2213,7 +2064,6 @@ AI_CV_BellyDrum:
AI_CV_BellyDrum_ScoreDown2:
score -2
-
AI_CV_BellyDrum_End:
end
@@ -2236,14 +2086,12 @@ AI_CV_PsychUp2:
AI_CV_PsychUp_ScoreUp1:
score +1
-
AI_CV_PsychUp3:
score +1
end
AI_CV_PsychUp_ScoreDown2:
score -2
-
AI_CV_PsychUp_End:
end
@@ -2254,12 +2102,10 @@ AI_CV_MirrorCoat:
if_hp_more_than AI_USER, 30, AI_CV_MirrorCoat2
if_random_less_than 10, AI_CV_MirrorCoat2
score -1
-
AI_CV_MirrorCoat2:
if_hp_more_than AI_USER, 50, AI_CV_MirrorCoat3
if_random_less_than 100, AI_CV_MirrorCoat3
score -1
-
AI_CV_MirrorCoat3:
if_has_move AI_USER, MOVE_COUNTER, AI_CV_MirrorCoat_ScoreUp4
get_last_used_bank_move AI_TARGET
@@ -2268,7 +2114,6 @@ AI_CV_MirrorCoat3:
if_target_not_taunted AI_CV_MirrorCoat4
if_random_less_than 100, AI_CV_MirrorCoat4
score +1
-
AI_CV_MirrorCoat4:
get_last_used_bank_move AI_TARGET
get_move_type_from_result
@@ -2281,24 +2126,20 @@ AI_CV_MirrorCoat5:
if_target_not_taunted AI_CV_MirrorCoat6
if_random_less_than 100, AI_CV_MirrorCoat6
score +1
-
AI_CV_MirrorCoat6:
get_target_type1
if_in_bytes AI_CV_MirrorCoat_SpecialTypeList, AI_CV_MirrorCoat_End
get_target_type2
if_in_bytes AI_CV_MirrorCoat_SpecialTypeList, AI_CV_MirrorCoat_End
if_random_less_than 50, AI_CV_MirrorCoat_End
-
AI_CV_MirrorCoat_ScoreUp4:
if_random_less_than 100, AI_CV_MirrorCoat_ScoreUp4_End
score +4
-
AI_CV_MirrorCoat_ScoreUp4_End:
end
AI_CV_MirrorCoat_ScoreDown1:
score -1
-
AI_CV_MirrorCoat_End:
end
@@ -2323,7 +2164,6 @@ AI_CV_ChargeUpMove:
AI_CV_ChargeUpMove_ScoreDown2:
score -2
-
AI_CV_ChargeUpMove_End:
end
@@ -2360,7 +2200,6 @@ AI_CV_SemiInvulnerable_CheckIceType:
if_equal TYPE_ICE, AI_CV_SemiInvulnerable_TryEncourage
get_user_type2
if_equal TYPE_ICE, AI_CV_SemiInvulnerable_TryEncourage
-
AI_CV_SemiInvulnerable5:
if_target_faster AI_CV_SemiInvulnerable_End
get_last_used_bank_move AI_TARGET
@@ -2371,7 +2210,6 @@ AI_CV_SemiInvulnerable5:
AI_CV_SemiInvulnerable_TryEncourage:
if_random_less_than 80, AI_CV_SemiInvulnerable_End
score +1
-
AI_CV_SemiInvulnerable_End:
end
@@ -2390,7 +2228,6 @@ AI_CV_SpitUp:
if_less_than 2, AI_CV_SpitUp_End
if_random_less_than 80, AI_CV_SpitUp_End
score +2
-
AI_CV_SpitUp_End:
end
@@ -2408,7 +2245,6 @@ AI_CV_Hail2:
AI_CV_Hail_ScoreDown1:
score -1
-
AI_CV_Hail_End:
end
@@ -2442,10 +2278,8 @@ AI_CV_FocusPunch2:
AI_CV_FocusPunch3:
if_random_less_than 100, AI_CV_FocusPunch_End
if_status2 AI_USER, STATUS2_SUBSTITUTE, Score_Plus5
-
AI_CV_FocusPunch_ScoreUp1:
score +1
-
AI_CV_FocusPunch_End:
end
@@ -2455,7 +2289,6 @@ AI_CV_SmellingSalt:
AI_CV_SmellingSalt_ScoreUp1:
score +1
-
AI_CV_SmellingSalt_End:
end
@@ -2463,7 +2296,6 @@ AI_CV_Trick:
get_hold_effect AI_USER
if_in_bytes AI_CV_Trick_EffectsToEncourage2, AI_CV_Trick3
if_in_bytes AI_CV_Trick_EffectsToEncourage, AI_CV_Trick4
-
AI_CV_Trick2:
score -3
goto AI_CV_Trick_End
@@ -2479,7 +2311,6 @@ AI_CV_Trick4:
if_in_bytes AI_CV_Trick_EffectsToEncourage, AI_CV_Trick2
if_random_less_than 50, AI_CV_Trick_End
score +2
-
AI_CV_Trick_End:
end
@@ -2502,7 +2333,6 @@ AI_CV_ChangeSelfAbility:
if_in_bytes AI_CV_ChangeSelfAbility_AbilitiesToEncourage, AI_CV_ChangeSelfAbility2
get_ability AI_TARGET
if_in_bytes AI_CV_ChangeSelfAbility_AbilitiesToEncourage, AI_CV_ChangeSelfAbility3
-
AI_CV_ChangeSelfAbility2:
score -1
goto AI_CV_ChangeSelfAbility_End
@@ -2510,7 +2340,6 @@ AI_CV_ChangeSelfAbility2:
AI_CV_ChangeSelfAbility3:
if_random_less_than 50, AI_CV_ChangeSelfAbility_End
score +2
-
AI_CV_ChangeSelfAbility_End:
end
@@ -2543,10 +2372,8 @@ AI_CV_Superpower:
AI_CV_Superpower2:
if_hp_less_than AI_USER, 60, AI_CV_Superpower_End
-
AI_CV_Superpower_ScoreDown1:
score -1
-
AI_CV_Superpower_End:
end
@@ -2554,21 +2381,18 @@ AI_CV_MagicCoat:
if_hp_more_than AI_TARGET, 30, AI_CV_MagicCoat2
if_random_less_than 100, AI_CV_MagicCoat2
score -1
-
AI_CV_MagicCoat2:
is_first_turn_for AI_USER
- if_equal 0, AI_CV_MagicCoat4
+ if_equal FALSE, AI_CV_MagicCoat4
if_random_less_than 150, AI_CV_MagicCoat_End
score +1
goto AI_CV_MagicCoat_End
AI_CV_MagicCoat3:
if_random_less_than 50, AI_CV_MagicCoat_End
-
AI_CV_MagicCoat4:
if_random_less_than 30, AI_CV_MagicCoat_End
score -1
-
AI_CV_MagicCoat_End:
end
@@ -2581,7 +2405,6 @@ AI_CV_Recycle:
AI_CV_Recycle_ScoreDown2:
score -2
-
AI_CV_Recycle_End:
end
@@ -2601,7 +2424,6 @@ AI_CV_Revenge:
AI_CV_Revenge_ScoreDown2:
score -2
-
AI_CV_Revenge_End:
end
@@ -2611,7 +2433,6 @@ AI_CV_BrickBreak:
AI_CV_BrickBreak_ScoreUp1:
score +1
-
AI_CV_BrickBreak_End:
end
@@ -2621,7 +2442,6 @@ AI_CV_KnockOff:
if_more_than 0, AI_CV_KnockOff_End
if_random_less_than 180, AI_CV_KnockOff_End
score +1
-
AI_CV_KnockOff_End:
end
@@ -2639,7 +2459,6 @@ AI_CV_Endeavor2:
AI_CV_Endeavor_ScoreDown1:
score -1
-
AI_CV_Endeavor_End:
end
@@ -2652,10 +2471,8 @@ AI_CV_Eruption:
AI_CV_Eruption2:
if_hp_more_than AI_TARGET, 70, AI_CV_Eruption_End
-
AI_CV_Eruption_ScoreDown1:
score -1
-
AI_CV_Eruption_End:
end
@@ -2664,7 +2481,6 @@ AI_CV_Imprison:
if_more_than 0, AI_CV_Imprison_End
if_random_less_than 100, AI_CV_Imprison_End
score +2
-
AI_CV_Imprison_End:
end
@@ -2674,13 +2490,12 @@ AI_CV_Refresh:
AI_CV_Refresh_ScoreDown1:
score -1
-
AI_CV_Refresh_End:
end
AI_CV_Snatch:
is_first_turn_for AI_USER
- if_equal 1, AI_CV_Snatch3
+ if_equal TRUE, AI_CV_Snatch3
if_random_less_than 30, AI_CV_Snatch_End
if_target_faster AI_CV_Snatch2
if_hp_not_equal AI_USER, 100, AI_CV_Snatch5
@@ -2707,7 +2522,6 @@ AI_CV_Snatch4:
AI_CV_Snatch5:
if_random_less_than 30, AI_CV_Snatch_End
score -2
-
AI_CV_Snatch_End:
end
@@ -2725,7 +2539,6 @@ AI_CV_MudSport2:
AI_CV_MudSport_ScoreDown1:
score -1
-
AI_CV_MudSport_End:
end
@@ -2738,10 +2551,8 @@ AI_CV_Overheat:
AI_CV_Overheat2:
if_hp_more_than AI_USER, 80, AI_CV_Overheat_End
-
AI_CV_Overheat_ScoreDown1:
score -1
-
AI_CV_Overheat_End:
end
@@ -2759,7 +2570,6 @@ AI_CV_WaterSport2:
AI_CV_WaterSport_ScoreDown1:
score -1
-
AI_CV_WaterSport_End:
end
@@ -2773,7 +2583,6 @@ AI_CV_DragonDance:
AI_CV_DragonDance2:
if_random_less_than 128, AI_CV_DragonDance_End
score +1
-
AI_CV_DragonDance_End:
end
@@ -2794,10 +2603,8 @@ AI_TryToFaint_TryToEncourageQuickAttack:
if_effect EFFECT_EXPLOSION, AI_TryToFaint_End
if_not_effect EFFECT_QUICK_ATTACK, AI_TryToFaint_ScoreUp4
score +2
-
AI_TryToFaint_ScoreUp4:
score +4
-
AI_TryToFaint_End:
end
@@ -2809,7 +2616,6 @@ AI_SetupFirstTurn:
if_not_in_bytes AI_SetupFirstTurn_SetupEffectsToEncourage, AI_SetupFirstTurn_End
if_random_less_than 80, AI_SetupFirstTurn_End
score +2
-
AI_SetupFirstTurn_End:
end
@@ -2871,14 +2677,15 @@ AI_SetupFirstTurn_SetupEffectsToEncourage:
.byte EFFECT_CAMOUFLAGE
.byte -1
-AI_PreferStrongestMove:
+@ ~60% chance to prefer moves that do 0 or 1 damage, or are in sIgnoredPowerfulMoveEffects
+@ Oddly this group includes moves like Explosion and Eruption, so the AI strategy isn't very coherent
+AI_PreferPowerExtremes:
if_target_is_ally AI_Ret
get_how_powerful_move_is
- if_not_equal 0, AI_PreferStrongestMove_End
- if_random_less_than 100, AI_PreferStrongestMove_End
+ if_not_equal MOVE_POWER_OTHER, AI_PreferPowerExtremes_End
+ if_random_less_than 100, AI_PreferPowerExtremes_End
score +2
-
-AI_PreferStrongestMove_End:
+AI_PreferPowerExtremes_End:
end
AI_Risky:
@@ -2887,7 +2694,6 @@ AI_Risky:
if_not_in_bytes AI_Risky_EffectsToEncourage, AI_Risky_End
if_random_less_than 128, AI_Risky_End
score +2
-
AI_Risky_End:
end
@@ -2918,10 +2724,9 @@ AI_PreferBatonPass:
count_usable_party_mons AI_USER
if_equal 0, AI_PreferBatonPassEnd
get_how_powerful_move_is
- if_not_equal 0, AI_PreferBatonPassEnd
+ if_not_equal MOVE_POWER_OTHER, AI_PreferBatonPassEnd
if_has_move_with_effect AI_USER, EFFECT_BATON_PASS, AI_PreferBatonPass_GoForBatonPass
if_random_less_than 80, AI_Risky_End
-
AI_PreferBatonPass_GoForBatonPass:
if_move MOVE_SWORDS_DANCE, AI_PreferBatonPass2
if_move MOVE_DRAGON_DANCE, AI_PreferBatonPass2
@@ -2930,7 +2735,6 @@ AI_PreferBatonPass_GoForBatonPass:
if_move MOVE_BATON_PASS, AI_PreferBatonPass_EncourageIfHighStats
if_random_less_than 20, AI_Risky_End
score +3
-
AI_PreferBatonPass2:
get_turn_count
if_equal 0, Score_Plus5
@@ -2977,7 +2781,7 @@ AI_DoubleBattle:
AI_DoubleBattlePartnerHasHelpingHand:
get_how_powerful_move_is
- if_not_equal 0, Score_Plus1
+ if_not_equal MOVE_POWER_OTHER, Score_Plus1
end
AI_DoubleBattleCheckUserStatus:
@@ -2986,7 +2790,7 @@ AI_DoubleBattleCheckUserStatus:
AI_DoubleBattleCheckUserStatus2:
get_how_powerful_move_is
- if_equal MOVE_POWER_DISCOURAGED, Score_Minus5
+ if_equal MOVE_POWER_OTHER, Score_Minus5
score +1
if_equal MOVE_MOST_POWERFUL, Score_Plus2
end
@@ -3013,7 +2817,6 @@ AI_DoubleBattleElectricMove:
score -2
if_no_type AI_TARGET_PARTNER, TYPE_GROUND, AI_DoubleBattleElectricMoveEnd
score -8
-
AI_DoubleBattleElectricMoveEnd:
end
@@ -3026,10 +2829,9 @@ AI_DoubleBattleFireMove2:
AI_TryOnAlly:
get_how_powerful_move_is
- if_equal 0, AI_TryStatusMoveOnAlly
+ if_equal MOVE_POWER_OTHER, AI_TryStatusMoveOnAlly
get_curr_move_type
if_equal TYPE_FIRE, AI_TryFireMoveOnAlly
-
AI_DiscourageOnAlly:
goto Score_Minus30
@@ -3096,7 +2898,6 @@ AI_TrySwaggerOnAlly:
AI_TrySwaggerOnAlly2:
if_stat_level_more_than AI_TARGET, STAT_ATK, 7, AI_TrySwaggerOnAlly_End
score +3
-
AI_TrySwaggerOnAlly_End:
end
@@ -3125,7 +2926,6 @@ AI_HPAware_UserHasMediumHP:
AI_HPAware_TryToDiscourage:
if_random_less_than 50, AI_HPAware_ConsiderTarget
score -2
-
AI_HPAware_ConsiderTarget:
if_hp_more_than AI_TARGET, 70, AI_HPAware_TargetHasHighHP
if_hp_more_than AI_TARGET, 30, AI_HPAware_TargetHasMediumHP
@@ -3146,7 +2946,6 @@ AI_HPAware_TargetHasMediumHP:
AI_HPAware_TargetTryToDiscourage:
if_random_less_than 50, AI_HPAware_End
score -2
-
AI_HPAware_End:
end
@@ -3368,15 +3167,18 @@ AI_HPAware_DiscouragedEffectsWhenTargetLowHP: @ 82DE2B1
.byte EFFECT_DRAGON_DANCE
.byte -1
-AI_Unknown:
+@ Given the AI_TryOnAlly at the beginning it's possible that this was the start of a more
+@ comprehensive double battle AI script
+AI_TrySunnyDayStart:
if_target_is_ally AI_TryOnAlly
- if_not_effect EFFECT_SUNNY_DAY, AI_Unknown_End
- if_equal 0, AI_Unknown_End
+ if_not_effect EFFECT_SUNNY_DAY, AI_TrySunnyDayStart_End
+.ifndef BUGFIX @ funcResult has not been set in this script yet, below call is nonsense
+ if_equal FALSE, AI_TrySunnyDayStart_End
+.endif
is_first_turn_for AI_USER
- if_equal 0, AI_Unknown_End
+ if_equal FALSE, AI_TrySunnyDayStart_End
score +5
-
-AI_Unknown_End: @ 82DE308
+AI_TrySunnyDayStart_End: @ 82DE308
end
AI_Roaming:
@@ -3388,7 +3190,6 @@ AI_Roaming:
if_equal ABILITY_LEVITATE, AI_Roaming_Flee
get_ability AI_TARGET
if_equal ABILITY_ARENA_TRAP, AI_Roaming_End
-
AI_Roaming_Flee: @ 82DE335
flee
diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s
index d1c9bc78b..e7aad6a93 100644
--- a/data/battle_anim_scripts.s
+++ b/data/battle_anim_scripts.s
@@ -1656,12 +1656,12 @@ Explosion1:
Move_DEFENSE_CURL:
loadspritegfx ANIM_TAG_ECLIPSING_ORB
loopsewithpan SE_M_TRI_ATTACK, SOUND_PAN_ATTACKER, 18, 3
- createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, ANIM_ATTACKER, 0
+ createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_ATTACKER, 0
createvisualtask AnimTask_DefenseCurlDeformMon, 5
waitforvisualfinish
createsprite gEclipsingOrbSpriteTemplate, ANIM_ATTACKER, 2, 0, 6, 0, 1
waitforvisualfinish
- createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, ANIM_ATTACKER, 1
+ createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_ATTACKER, 1
waitforvisualfinish
end
@@ -7254,7 +7254,7 @@ Move_IRON_TAIL:
createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1
playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET
waitforvisualfinish
- createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, ANIM_ATTACKER, 1
+ createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_ATTACKER, 1
clearmonbg ANIM_TARGET
blendoff
waitforvisualfinish
@@ -7274,7 +7274,7 @@ Move_POISON_TAIL:
createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1
playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET
waitforvisualfinish
- createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, ANIM_ATTACKER, 1
+ createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_ATTACKER, 1
clearmonbg ANIM_TARGET
blendoff
call PoisonBubblesEffect
@@ -7551,7 +7551,7 @@ Move_DISABLE:
playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER
createsprite gSpinningSparkleSpriteTemplate, ANIM_ATTACKER, 13, 24, -16
waitforvisualfinish
- createvisualtask AnimTask_GrowAndGreyscale, 5
+ createvisualtask AnimTask_GrowAndGrayscale, 5
loopsewithpan SE_M_BIND, SOUND_PAN_TARGET, 15, 4
waitforvisualfinish
delay 1
@@ -7946,16 +7946,16 @@ Move_PERISH_SONG:
panse_1B SE_M_PERISH_SONG, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, +2, 0
delay 80
createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 3, 0, 16, RGB_BLACK
- createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, 4, 0
- createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, 5, 0
- createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, 6, 0
- createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, 7, 0
+ createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, 4, 0
+ createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, 5, 0
+ createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, 6, 0
+ createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, 7, 0
delay 100
createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 3, 16, 0, RGB_BLACK
- createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, 4, 1
- createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, 5, 1
- createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, 6, 1
- createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, 7, 1
+ createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, 4, 1
+ createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, 5, 1
+ createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, 6, 1
+ createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, 7, 1
waitforvisualfinish
end
@@ -9573,7 +9573,7 @@ Move_DOOM_DESIRE:
createvisualtask GetIsDoomDesireHitTurn, 2
delay 1
monbg ANIM_ATK_PARTNER
- createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, ANIM_TARGET, FALSE
+ createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_TARGET, FALSE
createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 0, 4, RGB_BLACK
waitforvisualfinish
setalpha 8, 8
@@ -9581,7 +9581,7 @@ Move_DOOM_DESIRE:
createvisualtask AnimTask_ScaleMonAndRestore, 5, -4, -4, 15, ANIM_ATTACKER, 1
waitforvisualfinish
delay 20
- createvisualtask AnimTask_SetGreyscaleOrOriginalPal, 5, ANIM_TARGET, TRUE
+ createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_TARGET, TRUE
createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 4, 0, RGB_BLACK
waitforvisualfinish
clearmonbg ANIM_ATK_PARTNER
diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s
index 045db19c5..1577765cd 100644
--- a/data/battle_scripts_1.s
+++ b/data/battle_scripts_1.s
@@ -17,243 +17,221 @@
.align 2
gBattleScriptsForMoveEffects:: @ 82D86A8
- .4byte BattleScript_EffectHit
- .4byte BattleScript_EffectSleep
- .4byte BattleScript_EffectPoisonHit
- .4byte BattleScript_EffectAbsorb
- .4byte BattleScript_EffectBurnHit
- .4byte BattleScript_EffectFreezeHit
- .4byte BattleScript_EffectParalyzeHit
- .4byte BattleScript_EffectExplosion
- .4byte BattleScript_EffectDreamEater
- .4byte BattleScript_EffectMirrorMove
- .4byte BattleScript_EffectAttackUp
- .4byte BattleScript_EffectDefenseUp
- .4byte BattleScript_EffectSpeedUp
- .4byte BattleScript_EffectSpecialAttackUp
- .4byte BattleScript_EffectSpecialDefenseUp
- .4byte BattleScript_EffectAccuracyUp
- .4byte BattleScript_EffectEvasionUp
- .4byte BattleScript_EffectAlwaysHit
- .4byte BattleScript_EffectAttackDown
- .4byte BattleScript_EffectDefenseDown
- .4byte BattleScript_EffectSpeedDown
- .4byte BattleScript_EffectSpecialAttackDown
- .4byte BattleScript_EffectSpecialDefenseDown
- .4byte BattleScript_EffectAccuracyDown
- .4byte BattleScript_EffectEvasionDown
- .4byte BattleScript_EffectHaze
- .4byte BattleScript_EffectBide
- .4byte BattleScript_EffectRampage
- .4byte BattleScript_EffectRoar
- .4byte BattleScript_EffectMultiHit
- .4byte BattleScript_EffectConversion
- .4byte BattleScript_EffectFlinchHit
- .4byte BattleScript_EffectRestoreHp
- .4byte BattleScript_EffectToxic
- .4byte BattleScript_EffectPayDay
- .4byte BattleScript_EffectLightScreen
- .4byte BattleScript_EffectTriAttack
- .4byte BattleScript_EffectRest
- .4byte BattleScript_EffectOHKO
- .4byte BattleScript_EffectRazorWind
- .4byte BattleScript_EffectSuperFang
- .4byte BattleScript_EffectDragonRage
- .4byte BattleScript_EffectTrap
- .4byte BattleScript_EffectHighCritical
- .4byte BattleScript_EffectDoubleHit
- .4byte BattleScript_EffectRecoilIfMiss
- .4byte BattleScript_EffectMist
- .4byte BattleScript_EffectFocusEnergy
- .4byte BattleScript_EffectRecoil
- .4byte BattleScript_EffectConfuse
- .4byte BattleScript_EffectAttackUp2
- .4byte BattleScript_EffectDefenseUp2
- .4byte BattleScript_EffectSpeedUp2
- .4byte BattleScript_EffectSpecialAttackUp2
- .4byte BattleScript_EffectSpecialDefenseUp2
- .4byte BattleScript_EffectAccuracyUp2
- .4byte BattleScript_EffectEvasionUp2
- .4byte BattleScript_EffectTransform
- .4byte BattleScript_EffectAttackDown2
- .4byte BattleScript_EffectDefenseDown2
- .4byte BattleScript_EffectSpeedDown2
- .4byte BattleScript_EffectSpecialAttackDown2
- .4byte BattleScript_EffectSpecialDefenseDown2
- .4byte BattleScript_EffectAccuracyDown2
- .4byte BattleScript_EffectEvasionDown2
- .4byte BattleScript_EffectReflect
- .4byte BattleScript_EffectPoison
- .4byte BattleScript_EffectParalyze
- .4byte BattleScript_EffectAttackDownHit
- .4byte BattleScript_EffectDefenseDownHit
- .4byte BattleScript_EffectSpeedDownHit
- .4byte BattleScript_EffectSpecialAttackDownHit
- .4byte BattleScript_EffectSpecialDefenseDownHit
- .4byte BattleScript_EffectAccuracyDownHit
- .4byte BattleScript_EffectEvasionDownHit
- .4byte BattleScript_EffectSkyAttack
- .4byte BattleScript_EffectConfuseHit
- .4byte BattleScript_EffectTwineedle
- .4byte BattleScript_EffectVitalThrow
- .4byte BattleScript_EffectSubstitute
- .4byte BattleScript_EffectRecharge
- .4byte BattleScript_EffectRage
- .4byte BattleScript_EffectMimic
- .4byte BattleScript_EffectMetronome
- .4byte BattleScript_EffectLeechSeed
- .4byte BattleScript_EffectSplash
- .4byte BattleScript_EffectDisable
- .4byte BattleScript_EffectLevelDamage
- .4byte BattleScript_EffectPsywave
- .4byte BattleScript_EffectCounter
- .4byte BattleScript_EffectEncore
- .4byte BattleScript_EffectPainSplit
- .4byte BattleScript_EffectSnore
- .4byte BattleScript_EffectConversion2
- .4byte BattleScript_EffectLockOn
- .4byte BattleScript_EffectSketch
- .4byte BattleScript_EffectUnused60//Thaw
- .4byte BattleScript_EffectSleepTalk
- .4byte BattleScript_EffectDestinyBond
- .4byte BattleScript_EffectFlail
- .4byte BattleScript_EffectSpite
- .4byte BattleScript_EffectFalseSwipe
- .4byte BattleScript_EffectHealBell
- .4byte BattleScript_EffectQuickAttack
- .4byte BattleScript_EffectTripleKick
- .4byte BattleScript_EffectThief
- .4byte BattleScript_EffectMeanLook
- .4byte BattleScript_EffectNightmare
- .4byte BattleScript_EffectMinimize
- .4byte BattleScript_EffectCurse
- .4byte BattleScript_EffectUnused6e
- .4byte BattleScript_EffectProtect
- .4byte BattleScript_EffectSpikes
- .4byte BattleScript_EffectForesight
- .4byte BattleScript_EffectPerishSong
- .4byte BattleScript_EffectSandstorm
- .4byte BattleScript_EffectEndure
- .4byte BattleScript_EffectRollout
- .4byte BattleScript_EffectSwagger
- .4byte BattleScript_EffectFuryCutter
- .4byte BattleScript_EffectAttract
- .4byte BattleScript_EffectReturn
- .4byte BattleScript_EffectPresent
- .4byte BattleScript_EffectFrustration
- .4byte BattleScript_EffectSafeguard
- .4byte BattleScript_EffectThawHit
- .4byte BattleScript_EffectMagnitude
- .4byte BattleScript_EffectBatonPass
- .4byte BattleScript_EffectPursuit
- .4byte BattleScript_EffectRapidSpin
- .4byte BattleScript_EffectSonicboom
- .4byte BattleScript_EffectUnused83
- .4byte BattleScript_EffectMorningSun
- .4byte BattleScript_EffectSynthesis
- .4byte BattleScript_EffectMoonlight
- .4byte BattleScript_EffectHiddenPower
- .4byte BattleScript_EffectRainDance
- .4byte BattleScript_EffectSunnyDay
- .4byte BattleScript_EffectDefenseUpHit
- .4byte BattleScript_EffectAttackUpHit
- .4byte BattleScript_EffectAllStatsUpHit
- .4byte BattleScript_EffectUnused8d
- .4byte BattleScript_EffectBellyDrum
- .4byte BattleScript_EffectPsychUp
- .4byte BattleScript_EffectMirrorCoat
- .4byte BattleScript_EffectSkullBash
- .4byte BattleScript_EffectTwister
- .4byte BattleScript_EffectEarthquake
- .4byte BattleScript_EffectFutureSight
- .4byte BattleScript_EffectGust
- .4byte BattleScript_EffectStomp
- .4byte BattleScript_EffectSolarbeam
- .4byte BattleScript_EffectThunder
- .4byte BattleScript_EffectTeleport
- .4byte BattleScript_EffectBeatUp
- .4byte BattleScript_EffectSemiInvulnerable
- .4byte BattleScript_EffectDefenseCurl
- .4byte BattleScript_EffectSoftboiled
- .4byte BattleScript_EffectFakeOut
- .4byte BattleScript_EffectUproar
- .4byte BattleScript_EffectStockpile
- .4byte BattleScript_EffectSpitUp
- .4byte BattleScript_EffectSwallow
- .4byte BattleScript_EffectUnusedA3
- .4byte BattleScript_EffectHail
- .4byte BattleScript_EffectTorment
- .4byte BattleScript_EffectFlatter
- .4byte BattleScript_EffectWillOWisp
- .4byte BattleScript_EffectMemento
- .4byte BattleScript_EffectFacade
- .4byte BattleScript_EffectFocusPunch
- .4byte BattleScript_EffectSmellingsalt
- .4byte BattleScript_EffectFollowMe
- .4byte BattleScript_EffectNaturePower
- .4byte BattleScript_EffectCharge
- .4byte BattleScript_EffectTaunt
- .4byte BattleScript_EffectHelpingHand
- .4byte BattleScript_EffectTrick
- .4byte BattleScript_EffectRolePlay
- .4byte BattleScript_EffectWish
- .4byte BattleScript_EffectAssist
- .4byte BattleScript_EffectIngrain
- .4byte BattleScript_EffectSuperpower
- .4byte BattleScript_EffectMagicCoat
- .4byte BattleScript_EffectRecycle
- .4byte BattleScript_EffectRevenge
- .4byte BattleScript_EffectBrickBreak
- .4byte BattleScript_EffectYawn
- .4byte BattleScript_EffectKnockOff
- .4byte BattleScript_EffectEndeavor
- .4byte BattleScript_EffectEruption
- .4byte BattleScript_EffectSkillSwap
- .4byte BattleScript_EffectImprison
- .4byte BattleScript_EffectRefresh
- .4byte BattleScript_EffectGrudge
- .4byte BattleScript_EffectSnatch
- .4byte BattleScript_EffectLowKick
- .4byte BattleScript_EffectSecretPower
- .4byte BattleScript_EffectDoubleEdge
- .4byte BattleScript_EffectTeeterDance
- .4byte BattleScript_EffectBlazeKick
- .4byte BattleScript_EffectMudSport
- .4byte BattleScript_EffectPoisonFang
- .4byte BattleScript_EffectWeatherBall
- .4byte BattleScript_EffectOverheat
- .4byte BattleScript_EffectTickle
- .4byte BattleScript_EffectCosmicPower
- .4byte BattleScript_EffectSkyUppercut
- .4byte BattleScript_EffectBulkUp
- .4byte BattleScript_EffectPoisonTail
- .4byte BattleScript_EffectWaterSport
- .4byte BattleScript_EffectCalmMind
- .4byte BattleScript_EffectDragonDance
- .4byte BattleScript_EffectCamouflage
-
-BattleScript_EffectSpeedUp::
-BattleScript_EffectSpecialDefenseUp::
-BattleScript_EffectAccuracyUp::
-BattleScript_EffectAlwaysHit::
-BattleScript_EffectSpecialAttackDown::
-BattleScript_EffectSpecialDefenseDown::
-BattleScript_EffectHighCritical::
-BattleScript_EffectAccuracyUp2::
-BattleScript_EffectEvasionUp2::
-BattleScript_EffectSpecialAttackDown2::
-BattleScript_EffectAccuracyDown2::
-BattleScript_EffectEvasionDown2::
-BattleScript_EffectEvasionDownHit::
-BattleScript_EffectVitalThrow::
-BattleScript_EffectUnused60::
-BattleScript_EffectFalseSwipe::
-BattleScript_EffectQuickAttack::
-BattleScript_EffectUnused6e::
-BattleScript_EffectPursuit::
-BattleScript_EffectUnused83::
-BattleScript_EffectUnused8d::
-BattleScript_EffectUnusedA3::
+ .4byte BattleScript_EffectHit @ EFFECT_HIT
+ .4byte BattleScript_EffectSleep @ EFFECT_SLEEP
+ .4byte BattleScript_EffectPoisonHit @ EFFECT_POISON_HIT
+ .4byte BattleScript_EffectAbsorb @ EFFECT_ABSORB
+ .4byte BattleScript_EffectBurnHit @ EFFECT_BURN_HIT
+ .4byte BattleScript_EffectFreezeHit @ EFFECT_FREEZE_HIT
+ .4byte BattleScript_EffectParalyzeHit @ EFFECT_PARALYZE_HIT
+ .4byte BattleScript_EffectExplosion @ EFFECT_EXPLOSION
+ .4byte BattleScript_EffectDreamEater @ EFFECT_DREAM_EATER
+ .4byte BattleScript_EffectMirrorMove @ EFFECT_MIRROR_MOVE
+ .4byte BattleScript_EffectAttackUp @ EFFECT_ATTACK_UP
+ .4byte BattleScript_EffectDefenseUp @ EFFECT_DEFENSE_UP
+ .4byte BattleScript_EffectHit @ EFFECT_SPEED_UP
+ .4byte BattleScript_EffectSpecialAttackUp @ EFFECT_SPECIAL_ATTACK_UP
+ .4byte BattleScript_EffectHit @ EFFECT_SPECIAL_DEFENSE_UP
+ .4byte BattleScript_EffectHit @ EFFECT_ACCURACY_UP
+ .4byte BattleScript_EffectEvasionUp @ EFFECT_EVASION_UP
+ .4byte BattleScript_EffectHit @ EFFECT_ALWAYS_HIT
+ .4byte BattleScript_EffectAttackDown @ EFFECT_ATTACK_DOWN
+ .4byte BattleScript_EffectDefenseDown @ EFFECT_DEFENSE_DOWN
+ .4byte BattleScript_EffectSpeedDown @ EFFECT_SPEED_DOWN
+ .4byte BattleScript_EffectHit @ EFFECT_SPECIAL_ATTACK_DOWN
+ .4byte BattleScript_EffectHit @ EFFECT_SPECIAL_DEFENSE_DOWN
+ .4byte BattleScript_EffectAccuracyDown @ EFFECT_ACCURACY_DOWN
+ .4byte BattleScript_EffectEvasionDown @ EFFECT_EVASION_DOWN
+ .4byte BattleScript_EffectHaze @ EFFECT_HAZE
+ .4byte BattleScript_EffectBide @ EFFECT_BIDE
+ .4byte BattleScript_EffectRampage @ EFFECT_RAMPAGE
+ .4byte BattleScript_EffectRoar @ EFFECT_ROAR
+ .4byte BattleScript_EffectMultiHit @ EFFECT_MULTI_HIT
+ .4byte BattleScript_EffectConversion @ EFFECT_CONVERSION
+ .4byte BattleScript_EffectFlinchHit @ EFFECT_FLINCH_HIT
+ .4byte BattleScript_EffectRestoreHp @ EFFECT_RESTORE_HP
+ .4byte BattleScript_EffectToxic @ EFFECT_TOXIC
+ .4byte BattleScript_EffectPayDay @ EFFECT_PAY_DAY
+ .4byte BattleScript_EffectLightScreen @ EFFECT_LIGHT_SCREEN
+ .4byte BattleScript_EffectTriAttack @ EFFECT_TRI_ATTACK
+ .4byte BattleScript_EffectRest @ EFFECT_REST
+ .4byte BattleScript_EffectOHKO @ EFFECT_OHKO
+ .4byte BattleScript_EffectRazorWind @ EFFECT_RAZOR_WIND
+ .4byte BattleScript_EffectSuperFang @ EFFECT_SUPER_FANG
+ .4byte BattleScript_EffectDragonRage @ EFFECT_DRAGON_RAGE
+ .4byte BattleScript_EffectTrap @ EFFECT_TRAP
+ .4byte BattleScript_EffectHit @ EFFECT_HIGH_CRITICAL
+ .4byte BattleScript_EffectDoubleHit @ EFFECT_DOUBLE_HIT
+ .4byte BattleScript_EffectRecoilIfMiss @ EFFECT_RECOIL_IF_MISS
+ .4byte BattleScript_EffectMist @ EFFECT_MIST
+ .4byte BattleScript_EffectFocusEnergy @ EFFECT_FOCUS_ENERGY
+ .4byte BattleScript_EffectRecoil @ EFFECT_RECOIL
+ .4byte BattleScript_EffectConfuse @ EFFECT_CONFUSE
+ .4byte BattleScript_EffectAttackUp2 @ EFFECT_ATTACK_UP_2
+ .4byte BattleScript_EffectDefenseUp2 @ EFFECT_DEFENSE_UP_2
+ .4byte BattleScript_EffectSpeedUp2 @ EFFECT_SPEED_UP_2
+ .4byte BattleScript_EffectSpecialAttackUp2 @ EFFECT_SPECIAL_ATTACK_UP_2
+ .4byte BattleScript_EffectSpecialDefenseUp2 @ EFFECT_SPECIAL_DEFENSE_UP_2
+ .4byte BattleScript_EffectHit @ EFFECT_ACCURACY_UP_2
+ .4byte BattleScript_EffectHit @ EFFECT_EVASION_UP_2
+ .4byte BattleScript_EffectTransform @ EFFECT_TRANSFORM
+ .4byte BattleScript_EffectAttackDown2 @ EFFECT_ATTACK_DOWN_2
+ .4byte BattleScript_EffectDefenseDown2 @ EFFECT_DEFENSE_DOWN_2
+ .4byte BattleScript_EffectSpeedDown2 @ EFFECT_SPEED_DOWN_2
+ .4byte BattleScript_EffectHit @ EFFECT_SPECIAL_ATTACK_DOWN_2
+ .4byte BattleScript_EffectSpecialDefenseDown2 @ EFFECT_SPECIAL_DEFENSE_DOWN_2
+ .4byte BattleScript_EffectHit @ EFFECT_ACCURACY_DOWN_2
+ .4byte BattleScript_EffectHit @ EFFECT_EVASION_DOWN_2
+ .4byte BattleScript_EffectReflect @ EFFECT_REFLECT
+ .4byte BattleScript_EffectPoison @ EFFECT_POISON
+ .4byte BattleScript_EffectParalyze @ EFFECT_PARALYZE
+ .4byte BattleScript_EffectAttackDownHit @ EFFECT_ATTACK_DOWN_HIT
+ .4byte BattleScript_EffectDefenseDownHit @ EFFECT_DEFENSE_DOWN_HIT
+ .4byte BattleScript_EffectSpeedDownHit @ EFFECT_SPEED_DOWN_HIT
+ .4byte BattleScript_EffectSpecialAttackDownHit @ EFFECT_SPECIAL_ATTACK_DOWN_HIT
+ .4byte BattleScript_EffectSpecialDefenseDownHit @ EFFECT_SPECIAL_DEFENSE_DOWN_HIT
+ .4byte BattleScript_EffectAccuracyDownHit @ EFFECT_ACCURACY_DOWN_HIT
+ .4byte BattleScript_EffectHit @ EFFECT_EVASION_DOWN_HIT
+ .4byte BattleScript_EffectSkyAttack @ EFFECT_SKY_ATTACK
+ .4byte BattleScript_EffectConfuseHit @ EFFECT_CONFUSE_HIT
+ .4byte BattleScript_EffectTwineedle @ EFFECT_TWINEEDLE
+ .4byte BattleScript_EffectHit @ EFFECT_VITAL_THROW
+ .4byte BattleScript_EffectSubstitute @ EFFECT_SUBSTITUTE
+ .4byte BattleScript_EffectRecharge @ EFFECT_RECHARGE
+ .4byte BattleScript_EffectRage @ EFFECT_RAGE
+ .4byte BattleScript_EffectMimic @ EFFECT_MIMIC
+ .4byte BattleScript_EffectMetronome @ EFFECT_METRONOME
+ .4byte BattleScript_EffectLeechSeed @ EFFECT_LEECH_SEED
+ .4byte BattleScript_EffectSplash @ EFFECT_SPLASH
+ .4byte BattleScript_EffectDisable @ EFFECT_DISABLE
+ .4byte BattleScript_EffectLevelDamage @ EFFECT_LEVEL_DAMAGE
+ .4byte BattleScript_EffectPsywave @ EFFECT_PSYWAVE
+ .4byte BattleScript_EffectCounter @ EFFECT_COUNTER
+ .4byte BattleScript_EffectEncore @ EFFECT_ENCORE
+ .4byte BattleScript_EffectPainSplit @ EFFECT_PAIN_SPLIT
+ .4byte BattleScript_EffectSnore @ EFFECT_SNORE
+ .4byte BattleScript_EffectConversion2 @ EFFECT_CONVERSION_2
+ .4byte BattleScript_EffectLockOn @ EFFECT_LOCK_ON
+ .4byte BattleScript_EffectSketch @ EFFECT_SKETCH
+ .4byte BattleScript_EffectHit @ EFFECT_UNUSED_60
+ .4byte BattleScript_EffectSleepTalk @ EFFECT_SLEEP_TALK
+ .4byte BattleScript_EffectDestinyBond @ EFFECT_DESTINY_BOND
+ .4byte BattleScript_EffectFlail @ EFFECT_FLAIL
+ .4byte BattleScript_EffectSpite @ EFFECT_SPITE
+ .4byte BattleScript_EffectHit @ EFFECT_FALSE_SWIPE
+ .4byte BattleScript_EffectHealBell @ EFFECT_HEAL_BELL
+ .4byte BattleScript_EffectHit @ EFFECT_QUICK_ATTACK
+ .4byte BattleScript_EffectTripleKick @ EFFECT_TRIPLE_KICK
+ .4byte BattleScript_EffectThief @ EFFECT_THIEF
+ .4byte BattleScript_EffectMeanLook @ EFFECT_MEAN_LOOK
+ .4byte BattleScript_EffectNightmare @ EFFECT_NIGHTMARE
+ .4byte BattleScript_EffectMinimize @ EFFECT_MINIMIZE
+ .4byte BattleScript_EffectCurse @ EFFECT_CURSE
+ .4byte BattleScript_EffectHit @ EFFECT_UNUSED_6E
+ .4byte BattleScript_EffectProtect @ EFFECT_PROTECT
+ .4byte BattleScript_EffectSpikes @ EFFECT_SPIKES
+ .4byte BattleScript_EffectForesight @ EFFECT_FORESIGHT
+ .4byte BattleScript_EffectPerishSong @ EFFECT_PERISH_SONG
+ .4byte BattleScript_EffectSandstorm @ EFFECT_SANDSTORM
+ .4byte BattleScript_EffectEndure @ EFFECT_ENDURE
+ .4byte BattleScript_EffectRollout @ EFFECT_ROLLOUT
+ .4byte BattleScript_EffectSwagger @ EFFECT_SWAGGER
+ .4byte BattleScript_EffectFuryCutter @ EFFECT_FURY_CUTTER
+ .4byte BattleScript_EffectAttract @ EFFECT_ATTRACT
+ .4byte BattleScript_EffectReturn @ EFFECT_RETURN
+ .4byte BattleScript_EffectPresent @ EFFECT_PRESENT
+ .4byte BattleScript_EffectFrustration @ EFFECT_FRUSTRATION
+ .4byte BattleScript_EffectSafeguard @ EFFECT_SAFEGUARD
+ .4byte BattleScript_EffectThawHit @ EFFECT_THAW_HIT
+ .4byte BattleScript_EffectMagnitude @ EFFECT_MAGNITUDE
+ .4byte BattleScript_EffectBatonPass @ EFFECT_BATON_PASS
+ .4byte BattleScript_EffectHit @ EFFECT_PURSUIT
+ .4byte BattleScript_EffectRapidSpin @ EFFECT_RAPID_SPIN
+ .4byte BattleScript_EffectSonicboom @ EFFECT_SONICBOOM
+ .4byte BattleScript_EffectHit @ EFFECT_UNUSED_83
+ .4byte BattleScript_EffectMorningSun @ EFFECT_MORNING_SUN
+ .4byte BattleScript_EffectSynthesis @ EFFECT_SYNTHESIS
+ .4byte BattleScript_EffectMoonlight @ EFFECT_MOONLIGHT
+ .4byte BattleScript_EffectHiddenPower @ EFFECT_HIDDEN_POWER
+ .4byte BattleScript_EffectRainDance @ EFFECT_RAIN_DANCE
+ .4byte BattleScript_EffectSunnyDay @ EFFECT_SUNNY_DAY
+ .4byte BattleScript_EffectDefenseUpHit @ EFFECT_DEFENSE_UP_HIT
+ .4byte BattleScript_EffectAttackUpHit @ EFFECT_ATTACK_UP_HIT
+ .4byte BattleScript_EffectAllStatsUpHit @ EFFECT_ALL_STATS_UP_HIT
+ .4byte BattleScript_EffectHit @ EFFECT_UNUSED_8D
+ .4byte BattleScript_EffectBellyDrum @ EFFECT_BELLY_DRUM
+ .4byte BattleScript_EffectPsychUp @ EFFECT_PSYCH_UP
+ .4byte BattleScript_EffectMirrorCoat @ EFFECT_MIRROR_COAT
+ .4byte BattleScript_EffectSkullBash @ EFFECT_SKULL_BASH
+ .4byte BattleScript_EffectTwister @ EFFECT_TWISTER
+ .4byte BattleScript_EffectEarthquake @ EFFECT_EARTHQUAKE
+ .4byte BattleScript_EffectFutureSight @ EFFECT_FUTURE_SIGHT
+ .4byte BattleScript_EffectGust @ EFFECT_GUST
+ .4byte BattleScript_EffectStomp @ EFFECT_FLINCH_MINIMIZE_HIT
+ .4byte BattleScript_EffectSolarbeam @ EFFECT_SOLARBEAM
+ .4byte BattleScript_EffectThunder @ EFFECT_THUNDER
+ .4byte BattleScript_EffectTeleport @ EFFECT_TELEPORT
+ .4byte BattleScript_EffectBeatUp @ EFFECT_BEAT_UP
+ .4byte BattleScript_EffectSemiInvulnerable @ EFFECT_SEMI_INVULNERABLE
+ .4byte BattleScript_EffectDefenseCurl @ EFFECT_DEFENSE_CURL
+ .4byte BattleScript_EffectSoftboiled @ EFFECT_SOFTBOILED
+ .4byte BattleScript_EffectFakeOut @ EFFECT_FAKE_OUT
+ .4byte BattleScript_EffectUproar @ EFFECT_UPROAR
+ .4byte BattleScript_EffectStockpile @ EFFECT_STOCKPILE
+ .4byte BattleScript_EffectSpitUp @ EFFECT_SPIT_UP
+ .4byte BattleScript_EffectSwallow @ EFFECT_SWALLOW
+ .4byte BattleScript_EffectHit @ EFFECT_UNUSED_A3
+ .4byte BattleScript_EffectHail @ EFFECT_HAIL
+ .4byte BattleScript_EffectTorment @ EFFECT_TORMENT
+ .4byte BattleScript_EffectFlatter @ EFFECT_FLATTER
+ .4byte BattleScript_EffectWillOWisp @ EFFECT_WILL_O_WISP
+ .4byte BattleScript_EffectMemento @ EFFECT_MEMENTO
+ .4byte BattleScript_EffectFacade @ EFFECT_FACADE
+ .4byte BattleScript_EffectFocusPunch @ EFFECT_FOCUS_PUNCH
+ .4byte BattleScript_EffectSmellingsalt @ EFFECT_SMELLINGSALT
+ .4byte BattleScript_EffectFollowMe @ EFFECT_FOLLOW_ME
+ .4byte BattleScript_EffectNaturePower @ EFFECT_NATURE_POWER
+ .4byte BattleScript_EffectCharge @ EFFECT_CHARGE
+ .4byte BattleScript_EffectTaunt @ EFFECT_TAUNT
+ .4byte BattleScript_EffectHelpingHand @ EFFECT_HELPING_HAND
+ .4byte BattleScript_EffectTrick @ EFFECT_TRICK
+ .4byte BattleScript_EffectRolePlay @ EFFECT_ROLE_PLAY
+ .4byte BattleScript_EffectWish @ EFFECT_WISH
+ .4byte BattleScript_EffectAssist @ EFFECT_ASSIST
+ .4byte BattleScript_EffectIngrain @ EFFECT_INGRAIN
+ .4byte BattleScript_EffectSuperpower @ EFFECT_SUPERPOWER
+ .4byte BattleScript_EffectMagicCoat @ EFFECT_MAGIC_COAT
+ .4byte BattleScript_EffectRecycle @ EFFECT_RECYCLE
+ .4byte BattleScript_EffectRevenge @ EFFECT_REVENGE
+ .4byte BattleScript_EffectBrickBreak @ EFFECT_BRICK_BREAK
+ .4byte BattleScript_EffectYawn @ EFFECT_YAWN
+ .4byte BattleScript_EffectKnockOff @ EFFECT_KNOCK_OFF
+ .4byte BattleScript_EffectEndeavor @ EFFECT_ENDEAVOR
+ .4byte BattleScript_EffectEruption @ EFFECT_ERUPTION
+ .4byte BattleScript_EffectSkillSwap @ EFFECT_SKILL_SWAP
+ .4byte BattleScript_EffectImprison @ EFFECT_IMPRISON
+ .4byte BattleScript_EffectRefresh @ EFFECT_REFRESH
+ .4byte BattleScript_EffectGrudge @ EFFECT_GRUDGE
+ .4byte BattleScript_EffectSnatch @ EFFECT_SNATCH
+ .4byte BattleScript_EffectLowKick @ EFFECT_LOW_KICK
+ .4byte BattleScript_EffectSecretPower @ EFFECT_SECRET_POWER
+ .4byte BattleScript_EffectDoubleEdge @ EFFECT_DOUBLE_EDGE
+ .4byte BattleScript_EffectTeeterDance @ EFFECT_TEETER_DANCE
+ .4byte BattleScript_EffectBurnHit @ EFFECT_BLAZE_KICK
+ .4byte BattleScript_EffectMudSport @ EFFECT_MUD_SPORT
+ .4byte BattleScript_EffectPoisonFang @ EFFECT_POISON_FANG
+ .4byte BattleScript_EffectWeatherBall @ EFFECT_WEATHER_BALL
+ .4byte BattleScript_EffectOverheat @ EFFECT_OVERHEAT
+ .4byte BattleScript_EffectTickle @ EFFECT_TICKLE
+ .4byte BattleScript_EffectCosmicPower @ EFFECT_COSMIC_POWER
+ .4byte BattleScript_EffectSkyUppercut @ EFFECT_SKY_UPPERCUT
+ .4byte BattleScript_EffectBulkUp @ EFFECT_BULK_UP
+ .4byte BattleScript_EffectPoisonHit @ EFFECT_POISON_TAIL
+ .4byte BattleScript_EffectWaterSport @ EFFECT_WATER_SPORT
+ .4byte BattleScript_EffectCalmMind @ EFFECT_CALM_MIND
+ .4byte BattleScript_EffectDragonDance @ EFFECT_DRAGON_DANCE
+ .4byte BattleScript_EffectCamouflage @ EFFECT_CAMOUFLAGE
+
BattleScript_EffectHit::
jumpifnotmove MOVE_SURF, BattleScript_HitFromAtkCanceler
jumpifnostatus3 BS_TARGET, STATUS3_UNDERWATER, BattleScript_HitFromAtkCanceler
@@ -338,7 +316,6 @@ BattleScript_CantMakeAsleep::
goto BattleScript_MoveEnd
BattleScript_EffectPoisonHit::
-BattleScript_EffectPoisonTail::
setmoveeffect MOVE_EFFECT_POISON
goto BattleScript_EffectHit
@@ -382,7 +359,6 @@ BattleScript_AbsorbTryFainting::
goto BattleScript_MoveEnd
BattleScript_EffectBurnHit::
-BattleScript_EffectBlazeKick::
setmoveeffect MOVE_EFFECT_BURN
goto BattleScript_EffectHit
@@ -1120,7 +1096,7 @@ BattleScript_SubstituteAnim::
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
BattleScript_SubstituteString::
- printfromtable gSubsituteUsedStringIds
+ printfromtable gSubstituteUsedStringIds
waitmessage B_WAIT_TIME_LONG
goto BattleScript_MoveEnd
BattleScript_AlreadyHasSubstitute::
diff --git a/data/event_scripts.s b/data/event_scripts.s
index 8039be687..432f1294d 100644
--- a/data/event_scripts.s
+++ b/data/event_scripts.s
@@ -736,7 +736,7 @@ EventScript_RegionMap:: @ 827208F
Common_EventScript_PlayBrineysBoatMusic:: @ 82720A0
setflag FLAG_DONT_TRANSITION_MUSIC
- playbgm MUS_SAILING, 0
+ playbgm MUS_SAILING, FALSE
return
Common_EventScript_StopBrineysBoatMusic:: @ 82720A8
diff --git a/data/maps/BattleFrontier_BattlePyramidFloor/scripts.inc b/data/maps/BattleFrontier_BattlePyramidFloor/scripts.inc
index 4f378c4e5..e63e27e4e 100644
--- a/data/maps/BattleFrontier_BattlePyramidFloor/scripts.inc
+++ b/data/maps/BattleFrontier_BattlePyramidFloor/scripts.inc
@@ -33,7 +33,7 @@ BattleFrontier_BattlePyramidFloor_EventScript_ShowMapName:: @ 8252A8F
end
BattleFrontier_BattlePyramidFloor_EventScript_PlayPyramidMusic:: @ 8252A98
- playbgm MUS_B_PYRAMID, 0
+ playbgm MUS_B_PYRAMID, FALSE
setvar VAR_TEMP_E, 1
end
diff --git a/data/maps/BattleFrontier_BattlePyramidTop/scripts.inc b/data/maps/BattleFrontier_BattlePyramidTop/scripts.inc
index 076fae158..568424083 100644
--- a/data/maps/BattleFrontier_BattlePyramidTop/scripts.inc
+++ b/data/maps/BattleFrontier_BattlePyramidTop/scripts.inc
@@ -53,7 +53,7 @@ BattleFrontier_BattlePyramidTop_OnFrame: @ 825516E
.2byte 0
BattleFrontier_BattlePyramidTop_EventScript_PlayPyramidMusic:: @ 8255180
- playbgm MUS_B_PYRAMID_TOP, 0
+ playbgm MUS_B_PYRAMID_TOP, FALSE
setvar VAR_TEMP_E, 1
end
@@ -136,7 +136,7 @@ BattleFrontier_BattlePyramidTop_EventScript_BrandonHeardSilverSpeech:: @ 82552D0
BattleFrontier_BattlePyramidTop_EventScript_BattleBrandonSilver:: @ 82552DA
msgbox BattleFrontier_BattlePyramidTop_Text_BringCourageToOurBattle, MSGBOX_DEFAULT
call BattleFrontier_BattlePyramidTop_EventScript_DoBrandonBattle
- playbgm MUS_B_PYRAMID_TOP, 0
+ playbgm MUS_B_PYRAMID_TOP, FALSE
compare VAR_RESULT, 1
goto_if_eq BattleFrontier_BattlePyramidTop_EventScript_DefeatedBrandonSilver
goto BattleFrontier_BattlePyramid_EventScript_WarpToLobbyLost
@@ -176,7 +176,7 @@ BattleFrontier_BattlePyramidTop_EventScript_BrandonHeardGoldSpeech:: @ 8255388
BattleFrontier_BattlePyramidTop_EventScript_BattleBrandonGold:: @ 8255392
msgbox BattleFrontier_BattlePyramidTop_Text_EverythingYouHave, MSGBOX_DEFAULT
call BattleFrontier_BattlePyramidTop_EventScript_DoBrandonBattle
- playbgm MUS_B_PYRAMID_TOP, 0
+ playbgm MUS_B_PYRAMID_TOP, FALSE
compare VAR_RESULT, 1
goto_if_eq BattleFrontier_BattlePyramidTop_EventScript_DefeatedBrandonGold
goto BattleFrontier_BattlePyramid_EventScript_WarpToLobbyLost
diff --git a/data/maps/BirthIsland_Exterior/scripts.inc b/data/maps/BirthIsland_Exterior/scripts.inc
index 3509e0326..58a74f8c4 100644
--- a/data/maps/BirthIsland_Exterior/scripts.inc
+++ b/data/maps/BirthIsland_Exterior/scripts.inc
@@ -73,7 +73,7 @@ BirthIsland_Exterior_EventScript_Deoxys:: @ 8267FC1
setfieldeffectargument 1, MAP_NUM(BIRTH_ISLAND_EXTERIOR)
setfieldeffectargument 2, MAP_GROUP(BIRTH_ISLAND_EXTERIOR)
dofieldeffect FLDEFF_DESTROY_DEOXYS_ROCK
- playbgm MUS_RG_ENCOUNTER_DEOXYS, 0
+ playbgm MUS_RG_ENCOUNTER_DEOXYS, FALSE
waitfieldeffect FLDEFF_DESTROY_DEOXYS_ROCK
addobject LOCALID_DEOXYS
applymovement LOCALID_DEOXYS, BirthIsland_Exterior_Movement_DeoxysApproach
diff --git a/data/maps/EverGrandeCity_ChampionsRoom/scripts.inc b/data/maps/EverGrandeCity_ChampionsRoom/scripts.inc
index d41c10d0a..7b75c8752 100644
--- a/data/maps/EverGrandeCity_ChampionsRoom/scripts.inc
+++ b/data/maps/EverGrandeCity_ChampionsRoom/scripts.inc
@@ -42,7 +42,7 @@ EverGrandeCity_ChampionsRoom_Movement_PlayerApproachWallace: @ 8228A42
step_end
EverGrandeCity_ChampionsRoom_EventScript_Wallace:: @ 8228A45
- playbgm MUS_ENCOUNTER_CHAMPION, 0
+ playbgm MUS_ENCOUNTER_CHAMPION, FALSE
msgbox EverGrandeCity_ChampionsRoom_Text_IntroSpeech, MSGBOX_DEFAULT
trainerbattle_no_intro TRAINER_WALLACE, EverGrandeCity_ChampionsRoom_Text_Defeat
goto EverGrandeCity_ChampionsRoom_EventScript_Defeated
@@ -71,11 +71,11 @@ EverGrandeCity_ChampionsRoom_EventScript_Defeated:: @ 8228A61
end
EverGrandeCity_ChampionsRoom_EventScript_PlayMayMusic:: @ 8228ABC
- playbgm MUS_ENCOUNTER_MAY, 0
+ playbgm MUS_ENCOUNTER_MAY, FALSE
return
EverGrandeCity_ChampionsRoom_EventScript_PlayBrendanMusic:: @ 8228AC1
- playbgm MUS_ENCOUNTER_BRENDAN, 0
+ playbgm MUS_ENCOUNTER_BRENDAN, FALSE
return
EverGrandeCity_ChampionsRoom_EventScript_MayAdvice:: @ 8228AC6
diff --git a/data/maps/EverGrandeCity_DrakesRoom/scripts.inc b/data/maps/EverGrandeCity_DrakesRoom/scripts.inc
index feb65d149..38762277f 100644
--- a/data/maps/EverGrandeCity_DrakesRoom/scripts.inc
+++ b/data/maps/EverGrandeCity_DrakesRoom/scripts.inc
@@ -42,7 +42,7 @@ EverGrandeCity_DrakesRoom_EventScript_Drake:: @ 82286F3
lock
faceplayer
goto_if_set FLAG_DEFEATED_ELITE_4_DRAKE, EverGrandeCity_DrakesRoom_EventScript_PostBattleSpeech
- playbgm MUS_ENCOUNTER_ELITE_FOUR, 0
+ playbgm MUS_ENCOUNTER_ELITE_FOUR, FALSE
msgbox EverGrandeCity_DrakesRoom_Text_IntroSpeech, MSGBOX_DEFAULT
trainerbattle_no_intro TRAINER_DRAKE, EverGrandeCity_DrakesRoom_Text_Defeat
goto EverGrandeCity_DrakesRoom_EventScript_Defeated
diff --git a/data/maps/EverGrandeCity_GlaciasRoom/scripts.inc b/data/maps/EverGrandeCity_GlaciasRoom/scripts.inc
index ff04a752a..3529b746c 100644
--- a/data/maps/EverGrandeCity_GlaciasRoom/scripts.inc
+++ b/data/maps/EverGrandeCity_GlaciasRoom/scripts.inc
@@ -41,7 +41,7 @@ EverGrandeCity_GlaciasRoom_EventScript_Glacia:: @ 8228469
lock
faceplayer
goto_if_set FLAG_DEFEATED_ELITE_4_GLACIA, EverGrandeCity_GlaciasRoom_EventScript_PostBattleSpeech
- playbgm MUS_ENCOUNTER_ELITE_FOUR, 0
+ playbgm MUS_ENCOUNTER_ELITE_FOUR, FALSE
msgbox EverGrandeCity_GlaciasRoom_Text_IntroSpeech, MSGBOX_DEFAULT
trainerbattle_no_intro TRAINER_GLACIA, EverGrandeCity_GlaciasRoom_Text_Defeat
goto EverGrandeCity_GlaciasRoom_EventScript_Defeated
diff --git a/data/maps/EverGrandeCity_PhoebesRoom/scripts.inc b/data/maps/EverGrandeCity_PhoebesRoom/scripts.inc
index e98bf4eb3..c922ffe7a 100644
--- a/data/maps/EverGrandeCity_PhoebesRoom/scripts.inc
+++ b/data/maps/EverGrandeCity_PhoebesRoom/scripts.inc
@@ -41,7 +41,7 @@ EverGrandeCity_PhoebesRoom_EventScript_Phoebe:: @ 82281CB
lock
faceplayer
goto_if_set FLAG_DEFEATED_ELITE_4_PHOEBE, EverGrandeCity_PhoebesRoom_EventScript_PostBattleSpeech
- playbgm MUS_ENCOUNTER_ELITE_FOUR, 0
+ playbgm MUS_ENCOUNTER_ELITE_FOUR, FALSE
msgbox EverGrandeCity_PhoebesRoom_Text_IntroSpeech, MSGBOX_DEFAULT
trainerbattle_no_intro TRAINER_PHOEBE, EverGrandeCity_PhoebesRoom_Text_Defeat
goto EverGrandeCity_PhoebesRoom_EventScript_Defeated
diff --git a/data/maps/EverGrandeCity_SidneysRoom/scripts.inc b/data/maps/EverGrandeCity_SidneysRoom/scripts.inc
index 717651b26..4cd8f262e 100644
--- a/data/maps/EverGrandeCity_SidneysRoom/scripts.inc
+++ b/data/maps/EverGrandeCity_SidneysRoom/scripts.inc
@@ -47,7 +47,7 @@ EverGrandeCity_SidneysRoom_EventScript_Sidney:: @ 8227F64
lock
faceplayer
goto_if_set FLAG_DEFEATED_ELITE_4_SIDNEY, EverGrandeCity_SidneysRoom_EventScript_PostBattleSpeech
- playbgm MUS_ENCOUNTER_ELITE_FOUR, 0
+ playbgm MUS_ENCOUNTER_ELITE_FOUR, FALSE
msgbox EverGrandeCity_SidneysRoom_Text_IntroSpeech, MSGBOX_DEFAULT
trainerbattle_no_intro TRAINER_SIDNEY, EverGrandeCity_SidneysRoom_Text_Defeat
goto EverGrandeCity_SidneysRoom_EventScript_Defeated
diff --git a/data/maps/LavaridgeTown/scripts.inc b/data/maps/LavaridgeTown/scripts.inc
index 1f9fe421d..59275c526 100644
--- a/data/maps/LavaridgeTown/scripts.inc
+++ b/data/maps/LavaridgeTown/scripts.inc
@@ -105,11 +105,11 @@ LavaridgeTown_EventScript_RivalExit:: @ 81EA5FF
end
LavaridgeTown_EventScript_PlayMayMusic:: @ 81EA630
- playbgm MUS_ENCOUNTER_MAY, 1
+ playbgm MUS_ENCOUNTER_MAY, TRUE
return
LavaridgeTown_EventScript_PlayBrendanMusic:: @ 81EA635
- playbgm MUS_ENCOUNTER_BRENDAN, 1
+ playbgm MUS_ENCOUNTER_BRENDAN, TRUE
return
LavaridgeTown_EventScript_RivalNoticePlayer:: @ 81EA63A
diff --git a/data/maps/LilycoveCity/scripts.inc b/data/maps/LilycoveCity/scripts.inc
index 0c94bce62..b5748ef60 100644
--- a/data/maps/LilycoveCity/scripts.inc
+++ b/data/maps/LilycoveCity/scripts.inc
@@ -160,7 +160,7 @@ LilycoveCity_EventScript_MotelSign:: @ 81E2D11
LilycoveCity_EventScript_MuseumSign:: @ 81E2D1A
lockall
- specialvar VAR_0x8004, CountPlayerContestPaintings
+ specialvar VAR_0x8004, CountPlayerMuseumPaintings
switch VAR_0x8004
case 0, LilycoveCity_EventScript_MuseumSignNoPaintings
msgbox LilycoveCity_Text_MuseumSignPlayersExhibit, MSGBOX_DEFAULT
@@ -241,7 +241,7 @@ LilycoveCity_EventScript_Rival:: @ 81E2DDE
end
LilycoveCity_EventScript_May:: @ 81E2DF8
- playbgm MUS_ENCOUNTER_MAY, 1
+ playbgm MUS_ENCOUNTER_MAY, TRUE
call_if_set FLAG_DECLINED_RIVAL_BATTLE_LILYCOVE, LilycoveCity_EventScript_MayAskToBattleAgain
call_if_unset FLAG_DECLINED_RIVAL_BATTLE_LILYCOVE, LilycoveCity_EventScript_MayAskToBattle
compare VAR_RESULT, NO
@@ -270,7 +270,7 @@ LilycoveCity_EventScript_DeclineMayBattle:: @ 81E2E5A
end
LilycoveCity_EventScript_Brendan:: @ 81E2E6B
- playbgm MUS_ENCOUNTER_BRENDAN, 1
+ playbgm MUS_ENCOUNTER_BRENDAN, TRUE
call_if_set FLAG_DECLINED_RIVAL_BATTLE_LILYCOVE, LilycoveCity_EventScript_BrendanAskToBattleAgain
call_if_unset FLAG_DECLINED_RIVAL_BATTLE_LILYCOVE, LilycoveCity_EventScript_BrendanAskToBattle
compare VAR_RESULT, NO
diff --git a/data/maps/LilycoveCity_ContestLobby/scripts.inc b/data/maps/LilycoveCity_ContestLobby/scripts.inc
index 300d4dfab..458585ea4 100644
--- a/data/maps/LilycoveCity_ContestLobby/scripts.inc
+++ b/data/maps/LilycoveCity_ContestLobby/scripts.inc
@@ -49,7 +49,7 @@ LilycoveCity_ContestLobby_EventScript_ContestArtist:: @ 821A264
msgbox LilycoveCity_ContestLobby_Text_YourPokemonSpurredMeToPaint, MSGBOX_DEFAULT
lockall
fadescreen FADE_TO_BLACK
- showcontestwinner CONTEST_WINNER_ARTIST
+ showcontestpainting CONTEST_WINNER_ARTIST
lockall
msgbox LilycoveCity_ContestLobby_Text_ShouldITakePaintingToMuseum, MSGBOX_YESNO
compare VAR_RESULT, YES
@@ -108,7 +108,7 @@ LilycoveCity_ContestLobby_EventScript_ReceivedArtistRibbon:: @ 821A314
return
LilycoveCity_ContestLobby_EventScript_UpdateMuseumPatrons:: @ 821A360
- specialvar VAR_0x8004, CountPlayerContestPaintings
+ specialvar VAR_0x8004, CountPlayerMuseumPaintings
switch VAR_0x8004
case 1, LilycoveCity_ContestLobby_EventScript_ShowPatron1
case 2, LilycoveCity_ContestLobby_EventScript_ShowPatron2
@@ -223,7 +223,7 @@ LilycoveCity_ContestLobby_EventScript_LinkContestArtist:: @ 821A436
msgbox LilycoveCity_ContestLobby_Text_YourPokemonSpurredMeToPaint, MSGBOX_DEFAULT
lockall
fadescreen FADE_TO_BLACK
- showcontestwinner CONTEST_WINNER_ARTIST
+ showcontestpainting CONTEST_WINNER_ARTIST
msgbox LilycoveCity_ContestLobby_Text_ShouldITakePaintingToMuseum, MSGBOX_YESNO
compare VAR_RESULT, YES
goto_if_eq LilycoveCity_ContestLobby_EventScript_TakePaintingToMuseumLink
@@ -511,42 +511,42 @@ LilycoveCity_ContestLobby_EventScript_NinjaBoy:: @ 821A735
LilycoveCity_ContestLobby_EventScript_ContestWinner1:: @ 821A73E
lockall
fadescreen FADE_TO_BLACK
- showcontestwinner CONTEST_WINNER_HALL_1
+ showcontestpainting CONTEST_WINNER_HALL_1
releaseall
end
LilycoveCity_ContestLobby_EventScript_ContestWinner2:: @ 821A745
lockall
fadescreen FADE_TO_BLACK
- showcontestwinner CONTEST_WINNER_HALL_2
+ showcontestpainting CONTEST_WINNER_HALL_2
releaseall
end
LilycoveCity_ContestLobby_EventScript_ContestWinner3:: @ 821A74C
lockall
fadescreen FADE_TO_BLACK
- showcontestwinner CONTEST_WINNER_HALL_3
+ showcontestpainting CONTEST_WINNER_HALL_3
releaseall
end
LilycoveCity_ContestLobby_EventScript_ContestWinner4:: @ 821A753
lockall
fadescreen FADE_TO_BLACK
- showcontestwinner CONTEST_WINNER_HALL_4
+ showcontestpainting CONTEST_WINNER_HALL_4
releaseall
end
LilycoveCity_ContestLobby_EventScript_ContestWinner5:: @ 821A75A
lockall
fadescreen FADE_TO_BLACK
- showcontestwinner CONTEST_WINNER_HALL_5
+ showcontestpainting CONTEST_WINNER_HALL_5
releaseall
end
LilycoveCity_ContestLobby_EventScript_ContestWinner6:: @ 821A761
lockall
fadescreen FADE_TO_BLACK
- showcontestwinner CONTEST_WINNER_HALL_6
+ showcontestpainting CONTEST_WINNER_HALL_6
releaseall
end
diff --git a/data/maps/LilycoveCity_LilycoveMuseum_2F/scripts.inc b/data/maps/LilycoveCity_LilycoveMuseum_2F/scripts.inc
index 4cebebd82..6f51d1cac 100644
--- a/data/maps/LilycoveCity_LilycoveMuseum_2F/scripts.inc
+++ b/data/maps/LilycoveCity_LilycoveMuseum_2F/scripts.inc
@@ -94,7 +94,7 @@ LilycoveCity_LilycoveMuseum_2F_Movement_FaceExhibitHall: @ 8219863
LilycoveCity_LilycoveMuseum_2F_EventScript_Curator:: @ 8219866
lockall
goto_if_set FLAG_RECEIVED_GLASS_ORNAMENT, LilycoveCity_LilycoveMuseum_2F_EventScript_ReceivedGlassOrnament
- specialvar VAR_0x8004, CountPlayerContestPaintings
+ specialvar VAR_0x8004, CountPlayerMuseumPaintings
switch VAR_0x8004
case 1, LilycoveCity_LilycoveMuseum_2F_EventScript_AddedPainting
case 2, LilycoveCity_LilycoveMuseum_2F_EventScript_AddedPainting
@@ -185,35 +185,35 @@ LilycoveCity_LilycoveMuseum_2F_EventScript_RichBoy:: @ 821999C
LilycoveCity_LilycoveMuseum_2F_EventScript_ShowCoolPainting:: @ 82199A5
msgbox LilycoveCity_LilycoveMuseum_2F_Text_ItsPaintingOfPokemon, MSGBOX_SIGN
fadescreen FADE_TO_BLACK
- showcontestwinner CONTEST_WINNER_MUSEUM_COOL
+ showcontestpainting CONTEST_WINNER_MUSEUM_COOL
releaseall
end
LilycoveCity_LilycoveMuseum_2F_EventScript_ShowBeautyPainting:: @ 82199B3
msgbox LilycoveCity_LilycoveMuseum_2F_Text_ItsPaintingOfPokemon, MSGBOX_SIGN
fadescreen FADE_TO_BLACK
- showcontestwinner CONTEST_WINNER_MUSEUM_BEAUTY
+ showcontestpainting CONTEST_WINNER_MUSEUM_BEAUTY
releaseall
end
LilycoveCity_LilycoveMuseum_2F_EventScript_ShowCutePainting:: @ 82199C1
msgbox LilycoveCity_LilycoveMuseum_2F_Text_ItsPaintingOfPokemon, MSGBOX_SIGN
fadescreen FADE_TO_BLACK
- showcontestwinner CONTEST_WINNER_MUSEUM_CUTE
+ showcontestpainting CONTEST_WINNER_MUSEUM_CUTE
releaseall
end
LilycoveCity_LilycoveMuseum_2F_EventScript_ShowSmartPainting:: @ 82199CF
msgbox LilycoveCity_LilycoveMuseum_2F_Text_ItsPaintingOfPokemon, MSGBOX_SIGN
fadescreen FADE_TO_BLACK
- showcontestwinner CONTEST_WINNER_MUSEUM_SMART
+ showcontestpainting CONTEST_WINNER_MUSEUM_SMART
releaseall
end
LilycoveCity_LilycoveMuseum_2F_EventScript_ShowToughPainting:: @ 82199DD
msgbox LilycoveCity_LilycoveMuseum_2F_Text_ItsPaintingOfPokemon, MSGBOX_SIGN
fadescreen FADE_TO_BLACK
- showcontestwinner CONTEST_WINNER_MUSEUM_TOUGH
+ showcontestpainting CONTEST_WINNER_MUSEUM_TOUGH
releaseall
end
diff --git a/data/maps/LilycoveCity_PokemonTrainerFanClub/scripts.inc b/data/maps/LilycoveCity_PokemonTrainerFanClub/scripts.inc
index 6ff869db3..86544d3e9 100644
--- a/data/maps/LilycoveCity_PokemonTrainerFanClub/scripts.inc
+++ b/data/maps/LilycoveCity_PokemonTrainerFanClub/scripts.inc
@@ -173,7 +173,7 @@ LilycoveCity_PokemonTrainerFanClub_EventScript_CountNotPlayersFan:: @ 821C9AE
return
LilycoveCity_PokemonTrainerFanClub_EventScript_TrySetUpTVShow:: @ 821C9B4
- special TrySetUpTrainerFanClubSpecial
+ special TryPutTrainerFanClubOnAir
return
LilycoveCity_PokemonTrainerFanClub_EventScript_MoveMember1ToFarTable:: @ 821C9B8
diff --git a/data/maps/LittlerootTown_BrendansHouse_1F/scripts.inc b/data/maps/LittlerootTown_BrendansHouse_1F/scripts.inc
index ee677fbff..4b5679ad9 100644
--- a/data/maps/LittlerootTown_BrendansHouse_1F/scripts.inc
+++ b/data/maps/LittlerootTown_BrendansHouse_1F/scripts.inc
@@ -158,7 +158,7 @@ LittlerootTown_BrendansHouse_1F_EventScript_MeetRival:: @ 81F78E2
waitmovement 0
compare VAR_0x8008, 1
call_if_ne LittlerootTown_BrendansHouse_1F_EventScript_PlayerFaceBrendan
- playbgm MUS_ENCOUNTER_BRENDAN, 1
+ playbgm MUS_ENCOUNTER_BRENDAN, TRUE
compare VAR_0x8008, 0
call_if_eq LittlerootTown_BrendansHouse_1F_EventScript_BrendanApproachPlayer0
compare VAR_0x8008, 1
diff --git a/data/maps/LittlerootTown_BrendansHouse_2F/scripts.inc b/data/maps/LittlerootTown_BrendansHouse_2F/scripts.inc
index ab6f55af5..6cfeea7e4 100644
--- a/data/maps/LittlerootTown_BrendansHouse_2F/scripts.inc
+++ b/data/maps/LittlerootTown_BrendansHouse_2F/scripts.inc
@@ -74,7 +74,7 @@ LittlerootTown_BrendansHouse_2F_EventScript_MeetBrendan:: @ 81F8497
applymovement LOCALID_RIVAL, Common_Movement_Delay48
waitmovement 0
delay 10
- playbgm MUS_ENCOUNTER_BRENDAN, 1
+ playbgm MUS_ENCOUNTER_BRENDAN, TRUE
compare VAR_FACING, DIR_NORTH
call_if_eq LittlerootTown_BrendansHouse_2F_EventScript_MeetBrendanNorth
compare VAR_FACING, DIR_SOUTH
diff --git a/data/maps/LittlerootTown_MaysHouse_1F/scripts.inc b/data/maps/LittlerootTown_MaysHouse_1F/scripts.inc
index 1e1bb0e11..f1df425b7 100644
--- a/data/maps/LittlerootTown_MaysHouse_1F/scripts.inc
+++ b/data/maps/LittlerootTown_MaysHouse_1F/scripts.inc
@@ -192,7 +192,7 @@ LittlerootTown_MaysHouse_1F_EventScript_MeetRival:: @ 81F8A8B
waitmovement 0
compare VAR_0x8008, 1
call_if_ne LittlerootTown_MaysHouse_1F_EventScript_PlayerFaceMay
- playbgm MUS_ENCOUNTER_MAY, 1
+ playbgm MUS_ENCOUNTER_MAY, TRUE
compare VAR_0x8008, 0
call_if_eq LittlerootTown_MaysHouse_1F_EventScript_MayApproachPlayer0
compare VAR_0x8008, 1
diff --git a/data/maps/LittlerootTown_MaysHouse_2F/scripts.inc b/data/maps/LittlerootTown_MaysHouse_2F/scripts.inc
index dd22ed670..a0583841c 100644
--- a/data/maps/LittlerootTown_MaysHouse_2F/scripts.inc
+++ b/data/maps/LittlerootTown_MaysHouse_2F/scripts.inc
@@ -74,7 +74,7 @@ LittlerootTown_MaysHouse_2F_EventScript_MeetMay:: @ 81F934A
applymovement LOCALID_RIVAL, Common_Movement_Delay48
waitmovement 0
delay 10
- playbgm MUS_ENCOUNTER_MAY, 1
+ playbgm MUS_ENCOUNTER_MAY, TRUE
compare VAR_FACING, DIR_NORTH
call_if_eq LittlerootTown_MaysHouse_2F_EventScript_MeetMayNorth
compare VAR_FACING, DIR_SOUTH
diff --git a/data/maps/MagmaHideout_2F_2R/map.json b/data/maps/MagmaHideout_2F_2R/map.json
index 4aa6896f6..968c07fb7 100644
--- a/data/maps/MagmaHideout_2F_2R/map.json
+++ b/data/maps/MagmaHideout_2F_2R/map.json
@@ -50,7 +50,7 @@
"movement_range_y": 1,
"trainer_type": "TRAINER_TYPE_NONE",
"trainer_sight_or_berry_tree_id": "0",
- "script": "MagmaHideout_2F_2R_EventScript_MaxElixir",
+ "script": "MagmaHideout_2F_2R_EventScript_ItemMaxElixir",
"flag": "FLAG_ITEM_MAGMA_HIDEOUT_2F_2R_MAX_ELIXIR"
},
{
diff --git a/data/maps/MagmaHideout_4F/map.json b/data/maps/MagmaHideout_4F/map.json
index 94cf295e0..67c11481f 100644
--- a/data/maps/MagmaHideout_4F/map.json
+++ b/data/maps/MagmaHideout_4F/map.json
@@ -115,7 +115,7 @@
"movement_range_y": 1,
"trainer_type": "TRAINER_TYPE_NONE",
"trainer_sight_or_berry_tree_id": "0",
- "script": "MagmaHideout_4F_EventScript_MaxRevive",
+ "script": "MagmaHideout_4F_EventScript_ItemMaxRevive",
"flag": "FLAG_ITEM_MAGMA_HIDEOUT_4F_MAX_REVIVE"
}
],
diff --git a/data/maps/MagmaHideout_4F/scripts.inc b/data/maps/MagmaHideout_4F/scripts.inc
index 50382f44e..199e3c1bc 100644
--- a/data/maps/MagmaHideout_4F/scripts.inc
+++ b/data/maps/MagmaHideout_4F/scripts.inc
@@ -11,7 +11,7 @@ MagmaHideout_4F_MapScripts:: @ 823A55F
MagmaHideout_4F_EventScript_Maxie:: @ 823A560
lockall
- playbgm MUS_ENCOUNTER_MAGMA, 0
+ playbgm MUS_ENCOUNTER_MAGMA, FALSE
msgbox MagmaHideout_4F_Text_MaxieAwakenGroudon, MSGBOX_DEFAULT
closemessage
delay 20
diff --git a/data/maps/MeteorFalls_1F_1R/scripts.inc b/data/maps/MeteorFalls_1F_1R/scripts.inc
index c942e230e..8202267b9 100644
--- a/data/maps/MeteorFalls_1F_1R/scripts.inc
+++ b/data/maps/MeteorFalls_1F_1R/scripts.inc
@@ -21,7 +21,7 @@ MeteorFalls_1F_1R_EventScript_OpenStevensCave:: @ 822BD3A
MeteorFalls_1F_1R_EventScript_MagmaStealsMeteoriteScene:: @ 822BD5F
lockall
- playbgm MUS_ENCOUNTER_MAGMA, 0
+ playbgm MUS_ENCOUNTER_MAGMA, FALSE
applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_FaceDown
waitmovement 0
delay 30
@@ -50,7 +50,7 @@ MeteorFalls_1F_1R_EventScript_MagmaStealsMeteoriteScene:: @ 822BD5F
addobject LOCALID_ARCHIE
addobject LOCALID_AQUA_GRUNT_1
addobject LOCALID_AQUA_GRUNT_2
- playbgm MUS_ENCOUNTER_AQUA, 0
+ playbgm MUS_ENCOUNTER_AQUA, FALSE
applymovement LOCALID_ARCHIE, MeteorFalls_1F_1R_Movement_ArchieArrive
applymovement LOCALID_AQUA_GRUNT_1, MeteorFalls_1F_1R_Movement_AquaGrunt1Arrive
applymovement LOCALID_AQUA_GRUNT_2, MeteorFalls_1F_1R_Movement_AquaGrunt2Arrive
diff --git a/data/maps/MtChimney/scripts.inc b/data/maps/MtChimney/scripts.inc
index c633d9313..061590e1a 100644
--- a/data/maps/MtChimney/scripts.inc
+++ b/data/maps/MtChimney/scripts.inc
@@ -40,7 +40,7 @@ MtChimney_EventScript_ArchieBusyFighting:: @ 822EE02
MtChimney_EventScript_Maxie:: @ 822EE0B
lockall
- playbgm MUS_ENCOUNTER_MAGMA, 0
+ playbgm MUS_ENCOUNTER_MAGMA, FALSE
msgbox MtChimney_Text_MeteoriteWillActivateVolcano, MSGBOX_DEFAULT
applymovement LOCALID_MAXIE, Common_Movement_FacePlayer
waitmovement 0
diff --git a/data/maps/MtPyre_Summit/scripts.inc b/data/maps/MtPyre_Summit/scripts.inc
index c2692ff20..e899c3471 100644
--- a/data/maps/MtPyre_Summit/scripts.inc
+++ b/data/maps/MtPyre_Summit/scripts.inc
@@ -39,7 +39,7 @@ MtPyre_Summit_EventScript_TeamAquaTrigger2:: @ 8232030
end
MtPyre_Summit_EventScript_TeamAquaExits:: @ 823203C
- playbgm MUS_ENCOUNTER_AQUA, 0
+ playbgm MUS_ENCOUNTER_AQUA, FALSE
applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_FaceUp
waitmovement 0
applymovement LOCALID_ARCHIE, Common_Movement_WalkInPlaceFastestDown
diff --git a/data/maps/OldaleTown/scripts.inc b/data/maps/OldaleTown/scripts.inc
index f99c65d2c..593215357 100644
--- a/data/maps/OldaleTown/scripts.inc
+++ b/data/maps/OldaleTown/scripts.inc
@@ -43,7 +43,7 @@ OldaleTown_EventScript_MartEmployee:: @ 81E8EFC
goto_if_set FLAG_RECEIVED_POTION_OLDALE, OldaleTown_EventScript_ExplainPotion
goto_if_set FLAG_TEMP_1, OldaleTown_EventScript_ExplainPotion
setflag FLAG_TEMP_1
- playbgm MUS_FOLLOW_ME, 0
+ playbgm MUS_FOLLOW_ME, FALSE
msgbox OldaleTown_Text_IWorkAtPokemonMart, MSGBOX_DEFAULT
closemessage
switch VAR_FACING
diff --git a/data/maps/PetalburgCity/scripts.inc b/data/maps/PetalburgCity/scripts.inc
index ab77e18e0..5114ea639 100644
--- a/data/maps/PetalburgCity/scripts.inc
+++ b/data/maps/PetalburgCity/scripts.inc
@@ -271,7 +271,7 @@ PetalburgCity_EventScript_ShowGymToPlayer3:: @ 81DC4BE
PetalburgCity_EventScript_ShowGymToPlayer:: @ 81DC4CA
applymovement LOCALID_GYM_BOY, Common_Movement_FacePlayer
waitmovement 0
- playbgm MUS_FOLLOW_ME, 0
+ playbgm MUS_FOLLOW_ME, FALSE
playse SE_PIN
applymovement LOCALID_GYM_BOY, Common_Movement_ExclamationMark
waitmovement 0
diff --git a/data/maps/PetalburgCity_Gym/scripts.inc b/data/maps/PetalburgCity_Gym/scripts.inc
index 2bdd5320f..b2f6b1061 100644
--- a/data/maps/PetalburgCity_Gym/scripts.inc
+++ b/data/maps/PetalburgCity_Gym/scripts.inc
@@ -203,7 +203,7 @@ PetalburgCity_Gym_EventScript_BeginWallyTutorial:: @ 8204AAC
msgbox PetalburgCity_Gym_Text_WouldYouReallyComeWithMe, MSGBOX_DEFAULT
closemessage
setflag FLAG_DONT_TRANSITION_MUSIC
- playbgm MUS_FOLLOW_ME, 0
+ playbgm MUS_FOLLOW_ME, FALSE
compare VAR_0x8008, 0
call_if_eq PetalburgCity_Gym_EventScript_ExitGymWithWallySouth
compare VAR_0x8008, 1
@@ -487,7 +487,7 @@ PetalburgCity_Gym_EventScript_WallysDadArrives:: @ 8204F13
msgbox PetalburgCity_Gym_Text_LetMeBorrowPlayer, MSGBOX_DEFAULT
closemessage
setflag FLAG_DONT_TRANSITION_MUSIC
- playbgm MUS_FOLLOW_ME, 0
+ playbgm MUS_FOLLOW_ME, FALSE
compare VAR_0x8008, 1
call_if_eq PetalburgCity_Gym_EventScript_ExitGymWithWallysDadNorth
compare VAR_0x8008, 2
diff --git a/data/maps/PetalburgWoods/scripts.inc b/data/maps/PetalburgWoods/scripts.inc
index dbdb66b0b..1f1b2edcb 100644
--- a/data/maps/PetalburgWoods/scripts.inc
+++ b/data/maps/PetalburgWoods/scripts.inc
@@ -11,7 +11,7 @@ PetalburgWoods_EventScript_DevonResearcherLeft:: @ 822DFD7
waitmovement 0
msgbox PetalburgWoods_Text_HaveYouSeenShroomish, MSGBOX_DEFAULT
closemessage
- playbgm MUS_ENCOUNTER_AQUA, 0
+ playbgm MUS_ENCOUNTER_AQUA, FALSE
applymovement LOCALID_GRUNT, PetalburgWoods_Movement_AquaEntrance
waitmovement 0
msgbox PetalburgWoods_Text_IWasGoingToAmbushYou, MSGBOX_DEFAULT
@@ -48,7 +48,7 @@ PetalburgWoods_EventScript_DevonResearcherRight:: @ 822E079
waitmovement 0
msgbox PetalburgWoods_Text_HaveYouSeenShroomish, MSGBOX_DEFAULT
closemessage
- playbgm MUS_ENCOUNTER_AQUA, 0
+ playbgm MUS_ENCOUNTER_AQUA, FALSE
applymovement LOCALID_GRUNT, PetalburgWoods_Movement_AquaEntrance
waitmovement 0
msgbox PetalburgWoods_Text_IWasGoingToAmbushYou, MSGBOX_DEFAULT
diff --git a/data/maps/Route101/scripts.inc b/data/maps/Route101/scripts.inc
index 66ce4abc8..b93226147 100644
--- a/data/maps/Route101/scripts.inc
+++ b/data/maps/Route101/scripts.inc
@@ -21,7 +21,7 @@ Route101_EventScript_HideMapNamePopup:: @ 81EBCD5
Route101_EventScript_StartBirchRescue:: @ 81EBCDE
lockall
- playbgm MUS_HELP, 1
+ playbgm MUS_HELP, TRUE
msgbox Route101_Text_HelpMe, MSGBOX_DEFAULT
closemessage
setobjectxy LOCALID_BIRCH, 0, 15
diff --git a/data/maps/Route103/scripts.inc b/data/maps/Route103/scripts.inc
index 965b5ff5c..b096069e7 100644
--- a/data/maps/Route103/scripts.inc
+++ b/data/maps/Route103/scripts.inc
@@ -31,7 +31,7 @@ Route103_EventScript_Rival:: @ 81EC3C1
Route103_EventScript_RivalMay:: @ 81EC3DA
msgbox Route103_Text_MayRoute103Pokemon, MSGBOX_DEFAULT
closemessage
- playbgm MUS_ENCOUNTER_MAY, 1
+ playbgm MUS_ENCOUNTER_MAY, TRUE
applymovement LOCALID_RIVAL, Common_Movement_FacePlayer
waitmovement 0
applymovement LOCALID_RIVAL, Common_Movement_ExclamationMark
@@ -48,7 +48,7 @@ Route103_EventScript_RivalMay:: @ 81EC3DA
Route103_EventScript_RivalBrendan:: @ 81EC434
msgbox Route103_Text_BrendanRoute103Pokemon, MSGBOX_DEFAULT
closemessage
- playbgm MUS_ENCOUNTER_BRENDAN, 1
+ playbgm MUS_ENCOUNTER_BRENDAN, TRUE
applymovement LOCALID_RIVAL, Common_Movement_FacePlayer
waitmovement 0
applymovement LOCALID_RIVAL, Common_Movement_ExclamationMark
diff --git a/data/maps/Route104/scripts.inc b/data/maps/Route104/scripts.inc
index d1faca53a..cb840d9b3 100644
--- a/data/maps/Route104/scripts.inc
+++ b/data/maps/Route104/scripts.inc
@@ -84,11 +84,11 @@ Route104_EventScript_PlayRivalMusic:: @ 81ECD11
return
Route104_EventScript_PlayMayMusic:: @ 81ECD29
- playbgm MUS_ENCOUNTER_MAY, 1
+ playbgm MUS_ENCOUNTER_MAY, TRUE
return
Route104_EventScript_PlayBrendanMusic:: @ 81ECD2E
- playbgm MUS_ENCOUNTER_BRENDAN, 1
+ playbgm MUS_ENCOUNTER_BRENDAN, TRUE
return
Route104_EventScript_RivalEncounter:: @ 81ECD33
diff --git a/data/maps/Route110/scripts.inc b/data/maps/Route110/scripts.inc
index 50f3d1f48..f7be3fb9e 100644
--- a/data/maps/Route110/scripts.inc
+++ b/data/maps/Route110/scripts.inc
@@ -410,11 +410,11 @@ Route110_EventScript_RivalScene:: @ 81EF76E
end
Route110_EventScript_PlayMayMusic:: @ 81EF7E1
- playbgm MUS_ENCOUNTER_MAY, 1
+ playbgm MUS_ENCOUNTER_MAY, TRUE
return
Route110_EventScript_PlayBrendanMusic:: @ 81EF7E6
- playbgm MUS_ENCOUNTER_BRENDAN, 1
+ playbgm MUS_ENCOUNTER_BRENDAN, TRUE
return
Route110_EventScript_MayBattle:: @ 81EF7EB
diff --git a/data/maps/Route119/scripts.inc b/data/maps/Route119/scripts.inc
index 734934d17..37da701a0 100644
--- a/data/maps/Route119/scripts.inc
+++ b/data/maps/Route119/scripts.inc
@@ -74,11 +74,11 @@ Route119_EventScript_RivalEncounter:: @ 81F4488
end
Route119_EventScript_PlayMayMusic:: @ 81F4501
- playbgm MUS_ENCOUNTER_MAY, 1
+ playbgm MUS_ENCOUNTER_MAY, TRUE
return
Route119_EventScript_PlayBrendanMusic:: @ 81F4506
- playbgm MUS_ENCOUNTER_BRENDAN, 1
+ playbgm MUS_ENCOUNTER_BRENDAN, TRUE
return
Route119_EventScript_BattleMay:: @ 81F450B
diff --git a/data/maps/Route121/scripts.inc b/data/maps/Route121/scripts.inc
index fdc191ea8..6dc93cf6b 100644
--- a/data/maps/Route121/scripts.inc
+++ b/data/maps/Route121/scripts.inc
@@ -19,7 +19,7 @@ Route121_EventScript_SafariZoneSign:: @ 81F5E0F
Route121_EventScript_AquaGruntsMoveOut:: @ 81F5E18
lockall
- playbgm MUS_ENCOUNTER_AQUA, 0
+ playbgm MUS_ENCOUNTER_AQUA, FALSE
applymovement LOCALID_GRUNT_2, Common_Movement_WalkInPlaceRight
waitmovement 0
msgbox Route121_Text_OkayMoveOutToMtPyre, MSGBOX_DEFAULT
diff --git a/data/maps/RustboroCity/scripts.inc b/data/maps/RustboroCity/scripts.inc
index 7b1f4a3d8..05bd25247 100644
--- a/data/maps/RustboroCity/scripts.inc
+++ b/data/maps/RustboroCity/scripts.inc
@@ -294,7 +294,7 @@ RustboroCity_EventScript_StolenGoodsTrigger4:: @ 81E09B6
RustboroCity_EventScript_StolenGoodsScene:: @ 81E09CD
msgbox RustboroCity_Text_OutOfTheWay, MSGBOX_DEFAULT
closemessage
- playbgm MUS_ENCOUNTER_AQUA, 0
+ playbgm MUS_ENCOUNTER_AQUA, FALSE
addobject LOCALID_GRUNT
addobject LOCALID_DEVON_EMPLOYEE
applymovement LOCALID_GRUNT, RustboroCity_Movement_GruntEscape
@@ -706,11 +706,11 @@ RustboroCity_EventScript_PlayRivalMusic:: @ 81E0DD1
return
RustboroCity_EventScript_PlayMayMusic:: @ 81E0DE9
- playbgm MUS_ENCOUNTER_MAY, 1
+ playbgm MUS_ENCOUNTER_MAY, TRUE
return
RustboroCity_EventScript_PlayBrendanMusic:: @ 81E0DEE
- playbgm MUS_ENCOUNTER_BRENDAN, 1
+ playbgm MUS_ENCOUNTER_BRENDAN, TRUE
return
RustboroCity_EventScript_RivalTrigger0:: @ 81E0DF3
diff --git a/data/maps/RustboroCity_DevonCorp_3F/scripts.inc b/data/maps/RustboroCity_DevonCorp_3F/scripts.inc
index 34a31c692..9d4c69cd9 100644
--- a/data/maps/RustboroCity_DevonCorp_3F/scripts.inc
+++ b/data/maps/RustboroCity_DevonCorp_3F/scripts.inc
@@ -39,7 +39,7 @@ RustboroCity_DevonCorp_3F_EventScript_MeetPresident:: @ 821246E
waitmovement 0
msgbox RustboroCity_DevonCorp_3F_Text_WordWithPresidentComeWithMe, MSGBOX_DEFAULT
closemessage
- playbgm MUS_FOLLOW_ME, 0
+ playbgm MUS_FOLLOW_ME, FALSE
applymovement LOCALID_DEVON_EMPLOYEE, RustboroCity_DevonCorp_3F_Movement_LeadPlayerToPresident
applymovement OBJ_EVENT_ID_PLAYER, RustboroCity_DevonCorp_3F_Movement_PlayerFollowToPresident
waitmovement 0
diff --git a/data/maps/RusturfTunnel/scripts.inc b/data/maps/RusturfTunnel/scripts.inc
index 17a229ab5..75f5820e0 100644
--- a/data/maps/RusturfTunnel/scripts.inc
+++ b/data/maps/RusturfTunnel/scripts.inc
@@ -316,7 +316,7 @@ RusturfTunnel_EventScript_Peeko:: @ 822D0AF
RusturfTunnel_EventScript_Grunt:: @ 822D0C2
lock
faceplayer
- playbgm MUS_ENCOUNTER_AQUA, 0
+ playbgm MUS_ENCOUNTER_AQUA, FALSE
msgbox RusturfTunnel_Text_GruntIntro, MSGBOX_DEFAULT
trainerbattle_no_intro TRAINER_GRUNT_RUSTURF_TUNNEL, RusturfTunnel_Text_GruntDefeat
msgbox RusturfTunnel_Text_GruntTakePackage, MSGBOX_DEFAULT
diff --git a/data/maps/SeafloorCavern_Room9/scripts.inc b/data/maps/SeafloorCavern_Room9/scripts.inc
index 53386f33c..06ae0d6fe 100644
--- a/data/maps/SeafloorCavern_Room9/scripts.inc
+++ b/data/maps/SeafloorCavern_Room9/scripts.inc
@@ -18,7 +18,7 @@ SeafloorCavern_Room9_EventScript_ArchieAwakenKyogre:: @ 8234DC9
waitmovement 0
applymovement OBJ_EVENT_ID_PLAYER, SeafloorCavern_Room9_Movement_Delay32
waitmovement 0
- playbgm MUS_ENCOUNTER_AQUA, 0
+ playbgm MUS_ENCOUNTER_AQUA, FALSE
msgbox SeafloorCavern_Room9_Text_ArchieHoldItRightThere, MSGBOX_DEFAULT
closemessage
addobject VAR_0x8004
diff --git a/data/maps/SlateportCity/scripts.inc b/data/maps/SlateportCity/scripts.inc
index 983ce9796..ceb2e862a 100644
--- a/data/maps/SlateportCity/scripts.inc
+++ b/data/maps/SlateportCity/scripts.inc
@@ -603,7 +603,7 @@ SlateportCity_EventScript_CaptStern:: @ 81DD1F8
applymovement LOCALID_CAPT_STERN, Common_Movement_WalkInPlaceFastestUp
waitmovement 0
msgbox SlateportCity_Text_OhPlayerWeMadeDiscovery, MSGBOX_DEFAULT
- playbgm MUS_ENCOUNTER_AQUA, 0
+ playbgm MUS_ENCOUNTER_AQUA, FALSE
msgbox SlateportCity_Text_AquaWillAssumeControlOfSubmarine, MSGBOX_DEFAULT
applymovement LOCALID_COOK, Common_Movement_WalkInPlaceFastestLeft
applymovement LOCALID_FAT_MAN, Common_Movement_WalkInPlaceFastestLeft
diff --git a/data/maps/SlateportCity_OceanicMuseum_2F/scripts.inc b/data/maps/SlateportCity_OceanicMuseum_2F/scripts.inc
index bba75dbd1..782e702f6 100644
--- a/data/maps/SlateportCity_OceanicMuseum_2F/scripts.inc
+++ b/data/maps/SlateportCity_OceanicMuseum_2F/scripts.inc
@@ -11,7 +11,7 @@ SlateportCity_OceanicMuseum_2F_EventScript_CaptStern:: @ 820BB00
faceplayer
msgbox SlateportCity_OceanicMuseum_2F_Text_ThankYouForTheParts, MSGBOX_DEFAULT
closemessage
- playbgm MUS_ENCOUNTER_AQUA, 1
+ playbgm MUS_ENCOUNTER_AQUA, TRUE
addobject LOCALID_GRUNT_1
applymovement LOCALID_GRUNT_1, SlateportCity_OceanicMuseum_2F_Movement_FirstGruntEnter
waitmovement 0
diff --git a/data/maps/map_groups.json b/data/maps/map_groups.json
index 4268abbef..ebef431b3 100644
--- a/data/maps/map_groups.json
+++ b/data/maps/map_groups.json
@@ -1,41 +1,41 @@
{
"group_order": [
- "gMapGroup0",
- "gMapGroup1",
- "gMapGroup2",
- "gMapGroup3",
- "gMapGroup4",
- "gMapGroup5",
- "gMapGroup6",
- "gMapGroup7",
- "gMapGroup8",
- "gMapGroup9",
- "gMapGroup10",
- "gMapGroup11",
- "gMapGroup12",
- "gMapGroup13",
- "gMapGroup14",
- "gMapGroup15",
- "gMapGroup16",
- "gMapGroup17",
- "gMapGroup18",
- "gMapGroup19",
- "gMapGroup20",
- "gMapGroup21",
- "gMapGroup22",
- "gMapGroup23",
- "gMapGroup24",
- "gMapGroup25",
- "gMapGroup26",
- "gMapGroup27",
- "gMapGroup28",
- "gMapGroup29",
- "gMapGroup30",
- "gMapGroup31",
- "gMapGroup32",
- "gMapGroup33"
- ],
- "gMapGroup0": [
+ "gMapGroup_TownsAndRoutes",
+ "gMapGroup_IndoorLittleroot",
+ "gMapGroup_IndoorOldale",
+ "gMapGroup_IndoorDewford",
+ "gMapGroup_IndoorLavaridge",
+ "gMapGroup_IndoorFallarbor",
+ "gMapGroup_IndoorVerdanturf",
+ "gMapGroup_IndoorPacifidlog",
+ "gMapGroup_IndoorPetalburg",
+ "gMapGroup_IndoorSlateport",
+ "gMapGroup_IndoorMauville",
+ "gMapGroup_IndoorRustboro",
+ "gMapGroup_IndoorFortree",
+ "gMapGroup_IndoorLilycove",
+ "gMapGroup_IndoorMossdeep",
+ "gMapGroup_IndoorSootopolis",
+ "gMapGroup_IndoorEverGrande",
+ "gMapGroup_IndoorRoute104",
+ "gMapGroup_IndoorRoute111",
+ "gMapGroup_IndoorRoute112",
+ "gMapGroup_IndoorRoute114",
+ "gMapGroup_IndoorRoute116",
+ "gMapGroup_IndoorRoute117",
+ "gMapGroup_IndoorRoute121",
+ "gMapGroup_Dungeons",
+ "gMapGroup_IndoorDynamic",
+ "gMapGroup_SpecialArea",
+ "gMapGroup_IndoorRoute104Prototype",
+ "gMapGroup_IndoorRoute109",
+ "gMapGroup_IndoorRoute110",
+ "gMapGroup_IndoorRoute113",
+ "gMapGroup_IndoorRoute123",
+ "gMapGroup_IndoorRoute119",
+ "gMapGroup_IndoorRoute124"
+ ],
+ "gMapGroup_TownsAndRoutes": [
"PetalburgCity",
"SlateportCity",
"MauvilleCity",
@@ -94,21 +94,21 @@
"Underwater_Route105",
"Underwater_Route125"
],
- "gMapGroup1": [
+ "gMapGroup_IndoorLittleroot": [
"LittlerootTown_BrendansHouse_1F",
"LittlerootTown_BrendansHouse_2F",
"LittlerootTown_MaysHouse_1F",
"LittlerootTown_MaysHouse_2F",
"LittlerootTown_ProfessorBirchsLab"
],
- "gMapGroup2": [
+ "gMapGroup_IndoorOldale": [
"OldaleTown_House1",
"OldaleTown_House2",
"OldaleTown_PokemonCenter_1F",
"OldaleTown_PokemonCenter_2F",
"OldaleTown_Mart"
],
- "gMapGroup3": [
+ "gMapGroup_IndoorDewford": [
"DewfordTown_House1",
"DewfordTown_PokemonCenter_1F",
"DewfordTown_PokemonCenter_2F",
@@ -116,7 +116,7 @@
"DewfordTown_Hall",
"DewfordTown_House2"
],
- "gMapGroup4": [
+ "gMapGroup_IndoorLavaridge": [
"LavaridgeTown_HerbShop",
"LavaridgeTown_Gym_1F",
"LavaridgeTown_Gym_B1F",
@@ -125,7 +125,7 @@
"LavaridgeTown_PokemonCenter_1F",
"LavaridgeTown_PokemonCenter_2F"
],
- "gMapGroup5": [
+ "gMapGroup_IndoorFallarbor": [
"FallarborTown_Mart",
"FallarborTown_BattleTentLobby",
"FallarborTown_BattleTentCorridor",
@@ -135,7 +135,7 @@
"FallarborTown_CozmosHouse",
"FallarborTown_MoveRelearnersHouse"
],
- "gMapGroup6": [
+ "gMapGroup_IndoorVerdanturf": [
"VerdanturfTown_BattleTentLobby",
"VerdanturfTown_BattleTentCorridor",
"VerdanturfTown_BattleTentBattleRoom",
@@ -146,7 +146,7 @@
"VerdanturfTown_FriendshipRatersHouse",
"VerdanturfTown_House"
],
- "gMapGroup7": [
+ "gMapGroup_IndoorPacifidlog": [
"PacifidlogTown_PokemonCenter_1F",
"PacifidlogTown_PokemonCenter_2F",
"PacifidlogTown_House1",
@@ -155,7 +155,7 @@
"PacifidlogTown_House4",
"PacifidlogTown_House5"
],
- "gMapGroup8": [
+ "gMapGroup_IndoorPetalburg": [
"PetalburgCity_WallysHouse",
"PetalburgCity_Gym",
"PetalburgCity_House1",
@@ -164,7 +164,7 @@
"PetalburgCity_PokemonCenter_2F",
"PetalburgCity_Mart"
],
- "gMapGroup9": [
+ "gMapGroup_IndoorSlateport": [
"SlateportCity_SternsShipyard_1F",
"SlateportCity_SternsShipyard_2F",
"SlateportCity_BattleTentLobby",
@@ -180,7 +180,7 @@
"SlateportCity_PokemonCenter_2F",
"SlateportCity_Mart"
],
- "gMapGroup10": [
+ "gMapGroup_IndoorMauville": [
"MauvilleCity_Gym",
"MauvilleCity_BikeShop",
"MauvilleCity_House1",
@@ -190,7 +190,7 @@
"MauvilleCity_PokemonCenter_2F",
"MauvilleCity_Mart"
],
- "gMapGroup11": [
+ "gMapGroup_IndoorRustboro": [
"RustboroCity_DevonCorp_1F",
"RustboroCity_DevonCorp_2F",
"RustboroCity_DevonCorp_3F",
@@ -209,7 +209,7 @@
"RustboroCity_Flat2_3F",
"RustboroCity_House3"
],
- "gMapGroup12": [
+ "gMapGroup_IndoorFortree": [
"FortreeCity_House1",
"FortreeCity_Gym",
"FortreeCity_PokemonCenter_1F",
@@ -221,7 +221,7 @@
"FortreeCity_House5",
"FortreeCity_DecorationShop"
],
- "gMapGroup13": [
+ "gMapGroup_IndoorLilycove": [
"LilycoveCity_CoveLilyMotel_1F",
"LilycoveCity_CoveLilyMotel_2F",
"LilycoveCity_LilycoveMuseum_1F",
@@ -246,7 +246,7 @@
"LilycoveCity_DepartmentStoreRooftop",
"LilycoveCity_DepartmentStoreElevator"
],
- "gMapGroup14": [
+ "gMapGroup_IndoorMossdeep": [
"MossdeepCity_Gym",
"MossdeepCity_House1",
"MossdeepCity_House2",
@@ -261,7 +261,7 @@
"MossdeepCity_GameCorner_1F",
"MossdeepCity_GameCorner_B1F"
],
- "gMapGroup15": [
+ "gMapGroup_IndoorSootopolis": [
"SootopolisCity_Gym_1F",
"SootopolisCity_Gym_B1F",
"SootopolisCity_PokemonCenter_1F",
@@ -278,7 +278,7 @@
"SootopolisCity_MysteryEventsHouse_1F",
"SootopolisCity_MysteryEventsHouse_B1F"
],
- "gMapGroup16": [
+ "gMapGroup_IndoorEverGrande": [
"EverGrandeCity_SidneysRoom",
"EverGrandeCity_PhoebesRoom",
"EverGrandeCity_GlaciasRoom",
@@ -295,33 +295,33 @@
"EverGrandeCity_PokemonCenter_2F",
"EverGrandeCity_PokemonLeague_2F"
],
- "gMapGroup17": [
+ "gMapGroup_IndoorRoute104": [
"Route104_MrBrineysHouse",
"Route104_PrettyPetalFlowerShop"
],
- "gMapGroup18": [
+ "gMapGroup_IndoorRoute111": [
"Route111_WinstrateFamilysHouse",
"Route111_OldLadysRestStop"
],
- "gMapGroup19": [
+ "gMapGroup_IndoorRoute112": [
"Route112_CableCarStation",
"MtChimney_CableCarStation"
],
- "gMapGroup20": [
+ "gMapGroup_IndoorRoute114": [
"Route114_FossilManiacsHouse",
"Route114_FossilManiacsTunnel",
"Route114_LanettesHouse"
],
- "gMapGroup21": [
+ "gMapGroup_IndoorRoute116": [
"Route116_TunnelersRestHouse"
],
- "gMapGroup22": [
+ "gMapGroup_IndoorRoute117": [
"Route117_PokemonDayCare"
],
- "gMapGroup23": [
+ "gMapGroup_IndoorRoute121": [
"Route121_SafariZoneEntrance"
],
- "gMapGroup24": [
+ "gMapGroup_Dungeons": [
"MeteorFalls_1F_1R",
"MeteorFalls_1F_2R",
"MeteorFalls_B1F_1R",
@@ -431,7 +431,7 @@
"AlteringCave",
"MeteorFalls_StevensCave"
],
- "gMapGroup25": [
+ "gMapGroup_IndoorDynamic": [
"SecretBase_RedCave1",
"SecretBase_BrownCave1",
"SecretBase_BlueCave1",
@@ -494,7 +494,7 @@
"BattlePyramidSquare16",
"UnionRoom"
],
- "gMapGroup26": [
+ "gMapGroup_SpecialArea": [
"SafariZone_Northwest",
"SafariZone_North",
"SafariZone_Southwest",
@@ -585,14 +585,14 @@
"NavelRock_Bottom",
"TrainerHill_Elevator"
],
- "gMapGroup27": [
+ "gMapGroup_IndoorRoute104Prototype": [
"Route104_Prototype",
"Route104_PrototypePrettyPetalFlowerShop"
],
- "gMapGroup28": [
+ "gMapGroup_IndoorRoute109": [
"Route109_SeashoreHouse"
],
- "gMapGroup29": [
+ "gMapGroup_IndoorRoute110": [
"Route110_TrickHouseEntrance",
"Route110_TrickHouseEnd",
"Route110_TrickHouseCorridor",
@@ -607,18 +607,18 @@
"Route110_SeasideCyclingRoadNorthEntrance",
"Route110_SeasideCyclingRoadSouthEntrance"
],
- "gMapGroup30": [
+ "gMapGroup_IndoorRoute113": [
"Route113_GlassWorkshop"
],
- "gMapGroup31": [
+ "gMapGroup_IndoorRoute123": [
"Route123_BerryMastersHouse"
],
- "gMapGroup32": [
+ "gMapGroup_IndoorRoute119": [
"Route119_WeatherInstitute_1F",
"Route119_WeatherInstitute_2F",
"Route119_House"
],
- "gMapGroup33": [
+ "gMapGroup_IndoorRoute124": [
"Route124_DivingTreasureHuntersHouse"
],
"connections_include_order": [
diff --git a/data/script_cmd_table.inc b/data/script_cmd_table.inc
index a26ce6bf2..9e54ad52b 100644
--- a/data/script_cmd_table.inc
+++ b/data/script_cmd_table.inc
@@ -119,7 +119,7 @@ gScriptCmdTable:: @ 81DB67C
.4byte ScrCmd_drawboxtext @ 0x74
.4byte ScrCmd_showmonpic @ 0x75
.4byte ScrCmd_hidemonpic @ 0x76
- .4byte ScrCmd_showcontestwinner @ 0x77
+ .4byte ScrCmd_showcontestpainting @ 0x77
.4byte ScrCmd_braillemessage @ 0x78
.4byte ScrCmd_givemon @ 0x79
.4byte ScrCmd_giveegg @ 0x7a
diff --git a/data/scripts/contest_hall.inc b/data/scripts/contest_hall.inc
index 51be0027c..db43dfdd0 100644
--- a/data/scripts/contest_hall.inc
+++ b/data/scripts/contest_hall.inc
@@ -916,7 +916,7 @@ ContestHall_EventScript_ContestResults:: @ 827A8A5
setvar VAR_TEMP_9, 1
showcontestresults
setvar VAR_TEMP_9, 0
- playbgm MUS_CONTEST_WINNER, 0
+ playbgm MUS_CONTEST_WINNER, FALSE
return
ContestHall_EventScript_ThatsItForJudging:: @ 827A8FB
diff --git a/data/scripts/gabby_and_ty.inc b/data/scripts/gabby_and_ty.inc
index c7f576aba..60854a801 100644
--- a/data/scripts/gabby_and_ty.inc
+++ b/data/scripts/gabby_and_ty.inc
@@ -1,6 +1,6 @@
@ Gabby and Ty always move to the same spots for the first 5 battles
@ From the 6th battle onwards, they move randomly between locations 6-8
-@ Note: The local IDs of Gabby and Ty are hard-coded in GabbyAndTySetScriptVarsToObjectEventLocalIds
+@ Note: The local IDs of Gabby and Ty are hard-coded in GetGabbyAndTyLocalIds
GabbyAndTy_EventScript_UpdateLocation:: @ 828CCC7
cleartrainerflag TRAINER_GABBY_AND_TY_6
specialvar VAR_RESULT, GabbyAndTyGetBattleNum
@@ -198,7 +198,7 @@ GabbyAndTy_EventScript_TyBattle6:: @ 828CF36
GabbyAndTy_EventScript_FirstInterview:: @ 828CF56
special GabbyAndTyBeforeInterview
- special GabbyAndTySetScriptVarsToObjectEventLocalIds
+ special GetGabbyAndTyLocalIds
compare VAR_FACING, DIR_NORTH
call_if_eq GabbyAndTy_EventScript_FacePlayerNorth
compare VAR_FACING, DIR_SOUTH
@@ -229,7 +229,7 @@ GabbyAndTy_EventScript_FacePlayerEast:: @ 828CFB1
GabbyAndTy_EventScript_RequestInterview:: @ 828CFC3
special GabbyAndTyBeforeInterview
- special GabbyAndTySetScriptVarsToObjectEventLocalIds
+ special GetGabbyAndTyLocalIds
compare VAR_FACING, DIR_NORTH
call_if_eq GabbyAndTy_EventScript_FacePlayerNorth
compare VAR_FACING, DIR_SOUTH
diff --git a/data/scripts/item_ball_scripts.inc b/data/scripts/item_ball_scripts.inc
index 82633f77c..f9228134c 100644
--- a/data/scripts/item_ball_scripts.inc
+++ b/data/scripts/item_ball_scripts.inc
@@ -634,7 +634,7 @@ MagmaHideout_1F_EventScript_ItemRareCandy:: @ 82914DE
finditem ITEM_RARE_CANDY
end
-MagmaHideout_2F_2R_EventScript_MaxElixir:: @ 82914EB
+MagmaHideout_2F_2R_EventScript_ItemMaxElixir:: @ 82914EB
finditem ITEM_MAX_ELIXIR
end
@@ -650,7 +650,7 @@ MagmaHideout_3F_2R_EventScript_ItemPPMax:: @ 8291512
finditem ITEM_PP_MAX
end
-MagmaHideout_4F_EventScript_MaxRevive:: @ 829151F
+MagmaHideout_4F_EventScript_ItemMaxRevive:: @ 829151F
finditem ITEM_MAX_REVIVE
end
diff --git a/data/scripts/players_house.inc b/data/scripts/players_house.inc
index 03b8eaf99..427355332 100644
--- a/data/scripts/players_house.inc
+++ b/data/scripts/players_house.inc
@@ -159,7 +159,7 @@ PlayersHouse_1F_EventScript_PetalburgGymReportMale:: @ 829286D
call PlayersHouse_1F_EventScript_MomNoticeGymBroadcast
applymovement OBJ_EVENT_ID_PLAYER, PlayersHouse_1F_Movement_PlayerApproachTVForGymMale
waitmovement 0
- playbgm MUS_ENCOUNTER_INTERVIEWER, 0
+ playbgm MUS_ENCOUNTER_INTERVIEWER, FALSE
msgbox PlayersHouse_1F_Text_MaybeDadWillBeOn, MSGBOX_DEFAULT
closemessage
applymovement VAR_0x8005, PlayersHouse_1F_Movement_MomMakeRoomToSeeTVMale
@@ -184,7 +184,7 @@ PlayersHouse_1F_EventScript_PetalburgGymReportFemale:: @ 82928DC
call PlayersHouse_1F_EventScript_MomNoticeGymBroadcast
applymovement OBJ_EVENT_ID_PLAYER, PlayersHouse_1F_Movement_PlayerApproachTVForGymFemale
waitmovement 0
- playbgm MUS_ENCOUNTER_INTERVIEWER, 0
+ playbgm MUS_ENCOUNTER_INTERVIEWER, FALSE
msgbox PlayersHouse_1F_Text_MaybeDadWillBeOn, MSGBOX_DEFAULT
closemessage
applymovement VAR_0x8005, PlayersHouse_1F_Movement_MomMakeRoomToSeeTVFemale
diff --git a/data/scripts/tv.inc b/data/scripts/tv.inc
index a2d5473b1..1dfc1884b 100644
--- a/data/scripts/tv.inc
+++ b/data/scripts/tv.inc
@@ -2,14 +2,14 @@ EventScript_TV:: @ 827EE0B
lockall
incrementgamestat GAME_STAT_WATCHED_TV
special ResetTVShowState
- specialvar VAR_RESULT, CheckForBigMovieOrEmergencyNewsOnTV
- compare VAR_RESULT, 2
+ specialvar VAR_RESULT, CheckForPlayersHouseNews
+ compare VAR_RESULT, PLAYERS_HOUSE_TV_MOVIE
goto_if_eq EventScript_PlayersHouseMovie
- compare VAR_RESULT, 1
+ compare VAR_RESULT, PLAYERS_HOUSE_TV_LATI
goto_if_eq EventScript_PlayersHouseLatiNewsFlash
goto_if_unset FLAG_SYS_TV_START, EventScript_MomDadMightLikeThis1
goto_if_set FLAG_SYS_TV_WATCH, EventScript_MomDadMightLikeThis1
- specialvar VAR_RESULT, IsTVShowInSearchOfTrainersAiring
+ specialvar VAR_RESULT, IsGabbyAndTyShowOnTheAir
compare VAR_RESULT, TRUE
goto_if_eq EventScript_DoInSearchOfTrainers
goto EventScript_TryDoPokeNews
diff --git a/data/specials.inc b/data/specials.inc
index f672a7b87..eacc6bf5e 100644
--- a/data/specials.inc
+++ b/data/specials.inc
@@ -83,20 +83,20 @@ gSpecials:: @ 81DBA64
def_special IsLeadMonNicknamedOrNotEnglish
def_special SetContestCategoryStringVarForInterview
def_special GetNextActiveShowIfMassOutbreak
- def_special TV_IsScriptShowKindAlreadyInQueue
- def_special CheckForBigMovieOrEmergencyNewsOnTV
+ def_special IsTVShowAlreadyInQueue
+ def_special CheckForPlayersHouseNews
def_special GetMomOrDadStringForTVMessage
def_special ResetTVShowState
def_special GetContestWinnerId
def_special GetContestPlayerId
- def_special sub_80F8814
+ def_special GetNpcContestantLocalId
def_special BufferContestWinnerTrainerName
def_special BufferContestWinnerMonName
def_special BufferContestTrainerAndMonNames
def_special GetContestMonConditionRanking
def_special SetContestTrainerGfxIds
def_special TryEnterContestMon
- def_special sub_80F8970
+ def_special GetContestantNamesAtRank
def_special SetLinkContestPlayerGfx
def_special GetContestMonCondition
def_special HasMonWonThisContestBefore
@@ -147,9 +147,9 @@ gSpecials:: @ 81DBA64
def_special CountPartyAliveNonEggMons_IgnoreVar0x8004Slot
def_special ShouldReadyContestArtist
def_special SaveMuseumContestPainting
- def_special DoesContestCategoryHaveWinner
- def_special CountPlayerContestPaintings
- def_special ShowContestWinnerPainting
+ def_special DoesContestCategoryHaveMuseumPainting
+ def_special CountPlayerMuseumPaintings
+ def_special ShowContestPainting @ Unused, redundant with showcontestpainting command
def_special MauvilleGymSetDefaultBarriers
def_special MauvilleGymPressSwitch
def_special ShowFieldMessageStringVar4
@@ -187,10 +187,10 @@ gSpecials:: @ 81DBA64
def_special GabbyAndTyAfterInterview
def_special GabbyAndTyBeforeInterview
def_special DoTVShowInSearchOfTrainers
- def_special IsTVShowInSearchOfTrainersAiring
+ def_special IsGabbyAndTyShowOnTheAir
def_special GabbyAndTyGetLastQuote
def_special GabbyAndTyGetLastBattleTrivia
- def_special GabbyAndTySetScriptVarsToObjectEventLocalIds
+ def_special GetGabbyAndTyLocalIds
def_special GetBattleOutcome
def_special GetDaycareMonNicknames
def_special GetDaycareState
@@ -354,7 +354,7 @@ gSpecials:: @ 81DBA64
def_special SetChampionSaveWarp
def_special TryPutTreasureInvestigatorsOnAir
def_special TryPutLotteryWinnerReportOnAir
- def_special TrySetUpTrainerFanClubSpecial
+ def_special TryPutTrainerFanClubOnAir
def_special ShouldHideFanClubInterviewer
def_special ShowGlassWorkshopMenu
def_special PutFanClubSpecialOnTheAir
diff --git a/data/text/berry_descriptions.inc b/data/text/berry_descriptions.inc
deleted file mode 100644
index e5917ca32..000000000
--- a/data/text/berry_descriptions.inc
+++ /dev/null
@@ -1,258 +0,0 @@
-gBerryDescriptionPart1_Cheri:: @ 8589AE4
- .string "Blooms with delicate pretty flowers.$"
-
-gBerryDescriptionPart2_Cheri:: @ 8589B09
- .string "The bright red BERRY is very spicy.$"
-
-gBerryDescriptionPart1_Chesto:: @ 8589B2D
- .string "The BERRY's thick skin and fruit are$"
-
-gBerryDescriptionPart2_Chesto:: @ 8589B52
- .string "very tough. It is dry-tasting all over.$"
-
-gBerryDescriptionPart1_Pecha:: @ 8589B7A
- .string "Very sweet and delicious.$"
-
-gBerryDescriptionPart2_Pecha:: @ 8589B94
- .string "Also very tender - handle with care.$"
-
-gBerryDescriptionPart1_Rawst:: @ 8589BB9
- .string "If the leaves grow long and curly,$"
-
-gBerryDescriptionPart2_Rawst:: @ 8589BDC
- .string "the BERRY seems to grow very bitter.$"
-
-gBerryDescriptionPart1_Aspear:: @ 8589C01
- .string "The hard BERRY is dense with a rich$"
-
-gBerryDescriptionPart2_Aspear:: @ 8589C25
- .string "juice. It is quite sour.$"
-
-gBerryDescriptionPart1_Leppa:: @ 8589C3E
- .string "Grows slower than CHERI and others.$"
-
-gBerryDescriptionPart2_Leppa:: @ 8589C62
- .string "The smaller the BERRY, the tastier.$"
-
-gBerryDescriptionPart1_Oran:: @ 8589C86
- .string "A peculiar BERRY with a mix of flavors.$"
-
-gBerryDescriptionPart2_Oran:: @ 8589CAE
- .string "BERRIES grow in half a day.$"
-
-gBerryDescriptionPart1_Persim:: @ 8589CCA
- .string "Loves sunlight. The BERRY's color$"
-
-gBerryDescriptionPart2_Persim:: @ 8589CEC
- .string "grows vivid when exposed to the sun.$"
-
-gBerryDescriptionPart1_Lum:: @ 8589D11
- .string "Slow to grow. If raised with loving$"
-
-gBerryDescriptionPart2_Lum:: @ 8589D35
- .string "care, it may grow two BERRIES.$"
-
-gBerryDescriptionPart1_Sitrus:: @ 8589D54
- .string "Closely related to ORAN. The large$"
-
-gBerryDescriptionPart2_Sitrus:: @ 8589D77
- .string "BERRY has a well-rounded flavor.$"
-
-gBerryDescriptionPart1_Figy:: @ 8589D98
- .string "The BERRY, which looks chewed up,$"
-
-gBerryDescriptionPart2_Figy:: @ 8589DBA
- .string "brims with spicy substances.$"
-
-gBerryDescriptionPart1_Wiki:: @ 8589DD7
- .string "The BERRY is said to have grown lumpy$"
-
-gBerryDescriptionPart2_Wiki:: @ 8589DFD
- .string "to help POKéMON grip it.$"
-
-gBerryDescriptionPart1_Mago:: @ 8589E16
- .string "The BERRY turns curvy as it grows.$"
-
-gBerryDescriptionPart2_Mago:: @ 8589E39
- .string "The curvier, the sweeter and tastier.$"
-
-gBerryDescriptionPart1_Aguav:: @ 8589E5F
- .string "The flower is dainty. It is rare in its$"
-
-gBerryDescriptionPart2_Aguav:: @ 8589E87
- .string "ability to grow without light.$"
-
-gBerryDescriptionPart1_Iapapa:: @ 8589EA6
- .string "The BERRY is very big and sour.$"
-
-gBerryDescriptionPart2_Iapapa:: @ 8589EC6
- .string "It takes at least a day to grow.$"
-
-gBerryDescriptionPart1_Razz:: @ 8589EE7
- .string "The red BERRY tastes slightly spicy.$"
-
-gBerryDescriptionPart2_Razz:: @ 8589F0C
- .string "It grows quickly in just four hours.$"
-
-gBerryDescriptionPart1_Bluk:: @ 8589F31
- .string "The BERRY is blue on the outside, but$"
-
-gBerryDescriptionPart2_Bluk:: @ 8589F57
- .string "it blackens the mouth when eaten.$"
-
-gBerryDescriptionPart1_Nanab:: @ 8589F79
- .string "This BERRY was the seventh$"
-
-gBerryDescriptionPart2_Nanab:: @ 8589F94
- .string "discovered in the world. It is sweet.$"
-
-gBerryDescriptionPart1_Wepear:: @ 8589FBA
- .string "The flower is small and white. It has a$"
-
-gBerryDescriptionPart2_Wepear:: @ 8589FE2
- .string "delicate balance of bitter and sour.$"
-
-gBerryDescriptionPart1_Pinap:: @ 858A007
- .string "Weak against wind and cold.$"
-
-gBerryDescriptionPart2_Pinap:: @ 858A023
- .string "The fruit is spicy and the skin, sour.$"
-
-gBerryDescriptionPart1_Pomeg:: @ 858A04A
- .string "However much it is watered,$"
-
-gBerryDescriptionPart2_Pomeg:: @ 858A066
- .string "it only grows up to six BERRIES.$"
-
-gBerryDescriptionPart1_Kelpsy:: @ 858A087
- .string "A rare variety shaped like a root.$"
-
-gBerryDescriptionPart2_Kelpsy:: @ 858A0AA
- .string "Grows a very large flower.$"
-
-gBerryDescriptionPart1_Qualot:: @ 858A0C5
- .string "Loves water. Grows strong even in$"
-
-gBerryDescriptionPart2_Qualot:: @ 858A0E7
- .string "locations with constant rainfall.$"
-
-gBerryDescriptionPart1_Hondew:: @ 858A109
- .string "A BERRY that is very valuable and$"
-
-gBerryDescriptionPart2_Hondew:: @ 858A12B
- .string "rarely seen. It is very delicious.$"
-
-gBerryDescriptionPart1_Grepa:: @ 858A14E
- .string "Despite its tenderness and round$"
-
-gBerryDescriptionPart2_Grepa:: @ 858A16F
- .string "shape, the BERRY is unimaginably sour.$"
-
-gBerryDescriptionPart1_Tamato:: @ 858A196
- .string "The BERRY is lip-bendingly spicy.$"
-
-gBerryDescriptionPart2_Tamato:: @ 858A1B8
- .string "It takes time to grow.$"
-
-gBerryDescriptionPart1_Cornn:: @ 858A1CF
- .string "A BERRY from an ancient era. May not$"
-
-gBerryDescriptionPart2_Cornn:: @ 858A1F4
- .string "grow unless planted in quantity.$"
-
-gBerryDescriptionPart1_Magost:: @ 858A215
- .string "A BERRY that is widely said to have$"
-
-gBerryDescriptionPart2_Magost:: @ 858A239
- .string "a finely balanced flavor.$"
-
-gBerryDescriptionPart1_Rabuta:: @ 858A253
- .string "A rare variety that is overgrown with$"
-
-gBerryDescriptionPart2_Rabuta:: @ 858A279
- .string "hair. It is quite bitter.$"
-
-gBerryDescriptionPart1_Nomel:: @ 858A293
- .string "Quite sour. Just one bite makes it$"
-
-gBerryDescriptionPart2_Nomel:: @ 858A2B6
- .string "impossible to taste for three days.$"
-
-gBerryDescriptionPart1_Spelon:: @ 858A2DA
- .string "The vividly red BERRY is very spicy.$"
-
-gBerryDescriptionPart2_Spelon:: @ 858A2FF
- .string "Its warts secrete a spicy substance.$"
-
-gBerryDescriptionPart1_Pamtre:: @ 858A324
- .string "Drifts on the sea from somewhere.$"
-
-gBerryDescriptionPart2_Pamtre:: @ 858A346
- .string "It is thought to grow elsewhere.$"
-
-gBerryDescriptionPart1_Watmel:: @ 858A367
- .string "A huge BERRY, with some over 20$"
-
-gBerryDescriptionPart2_Watmel:: @ 858A387
- .string "inches discovered. Exceedingly sweet.$"
-
-gBerryDescriptionPart1_Durin:: @ 858A3AD
- .string "Bitter to even look at. It is so$"
-
-gBerryDescriptionPart2_Durin:: @ 858A3CE
- .string "bitter, no one has ever eaten it as is.$"
-
-gBerryDescriptionPart1_Belue:: @ 858A3F6
- .string "It is glossy and looks delicious, but$"
-
-gBerryDescriptionPart2_Belue:: @ 858A41C
- .string "it is awfully sour. Takes time to grow.$"
-
-gBerryDescriptionPart1_Liechi:: @ 858A444
- .string "A mysterious BERRY. It is rumored to$"
-
-gBerryDescriptionPart2_Liechi:: @ 858A469
- .string "contain the power of the sea.$"
-
-gBerryDescriptionPart1_Ganlon:: @ 858A487
- .string "A mysterious BERRY. It is rumored to$"
-
-gBerryDescriptionPart2_Ganlon:: @ 858A4AC
- .string "contain the power of the land.$"
-
-gBerryDescriptionPart1_Salac:: @ 858A4CB
- .string "A mysterious BERRY. It is rumored to$"
-
-gBerryDescriptionPart2_Salac:: @ 858A4F0
- .string "contain the power of the sky.$"
-
-gBerryDescriptionPart1_Petaya:: @ 858A50E
- .string "A mysterious BERRY. It is rumored to$"
-
-gBerryDescriptionPart2_Petaya:: @ 858A533
- .string "contain the power of all living things.$"
-
-gBerryDescriptionPart1_Apicot:: @ 858A55B
- .string "A very mystifying BERRY. No telling$"
-
-gBerryDescriptionPart2_Apicot:: @ 858A57F
- .string "what may happen or how it can be used.$"
-
-gBerryDescriptionPart1_Lansat:: @ 858A5A6
- .string "Said to be a legendary BERRY.$"
-
-gBerryDescriptionPart2_Lansat:: @ 858A5C4
- .string "Holding it supposedly brings joy.$"
-
-gBerryDescriptionPart1_Starf:: @ 858A5E6
- .string "So strong, it was abandoned at the$"
-
-gBerryDescriptionPart2_Starf:: @ 858A609
- .string "world's edge. Considered a mirage.$"
-
-gBerryDescriptionPart1_Enigma:: @ 858A62C
- .string "A completely enigmatic BERRY.$"
-
-gBerryDescriptionPart2_Enigma:: @ 858A64A
- .string "Appears to have the power of stars.$"
-
diff --git a/data/text/contest_painting.inc b/data/text/contest_painting.inc
index 78ae80153..b423fbb27 100644
--- a/data/text/contest_painting.inc
+++ b/data/text/contest_painting.inc
@@ -1,4 +1,4 @@
-gContestPaintingCaption:: @ 827EA0C
+gContestHallPaintingCaption:: @ 827EA0C
.string "{STR_VAR_1}\n"
.string "{STR_VAR_2}'s {STR_VAR_3}$"
diff --git a/data/text/tv.inc b/data/text/tv.inc
index 287ce7f00..311f2ddd2 100644
--- a/data/text/tv.inc
+++ b/data/text/tv.inc
@@ -1027,7 +1027,7 @@ gTVPokemonTodaySuccessfulText11:: @ 08283A5F
.string "BIG BRO: Remember, it could be your\n"
.string "POKéMON in the spotlight next time!$"
-gTVTodaysSmartShopperText00:: @ 08283B05
+SmartShopper_Text_Intro:: @ 08283B05
.string "Hello!\p"
.string "It's time for TODAY'S SMART SHOPPER.\p"
.string "INTERVIEWER: How are you, viewers?\p"
@@ -1036,7 +1036,7 @@ gTVTodaysSmartShopperText00:: @ 08283B05
.string "Let's check on what the hot sellers\n"
.string "have been recently.$"
-gTVTodaysSmartShopperText01:: @ 08283BAF
+SmartShopper_Text_ClerkNormal:: @ 08283BAF
.string "Let's interview the clerk to get the\n"
.string "lowdown.\p"
.string "Hi, how's your business?\p"
@@ -1046,7 +1046,7 @@ gTVTodaysSmartShopperText01:: @ 08283BAF
.string "Why, just the other day a TRAINER\n"
.string "named {STR_VAR_1} bought {STR_VAR_3}.$"
-gTVTodaysSmartShopperText02:: @ 08283C81
+SmartShopper_Text_RandomComment1:: @ 08283C81
.string "INTERVIEWER: The TRAINER bought\n"
.string "{STR_VAR_3} {STR_VAR_2}S? That's a haul!\p"
.string "If I may say so, {STR_VAR_1} must have\n"
@@ -1055,13 +1055,13 @@ gTVTodaysSmartShopperText02:: @ 08283C81
.string "For traveling, {STR_VAR_2}S are so\n"
.string "important!$"
-gTVTodaysSmartShopperText03:: @ 08283D32
+SmartShopper_Text_RandomComment2:: @ 08283D32
.string "INTERVIEWER: Speaking of the item\n"
.string "{STR_VAR_2}, I just bought {STR_VAR_3} of\l"
.string "them recently.\p"
.string "After all, {STR_VAR_2}'s a great item!$"
-gTVTodaysSmartShopperText04:: @ 08283D99
+SmartShopper_Text_RandomComment3:: @ 08283D99
.string "INTERVIEWER: {STR_VAR_2}?!\n"
.string "But {STR_VAR_3} of them?!\p"
.string "I didn't think there would be anyone\n"
@@ -1069,7 +1069,7 @@ gTVTodaysSmartShopperText04:: @ 08283D99
.string "My goodness, I can only afford one or\n"
.string "two at a time…$"
-gTVTodaysSmartShopperText05:: @ 08283E28
+SmartShopper_Text_RandomComment4:: @ 08283E28
.string "INTERVIEWER: One time, I bought\n"
.string "a whole lot of the item {STR_VAR_2}.\p"
.string "But it turned out to be too many.\n"
@@ -1079,21 +1079,21 @@ gTVTodaysSmartShopperText05:: @ 08283E28
.string "Oops!\p"
.string "There's no point talking about me!$"
-gTVTodaysSmartShopperText06:: @ 08283F01
+SmartShopper_Text_SecondItem:: @ 08283F01
.string "CLERK: {STR_VAR_1} also bought the item\n"
.string "{STR_VAR_2} in bulk, taking {STR_VAR_3}.\p"
.string "INTERVIEWER: Oh, that's smart.\n"
.string "{STR_VAR_2}'s a very good item, too.$"
-gTVTodaysSmartShopperText07:: @ 08283F72
+SmartShopper_Text_ThirdItem:: @ 08283F72
.string "CLERK: And, the TRAINER also bought\n"
.string "{STR_VAR_3} of the item {STR_VAR_2}.$"
-gTVTodaysSmartShopperText08:: @ 08283FA9
+SmartShopper_Text_DuringSale:: @ 08283FA9
.string "CLERK: Plus, it was during a big sale.\n"
.string "That's smart shopping.$"
-gTVTodaysSmartShopperText09:: @ 08283FE7
+SmartShopper_Text_OutroNormal:: @ 08283FE7
.string "INTERVIEWER: Hmm… {STR_VAR_1} sounds like\n"
.string "quite the shrewd bargain hunter!\p"
.string "In total, {STR_VAR_1}'s purchases came to…\p"
@@ -1102,11 +1102,11 @@ gTVTodaysSmartShopperText09:: @ 08283FE7
.string "Oops! We're out of time!\n"
.string "See you on our next broadcast!$"
-gTVTodaysSmartShopperText10:: @ 0828409E
+SmartShopper_Text_IsVIP:: @ 0828409E
.string "CLERK: {STR_VAR_1} is a VIP customer,\n"
.string "no doubt about it.$"
-gTVTodaysSmartShopperText11:: @ 082840CE
+SmartShopper_Text_ClerkMax:: @ 082840CE
.string "Let's interview the clerk to get the\n"
.string "lowdown.\p"
.string "Hi, how's your business?\p"
@@ -1127,7 +1127,7 @@ gTVTodaysSmartShopperText11:: @ 082840CE
.string "CLERK: {STR_VAR_1} is a VIP customer,\n"
.string "no doubt about it.$"
-gTVTodaysSmartShopperText12:: @ 082842E6
+SmartShopper_Text_OutroMax:: @ 082842E6
.string "INTERVIEWER: Hmm…\n"
.string "That is amazing.\p"
.string "But why would the TRAINER need to buy\n"
diff --git a/docs/legacy_WSL1_INSTALL.md b/docs/legacy_WSL1_INSTALL.md
new file mode 100644
index 000000000..b9840d1c8
--- /dev/null
+++ b/docs/legacy_WSL1_INSTALL.md
@@ -0,0 +1,41 @@
+### Setting up WSL1 (Legacy Portion)
+
+1. Certain packages are required to build pokeemerald. Install these packages by running the following command:
+
+ ```bash
+ sudo apt install build-essential git libpng-dev gdebi-core
+ ```
+ > Note: If the above command does not work, try the above command but replacing `apt` with `apt-get`.
+
+2. 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`.
+
+3. 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.
+
+ 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:
+
+ ```bash
+ cd /mnt/c/Users/<user>/Downloads
+ ```
+
+ > Note 1: The Windows C:\ drive is called /mnt/c/ in WSL.
+ > Note 2: If the path has spaces, then the path must be wrapped with quotations, e.g. `cd "/mnt/c/users/<user>/Downloads folder"`.
+ > Note 3: Windows path names are case-insensitive so adhering to capitalization isn't needed
+
+4. Once the directory has been changed to the folder containing the devkitPro pacman package, run the following commands to install devkitARM.
+
+ ```bash
+ sudo gdebi devkitpro-pacman.amd64.deb
+ sudo dkp-pacman -Sy
+ sudo dkp-pacman -S gba-dev
+ ```
+
+ 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.
+
+ > 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.
+
+5. Run the following command to set devkitPro related environment variables (alternatively, close and re-open WSL):
+ ```bash
+ source /etc/profile.d/devkit-env.sh
+ ```
+
+Proceed to [Choosing where to store pokeemerald (WSL1) of the current INSTALL.md](/INSTALL.md#choosing-where-to-store-pokeemerald-WSL1).
diff --git a/gflib/bg.c b/gflib/bg.c
index 3c215c103..ec7c2113b 100644
--- a/gflib/bg.c
+++ b/gflib/bg.c
@@ -55,7 +55,7 @@ void ResetBgs(void)
static void SetBgModeInternal(u8 bgMode)
{
- sGpuBgConfigs.bgVisibilityAndMode &= 0xFFF8;
+ sGpuBgConfigs.bgVisibilityAndMode &= ~0x7;
sGpuBgConfigs.bgVisibilityAndMode |= bgMode;
}
@@ -66,13 +66,11 @@ u8 GetBgMode(void)
void ResetBgControlStructs(void)
{
- struct BgConfig* bgConfigs = &sGpuBgConfigs.configs[0];
- struct BgConfig zeroedConfig = sZeroedBgControlStruct;
int i;
for (i = 0; i < NUM_BACKGROUNDS; i++)
{
- bgConfigs[i] = zeroedConfig;
+ sGpuBgConfigs.configs[i] = sZeroedBgControlStruct;
}
}
@@ -175,36 +173,30 @@ u8 LoadBgVram(u8 bg, const void *src, u16 size, u16 destOffset, u8 mode)
u16 offset;
s8 cursor;
- if (!IsInvalidBg(bg) && sGpuBgConfigs.configs[bg].visible)
- {
- switch (mode)
- {
- case 0x1:
- offset = sGpuBgConfigs.configs[bg].charBaseIndex * BG_CHAR_SIZE;
- break;
- case 0x2:
- offset = sGpuBgConfigs.configs[bg].mapBaseIndex * BG_SCREEN_SIZE;
- break;
- default:
- cursor = -1;
- goto end;
- }
+ if (IsInvalidBg(bg) || !sGpuBgConfigs.configs[bg].visible)
+ return -1;
+ switch (mode)
+ {
+ case 0x1:
+ offset = sGpuBgConfigs.configs[bg].charBaseIndex * BG_CHAR_SIZE;
offset = destOffset + offset;
-
cursor = RequestDma3Copy(src, (void*)(offset + BG_VRAM), size, 0);
-
if (cursor == -1)
- {
return -1;
- }
- }
- else
- {
- return -1;
+ break;
+ case 0x2:
+ offset = sGpuBgConfigs.configs[bg].mapBaseIndex * BG_SCREEN_SIZE;
+ offset = destOffset + offset;
+ cursor = RequestDma3Copy(src, (void*)(offset + BG_VRAM), size, 0);
+ if (cursor == -1)
+ return -1;
+ break;
+ default:
+ cursor = -1;
+ break;
}
-end:
return cursor;
}
@@ -254,17 +246,17 @@ static void SetBgAffineInternal(u8 bg, s32 srcCenterX, s32 srcCenterY, s16 dispC
switch (sGpuBgConfigs.bgVisibilityAndMode & 0x7)
{
+ default:
+ case 0:
+ return;
case 1:
if (bg != 2)
return;
break;
case 2:
- if (bg < 2 || bg >= NUM_BACKGROUNDS)
+ if (bg != 2 && bg != 3)
return;
break;
- case 0:
- default:
- return;
}
src.texX = srcCenterX;
@@ -697,7 +689,7 @@ s32 ChangeBgY(u8 bg, s32 value, u8 op)
return sGpuBgConfigs2[bg].bg_y;
}
-s32 ChangeBgY_ScreenOff(u8 bg, u32 value, u8 op)
+s32 ChangeBgY_ScreenOff(u8 bg, s32 value, u8 op)
{
u8 mode;
u16 temp1;
diff --git a/gflib/bg.h b/gflib/bg.h
index 3c7eee292..58fd1282c 100644
--- a/gflib/bg.h
+++ b/gflib/bg.h
@@ -59,7 +59,7 @@ u16 GetBgAttribute(u8 bg, u8 attributeId);
s32 ChangeBgX(u8 bg, s32 value, u8 op);
s32 GetBgX(u8 bg);
s32 ChangeBgY(u8 bg, s32 value, u8 op);
-s32 ChangeBgY_ScreenOff(u8 bg, u32 value, u8 op);
+s32 ChangeBgY_ScreenOff(u8 bg, s32 value, u8 op);
s32 GetBgY(u8 bg);
void SetBgAffine(u8 bg, s32 srcCenterX, s32 srcCenterY, s16 dispCenterX, s16 dispCenterY, s16 scaleX, s16 scaleY, u16 rotationAngle);
u8 Unused_AdjustBgMosaic(u8 a1, u8 a2);
diff --git a/gflib/sprite.c b/gflib/sprite.c
index c66b1e47d..f97ecc712 100644
--- a/gflib/sprite.c
+++ b/gflib/sprite.c
@@ -452,6 +452,10 @@ void SortSprites(void)
// Although this doesn't result in a bug in the ROM,
// the behavior is undefined.
j--;
+#ifdef UBFIX
+ if (j == 0)
+ break;
+#endif
sprite1 = &gSprites[sSpriteOrder[j - 1]];
sprite2 = &gSprites[sSpriteOrder[j]];
@@ -661,8 +665,7 @@ void ResetOamRange(u8 a, u8 b)
for (i = a; i < b; i++)
{
- struct OamData *oamBuffer = gMain.oamBuffer;
- oamBuffer[i] = *(struct OamData *)&gDummyOamData;
+ gMain.oamBuffer[i] = *(struct OamData *)&gDummyOamData;
}
}
diff --git a/gflib/text.c b/gflib/text.c
index 445a7b1be..eb993c421 100644
--- a/gflib/text.c
+++ b/gflib/text.c
@@ -1632,8 +1632,7 @@ void DecompressGlyphFont7(u16 glyphId, bool32 isJapanese)
if (isJapanese == TRUE)
{
- int eff;
- glyphs = gFont1JapaneseGlyphs + (0x100 * (glyphId >> 0x4)) + (0x8 * (glyphId & (eff = 0xF))); // shh, no questions, only matching now
+ glyphs = gFont1JapaneseGlyphs + (0x100 * (glyphId >> 0x4)) + (0x8 * (glyphId % 0x10));
DecompressGlyphTile(glyphs, gCurGlyph.gfxBufferTop);
DecompressGlyphTile(glyphs + 0x80, gCurGlyph.gfxBufferBottom);
gCurGlyph.width = 8;
@@ -1761,8 +1760,7 @@ void DecompressGlyphFont1(u16 glyphId, bool32 isJapanese)
if (isJapanese == TRUE)
{
- int eff;
- glyphs = gFont1JapaneseGlyphs + (0x100 * (glyphId >> 0x4)) + (0x8 * (glyphId & (eff = 0xF))); // shh, no questions, only matching now
+ glyphs = gFont1JapaneseGlyphs + (0x100 * (glyphId >> 0x4)) + (0x8 * (glyphId % 0x10));
DecompressGlyphTile(glyphs, gCurGlyph.gfxBufferTop);
DecompressGlyphTile(glyphs + 0x80, gCurGlyph.gfxBufferBottom);
gCurGlyph.width = 8;
diff --git a/graphics/contest/misc_2_tilemap_3.bin b/graphics/contest/results_screen/bg.bin
index 5055ab79e..5055ab79e 100644
--- a/graphics/contest/misc_2_tilemap_3.bin
+++ b/graphics/contest/results_screen/bg.bin
diff --git a/graphics/contest/misc_2_tilemap_2.bin b/graphics/contest/results_screen/interface.bin
index b31126836..b31126836 100644
--- a/graphics/contest/misc_2_tilemap_2.bin
+++ b/graphics/contest/results_screen/interface.bin
Binary files differ
diff --git a/graphics/unknown/unknown_58D6B0.pal b/graphics/contest/results_screen/text_window.pal
index 1c10c781f..1c10c781f 100644
--- a/graphics/unknown/unknown_58D6B0.pal
+++ b/graphics/contest/results_screen/text_window.pal
diff --git a/graphics/unknown/unknown_58D6D0.png b/graphics/contest/results_screen/text_window.png
index da421b501..da421b501 100644
--- a/graphics/unknown/unknown_58D6D0.png
+++ b/graphics/contest/results_screen/text_window.png
Binary files differ
diff --git a/graphics/contest/results_screen.pal b/graphics/contest/results_screen/tiles.pal
index 869aef9e1..869aef9e1 100644
--- a/graphics/contest/results_screen.pal
+++ b/graphics/contest/results_screen/tiles.pal
diff --git a/graphics/contest/results_screen.png b/graphics/contest/results_screen/tiles.png
index 106b975cf..106b975cf 100644
--- a/graphics/contest/results_screen.png
+++ b/graphics/contest/results_screen/tiles.png
Binary files differ
diff --git a/graphics/contest/results_screen.bin b/graphics/contest/results_screen/title.bin
index 3b46e00b8..3b46e00b8 100644
--- a/graphics/contest/results_screen.bin
+++ b/graphics/contest/results_screen/title.bin
Binary files differ
diff --git a/graphics/contest/results_screen_beauty.bin b/graphics/contest/results_screen/title_beauty.bin
index fe02ec0b5..fe02ec0b5 100644
--- a/graphics/contest/results_screen_beauty.bin
+++ b/graphics/contest/results_screen/title_beauty.bin
diff --git a/graphics/contest/results_screen_cool.bin b/graphics/contest/results_screen/title_cool.bin
index f3939831e..f3939831e 100644
--- a/graphics/contest/results_screen_cool.bin
+++ b/graphics/contest/results_screen/title_cool.bin
Binary files differ
diff --git a/graphics/contest/results_screen_cute.bin b/graphics/contest/results_screen/title_cute.bin
index d37d6df3c..d37d6df3c 100644
--- a/graphics/contest/results_screen_cute.bin
+++ b/graphics/contest/results_screen/title_cute.bin
diff --git a/graphics/contest/results_screen_hyper.bin b/graphics/contest/results_screen/title_hyper.bin
index d4bb7bae7..d4bb7bae7 100644
--- a/graphics/contest/results_screen_hyper.bin
+++ b/graphics/contest/results_screen/title_hyper.bin
Binary files differ
diff --git a/graphics/contest/results_screen_link.bin b/graphics/contest/results_screen/title_link.bin
index cc07b0f1a..cc07b0f1a 100644
--- a/graphics/contest/results_screen_link.bin
+++ b/graphics/contest/results_screen/title_link.bin
Binary files differ
diff --git a/graphics/contest/results_screen_master.bin b/graphics/contest/results_screen/title_master.bin
index 32f24abd6..32f24abd6 100644
--- a/graphics/contest/results_screen_master.bin
+++ b/graphics/contest/results_screen/title_master.bin
Binary files differ
diff --git a/graphics/contest/results_screen_normal.bin b/graphics/contest/results_screen/title_normal.bin
index e22f21839..e22f21839 100644
--- a/graphics/contest/results_screen_normal.bin
+++ b/graphics/contest/results_screen/title_normal.bin
Binary files differ
diff --git a/graphics/contest/results_screen_smart.bin b/graphics/contest/results_screen/title_smart.bin
index 79d2e3fbb..79d2e3fbb 100644
--- a/graphics/contest/results_screen_smart.bin
+++ b/graphics/contest/results_screen/title_smart.bin
diff --git a/graphics/contest/results_screen_super.bin b/graphics/contest/results_screen/title_super.bin
index 21c804d12..21c804d12 100644
--- a/graphics/contest/results_screen_super.bin
+++ b/graphics/contest/results_screen/title_super.bin
Binary files differ
diff --git a/graphics/contest/results_screen_tough.bin b/graphics/contest/results_screen/title_tough.bin
index 2a91bb78d..2a91bb78d 100644
--- a/graphics/contest/results_screen_tough.bin
+++ b/graphics/contest/results_screen/title_tough.bin
diff --git a/graphics/contest/misc_2_tilemap_1.bin b/graphics/contest/results_screen/winner_banner.bin
index 197e88cee..197e88cee 100644
--- a/graphics/contest/misc_2_tilemap_1.bin
+++ b/graphics/contest/results_screen/winner_banner.bin
Binary files differ
diff --git a/graphics/picture_frame/frame1.png b/graphics/picture_frame/beauty.png
index 72e9d0ab7..72e9d0ab7 100644
--- a/graphics/picture_frame/frame1.png
+++ b/graphics/picture_frame/beauty.png
Binary files differ
diff --git a/graphics/picture_frame/frame1_map.bin b/graphics/picture_frame/beauty_map.bin
index 523ff9e28..523ff9e28 100644
--- a/graphics/picture_frame/frame1_map.bin
+++ b/graphics/picture_frame/beauty_map.bin
Binary files differ
diff --git a/graphics/picture_frame/frame0.png b/graphics/picture_frame/cool.png
index 33f2baf09..33f2baf09 100644
--- a/graphics/picture_frame/frame0.png
+++ b/graphics/picture_frame/cool.png
Binary files differ
diff --git a/graphics/picture_frame/frame0_map.bin b/graphics/picture_frame/cool_map.bin
index 6f7a7b165..6f7a7b165 100644
--- a/graphics/picture_frame/frame0_map.bin
+++ b/graphics/picture_frame/cool_map.bin
Binary files differ
diff --git a/graphics/picture_frame/frame2.png b/graphics/picture_frame/cute.png
index 38e6ba209..38e6ba209 100644
--- a/graphics/picture_frame/frame2.png
+++ b/graphics/picture_frame/cute.png
Binary files differ
diff --git a/graphics/picture_frame/frame2_map.bin b/graphics/picture_frame/cute_map.bin
index 3333c2a01..3333c2a01 100644
--- a/graphics/picture_frame/frame2_map.bin
+++ b/graphics/picture_frame/cute_map.bin
Binary files differ
diff --git a/graphics/picture_frame/frame5.png b/graphics/picture_frame/lobby.png
index 1b7da4a1a..1b7da4a1a 100644
--- a/graphics/picture_frame/frame5.png
+++ b/graphics/picture_frame/lobby.png
Binary files differ
diff --git a/graphics/picture_frame/frame5_map.bin b/graphics/picture_frame/lobby_map.bin
index 8d2502cd4..8d2502cd4 100644
--- a/graphics/picture_frame/frame5_map.bin
+++ b/graphics/picture_frame/lobby_map.bin
Binary files differ
diff --git a/graphics/picture_frame/frame3.png b/graphics/picture_frame/smart.png
index 93fbf373f..93fbf373f 100644
--- a/graphics/picture_frame/frame3.png
+++ b/graphics/picture_frame/smart.png
Binary files differ
diff --git a/graphics/picture_frame/frame3_map.bin b/graphics/picture_frame/smart_map.bin
index c2adf40c2..c2adf40c2 100644
--- a/graphics/picture_frame/frame3_map.bin
+++ b/graphics/picture_frame/smart_map.bin
Binary files differ
diff --git a/graphics/picture_frame/frame4.png b/graphics/picture_frame/tough.png
index c7db2e3be..c7db2e3be 100644
--- a/graphics/picture_frame/frame4.png
+++ b/graphics/picture_frame/tough.png
Binary files differ
diff --git a/graphics/picture_frame/frame4_map.bin b/graphics/picture_frame/tough_map.bin
index c2adf40c2..c2adf40c2 100644
--- a/graphics/picture_frame/frame4_map.bin
+++ b/graphics/picture_frame/tough_map.bin
Binary files differ
diff --git a/graphics_file_rules.mk b/graphics_file_rules.mk
index be465a57f..9fd9091a4 100644
--- a/graphics_file_rules.mk
+++ b/graphics_file_rules.mk
@@ -476,7 +476,7 @@ $(RAYQUAZAGFXDIR)/scene_4/streaks.4bpp: %.4bpp: %.png
$(RAYQUAZAGFXDIR)/scene_4/rayquaza.4bpp: %.4bpp: %.png
$(GFX) $< $@ -num_tiles 155
-graphics/picture_frame/frame5.4bpp: %.4bpp: %.png
+graphics/picture_frame/lobby.4bpp: %.4bpp: %.png
$(GFX) $< $@ -num_tiles 86
$(ROULETTEGFXDIR)/roulette_tilt.4bpp: $(ROULETTEGFXDIR)/shroomish.4bpp \
diff --git a/include/battle_anim.h b/include/battle_anim.h
index 476480489..ad160e74d 100644
--- a/include/battle_anim.h
+++ b/include/battle_anim.h
@@ -143,7 +143,7 @@ void TranslateSpriteLinear(struct Sprite *sprite);
void AnimSpriteOnMonPos(struct Sprite *sprite);
void InitAnimLinearTranslationWithSpeedAndPos(struct Sprite *sprite);
void TranslateSpriteInCircleOverDuration(struct Sprite *sprite);
-void SetGreyscaleOrOriginalPalette(u16 palNum, bool8 restoreOriginal);
+void SetGrayscaleOrOriginalPalette(u16 palNum, bool8 restoreOriginal);
void PrepareAffineAnimInTaskData(struct Task *task, u8 spriteId, const union AffineAnimCmd *affineAnimCmds);
bool8 RunAffineAnimFromTaskData(struct Task *task);
void AnimThrowProjectile(struct Sprite *sprite);
diff --git a/include/battle_pyramid_bag.h b/include/battle_pyramid_bag.h
index df111b939..de571714c 100644
--- a/include/battle_pyramid_bag.h
+++ b/include/battle_pyramid_bag.h
@@ -3,48 +3,72 @@
#include "list_menu.h"
-struct PyramidBagResources
+enum {
+ PYRAMIDBAG_LOC_FIELD,
+ PYRAMIDBAG_LOC_BATTLE,
+ PYRAMIDBAG_LOC_PARTY,
+ PYRAMIDBAG_LOC_CHOOSE_TOSS,
+ PYRAMIDBAG_LOC_PREV,
+};
+
+enum {
+ PBAG_SPRITE_BAG,
+ PBAG_SPRITE_ITEM_ICON,
+ PBAG_SPRITE_ITEM_ICON_ALT,
+ PBAG_SPRITE_SWAP_LINE_START, // Swap line consists of 8 sprites
+ PBAG_SPRITE_SWAP_LINE_2,
+ PBAG_SPRITE_SWAP_LINE_3,
+ PBAG_SPRITE_SWAP_LINE_4,
+ PBAG_SPRITE_SWAP_LINE_5,
+ PBAG_SPRITE_SWAP_LINE_6,
+ PBAG_SPRITE_SWAP_LINE_7,
+ PBAG_SPRITE_SWAP_LINE_END,
+ PBAG_SPRITE_COUNT
+};
+#define NUM_SWAP_LINE_SPRITES (1 + PBAG_SPRITE_SWAP_LINE_END - PBAG_SPRITE_SWAP_LINE_START)
+
+struct PyramidBagMenu
{
- void (*callback2)(void);
- u8 tilemapBuffer[0x800];
- u8 itemsSpriteIds[PYRAMID_BAG_ITEMS_COUNT + 1];
+ void (*exitCallback)(void);
+ u8 tilemapBuffer[BG_SCREEN_SIZE];
+ u8 spriteIds[PBAG_SPRITE_COUNT];
u8 windowIds[5];
- u8 unk814;
- u8 unk815;
+ u8 toSwapPos;
+ bool8 isAltIcon; // Two item icons loaded at a time. Tracks which to show next
u8 scrollIndicatorsTaskId;
const u8 *menuActionIds;
- u8 filler81C[0x820 - 0x81C];
+ u8 unused1[4];
u8 menuActionsCount;
u8 listMenuCount;
u8 listMenuMaxShown;
struct ListMenuItem bagListItems[PYRAMID_BAG_ITEMS_COUNT + 1];
u8 itemStrings[PYRAMID_BAG_ITEMS_COUNT + 1][ITEM_NAME_LENGTH + 10];
s16 state;
- u8 filler986[0x98C - 0x986];
+ u8 unused2[4];
};
-struct PyramidBagCursorData
+struct PyramidBagMenuState
{
void (*callback)(void);
- u8 unk4;
+ u8 location;
u16 cursorPosition;
u16 scrollPosition;
};
-extern struct PyramidBagResources *gPyramidBagResources;
-extern struct PyramidBagCursorData gPyramidBagCursorData;
+extern struct PyramidBagMenu *gPyramidBagMenu;
+extern struct PyramidBagMenuState gPyramidBagMenuState;
void InitBattlePyramidBagCursorPosition(void);
void CB2_PyramidBagMenuFromStartMenu(void);
void CB2_ReturnToPyramidBagMenu(void);
-void sub_81C5924(void);
-void sub_81C59BC(void);
+void UpdatePyramidBagList(void);
+void UpdatePyramidBagCursorPos(void);
void sub_81C4EFC(void);
void GoToBattlePyramidBagMenu(u8 a0, void (*callback)(void));
void Task_CloseBattlePyramidBagMessage(u8 taskId);
void TryStoreHeldItemsInPyramidBag(void);
void ChooseItemsToTossFromPyramidBag(void);
-void CloseBattlePyramidBagAndSetCallback(u8 taskId);
+void CloseBattlePyramidBag(u8 taskId);
void DisplayItemMessageInBattlePyramid(u8 taskId, const u8 *str, void (*callback)(u8 taskId));
#endif // GUARD_BATTLE_PYRAMID_BAG_H
diff --git a/include/constants/battle_ai.h b/include/constants/battle_ai.h
index 4c3a45dc6..5ade58d50 100644
--- a/include/constants/battle_ai.h
+++ b/include/constants/battle_ai.h
@@ -29,24 +29,24 @@
#define AI_WEATHER_HAIL 3
// get_how_powerful_move_is
-#define MOVE_POWER_DISCOURAGED 0
+#define MOVE_POWER_OTHER 0
#define MOVE_NOT_MOST_POWERFUL 1
#define MOVE_MOST_POWERFUL 2
// script's table id to bit
-#define AI_SCRIPT_CHECK_BAD_MOVE (1 << 0)
-#define AI_SCRIPT_TRY_TO_FAINT (1 << 1)
-#define AI_SCRIPT_CHECK_VIABILITY (1 << 2)
-#define AI_SCRIPT_SETUP_FIRST_TURN (1 << 3)
-#define AI_SCRIPT_RISKY (1 << 4)
-#define AI_SCRIPT_PREFER_STRONGEST_MOVE (1 << 5)
-#define AI_SCRIPT_PREFER_BATON_PASS (1 << 6)
-#define AI_SCRIPT_DOUBLE_BATTLE (1 << 7)
-#define AI_SCRIPT_HP_AWARE (1 << 8)
-#define AI_SCRIPT_UNKNOWN (1 << 9)
+#define AI_SCRIPT_CHECK_BAD_MOVE (1 << 0)
+#define AI_SCRIPT_TRY_TO_FAINT (1 << 1)
+#define AI_SCRIPT_CHECK_VIABILITY (1 << 2)
+#define AI_SCRIPT_SETUP_FIRST_TURN (1 << 3)
+#define AI_SCRIPT_RISKY (1 << 4)
+#define AI_SCRIPT_PREFER_POWER_EXTREMES (1 << 5)
+#define AI_SCRIPT_PREFER_BATON_PASS (1 << 6)
+#define AI_SCRIPT_DOUBLE_BATTLE (1 << 7)
+#define AI_SCRIPT_HP_AWARE (1 << 8)
+#define AI_SCRIPT_TRY_SUNNY_DAY_START (1 << 9)
// 10 - 28 are not used
-#define AI_SCRIPT_ROAMING (1 << 29)
-#define AI_SCRIPT_SAFARI (1 << 30)
-#define AI_SCRIPT_FIRST_BATTLE (1 << 31)
+#define AI_SCRIPT_ROAMING (1 << 29)
+#define AI_SCRIPT_SAFARI (1 << 30)
+#define AI_SCRIPT_FIRST_BATTLE (1 << 31)
#endif // GUARD_CONSTANTS_BATTLE_AI_H
diff --git a/include/constants/battle_frontier.h b/include/constants/battle_frontier.h
index bbe6db81c..68c5a42ef 100644
--- a/include/constants/battle_frontier.h
+++ b/include/constants/battle_frontier.h
@@ -78,6 +78,21 @@
#define FRONTIER_MANIAC_MESSAGE_COUNT 3
+// Frontier TV Show
+#define FRONTIER_SHOW_TOWER_SINGLES 1
+#define FRONTIER_SHOW_TOWER_DOUBLES 2
+#define FRONTIER_SHOW_TOWER_MULTIS 3
+#define FRONTIER_SHOW_TOWER_LINK_MULTIS 4
+#define FRONTIER_SHOW_DOME_SINGLES 5
+#define FRONTIER_SHOW_DOME_DOUBLES 6
+#define FRONTIER_SHOW_FACTORY_SINGLES 7
+#define FRONTIER_SHOW_FACTORY_DOUBLES 8
+#define FRONTIER_SHOW_PIKE 9
+#define FRONTIER_SHOW_ARENA 10
+#define FRONTIER_SHOW_PALACE_SINGLES 11
+#define FRONTIER_SHOW_PALACE_DOUBLES 12
+#define FRONTIER_SHOW_PYRAMID 13
+
// Frontier Gambler
#define FRONTIER_GAMBLER_WAITING 0
#define FRONTIER_GAMBLER_PLACED_BET 1
diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h
index f22541272..c8d37aac6 100644
--- a/include/constants/battle_string_ids.h
+++ b/include/constants/battle_string_ids.h
@@ -502,7 +502,7 @@
#define B_MSG_TRANSFORMED 0
#define B_MSG_TRANSFORM_FAILED 1
-// gSubsituteUsedStringIds
+// gSubstituteUsedStringIds
#define B_MSG_SET_SUBSTITUTE 0
#define B_MSG_SUBSTITUTE_FAILED 1
diff --git a/include/constants/contest.h b/include/constants/contest.h
index 9eb6b26e4..775dcbe62 100644
--- a/include/constants/contest.h
+++ b/include/constants/contest.h
@@ -4,6 +4,7 @@
#define APPLAUSE_METER_SIZE 5
#define CONTEST_NUM_APPEALS 5
#define CONTEST_LAST_APPEAL (CONTEST_NUM_APPEALS - 1)
+#define MAX_CONTEST_MOVE_HEARTS 8
#define LINK_CONTEST_FLAG_IS_LINK (1 << 0)
#define LINK_CONTEST_FLAG_IS_WIRELESS (1 << 1)
@@ -22,7 +23,9 @@
#define CONTEST_TYPE_NPC_MASTER (CONTEST_RANK_MASTER + 1)
#define CONTEST_TYPE_LINK (CONTEST_RANK_LINK + 1)
-#define CONTEST_WINNER_ARTIST 0 // Winner shown by the artist, painting not necessarily saved
+// IDs below - 1 are indexes into gSaveBlock1Ptr->contestWinners[]
+// CONTEST_WINNER_ARTIST is for the winner of the most recent contest, and is not saved.
+#define CONTEST_WINNER_ARTIST 0
#define CONTEST_WINNER_HALL_1 1
#define CONTEST_WINNER_HALL_2 2
#define CONTEST_WINNER_HALL_3 3
@@ -30,8 +33,8 @@
#define CONTEST_WINNER_HALL_5 5
#define CONTEST_WINNER_HALL_6 6
#define NUM_CONTEST_HALL_WINNERS 6
-#define CONTEST_WINNER_7 7
-#define CONTEST_WINNER_8 8
+#define CONTEST_WINNER_HALL_UNUSED_1 7 // These two have data for gDefaultContestWinners
+#define CONTEST_WINNER_HALL_UNUSED_2 8 // but there are only 6 paintings in the Contest Hall
#define CONTEST_WINNER_MUSEUM_COOL 9
#define CONTEST_WINNER_MUSEUM_BEAUTY 10
#define CONTEST_WINNER_MUSEUM_CUTE 11
@@ -39,6 +42,14 @@
#define CONTEST_WINNER_MUSEUM_TOUGH 13
// NUM_CONTEST_WINNERS in constants/global.h
+#define MUSEUM_CONTEST_WINNERS_START (CONTEST_WINNER_MUSEUM_COOL - 1)
+
+#define CONTEST_SAVE_FOR_MUSEUM ((u8)-1)
+#define CONTEST_SAVE_FOR_ARTIST ((u8)-2)
+
+// The number of possible captions for a Contest painting, per category
+#define NUM_PAINTING_CAPTIONS 3
+
#define CANT_ENTER_CONTEST 0
#define CAN_ENTER_CONTEST_EQUAL_RANK 1
#define CAN_ENTER_CONTEST_HIGH_RANK 2
diff --git a/include/constants/easy_chat.h b/include/constants/easy_chat.h
index 069f17fcb..f98cedbb7 100644
--- a/include/constants/easy_chat.h
+++ b/include/constants/easy_chat.h
@@ -9,7 +9,7 @@
#define EASY_CHAT_TYPE_INTERVIEW 5
#define EASY_CHAT_TYPE_BARD_SONG 6
#define EASY_CHAT_TYPE_FAN_CLUB 7
-#define EASY_CHAT_TYPE_UNK_8 8
+#define EASY_CHAT_TYPE_DUMMY_SHOW 8
#define EASY_CHAT_TYPE_TRENDY_PHRASE 9
#define EASY_CHAT_TYPE_GABBY_AND_TY 10
#define EASY_CHAT_TYPE_CONTEST_INTERVIEW 11
diff --git a/include/constants/map_groups.h b/include/constants/map_groups.h
index c650600e8..eaf40a525 100755
--- a/include/constants/map_groups.h
+++ b/include/constants/map_groups.h
@@ -5,7 +5,7 @@
// DO NOT MODIFY THIS FILE! It is auto-generated from data/maps/map_groups.json
//
-// Map Group 0
+// gMapGroup_TownsAndRoutes
#define MAP_PETALBURG_CITY (0 | (0 << 8))
#define MAP_SLATEPORT_CITY (1 | (0 << 8))
#define MAP_MAUVILLE_CITY (2 | (0 << 8))
@@ -64,21 +64,21 @@
#define MAP_UNDERWATER_ROUTE105 (55 | (0 << 8))
#define MAP_UNDERWATER_ROUTE125 (56 | (0 << 8))
-// Map Group 1
+// gMapGroup_IndoorLittleroot
#define MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F (0 | (1 << 8))
#define MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F (1 | (1 << 8))
#define MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F (2 | (1 << 8))
#define MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F (3 | (1 << 8))
#define MAP_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB (4 | (1 << 8))
-// Map Group 2
+// gMapGroup_IndoorOldale
#define MAP_OLDALE_TOWN_HOUSE1 (0 | (2 << 8))
#define MAP_OLDALE_TOWN_HOUSE2 (1 | (2 << 8))
#define MAP_OLDALE_TOWN_POKEMON_CENTER_1F (2 | (2 << 8))
#define MAP_OLDALE_TOWN_POKEMON_CENTER_2F (3 | (2 << 8))
#define MAP_OLDALE_TOWN_MART (4 | (2 << 8))
-// Map Group 3
+// gMapGroup_IndoorDewford
#define MAP_DEWFORD_TOWN_HOUSE1 (0 | (3 << 8))
#define MAP_DEWFORD_TOWN_POKEMON_CENTER_1F (1 | (3 << 8))
#define MAP_DEWFORD_TOWN_POKEMON_CENTER_2F (2 | (3 << 8))
@@ -86,7 +86,7 @@
#define MAP_DEWFORD_TOWN_HALL (4 | (3 << 8))
#define MAP_DEWFORD_TOWN_HOUSE2 (5 | (3 << 8))
-// Map Group 4
+// gMapGroup_IndoorLavaridge
#define MAP_LAVARIDGE_TOWN_HERB_SHOP (0 | (4 << 8))
#define MAP_LAVARIDGE_TOWN_GYM_1F (1 | (4 << 8))
#define MAP_LAVARIDGE_TOWN_GYM_B1F (2 | (4 << 8))
@@ -95,7 +95,7 @@
#define MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F (5 | (4 << 8))
#define MAP_LAVARIDGE_TOWN_POKEMON_CENTER_2F (6 | (4 << 8))
-// Map Group 5
+// gMapGroup_IndoorFallarbor
#define MAP_FALLARBOR_TOWN_MART (0 | (5 << 8))
#define MAP_FALLARBOR_TOWN_BATTLE_TENT_LOBBY (1 | (5 << 8))
#define MAP_FALLARBOR_TOWN_BATTLE_TENT_CORRIDOR (2 | (5 << 8))
@@ -105,7 +105,7 @@
#define MAP_FALLARBOR_TOWN_COZMOS_HOUSE (6 | (5 << 8))
#define MAP_FALLARBOR_TOWN_MOVE_RELEARNERS_HOUSE (7 | (5 << 8))
-// Map Group 6
+// gMapGroup_IndoorVerdanturf
#define MAP_VERDANTURF_TOWN_BATTLE_TENT_LOBBY (0 | (6 << 8))
#define MAP_VERDANTURF_TOWN_BATTLE_TENT_CORRIDOR (1 | (6 << 8))
#define MAP_VERDANTURF_TOWN_BATTLE_TENT_BATTLE_ROOM (2 | (6 << 8))
@@ -116,7 +116,7 @@
#define MAP_VERDANTURF_TOWN_FRIENDSHIP_RATERS_HOUSE (7 | (6 << 8))
#define MAP_VERDANTURF_TOWN_HOUSE (8 | (6 << 8))
-// Map Group 7
+// gMapGroup_IndoorPacifidlog
#define MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F (0 | (7 << 8))
#define MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_2F (1 | (7 << 8))
#define MAP_PACIFIDLOG_TOWN_HOUSE1 (2 | (7 << 8))
@@ -125,7 +125,7 @@
#define MAP_PACIFIDLOG_TOWN_HOUSE4 (5 | (7 << 8))
#define MAP_PACIFIDLOG_TOWN_HOUSE5 (6 | (7 << 8))
-// Map Group 8
+// gMapGroup_IndoorPetalburg
#define MAP_PETALBURG_CITY_WALLYS_HOUSE (0 | (8 << 8))
#define MAP_PETALBURG_CITY_GYM (1 | (8 << 8))
#define MAP_PETALBURG_CITY_HOUSE1 (2 | (8 << 8))
@@ -134,7 +134,7 @@
#define MAP_PETALBURG_CITY_POKEMON_CENTER_2F (5 | (8 << 8))
#define MAP_PETALBURG_CITY_MART (6 | (8 << 8))
-// Map Group 9
+// gMapGroup_IndoorSlateport
#define MAP_SLATEPORT_CITY_STERNS_SHIPYARD_1F (0 | (9 << 8))
#define MAP_SLATEPORT_CITY_STERNS_SHIPYARD_2F (1 | (9 << 8))
#define MAP_SLATEPORT_CITY_BATTLE_TENT_LOBBY (2 | (9 << 8))
@@ -150,7 +150,7 @@
#define MAP_SLATEPORT_CITY_POKEMON_CENTER_2F (12 | (9 << 8))
#define MAP_SLATEPORT_CITY_MART (13 | (9 << 8))
-// Map Group 10
+// gMapGroup_IndoorMauville
#define MAP_MAUVILLE_CITY_GYM (0 | (10 << 8))
#define MAP_MAUVILLE_CITY_BIKE_SHOP (1 | (10 << 8))
#define MAP_MAUVILLE_CITY_HOUSE1 (2 | (10 << 8))
@@ -160,7 +160,7 @@
#define MAP_MAUVILLE_CITY_POKEMON_CENTER_2F (6 | (10 << 8))
#define MAP_MAUVILLE_CITY_MART (7 | (10 << 8))
-// Map Group 11
+// gMapGroup_IndoorRustboro
#define MAP_RUSTBORO_CITY_DEVON_CORP_1F (0 | (11 << 8))
#define MAP_RUSTBORO_CITY_DEVON_CORP_2F (1 | (11 << 8))
#define MAP_RUSTBORO_CITY_DEVON_CORP_3F (2 | (11 << 8))
@@ -179,7 +179,7 @@
#define MAP_RUSTBORO_CITY_FLAT2_3F (15 | (11 << 8))
#define MAP_RUSTBORO_CITY_HOUSE3 (16 | (11 << 8))
-// Map Group 12
+// gMapGroup_IndoorFortree
#define MAP_FORTREE_CITY_HOUSE1 (0 | (12 << 8))
#define MAP_FORTREE_CITY_GYM (1 | (12 << 8))
#define MAP_FORTREE_CITY_POKEMON_CENTER_1F (2 | (12 << 8))
@@ -191,7 +191,7 @@
#define MAP_FORTREE_CITY_HOUSE5 (8 | (12 << 8))
#define MAP_FORTREE_CITY_DECORATION_SHOP (9 | (12 << 8))
-// Map Group 13
+// gMapGroup_IndoorLilycove
#define MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F (0 | (13 << 8))
#define MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_2F (1 | (13 << 8))
#define MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_1F (2 | (13 << 8))
@@ -216,7 +216,7 @@
#define MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP (21 | (13 << 8))
#define MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ELEVATOR (22 | (13 << 8))
-// Map Group 14
+// gMapGroup_IndoorMossdeep
#define MAP_MOSSDEEP_CITY_GYM (0 | (14 << 8))
#define MAP_MOSSDEEP_CITY_HOUSE1 (1 | (14 << 8))
#define MAP_MOSSDEEP_CITY_HOUSE2 (2 | (14 << 8))
@@ -231,7 +231,7 @@
#define MAP_MOSSDEEP_CITY_GAME_CORNER_1F (11 | (14 << 8))
#define MAP_MOSSDEEP_CITY_GAME_CORNER_B1F (12 | (14 << 8))
-// Map Group 15
+// gMapGroup_IndoorSootopolis
#define MAP_SOOTOPOLIS_CITY_GYM_1F (0 | (15 << 8))
#define MAP_SOOTOPOLIS_CITY_GYM_B1F (1 | (15 << 8))
#define MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F (2 | (15 << 8))
@@ -248,7 +248,7 @@
#define MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F (13 | (15 << 8))
#define MAP_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_B1F (14 | (15 << 8))
-// Map Group 16
+// gMapGroup_IndoorEverGrande
#define MAP_EVER_GRANDE_CITY_SIDNEYS_ROOM (0 | (16 << 8))
#define MAP_EVER_GRANDE_CITY_PHOEBES_ROOM (1 | (16 << 8))
#define MAP_EVER_GRANDE_CITY_GLACIAS_ROOM (2 | (16 << 8))
@@ -265,33 +265,33 @@
#define MAP_EVER_GRANDE_CITY_POKEMON_CENTER_2F (13 | (16 << 8))
#define MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F (14 | (16 << 8))
-// Map Group 17
+// gMapGroup_IndoorRoute104
#define MAP_ROUTE104_MR_BRINEYS_HOUSE (0 | (17 << 8))
#define MAP_ROUTE104_PRETTY_PETAL_FLOWER_SHOP (1 | (17 << 8))
-// Map Group 18
+// gMapGroup_IndoorRoute111
#define MAP_ROUTE111_WINSTRATE_FAMILYS_HOUSE (0 | (18 << 8))
#define MAP_ROUTE111_OLD_LADYS_REST_STOP (1 | (18 << 8))
-// Map Group 19
+// gMapGroup_IndoorRoute112
#define MAP_ROUTE112_CABLE_CAR_STATION (0 | (19 << 8))
#define MAP_MT_CHIMNEY_CABLE_CAR_STATION (1 | (19 << 8))
-// Map Group 20
+// gMapGroup_IndoorRoute114
#define MAP_ROUTE114_FOSSIL_MANIACS_HOUSE (0 | (20 << 8))
#define MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL (1 | (20 << 8))
#define MAP_ROUTE114_LANETTES_HOUSE (2 | (20 << 8))
-// Map Group 21
+// gMapGroup_IndoorRoute116
#define MAP_ROUTE116_TUNNELERS_REST_HOUSE (0 | (21 << 8))
-// Map Group 22
+// gMapGroup_IndoorRoute117
#define MAP_ROUTE117_POKEMON_DAY_CARE (0 | (22 << 8))
-// Map Group 23
+// gMapGroup_IndoorRoute121
#define MAP_ROUTE121_SAFARI_ZONE_ENTRANCE (0 | (23 << 8))
-// Map Group 24
+// gMapGroup_Dungeons
#define MAP_METEOR_FALLS_1F_1R (0 | (24 << 8))
#define MAP_METEOR_FALLS_1F_2R (1 | (24 << 8))
#define MAP_METEOR_FALLS_B1F_1R (2 | (24 << 8))
@@ -401,7 +401,7 @@
#define MAP_ALTERING_CAVE (106 | (24 << 8))
#define MAP_METEOR_FALLS_STEVENS_CAVE (107 | (24 << 8))
-// Map Group 25
+// gMapGroup_IndoorDynamic
#define MAP_SECRET_BASE_RED_CAVE1 (0 | (25 << 8))
#define MAP_SECRET_BASE_BROWN_CAVE1 (1 | (25 << 8))
#define MAP_SECRET_BASE_BLUE_CAVE1 (2 | (25 << 8))
@@ -464,7 +464,7 @@
#define MAP_BATTLE_PYRAMID_SQUARE16 (59 | (25 << 8))
#define MAP_UNION_ROOM (60 | (25 << 8))
-// Map Group 26
+// gMapGroup_SpecialArea
#define MAP_SAFARI_ZONE_NORTHWEST (0 | (26 << 8))
#define MAP_SAFARI_ZONE_NORTH (1 | (26 << 8))
#define MAP_SAFARI_ZONE_SOUTHWEST (2 | (26 << 8))
@@ -555,14 +555,14 @@
#define MAP_NAVEL_ROCK_BOTTOM (87 | (26 << 8))
#define MAP_TRAINER_HILL_ELEVATOR (88 | (26 << 8))
-// Map Group 27
+// gMapGroup_IndoorRoute104Prototype
#define MAP_ROUTE104_PROTOTYPE (0 | (27 << 8))
#define MAP_ROUTE104_PROTOTYPE_PRETTY_PETAL_FLOWER_SHOP (1 | (27 << 8))
-// Map Group 28
+// gMapGroup_IndoorRoute109
#define MAP_ROUTE109_SEASHORE_HOUSE (0 | (28 << 8))
-// Map Group 29
+// gMapGroup_IndoorRoute110
#define MAP_ROUTE110_TRICK_HOUSE_ENTRANCE (0 | (29 << 8))
#define MAP_ROUTE110_TRICK_HOUSE_END (1 | (29 << 8))
#define MAP_ROUTE110_TRICK_HOUSE_CORRIDOR (2 | (29 << 8))
@@ -577,18 +577,18 @@
#define MAP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE (11 | (29 << 8))
#define MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE (12 | (29 << 8))
-// Map Group 30
+// gMapGroup_IndoorRoute113
#define MAP_ROUTE113_GLASS_WORKSHOP (0 | (30 << 8))
-// Map Group 31
+// gMapGroup_IndoorRoute123
#define MAP_ROUTE123_BERRY_MASTERS_HOUSE (0 | (31 << 8))
-// Map Group 32
+// gMapGroup_IndoorRoute119
#define MAP_ROUTE119_WEATHER_INSTITUTE_1F (0 | (32 << 8))
#define MAP_ROUTE119_WEATHER_INSTITUTE_2F (1 | (32 << 8))
#define MAP_ROUTE119_HOUSE (2 | (32 << 8))
-// Map Group 33
+// gMapGroup_IndoorRoute124
#define MAP_ROUTE124_DIVING_TREASURE_HUNTERS_HOUSE (0 | (33 << 8))
#define MAP_GROUPS_COUNT 34
diff --git a/include/constants/metatile_labels.h b/include/constants/metatile_labels.h
index 836ab6ef2..b5ef69046 100644
--- a/include/constants/metatile_labels.h
+++ b/include/constants/metatile_labels.h
@@ -42,6 +42,8 @@
#define METATILE_General_BlueCaveOpen 0x1B1
// gTileset_Building
+#define METATILE_Building_TV_Off 0x002
+#define METATILE_Building_TV_On 0x003
#define METATILE_Building_PC_Off 0x004
#define METATILE_Building_PC_On 0x005
diff --git a/include/constants/trainer_hill.h b/include/constants/trainer_hill.h
index 27357e99c..0e802bba8 100644
--- a/include/constants/trainer_hill.h
+++ b/include/constants/trainer_hill.h
@@ -37,8 +37,9 @@
#define TRAINER_HILL_TEXT_PLAYER_WON 4
#define TRAINER_HILL_TEXT_AFTER 5
-#define NUM_TRAINER_HILL_TRAINERS (NUM_TRAINER_HILL_FLOORS * 2)
-#define NUM_TRAINER_HILL_TRAINERS_JP (NUM_TRAINER_HILL_FLOORS_JP * 2)
+#define TRAINER_HILL_TRAINERS_PER_FLOOR 2
+#define NUM_TRAINER_HILL_TRAINERS (NUM_TRAINER_HILL_FLOORS * TRAINER_HILL_TRAINERS_PER_FLOOR)
+#define NUM_TRAINER_HILL_TRAINERS_JP (NUM_TRAINER_HILL_FLOORS_JP * TRAINER_HILL_TRAINERS_PER_FLOOR)
// Values returned by TrainerHillGetChallengeStatus
#define TRAINER_HILL_PLAYER_STATUS_LOST 0
diff --git a/include/constants/tv.h b/include/constants/tv.h
index f7b091f49..095a6ddca 100644
--- a/include/constants/tv.h
+++ b/include/constants/tv.h
@@ -6,12 +6,22 @@
#define POKENEWS_GAME_CORNER 2
#define POKENEWS_LILYCOVE 3
#define POKENEWS_BLENDMASTER 4
+#define NUM_POKENEWS_TYPES 4 // Excludes NONE
+
+// TV shows are categorized as being in one of 3 groups
+// - TVGROUP_NORMAL, TV shows that can appear without Record Mixing
+// - TVGROUP_RECORD_MIX, TV shows that can only appear via Record Mixing
+// - TVGROUP_OUTBREAK, just contains TVSHOW_MASS_OUTBREAK
+// Each group was allotted 20 spaces arbitrarily, though none use all 20
#define TVSHOW_OFF_AIR 0
+
+// TVGROUP_NORMAL
+#define TVGROUP_NORMAL_START 1
#define TVSHOW_FAN_CLUB_LETTER 1
#define TVSHOW_RECENT_HAPPENINGS 2
#define TVSHOW_PKMN_FAN_CLUB_OPINIONS 3
-#define TVSHOW_UNKN_SHOWTYPE_04 4
+#define TVSHOW_DUMMY 4
#define TVSHOW_NAME_RATER_SHOW 5
#define TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE 6
#define TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE 7
@@ -20,7 +30,11 @@
#define TVSHOW_BATTLE_UPDATE 10
#define TVSHOW_FAN_CLUB_SPECIAL 11
#define TVSHOW_LILYCOVE_CONTEST_LADY 12
-// //
+//
+#define TVGROUP_NORMAL_END 20
+
+// TVGROUP_RECORD_MIX
+#define TVGROUP_RECORD_MIX_START 21
#define TVSHOW_POKEMON_TODAY_CAUGHT 21
#define TVSHOW_SMART_SHOPPER 22
#define TVSHOW_POKEMON_TODAY_FAILED 23
@@ -40,8 +54,22 @@
#define TVSHOW_NUMBER_ONE 37
#define TVSHOW_SECRET_BASE_SECRETS 38
#define TVSHOW_SAFARI_FAN_CLUB 39
-// //
-#define TVSHOW_MASS_OUTBREAK 41
+#define TVGROUP_RECORD_MIX_END 40
+
+// TVGROUP_OUTBREAK
+#define TVGROUP_OUTBREAK_START 41
+#define TVSHOW_MASS_OUTBREAK 41
+//
+#define TVGROUP_OUTBREAK_END 60
+
+// The first 5 elements of gSaveBlock1Ptr->tvShows are reserved
+// for TV shows from TVGROUP_NORMAL. The remainder are for TV
+// shows from TVGROUP_RECORD_MIX.
+#define NUM_NORMAL_TVSHOW_SLOTS 5
+
+#define PLAYERS_HOUSE_TV_NONE 0
+#define PLAYERS_HOUSE_TV_LATI 1
+#define PLAYERS_HOUSE_TV_MOVIE 2
// Number of ribbons to put Spot the Cuties on air
#define NUM_CUTIES_RIBBONS 4
@@ -221,4 +249,21 @@
#define CONTESTLADYLIVE_STATE_LOST 2
#define CONTESTLADYLIVE_STATE_LOST_BADLY 3
+// TV Show states for Smart Shopper
+#define SMARTSHOPPER_STATE_INTRO 0
+#define SMARTSHOPPER_STATE_CLERK_NORMAL 1
+#define SMARTSHOPPER_STATE_RAND_COMMENT_1 2
+#define SMARTSHOPPER_STATE_RAND_COMMENT_2 3
+#define SMARTSHOPPER_STATE_RAND_COMMENT_3 4
+#define SMARTSHOPPER_STATE_RAND_COMMENT_4 5
+#define SMARTSHOPPER_STATE_SECOND_ITEM 6
+#define SMARTSHOPPER_STATE_THIRD_ITEM 7
+#define SMARTSHOPPER_STATE_DURING_SALE 8
+#define SMARTSHOPPER_STATE_OUTRO_NORMAL 9
+#define SMARTSHOPPER_STATE_IS_VIP 10
+#define SMARTSHOPPER_STATE_CLERK_MAX 11
+#define SMARTSHOPPER_STATE_OUTRO_MAX 12
+
+#define SMARTSHOPPER_NUM_ITEMS 3
+
#endif //GUARD_CONSTANTS_TV_H
diff --git a/include/contest.h b/include/contest.h
index 1dd4340bd..9bac63eda 100644
--- a/include/contest.h
+++ b/include/contest.h
@@ -111,11 +111,11 @@ struct ContestPokemon
u32 otId;
};
-struct Shared1A004
+struct ContestTempSave
{
u16 cachedWindowPalettes[16][16]; // Saved palette data before a move happens?
- u16 unk18204[PLTT_BUFFER_SIZE]; // Saved copy of gPlttBufferUnfaded
- u16 unk18604[PLTT_BUFFER_SIZE]; // Saved copy of gPlttBufferFaded
+ u16 cachedPlttBufferUnfaded[PLTT_BUFFER_SIZE];
+ u16 cachedPlttBufferFaded[PLTT_BUFFER_SIZE];
u8 savedJunk[0x800];
};
@@ -306,7 +306,7 @@ struct ContestResources
#define eUnzippedContestAudience_Gfx (gHeap + 0x18000)
#define eContestAudienceFrame2_Gfx (gHeap + 0x19000)
#define eContestDebugMode (gHeap[0x1a000])
-#define eUnknownHeap1A004 (*(struct Shared1A004 *)(gHeap + 0x1a004))
+#define eContestTempSave (*(struct ContestTempSave *)(gHeap + 0x1a004))
extern struct ContestPokemon gContestMons[CONTESTANT_COUNT];
extern s16 gContestMonRound1Points[CONTESTANT_COUNT];
@@ -326,8 +326,8 @@ extern u8 gHighestRibbonRank;
extern struct ContestResources *gContestResources;
extern u8 sContestBgCopyFlags;
extern struct ContestWinner gCurContestWinner;
-extern u8 gUnknown_02039F5C;
-extern u8 gUnknown_02039F5D;
+extern u8 gCurContestWinnerIsForArtist;
+extern u8 gCurContestWinnerSaveIdx;
extern u32 gContestRngValue;
// contest.c
@@ -351,8 +351,8 @@ s8 Contest_GetMoveExcitement(u16 move);
bool8 IsContestantAllowedToCombo(u8 contestant);
void Contest_PrintTextToBg0WindowAt(u32 windowId, u8 *currChar, s32 x, s32 y, s32 fontId);
void ResetContestLinkResults(void);
-bool8 sub_80DEDA8(u8 a);
-u8 sub_80DEFA8(u8 a, u8 b);
+bool8 SaveContestWinner(u8 rank);
+u8 GetContestWinnerSaveIdx(u8 rank, bool8 shift);
void ClearContestWinnerPicsInContestHall(void);
void StripPlayerAndMonNamesForLinkContest(struct ContestPokemon *mon, s32 language);
diff --git a/include/contest_util.h b/include/contest_util.h
index 76f9ae522..1e97d91d3 100644
--- a/include/contest_util.h
+++ b/include/contest_util.h
@@ -7,8 +7,8 @@ void StartContest(void);
void BufferContestantMonSpecies(void);
void ShowContestResults(void);
void ContestLinkTransfer(u8);
-void ShowContestWinnerPainting(void);
+void ShowContestPainting(void);
u16 GetContestRand(void);
-u8 CountPlayerContestPaintings(void);
+u8 CountPlayerMuseumPaintings(void);
#endif // GUARD_CONTEST_UTIL_H
diff --git a/include/data.h b/include/data.h
index 2f8c44746..f94f55a8f 100644
--- a/include/data.h
+++ b/include/data.h
@@ -5,6 +5,12 @@
#define SPECIES_SHINY_TAG 500
+enum {
+ BATTLER_AFFINE_NORMAL,
+ BATTLER_AFFINE_EMERGE,
+ BATTLER_AFFINE_RETURN,
+};
+
struct MonCoords
{
// This would use a bitfield, but some function
@@ -87,9 +93,9 @@ extern const struct SpriteFrameImage gTrainerBackPicTable_Steven[];
extern const union AffineAnimCmd *const gAffineAnims_BattleSpritePlayerSide[];
extern const union AffineAnimCmd *const gAffineAnims_BattleSpriteOpponentSide[];
-extern const union AffineAnimCmd *const gUnknown_082FF6C0[];
+extern const union AffineAnimCmd *const gAffineAnims_BattleSpriteContest[];
-extern const union AnimCmd *const gUnknown_082FF70C[];
+extern const union AnimCmd *const gAnims_MonPic[];
extern const struct MonCoords gMonFrontPicCoords[];
extern const struct CompressedSpriteSheet gMonStillFrontPicTable[];
extern const struct MonCoords gMonBackPicCoords[];
diff --git a/include/daycare.h b/include/daycare.h
index 7d6f2fb19..d6c0d4201 100644
--- a/include/daycare.h
+++ b/include/daycare.h
@@ -6,7 +6,7 @@
u8 *GetMonNickname2(struct Pokemon *mon, u8 *dest);
u8 *GetBoxMonNickname(struct BoxPokemon *mon, u8 *dest);
u8 CountPokemonInDaycare(struct DayCare *daycare);
-void InitDaycareMailRecordMixing(struct DayCare *daycare, struct RecordMixingDayCareMail *daycareMail);
+void InitDaycareMailRecordMixing(struct DayCare *daycare, struct RecordMixingDaycareMail *daycareMail);
void StoreSelectedPokemonInDaycare(void);
u16 TakePokemonFromDaycare(void);
void GetDaycareCost(void);
diff --git a/include/ereader_helpers.h b/include/ereader_helpers.h
index 8dc3b907a..064b61ed7 100755
--- a/include/ereader_helpers.h
+++ b/include/ereader_helpers.h
@@ -5,30 +5,30 @@
struct EReaderTrainerHillTrainer
{
- u8 unk0;
- struct TrainerHillTrainer unk4;
- struct TrHillDisplay unk14C;
+ u8 trainerNum;
+ struct TrainerHillTrainer trainer;
+ struct TrHillDisplay display;
u32 checksum;
}; // size=0x274
struct EReaderTrainerHillSet
{
- u8 count;
+ u8 numTrainers;
u8 id;
- u16 dummy;
+ u16 dummy; // Only read in an assert.
u32 checksum;
- struct EReaderTrainerHillTrainer unk_8[6];
+ struct EReaderTrainerHillTrainer trainers[6];
u8 unk_ec0[40];
}; // size = 0xf00
-bool8 EReader_IsReceivedDataValid(struct EReaderTrainerHillSet *buffer);
-bool32 TryWriteTrainerHill(struct EReaderTrainerHillSet *arg0);
+bool8 ValidateTrainerHillData(struct EReaderTrainerHillSet *);
+bool32 TryWriteTrainerHill(struct EReaderTrainerHillSet *);
bool32 ReadTrainerHillAndValidate(void);
-int EReaderHandleTransfer(u8, u32, u32*, u32*);
-void sub_81D3F9C(void);
-void sub_81D3FAC(void);
+int EReaderHandleTransfer(u8, size_t, const void *, void *);
+void EReaderHelper_Timer3Callback(void);
+void EReaderHelper_SerialCallback(void);
void EReaderHelper_SaveRegsState(void);
void EReaderHelper_RestoreRegsState(void);
-void sub_81D4238(void);
+void EReaderHelper_ClearSendRecvMgr(void);
#endif // GUARD_EREADER_HELPERS_H
diff --git a/include/event_object_lock.h b/include/event_object_lock.h
index 9d31a25fd..0b1f5f098 100644
--- a/include/event_object_lock.h
+++ b/include/event_object_lock.h
@@ -2,9 +2,9 @@
#define GUARD_EVENT_OBJECT_LOCK_H
bool8 IsFreezePlayerFinished(void);
-void ScriptFreezeObjectEvents(void);
bool8 IsFreezeSelectedObjectAndPlayerFinished(void);
-void LockSelectedObjectEvent(void);
+void FreezeObjects_WaitForPlayer(void);
+void FreezeObjects_WaitForPlayerAndSelected(void);
void FreezeForApproachingTrainers(void);
bool8 IsFreezeObjectAndPlayerFinished(void);
void ScriptUnfreezeObjectEvents(void);
diff --git a/include/event_scripts.h b/include/event_scripts.h
index 925b4389d..3340da6f5 100644
--- a/include/event_scripts.h
+++ b/include/event_scripts.h
@@ -108,19 +108,19 @@ extern const u8 gTVPokemonTodaySuccessfulText08[];
extern const u8 gTVPokemonTodaySuccessfulText09[];
extern const u8 gTVPokemonTodaySuccessfulText10[];
extern const u8 gTVPokemonTodaySuccessfulText11[];
-extern const u8 gTVTodaysSmartShopperText00[];
-extern const u8 gTVTodaysSmartShopperText01[];
-extern const u8 gTVTodaysSmartShopperText02[];
-extern const u8 gTVTodaysSmartShopperText03[];
-extern const u8 gTVTodaysSmartShopperText04[];
-extern const u8 gTVTodaysSmartShopperText05[];
-extern const u8 gTVTodaysSmartShopperText06[];
-extern const u8 gTVTodaysSmartShopperText07[];
-extern const u8 gTVTodaysSmartShopperText08[];
-extern const u8 gTVTodaysSmartShopperText09[];
-extern const u8 gTVTodaysSmartShopperText10[];
-extern const u8 gTVTodaysSmartShopperText11[];
-extern const u8 gTVTodaysSmartShopperText12[];
+extern const u8 SmartShopper_Text_Intro[];
+extern const u8 SmartShopper_Text_ClerkNormal[];
+extern const u8 SmartShopper_Text_RandomComment1[];
+extern const u8 SmartShopper_Text_RandomComment2[];
+extern const u8 SmartShopper_Text_RandomComment3[];
+extern const u8 SmartShopper_Text_RandomComment4[];
+extern const u8 SmartShopper_Text_SecondItem[];
+extern const u8 SmartShopper_Text_ThirdItem[];
+extern const u8 SmartShopper_Text_DuringSale[];
+extern const u8 SmartShopper_Text_OutroNormal[];
+extern const u8 SmartShopper_Text_IsVIP[];
+extern const u8 SmartShopper_Text_ClerkMax[];
+extern const u8 SmartShopper_Text_OutroMax[];
extern const u8 gTVWorldOfMastersText00[];
extern const u8 gTVWorldOfMastersText01[];
extern const u8 gTVWorldOfMastersText02[];
diff --git a/include/gba/m4a_internal.h b/include/gba/m4a_internal.h
index 2d0e1bb1c..2ccbb18f5 100644
--- a/include/gba/m4a_internal.h
+++ b/include/gba/m4a_internal.h
@@ -447,7 +447,7 @@ void SetPokemonCryPitch(s16 val);
void SetPokemonCryLength(u16 val);
void SetPokemonCryRelease(u8 val);
void SetPokemonCryProgress(u32 val);
-int IsPokemonCryPlaying(struct MusicPlayerInfo *mplayInfo);
+bool32 IsPokemonCryPlaying(struct MusicPlayerInfo *mplayInfo);
void SetPokemonCryChorus(s8 val);
void SetPokemonCryStereo(u32 val);
void SetPokemonCryPriority(u8 val);
diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h
index a3d99ee21..6bafa9747 100644
--- a/include/global.fieldmap.h
+++ b/include/global.fieldmap.h
@@ -142,19 +142,15 @@ struct MapHeader
/* 0x16 */ u8 weather;
/* 0x17 */ u8 mapType;
/* 0x18 */ u8 filler_18[2];
- /* 0x1A */ u8 flags;
+ // fields correspond to the arguments in the map_header_flags macro
+ /* 0x1A */ bool8 allowCycling:1;
+ bool8 allowEscaping:1; // Escape Rope and Dig
+ bool8 allowRunning:1;
+ bool8 showMapName:5; // the last 4 bits are unused
+ // but the 5 bit sized bitfield is required to match
/* 0x1B */ u8 battleType;
};
-// Flags for gMapHeader.flags, as defined in the map_header_flags macro
-#define MAP_ALLOW_CYCLING (1 << 0)
-#define MAP_ALLOW_ESCAPING (1 << 1) // Escape Rope and Dig
-#define MAP_ALLOW_RUNNING (1 << 2)
-#define MAP_SHOW_MAP_NAME (1 << 3)
-#define UNUSED_MAP_FLAGS (1 << 4 | 1 << 5 | 1 << 6 | 1 << 7)
-
-#define SHOW_MAP_NAME_ENABLED ((gMapHeader.flags & (MAP_SHOW_MAP_NAME | UNUSED_MAP_FLAGS)) == MAP_SHOW_MAP_NAME)
-
struct ObjectEvent
{
diff --git a/include/global.h b/include/global.h
index 19605ca57..e4c11f9ef 100644
--- a/include/global.h
+++ b/include/global.h
@@ -727,7 +727,7 @@ struct ContestWinner
u8 contestRank;
};
-struct DayCareMail
+struct DaycareMail
{
struct MailStruct message;
u8 OT_name[PLAYER_NAME_LENGTH + 1];
@@ -739,7 +739,7 @@ struct DayCareMail
struct DaycareMon
{
struct BoxPokemon mon;
- struct DayCareMail mail;
+ struct DaycareMail mail;
u32 steps;
};
@@ -750,9 +750,9 @@ struct DayCare
u8 stepCounter;
};
-struct RecordMixingDayCareMail
+struct RecordMixingDaycareMail
{
- struct DayCareMail mail[DAYCARE_MON_COUNT];
+ struct DaycareMail mail[DAYCARE_MON_COUNT];
u32 numDaycareMons;
bool16 holdsItem[DAYCARE_MON_COUNT];
};
diff --git a/include/global.tv.h b/include/global.tv.h
index 64e6a984e..2bc7dda99 100644
--- a/include/global.tv.h
+++ b/include/global.tv.h
@@ -1,13 +1,15 @@
#ifndef GUARD_GLOBAL_TV_H
#define GUARD_GLOBAL_TV_H
+#include "constants/tv.h"
+
typedef union // size = 0x24
{
// Common
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
- /*0x02*/ u8 pad02[26];
+ /*0x02*/ u8 data[26];
/*0x1C*/ u8 srcTrainerId3Lo;
/*0x1D*/ u8 srcTrainerId3Hi;
/*0x1E*/ u8 srcTrainerId2Lo;
@@ -22,7 +24,7 @@ typedef union // size = 0x24
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
- /*0x02*/ u8 pad02[34];
+ /*0x02*/ u8 data[34];
} commonInit;
// Local shows
@@ -40,7 +42,7 @@ typedef union // size = 0x24
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
- /*0x02*/ u16 var02;
+ /*0x02*/ u16 species;
/*0x04*/ u16 words[6];
/*0x10*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
/*0x18*/ u8 language;
@@ -62,16 +64,16 @@ typedef union // size = 0x24
/*0x1C*/ u16 words[4];
} fanclubOpinions;
- // TVSHOW_UNKN_SHOWTYPE_04 (dummied out)
+ // TVSHOW_DUMMY
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u16 words[2];
- /*0x06*/ u16 var06;
+ /*0x06*/ u16 species;
/*0x08*/ u8 pad_08[3];
- /*0x0b*/ u8 string_0b[12];
+ /*0x0b*/ u8 name[12];
/*0x17*/ u8 language;
- } unkShow04;
+ } dummy;
// TVSHOW_NAME_RATER_SHOW
struct {
@@ -212,8 +214,8 @@ typedef union // size = 0x24
/*0x02*/ u8 priceReduced;
/*0x03*/ u8 language;
/*0x04*/ u8 pad04[2];
- /*0x06*/ u16 itemIds[3];
- /*0x0C*/ u16 itemAmounts[3];
+ /*0x06*/ u16 itemIds[SMARTSHOPPER_NUM_ITEMS];
+ /*0x0C*/ u16 itemAmounts[SMARTSHOPPER_NUM_ITEMS];
/*0x12*/ u8 shopLocation;
/*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
} smartshopperShow;
@@ -401,7 +403,7 @@ typedef union // size = 0x24
/*0x08*/ u16 species3;
/*0x0a*/ u16 species4;
/*0x0c*/ u8 language;
- /*0x0d*/ u8 facility;
+ /*0x0d*/ u8 facilityAndMode;
/*0x0e*/ u8 filler_0e[5];
/*0x13*/ u8 playerName[PLAYER_NAME_LENGTH + 1];
} frontier;
diff --git a/include/graphics.h b/include/graphics.h
index 5a180ad2f..1f40cda01 100644
--- a/include/graphics.h
+++ b/include/graphics.h
@@ -4924,21 +4924,21 @@ extern const u32 gRouletteMultiplier_Gfx[];
// Contest util
extern const u32 gContestResults_Gfx[];
-extern const u32 gUnknown_08C19EEC[];
-extern const u32 gUnknown_08C1A000[];
-extern const u32 gUnknown_08C1A12C[];
+extern const u32 gContestResults_WinnerBanner_Tilemap[];
+extern const u32 gContestResults_Interface_Tilemap[];
+extern const u32 gContestResults_Bg_Tilemap[];
extern const u32 gContestResults_Pal[];
-extern const u16 gLinkContestResults_Tilemap[];
-extern const u16 gNormalContestResults_Tilemap[];
-extern const u16 gSuperContestResults_Tilemap[];
-extern const u16 gHyperContestResults_Tilemap[];
-extern const u16 gMasterContestResults_Tilemap[];
-extern const u16 gCoolContestResults_Tilemap[];
-extern const u16 gBeautyContestResults_Tilemap[];
-extern const u16 gCuteContestResults_Tilemap[];
-extern const u16 gSmartContestResults_Tilemap[];
-extern const u16 gToughContestResults_Tilemap[];
-extern const u16 gContestResults_Tilemap[];
+extern const u16 gContestResultsTitle_Link_Tilemap[];
+extern const u16 gContestResultsTitle_Normal_Tilemap[];
+extern const u16 gContestResultsTitle_Super_Tilemap[];
+extern const u16 gContestResultsTitle_Hyper_Tilemap[];
+extern const u16 gContestResultsTitle_Master_Tilemap[];
+extern const u16 gContestResultsTitle_Cool_Tilemap[];
+extern const u16 gContestResultsTitle_Beauty_Tilemap[];
+extern const u16 gContestResultsTitle_Cute_Tilemap[];
+extern const u16 gContestResultsTitle_Smart_Tilemap[];
+extern const u16 gContestResultsTitle_Tough_Tilemap[];
+extern const u16 gContestResultsTitle_Tilemap[];
// Trainer Card.
extern const u16 gHoennTrainerCard0Star_Pal[];
diff --git a/include/international_string_util.h b/include/international_string_util.h
index f76fc5be1..fe7e85b41 100644
--- a/include/international_string_util.h
+++ b/include/international_string_util.h
@@ -17,7 +17,7 @@ void CopyMonCategoryText(int dexNum, u8 *dest);
u8 *sub_81DB494(u8 *str, int fontId, const u8 *str2, int totalStringWidth);
void PadNameString(u8 *dest, u8 padChar);
void ConvertInternationalPlayerNameStripChar(u8 *, u8);
-void sub_81DB5AC(u8 *);
+void ConvertInternationalContestantName(u8 *);
int sub_81DB604(u8 *);
void sub_81DB620(int windowId, int columnStart, int rowStart, int numFillTiles, int numRows);
diff --git a/include/link.h b/include/link.h
index 3b621e6c1..407dbabb9 100644
--- a/include/link.h
+++ b/include/link.h
@@ -323,7 +323,7 @@ extern bool8 gSavedLinkPlayerCount;
extern u8 gSavedMultiplayerId;
extern struct LinkTestBGInfo gLinkTestBGInfo;
extern void (*gLinkCallback)(void);
-extern bool8 gShouldAdvanceLinkState;
+extern u8 gShouldAdvanceLinkState;
extern u16 gLinkTestBlockChecksums[MAX_LINK_PLAYERS];
extern u8 gBlockRequestType;
extern u8 gLastSendQueueCount;
diff --git a/include/list_menu.h b/include/list_menu.h
index 0a54a069a..1c18f3dff 100644
--- a/include/list_menu.h
+++ b/include/list_menu.h
@@ -31,7 +31,7 @@ struct ListMenuTemplate
{
const struct ListMenuItem *items;
void (* moveCursorFunc)(s32 itemIndex, bool8 onInit, struct ListMenu *list);
- void (* itemPrintFunc)(u8 windowId, s32 itemId, u8 y);
+ void (* itemPrintFunc)(u8 windowId, u32 itemId, u8 y);
u16 totalItems;
u16 maxShowed;
u8 windowId;
diff --git a/include/mauville_old_man.h b/include/mauville_old_man.h
index 29c66a992..603d585da 100644
--- a/include/mauville_old_man.h
+++ b/include/mauville_old_man.h
@@ -7,7 +7,7 @@ void SetMauvilleOldMan(void);
u8 GetCurrentMauvilleOldMan(void);
void ScrSpecial_SetMauvilleOldManObjEventGfx(void);
u8 sub_81201C8(void);
-void sub_8120B70(OldMan *dest);
+void SanitizeMauvilleOldManForRuby(OldMan *dest);
void sub_8120670(void);
void SanitizeReceivedRubyOldMan(union OldMan * oldMan, u32 r1, u32 r6);
void SanitizeReceivedEmeraldOldMan(union OldMan * oldMan, u32 unused, u32 a2);
diff --git a/include/menu.h b/include/menu.h
index c9d8e374d..07e00eb73 100644
--- a/include/menu.h
+++ b/include/menu.h
@@ -90,8 +90,8 @@ void *malloc_and_decompress(const void *src, u32 *sizeOut);
u16 copy_decompressed_tile_data_to_vram(u8 bgId, const void *src, u16 size, u16 offset, u8 mode);
void AddTextPrinterForMessage(bool8 allowSkippingDelayWithButtonPress);
void AddItemMenuActionTextPrinters(u8 windowId, u8 fontId, u8 left, u8 top, u8 letterSpacing, u8 lineHeight, u8 itemCount, const struct MenuAction *strs, const u8 *a8);
-void sub_8198DBC(u8 windowId, u8 fontId, u8 left, u8 top, u8 a4, u8 itemCount, u8 itemCount2, const struct MenuAction *strs, const u8 *a8);
-u8 sub_8199944(u8 windowId, u8 optionWidth, u8 columns, u8 rows, u8 initialCursorPos);
+void PrintMenuActionGrid(u8 windowId, u8 fontId, u8 left, u8 top, u8 a4, u8 itemCount, u8 itemCount2, const struct MenuAction *strs, const u8 *a8);
+u8 InitMenuActionGrid(u8 windowId, u8 optionWidth, u8 columns, u8 rows, u8 initialCursorPos);
u8 ChangeListMenuCursorPosition(s8 deltaX, s8 deltaY);
u8 GetStartMenuWindowId(void);
void ListMenuLoadStdPalAt(u8, u8);
diff --git a/include/menu_helpers.h b/include/menu_helpers.h
index c4401354b..9909437a2 100644
--- a/include/menu_helpers.h
+++ b/include/menu_helpers.h
@@ -29,7 +29,7 @@ bool8 AdjustQuantityAccordingToDPadInput(s16 *arg0, u16 arg1);
u8 GetLRKeysPressed(void);
u8 GetLRKeysPressedAndHeld(void);
bool8 sub_8122148(u16 itemId);
-bool8 itemid_80BF6D8_mail_related(u16 itemId);
+bool8 IsWritingMailAllowed(u16 itemId);
bool8 MenuHelpers_LinkSomething(void);
bool8 MenuHelpers_CallLinkSomething(void);
void sub_812220C(struct ItemSlot *slots, u8 count, u8 *arg2, u8 *usedSlotsCount, u8 maxUsedSlotsCount);
diff --git a/include/pokemon.h b/include/pokemon.h
index 82cdefeac..3565bd966 100644
--- a/include/pokemon.h
+++ b/include/pokemon.h
@@ -258,7 +258,6 @@ extern const u8 gFacilityClassToPicIndex[];
extern const u8 gFacilityClassToTrainerClass[];
extern const struct BaseStats gBaseStats[];
extern const u8 *const gItemEffectTable[];
-extern const struct Evolution gEvolutionTable[][EVOS_PER_MON];
extern const u32 gExperienceTables[][MAX_LEVEL + 1];
extern const u16 *const gLevelUpLearnsets[];
extern const u8 gPPUpGetMask[];
diff --git a/include/region_map.h b/include/region_map.h
index 97364abd8..02d711afa 100644
--- a/include/region_map.h
+++ b/include/region_map.h
@@ -111,7 +111,7 @@ void PokedexAreaScreen_UpdateRegionMapVariablesAndVideoRegs(s16 x, s16 y);
void CB2_OpenFlyMap(void);
bool8 IsRegionMapZoomed(void);
void TrySetPlayerIconBlink(void);
-void sub_8123030(u16 color, u32 coeff);
+void BlendRegionMap(u16 color, u32 coeff);
void SetRegionMapDataForZoom(void);
extern const struct RegionMapLocation gRegionMapEntries[];
diff --git a/include/strings.h b/include/strings.h
index 8880f3a5c..9b3be0538 100644
--- a/include/strings.h
+++ b/include/strings.h
@@ -596,7 +596,7 @@ extern const u8 gText_TooImportantToToss[];
extern const u8 gText_ConfirmTossItems[];
extern const u8 gText_MoveVar1Where[];
-extern const u8 gText_ColorLightShadowDarkGrey[];
+extern const u8 gText_ColorLightShadowDarkGray[];
extern const u8 gText_ColorBlue[];
extern const u8 gText_Friend[];
extern const u8 gText_Tristan[];
@@ -982,7 +982,8 @@ extern const u8 gText_RibbonsVar1[];
extern const u8 gText_OneDash[];
extern const u8 gText_TwoDashes[];
-extern const u8 *const gReturnToXStringsTable2[];
+extern const u8 *const gBagMenu_ReturnToStrings[];
+extern const u8 *const gPyramidBagMenu_ReturnToStrings[];
extern const u8 gText_NumPlayerLink[];
extern const u8 gText_ConfirmLinkWhenPlayersReady[];
@@ -2511,7 +2512,7 @@ extern const u8 gText_MatchCallMay_Intro1[];
extern const u8 gText_MatchCallMay_Intro2[];
// Contest Link
-extern const u8 gText_ColorDarkGrey[];
+extern const u8 gText_ColorDarkGray[];
extern const u8 gText_CommunicationStandby[];
extern const u8 gText_AnnouncingResults[];
extern const u8 gText_PreliminaryResults[];
diff --git a/include/tv.h b/include/tv.h
index f94c5b7e5..30cd13326 100644
--- a/include/tv.h
+++ b/include/tv.h
@@ -1,13 +1,10 @@
#ifndef GUARD_TV_H
#define GUARD_TV_H
-#define SLOT_MACHINE 0
-#define ROULETTE 1
-
extern u8 *const gTVStringVarPtrs[3];
void ClearTVShowData(void);
-void sub_80EE184(void);
+void TryPutBreakingNewsOnAir(void);
void TryPutBattleSeminarOnAir(u16 foeSpecies, u16 species, u8 moveIdx, const u16 *movePtr, u16 betterMove);
void TryPutFrontierTVShowOnAir(u16 winStreak, u8 facility);
void DoTVShow(void);
@@ -23,41 +20,37 @@ void ReceiveTvShowsData(void *src, u32 size, u8 masterIdx);
void TryPutSpotTheCutiesOnAir(struct Pokemon *pokemon, u8 ribbonMonDataIdx);
u32 GetPlayerIDAsU32(void);
bool8 GetPriceReduction(u8 newsKind);
-void sub_80F14F8(TVShow *shows);
+void SanitizeTVShowLocationsForRuby(TVShow *shows);
size_t CountDigits(int value);
u8 GetRibbonCount(struct Pokemon *pokemon);
void AlertTVThatPlayerPlayedSlotMachine(u16 nCoinsSpent);
void AlertTVThatPlayerPlayedRoulette(u16 nCoinsSpent);
-void AlertTVOfNewCoinTotal(u16 nCoinsPaidOut);
+void TryPutFindThatGamerOnAir(u16 nCoinsPaidOut);
void TryPutSecretBaseSecretsOnAir(void);
void TryPutTodaysRivalTrainerOnAir(void);
void TryPutTrendWatcherOnAir(const u16 *words);
-void sub_80EDA80(void);
void ReceivePokeNewsData(void *src, u32 size, u8 masterIdx);
-void sub_80F0BB8(void);
+void DeactivateAllNormalTVShows(void);
void RecordFishingAttemptForTV(bool8 caughtFish);
void IncrementDailySlotsUses(void);
void IncrementDailyRouletteUses(void);
void IncrementDailyWildBattles(void);
void IncrementDailyBerryBlender(void);
-void sub_80F1208(TVShow *shows);
-void sub_80EE44C(u8 nMonsCaught, u8 nPkblkUsed);
-void sub_80F14F8(TVShow *shows);
-size_t sub_80EF370(int value);
+void SanitizeTVShowsForRuby(TVShow *shows);
+void TryPutSafariFanClubOnAir(u8 nMonsCaught, u8 nPkblkUsed);
bool8 Put3CheersForPokeblocksOnTheAir(const u8 *partnersName, u8 flavor, u8 unused, u8 sheen, u8 language);
void SetPokemonAnglerSpecies(u16 species);
void UpdateTVShowsPerDay(u16 days);
-void PutPokemonTodayCaughtOnAir(void);
-void TV_PutSecretBaseVisitOnTheAir(void);
+void TryPutPokemonTodayOnAir(void);
+void TryPutSecretBaseVisitOnAir(void);
void PutBattleUpdateOnTheAir(u8 opponentLinkPlayerId, u16 move, u16 speciesPlayer, u16 speciesOpponent);
void BravoTrainerPokemonProfile_BeforeInterview1(u16 move);
void InterviewBefore(void);
void InterviewAfter(void);
void UpdateTVScreensOnMap(int, int);
-void TV_PrintIntToStringVar(u8 varIdx, int value);
-void SaveRecordedItemPurchasesForTVShow(void);
+void ConvertIntToDecimalString(u8 varIdx, int value);
+void TryPutSmartShopperOnAir(void);
bool8 ShouldAirFrontierTVShow(void);
-void sub_80EE8C8(u16 winStreak, u8 facilityAndMode);
void BravoTrainerPokemonProfile_BeforeInterview2(u8 contestStandingPlace);
void ContestLiveUpdates_Init(u8 round1Placing);
void ContestLiveUpdates_SetRound2Placing(u8 round2Placing);
@@ -65,5 +58,8 @@ void ContestLiveUpdates_SetWinnerAppealFlag(u8 flag);
void ContestLiveUpdates_SetWinnerMoveUsed(u16 move);
void ContestLiveUpdates_SetLoserData(u8 flag, u8 loser);
void ResetGabbyAndTy(void);
+u8 CheckForPlayersHouseNews(void);
+bool8 IsGabbyAndTyShowOnTheAir(void);
+void TryPutTrainerFanClubOnAir(void);
#endif //GUARD_TV_H
diff --git a/ld_script_modern.txt b/ld_script_modern.txt
index b69ada864..59d032bb2 100644
--- a/ld_script_modern.txt
+++ b/ld_script_modern.txt
@@ -27,6 +27,8 @@ SECTIONS {
/* .bss starts at 0x3000000 */
src/*.o(.bss);
gflib/*.o(.bss);
+ *libc.a:*.o(.bss*);
+ *libnosys.a:*.o(.bss*);
/* .bss.code starts at 0x3001AA8 */
src/m4a.o(.bss.code);
@@ -34,7 +36,8 @@ SECTIONS {
/* COMMON starts at 0x30022A8 */
src/*.o(COMMON);
gflib/*.o(COMMON);
- *libc.a:sbrkr.o(COMMON);
+ *libc.a:*.o(COMMON);
+ *libnosys.a:*.o(COMMON);
end = .;
. = 0x8000;
}
@@ -44,19 +47,10 @@ SECTIONS {
.text :
ALIGN(4)
{
- src/crt0.o(.text);
- src/*.o(.text);
- gflib/*.o(.text);
- asm/*.o(.text);
- } =0
-
- .text.unlikely :
- ALIGN(4)
- {
- src/crt0.o(.text.unlikely);
- src/*.o(.text.unlikely);
- gflib/*.o(.text.unlikely);
- asm/*.o(.text.unlikely);
+ src/crt0.o(.text*);
+ src/*.o(.text*);
+ gflib/*.o(.text*);
+ asm/*.o(.text*);
} =0
script_data :
@@ -82,6 +76,7 @@ SECTIONS {
*libagbsyscall.a:*.o(.text*);
*libgcc.a:*.o(.text*);
*libc.a:*.o(.text*);
+ *libnosys.a:*.o(.text*);
src/libisagbprn.o(.text);
} =0
diff --git a/libagbsyscall/Makefile b/libagbsyscall/Makefile
index 911cdb237..78f246af4 100644
--- a/libagbsyscall/Makefile
+++ b/libagbsyscall/Makefile
@@ -1,29 +1,28 @@
TOOLCHAIN := $(DEVKITARM)
COMPARE ?= 0
-ifeq ($(CC),)
-HOSTCC := gcc
-else
-HOSTCC := $(CC)
-endif
+# don't use dkP's base_tools anymore
+# because the redefinition of $(CC) conflicts
+# with when we want to use $(CC) to preprocess files
+# thus, manually create the variables for the bin
+# files, or use arm-none-eabi binaries on the system
+# if dkP is not installed on this system
-ifeq ($(CXX),)
-HOSTCXX := g++
-else
-HOSTCXX := $(CXX)
+ifneq (,$(TOOLCHAIN))
+ifneq ($(wildcard $(TOOLCHAIN)/bin),)
+export PATH := $(TOOLCHAIN)/bin:$(PATH)
+endif
endif
-ifneq (,$(wildcard $(TOOLCHAIN)/base_tools))
-include $(TOOLCHAIN)/base_tools
-else
-export PATH := $(TOOLCHAIN)/bin:$(PATH)
PREFIX := arm-none-eabi-
OBJCOPY := $(PREFIX)objcopy
-export CC := $(PREFIX)gcc
-export AS := $(PREFIX)as
-endif
-export CPP := $(PREFIX)cpp
-export LD := $(PREFIX)ld
+AS := $(PREFIX)as
+LD := $(PREFIX)ld
+AR := $(PREFIX)ar
+
+# note: the makefile must be set up so MODERNCC is never called
+# if MODERN=0
+MODERNCC := $(PREFIX)gcc
ifeq ($(OS),Windows_NT)
EXE := .exe
@@ -31,6 +30,23 @@ else
EXE :=
endif
+# use arm-none-eabi-cpp for macOS
+# as macOS's default compiler is clang
+# and clang's preprocessor will warn on \u
+# when preprocessing asm files, expecting a unicode literal
+# we can't unconditionally use arm-none-eabi-cpp
+# as installations which install binutils-arm-none-eabi
+# don't come with it
+ifneq ($(MODERN),1)
+ ifeq ($(shell uname -s),Darwin)
+ CPP := $(PREFIX)cpp
+ else
+ CPP := $(CC) -E
+ endif
+else
+ CPP := $(PREFIX)cpp
+endif
+
ASFLAGS := -mcpu=arm7tdmi
ARFLAGS := rc
diff --git a/make_tools.mk b/make_tools.mk
new file mode 100644
index 000000000..697897a69
--- /dev/null
+++ b/make_tools.mk
@@ -0,0 +1,11 @@
+
+MAKEFLAGS += --no-print-directory
+
+TOOLDIRS := $(filter-out tools/agbcc tools/binutils,$(wildcard tools/*))
+
+.PHONY: all $(TOOLDIRS)
+
+all: $(TOOLDIRS)
+
+$(TOOLDIRS):
+ @$(MAKE) -C $@
diff --git a/map_data_rules.mk b/map_data_rules.mk
index 0203b383d..626cd4724 100755
--- a/map_data_rules.mk
+++ b/map_data_rules.mk
@@ -9,9 +9,9 @@ MAP_EVENTS := $(patsubst $(MAPS_DIR)/%/,$(MAPS_DIR)/%/events.inc,$(MAP_DIRS))
MAP_HEADERS := $(patsubst $(MAPS_DIR)/%/,$(MAPS_DIR)/%/header.inc,$(MAP_DIRS))
$(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)
- $(PREPROC) $< charmap.txt | $(CPP) -I include | $(AS) $(ASFLAGS) -o $@
+ $(PREPROC) $< charmap.txt | $(CPP) -I include - | $(AS) $(ASFLAGS) -o $@
$(DATA_ASM_BUILDDIR)/map_events.o: $(DATA_ASM_SUBDIR)/map_events.s $(MAPS_DIR)/events.inc $(MAP_EVENTS)
- $(PREPROC) $< charmap.txt | $(CPP) -I include | $(AS) $(ASFLAGS) -o $@
+ $(PREPROC) $< charmap.txt | $(CPP) -I include - | $(AS) $(ASFLAGS) -o $@
$(MAPS_DIR)/%/header.inc: $(MAPS_DIR)/%/map.json
$(MAPJSON) map emerald $< $(LAYOUTS_DIR)/layouts.json
diff --git a/src/apprentice.c b/src/apprentice.c
index f93a3e30b..00157dc1a 100644
--- a/src/apprentice.c
+++ b/src/apprentice.c
@@ -30,7 +30,7 @@
#include "constants/trainers.h"
#include "constants/moves.h"
-/* Summary of Apprentice, because (as of writing at least) its not very well documented online
+/* Summary of Apprentice, because (as of writing at least) it's not very well documented online
*
* ## Basic info
* In the Battle Tower lobby there is an NPC which asks to be taught by the player
@@ -1107,17 +1107,24 @@ static void TrySetApprenticeHeldItem(void)
if (PLAYER_APPRENTICE.questionsAnswered < NUM_WHICH_MON_QUESTIONS)
return;
+
+ count = 0;
+ for (j = 0; j < APPRENTICE_MAX_QUESTIONS; j++)
+ {
+ if (PLAYER_APPRENTICE.questions[j].questionId == QUESTION_ID_WIN_SPEECH)
+ break;
+ count++;
+ }
- for (count = 0, j = 0; j < APPRENTICE_MAX_QUESTIONS && PLAYER_APPRENTICE.questions[j].questionId != QUESTION_ID_WIN_SPEECH; count++, j++)
- ;
-
- // Make sure the item hasnt already been suggested in previous questions
- for (i = 0; i < count && i < CURRENT_QUESTION_NUM; i++)
+ // Make sure the item hasn't already been suggested in previous questions
+ for (i = 0; i < count; i++)
{
- do {} while(0);
- if (PLAYER_APPRENTICE.questions[i].questionId == QUESTION_ID_WHAT_ITEM
- && PLAYER_APPRENTICE.questions[i].suggestedChange
- && PLAYER_APPRENTICE.questions[i].data == gSpecialVar_0x8005)
+ if (i >= CURRENT_QUESTION_NUM)
+ break;
+ if (PLAYER_APPRENTICE.questions[i].questionId != QUESTION_ID_WHAT_ITEM ||
+ PLAYER_APPRENTICE.questions[i].suggestedChange == 0)
+ continue;
+ if (PLAYER_APPRENTICE.questions[i].data == gSpecialVar_0x8005)
{
PLAYER_APPRENTICE.questions[CURRENT_QUESTION_NUM].suggestedChange = FALSE;
PLAYER_APPRENTICE.questions[CURRENT_QUESTION_NUM].data = gSpecialVar_0x8005;
diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c
index 9fdd4d0c3..bb615e497 100644
--- a/src/battle_ai_script_commands.c
+++ b/src/battle_ai_script_commands.c
@@ -263,7 +263,10 @@ static const BattleAICmdFunc sBattleAICmdTable[] =
Cmd_if_holds_item, // 0x62
};
-static const u16 sDiscouragedPowerfulMoveEffects[] =
+// For the purposes of determining the most powerful move in a moveset, these
+// moves are treated the same as having a power of 0 or 1
+#define IGNORED_MOVES_END 0xFFFF
+static const u16 sIgnoredPowerfulMoveEffects[] =
{
EFFECT_EXPLOSION,
EFFECT_DREAM_EATER,
@@ -277,7 +280,7 @@ static const u16 sDiscouragedPowerfulMoveEffects[] =
EFFECT_SUPERPOWER,
EFFECT_ERUPTION,
EFFECT_OVERHEAT,
- 0xFFFF
+ IGNORED_MOVES_END
};
// code
@@ -1177,14 +1180,14 @@ static void Cmd_get_how_powerful_move_is(void)
s32 i, checkedMove;
s32 moveDmgs[MAX_MON_MOVES];
- for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++)
+ for (i = 0; sIgnoredPowerfulMoveEffects[i] != IGNORED_MOVES_END; i++)
{
- if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect == sDiscouragedPowerfulMoveEffects[i])
+ if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect == sIgnoredPowerfulMoveEffects[i])
break;
}
if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power > 1
- && sDiscouragedPowerfulMoveEffects[i] == 0xFFFF)
+ && sIgnoredPowerfulMoveEffects[i] == IGNORED_MOVES_END)
{
gDynamicBasePower = 0;
*(&gBattleStruct->dynamicMoveType) = 0;
@@ -1192,16 +1195,18 @@ static void Cmd_get_how_powerful_move_is(void)
gMoveResultFlags = 0;
gCritMultiplier = 1;
+ // Considered move has power and is not in sIgnoredPowerfulMoveEffects
+ // Check all other moves and calculate their power
for (checkedMove = 0; checkedMove < MAX_MON_MOVES; checkedMove++)
{
- for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++)
+ for (i = 0; sIgnoredPowerfulMoveEffects[i] != IGNORED_MOVES_END; i++)
{
- if (gBattleMoves[gBattleMons[sBattler_AI].moves[checkedMove]].effect == sDiscouragedPowerfulMoveEffects[i])
+ if (gBattleMoves[gBattleMons[sBattler_AI].moves[checkedMove]].effect == sIgnoredPowerfulMoveEffects[i])
break;
}
if (gBattleMons[sBattler_AI].moves[checkedMove] != MOVE_NONE
- && sDiscouragedPowerfulMoveEffects[i] == 0xFFFF
+ && sIgnoredPowerfulMoveEffects[i] == IGNORED_MOVES_END
&& gBattleMoves[gBattleMons[sBattler_AI].moves[checkedMove]].power > 1)
{
gCurrentMove = gBattleMons[sBattler_AI].moves[checkedMove];
@@ -1217,6 +1222,7 @@ static void Cmd_get_how_powerful_move_is(void)
}
}
+ // Is the considered move the most powerful move available?
for (checkedMove = 0; checkedMove < MAX_MON_MOVES; checkedMove++)
{
if (moveDmgs[checkedMove] > moveDmgs[AI_THINKING_STRUCT->movesetIndex])
@@ -1224,13 +1230,14 @@ static void Cmd_get_how_powerful_move_is(void)
}
if (checkedMove == MAX_MON_MOVES)
- AI_THINKING_STRUCT->funcResult = MOVE_MOST_POWERFUL; // Is the most powerful.
+ AI_THINKING_STRUCT->funcResult = MOVE_MOST_POWERFUL;
else
- AI_THINKING_STRUCT->funcResult = MOVE_NOT_MOST_POWERFUL; // Not the most powerful.
+ AI_THINKING_STRUCT->funcResult = MOVE_NOT_MOST_POWERFUL;
}
else
{
- AI_THINKING_STRUCT->funcResult = MOVE_POWER_DISCOURAGED; // Highly discouraged in terms of power.
+ // Move has a power of 0/1, or is in the group sIgnoredPowerfulMoveEffects
+ AI_THINKING_STRUCT->funcResult = MOVE_POWER_OTHER;
}
gAIScriptPtr++;
@@ -1761,7 +1768,11 @@ static void Cmd_if_cant_faint(void)
gBattleMoveDamage = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[AI_THINKING_STRUCT->movesetIndex] / 100;
- // This macro is missing the damage 0 = 1 assumption.
+#ifdef BUGFIX
+ // Moves always do at least 1 damage.
+ if (gBattleMoveDamage == 0)
+ gBattleMoveDamage = 1;
+#endif
if (gBattleMons[gBattlerTarget].hp > gBattleMoveDamage)
gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1);
@@ -1877,9 +1888,14 @@ static void Cmd_if_has_move_with_effect(void)
case AI_TARGET_PARTNER:
for (i = 0; i < MAX_MON_MOVES; i++)
{
- // UB: checks sBattler_AI instead of gBattlerTarget.
+ // BUG: checks sBattler_AI instead of gBattlerTarget.
+ #ifndef BUGFIX
if (gBattleMons[sBattler_AI].moves[i] != 0 && gBattleMoves[BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i]].effect == gAIScriptPtr[2])
break;
+ #else
+ if (gBattleMons[gBattlerTarget].moves[i] != 0 && gBattleMoves[BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i]].effect == gAIScriptPtr[2])
+ break;
+ #endif
}
if (i == MAX_MON_MOVES)
gAIScriptPtr += 7;
@@ -2014,18 +2030,24 @@ static void Cmd_if_holds_item(void)
{
u8 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]);
u16 item;
- u8 var1, var2;
+ u8 itemLo, itemHi;
if ((battlerId & BIT_SIDE) == (sBattler_AI & BIT_SIDE))
item = gBattleMons[battlerId].item;
else
item = BATTLE_HISTORY->itemEffects[battlerId];
- // UB: doesn't properly read an unaligned u16
- var2 = gAIScriptPtr[2];
- var1 = gAIScriptPtr[3];
+ itemHi = gAIScriptPtr[2];
+ itemLo = gAIScriptPtr[3];
- if ((var1 | var2) == item)
+#ifdef BUGFIX
+ // This bug doesn't affect the vanilla game because this script command
+ // is only used to check ITEM_PERSIM_BERRY, whose high byte happens to
+ // be 0.
+ if (((itemHi << 8) | itemLo) == item)
+#else
+ if ((itemLo | itemHi) == item)
+#endif
gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4);
else
gAIScriptPtr += 8;
diff --git a/src/battle_anim_dark.c b/src/battle_anim_dark.c
index c2bfe269b..8000a648c 100644
--- a/src/battle_anim_dark.c
+++ b/src/battle_anim_dark.c
@@ -870,7 +870,7 @@ void AnimTask_MetallicShine(u8 taskId)
paletteNum = 16 + gSprites[spriteId].oam.paletteNum;
if (gBattleAnimArgs[1] == 0)
- SetGreyscaleOrOriginalPalette(paletteNum, FALSE);
+ SetGrayscaleOrOriginalPalette(paletteNum, FALSE);
else
BlendPalette(paletteNum * 16, 16, 11, gBattleAnimArgs[2]);
@@ -900,7 +900,7 @@ static void AnimTask_MetallicShine_Step(u8 taskId)
spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
paletteNum = 16 + gSprites[spriteId].oam.paletteNum;
if (gTasks[taskId].data[1] == 0)
- SetGreyscaleOrOriginalPalette(paletteNum, TRUE);
+ SetGrayscaleOrOriginalPalette(paletteNum, TRUE);
DestroySprite(&gSprites[gTasks[taskId].data[0]]);
GetBattleAnimBg1Data(&animBg);
@@ -925,10 +925,10 @@ static void AnimTask_MetallicShine_Step(u8 taskId)
}
}
-// Changes battler's palette to either greyscale or original.
+// Changes battler's palette to either grayscale or original.
// arg0: which battler
// arg1: FALSE grayscale, TRUE original
-void AnimTask_SetGreyscaleOrOriginalPal(u8 taskId)
+void AnimTask_SetGrayscaleOrOriginalPal(u8 taskId)
{
u8 spriteId;
u8 battler;
@@ -974,7 +974,7 @@ void AnimTask_SetGreyscaleOrOriginalPal(u8 taskId)
}
if (spriteId != SPRITE_NONE)
- SetGreyscaleOrOriginalPalette(gSprites[spriteId].oam.paletteNum + 16, gBattleAnimArgs[1]);
+ SetGrayscaleOrOriginalPalette(gSprites[spriteId].oam.paletteNum + 16, gBattleAnimArgs[1]);
DestroyAnimVisualTask(taskId);
}
diff --git a/src/battle_anim_effects_2.c b/src/battle_anim_effects_2.c
index 5dd584386..0ac5d384b 100755
--- a/src/battle_anim_effects_2.c
+++ b/src/battle_anim_effects_2.c
@@ -89,7 +89,7 @@ static void AnimPerishSongMusicNote_Step1(struct Sprite *);
static void AnimPerishSongMusicNote_Step2(struct Sprite *);
static void AnimGuardRing(struct Sprite *);
static void AnimTask_Withdraw_Step(u8);
-static void AnimTask_GrowAndGreyscale_Step(u8);
+static void AnimTask_GrowAndGrayscale_Step(u8);
static void AnimTask_Minimize_Step(u8);
static void CreateMinimizeSprite(struct Task *, u8);
static void ClonedMinizeSprite_Step(struct Sprite *);
@@ -1996,26 +1996,26 @@ static void AnimGuillotinePincer_Step3(struct Sprite *sprite)
DestroyAnimSprite(sprite);
}
-// Scales up the target mon sprite, and sets the palette to greyscale.
+// Scales up the target mon sprite, and sets the palette to grayscale.
// Used in MOVE_DISABLE.
// No args.
-void AnimTask_GrowAndGreyscale(u8 taskId)
+void AnimTask_GrowAndGrayscale(u8 taskId)
{
u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET);
PrepareBattlerSpriteForRotScale(spriteId, ST_OAM_OBJ_BLEND);
SetSpriteRotScale(spriteId, 0xD0, 0xD0, 0);
- SetGreyscaleOrOriginalPalette(gSprites[spriteId].oam.paletteNum + 16, FALSE);
+ SetGrayscaleOrOriginalPalette(gSprites[spriteId].oam.paletteNum + 16, FALSE);
gTasks[taskId].data[0] = 80;
- gTasks[taskId].func = AnimTask_GrowAndGreyscale_Step;
+ gTasks[taskId].func = AnimTask_GrowAndGrayscale_Step;
}
-static void AnimTask_GrowAndGreyscale_Step(u8 taskId)
+static void AnimTask_GrowAndGrayscale_Step(u8 taskId)
{
if (--gTasks[taskId].data[0] == -1)
{
u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET);
ResetSpriteRotScale(spriteId);
- SetGreyscaleOrOriginalPalette(gSprites[spriteId].oam.paletteNum + 16, TRUE);
+ SetGrayscaleOrOriginalPalette(gSprites[spriteId].oam.paletteNum + 16, TRUE);
DestroyAnimVisualTask(taskId);
}
}
@@ -3710,7 +3710,7 @@ static void AnimPerishSongMusicNote2(struct Sprite *sprite)
}
if (++sprite->data[0] == sprite->data[1])
- SetGreyscaleOrOriginalPalette(sprite->oam.paletteNum + 16, 0);
+ SetGrayscaleOrOriginalPalette(sprite->oam.paletteNum + 16, 0);
if (sprite->data[0] == sprite->data[1] + 80)
DestroyAnimSprite(sprite);
diff --git a/src/battle_anim_effects_3.c b/src/battle_anim_effects_3.c
index 800431c6a..5aaf45f19 100755
--- a/src/battle_anim_effects_3.c
+++ b/src/battle_anim_effects_3.c
@@ -2319,11 +2319,11 @@ void AnimTask_TransformMon(u8 taskId)
}
if (IsSpeciesNotUnown(gContestResources->moveAnim->targetSpecies))
- gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].affineAnims = gUnknown_082FF6C0;
+ gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].affineAnims = gAffineAnims_BattleSpriteContest;
else
gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].affineAnims = gAffineAnims_BattleSpriteOpponentSide;
- StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[gBattleAnimAttacker]], 0);
+ StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[gBattleAnimAttacker]], BATTLER_AFFINE_NORMAL);
}
gTasks[taskId].data[0]++;
@@ -4733,8 +4733,8 @@ void AnimTask_MonToSubstitute(u8 taskId)
LoadBattleMonGfxAndAnimate(gBattleAnimAttacker, 0, spriteId);
if (IsContest())
{
- gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].affineAnims = gUnknown_082FF6C0;
- StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[gBattleAnimAttacker]], 0);
+ gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].affineAnims = gAffineAnims_BattleSpriteContest;
+ StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[gBattleAnimAttacker]], BATTLER_AFFINE_NORMAL);
}
for (i = 0; i < NUM_TASK_DATA; i++)
diff --git a/src/battle_anim_mons.c b/src/battle_anim_mons.c
index 3be8ed23d..cf5ae6eb2 100644
--- a/src/battle_anim_mons.c
+++ b/src/battle_anim_mons.c
@@ -1310,7 +1310,7 @@ u16 ArcTan2Neg(s16 a, s16 b)
return -var;
}
-void SetGreyscaleOrOriginalPalette(u16 paletteNum, bool8 restoreOriginalColor)
+void SetGrayscaleOrOriginalPalette(u16 paletteNum, bool8 restoreOriginalColor)
{
int i;
struct PlttData *originalColor;
@@ -2078,8 +2078,8 @@ u8 CreateAdditionalMonSpriteForMoveAnim(u16 species, bool8 isBackpic, u8 id, s16
if (IsContest())
{
- gSprites[spriteId].affineAnims = gUnknown_082FF6C0;
- StartSpriteAffineAnim(&gSprites[spriteId], 0);
+ gSprites[spriteId].affineAnims = gAffineAnims_BattleSpriteContest;
+ StartSpriteAffineAnim(&gSprites[spriteId], BATTLER_AFFINE_NORMAL);
}
return spriteId;
}
diff --git a/src/battle_anim_sound_tasks.c b/src/battle_anim_sound_tasks.c
index 8fc93c3aa..39d6729e8 100644
--- a/src/battle_anim_sound_tasks.c
+++ b/src/battle_anim_sound_tasks.c
@@ -135,8 +135,10 @@ void SoundTask_PlayCryHighPitch(u8 taskId)
{
if (gBattleAnimArgs[0] == ANIM_ATTACKER)
species = gContestResources->moveAnim->species;
+ #ifndef UBFIX
else
- DestroyAnimVisualTask(taskId); // UB: function should return upon destroying task.
+ DestroyAnimVisualTask(taskId); // UB: task gets destroyed twice.
+ #endif
}
else
{
@@ -179,8 +181,10 @@ void SoundTask_PlayDoubleCry(u8 taskId)
{
if (gBattleAnimArgs[0] == ANIM_ATTACKER)
species = gContestResources->moveAnim->species;
+ #ifndef UBFIX
else
- DestroyAnimVisualTask(taskId); // UB: function should return upon destroying task.
+ DestroyAnimVisualTask(taskId); // UB: task gets destroyed twice.
+ #endif
}
else
{
diff --git a/src/battle_anim_throw.c b/src/battle_anim_throw.c
index f6a48cf69..4064e250c 100755
--- a/src/battle_anim_throw.c
+++ b/src/battle_anim_throw.c
@@ -16,6 +16,7 @@
#include "task.h"
#include "trig.h"
#include "util.h"
+#include "data.h"
#include "constants/items.h"
#include "constants/moves.h"
#include "constants/songs.h"
@@ -1419,7 +1420,7 @@ static void MakeCaptureStars(struct Sprite *sprite)
LoadBallParticleGfx(BALL_MASTER);
for (i = 0; i < ARRAY_COUNT(sCaptureStars); i++)
{
- u8 spriteId = CreateSprite(&sBallParticleSpriteTemplates[4], sprite->pos1.x, sprite->pos1.y, subpriority);
+ u8 spriteId = CreateSprite(&sBallParticleSpriteTemplates[BALL_MASTER], sprite->pos1.x, sprite->pos1.y, subpriority);
if (spriteId != MAX_SPRITES)
{
gSprites[spriteId].sDuration = 24;
@@ -1471,7 +1472,7 @@ static void SpriteCB_Ball_Release_Step(struct Sprite *sprite)
// Animate Pokémon emerging from Poké Ball
gSprites[gBattlerSpriteIds[gBattleAnimTarget]].invisible = FALSE;
- StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[gBattleAnimTarget]], 1);
+ StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[gBattleAnimTarget]], BATTLER_AFFINE_EMERGE);
AnimateSprite(&gSprites[gBattlerSpriteIds[gBattleAnimTarget]]);
gSprites[gBattlerSpriteIds[gBattleAnimTarget]].sOffsetY = 4096;
}
@@ -1485,7 +1486,7 @@ static void SpriteCB_Ball_Release_Wait(struct Sprite *sprite)
if (gSprites[gBattlerSpriteIds[gBattleAnimTarget]].affineAnimEnded)
{
- StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[gBattleAnimTarget]], 0);
+ StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[gBattleAnimTarget]], BATTLER_AFFINE_NORMAL);
released = TRUE;
}
else
diff --git a/src/battle_dome.c b/src/battle_dome.c
index a5cf168ef..ea1e5abba 100644
--- a/src/battle_dome.c
+++ b/src/battle_dome.c
@@ -1211,8 +1211,8 @@ static const u8 gUnknown_0860D1A0[DOME_TOURNAMENT_TRAINERS_COUNT / 2][DOME_ROUND
static const u8 gUnknown_0860D1C0[DOME_TOURNAMENT_TRAINERS_COUNT] = {0, 15, 8, 7, 3, 12, 11, 4, 1, 14, 9, 6, 2, 13, 10, 5};
-// Each tourney trainer has a text describing their potential to win, depending on their seed ranking for the current tourney
-// Dome Ace Tucker has their own separate potential text
+// The first line of text on a trainers info card. It describes their potential to win, based on their seed in the tournament tree.
+// Dome Ace Tucker has their own separate potential text.
static const u8 *const sBattleDomePotentialTexts[DOME_TOURNAMENT_TRAINERS_COUNT + 1] =
{
BattleDome_Text_Potential1, // Highest potential
@@ -1234,7 +1234,7 @@ static const u8 *const sBattleDomePotentialTexts[DOME_TOURNAMENT_TRAINERS_COUNT
BattleDome_Text_PotentialDomeAceTucker,
};
-// The first line of text on a trainers info card that gives information about their battle style (dependent on their party's moves)
+// The second line of text on a trainers info card. It gives information about their battle style (dependent on their party's moves).
static const u8 *const sBattleDomeOpponentStyleTexts[NUM_BATTLE_STYLES] =
{
[DOME_BATTLE_STYLE_RISKY] = BattleDome_Text_StyleRiskDisaster,
@@ -1271,7 +1271,7 @@ static const u8 *const sBattleDomeOpponentStyleTexts[NUM_BATTLE_STYLES] =
[DOME_BATTLE_STYLE_UNUSED4] = BattleDome_Text_StyleSampleMessage4,
};
-// The second line of text on a trainers info card that gives information about their party's stat spread
+// The third line of text on a trainers info card. It that gives information about their party's stat spread (based on their Pokémon's effort values and Nature).
static const u8 *const sBattleDomeOpponentStatsTexts[] =
{
BattleDome_Text_EmphasizesHPAndAtk, // DOME_TEXT_TWO_GOOD_STATS and DOME_TEXT_HP start here
@@ -2766,13 +2766,22 @@ static int GetTypeEffectivenessPoints(int move, int targetSpecies, int arg2)
}
if (TYPE_EFFECT_ATK_TYPE(i) == moveType)
{
- // BUG: TYPE_x2 is not necessary and makes the condition always false if the ability is wonder guard.
+ // BUG: the value of TYPE_x2 does not exist in gTypeEffectiveness, so if defAbility is ABILITY_WONDER_GUARD, the conditional always fails
+ #ifndef BUGFIX
if (TYPE_EFFECT_DEF_TYPE(i) == defType1)
if ((defAbility == ABILITY_WONDER_GUARD && TYPE_EFFECT_MULTIPLIER(i) == TYPE_x2) || defAbility != ABILITY_WONDER_GUARD)
typePower = (typePower * TYPE_EFFECT_MULTIPLIER(i)) / 10;
if (TYPE_EFFECT_DEF_TYPE(i) == defType2 && defType1 != defType2)
if ((defAbility == ABILITY_WONDER_GUARD && TYPE_EFFECT_MULTIPLIER(i) == TYPE_x2) || defAbility != ABILITY_WONDER_GUARD)
typePower = (typePower * TYPE_EFFECT_MULTIPLIER(i)) / 10;
+ #else
+ if (TYPE_EFFECT_DEF_TYPE(i) == defType1)
+ if ((defAbility == ABILITY_WONDER_GUARD && TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_SUPER_EFFECTIVE) || defAbility != ABILITY_WONDER_GUARD)
+ typePower = (typePower * TYPE_EFFECT_MULTIPLIER(i)) / 10;
+ if (TYPE_EFFECT_DEF_TYPE(i) == defType2 && defType1 != defType2)
+ if ((defAbility == ABILITY_WONDER_GUARD && TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_SUPER_EFFECTIVE) || defAbility != ABILITY_WONDER_GUARD)
+ typePower = (typePower * TYPE_EFFECT_MULTIPLIER(i)) / 10;
+ #endif
}
i += 3;
}
@@ -5211,40 +5220,38 @@ static u16 GetWinningMove(int winnerTournamentId, int loserTournamentId, u8 roun
}
j = bestId;
- goto LABEL;
- while (j != 0)
+ do
{
- for (j = 0, k = 0; k < MAX_MON_MOVES * FRONTIER_PARTY_SIZE; k++)
+ for (i = 0; i < roundId - 1; i++)
{
- if (bestScore < moveScores[k])
- {
- j = k;
- bestScore = moveScores[k];
- }
- else if (bestScore == moveScores[k] && moveIds[j] < moveIds[k])
- {
- j = k;
- }
+ if (gSaveBlock2Ptr->frontier.domeWinningMoves[sub_81953E8(winnerTournamentId, i)] == moveIds[j])
+ break;
}
- if (i == roundId - 1)
- break;
- LABEL:
+ if (i != roundId - 1)
{
- for (i = 0; i < roundId - 1; i++)
- {
- if (gSaveBlock2Ptr->frontier.domeWinningMoves[sub_81953E8(winnerTournamentId, i)] == moveIds[j])
- break;
- }
- if (i == roundId - 1)
- break;
-
moveScores[j] = 0;
bestScore = 0;
j = 0;
for (k = 0; k < MAX_MON_MOVES * FRONTIER_PARTY_SIZE; k++)
j += moveScores[k];
+ if (j == 0)
+ break;
+ j = 0;
+ for (k = 0; k < MAX_MON_MOVES * FRONTIER_PARTY_SIZE; k++)
+ {
+ if (bestScore < moveScores[k])
+ {
+ j = k;
+ bestScore = moveScores[k];
+ }
+ else if (bestScore == moveScores[k] && moveIds[j] < moveIds[k]) // Yes, these conditions are redundant
+ {
+ j = k;
+ bestScore = moveScores[k];
+ }
+ }
}
- }
+ } while (i != roundId - 1);
if (moveScores[j] == 0)
j = bestId;
diff --git a/src/battle_factory.c b/src/battle_factory.c
index 72772929a..e0bfdfdd0 100644
--- a/src/battle_factory.c
+++ b/src/battle_factory.c
@@ -38,7 +38,7 @@ static void GenerateInitialRentalMons(void);
static void GetOpponentMostCommonMonType(void);
static void GetOpponentBattleStyle(void);
static void RestorePlayerPartyHeldItems(void);
-static u16 GetFactoryMonId(u8 lvlMode, u8 challengeNum, bool8 arg2);
+static u16 GetFactoryMonId(u8 lvlMode, u8 challengeNum, bool8 useBetterRange);
static u8 GetMoveBattleStyle(u16 move);
// Number of moves needed on the team to be considered using a certain battle style
diff --git a/src/battle_factory_screen.c b/src/battle_factory_screen.c
index 680c6e81c..db810e965 100644
--- a/src/battle_factory_screen.c
+++ b/src/battle_factory_screen.c
@@ -4221,12 +4221,17 @@ static void Task_OpenMonPic(u8 taskId)
return;
break;
default:
+ #ifndef UBFIX
DestroyTask(taskId);
+ #endif
// UB: Should not use the task after it has been deleted.
if (gTasks[taskId].tIsSwapScreen == TRUE)
Swap_CreateMonSprite();
else
Select_CreateMonSprite();
+ #ifdef UBFIX
+ DestroyTask(taskId);
+ #endif
return;
}
task->tState++;
diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c
index ba0cab814..88e69665e 100644
--- a/src/battle_gfx_sfx_util.c
+++ b/src/battle_gfx_sfx_util.c
@@ -40,7 +40,7 @@ extern const struct SpriteTemplate gSpriteTemplate_EnemyShadow;
static u8 GetBattlePalaceMoveGroup(u16 move);
static u16 GetBattlePalaceTarget(void);
static void SpriteCB_TrainerSlideVertical(struct Sprite *sprite);
-static bool8 ShouldAnimBeDoneRegardlessOfSubsitute(u8 animId);
+static bool8 ShouldAnimBeDoneRegardlessOfSubstitute(u8 animId);
static void Task_ClearBitWhenBattleTableAnimDone(u8 taskId);
static void Task_ClearBitWhenSpecialAnimDone(u8 taskId);
static void ClearSpritesBattlerHealthboxAnimData(void);
@@ -444,7 +444,7 @@ bool8 TryHandleLaunchBattleTableAnimation(u8 activeBattler, u8 atkBattler, u8 de
return TRUE;
}
if (gBattleSpritesDataPtr->battlerData[activeBattler].behindSubstitute
- && !ShouldAnimBeDoneRegardlessOfSubsitute(tableId))
+ && !ShouldAnimBeDoneRegardlessOfSubstitute(tableId))
{
return TRUE;
}
@@ -480,7 +480,7 @@ static void Task_ClearBitWhenBattleTableAnimDone(u8 taskId)
#undef tBattlerId
-static bool8 ShouldAnimBeDoneRegardlessOfSubsitute(u8 animId)
+static bool8 ShouldAnimBeDoneRegardlessOfSubstitute(u8 animId)
{
switch (animId)
{
diff --git a/src/battle_interface.c b/src/battle_interface.c
index 5518fd21b..50eb5373a 100644
--- a/src/battle_interface.c
+++ b/src/battle_interface.c
@@ -159,7 +159,7 @@ enum
// strings
extern const u8 gText_Slash[];
-extern const u8 gText_HighlightDarkGrey[];
+extern const u8 gText_HighlightDarkGray[];
extern const u8 gText_DynColor2[];
extern const u8 gText_DynColor2Male[];
extern const u8 gText_DynColor1Female[];
@@ -1099,21 +1099,14 @@ static void UpdateLvlInHealthbox(u8 healthboxSpriteId, u8 lvl)
u32 windowId, spriteTileNum;
u8 *windowTileData;
u8 text[16];
- u32 xPos, var1;
- void *objVram;
-
- text[0] = 0xF9;
- text[1] = 5;
+ u32 xPos;
+ u8 *objVram;
+
+ text[0] = CHAR_EXTRA_SYMBOL;
+ text[1] = CHAR_LV_2;
- xPos = (u32) ConvertIntToDecimalStringN(text + 2, lvl, STR_CONV_MODE_LEFT_ALIGN, 3);
- // Alright, that part was unmatchable. It's basically doing:
- // xPos = 5 * (3 - (u32)(&text[2]));
- xPos--;
- xPos--;
- xPos -= ((u32)(text));
- var1 = (3 - xPos);
- xPos = 4 * var1;
- xPos += var1;
+ objVram = ConvertIntToDecimalStringN(text + 2, lvl, STR_CONV_MODE_LEFT_ALIGN, 3);
+ xPos = 5 * (3 - (objVram - (text + 2)));
windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, xPos, 3, 2, &windowId);
spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * TILE_SIZE_4BPP;
@@ -1902,7 +1895,7 @@ static void UpdateNickInHealthbox(u8 healthboxSpriteId, struct Pokemon *mon)
u16 species;
u8 gender;
- StringCopy(gDisplayedStringBattle, gText_HighlightDarkGrey);
+ StringCopy(gDisplayedStringBattle, gText_HighlightDarkGray);
GetMonData(mon, MON_DATA_NICKNAME, nickname);
StringGetEnd10(nickname);
ptr = StringAppend(gDisplayedStringBattle, nickname);
diff --git a/src/battle_main.c b/src/battle_main.c
index 741461b0b..977bcbd9c 100644
--- a/src/battle_main.c
+++ b/src/battle_main.c
@@ -1961,10 +1961,10 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir
if (gTrainers[trainerNum].doubleBattle == TRUE)
personalityValue = 0x80;
- else if (gTrainers[trainerNum].encounterMusic_gender & 0x80)
- personalityValue = 0x78;
+ else if (gTrainers[trainerNum].encounterMusic_gender & F_TRAINER_FEMALE)
+ personalityValue = 0x78; // Use personality more likely to result in a female Pokémon
else
- personalityValue = 0x88;
+ personalityValue = 0x88; // Use personality more likely to result in a male Pokémon
for (j = 0; gTrainers[trainerNum].trainerName[j] != EOS; j++)
nameHash += gTrainers[trainerNum].trainerName[j];
@@ -5039,7 +5039,7 @@ static void HandleEndTurn_FinishBattle(void)
}
}
}
- PutPokemonTodayCaughtOnAir();
+ TryPutPokemonTodayOnAir();
}
if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK
@@ -5052,7 +5052,7 @@ static void HandleEndTurn_FinishBattle(void)
| BATTLE_TYPE_WALLY_TUTORIAL))
&& gBattleResults.shinyWildMon)
{
- sub_80EE184();
+ TryPutBreakingNewsOnAir();
}
sub_8186444();
@@ -5148,7 +5148,12 @@ static void ReturnFromBattleToOverworld(void)
if (gBattleTypeFlags & BATTLE_TYPE_ROAMER)
{
UpdateRoamerHPStatus(&gEnemyParty[0]);
+
+#ifndef BUGFIX
if ((gBattleOutcome & B_OUTCOME_WON) || gBattleOutcome == B_OUTCOME_CAUGHT)
+#else
+ if ((gBattleOutcome == B_OUTCOME_WON) || gBattleOutcome == B_OUTCOME_CAUGHT) // Bug: When Roar is used by roamer, gBattleOutcome is B_OUTCOME_PLAYER_TELEPORTED (5).
+#endif // & with B_OUTCOME_WON (1) will return TRUE and deactivates the roamer.
SetRoamerInactive();
}
diff --git a/src/battle_message.c b/src/battle_message.c
index 2e752dcca..ae30a2a62 100644
--- a/src/battle_message.c
+++ b/src/battle_message.c
@@ -383,7 +383,7 @@ static const u8 sText_ThrewPokeblockAtPkmn[] = _("{B_PLAYER_NAME} threw a {POKEB
static const u8 sText_OutOfSafariBalls[] = _("{PLAY_SE SE_DING_DONG}ANNOUNCER: You're out of\nSAFARI BALLS! Game over!\p");
static const u8 sText_OpponentMon1Appeared[] = _("{B_OPPONENT_MON1_NAME} appeared!\p");
static const u8 sText_WildPkmnAppeared[] = _("Wild {B_OPPONENT_MON1_NAME} appeared!\p");
-static const u8 sText_WildPkmnAppeared2[] = _("Wild {B_OPPONENT_MON1_NAME} appeared!\p");
+static const u8 sText_LegendaryPkmnAppeared[] = _("Wild {B_OPPONENT_MON1_NAME} appeared!\p");
static const u8 sText_WildPkmnAppearedPause[] = _("Wild {B_OPPONENT_MON1_NAME} appeared!{PAUSE 127}");
static const u8 sText_TwoWildPkmnAppeared[] = _("Wild {B_OPPONENT_MON1_NAME} and\n{B_OPPONENT_MON2_NAME} appeared!\p");
static const u8 sText_Trainer1WantsToBattle[] = _("{B_TRAINER1_CLASS} {B_TRAINER1_NAME}\nwould like to battle!\p");
@@ -1067,7 +1067,7 @@ const u16 gTransformUsedStringIds[] =
[B_MSG_TRANSFORM_FAILED] = STRINGID_BUTITFAILED
};
-const u16 gSubsituteUsedStringIds[] =
+const u16 gSubstituteUsedStringIds[] =
{
[B_MSG_SET_SUBSTITUTE] = STRINGID_PKMNMADESUBSTITUTE,
[B_MSG_SUBSTITUTE_FAILED] = STRINGID_TOOWEAKFORSUBSTITUTE
@@ -1328,7 +1328,7 @@ static const u8 sText_SpaceIs[] = _(" is");
static const u8 sText_ApostropheS[] = _("'s");
// For displaying names of invalid moves
-static const u8 sATypeMove_Table[][NUMBER_OF_MON_TYPES - 1] =
+static const u8 sATypeMove_Table[NUMBER_OF_MON_TYPES][17] =
{
[TYPE_NORMAL] = _("a NORMAL move"),
[TYPE_FIGHTING] = _("a FIGHTING move"),
@@ -2125,7 +2125,7 @@ void BufferStringBattle(u16 stringID)
else
{
if (gBattleTypeFlags & BATTLE_TYPE_LEGENDARY)
- stringPtr = sText_WildPkmnAppeared2;
+ stringPtr = sText_LegendaryPkmnAppeared;
else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) // interesting, looks like they had something planned for wild double battles
stringPtr = sText_TwoWildPkmnAppeared;
else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL)
diff --git a/src/battle_pyramid.c b/src/battle_pyramid.c
index a41a80bbb..50efeecb4 100644
--- a/src/battle_pyramid.c
+++ b/src/battle_pyramid.c
@@ -1399,8 +1399,12 @@ void GenerateBattlePyramidWildMon(void)
for (i = 0; i < MAX_MON_MOVES; i++)
SetMonMoveSlot(&gEnemyParty[0], wildMons[id].moves[i], i);
- // BUG: Reading outside the array as lvl was used for mon level instead of frontier lvl mode.
+ // UB: Reading outside the array as lvl was used for mon level instead of frontier lvl mode.
+ #ifndef UBFIX
if (gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvl] >= 140)
+ #else
+ if (gSaveBlock2Ptr->frontier.pyramidWinStreaks[gSaveBlock2Ptr->frontier.lvlMode] >= 140)
+ #endif
{
id = (Random() % 17) + 15;
for (i = 0; i < NUM_STATS; i++)
diff --git a/src/battle_pyramid_bag.c b/src/battle_pyramid_bag.c
index 23f2f9653..095cd2bdf 100644
--- a/src/battle_pyramid_bag.c
+++ b/src/battle_pyramid_bag.c
@@ -34,71 +34,83 @@
#include "constants/rgb.h"
#include "constants/songs.h"
-EWRAM_DATA struct PyramidBagResources *gPyramidBagResources = NULL;
-EWRAM_DATA struct PyramidBagCursorData gPyramidBagCursorData = {0};
-
-// This file's functions.
-static void Task_HandlePyramidBagInput(u8 taskId);
-static void Task_ChooseItemsToTossFromPyramidBag(u8 taskId);
-static void sub_81C5B4C(u8 taskId);
-static void Task_BeginItemSwap(u8 taskId);
-static void sub_81C5D20(u8 taskId);
-static void sub_81C674C(u8 taskId);
-static void HandleMenuActionInput(u8 taskId);
-static void HandleFewMenuActionsInput(u8 taskId);
-static void sub_81C66EC(u8 taskId);
-static void SetTaskToMainPyramidBagInputHandler(u8 taskId);
-static void sub_81C6350(u8 taskId);
-static void sub_81C64B4(u8 taskId);
-static void sub_81C65CC(u8 taskId);
-static void sub_81C66AC(u8 taskId);
-static void PerformItemSwap(u8 taskId);
-static void Task_ItemSwapHandleInput(u8 taskId);
-static void sub_81C6A14(u8 taskId);
+#define TAG_SCROLL_ARROW 2910
+#define TAG_PYRAMID_BAG 4132
+#define TAG_ITEM_ICON 4133
+#define TAG_ITEM_ICON_ALT 4134
+
+#define POS_NONE ((u8)-1)
+
+enum {
+ WIN_LIST,
+ WIN_INFO,
+ WIN_MSG,
+ WIN_TOSS_NUM,
+};
+
+EWRAM_DATA struct PyramidBagMenu *gPyramidBagMenu = NULL;
+EWRAM_DATA struct PyramidBagMenuState gPyramidBagMenuState = {0};
+
+static void Task_HandlePyramidBagInput(u8);
+static void Task_ChooseItemsToTossFromPyramidBag(u8);
+static void Task_ClosePyramidBag(u8);
+static void Task_BeginItemSwap(u8);
+static void OpenContextMenu(u8);
+static void TryCloseBagToGiveItem(u8);
+static void HandleMenuActionInput_2x2(u8);
+static void HandleMenuActionInput_SingleRow(u8);
+static void Task_WaitCloseErrorMessage(u8);
+static void SetTaskToMainPyramidBagInputHandler(u8);
+static void AskConfirmToss(u8);
+static void Task_ChooseHowManyToToss(u8);
+static void Task_TossItem(u8);
+static void ShowCantHoldMessage(u8);
+static void PerformItemSwap(u8);
+static void Task_ItemSwapHandleInput(u8);
+static void CancelItemSwap(u8);
static void SetBagItemsListTemplate(void);
-static void sub_81C504C(void);
-static void sub_81C51DC(void);
-static void AddScrollArrow(void);
-static void sub_81C56F8(void);
-static void sub_81C5A20(void);
-static void sub_81C6BD8(void);
-static void sub_81C6EF4(void);
+static void CB2_LoadPyramidBagMenu(void);
+static void InitPyramidBagBgs(void);
+static void AddScrollArrows(void);
+static void CreatePyramidBagInputTask(void);
+static void InitPyramidBagScroll(void);
+static void InitPyramidBagWindows(void);
+static void CreatePyramidBagSprite(void);
static void CreateSwapLine(void);
-static void sub_81C6E98(void);
-static void sub_81C6F20(void);
-static void sub_81C6404(void);
+static void LoadPyramidBagPalette(void);
+static void ShakePyramidBag(void);
+static void ShowNumToToss(void);
static void CloseBattlePyramidBagTextWindow(void);
-static bool8 sub_81C5238(void);
-static bool8 sub_81C5078(void);
-static void ShowItemImage(u16 itemId, u8 itemSpriteArrayId);
-static void PyramidBag_CopyItemName(u8 *dst, u16 itemId);
-static void sub_81C6FF8(u8 arg0);
-static void PrintItemDescription(s32 listMenuId);
-static void sub_81C5AB8(u8 y, u8 arg1);
-static void PrintOnWindow_Font1(u8 windowId, const u8 *src, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorTableId);
-static void PrintOnWindow_Font7(u8 windowId, const u8 *src, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorTableId);
-static u8 sub_81C6D24(u8 windowArrayId);
-static void sub_81C6D6C(u8 windowArrayId);
-static void sub_81C5EAC(u8 windowId);
-static void sub_81C5F08(u8 windowId, u8 horizontalCount, u8 verticalCount);
-static bool8 IsValidMenuAction(s8 arg0);
-static void sub_81C6DAC(u8 taskId, const struct YesNoFuncTable *yesNoTable);
-static void sub_81C6CEC(u8 windowId);
-static void UpdateSwapLinePos(u8 y);
-static void SetSwapLineInvisibility(bool8 invisible);
-static void sub_81C6F68(struct Sprite *sprite);
-static void BagAction_UseOnField(u8 taskId);
-static void BagAction_Toss(u8 taskId);
-static void BagAction_Give(u8 taskId);
-static void BagAction_Cancel(u8 taskId);
-static void BagAction_UseInBattle(u8 taskId);
-static void PyramidBagMoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list);
-static void PrintItemQuantity(u8 windowId, s32 itemIndex, u8 y);
-static void TossItem(u8 taskId);
-static void DontTossItem(u8 taskId);
-
-// Const rom data.
-static const struct BgTemplate gUnknown_0861F2B4[] =
+static bool8 LoadPyramidBagGfx(void);
+static bool8 LoadPyramidBagMenu(void);
+static void ShowItemIcon(u16, u8);
+static void CopyBagItemName(u8 *, u16);
+static void FreeItemIconSpriteByAltId(u8);
+static void PrintItemDescription(s32);
+static void PrintSelectorArrowAtPos(u8, u8);
+static void PrintOnWindow_Font1(u8, const u8 *, u8, u8, u8, u8, u8, u8);
+static void PrintOnWindow_Font7(u8, const u8 *, u8, u8, u8, u8, u8, u8);
+static u8 OpenMenuActionWindowById(u8);
+static void CloseMenuActionWindowById(u8);
+static void PrintMenuActionText_SingleRow(u8);
+static void PrintMenuActionText_MultiRow(u8, u8, u8);
+static bool8 IsValidMenuAction(s8);
+static void CreatePyramidBagYesNo(u8, const struct YesNoFuncTable *);
+static void DrawTossNumberWindow(u8);
+static void UpdateSwapLinePos(u8);
+static void SetSwapLineInvisibility(bool8);
+static void SpriteCB_BagWaitForShake(struct Sprite *);
+static void BagAction_UseOnField(u8);
+static void BagAction_Toss(u8);
+static void BagAction_Give(u8);
+static void BagAction_Cancel(u8);
+static void BagAction_UseInBattle(u8);
+static void BagCursorMoved(s32, bool8, struct ListMenu *);
+static void PrintItemQuantity(u8 windowId, u32 itemId, u8 y);
+static void TossItem(u8);
+static void DontTossItem(u8);
+
+static const struct BgTemplate sBgTemplates[] =
{
{
.bg = 0,
@@ -129,14 +141,14 @@ static const struct BgTemplate gUnknown_0861F2B4[] =
},
};
-static const struct ListMenuTemplate gUnknown_0861F2C0 =
+static const struct ListMenuTemplate sListMenuTemplate =
{
.items = NULL,
- .moveCursorFunc = PyramidBagMoveCursorFunc,
+ .moveCursorFunc = BagCursorMoved,
.itemPrintFunc = PrintItemQuantity,
.totalItems = 0,
.maxShowed = 0,
- .windowId = 0,
+ .windowId = WIN_LIST,
.header_X = 0,
.item_X = 8,
.cursor_X = 0,
@@ -151,12 +163,14 @@ static const struct ListMenuTemplate gUnknown_0861F2C0 =
.cursorKind = 0
};
-#define ACTION_USE_FIELD 0
-#define ACTION_TOSS 1
-#define ACTION_GIVE 2
-#define ACTION_CANCEL 3
-#define ACTION_USE_BATTLE 4
-#define ACTION_DUMMY 5
+enum {
+ ACTION_USE_FIELD,
+ ACTION_TOSS,
+ ACTION_GIVE,
+ ACTION_CANCEL,
+ ACTION_USE_BATTLE,
+ ACTION_DUMMY,
+};
static const struct MenuAction sMenuActions[] =
{
@@ -168,26 +182,33 @@ static const struct MenuAction sMenuActions[] =
[ACTION_DUMMY] = { gText_EmptyString2, NULL },
};
-static const u8 sFieldMenuActionIds[] = {ACTION_USE_FIELD, ACTION_GIVE, ACTION_TOSS, ACTION_CANCEL};
-static const u8 gUnknown_0861F30C[] = {ACTION_TOSS, ACTION_CANCEL};
-static const u8 sBattleMenuActionIds[] = {ACTION_USE_BATTLE, ACTION_CANCEL};
-static const u8 gUnknown_0861F310[] = {ACTION_CANCEL};
+static const u8 sMenuActionIds_Field[] = {ACTION_USE_FIELD, ACTION_GIVE, ACTION_TOSS, ACTION_CANCEL};
+static const u8 sMenuActionIds_ChooseToss[] = {ACTION_TOSS, ACTION_CANCEL};
+static const u8 sMenuActionIds_Battle[] = {ACTION_USE_BATTLE, ACTION_CANCEL};
+static const u8 sMenuActionIds_BattleCannotUse[] = {ACTION_CANCEL};
static const struct YesNoFuncTable sYesNoTossFuncions =
{
TossItem, DontTossItem
};
-static const u8 sColorTable[][3] =
+enum {
+ COLORID_DARK_GRAY,
+ COLORID_LIGHT_GRAY,
+ COLORID_WHITE_BG,
+ COLORID_NONE = 0xFF
+};
+
+static const u8 sTextColors[][3] =
{
- {0, 2, 3},
- {0, 3, 1},
- {1, 2, 3},
+ [COLORID_DARK_GRAY] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY},
+ [COLORID_LIGHT_GRAY] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_GRAY, TEXT_COLOR_WHITE},
+ [COLORID_WHITE_BG] = {TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY}, // Unused
};
-static const struct WindowTemplate gUnknown_0861F328[] =
+static const struct WindowTemplate sWindowTemplates[] =
{
- {
+ [WIN_LIST] = {
.bg = 0,
.tilemapLeft = 14,
.tilemapTop = 2,
@@ -196,7 +217,7 @@ static const struct WindowTemplate gUnknown_0861F328[] =
.paletteNum = 15,
.baseBlock = 30
},
- {
+ [WIN_INFO] = {
.bg = 0,
.tilemapLeft = 0,
.tilemapTop = 13,
@@ -205,7 +226,7 @@ static const struct WindowTemplate gUnknown_0861F328[] =
.paletteNum = 15,
.baseBlock = 270
},
- {
+ [WIN_MSG] = {
.bg = 1,
.tilemapLeft = 2,
.tilemapTop = 15,
@@ -214,7 +235,7 @@ static const struct WindowTemplate gUnknown_0861F328[] =
.paletteNum = 15,
.baseBlock = 354
},
- {
+ [WIN_TOSS_NUM] = {
.bg = 1,
.tilemapLeft = 24,
.tilemapTop = 17,
@@ -226,9 +247,17 @@ static const struct WindowTemplate gUnknown_0861F328[] =
DUMMY_WIN_TEMPLATE,
};
-static const struct WindowTemplate gUnknown_0861F350[] =
+enum {
+ MENU_WIN_1x1,
+ MENU_WIN_1x2,
+ MENU_WIN_2x2,
+ MENU_WIN_2x3,
+ MENU_WIN_YESNO,
+};
+
+static const struct WindowTemplate sWindowTemplates_MenuActions[] =
{
- {
+ [MENU_WIN_1x1] = {
.bg = 1,
.tilemapLeft = 22,
.tilemapTop = 17,
@@ -237,7 +266,7 @@ static const struct WindowTemplate gUnknown_0861F350[] =
.paletteNum = 15,
.baseBlock = 472
},
- {
+ [MENU_WIN_1x2] = {
.bg = 1,
.tilemapLeft = 22,
.tilemapTop = 15,
@@ -246,7 +275,7 @@ static const struct WindowTemplate gUnknown_0861F350[] =
.paletteNum = 15,
.baseBlock = 472
},
- {
+ [MENU_WIN_2x2] = {
.bg = 1,
.tilemapLeft = 15,
.tilemapTop = 15,
@@ -255,7 +284,7 @@ static const struct WindowTemplate gUnknown_0861F350[] =
.paletteNum = 15,
.baseBlock = 472
},
- {
+ [MENU_WIN_2x3] = { // Unused
.bg = 1,
.tilemapLeft = 15,
.tilemapTop = 13,
@@ -264,7 +293,7 @@ static const struct WindowTemplate gUnknown_0861F350[] =
.paletteNum = 15,
.baseBlock = 472
},
- {
+ [MENU_WIN_YESNO] = {
.bg = 1,
.tilemapLeft = 24,
.tilemapTop = 15,
@@ -275,7 +304,7 @@ static const struct WindowTemplate gUnknown_0861F350[] =
},
};
-static const struct OamData gOamData_861F378 =
+static const struct OamData sOamData_PyramidBag =
{
.y = 0,
.affineMode = ST_OAM_AFFINE_NORMAL,
@@ -292,24 +321,24 @@ static const struct OamData gOamData_861F378 =
.affineParam = 0,
};
-static const union AnimCmd gSpriteAnim_861F380[] =
+static const union AnimCmd sAnim_PyramidBag[] =
{
ANIMCMD_FRAME(0, 4),
ANIMCMD_END,
};
-static const union AnimCmd * const gSpriteAnimTable_861F388[] =
+static const union AnimCmd * const sAnims_PyramidBag[] =
{
- gSpriteAnim_861F380,
+ sAnim_PyramidBag,
};
-static const union AffineAnimCmd gSpriteAffineAnim_861F38C[] =
+static const union AffineAnimCmd sAffineAnim_PyramidBag_Still[] =
{
AFFINEANIMCMD_FRAME(256, 256, 0, 0),
AFFINEANIMCMD_END,
};
-static const union AffineAnimCmd gSpriteAffineAnim_861F39C[] =
+static const union AffineAnimCmd sAffineAnim_PyramidBag_Shake[] =
{
AFFINEANIMCMD_FRAME(0, 0, 254, 2),
AFFINEANIMCMD_FRAME(0, 0, 2, 4),
@@ -318,42 +347,50 @@ static const union AffineAnimCmd gSpriteAffineAnim_861F39C[] =
AFFINEANIMCMD_END,
};
-static const union AffineAnimCmd * const gSpriteAffineAnimTable_861F3C4[] =
+enum {
+ ANIM_BAG_STILL,
+ ANIM_BAG_SHAKE,
+};
+
+static const union AffineAnimCmd * const sAffineAnims_PyramidBag[] =
{
- gSpriteAffineAnim_861F38C,
- gSpriteAffineAnim_861F39C,
+ [ANIM_BAG_STILL] = sAffineAnim_PyramidBag_Still,
+ [ANIM_BAG_SHAKE] = sAffineAnim_PyramidBag_Shake,
};
-static const struct CompressedSpriteSheet gPyramidBagSpriteSheet = {gBattleFrontierGfx_PyramidBag, 0x0800, 0x1024};
+static const struct CompressedSpriteSheet sSpriteSheet_PyramidBag = {gBattleFrontierGfx_PyramidBag, 0x0800, TAG_PYRAMID_BAG};
-static const struct SpriteTemplate gUnknown_0861F3D4 =
+static const struct SpriteTemplate sSpriteTemplate_PyramidBag =
{
- .tileTag = 0x1024,
- .paletteTag = 0x1024,
- .oam = &gOamData_861F378,
- .anims = gSpriteAnimTable_861F388,
+ .tileTag = TAG_PYRAMID_BAG,
+ .paletteTag = TAG_PYRAMID_BAG,
+ .oam = &sOamData_PyramidBag,
+ .anims = sAnims_PyramidBag,
.images = NULL,
- .affineAnims = gSpriteAffineAnimTable_861F3C4,
+ .affineAnims = sAffineAnims_PyramidBag,
.callback = SpriteCallbackDummy
};
-// code
void InitBattlePyramidBagCursorPosition(void)
{
- gPyramidBagCursorData.cursorPosition = 0;
- gPyramidBagCursorData.scrollPosition = 0;
+ gPyramidBagMenuState.cursorPosition = 0;
+ gPyramidBagMenuState.scrollPosition = 0;
}
void CB2_PyramidBagMenuFromStartMenu(void)
{
- GoToBattlePyramidBagMenu(0, CB2_ReturnToFieldWithOpenMenu);
+ GoToBattlePyramidBagMenu(PYRAMIDBAG_LOC_FIELD, CB2_ReturnToFieldWithOpenMenu);
}
-static void sub_81C4F10(void)
+// Unused, CB2_BagMenuFromBattle is used instead
+static void OpenBattlePyramidBagInBattle(void)
{
- GoToBattlePyramidBagMenu(1, CB2_SetUpReshowBattleScreenAfterMenu2);
+ GoToBattlePyramidBagMenu(PYRAMIDBAG_LOC_BATTLE, CB2_SetUpReshowBattleScreenAfterMenu2);
}
+// If the player finishes a round at the Battle Pyramid with insufficient space in their
+// Pyramid Bag to store the party's held items, they may choose items to toss in order to
+// make room.
void ChooseItemsToTossFromPyramidBag(void)
{
ScriptContext2_Enable();
@@ -367,37 +404,37 @@ static void Task_ChooseItemsToTossFromPyramidBag(u8 taskId)
{
CleanupOverworldWindowsAndTilemaps();
gFieldCallback2 = CB2_FadeFromPartyMenu;
- GoToBattlePyramidBagMenu(3, CB2_ReturnToField);
+ GoToBattlePyramidBagMenu(PYRAMIDBAG_LOC_CHOOSE_TOSS, CB2_ReturnToField);
DestroyTask(taskId);
}
}
void CB2_ReturnToPyramidBagMenu(void)
{
- GoToBattlePyramidBagMenu(4, gPyramidBagCursorData.callback);
+ GoToBattlePyramidBagMenu(PYRAMIDBAG_LOC_PREV, gPyramidBagMenuState.callback);
}
-void GoToBattlePyramidBagMenu(u8 a0, void (*callback)(void))
+void GoToBattlePyramidBagMenu(u8 location, void (*callback)(void))
{
- gPyramidBagResources = AllocZeroed(sizeof(*gPyramidBagResources));
+ gPyramidBagMenu = AllocZeroed(sizeof(*gPyramidBagMenu));
- if (a0 != 4)
- gPyramidBagCursorData.unk4 = a0;
+ if (location != PYRAMIDBAG_LOC_PREV)
+ gPyramidBagMenuState.location = location;
if (callback != NULL)
- gPyramidBagCursorData.callback = callback;
+ gPyramidBagMenuState.callback = callback;
- gPyramidBagResources->callback2 = NULL;
- gPyramidBagResources->unk814 = 0xFF;
- gPyramidBagResources->scrollIndicatorsTaskId = TASK_NONE;
+ gPyramidBagMenu->exitCallback = NULL;
+ gPyramidBagMenu->toSwapPos = POS_NONE;
+ gPyramidBagMenu->scrollIndicatorsTaskId = TASK_NONE;
- memset(gPyramidBagResources->itemsSpriteIds, 0xFF, sizeof(gPyramidBagResources->itemsSpriteIds));
- memset(gPyramidBagResources->windowIds, WINDOW_NONE, sizeof(gPyramidBagResources->windowIds));
+ memset(gPyramidBagMenu->spriteIds, SPRITE_NONE, sizeof(gPyramidBagMenu->spriteIds));
+ memset(gPyramidBagMenu->windowIds, WINDOW_NONE, sizeof(gPyramidBagMenu->windowIds));
- SetMainCallback2(sub_81C504C);
+ SetMainCallback2(CB2_LoadPyramidBagMenu);
}
-static void sub_81C501C(void)
+static void CB2_PyramidBag(void)
{
RunTasks();
AnimateSprites();
@@ -406,19 +443,21 @@ static void sub_81C501C(void)
UpdatePaletteFade();
}
-static void sub_81C5038(void)
+static void VBlankCB_PyramidBag(void)
{
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
}
-static void sub_81C504C(void)
+static void CB2_LoadPyramidBagMenu(void)
{
- while (MenuHelpers_CallLinkSomething() != TRUE && sub_81C5078() != TRUE && MenuHelpers_LinkSomething() != TRUE);
+ while (MenuHelpers_CallLinkSomething() != TRUE
+ && LoadPyramidBagMenu() != TRUE
+ && MenuHelpers_LinkSomething() != TRUE);
}
-static bool8 sub_81C5078(void)
+static bool8 LoadPyramidBagMenu(void)
{
switch (gMain.state)
{
@@ -446,30 +485,26 @@ static bool8 sub_81C5078(void)
break;
case 5:
if (!MenuHelpers_LinkSomething())
- {
ResetTasks();
- }
gMain.state++;
break;
case 6:
- sub_81C51DC();
- gPyramidBagResources->state = 0;
+ InitPyramidBagBgs();
+ gPyramidBagMenu->state = 0;
gMain.state++;
break;
case 7:
- if (sub_81C5238())
- {
+ if (LoadPyramidBagGfx())
gMain.state++;
- }
break;
case 8:
- sub_81C6BD8();
+ InitPyramidBagWindows();
gMain.state++;
break;
case 9:
- sub_81C5924();
- sub_81C59BC();
- sub_81C5A20();
+ UpdatePyramidBagList();
+ UpdatePyramidBagCursorPos();
+ InitPyramidBagScroll();
gMain.state++;
break;
case 10:
@@ -477,15 +512,15 @@ static bool8 sub_81C5078(void)
gMain.state++;
break;
case 11:
- sub_81C56F8();
+ CreatePyramidBagInputTask();
gMain.state++;
break;
case 12:
- sub_81C6EF4();
+ CreatePyramidBagSprite();
gMain.state++;
break;
case 13:
- AddScrollArrow();
+ AddScrollArrows();
gMain.state++;
break;
case 14:
@@ -493,28 +528,28 @@ static bool8 sub_81C5078(void)
gMain.state++;
break;
case 15:
- BlendPalettes(PALETTES_ALL, 0x10, 0);
+ BlendPalettes(PALETTES_ALL, 16, 0);
gMain.state++;
break;
case 16:
- BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK);
+ BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);
gPaletteFade.bufferTransferDisabled = FALSE;
gMain.state++;
break;
default:
- SetVBlankCallback(sub_81C5038);
- SetMainCallback2(sub_81C501C);
+ SetVBlankCallback(VBlankCB_PyramidBag);
+ SetMainCallback2(CB2_PyramidBag);
return TRUE;
}
return FALSE;
}
-static void sub_81C51DC(void)
+static void InitPyramidBagBgs(void)
{
ResetVramOamAndBgCntRegs();
ResetBgsAndClearDma3BusyFlags(0);
- InitBgsFromTemplates(0, gUnknown_0861F2B4, ARRAY_COUNT(gUnknown_0861F2B4));
- SetBgTilemapBuffer(2, gPyramidBagResources->tilemapBuffer);
+ InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates));
+ SetBgTilemapBuffer(2, gPyramidBagMenu->tilemapBuffer);
ResetAllBgsCoordinates();
ScheduleBgCopyTilemapToVram(2);
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 |
@@ -526,37 +561,37 @@ static void sub_81C51DC(void)
SetGpuReg(REG_OFFSET_BLDCNT, 0);
}
-static bool8 sub_81C5238(void)
+static bool8 LoadPyramidBagGfx(void)
{
- switch (gPyramidBagResources->state)
+ switch (gPyramidBagMenu->state)
{
case 0:
ResetTempTileDataBuffers();
DecompressAndCopyTileDataToVram(2, gBagScreen_Gfx, 0, 0, 0);
- gPyramidBagResources->state++;
+ gPyramidBagMenu->state++;
break;
case 1:
if (FreeTempTileDataBuffersIfPossible() != TRUE)
{
- LZDecompressWram(gBattleFrontierGfx_PyramidBagTileMap, gPyramidBagResources->tilemapBuffer);
- gPyramidBagResources->state++;
+ LZDecompressWram(gBattleFrontierGfx_PyramidBagTileMap, gPyramidBagMenu->tilemapBuffer);
+ gPyramidBagMenu->state++;
}
break;
case 2:
- LoadCompressedPalette(gUnknown_08D9AF44, 0, 0x20);
- gPyramidBagResources->state++;
+ LoadCompressedPalette(gUnknown_08D9AF44, 0, 32);
+ gPyramidBagMenu->state++;
break;
case 3:
- LoadCompressedSpriteSheet(&gPyramidBagSpriteSheet);
- gPyramidBagResources->state++;
+ LoadCompressedSpriteSheet(&sSpriteSheet_PyramidBag);
+ gPyramidBagMenu->state++;
break;
case 4:
- sub_81C6E98();
- gPyramidBagResources->state++;
+ LoadPyramidBagPalette();
+ gPyramidBagMenu->state++;
break;
default:
LoadListMenuSwapLineGfx();
- gPyramidBagResources->state = 0;
+ gPyramidBagMenu->state = 0;
return TRUE;
}
@@ -566,24 +601,24 @@ static bool8 sub_81C5238(void)
static void SetBagItemsListTemplate(void)
{
u16 i;
- u16 *pyramidItems = gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode];
+ u16 *itemIds = gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode];
- for (i = 0; i < gPyramidBagResources->listMenuCount - 1; i++)
+ for (i = 0; i < gPyramidBagMenu->listMenuCount - 1; i++)
{
- PyramidBag_CopyItemName(gPyramidBagResources->itemStrings[i], pyramidItems[i]);
- gPyramidBagResources->bagListItems[i].name = gPyramidBagResources->itemStrings[i];
- gPyramidBagResources->bagListItems[i].id = i;
+ CopyBagItemName(gPyramidBagMenu->itemStrings[i], itemIds[i]);
+ gPyramidBagMenu->bagListItems[i].name = gPyramidBagMenu->itemStrings[i];
+ gPyramidBagMenu->bagListItems[i].id = i;
}
- StringCopy(gPyramidBagResources->itemStrings[i], gText_CloseBag);
- gPyramidBagResources->bagListItems[i].name = gPyramidBagResources->itemStrings[i];
- gPyramidBagResources->bagListItems[i].id = LIST_CANCEL;
- gMultiuseListMenuTemplate = gUnknown_0861F2C0;
- gMultiuseListMenuTemplate.totalItems = gPyramidBagResources->listMenuCount;
- gMultiuseListMenuTemplate.items = gPyramidBagResources->bagListItems;
- gMultiuseListMenuTemplate.maxShowed = gPyramidBagResources->listMenuMaxShown;
+ StringCopy(gPyramidBagMenu->itemStrings[i], gText_CloseBag);
+ gPyramidBagMenu->bagListItems[i].name = gPyramidBagMenu->itemStrings[i];
+ gPyramidBagMenu->bagListItems[i].id = LIST_CANCEL;
+ gMultiuseListMenuTemplate = sListMenuTemplate;
+ gMultiuseListMenuTemplate.totalItems = gPyramidBagMenu->listMenuCount;
+ gMultiuseListMenuTemplate.items = gPyramidBagMenu->bagListItems;
+ gMultiuseListMenuTemplate.maxShowed = gPyramidBagMenu->listMenuMaxShown;
}
-static void PyramidBag_CopyItemName(u8 *dst, u16 itemId)
+static void CopyBagItemName(u8 *dst, u16 itemId)
{
if (ItemId_GetPocket(itemId) == POCKET_BERRIES)
{
@@ -597,45 +632,48 @@ static void PyramidBag_CopyItemName(u8 *dst, u16 itemId)
}
}
-static void PyramidBagMoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list)
+static void BagCursorMoved(s32 itemIndex, bool8 onInit, struct ListMenu *list)
{
if (onInit != TRUE)
{
PlaySE(SE_SELECT);
- sub_81C6F20();
+ ShakePyramidBag();
}
- if (gPyramidBagResources->unk814 == 0xFF)
+ if (gPyramidBagMenu->toSwapPos == POS_NONE)
{
- sub_81C6FF8(gPyramidBagResources->unk815 ^ 1);
+ FreeItemIconSpriteByAltId(gPyramidBagMenu->isAltIcon ^ 1);
if (itemIndex != LIST_CANCEL)
- ShowItemImage(gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode][itemIndex], gPyramidBagResources->unk815);
+ ShowItemIcon(gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode][itemIndex], gPyramidBagMenu->isAltIcon);
else
- ShowItemImage(0xFFFF, gPyramidBagResources->unk815);
- gPyramidBagResources->unk815 ^= 1;
+ ShowItemIcon(0xFFFF, gPyramidBagMenu->isAltIcon); // Show exit arrow if on Cancel
+ gPyramidBagMenu->isAltIcon ^= 1;
PrintItemDescription(itemIndex);
}
}
-static void PrintItemQuantity(u8 windowId, s32 itemIndex, u8 y)
+static void PrintItemQuantity(u8 windowId, u32 itemIndex, u8 y)
{
s32 xAlign;
if (itemIndex == LIST_CANCEL)
return;
- if (gPyramidBagResources->unk814 != 0xFF)
+ if (gPyramidBagMenu->toSwapPos != POS_NONE)
{
- if (gPyramidBagResources->unk814 == (u8)(itemIndex))
- sub_81C5AB8(y, 1);
+ // Performing a swap. Keep a gray selector arrow on the position to swap to
+ // and erase the selector arrow anywhere else
+ if (gPyramidBagMenu->toSwapPos == (u8)(itemIndex))
+ PrintSelectorArrowAtPos(y, COLORID_LIGHT_GRAY);
else
- sub_81C5AB8(y, 0xFF);
+ PrintSelectorArrowAtPos(y, COLORID_NONE);
}
+
ConvertIntToDecimalStringN(gStringVar1,
gSaveBlock2Ptr->frontier.pyramidBag.quantity[gSaveBlock2Ptr->frontier.lvlMode][itemIndex],
STR_CONV_MODE_RIGHT_ALIGN,
2);
StringExpandPlaceholders(gStringVar4, gText_xVar1);
- xAlign = GetStringRightAlignXOffset(7, gStringVar4, 0x77);
- PrintOnWindow_Font7(windowId, gStringVar4, xAlign, y, 0, 0, TEXT_SPEED_FF, 0);
+ xAlign = GetStringRightAlignXOffset(7, gStringVar4, 119);
+ PrintOnWindow_Font7(windowId, gStringVar4, xAlign, y, 0, 0, TEXT_SPEED_FF, COLORID_DARK_GRAY);
}
static void PrintItemDescription(s32 listMenuId)
@@ -647,34 +685,42 @@ static void PrintItemDescription(s32 listMenuId)
}
else
{
- StringCopy(gStringVar1, gReturnToXStringsTable2[gPyramidBagCursorData.unk4]);
+ StringCopy(gStringVar1, gPyramidBagMenu_ReturnToStrings[gPyramidBagMenuState.location]);
StringExpandPlaceholders(gStringVar4, gText_ReturnToVar1);
desc = gStringVar4;
}
- FillWindowPixelBuffer(1, PIXEL_FILL(0));
- PrintOnWindow_Font1(1, desc, 3, 0, 0, 1, 0, 0);
+ FillWindowPixelBuffer(WIN_INFO, PIXEL_FILL(0));
+ PrintOnWindow_Font1(WIN_INFO, desc, 3, 0, 0, 1, 0, COLORID_DARK_GRAY);
}
-static void AddScrollArrow(void)
+static void AddScrollArrows(void)
{
- if (gPyramidBagResources->scrollIndicatorsTaskId == TASK_NONE)
- gPyramidBagResources->scrollIndicatorsTaskId = AddScrollIndicatorArrowPairParameterized(2, 172, 12, 148, gPyramidBagResources->listMenuCount - gPyramidBagResources->listMenuMaxShown, 0xB5E, 0xB5E, &gPyramidBagCursorData.scrollPosition);
+ if (gPyramidBagMenu->scrollIndicatorsTaskId == TASK_NONE)
+ gPyramidBagMenu->scrollIndicatorsTaskId = AddScrollIndicatorArrowPairParameterized(SCROLL_ARROW_UP, 172, 12, 148,
+ gPyramidBagMenu->listMenuCount - gPyramidBagMenu->listMenuMaxShown,
+ TAG_SCROLL_ARROW, TAG_SCROLL_ARROW,
+ &gPyramidBagMenuState.scrollPosition);
}
static void RemoveScrollArrow(void)
{
- if (gPyramidBagResources->scrollIndicatorsTaskId != TASK_NONE)
+ if (gPyramidBagMenu->scrollIndicatorsTaskId != TASK_NONE)
{
- RemoveScrollIndicatorArrowPair(gPyramidBagResources->scrollIndicatorsTaskId);
- gPyramidBagResources->scrollIndicatorsTaskId = TASK_NONE;
+ RemoveScrollIndicatorArrowPair(gPyramidBagMenu->scrollIndicatorsTaskId);
+ gPyramidBagMenu->scrollIndicatorsTaskId = TASK_NONE;
}
}
-static void sub_81C56F8(void)
+#define tListTaskId data[0]
+#define tListPos data[1]
+#define tQuantity data[2]
+#define tNumToToss data[8]
+
+static void CreatePyramidBagInputTask(void)
{
u8 taskId = CreateTask(Task_HandlePyramidBagInput, 0);
s16 *data = gTasks[taskId].data;
- data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gPyramidBagCursorData.scrollPosition, gPyramidBagCursorData.cursorPosition);
+ tListTaskId = ListMenuInit(&gMultiuseListMenuTemplate, gPyramidBagMenuState.scrollPosition, gPyramidBagMenuState.cursorPosition);
}
static void SwapItems(u8 id1, u8 id2)
@@ -728,9 +774,9 @@ static void CompactItems(void)
for (i = 0; i < PYRAMID_BAG_ITEMS_COUNT; i++)
{
- if (itemIds[i] == 0 || quantities[i] == 0)
+ if (itemIds[i] == ITEM_NONE || quantities[i] == 0)
{
- itemIds[i] = 0;
+ itemIds[i] = ITEM_NONE;
quantities[i] = 0;
}
}
@@ -738,98 +784,97 @@ static void CompactItems(void)
{
for (j = i + 1; j < PYRAMID_BAG_ITEMS_COUNT; j++)
{
- if (itemIds[i] == 0 || quantities[i] == 0)
+ if (itemIds[i] == ITEM_NONE || quantities[i] == 0)
SwapItems(i, j);
}
}
}
-void sub_81C5924(void)
+void UpdatePyramidBagList(void)
{
u16 i;
u16 *itemIds = gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode];
CompactItems();
- gPyramidBagResources->listMenuCount = 0;
+ gPyramidBagMenu->listMenuCount = 0;
for (i = 0; i < PYRAMID_BAG_ITEMS_COUNT; i++)
{
- if (itemIds[i] != 0)
- gPyramidBagResources->listMenuCount++;
+ if (itemIds[i] != ITEM_NONE)
+ gPyramidBagMenu->listMenuCount++;
}
- gPyramidBagResources->listMenuCount++;
- if (gPyramidBagResources->listMenuCount > 8)
- gPyramidBagResources->listMenuMaxShown = 8;
+ gPyramidBagMenu->listMenuCount++;
+ if (gPyramidBagMenu->listMenuCount > 8)
+ gPyramidBagMenu->listMenuMaxShown = 8;
else
- gPyramidBagResources->listMenuMaxShown = gPyramidBagResources->listMenuCount;
+ gPyramidBagMenu->listMenuMaxShown = gPyramidBagMenu->listMenuCount;
}
-void sub_81C59BC(void)
+void UpdatePyramidBagCursorPos(void)
{
- if (gPyramidBagCursorData.scrollPosition != 0 && gPyramidBagCursorData.scrollPosition + gPyramidBagResources->listMenuMaxShown > gPyramidBagResources->listMenuCount)
- gPyramidBagCursorData.scrollPosition = gPyramidBagResources->listMenuCount - gPyramidBagResources->listMenuMaxShown;
- if (gPyramidBagCursorData.scrollPosition + gPyramidBagCursorData.cursorPosition >= gPyramidBagResources->listMenuCount)
+ if (gPyramidBagMenuState.scrollPosition != 0 && gPyramidBagMenuState.scrollPosition + gPyramidBagMenu->listMenuMaxShown > gPyramidBagMenu->listMenuCount)
+ gPyramidBagMenuState.scrollPosition = gPyramidBagMenu->listMenuCount - gPyramidBagMenu->listMenuMaxShown;
+
+ if (gPyramidBagMenuState.scrollPosition + gPyramidBagMenuState.cursorPosition >= gPyramidBagMenu->listMenuCount)
{
- if (gPyramidBagResources->listMenuCount == 0)
- gPyramidBagCursorData.cursorPosition = 0;
+ if (gPyramidBagMenu->listMenuCount == 0)
+ gPyramidBagMenuState.cursorPosition = 0;
else
- gPyramidBagCursorData.cursorPosition = gPyramidBagResources->listMenuCount - 1;
+ gPyramidBagMenuState.cursorPosition = gPyramidBagMenu->listMenuCount - 1;
}
}
-static void sub_81C5A20(void)
+static void InitPyramidBagScroll(void)
{
u8 i;
- if (gPyramidBagCursorData.cursorPosition > 4)
+ if (gPyramidBagMenuState.cursorPosition > 4)
{
- for (i = 0; i <= gPyramidBagCursorData.cursorPosition - 4; i++)
+ for (i = 0; i <= gPyramidBagMenuState.cursorPosition - 4; i++)
{
- if (gPyramidBagCursorData.scrollPosition + gPyramidBagResources->listMenuMaxShown == gPyramidBagResources->listMenuCount)
- {
- // daycare.c sends its regards.
+ if (gPyramidBagMenuState.scrollPosition + gPyramidBagMenu->listMenuMaxShown == gPyramidBagMenu->listMenuCount)
break;
- }
- gPyramidBagCursorData.cursorPosition--;
- gPyramidBagCursorData.scrollPosition++;
+
+ gPyramidBagMenuState.cursorPosition--;
+ gPyramidBagMenuState.scrollPosition++;
}
}
}
-static void sub_81C5A98(u8 listMenuTaskId, u8 arg1)
+static void PrintSelectorArrow(u8 listMenuTaskId, u8 colorId)
{
u8 y = ListMenuGetYCoordForPrintingArrowCursor(listMenuTaskId);
- sub_81C5AB8(y, arg1);
+ PrintSelectorArrowAtPos(y, colorId);
}
-static void sub_81C5AB8(u8 y, u8 arg1)
+static void PrintSelectorArrowAtPos(u8 y, u8 colorId)
{
- if (arg1 == 0xFF)
- FillWindowPixelRect(0, PIXEL_FILL(0), 0, y, GetMenuCursorDimensionByFont(1, 0), GetMenuCursorDimensionByFont(1, 1));
+ if (colorId == COLORID_NONE) // If 'no color', erase arrow
+ FillWindowPixelRect(WIN_LIST, PIXEL_FILL(0), 0, y, GetMenuCursorDimensionByFont(1, 0), GetMenuCursorDimensionByFont(1, 1));
else
- PrintOnWindow_Font1(0, gText_SelectorArrow2, 0, y, 0, 0, 0, arg1);
+ PrintOnWindow_Font1(WIN_LIST, gText_SelectorArrow2, 0, y, 0, 0, 0, colorId);
}
-void CloseBattlePyramidBagAndSetCallback(u8 taskId)
+void CloseBattlePyramidBag(u8 taskId)
{
- BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK);
- gTasks[taskId].func = sub_81C5B4C;
+ BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK);
+ gTasks[taskId].func = Task_ClosePyramidBag;
}
-static void sub_81C5B4C(u8 taskId)
+static void Task_ClosePyramidBag(u8 taskId)
{
s16 *data = gTasks[taskId].data;
if (!gPaletteFade.active)
{
- DestroyListMenuTask(data[0], &gPyramidBagCursorData.scrollPosition, &gPyramidBagCursorData.cursorPosition);
- if (gPyramidBagResources->callback2 != NULL)
- SetMainCallback2(gPyramidBagResources->callback2);
+ DestroyListMenuTask(tListTaskId, &gPyramidBagMenuState.scrollPosition, &gPyramidBagMenuState.cursorPosition);
+ if (gPyramidBagMenu->exitCallback != NULL)
+ SetMainCallback2(gPyramidBagMenu->exitCallback);
else
- SetMainCallback2(gPyramidBagCursorData.callback);
+ SetMainCallback2(gPyramidBagMenuState.callback);
RemoveScrollArrow();
ResetSpriteData();
FreeAllSpritePalettes();
FreeAllWindowBuffers();
- Free(gPyramidBagResources);
+ Free(gPyramidBagMenu);
DestroyTask(taskId);
}
}
@@ -837,108 +882,110 @@ static void sub_81C5B4C(u8 taskId)
static void Task_HandlePyramidBagInput(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- if (MenuHelpers_CallLinkSomething() != TRUE && !gPaletteFade.active)
+ if (MenuHelpers_CallLinkSomething() == TRUE || gPaletteFade.active)
+ return;
+
+ if (JOY_NEW(SELECT_BUTTON))
{
- if (JOY_NEW(SELECT_BUTTON))
+ if (gPyramidBagMenuState.location != PYRAMIDBAG_LOC_PARTY)
{
- if (gPyramidBagCursorData.unk4 != 2)
+ ListMenuGetScrollAndRow(tListTaskId, &gPyramidBagMenuState.scrollPosition, &gPyramidBagMenuState.cursorPosition);
+ if (gPyramidBagMenuState.scrollPosition + gPyramidBagMenuState.cursorPosition != gPyramidBagMenu->listMenuCount - 1)
{
- ListMenuGetScrollAndRow(data[0], &gPyramidBagCursorData.scrollPosition, &gPyramidBagCursorData.cursorPosition);
- if (gPyramidBagCursorData.scrollPosition + gPyramidBagCursorData.cursorPosition != gPyramidBagResources->listMenuCount - 1)
- {
- PlaySE(SE_SELECT);
- Task_BeginItemSwap(taskId);
- }
+ PlaySE(SE_SELECT);
+ Task_BeginItemSwap(taskId);
}
}
- else
+ }
+ else
+ {
+ s32 listId = ListMenu_ProcessInput(tListTaskId);
+ ListMenuGetScrollAndRow(tListTaskId, &gPyramidBagMenuState.scrollPosition, &gPyramidBagMenuState.cursorPosition);
+ switch (listId)
{
- s32 listId = ListMenu_ProcessInput(data[0]);
- ListMenuGetScrollAndRow(data[0], &gPyramidBagCursorData.scrollPosition, &gPyramidBagCursorData.cursorPosition);
- switch (listId)
- {
- case LIST_NOTHING_CHOSEN:
- break;
- case LIST_CANCEL:
- PlaySE(SE_SELECT);
- gSpecialVar_ItemId = 0;
- CloseBattlePyramidBagAndSetCallback(taskId);
- break;
- default:
- PlaySE(SE_SELECT);
- gSpecialVar_ItemId = gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode][listId];
- data[1] = listId;
- data[2] = gSaveBlock2Ptr->frontier.pyramidBag.quantity[gSaveBlock2Ptr->frontier.lvlMode][listId];
- if (gPyramidBagCursorData.unk4 == 2)
- sub_81C674C(taskId);
- else
- sub_81C5D20(taskId);
- break;
- }
+ case LIST_NOTHING_CHOSEN:
+ break;
+ case LIST_CANCEL:
+ PlaySE(SE_SELECT);
+ gSpecialVar_ItemId = ITEM_NONE;
+ CloseBattlePyramidBag(taskId);
+ break;
+ default:
+ PlaySE(SE_SELECT);
+ gSpecialVar_ItemId = gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode][listId];
+ tListPos = listId;
+ tQuantity = gSaveBlock2Ptr->frontier.pyramidBag.quantity[gSaveBlock2Ptr->frontier.lvlMode][listId];
+ if (gPyramidBagMenuState.location == PYRAMIDBAG_LOC_PARTY)
+ TryCloseBagToGiveItem(taskId);
+ else
+ OpenContextMenu(taskId);
+ break;
}
}
}
-static void sub_81C5D20(u8 taskId)
+static void OpenContextMenu(u8 taskId)
{
s16 *data = gTasks[taskId].data;
RemoveScrollArrow();
- sub_81C5A98(data[0], 1);
- switch (gPyramidBagCursorData.unk4)
+ PrintSelectorArrow(tListTaskId, COLORID_LIGHT_GRAY);
+ switch (gPyramidBagMenuState.location)
{
default:
- gPyramidBagResources->menuActionIds = sFieldMenuActionIds;
- gPyramidBagResources->menuActionsCount = ARRAY_COUNT(sFieldMenuActionIds);
+// case PYRAMIDBAG_LOC_FIELD:
+// case PYRAMIDBAG_LOC_PARTY:
+ gPyramidBagMenu->menuActionIds = sMenuActionIds_Field;
+ gPyramidBagMenu->menuActionsCount = ARRAY_COUNT(sMenuActionIds_Field);
break;
- case 1:
+ case PYRAMIDBAG_LOC_BATTLE:
if (ItemId_GetBattleUsage(gSpecialVar_ItemId))
{
- gPyramidBagResources->menuActionIds = sBattleMenuActionIds;
- gPyramidBagResources->menuActionsCount = ARRAY_COUNT(sBattleMenuActionIds);
+ gPyramidBagMenu->menuActionIds = sMenuActionIds_Battle;
+ gPyramidBagMenu->menuActionsCount = ARRAY_COUNT(sMenuActionIds_Battle);
}
else
{
- gPyramidBagResources->menuActionIds = gUnknown_0861F310;
- gPyramidBagResources->menuActionsCount = ARRAY_COUNT(gUnknown_0861F310);
+ gPyramidBagMenu->menuActionIds = sMenuActionIds_BattleCannotUse;
+ gPyramidBagMenu->menuActionsCount = ARRAY_COUNT(sMenuActionIds_BattleCannotUse);
}
break;
- case 3:
- gPyramidBagResources->menuActionIds = gUnknown_0861F30C;
- gPyramidBagResources->menuActionsCount = ARRAY_COUNT(gUnknown_0861F30C);
+ case PYRAMIDBAG_LOC_CHOOSE_TOSS:
+ gPyramidBagMenu->menuActionIds = sMenuActionIds_ChooseToss;
+ gPyramidBagMenu->menuActionsCount = ARRAY_COUNT(sMenuActionIds_ChooseToss);
break;
}
CopyItemName(gSpecialVar_ItemId, gStringVar1);
StringExpandPlaceholders(gStringVar4, gText_Var1IsSelected);
- FillWindowPixelBuffer(1, PIXEL_FILL(0));
- PrintOnWindow_Font1(1, gStringVar4, 3, 0, 0, 1, 0, 0);
- if (gPyramidBagResources->menuActionsCount == 1)
- sub_81C5EAC(sub_81C6D24(0));
- else if (gPyramidBagResources->menuActionsCount == 2)
- sub_81C5EAC(sub_81C6D24(1));
+ FillWindowPixelBuffer(WIN_INFO, PIXEL_FILL(0));
+ PrintOnWindow_Font1(WIN_INFO, gStringVar4, 3, 0, 0, 1, 0, COLORID_DARK_GRAY);
+ if (gPyramidBagMenu->menuActionsCount == 1)
+ PrintMenuActionText_SingleRow(OpenMenuActionWindowById(MENU_WIN_1x1));
+ else if (gPyramidBagMenu->menuActionsCount == 2)
+ PrintMenuActionText_SingleRow(OpenMenuActionWindowById(MENU_WIN_1x2));
else
- sub_81C5F08(sub_81C6D24(2), 2, 2);
+ PrintMenuActionText_MultiRow(OpenMenuActionWindowById(MENU_WIN_2x2), 2, 2);
- if (gPyramidBagResources->menuActionsCount == 4)
- gTasks[taskId].func = HandleMenuActionInput;
+ if (gPyramidBagMenu->menuActionsCount == 2 * 2) // Assumes any non 2x2 menu is single-row
+ gTasks[taskId].func = HandleMenuActionInput_2x2;
else
- gTasks[taskId].func = HandleFewMenuActionsInput;
+ gTasks[taskId].func = HandleMenuActionInput_SingleRow;
}
-static void sub_81C5EAC(u8 windowId)
+static void PrintMenuActionText_SingleRow(u8 windowId)
{
- AddItemMenuActionTextPrinters(windowId, 7, 8, 1, 0, 0x10, gPyramidBagResources->menuActionsCount, sMenuActions, gPyramidBagResources->menuActionIds);
- InitMenuInUpperLeftCornerPlaySoundWhenAPressed(windowId, gPyramidBagResources->menuActionsCount, 0);
+ AddItemMenuActionTextPrinters(windowId, 7, 8, 1, 0, 0x10, gPyramidBagMenu->menuActionsCount, sMenuActions, gPyramidBagMenu->menuActionIds);
+ InitMenuInUpperLeftCornerPlaySoundWhenAPressed(windowId, gPyramidBagMenu->menuActionsCount, 0);
}
-static void sub_81C5F08(u8 windowId, u8 horizontalCount, u8 verticalCount)
+static void PrintMenuActionText_MultiRow(u8 windowId, u8 horizontalCount, u8 verticalCount)
{
- sub_8198DBC(windowId, 7, 8, 1, 0x38, horizontalCount, verticalCount, sMenuActions, gPyramidBagResources->menuActionIds);
- sub_8199944(windowId, 0x38, horizontalCount, verticalCount, 0);
+ PrintMenuActionGrid(windowId, 7, 8, 1, 56, horizontalCount, verticalCount, sMenuActions, gPyramidBagMenu->menuActionIds);
+ InitMenuActionGrid(windowId, 56, horizontalCount, verticalCount, 0);
}
-static void HandleFewMenuActionsInput(u8 taskId)
+static void HandleMenuActionInput_SingleRow(u8 taskId)
{
if (MenuHelpers_CallLinkSomething() != TRUE)
{
@@ -953,14 +1000,14 @@ static void HandleFewMenuActionsInput(u8 taskId)
break;
default:
PlaySE(SE_SELECT);
- if (sMenuActions[gPyramidBagResources->menuActionIds[id]].func.void_u8 != NULL)
- sMenuActions[gPyramidBagResources->menuActionIds[id]].func.void_u8(taskId);
+ if (sMenuActions[gPyramidBagMenu->menuActionIds[id]].func.void_u8 != NULL)
+ sMenuActions[gPyramidBagMenu->menuActionIds[id]].func.void_u8(taskId);
break;
}
}
}
-static void HandleMenuActionInput(u8 taskId)
+static void HandleMenuActionInput_2x2(u8 taskId)
{
if (MenuHelpers_CallLinkSomething() != TRUE)
{
@@ -975,7 +1022,7 @@ static void HandleMenuActionInput(u8 taskId)
}
else if (JOY_NEW(DPAD_DOWN))
{
- if (id < gPyramidBagResources->menuActionsCount - 2 && IsValidMenuAction(id + 2))
+ if (id < gPyramidBagMenu->menuActionsCount - 2 && IsValidMenuAction(id + 2))
{
PlaySE(SE_SELECT);
ChangeListMenuCursorPosition(MENU_CURSOR_DELTA_NONE, MENU_CURSOR_DELTA_DOWN);
@@ -1000,8 +1047,8 @@ static void HandleMenuActionInput(u8 taskId)
else if (JOY_NEW(A_BUTTON))
{
PlaySE(SE_SELECT);
- if (sMenuActions[gPyramidBagResources->menuActionIds[id]].func.void_u8 != NULL)
- sMenuActions[gPyramidBagResources->menuActionIds[id]].func.void_u8(taskId);
+ if (sMenuActions[gPyramidBagMenu->menuActionIds[id]].func.void_u8 != NULL)
+ sMenuActions[gPyramidBagMenu->menuActionIds[id]].func.void_u8(taskId);
}
else if (JOY_NEW(B_BUTTON))
{
@@ -1015,22 +1062,22 @@ static bool8 IsValidMenuAction(s8 actionTableId)
{
if (actionTableId < 0)
return FALSE;
- else if (actionTableId > gPyramidBagResources->menuActionsCount)
+ else if (actionTableId > gPyramidBagMenu->menuActionsCount)
return FALSE;
- else if (gPyramidBagResources->menuActionIds[actionTableId] == ACTION_DUMMY)
+ else if (gPyramidBagMenu->menuActionIds[actionTableId] == ACTION_DUMMY)
return FALSE;
else
return TRUE;
}
-static void sub_81C61A8(void)
+static void CloseMenuActionWindow(void)
{
- if (gPyramidBagResources->menuActionsCount == 1)
- sub_81C6D6C(0);
- else if (gPyramidBagResources->menuActionsCount == 2)
- sub_81C6D6C(1);
+ if (gPyramidBagMenu->menuActionsCount == 1)
+ CloseMenuActionWindowById(MENU_WIN_1x1);
+ else if (gPyramidBagMenu->menuActionsCount == 2)
+ CloseMenuActionWindowById(MENU_WIN_1x2);
else
- sub_81C6D6C(2);
+ CloseMenuActionWindowById(MENU_WIN_2x2);
}
static void BagAction_UseOnField(u8 taskId)
@@ -1042,13 +1089,13 @@ static void BagAction_UseOnField(u8 taskId)
|| pocketId == POCKET_TM_HM
|| ItemIsMail(gSpecialVar_ItemId) == TRUE)
{
- sub_81C61A8();
+ CloseMenuActionWindow();
DisplayItemMessageInBattlePyramid(taskId, gText_DadsAdvice, Task_CloseBattlePyramidBagMessage);
}
else if (ItemId_GetFieldFunc(gSpecialVar_ItemId) != NULL)
{
- sub_81C61A8();
- FillWindowPixelBuffer(1, PIXEL_FILL(0));
+ CloseMenuActionWindow();
+ FillWindowPixelBuffer(WIN_INFO, PIXEL_FILL(0));
ScheduleBgCopyTilemapToVram(0);
ItemId_GetFieldFunc(gSpecialVar_ItemId)(taskId);
}
@@ -1058,17 +1105,17 @@ static void BagAction_Cancel(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- sub_81C61A8();
- PrintItemDescription(data[1]);
+ CloseMenuActionWindow();
+ PrintItemDescription(tListPos);
ScheduleBgCopyTilemapToVram(0);
ScheduleBgCopyTilemapToVram(1);
- sub_81C5A98(data[0], 0);
+ PrintSelectorArrow(tListTaskId, COLORID_DARK_GRAY);
SetTaskToMainPyramidBagInputHandler(taskId);
}
static void SetTaskToMainPyramidBagInputHandler(u8 taskId)
{
- AddScrollArrow();
+ AddScrollArrows();
gTasks[taskId].func = Task_HandlePyramidBagInput;
}
@@ -1076,86 +1123,86 @@ static void BagAction_Toss(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- sub_81C61A8();
- data[8] = 1;
- if (data[2] == 1)
+ CloseMenuActionWindow();
+ tNumToToss = 1;
+ if (tQuantity == 1)
{
- sub_81C6350(taskId);
+ AskConfirmToss(taskId);
}
else
{
CopyItemName(gSpecialVar_ItemId, gStringVar1);
StringExpandPlaceholders(gStringVar4, gText_TossHowManyVar1s);
- FillWindowPixelBuffer(1, PIXEL_FILL(0));
- PrintOnWindow_Font1(1, gStringVar4, 3, 0, 0, 1, 0, 0);
- sub_81C6404();
- gTasks[taskId].func = sub_81C64B4;
+ FillWindowPixelBuffer(WIN_INFO, PIXEL_FILL(0));
+ PrintOnWindow_Font1(WIN_INFO, gStringVar4, 3, 0, 0, 1, 0, COLORID_DARK_GRAY);
+ ShowNumToToss();
+ gTasks[taskId].func = Task_ChooseHowManyToToss;
}
}
-static void sub_81C6350(u8 taskId)
+static void AskConfirmToss(u8 taskId)
{
s16 *data = gTasks[taskId].data;
CopyItemName(gSpecialVar_ItemId, gStringVar1);
- ConvertIntToDecimalStringN(gStringVar2, data[8], STR_CONV_MODE_LEFT_ALIGN, 2);
+ ConvertIntToDecimalStringN(gStringVar2, tNumToToss, STR_CONV_MODE_LEFT_ALIGN, 2);
StringExpandPlaceholders(gStringVar4, gText_ConfirmTossItems);
- FillWindowPixelBuffer(1, PIXEL_FILL(0));
- PrintOnWindow_Font1(1, gStringVar4, 3, 0, 0, 1, 0, 0);
- sub_81C6DAC(taskId, &sYesNoTossFuncions);
+ FillWindowPixelBuffer(WIN_INFO, PIXEL_FILL(0));
+ PrintOnWindow_Font1(WIN_INFO, gStringVar4, 3, 0, 0, 1, 0, COLORID_DARK_GRAY);
+ CreatePyramidBagYesNo(taskId, &sYesNoTossFuncions);
}
static void DontTossItem(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- PrintItemDescription(data[1]);
- sub_81C5A98(data[0], 0);
+ PrintItemDescription(tListPos);
+ PrintSelectorArrow(tListTaskId, COLORID_DARK_GRAY);
SetTaskToMainPyramidBagInputHandler(taskId);
}
-static void sub_81C6404(void)
+static void ShowNumToToss(void)
{
s32 x;
-
ConvertIntToDecimalStringN(gStringVar1, 1, STR_CONV_MODE_LEADING_ZEROS, 2);
StringExpandPlaceholders(gStringVar4, gText_xVar1);
- sub_81C6CEC(3);
+ DrawTossNumberWindow(WIN_TOSS_NUM);
x = GetStringCenterAlignXOffset(1, gStringVar4, 0x28);
- AddTextPrinterParameterized(3, 1, gStringVar4, x, 2, 0, NULL);
+ AddTextPrinterParameterized(WIN_TOSS_NUM, 1, gStringVar4, x, 2, 0, NULL);
}
-static void sub_81C645C(s16 value)
+static void UpdateNumToToss(s16 num)
{
s32 x;
-
- ConvertIntToDecimalStringN(gStringVar1, value, STR_CONV_MODE_LEADING_ZEROS, 2);
+ ConvertIntToDecimalStringN(gStringVar1, num, STR_CONV_MODE_LEADING_ZEROS, 2);
StringExpandPlaceholders(gStringVar4, gText_xVar1);
x = GetStringCenterAlignXOffset(1, gStringVar4, 0x28);
- AddTextPrinterParameterized(3, 1, gStringVar4, x, 2, 0, NULL);
+ AddTextPrinterParameterized(WIN_TOSS_NUM, 1, gStringVar4, x, 2, 0, NULL);
}
-static void sub_81C64B4(u8 taskId)
+static void Task_ChooseHowManyToToss(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- if (AdjustQuantityAccordingToDPadInput(&data[8], data[2]) == TRUE)
+ if (AdjustQuantityAccordingToDPadInput(&tNumToToss, tQuantity) == TRUE)
{
- sub_81C645C(data[8]);
+ UpdateNumToToss(tNumToToss);
}
else if (JOY_NEW(A_BUTTON))
{
+ // Toss
PlaySE(SE_SELECT);
- ClearStdWindowAndFrameToTransparent(3, 0);
- ClearWindowTilemap(3);
+ ClearStdWindowAndFrameToTransparent(WIN_TOSS_NUM, 0);
+ ClearWindowTilemap(WIN_TOSS_NUM);
ScheduleBgCopyTilemapToVram(1);
- sub_81C6350(taskId);
+ AskConfirmToss(taskId);
}
else if (JOY_NEW(B_BUTTON))
{
+ // Cancel tossing
PlaySE(SE_SELECT);
- ClearStdWindowAndFrameToTransparent(3, 0);
- ClearWindowTilemap(3);
+ ClearStdWindowAndFrameToTransparent(WIN_TOSS_NUM, 0);
+ ClearWindowTilemap(WIN_TOSS_NUM);
ScheduleBgCopyTilemapToVram(1);
DontTossItem(taskId);
}
@@ -1166,28 +1213,28 @@ static void TossItem(u8 taskId)
s16 *data = gTasks[taskId].data;
CopyItemName(gSpecialVar_ItemId, gStringVar1);
- ConvertIntToDecimalStringN(gStringVar2, data[8], STR_CONV_MODE_LEFT_ALIGN, 2);
+ ConvertIntToDecimalStringN(gStringVar2, tNumToToss, STR_CONV_MODE_LEFT_ALIGN, 2);
StringExpandPlaceholders(gStringVar4, gText_ThrewAwayVar2Var1s);
- FillWindowPixelBuffer(1, PIXEL_FILL(0));
- PrintOnWindow_Font1(1, gStringVar4, 3, 0, 0, 1, 0, 0);
- gTasks[taskId].func = sub_81C65CC;
+ FillWindowPixelBuffer(WIN_INFO, PIXEL_FILL(0));
+ PrintOnWindow_Font1(WIN_INFO, gStringVar4, 3, 0, 0, 1, 0, COLORID_DARK_GRAY);
+ gTasks[taskId].func = Task_TossItem;
}
-static void sub_81C65CC(u8 taskId)
+static void Task_TossItem(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- u16 *scrollOffset = &gPyramidBagCursorData.scrollPosition;
- u16 *selectedRow = &gPyramidBagCursorData.cursorPosition;
+ u16 *scrollOffset = &gPyramidBagMenuState.scrollPosition;
+ u16 *selectedRow = &gPyramidBagMenuState.cursorPosition;
if (JOY_NEW(A_BUTTON | B_BUTTON))
{
PlaySE(SE_SELECT);
- RemovePyramidBagItem(gSpecialVar_ItemId, data[8]);
- DestroyListMenuTask(data[0], scrollOffset, selectedRow);
- sub_81C5924();
- sub_81C59BC();
+ RemovePyramidBagItem(gSpecialVar_ItemId, tNumToToss);
+ DestroyListMenuTask(tListTaskId, scrollOffset, selectedRow);
+ UpdatePyramidBagList();
+ UpdatePyramidBagCursorPos();
SetBagItemsListTemplate();
- data[0] = ListMenuInit(&gMultiuseListMenuTemplate, *scrollOffset, *selectedRow);
+ tListTaskId = ListMenuInit(&gMultiuseListMenuTemplate, *scrollOffset, *selectedRow);
ScheduleBgCopyTilemapToVram(0);
SetTaskToMainPyramidBagInputHandler(taskId);
}
@@ -1195,30 +1242,30 @@ static void sub_81C65CC(u8 taskId)
static void BagAction_Give(u8 taskId)
{
- sub_81C61A8();
+ CloseMenuActionWindow();
if (ItemIsMail(gSpecialVar_ItemId) == TRUE)
{
- DisplayItemMessageInBattlePyramid(taskId, gText_CantWriteMail, sub_81C66EC);
+ DisplayItemMessageInBattlePyramid(taskId, gText_CantWriteMail, Task_WaitCloseErrorMessage);
}
else if (!ItemId_GetImportance(gSpecialVar_ItemId))
{
- gPyramidBagResources->callback2 = CB2_ChooseMonToGiveItem;
- CloseBattlePyramidBagAndSetCallback(taskId);
+ gPyramidBagMenu->exitCallback = CB2_ChooseMonToGiveItem;
+ CloseBattlePyramidBag(taskId);
}
else
{
- sub_81C66AC(taskId);
+ ShowCantHoldMessage(taskId);
}
}
-static void sub_81C66AC(u8 taskId)
+static void ShowCantHoldMessage(u8 taskId)
{
CopyItemName(gSpecialVar_ItemId, gStringVar1);
StringExpandPlaceholders(gStringVar4, gText_Var1CantBeHeld);
- DisplayItemMessageInBattlePyramid(taskId, gStringVar4, sub_81C66EC);
+ DisplayItemMessageInBattlePyramid(taskId, gStringVar4, Task_WaitCloseErrorMessage);
}
-static void sub_81C66EC(u8 taskId)
+static void Task_WaitCloseErrorMessage(u8 taskId)
{
if (JOY_NEW(A_BUTTON))
{
@@ -1232,26 +1279,26 @@ void Task_CloseBattlePyramidBagMessage(u8 taskId)
s16 *data = gTasks[taskId].data;
CloseBattlePyramidBagTextWindow();
- PrintItemDescription(data[1]);
- sub_81C5A98(data[0], 0);
+ PrintItemDescription(tListPos);
+ PrintSelectorArrow(tListTaskId, COLORID_DARK_GRAY);
SetTaskToMainPyramidBagInputHandler(taskId);
}
-static void sub_81C674C(u8 taskId)
+static void TryCloseBagToGiveItem(u8 taskId)
{
- if (!itemid_80BF6D8_mail_related(gSpecialVar_ItemId))
- DisplayItemMessageInBattlePyramid(taskId, gText_CantWriteMail, sub_81C66EC);
+ if (!IsWritingMailAllowed(gSpecialVar_ItemId))
+ DisplayItemMessageInBattlePyramid(taskId, gText_CantWriteMail, Task_WaitCloseErrorMessage);
else if (!ItemId_GetImportance(gSpecialVar_ItemId))
- CloseBattlePyramidBagAndSetCallback(taskId);
+ CloseBattlePyramidBag(taskId);
else
- sub_81C66AC(taskId);
+ ShowCantHoldMessage(taskId);
}
static void BagAction_UseInBattle(u8 taskId)
{
if (ItemId_GetBattleFunc(gSpecialVar_ItemId) != NULL)
{
- sub_81C61A8();
+ CloseMenuActionWindow();
ItemId_GetBattleFunc(gSpecialVar_ItemId)(taskId);
}
}
@@ -1260,15 +1307,15 @@ static void Task_BeginItemSwap(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- data[1] = gPyramidBagCursorData.scrollPosition + gPyramidBagCursorData.cursorPosition;
- gPyramidBagResources->unk814 = data[1];
- ListMenuSetUnkIndicatorsStructField(data[0], 0x10, 1);
- CopyItemName(gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode][data[1]], gStringVar1);
+ tListPos = gPyramidBagMenuState.scrollPosition + gPyramidBagMenuState.cursorPosition;
+ gPyramidBagMenu->toSwapPos = tListPos;
+ ListMenuSetUnkIndicatorsStructField(tListTaskId, 0x10, 1);
+ CopyItemName(gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode][tListPos], gStringVar1);
StringExpandPlaceholders(gStringVar4, gText_MoveVar1Where);
- FillWindowPixelBuffer(1, PIXEL_FILL(0));
- PrintOnWindow_Font1(1, gStringVar4, 3, 0, 0, 1, 0, 0);
- sub_81C5A98(data[0], 1);
- UpdateSwapLinePos(data[1]);
+ FillWindowPixelBuffer(WIN_INFO, PIXEL_FILL(0));
+ PrintOnWindow_Font1(WIN_INFO, gStringVar4, 3, 0, 0, 1, 0, COLORID_DARK_GRAY);
+ PrintSelectorArrow(tListTaskId, COLORID_LIGHT_GRAY);
+ UpdateSwapLinePos(tListPos);
gTasks[taskId].func = Task_ItemSwapHandleInput;
}
@@ -1280,15 +1327,15 @@ static void Task_ItemSwapHandleInput(u8 taskId)
if (JOY_NEW(SELECT_BUTTON))
{
PlaySE(SE_SELECT);
- ListMenuGetScrollAndRow(data[0], &gPyramidBagCursorData.scrollPosition, &gPyramidBagCursorData.cursorPosition);
+ ListMenuGetScrollAndRow(tListTaskId, &gPyramidBagMenuState.scrollPosition, &gPyramidBagMenuState.cursorPosition);
PerformItemSwap(taskId);
}
else
{
- s32 id = ListMenu_ProcessInput(data[0]);
- ListMenuGetScrollAndRow(data[0], &gPyramidBagCursorData.scrollPosition, &gPyramidBagCursorData.cursorPosition);
+ s32 id = ListMenu_ProcessInput(tListTaskId);
+ ListMenuGetScrollAndRow(tListTaskId, &gPyramidBagMenuState.scrollPosition, &gPyramidBagMenuState.cursorPosition);
SetSwapLineInvisibility(FALSE);
- UpdateSwapLinePos(gPyramidBagCursorData.cursorPosition);
+ UpdateSwapLinePos(gPyramidBagMenuState.cursorPosition);
switch (id)
{
case LIST_NOTHING_CHOSEN:
@@ -1298,7 +1345,7 @@ static void Task_ItemSwapHandleInput(u8 taskId)
if (JOY_NEW(A_BUTTON))
PerformItemSwap(taskId);
else
- sub_81C6A14(taskId);
+ CancelItemSwap(taskId);
break;
default:
PlaySE(SE_SELECT);
@@ -1312,41 +1359,41 @@ static void Task_ItemSwapHandleInput(u8 taskId)
static void PerformItemSwap(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- u16 *scrollOffset = &gPyramidBagCursorData.scrollPosition;
- u16 *selectedRow = &gPyramidBagCursorData.cursorPosition;
- u16 var = *scrollOffset + *selectedRow;
+ u16 *scrollOffset = &gPyramidBagMenuState.scrollPosition;
+ u16 *selectedRow = &gPyramidBagMenuState.cursorPosition;
+ u16 swapPos = *scrollOffset + *selectedRow;
- if (data[1] == var || data[1] == var - 1)
+ if (tListPos == swapPos || tListPos == swapPos - 1)
{
- sub_81C6A14(taskId);
+ CancelItemSwap(taskId);
}
else
{
- MovePyramidBagItemSlotInList(data[1], var);
- gPyramidBagResources->unk814 = 0xFF;
+ MovePyramidBagItemSlotInList(tListPos, swapPos);
+ gPyramidBagMenu->toSwapPos = POS_NONE;
SetSwapLineInvisibility(TRUE);
- DestroyListMenuTask(data[0], scrollOffset, selectedRow);
- if (data[1] < var)
- gPyramidBagCursorData.cursorPosition--;
+ DestroyListMenuTask(tListTaskId, scrollOffset, selectedRow);
+ if (tListPos < swapPos)
+ gPyramidBagMenuState.cursorPosition--;
SetBagItemsListTemplate();
- data[0] = ListMenuInit(&gMultiuseListMenuTemplate, *scrollOffset, *selectedRow);
+ tListTaskId = ListMenuInit(&gMultiuseListMenuTemplate, *scrollOffset, *selectedRow);
SetTaskToMainPyramidBagInputHandler(taskId);
}
}
-static void sub_81C6A14(u8 taskId)
+static void CancelItemSwap(u8 taskId)
{
s16 *data = gTasks[taskId].data;
- u16 *scrollOffset = &gPyramidBagCursorData.scrollPosition;
- u16 *selectedRow = &gPyramidBagCursorData.cursorPosition;
+ u16 *scrollOffset = &gPyramidBagMenuState.scrollPosition;
+ u16 *selectedRow = &gPyramidBagMenuState.cursorPosition;
- gPyramidBagResources->unk814 = 0xFF;
+ gPyramidBagMenu->toSwapPos = POS_NONE;
SetSwapLineInvisibility(TRUE);
- DestroyListMenuTask(data[0], scrollOffset, selectedRow);
- if (data[1] < *scrollOffset + *selectedRow)
- gPyramidBagCursorData.cursorPosition--;
+ DestroyListMenuTask(tListTaskId, scrollOffset, selectedRow);
+ if (tListPos < *scrollOffset + *selectedRow)
+ gPyramidBagMenuState.cursorPosition--;
SetBagItemsListTemplate();
- data[0] = ListMenuInit(&gMultiuseListMenuTemplate, *scrollOffset, *selectedRow);
+ tListTaskId = ListMenuInit(&gMultiuseListMenuTemplate, *scrollOffset, *selectedRow);
SetTaskToMainPyramidBagInputHandler(taskId);
}
@@ -1385,61 +1432,62 @@ void TryStoreHeldItemsInPyramidBag(void)
Free(newQuantities);
}
-static void sub_81C6BD8(void)
+static void InitPyramidBagWindows(void)
{
u8 i;
- InitWindows(gUnknown_0861F328);
+ InitWindows(sWindowTemplates);
DeactivateAllTextPrinters();
LoadUserWindowBorderGfx(0, 0x1, 0xE0);
LoadMessageBoxGfx(0, 0xA, 0xD0);
LoadPalette(gUnknown_0860F074, 0xF0, 0x20);
- for (i = 0; i < 5; i++)
+ for (i = 0; i < ARRAY_COUNT(sWindowTemplates); i++)
FillWindowPixelBuffer(i, PIXEL_FILL(0));
- PutWindowTilemap(0);
- PutWindowTilemap(1);
+ PutWindowTilemap(WIN_LIST);
+ PutWindowTilemap(WIN_INFO);
ScheduleBgCopyTilemapToVram(0);
ScheduleBgCopyTilemapToVram(1);
}
static void PrintOnWindow_Font1(u8 windowId, const u8 *src, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorTableId)
{
- AddTextPrinterParameterized4(windowId, 1, x, y, letterSpacing, lineSpacing, sColorTable[colorTableId], speed, src);
+ AddTextPrinterParameterized4(windowId, 1, x, y, letterSpacing, lineSpacing, sTextColors[colorTableId], speed, src);
}
static void PrintOnWindow_Font7(u8 windowId, const u8 *src, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorTableId)
{
- AddTextPrinterParameterized4(windowId, 7, x, y, letterSpacing, lineSpacing, sColorTable[colorTableId], speed, src);
+ AddTextPrinterParameterized4(windowId, 7, x, y, letterSpacing, lineSpacing, sTextColors[colorTableId], speed, src);
}
-static void sub_81C6CEC(u8 windowId)
+static void DrawTossNumberWindow(u8 windowId)
{
DrawStdFrameWithCustomTileAndPalette(windowId, 0, 1, 0xE);
ScheduleBgCopyTilemapToVram(1);
}
-static u8 sub_81C6D08(u8 windowArrayId)
+// Unused
+static u8 GetMenuActionWindowId(u8 windowArrayId)
{
- return gPyramidBagResources->windowIds[windowArrayId];
+ return gPyramidBagMenu->windowIds[windowArrayId];
}
-static u8 sub_81C6D24(u8 windowArrayId)
+static u8 OpenMenuActionWindowById(u8 windowArrayId)
{
- u8 *windowId = &gPyramidBagResources->windowIds[windowArrayId];
+ u8 *windowId = &gPyramidBagMenu->windowIds[windowArrayId];
if (*windowId == WINDOW_NONE)
{
- *windowId = AddWindow(&gUnknown_0861F350[windowArrayId]);
+ *windowId = AddWindow(&sWindowTemplates_MenuActions[windowArrayId]);
DrawStdFrameWithCustomTileAndPalette(*windowId, FALSE, 1, 0xE);
ScheduleBgCopyTilemapToVram(1);
}
return *windowId;
}
-static void sub_81C6D6C(u8 windowArrayId)
+static void CloseMenuActionWindowById(u8 windowArrayId)
{
- u8 *windowId = &gPyramidBagResources->windowIds[windowArrayId];
+ u8 *windowId = &gPyramidBagMenu->windowIds[windowArrayId];
if (*windowId != WINDOW_NONE)
{
ClearStdWindowAndFrameToTransparent(*windowId, FALSE);
@@ -1450,87 +1498,87 @@ static void sub_81C6D6C(u8 windowArrayId)
}
}
-static void sub_81C6DAC(u8 taskId, const struct YesNoFuncTable *yesNoTable)
+static void CreatePyramidBagYesNo(u8 taskId, const struct YesNoFuncTable *yesNoTable)
{
- CreateYesNoMenuWithCallbacks(taskId, &gUnknown_0861F350[4], 1, 0, 2, 1, 0xE, yesNoTable);
+ CreateYesNoMenuWithCallbacks(taskId, &sWindowTemplates_MenuActions[MENU_WIN_YESNO], 1, 0, 2, 1, 0xE, yesNoTable);
}
void DisplayItemMessageInBattlePyramid(u8 taskId, const u8 *str, void (*callback)(u8 taskId))
{
- FillWindowPixelBuffer(2, PIXEL_FILL(1));
- DisplayMessageAndContinueTask(taskId, 2, 0xA, 0xD, 1, GetPlayerTextSpeedDelay(), str, callback);
+ FillWindowPixelBuffer(WIN_MSG, PIXEL_FILL(1));
+ DisplayMessageAndContinueTask(taskId, WIN_MSG, 0xA, 0xD, 1, GetPlayerTextSpeedDelay(), str, callback);
ScheduleBgCopyTilemapToVram(1);
}
static void CloseBattlePyramidBagTextWindow(void)
{
- ClearDialogWindowAndFrameToTransparent(2, FALSE);
+ ClearDialogWindowAndFrameToTransparent(WIN_MSG, FALSE);
// This ClearWindowTilemap call is redundant, since ClearDialogWindowAndFrameToTransparent already calls it.
- ClearWindowTilemap(2);
+ ClearWindowTilemap(WIN_MSG);
ScheduleBgCopyTilemapToVram(1);
}
-#define ITEM_IMAGE_TAG 0x1024
-
-static void sub_81C6E38(u8 itemSpriteArrayId)
+static void FreeItemIconSprite(u8 spriteArrId)
{
- u8 *spriteId = &gPyramidBagResources->itemsSpriteIds[itemSpriteArrayId];
+ u8 *spriteId = &gPyramidBagMenu->spriteIds[spriteArrId];
if (*spriteId != SPRITE_NONE)
{
- FreeSpriteTilesByTag(ITEM_IMAGE_TAG + itemSpriteArrayId);
- FreeSpritePaletteByTag(ITEM_IMAGE_TAG + itemSpriteArrayId);
+ // spriteArrId is PBAG_SPRITE_ITEM_ICON / PBAG_SPRITE_ITEM_ICON_ALT here (1-2)
+ // so tag will be TAG_ITEM_ICON / TAG_ITEM_ICON_ALT
+ FreeSpriteTilesByTag(TAG_ITEM_ICON - 1 + spriteArrId);
+ FreeSpritePaletteByTag(TAG_ITEM_ICON - 1 + spriteArrId);
FreeSpriteOamMatrix(&gSprites[*spriteId]);
DestroySprite(&gSprites[*spriteId]);
*spriteId = SPRITE_NONE;
}
}
-static void sub_81C6E98(void)
+static void LoadPyramidBagPalette(void)
{
struct SpritePalette spritePalette;
u16 *palPtr = Alloc(0x40);
LZDecompressWram(gBattleFrontierGfx_PyramidBag_Pal, palPtr);
spritePalette.data = palPtr + (gSaveBlock2Ptr->frontier.lvlMode * 16);
- spritePalette.tag = ITEM_IMAGE_TAG;
+ spritePalette.tag = TAG_PYRAMID_BAG;
LoadSpritePalette(&spritePalette);
Free(palPtr);
}
-static void sub_81C6EF4(void)
+static void CreatePyramidBagSprite(void)
{
- u8 *spriteId = &gPyramidBagResources->itemsSpriteIds[0];
- *spriteId = CreateSprite(&gUnknown_0861F3D4, 0x44, 0x38, 0);
+ u8 *spriteId = &gPyramidBagMenu->spriteIds[PBAG_SPRITE_BAG];
+ *spriteId = CreateSprite(&sSpriteTemplate_PyramidBag, 68, 56, 0);
}
-static void sub_81C6F20(void)
+static void ShakePyramidBag(void)
{
- struct Sprite *sprite = &gSprites[gPyramidBagResources->itemsSpriteIds[0]];
+ struct Sprite *sprite = &gSprites[gPyramidBagMenu->spriteIds[PBAG_SPRITE_BAG]];
if (sprite->affineAnimEnded)
{
- StartSpriteAffineAnim(sprite, 1);
- sprite->callback = sub_81C6F68;
+ StartSpriteAffineAnim(sprite, ANIM_BAG_SHAKE);
+ sprite->callback = SpriteCB_BagWaitForShake;
}
}
-static void sub_81C6F68(struct Sprite *sprite)
+static void SpriteCB_BagWaitForShake(struct Sprite *sprite)
{
if (sprite->affineAnimEnded)
{
- StartSpriteAffineAnim(sprite, 0);
+ StartSpriteAffineAnim(sprite, ANIM_BAG_STILL);
sprite->callback = SpriteCallbackDummy;
}
}
-static void ShowItemImage(u16 itemId, u8 itemSpriteArrayId)
+static void ShowItemIcon(u16 itemId, bool8 isAlt)
{
u8 itemSpriteId;
- u8 *spriteId = &gPyramidBagResources->itemsSpriteIds[itemSpriteArrayId + 1];
+ u8 *spriteId = &gPyramidBagMenu->spriteIds[isAlt + PBAG_SPRITE_ITEM_ICON];
if (*spriteId == SPRITE_NONE)
{
- FreeSpriteTilesByTag(ITEM_IMAGE_TAG + 1 + itemSpriteArrayId);
- FreeSpritePaletteByTag(ITEM_IMAGE_TAG + 1 + itemSpriteArrayId);
- itemSpriteId = AddItemIconSprite(ITEM_IMAGE_TAG + 1 + itemSpriteArrayId, ITEM_IMAGE_TAG + 1 + itemSpriteArrayId, itemId);
+ FreeSpriteTilesByTag(TAG_ITEM_ICON + isAlt);
+ FreeSpritePaletteByTag(TAG_ITEM_ICON + isAlt);
+ itemSpriteId = AddItemIconSprite(TAG_ITEM_ICON + isAlt, TAG_ITEM_ICON + isAlt, itemId);
if (itemSpriteId != MAX_SPRITES)
{
*spriteId = itemSpriteId;
@@ -1540,22 +1588,22 @@ static void ShowItemImage(u16 itemId, u8 itemSpriteArrayId)
}
}
-static void sub_81C6FF8(u8 itemSpriteArrayId)
+static void FreeItemIconSpriteByAltId(bool8 isAlt)
{
- sub_81C6E38(itemSpriteArrayId + 1);
+ FreeItemIconSprite(isAlt + PBAG_SPRITE_ITEM_ICON);
}
static void CreateSwapLine(void)
{
- CreateSwapLineSprites(&gPyramidBagResources->itemsSpriteIds[3], 8);
+ CreateSwapLineSprites(&gPyramidBagMenu->spriteIds[PBAG_SPRITE_SWAP_LINE_START], NUM_SWAP_LINE_SPRITES);
}
static void SetSwapLineInvisibility(bool8 invisible)
{
- SetSwapLineSpritesInvisibility(&gPyramidBagResources->itemsSpriteIds[3], 8, invisible);
+ SetSwapLineSpritesInvisibility(&gPyramidBagMenu->spriteIds[PBAG_SPRITE_SWAP_LINE_START], NUM_SWAP_LINE_SPRITES, invisible);
}
static void UpdateSwapLinePos(u8 y)
{
- UpdateSwapLineSpritesPos(&gPyramidBagResources->itemsSpriteIds[3], 8 | 0x80, 120, (y + 1) * 16);
+ UpdateSwapLineSpritesPos(&gPyramidBagMenu->spriteIds[PBAG_SPRITE_SWAP_LINE_START], NUM_SWAP_LINE_SPRITES | 0x80, 120, (y + 1) * 16);
}
diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c
index 0492caeb5..d927ffb76 100644
--- a/src/battle_script_commands.c
+++ b/src/battle_script_commands.c
@@ -3269,7 +3269,7 @@ static void Cmd_getexp(void)
if (viaExpShare) // at least one mon is getting exp via exp share
{
- *exp = calculatedExp / 2 / viaSentIn;
+ *exp = SAFE_DIV(calculatedExp / 2, viaSentIn);
if (*exp == 0)
*exp = 1;
@@ -3279,7 +3279,7 @@ static void Cmd_getexp(void)
}
else
{
- *exp = calculatedExp / viaSentIn;
+ *exp = SAFE_DIV(calculatedExp, viaSentIn);
if (*exp == 0)
*exp = 1;
gExpShareExp = 0;
@@ -3357,7 +3357,7 @@ static void Cmd_getexp(void)
// get exp getter battlerId
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
- if (!(gBattlerPartyIndexes[2] != gBattleStruct->expGetterMonId) && !(gAbsentBattlerFlags & gBitTable[2]))
+ if (gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId && !(gAbsentBattlerFlags & gBitTable[2]))
gBattleStruct->expGetterBattlerId = 2;
else
{
@@ -3431,14 +3431,13 @@ static void Cmd_getexp(void)
gBattleMons[0].maxHP = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_MAX_HP);
gBattleMons[0].attack = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_ATK);
gBattleMons[0].defense = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_DEF);
- // Why is this duplicated?
+ // Speed is duplicated, likely due to a copy-paste error.
gBattleMons[0].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPEED);
gBattleMons[0].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPEED);
-
gBattleMons[0].spAttack = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPATK);
gBattleMons[0].spDefense = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPDEF);
}
- // What is else if?
+
if (gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId && gBattleMons[2].hp && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
{
gBattleMons[2].level = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_LEVEL);
@@ -3446,10 +3445,13 @@ static void Cmd_getexp(void)
gBattleMons[2].maxHP = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_MAX_HP);
gBattleMons[2].attack = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_ATK);
gBattleMons[2].defense = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_DEF);
- // Duplicated again, but this time there's no Sp Defense
gBattleMons[2].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPEED);
+ // Speed is duplicated again, but Special Defense is missing.
+#ifdef BUGFIX
+ gBattleMons[2].spDefense = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPDEF);
+#else
gBattleMons[2].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPEED);
-
+#endif
gBattleMons[2].spAttack = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPATK);
}
gBattleScripting.getexpState = 5;
@@ -6168,7 +6170,13 @@ static void Cmd_recordlastability(void)
{
gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
RecordAbilityBattle(gActiveBattler, gLastUsedAbility);
- gBattlescriptCurrInstr += 1; // UB: Should be + 2, one byte for command and one byte for battlerId argument.
+
+#ifdef BUGFIX
+ // This command occupies two bytes (one for the command id, and one for the battler id parameter).
+ gBattlescriptCurrInstr += 2;
+#else
+ gBattlescriptCurrInstr += 1;
+#endif
}
void BufferMoveToLearnIntoBattleTextBuff2(void)
diff --git a/src/battle_tower.c b/src/battle_tower.c
index b1e5d7817..082ea6822 100644
--- a/src/battle_tower.c
+++ b/src/battle_tower.c
@@ -36,7 +36,6 @@
#include "constants/event_objects.h"
#include "constants/moves.h"
#include "constants/easy_chat.h"
-#include "constants/tv.h"
extern const u8 MossdeepCity_SpaceCenter_2F_EventScript_MaxieTrainer[];
extern const u8 MossdeepCity_SpaceCenter_2F_EventScript_TabithaTrainer[];
diff --git a/src/battle_transition.c b/src/battle_transition.c
index 1b484f7c5..461c45e7d 100644
--- a/src/battle_transition.c
+++ b/src/battle_transition.c
@@ -1323,6 +1323,12 @@ static bool8 Phase2_BigPokeball_Func1(struct Task *task)
return FALSE;
}
+#define SOME_VRAM_STORE(ptr, posY, posX, toStore) \
+{ \
+ u32 index = (posY) * 32 + posX; \
+ ptr[index] = toStore; \
+}
+
static bool8 Phase2_BigPokeball_Func2(struct Task *task)
{
s16 i, j;
@@ -1335,7 +1341,7 @@ static bool8 Phase2_BigPokeball_Func2(struct Task *task)
{
for (j = 0; j < 30; j++, BigPokeballMap++)
{
- tilemap[i * 32 + j] = *BigPokeballMap | 0xF000;
+ SOME_VRAM_STORE(tilemap, i, j, *BigPokeballMap | 0xF000);
}
}
sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5, 160);
@@ -1675,12 +1681,6 @@ bool8 FldEff_Pokeball(void)
return FALSE;
}
-#define SOME_VRAM_STORE(ptr, posY, posX, toStore) \
-{ \
- u32 index = (posY) * 32 + posX; \
- ptr[index] = toStore; \
-}
-
static void sub_814713C(struct Sprite *sprite)
{
s16 arr0[ARRAY_COUNT(sUnknown_085C8B96)];
@@ -2142,7 +2142,7 @@ static bool8 Phase2_Mugshot_Func2(struct Task *task)
{
for (j = 0; j < 32; j++, mugshotsMap++)
{
- tilemap[i * 32 + j] = *mugshotsMap | 0xF000;
+ SOME_VRAM_STORE(tilemap, i, j, *mugshotsMap | 0xF000);
}
}
@@ -2960,17 +2960,15 @@ static bool8 Phase2_RectangularSpiral_Func2(struct Task *task)
if (sub_8149048(gUnknown_085C8D38[j / 2], &sRectangularSpiralTransition[j]))
{
- u32 one;
done = FALSE;
var = sRectangularSpiralTransition[j].field_2;
- one = 1;
- if ((j & 1) == one)
+ if ((j % 2) == 1)
var = 0x27D - var;
var2 = var % 32;
- var3 = var / 32 * 32;
+ var3 = var / 32;
- tilemap[var3 + var2] = 0xF002;
+ SOME_VRAM_STORE(tilemap, var3, var2, 0xF002);
}
}
}
@@ -4328,7 +4326,10 @@ static bool8 Phase2_FrontierSquaresScroll_Func5(struct Task *task)
BlendPalettes(PALETTES_ALL, 0x10, 0);
DestroyTask(FindTaskIdByFunc(task->func));
+
+#ifndef UBFIX
task->tState++; // UB: changing value of a destroyed task
+#endif
return FALSE;
}
diff --git a/src/bike.c b/src/bike.c
index bbcda989c..e97a5e04e 100644
--- a/src/bike.c
+++ b/src/bike.c
@@ -614,27 +614,24 @@ static void AcroBikeTransition_WheelieHoppingMoving(u8 direction)
return;
}
collision = GetBikeCollision(direction);
- // TODO: Try to get rid of this goto
- if (collision == 0 || collision == COLLISION_WHEELIE_HOP)
+ if (collision && collision != COLLISION_WHEELIE_HOP)
{
- goto derp;
- }
- else if (collision == COLLISION_LEDGE_JUMP)
- {
- PlayerLedgeHoppingWheelie(direction);
- }
- else if (collision < COLLISION_STOP_SURFING || collision > COLLISION_ROTATING_GATE)
- {
- if (collision < COLLISION_VERTICAL_RAIL)
+ if (collision == COLLISION_LEDGE_JUMP)
{
- AcroBikeTransition_WheelieHoppingStanding(direction);
+ PlayerLedgeHoppingWheelie(direction);
+ return;
}
- else
+ if (collision >= COLLISION_STOP_SURFING && collision <= COLLISION_ROTATING_GATE)
+ {
+ return;
+ }
+ if (collision < COLLISION_VERTICAL_RAIL)
{
- derp:
- PlayerMovingHoppingWheelie(direction);
+ AcroBikeTransition_WheelieHoppingStanding(direction);
+ return;
}
}
+ PlayerMovingHoppingWheelie(direction);
}
static void AcroBikeTransition_SideJump(u8 direction)
@@ -1056,7 +1053,7 @@ void Bike_HandleBumpySlopeJump(void)
bool32 IsRunningDisallowed(u8 metatile)
{
- if (!(gMapHeader.flags & MAP_ALLOW_RUNNING) || IsRunningDisallowedByMetatile(metatile) == TRUE)
+ if (!gMapHeader.allowRunning || IsRunningDisallowedByMetatile(metatile) == TRUE)
return TRUE;
else
return FALSE;
diff --git a/src/contest.c b/src/contest.c
index 246fc1e50..84d00d8ee 100644
--- a/src/contest.c
+++ b/src/contest.c
@@ -42,7 +42,6 @@
#include "constants/moves.h"
#include "constants/rgb.h"
#include "constants/songs.h"
-#include "constants/tv.h"
// This file's functions.
static void LoadContestPalettes(void);
@@ -259,6 +258,11 @@ enum {
#define TAG_BLINK_EFFECT_CONTESTANT2 0x80EA
#define TAG_BLINK_EFFECT_CONTESTANT3 0x80EB
+#define TILE_FILLED_APPEAL_HEART 0x5012
+#define TILE_FILLED_JAM_HEART 0x5014
+#define TILE_EMPTY_APPEAL_HEART 0x5035
+#define TILE_EMPTY_JAM_HEART 0x5036
+
enum {
SLIDER_HEART_ANIM_NORMAL,
SLIDER_HEART_ANIM_DISAPPEAR,
@@ -350,8 +354,8 @@ EWRAM_DATA u8 gHighestRibbonRank = 0;
EWRAM_DATA struct ContestResources *gContestResources = NULL;
EWRAM_DATA u8 sContestBgCopyFlags = 0;
EWRAM_DATA struct ContestWinner gCurContestWinner = {0};
-EWRAM_DATA bool8 gUnknown_02039F5C = 0;
-EWRAM_DATA u8 gUnknown_02039F5D = 0;
+EWRAM_DATA bool8 gCurContestWinnerIsForArtist = 0;
+EWRAM_DATA u8 gCurContestWinnerSaveIdx = 0;
// IWRAM common vars.
u32 gContestRngValue;
@@ -1034,7 +1038,7 @@ void LoadContestBgAfterMoveAnim(void)
{
u32 contestantWindowId = 5 + i;
- LoadPalette(eUnknownHeap1A004.cachedWindowPalettes[contestantWindowId], 16 * (5 + gContestantTurnOrder[i]), sizeof((eUnknownHeap1A004.cachedWindowPalettes[contestantWindowId])));
+ LoadPalette(eContestTempSave.cachedWindowPalettes[contestantWindowId], 16 * (5 + gContestantTurnOrder[i]), sizeof((eContestTempSave.cachedWindowPalettes[contestantWindowId])));
}
}
@@ -1320,7 +1324,7 @@ static bool8 SetupContestGraphics(u8 *stateVar)
CopyToBgTilemapBuffer(2, gUnknown_08C17170, 0, 0);
CopyBgTilemapBufferToVram(2);
// This is a bug, and copies random junk. savedJunk is never read.
- DmaCopy32Defvars(3, gContestResources->contestBgTilemaps[2], eUnknownHeap1A004.savedJunk, sizeof(eUnknownHeap1A004.savedJunk));
+ DmaCopy32Defvars(3, gContestResources->contestBgTilemaps[2], eContestTempSave.savedJunk, sizeof(eContestTempSave.savedJunk));
break;
case 5:
LoadCompressedPalette(gOldContestPalette, 0, 0x200);
@@ -1328,7 +1332,7 @@ static bool8 SetupContestGraphics(u8 *stateVar)
CpuCopy32(gPlttBufferUnfaded + (5 + gContestPlayerMonIndex) * 16, tempPalette2, 16 * sizeof(u16));
CpuCopy32(tempPalette2, gPlttBufferUnfaded + 128, 16 * sizeof(u16));
CpuCopy32(tempPalette1, gPlttBufferUnfaded + (5 + gContestPlayerMonIndex) * 16, 16 * sizeof(u16));
- DmaCopy32Defvars(3, gPlttBufferUnfaded, eUnknownHeap1A004.cachedWindowPalettes, sizeof(eUnknownHeap1A004.cachedWindowPalettes));
+ DmaCopy32Defvars(3, gPlttBufferUnfaded, eContestTempSave.cachedWindowPalettes, sizeof(eContestTempSave.cachedWindowPalettes));
LoadContestPalettes();
break;
case 6:
@@ -1468,7 +1472,7 @@ static void Task_DisplayAppealNumberText(u8 taskId)
gBattle_BG0_Y = 0;
gBattle_BG2_Y = 0;
ContestDebugDoPrint();
- DmaCopy32Defvars(3, gPlttBufferUnfaded, eUnknownHeap1A004.unk18204, PLTT_BUFFER_SIZE * 2);
+ DmaCopy32Defvars(3, gPlttBufferUnfaded, eContestTempSave.cachedPlttBufferUnfaded, PLTT_BUFFER_SIZE * 2);
ConvertIntToDecimalStringN(gStringVar1, eContest.appealNumber + 1, STR_CONV_MODE_LEFT_ALIGN, 1);
if (!Contest_IsMonsTurnDisabled(gContestPlayerMonIndex))
StringCopy(gDisplayedStringBattle, gText_AppealNumWhichMoveWillBePlayed);
@@ -1527,7 +1531,7 @@ static void Task_ShowMoveSelectScreen(u8 taskId)
&& eContestantStatus[gContestPlayerMonIndex].hasJudgesAttention)
{
// Highlight the text because it's a combo move
- moveNameBuffer = StringCopy(moveName, gText_ColorLightShadowDarkGrey);
+ moveNameBuffer = StringCopy(moveName, gText_ColorLightShadowDarkGray);
}
else if (move != MOVE_NONE
&& eContestantStatus[gContestPlayerMonIndex].prevMove == move
@@ -1667,8 +1671,8 @@ static void Task_HideMoveSelectScreen(u8 taskId)
}
Contest_SetBgCopyFlags(0);
// This seems to be a bug; it should have just copied PLTT_BUFFER_SIZE.
- DmaCopy32Defvars(3, gPlttBufferFaded, eUnknownHeap1A004.unk18604, PLTT_BUFFER_SIZE * 2);
- LoadPalette(eUnknownHeap1A004.unk18204, 0, PLTT_BUFFER_SIZE * 2);
+ DmaCopy32Defvars(3, gPlttBufferFaded, eContestTempSave.cachedPlttBufferFaded, PLTT_BUFFER_SIZE * 2);
+ LoadPalette(eContestTempSave.cachedPlttBufferUnfaded, 0, PLTT_BUFFER_SIZE * 2);
gTasks[taskId].data[0] = 0;
gTasks[taskId].data[1] = 0;
gTasks[taskId].func = Task_HideApplauseMeterForAppealStart;
@@ -2554,7 +2558,7 @@ static void Task_WaitForHeartSliders(u8 taskId)
static void sub_80DA348(u8 taskId)
{
- DmaCopy32Defvars(3, eUnknownHeap1A004.unk18204, gPlttBufferUnfaded, PLTT_BUFFER_SIZE * 2);
+ DmaCopy32Defvars(3, eContestTempSave.cachedPlttBufferUnfaded, gPlttBufferUnfaded, PLTT_BUFFER_SIZE * 2);
gTasks[taskId].data[0] = 0;
gTasks[taskId].data[1] = 2;
gTasks[taskId].func = Task_WaitPrintRoundResult;
@@ -3133,10 +3137,10 @@ static u8 CreateContestantSprite(u16 species, u32 otId, u32 personality, u32 ind
gSprites[spriteId].data[0] = gSprites[spriteId].oam.paletteNum;
gSprites[spriteId].data[2] = species;
if (IsSpeciesNotUnown(species))
- gSprites[spriteId].affineAnims = gUnknown_082FF6C0;
+ gSprites[spriteId].affineAnims = gAffineAnims_BattleSpriteContest;
else
gSprites[spriteId].affineAnims = gAffineAnims_BattleSpriteOpponentSide;
- StartSpriteAffineAnim(gSprites + spriteId, 0);
+ StartSpriteAffineAnim(&gSprites[spriteId], BATTLER_AFFINE_NORMAL);
return spriteId;
}
@@ -3204,27 +3208,25 @@ static void PrintContestMoveDescription(u16 a)
ContestBG_FillBoxWithIncrementingTile(0, categoryTile, 0x0b, 0x1f, 0x05, 0x01, 0x11, 0x01);
ContestBG_FillBoxWithIncrementingTile(0, categoryTile + 0x10, 0x0b, 0x20, 0x05, 0x01, 0x11, 0x01);
+ // Appeal hearts
if (gContestEffects[gContestMoves[a].effect].appeal == 0xFF)
numHearts = 0;
else
numHearts = gContestEffects[gContestMoves[a].effect].appeal / 10;
- if (numHearts > 8)
- numHearts = 8;
- // Filled-in hearts
- ContestBG_FillBoxWithTile(0, 0x5035, 0x15, 0x1f, 0x08, 0x01, 0x11);
- // Empty hearts
- ContestBG_FillBoxWithTile(0, 0x5012, 0x15, 0x1f, numHearts, 0x01, 0x11);
+ if (numHearts > MAX_CONTEST_MOVE_HEARTS)
+ numHearts = MAX_CONTEST_MOVE_HEARTS;
+ ContestBG_FillBoxWithTile(0, TILE_EMPTY_APPEAL_HEART, 0x15, 0x1f, MAX_CONTEST_MOVE_HEARTS, 0x01, 0x11);
+ ContestBG_FillBoxWithTile(0, TILE_FILLED_APPEAL_HEART, 0x15, 0x1f, numHearts, 0x01, 0x11);
+ // Jam hearts
if (gContestEffects[gContestMoves[a].effect].jam == 0xFF)
numHearts = 0;
else
numHearts = gContestEffects[gContestMoves[a].effect].jam / 10;
- if (numHearts > 8)
- numHearts = 8;
- // Filled-in hearts
- ContestBG_FillBoxWithTile(0, 0x5036, 0x15, 0x20, 0x08, 0x01, 0x11);
- // Empty hearts
- ContestBG_FillBoxWithTile(0, 0x5014, 0x15, 0x20, numHearts, 0x01, 0x11);
+ if (numHearts > MAX_CONTEST_MOVE_HEARTS)
+ numHearts = MAX_CONTEST_MOVE_HEARTS;
+ ContestBG_FillBoxWithTile(0, TILE_EMPTY_JAM_HEART, 0x15, 0x20, MAX_CONTEST_MOVE_HEARTS, 0x01, 0x11);
+ ContestBG_FillBoxWithTile(0, TILE_FILLED_JAM_HEART, 0x15, 0x20, numHearts, 0x01, 0x11);
FillWindowPixelBuffer(WIN_MOVE_DESCRIPTION, PIXEL_FILL(0));
Contest_PrintTextToBg0WindowStd(WIN_MOVE_DESCRIPTION, gContestEffectDescriptionPointers[gContestMoves[a].effect]);
@@ -4412,7 +4414,7 @@ static void DrawContestantWindows(void)
for (i = 0; i < CONTESTANT_COUNT; i++)
{
s32 windowId = i + 5;
- LoadPalette(eUnknownHeap1A004.cachedWindowPalettes[windowId], (gContestantTurnOrder[i] + 5) * 16, sizeof(eUnknownHeap1A004.cachedWindowPalettes[0]));
+ LoadPalette(eContestTempSave.cachedWindowPalettes[windowId], (gContestantTurnOrder[i] + 5) * 16, sizeof(eContestTempSave.cachedWindowPalettes[0]));
}
DrawContestantWindowText();
}
@@ -5516,40 +5518,46 @@ void ResetContestLinkResults(void)
gSaveBlock2Ptr->contestLinkResults[i][j] = 0;
}
-bool8 sub_80DEDA8(u8 rank)
+bool8 SaveContestWinner(u8 rank)
{
s32 i;
- u8 r7 = Random() % 3;
+ u8 captionId = Random() % NUM_PAINTING_CAPTIONS;
+ // Get the index of the winner among the contestants
for (i = 0; i < CONTESTANT_COUNT - 1; i++)
- {
if (gContestFinalStandings[i] == 0)
break;
- }
- if (rank == 0xFF && i != gContestPlayerMonIndex)
+
+ // Exit if attempting to save a Pokémon other than the player's to the museum
+ if (rank == CONTEST_SAVE_FOR_MUSEUM && i != gContestPlayerMonIndex)
return FALSE;
+
+ // Adjust the random painting caption depending on the category
switch (gSpecialVar_ContestCategory)
{
case CONTEST_CATEGORY_COOL:
- r7 += 0;
+ captionId += NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_COOL;
break;
case CONTEST_CATEGORY_BEAUTY:
- r7 += 3;
+ captionId += NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_BEAUTY;
break;
case CONTEST_CATEGORY_CUTE:
- r7 += 6;
+ captionId += NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_CUTE;
break;
case CONTEST_CATEGORY_SMART:
- r7 += 9;
+ captionId += NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_SMART;
break;
case CONTEST_CATEGORY_TOUGH:
- r7 += 12;
+ captionId += NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_TOUGH;
break;
}
- if (rank != 0xFE)
- {
- u8 id = sub_80DEFA8(rank, 1);
+ if (rank != CONTEST_SAVE_FOR_ARTIST)
+ {
+ // Save winner in the saveblock
+ // Used to save any winner for the Contest Hall or the Museum
+ // but excludes the temporary save used by the artist
+ u8 id = GetContestWinnerSaveIdx(rank, TRUE);
gSaveBlock1Ptr->contestWinners[id].personality = gContestMons[i].personality;
gSaveBlock1Ptr->contestWinners[id].species = gContestMons[i].species;
gSaveBlock1Ptr->contestWinners[id].trainerId = gContestMons[i].otId;
@@ -5560,24 +5568,29 @@ bool8 sub_80DEDA8(u8 rank)
else
gSaveBlock1Ptr->contestWinners[id].contestRank = gSpecialVar_ContestRank;
- if (rank != 0xFF)
+ if (rank != CONTEST_SAVE_FOR_MUSEUM)
gSaveBlock1Ptr->contestWinners[id].contestCategory = gSpecialVar_ContestCategory;
else
- gSaveBlock1Ptr->contestWinners[id].contestCategory = r7;
+ gSaveBlock1Ptr->contestWinners[id].contestCategory = captionId;
}
else
{
+ // Set the most recent winner so the artist can show the player their painting
gCurContestWinner.personality = gContestMons[i].personality;
gCurContestWinner.trainerId = gContestMons[i].otId;
gCurContestWinner.species = gContestMons[i].species;
StringCopy(gCurContestWinner.monName, gContestMons[i].nickname);
StringCopy(gCurContestWinner.trainerName, gContestMons[i].trainerName);
- gCurContestWinner.contestCategory = r7;
+ gCurContestWinner.contestCategory = captionId;
}
return TRUE;
}
-u8 sub_80DEFA8(u8 rank, u8 b)
+// Rank is either a regular contest rank (for saving winners to show in the Contest Hall)
+// Or one of two special IDs listed below (for saving winners to show in Museum, or from the artist)
+// If just retrieving the index where the winner *would* go, shift is FALSE
+// If actually preparing to insert the winner into the saveblock, shift is TRUE
+u8 GetContestWinnerSaveIdx(u8 rank, bool8 shift)
{
s32 i;
@@ -5587,13 +5600,15 @@ u8 sub_80DEFA8(u8 rank, u8 b)
case CONTEST_RANK_SUPER:
case CONTEST_RANK_HYPER:
case CONTEST_RANK_MASTER:
- if (b != 0)
+ if (shift)
{
- for (i = NUM_CONTEST_HALL_WINNERS - 1; i >= 1; i--)
+ for (i = NUM_CONTEST_HALL_WINNERS - 1; i > 0; i--)
memcpy(&gSaveBlock1Ptr->contestWinners[i], &gSaveBlock1Ptr->contestWinners[i - 1], sizeof(struct ContestWinner));
}
- return 0;
+ return CONTEST_WINNER_HALL_1 - 1;
default:
+// case CONTEST_SAVE_FOR_MUSEUM:
+// case CONTEST_SAVE_FOR_ARTIST:
switch (gSpecialVar_ContestCategory)
{
case CONTEST_CATEGORY_COOL:
@@ -5615,7 +5630,7 @@ void ClearContestWinnerPicsInContestHall(void)
{
s32 i;
- for (i = 0; i < 8; i++)
+ for (i = 0; i < MUSEUM_CONTEST_WINNERS_START; i++)
gSaveBlock1Ptr->contestWinners[i] = gDefaultContestWinners[i];
}
diff --git a/src/contest_painting.c b/src/contest_painting.c
index 4f0bf9245..d4bc8ca04 100644
--- a/src/contest_painting.c
+++ b/src/contest_painting.c
@@ -21,18 +21,16 @@
#include "window.h"
#include "constants/rgb.h"
-// IWRAM common
u16 (*gContestMonPixels)[][32];
struct ImageProcessingContext gImageProcessingContext;
struct ContestWinner *gContestPaintingWinner;
u16 *gContestPaintingMonPalette;
-// IWRAM bss
-static u8 gContestPaintingState;
-static u16 gContestPaintingMosaicVal;
-static u16 gContestPaintingFadeCounter;
-static bool8 gUnknown_030011F6;
-static u8 gContestPaintingWindowId;
+static u8 sHoldState;
+static u16 sMosaicVal;
+static u16 sFadeCounter;
+static bool8 sVarsInitialized;
+static u8 sWindowId;
static void ShowContestPainting(void);
static void HoldContestPainting(void);
@@ -44,7 +42,7 @@ static void PrintContestPaintingCaption(u8, u8);
static void VBlankCB_ContestPainting(void);
static void _InitContestMonPixels(u8 *spriteGfx, u16 *palette, u16 (*destPixels)[64][64]);
-extern const u8 gContestPaintingCaption[];
+extern const u8 gContestHallPaintingCaption[];
extern const u8 gContestCoolness[];
extern const u8 gContestBeauty[];
extern const u8 gContestCuteness[];
@@ -71,39 +69,39 @@ extern const u8 gContestPaintingTough1[];
extern const u8 gContestPaintingTough2[];
extern const u8 gContestPaintingTough3[];
-const u16 gPictureFramePalettes[] = INCBIN_U16("graphics/picture_frame/bg.gbapal");
-const u8 gPictureFrameTiles_0[] = INCBIN_U8("graphics/picture_frame/frame0.4bpp.rl");
-const u8 gPictureFrameTiles_1[] = INCBIN_U8("graphics/picture_frame/frame1.4bpp.rl");
-const u8 gPictureFrameTiles_2[] = INCBIN_U8("graphics/picture_frame/frame2.4bpp.rl");
-const u8 gPictureFrameTiles_3[] = INCBIN_U8("graphics/picture_frame/frame3.4bpp.rl");
-const u8 gPictureFrameTiles_4[] = INCBIN_U8("graphics/picture_frame/frame4.4bpp.rl");
-const u8 gPictureFrameTiles_5[] = INCBIN_U8("graphics/picture_frame/frame5.4bpp.rl");
-const u8 gPictureFrameTilemap_0[] = INCBIN_U8("graphics/picture_frame/frame0_map.bin.rl");
-const u8 gPictureFrameTilemap_1[] = INCBIN_U8("graphics/picture_frame/frame1_map.bin.rl");
-const u8 gPictureFrameTilemap_2[] = INCBIN_U8("graphics/picture_frame/frame2_map.bin.rl");
-const u8 gPictureFrameTilemap_3[] = INCBIN_U8("graphics/picture_frame/frame3_map.bin.rl");
-const u8 gPictureFrameTilemap_4[] = INCBIN_U8("graphics/picture_frame/frame4_map.bin.rl");
-const u8 gPictureFrameTilemap_5[] = INCBIN_U8("graphics/picture_frame/frame5_map.bin.rl");
+static const u16 sPictureFramePalettes[] = INCBIN_U16("graphics/picture_frame/bg.gbapal");
+static const u8 sPictureFrameTiles_Cool[] = INCBIN_U8("graphics/picture_frame/cool.4bpp.rl");
+static const u8 sPictureFrameTiles_Beauty[] = INCBIN_U8("graphics/picture_frame/beauty.4bpp.rl");
+static const u8 sPictureFrameTiles_Cute[] = INCBIN_U8("graphics/picture_frame/cute.4bpp.rl");
+static const u8 sPictureFrameTiles_Smart[] = INCBIN_U8("graphics/picture_frame/smart.4bpp.rl");
+static const u8 sPictureFrameTiles_Tough[] = INCBIN_U8("graphics/picture_frame/tough.4bpp.rl");
+static const u8 sPictureFrameTiles_HallLobby[] = INCBIN_U8("graphics/picture_frame/lobby.4bpp.rl");
+static const u8 sPictureFrameTilemap_Cool[] = INCBIN_U8("graphics/picture_frame/cool_map.bin.rl");
+static const u8 sPictureFrameTilemap_Beauty[] = INCBIN_U8("graphics/picture_frame/beauty_map.bin.rl");
+static const u8 sPictureFrameTilemap_Cute[] = INCBIN_U8("graphics/picture_frame/cute_map.bin.rl");
+static const u8 sPictureFrameTilemap_Smart[] = INCBIN_U8("graphics/picture_frame/smart_map.bin.rl");
+static const u8 sPictureFrameTilemap_Tough[] = INCBIN_U8("graphics/picture_frame/tough_map.bin.rl");
+static const u8 sPictureFrameTilemap_HallLobby[] = INCBIN_U8("graphics/picture_frame/lobby_map.bin.rl");
static const u8 *const sContestCategoryNames_Unused[] =
{
- gContestCoolness,
- gContestBeauty,
- gContestCuteness,
- gContestSmartness,
- gContestToughness,
+ [CONTEST_CATEGORY_COOL] = gContestCoolness,
+ [CONTEST_CATEGORY_BEAUTY] = gContestBeauty,
+ [CONTEST_CATEGORY_CUTE] = gContestCuteness,
+ [CONTEST_CATEGORY_SMART] = gContestSmartness,
+ [CONTEST_CATEGORY_TOUGH] = gContestToughness,
};
static const u8 *const sContestRankNames[] =
{
- gContestRankNormal,
- gContestRankSuper,
- gContestRankHyper,
- gContestRankMaster,
- gContestLink,
+ [CONTEST_RANK_NORMAL] = gContestRankNormal,
+ [CONTEST_RANK_SUPER] = gContestRankSuper,
+ [CONTEST_RANK_HYPER] = gContestRankHyper,
+ [CONTEST_RANK_MASTER] = gContestRankMaster,
+ [CONTEST_RANK_LINK] = gContestLink,
};
-static const struct BgTemplate sContestPaintingBgTemplates[] =
+static const struct BgTemplate sBgTemplates[] =
{
{
.bg = 1,
@@ -116,7 +114,7 @@ static const struct BgTemplate sContestPaintingBgTemplates[] =
},
};
-static const struct WindowTemplate sContestPaintingWindowTemplate =
+static const struct WindowTemplate sWindowTemplate =
{
.bg = 1,
.tilemapLeft = 2,
@@ -127,23 +125,23 @@ static const struct WindowTemplate sContestPaintingWindowTemplate =
.baseBlock = 1,
};
-static const u8 *const sContestPaintingDescriptionPointers[] =
+static const u8 *const sMuseumCaptions[NUM_PAINTING_CAPTIONS * CONTEST_CATEGORIES_COUNT] =
{
- gContestPaintingCool1,
- gContestPaintingCool2,
- gContestPaintingCool3,
- gContestPaintingBeauty1,
- gContestPaintingBeauty2,
- gContestPaintingBeauty3,
- gContestPaintingCute1,
- gContestPaintingCute2,
- gContestPaintingCute3,
- gContestPaintingSmart1,
- gContestPaintingSmart2,
- gContestPaintingSmart3,
- gContestPaintingTough1,
- gContestPaintingTough2,
- gContestPaintingTough3,
+ [0 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_COOL] = gContestPaintingCool1,
+ [1 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_COOL] = gContestPaintingCool2,
+ [2 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_COOL] = gContestPaintingCool3,
+ [0 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_BEAUTY] = gContestPaintingBeauty1,
+ [1 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_BEAUTY] = gContestPaintingBeauty2,
+ [2 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_BEAUTY] = gContestPaintingBeauty3,
+ [0 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_CUTE] = gContestPaintingCute1,
+ [1 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_CUTE] = gContestPaintingCute2,
+ [2 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_CUTE] = gContestPaintingCute3,
+ [0 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_SMART] = gContestPaintingSmart1,
+ [1 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_SMART] = gContestPaintingSmart2,
+ [2 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_SMART] = gContestPaintingSmart3,
+ [0 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_TOUGH] = gContestPaintingTough1,
+ [1 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_TOUGH] = gContestPaintingTough2,
+ [2 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_TOUGH] = gContestPaintingTough3,
};
static const struct OamData sContestPaintingMonOamData =
@@ -161,15 +159,15 @@ static const struct OamData sContestPaintingMonOamData =
.paletteNum = 0,
};
-const u16 gUnknown_085B0838[] = {RGB(0, 0, 0), RGB(0, 0, 0)};
+static const u16 sBgPalette[] = {RGB_BLACK, RGB_BLACK};
void SetContestWinnerForPainting(int contestWinnerId)
{
- u8 *ptr1 = &gUnknown_02039F5D;
- u8 *ptr2 = &gUnknown_02039F5C;
+ u8 *saveIdx = &gCurContestWinnerSaveIdx;
+ u8 *isForArtist = &gCurContestWinnerIsForArtist;
gCurContestWinner = gSaveBlock1Ptr->contestWinners[contestWinnerId - 1];
- *ptr1 = contestWinnerId - 1;
- *ptr2 = FALSE;
+ *saveIdx = contestWinnerId - 1;
+ *isForArtist = FALSE;
}
void CB2_ContestPainting(void)
@@ -189,7 +187,7 @@ static void CB2_QuitContestPainting(void)
SetMainCallback2(gMain.savedCallback);
FREE_AND_SET_NULL(gContestPaintingMonPalette);
FREE_AND_SET_NULL(gContestMonPixels);
- RemoveWindow(gContestPaintingWindowId);
+ RemoveWindow(sWindowId);
Free(GetBgTilemapBuffer(1));
FreeMonSpritesGfx();
}
@@ -203,13 +201,13 @@ static void ShowContestPainting(void)
SetVBlankCallback(NULL);
AllocateMonSpritesGfx();
gContestPaintingWinner = &gCurContestWinner;
- InitContestPaintingVars(1);
+ InitContestPaintingVars(TRUE);
InitContestPaintingBg();
gMain.state++;
break;
case 1:
ResetPaletteFade();
- DmaFillLarge32(3, 0, (void *)BG_VRAM, 0x18000, 0x1000);
+ DmaFillLarge32(3, 0, (void *)VRAM, VRAM_SIZE, 0x1000);
ResetSpriteData();
gMain.state++;
break;
@@ -220,16 +218,16 @@ static void ShowContestPainting(void)
gMain.state++;
break;
case 3:
- CreateContestPaintingPicture(gUnknown_02039F5D, gUnknown_02039F5C);
+ CreateContestPaintingPicture(gCurContestWinnerSaveIdx, gCurContestWinnerIsForArtist);
gMain.state++;
break;
case 4:
- PrintContestPaintingCaption(gUnknown_02039F5D, gUnknown_02039F5C);
- LoadPalette(gUnknown_085B0838, 0, 1 * 2);
+ PrintContestPaintingCaption(gCurContestWinnerSaveIdx, gCurContestWinnerIsForArtist);
+ LoadPalette(sBgPalette, 0, 1 * 2);
DmaClear32(3, PLTT, PLTT_SIZE);
BeginFastPaletteFade(2);
SetVBlankCallback(VBlankCB_ContestPainting);
- gContestPaintingState = 0;
+ sHoldState = 0;
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_ON);
SetMainCallback2(CB2_HoldContestPainting);
break;
@@ -238,29 +236,29 @@ static void ShowContestPainting(void)
static void HoldContestPainting(void)
{
- switch (gContestPaintingState)
+ switch (sHoldState)
{
case 0:
if (!gPaletteFade.active)
- gContestPaintingState = 1;
- if (gUnknown_030011F6 && gContestPaintingFadeCounter)
- gContestPaintingFadeCounter--;
+ sHoldState = 1;
+ if (sVarsInitialized && sFadeCounter)
+ sFadeCounter--;
break;
case 1:
if ((JOY_NEW(A_BUTTON)) || (JOY_NEW(B_BUTTON)))
{
- gContestPaintingState++;
+ sHoldState++;
BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB(0, 0, 0));
}
- if (gUnknown_030011F6)
- gContestPaintingFadeCounter = 0;
+ if (sVarsInitialized)
+ sFadeCounter = 0;
break;
case 2:
if (!gPaletteFade.active)
SetMainCallback2(CB2_QuitContestPainting);
- if (gUnknown_030011F6 && gContestPaintingFadeCounter < 30)
- gContestPaintingFadeCounter++;
+ if (sVarsInitialized && sFadeCounter < 30)
+ sFadeCounter++;
break;
}
}
@@ -268,45 +266,48 @@ static void HoldContestPainting(void)
static void InitContestPaintingWindow(void)
{
ResetBgsAndClearDma3BusyFlags(0);
- InitBgsFromTemplates(0, sContestPaintingBgTemplates, ARRAY_COUNT(sContestPaintingBgTemplates));
+ InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates));
ChangeBgX(1, 0, 0);
ChangeBgY(1, 0, 0);
SetBgTilemapBuffer(1, AllocZeroed(BG_SCREEN_SIZE));
- gContestPaintingWindowId = AddWindow(&sContestPaintingWindowTemplate);
+ sWindowId = AddWindow(&sWindowTemplate);
DeactivateAllTextPrinters();
- FillWindowPixelBuffer(gContestPaintingWindowId, PIXEL_FILL(0));
- PutWindowTilemap(gContestPaintingWindowId);
- CopyWindowToVram(gContestPaintingWindowId, 3);
+ FillWindowPixelBuffer(sWindowId, PIXEL_FILL(0));
+ PutWindowTilemap(sWindowId);
+ CopyWindowToVram(sWindowId, 3);
ShowBg(1);
}
-static void PrintContestPaintingCaption(u8 contestType, bool8 arg1)
+static void PrintContestPaintingCaption(u8 contestType, bool8 isForArtist)
{
int x;
u8 category;
- if (arg1 == TRUE)
+ // Artist's painting has no caption
+ if (isForArtist == TRUE)
return;
category = gContestPaintingWinner->contestCategory;
- if (contestType < 8)
+ if (contestType < MUSEUM_CONTEST_WINNERS_START)
{
+ // Contest Hall caption
BufferContestName(gStringVar1, category);
StringAppend(gStringVar1, gText_Space);
StringAppend(gStringVar1, sContestRankNames[gContestPaintingWinner->contestRank]);
StringCopy(gStringVar2, gContestPaintingWinner->trainerName);
- sub_81DB5AC(gStringVar2);
+ ConvertInternationalContestantName(gStringVar2);
StringCopy(gStringVar3, gContestPaintingWinner->monName);
- StringExpandPlaceholders(gStringVar4, gContestPaintingCaption);
+ StringExpandPlaceholders(gStringVar4, gContestHallPaintingCaption);
}
else
{
+ // Museum caption
StringCopy(gStringVar1, gContestPaintingWinner->monName);
- StringExpandPlaceholders(gStringVar4, sContestPaintingDescriptionPointers[category]);
+ StringExpandPlaceholders(gStringVar4, sMuseumCaptions[category]);
}
x = GetStringCenterAlignXOffset(1, gStringVar4, 208);
- AddTextPrinterParameterized(gContestPaintingWindowId, 1, gStringVar4, x, 1, 0, 0);
+ AddTextPrinterParameterized(sWindowId, 1, gStringVar4, x, 1, 0, 0);
CopyBgTilemapBufferToVram(1);
}
@@ -321,33 +322,34 @@ static void InitContestPaintingBg(void)
SetGpuReg(REG_OFFSET_BLDY, 0);
}
-static void InitContestPaintingVars(bool8 arg0)
+static void InitContestPaintingVars(bool8 reset)
{
- if (arg0 == FALSE)
+ if (reset == FALSE)
{
- gUnknown_030011F6 = FALSE;
- gContestPaintingMosaicVal = 0;
- gContestPaintingFadeCounter = 0;
+ // Never reached
+ sVarsInitialized = FALSE;
+ sMosaicVal = 0;
+ sFadeCounter = 0;
}
else
{
- gUnknown_030011F6 = TRUE;
- gContestPaintingMosaicVal = 15;
- gContestPaintingFadeCounter = 30;
+ sVarsInitialized = TRUE;
+ sMosaicVal = 15;
+ sFadeCounter = 30;
}
}
static void UpdateContestPaintingMosaicEffect(void)
{
- if (!gUnknown_030011F6)
+ if (!sVarsInitialized)
{
SetGpuReg(REG_OFFSET_MOSAIC, 0);
}
else
{
SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(1) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(10) | BGCNT_MOSAIC | BGCNT_16COLOR | BGCNT_TXT256x256);
- gContestPaintingMosaicVal = gContestPaintingFadeCounter / 2;
- SetGpuReg(REG_OFFSET_MOSAIC, (gContestPaintingMosaicVal << 12) | (gContestPaintingMosaicVal << 8) | (gContestPaintingMosaicVal << 4) | (gContestPaintingMosaicVal << 0));
+ sMosaicVal = sFadeCounter / 2;
+ SetGpuReg(REG_OFFSET_MOSAIC, (sMosaicVal << 12) | (sMosaicVal << 8) | (sMosaicVal << 4) | (sMosaicVal << 0));
}
}
@@ -414,34 +416,35 @@ static void _InitContestMonPixels(u8 *spriteGfx, u16 *palette, u16 (*destPixels)
#define VRAM_PICTURE_DATA(x, y) (((u16 *)(BG_SCREEN_ADDR(12)))[(y) * 32 + (x)])
-static void LoadContestPaintingFrame(u8 contestWinnerId, bool8 arg1)
+static void LoadContestPaintingFrame(u8 contestWinnerId, bool8 isForArtist)
{
u8 x, y;
- LoadPalette(gPictureFramePalettes, 0, 0x100);
- if (arg1 == TRUE)
+ LoadPalette(sPictureFramePalettes, 0, 0x100);
+ if (isForArtist == TRUE)
{
- switch (gContestPaintingWinner->contestCategory / 3)
+ // Load Artist's frame
+ switch (gContestPaintingWinner->contestCategory / NUM_PAINTING_CAPTIONS)
{
case CONTEST_CATEGORY_COOL:
- RLUnCompVram(gPictureFrameTiles_0, (void *)VRAM);
- RLUnCompWram(gPictureFrameTilemap_0, gContestMonPixels);
+ RLUnCompVram(sPictureFrameTiles_Cool, (void *)VRAM);
+ RLUnCompWram(sPictureFrameTilemap_Cool, gContestMonPixels);
break;
case CONTEST_CATEGORY_BEAUTY:
- RLUnCompVram(gPictureFrameTiles_1, (void *)VRAM);
- RLUnCompWram(gPictureFrameTilemap_1, gContestMonPixels);
+ RLUnCompVram(sPictureFrameTiles_Beauty, (void *)VRAM);
+ RLUnCompWram(sPictureFrameTilemap_Beauty, gContestMonPixels);
break;
case CONTEST_CATEGORY_CUTE:
- RLUnCompVram(gPictureFrameTiles_2, (void *)VRAM);
- RLUnCompWram(gPictureFrameTilemap_2, gContestMonPixels);
+ RLUnCompVram(sPictureFrameTiles_Cute, (void *)VRAM);
+ RLUnCompWram(sPictureFrameTilemap_Cute, gContestMonPixels);
break;
case CONTEST_CATEGORY_SMART:
- RLUnCompVram(gPictureFrameTiles_3, (void *)VRAM);
- RLUnCompWram(gPictureFrameTilemap_3, gContestMonPixels);
+ RLUnCompVram(sPictureFrameTiles_Smart, (void *)VRAM);
+ RLUnCompWram(sPictureFrameTilemap_Smart, gContestMonPixels);
break;
case CONTEST_CATEGORY_TOUGH:
- RLUnCompVram(gPictureFrameTiles_4, (void *)VRAM);
- RLUnCompWram(gPictureFrameTilemap_4, gContestMonPixels);
+ RLUnCompVram(sPictureFrameTiles_Tough, (void *)VRAM);
+ RLUnCompWram(sPictureFrameTilemap_Tough, gContestMonPixels);
break;
}
@@ -463,34 +466,36 @@ static void LoadContestPaintingFrame(u8 contestWinnerId, bool8 arg1)
for (x = 0; x < 16; x++)
VRAM_PICTURE_DATA(x + 7, 2) = (*gContestMonPixels)[2][7];
}
- else if (contestWinnerId < 8)
+ else if (contestWinnerId < MUSEUM_CONTEST_WINNERS_START)
{
- RLUnCompVram(gPictureFrameTiles_5, (void *)VRAM);
- RLUnCompVram(gPictureFrameTilemap_5, (void *)(BG_SCREEN_ADDR(12)));
+ // Load Contest Hall lobby frame
+ RLUnCompVram(sPictureFrameTiles_HallLobby, (void *)VRAM);
+ RLUnCompVram(sPictureFrameTilemap_HallLobby, (void *)(BG_SCREEN_ADDR(12)));
}
else
{
- switch (gContestPaintingWinner->contestCategory / 3)
+ // Load Museum frame
+ switch (gContestPaintingWinner->contestCategory / NUM_PAINTING_CAPTIONS)
{
case CONTEST_CATEGORY_COOL:
- RLUnCompVram(gPictureFrameTiles_0, (void *)VRAM);
- RLUnCompVram(gPictureFrameTilemap_0, (void *)(BG_SCREEN_ADDR(12)));
+ RLUnCompVram(sPictureFrameTiles_Cool, (void *)VRAM);
+ RLUnCompVram(sPictureFrameTilemap_Cool, (void *)(BG_SCREEN_ADDR(12)));
break;
case CONTEST_CATEGORY_BEAUTY:
- RLUnCompVram(gPictureFrameTiles_1, (void *)VRAM);
- RLUnCompVram(gPictureFrameTilemap_1, (void *)(BG_SCREEN_ADDR(12)));
+ RLUnCompVram(sPictureFrameTiles_Beauty, (void *)VRAM);
+ RLUnCompVram(sPictureFrameTilemap_Beauty, (void *)(BG_SCREEN_ADDR(12)));
break;
case CONTEST_CATEGORY_CUTE:
- RLUnCompVram(gPictureFrameTiles_2, (void *)VRAM);
- RLUnCompVram(gPictureFrameTilemap_2, (void *)(BG_SCREEN_ADDR(12)));
+ RLUnCompVram(sPictureFrameTiles_Cute, (void *)VRAM);
+ RLUnCompVram(sPictureFrameTilemap_Cute, (void *)(BG_SCREEN_ADDR(12)));
break;
case CONTEST_CATEGORY_SMART:
- RLUnCompVram(gPictureFrameTiles_3, (void *)VRAM);
- RLUnCompVram(gPictureFrameTilemap_3, (void *)(BG_SCREEN_ADDR(12)));
+ RLUnCompVram(sPictureFrameTiles_Smart, (void *)VRAM);
+ RLUnCompVram(sPictureFrameTilemap_Smart, (void *)(BG_SCREEN_ADDR(12)));
break;
case CONTEST_CATEGORY_TOUGH:
- RLUnCompVram(gPictureFrameTiles_4, (void *)VRAM);
- RLUnCompVram(gPictureFrameTilemap_4, (void *)(BG_SCREEN_ADDR(12)));
+ RLUnCompVram(sPictureFrameTiles_Tough, (void *)VRAM);
+ RLUnCompVram(sPictureFrameTilemap_Tough, (void *)(BG_SCREEN_ADDR(12)));
break;
}
}
@@ -519,10 +524,10 @@ static u8 GetImageEffectForContestWinner(u8 contestWinnerId)
{
u8 contestCategory;
- if (contestWinnerId < 8)
+ if (contestWinnerId < MUSEUM_CONTEST_WINNERS_START)
contestCategory = gContestPaintingWinner->contestCategory;
else
- contestCategory = gContestPaintingWinner->contestCategory / 3;
+ contestCategory = gContestPaintingWinner->contestCategory / NUM_PAINTING_CAPTIONS;
switch (contestCategory)
{
@@ -584,12 +589,12 @@ static void DoContestPaintingImageProcessing(u8 imageEffect)
LoadPalette(gContestPaintingMonPalette, 0x100, 0x200);
}
-static void CreateContestPaintingPicture(u8 contestWinnerId, bool8 arg1)
+static void CreateContestPaintingPicture(u8 contestWinnerId, bool8 isForArtist)
{
AllocPaintingResources();
InitContestMonPixels(gContestPaintingWinner->species, 0);
DoContestPaintingImageProcessing(GetImageEffectForContestWinner(contestWinnerId));
InitPaintingMonOamData(contestWinnerId);
- LoadContestPaintingFrame(contestWinnerId, arg1);
+ LoadContestPaintingFrame(contestWinnerId, isForArtist);
}
diff --git a/src/contest_util.c b/src/contest_util.c
index 98854c4c6..88ab4a7d2 100644
--- a/src/contest_util.c
+++ b/src/contest_util.c
@@ -44,7 +44,6 @@
#include "constants/game_stat.h"
#include "constants/rgb.h"
#include "constants/songs.h"
-#include "constants/tv.h"
#include "contest.h"
enum {
@@ -61,10 +60,29 @@ enum {
#define GET_CONTEST_WINNER_ID(i) { for ((i) = 0; (i) < CONTESTANT_COUNT && gContestFinalStandings[(i)] != 0; (i)++); }
+// Gfx/pal tags for the text window sprites on the contest results screen.
+// Both types of text windows are made up of 4 individual sprites
+// These tags are used by the spritesheets, and implicitly in the loop in CreateResultsTextWindowSprites
+#define TAG_TEXT_WINDOW_BASE 3009
+enum {
+ TAG_RESULTS_TEXT_WINDOW_LEFT = TAG_TEXT_WINDOW_BASE,
+ TAG_RESULTS_TEXT_WINDOW_MIDLEFT,
+ TAG_RESULTS_TEXT_WINDOW_MIDRIGHT,
+ TAG_RESULTS_TEXT_WINDOW_RIGHT,
+ TAG_LINK_TEXT_WINDOW_LEFT,
+ TAG_LINK_TEXT_WINDOW_MIDLEFT,
+ TAG_LINK_TEXT_WINDOW_MIDRIGHT,
+ TAG_LINK_TEXT_WINDOW_RIGHT, // 3016
+};
#define TAG_CONFETTI 3017
+#define TAG_WIRELESS_INDICATOR_WINDOW 22222
#define MAX_BAR_LENGTH 87
+// Starting x/y for the sliding results screen text box
+#define TEXT_BOX_X (DISPLAY_WIDTH + 32)
+#define TEXT_BOX_Y (DISPLAY_HEIGHT - 16)
+
struct ContestResultsInternal
{
u8 slidingTextBoxSpriteId;
@@ -105,14 +123,14 @@ struct ContestResults
static EWRAM_DATA struct ContestResults *sContestResults = NULL;
static void LoadAllContestMonIconPalettes(void);
-static void LoadContestResultsTilemaps(void);
+static void LoadContestResultsTitleBarTilemaps(void);
static u8 GetNumPreliminaryPoints(u8, bool8);
static s8 GetNumRound2Points(u8, bool8);
static void AddContestTextPrinter(int, u8 *, int);
static void AllocContestResults(void);
static void FreeContestResults(void);
static void LoadAllContestMonIcons(u8, u8);
-static void LoadContestResultSprites(void);
+static void CreateResultsTextWindowSprites(void);
static void TryCreateWirelessSprites(void);
static void Task_StartShowContestResults(u8 taskId);
static void CB2_StartShowContestResults(void);
@@ -166,11 +184,11 @@ static void SpriteCB_Confetti(struct Sprite *sprite);
static void Task_ShowContestEntryMonPic(u8 taskId);
static void Task_LinkContestWaitForConnection(u8 taskId);
-static const u16 sUnknown_0858D6B0[] = INCBIN_U16("graphics/unknown/unknown_58D6B0.gbapal");
-static const u8 sUnknown_0858D6D0[] = INCBIN_U8("graphics/unknown/unknown_58D6D0.4bpp");
+static const u16 sResultsTextWindow_Pal[] = INCBIN_U16("graphics/contest/results_screen/text_window.gbapal");
+static const u8 sResultsTextWindow_Gfx[] = INCBIN_U8("graphics/contest/results_screen/text_window.4bpp");
static const u16 sMiscBlank_Pal[] = INCBIN_U16("graphics/interface/blank.gbapal");
-static const struct OamData sOamData_858D7F0 =
+static const struct OamData sOamData_ResultsTextWindow =
{
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
@@ -187,33 +205,33 @@ static const struct OamData sOamData_858D7F0 =
.affineParam = 0,
};
-static const struct SpriteTemplate sSpriteTemplate_858D7F8 =
+static const struct SpriteTemplate sSpriteTemplate_ResultsTextWindow =
{
- .tileTag = 3009,
- .paletteTag = 3009,
- .oam = &sOamData_858D7F0,
+ .tileTag = TAG_TEXT_WINDOW_BASE,
+ .paletteTag = TAG_TEXT_WINDOW_BASE,
+ .oam = &sOamData_ResultsTextWindow,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
-static const struct SpriteSheet sUnknown_0858D810[] =
+static const struct SpriteSheet sSpriteSheets_ResultsTextWindow[] =
{
- { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3009 },
- { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3010 },
- { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3011 },
- { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3012 },
- { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3013 },
- { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3014 },
- { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3015 },
- { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3016 },
+ { .data = gMiscBlank_Gfx, .size = 0x400, .tag = TAG_RESULTS_TEXT_WINDOW_LEFT },
+ { .data = gMiscBlank_Gfx, .size = 0x400, .tag = TAG_RESULTS_TEXT_WINDOW_MIDLEFT },
+ { .data = gMiscBlank_Gfx, .size = 0x400, .tag = TAG_RESULTS_TEXT_WINDOW_MIDRIGHT },
+ { .data = gMiscBlank_Gfx, .size = 0x400, .tag = TAG_RESULTS_TEXT_WINDOW_RIGHT },
+ { .data = gMiscBlank_Gfx, .size = 0x400, .tag = TAG_LINK_TEXT_WINDOW_LEFT },
+ { .data = gMiscBlank_Gfx, .size = 0x400, .tag = TAG_LINK_TEXT_WINDOW_MIDLEFT },
+ { .data = gMiscBlank_Gfx, .size = 0x400, .tag = TAG_LINK_TEXT_WINDOW_MIDRIGHT },
+ { .data = gMiscBlank_Gfx, .size = 0x400, .tag = TAG_LINK_TEXT_WINDOW_RIGHT },
};
-static const struct SpritePalette sUnknown_0858D850 =
+static const struct SpritePalette sSpritePalette_ResultsTextWindow =
{
.data = sMiscBlank_Pal,
- .tag = 3009,
+ .tag = TAG_TEXT_WINDOW_BASE,
};
static const struct OamData sOamData_Confetti =
@@ -339,7 +357,7 @@ static const struct WindowTemplate sWindowTemplates[] =
DUMMY_WIN_TEMPLATE,
};
-static const struct OamData sUnknown_0858D8C0 =
+static const struct OamData sOamData_WirelessIndicatorWindow =
{
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
@@ -357,22 +375,22 @@ static const struct OamData sUnknown_0858D8C0 =
};
-static const struct SpriteTemplate sSpriteTemplate_858D8C8 =
+static const struct SpriteTemplate sSpriteTemplate_WirelessIndicatorWindow =
{
- .tileTag = 22222,
+ .tileTag = TAG_WIRELESS_INDICATOR_WINDOW,
.paletteTag = 0,
- .oam = &sUnknown_0858D8C0,
+ .oam = &sOamData_WirelessIndicatorWindow,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
-static const struct SpriteSheet sUnknown_0858D8E0 =
+static const struct SpriteSheet sSpriteSheet_WirelessIndicatorWindow =
{
.data = gMiscBlank_Gfx,
.size = 0x200,
- .tag = 22222
+ .tag = TAG_WIRELESS_INDICATOR_WINDOW
};
static const u8 sContestLinkTextColors[4] = {TEXT_COLOR_WHITE, TEXT_DYNAMIC_COLOR_6, TEXT_DYNAMIC_COLOR_5};
@@ -430,12 +448,12 @@ static void LoadContestResultsBgGfx(void)
u16 tile1, tile2;
LZDecompressVram(gContestResults_Gfx, (void *)BG_CHAR_ADDR(0));
- CopyToBgTilemapBuffer(3, gUnknown_08C1A12C, 0, 0);
- CopyToBgTilemapBuffer(2, gUnknown_08C1A000, 0, 0);
- CopyToBgTilemapBuffer(0, gUnknown_08C19EEC, 0, 0);
- LoadContestResultsTilemaps();
+ CopyToBgTilemapBuffer(3, gContestResults_Bg_Tilemap, 0, 0);
+ CopyToBgTilemapBuffer(2, gContestResults_Interface_Tilemap, 0, 0);
+ CopyToBgTilemapBuffer(0, gContestResults_WinnerBanner_Tilemap, 0, 0);
+ LoadContestResultsTitleBarTilemaps();
LoadCompressedPalette(gContestResults_Pal, 0, 0x200);
- LoadPalette(sUnknown_0858D6B0, 0xF0, 0x20);
+ LoadPalette(sResultsTextWindow_Pal, 0xF0, sizeof(sResultsTextWindow_Pal));
for (i = 0; i < CONTESTANT_COUNT; i++)
{
@@ -479,7 +497,7 @@ static void LoadContestMonName(u8 monIndex)
struct ContestPokemon *mon = &gContestMons[monIndex];
u8 *str = gDisplayedStringBattle;
if (monIndex == gContestPlayerMonIndex)
- str = StringCopy(gDisplayedStringBattle, gText_ColorDarkGrey);
+ str = StringCopy(gDisplayedStringBattle, gText_ColorDarkGray);
StringCopy(str, mon->nickname);
AddContestTextPrinter(monIndex, gDisplayedStringBattle, 0);
@@ -515,14 +533,14 @@ static void CB2_StartShowContestResults(void)
LoadAllContestMonNames();
memset(sContestResults->data, 0, sizeof(*sContestResults->data));
memset(sContestResults->monResults, 0, sizeof(*sContestResults->monResults));
- LoadContestResultSprites();
+ CreateResultsTextWindowSprites();
TryCreateWirelessSprites();
BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK);
gPaletteFade.bufferTransferDisabled = FALSE;
sContestResults->data->showResultsTaskId = CreateTask(Task_ShowContestResults, 5);
SetMainCallback2(CB2_ShowContestResults);
gBattle_WIN1H = WIN_RANGE(0, DISPLAY_WIDTH);
- gBattle_WIN1V = WIN_RANGE(128, DISPLAY_HEIGHT);
+ gBattle_WIN1V = WIN_RANGE(DISPLAY_HEIGHT - 32, DISPLAY_HEIGHT);
CreateTask(Task_SlideContestResultsBg, 20);
CalculateContestantsResultData();
if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_WIRELESS)
@@ -587,10 +605,10 @@ static void Task_ShowContestResults(u8 taskId)
}
TryGainNewFanFromCounter(FANCOUNTER_FINISHED_CONTEST);
- sub_80DEDA8(gSpecialVar_ContestRank);
- sub_80DEDA8(0xFE);
- gUnknown_02039F5C = TRUE;
- gUnknown_02039F5D = sub_80DEFA8(0xFE, 0);
+ SaveContestWinner(gSpecialVar_ContestRank); // Save for lobby painting
+ SaveContestWinner(CONTEST_SAVE_FOR_ARTIST);
+ gCurContestWinnerIsForArtist = TRUE;
+ gCurContestWinnerSaveIdx = GetContestWinnerSaveIdx(CONTEST_SAVE_FOR_ARTIST, FALSE);
var = VarGet(VAR_CONTEST_HALL_STATE);
VarSet(VAR_CONTEST_HALL_STATE, 0);
SetContinueGameWarpStatusToDynamicWarp();
@@ -637,10 +655,10 @@ static void Task_ShowContestResults(u8 taskId)
if (gContestFinalStandings[gContestPlayerMonIndex] == 0)
IncrementGameStat(GAME_STAT_WON_CONTEST);
- sub_80DEDA8(gSpecialVar_ContestRank);
- sub_80DEDA8(0xFE);
- gUnknown_02039F5C = TRUE;
- gUnknown_02039F5D = sub_80DEFA8(0xFE, 0);
+ SaveContestWinner(gSpecialVar_ContestRank); // Save for lobby painting
+ SaveContestWinner(CONTEST_SAVE_FOR_ARTIST);
+ gCurContestWinnerIsForArtist = TRUE;
+ gCurContestWinnerSaveIdx = GetContestWinnerSaveIdx(CONTEST_SAVE_FOR_ARTIST, FALSE);
TryGainNewFanFromCounter(FANCOUNTER_FINISHED_CONTEST);
gTasks[taskId].func = Task_AnnouncePreliminaryResults;
}
@@ -679,7 +697,7 @@ static void Task_AnnouncePreliminaryResults(u8 taskId)
{
CreateTask(Task_FlashStarsAndHearts, 20);
x = DrawResultsTextWindow(gText_AnnouncingResults, sContestResults->data->slidingTextBoxSpriteId);
- StartTextBoxSlideIn(x, DISPLAY_HEIGHT - 16, 120, 1088);
+ StartTextBoxSlideIn(x, TEXT_BOX_Y, 120, 1088);
gTasks[taskId].tState++;
}
else if (gTasks[taskId].tState == 1)
@@ -702,7 +720,7 @@ static void Task_AnnouncePreliminaryResults(u8 taskId)
else if (gTasks[taskId].tState == 3)
{
x = DrawResultsTextWindow(gText_PreliminaryResults, sContestResults->data->slidingTextBoxSpriteId);
- StartTextBoxSlideIn(x, DISPLAY_HEIGHT - 16, -1, 1088);
+ StartTextBoxSlideIn(x, TEXT_BOX_Y, -1, 1088);
gTasks[taskId].tState++;
}
else if (gTasks[taskId].tState == 4)
@@ -752,7 +770,7 @@ static void Task_AnnounceRound2Results(u8 taskId)
{
gTasks[taskId].tTimer = 0;
x = DrawResultsTextWindow(gText_Round2Results, sContestResults->data->slidingTextBoxSpriteId);
- StartTextBoxSlideIn(x, DISPLAY_HEIGHT - 16, -1, 1088);
+ StartTextBoxSlideIn(x, TEXT_BOX_Y, -1, 1088);
}
}
else if (sContestResults->data->slidingTextBoxState == SLIDING_TEXT_ARRIVED)
@@ -837,11 +855,11 @@ static void Task_AnnounceWinner(u8 taskId)
gTasks[taskId].tTimer = 0;
GET_CONTEST_WINNER_ID(i);
StringCopy(gStringVar1, gContestMons[i].trainerName);
- sub_81DB5AC(gStringVar1);
+ ConvertInternationalContestantName(gStringVar1);
StringCopy(gStringVar2, gContestMons[i].nickname);
StringExpandPlaceholders(winnerTextBuffer, gText_ContestantsMonWon);
x = DrawResultsTextWindow(winnerTextBuffer, sContestResults->data->slidingTextBoxSpriteId);
- StartTextBoxSlideIn(x, DISPLAY_HEIGHT - 16, -1, 1088);
+ StartTextBoxSlideIn(x, TEXT_BOX_Y, -1, 1088);
gTasks[taskId].tState++;
}
break;
@@ -892,7 +910,7 @@ static void Task_ShowWinnerMonBanner(u8 taskId)
LoadCompressedSpritePalette(pokePal);
SetMultiuseSpriteTemplateToPokemon(species, B_POSITION_OPPONENT_LEFT);
gMultiuseSpriteTemplate.paletteTag = pokePal->tag;
- spriteId = CreateSprite(&gMultiuseSpriteTemplate, DISPLAY_WIDTH + 32, 80, 10);
+ spriteId = CreateSprite(&gMultiuseSpriteTemplate, DISPLAY_WIDTH + 32, DISPLAY_HEIGHT / 2, 10);
gSprites[spriteId].data[1] = species;
gSprites[spriteId].oam.priority = 0;
gSprites[spriteId].callback = SpriteCB_WinnerMonSlideIn;
@@ -1136,9 +1154,9 @@ static void TryCreateWirelessSprites(void)
LoadWirelessStatusIndicatorSpriteGfx();
CreateWirelessStatusIndicatorSprite(8, 8);
gSprites[gWirelessStatusIndicatorSpriteId].subpriority = 1;
- sheet = LoadSpriteSheet(&sUnknown_0858D8E0);
+ sheet = LoadSpriteSheet(&sSpriteSheet_WirelessIndicatorWindow);
RequestDma3Fill(0xFFFFFFFF, (void *)BG_CHAR_ADDR(4) + sheet * 0x20, 0x80, 1);
- spriteId = CreateSprite(&sSpriteTemplate_858D8C8, 8, 8, 0);
+ spriteId = CreateSprite(&sSpriteTemplate_WirelessIndicatorWindow, 8, 8, 0);
gSprites[spriteId].oam.objMode = ST_OAM_OBJ_WINDOW;
}
}
@@ -1150,14 +1168,13 @@ static s32 DrawResultsTextWindow(const u8 *text, u8 spriteId)
int strWidth;
u8 *spriteTilePtrs[4];
u8 *dst;
- {
- struct WindowTemplate windowTemplate;
- memset(&windowTemplate, 0, sizeof(windowTemplate));
- windowTemplate.width = 30;
- windowTemplate.height = 2;
- windowId = AddWindow(&windowTemplate);
- FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
- }
+
+ struct WindowTemplate windowTemplate;
+ memset(&windowTemplate, 0, sizeof(windowTemplate));
+ windowTemplate.width = 30;
+ windowTemplate.height = 2;
+ windowId = AddWindow(&windowTemplate);
+ FillWindowPixelBuffer(windowId, PIXEL_FILL(1));
origWidth = GetStringWidth(1, text, 0);
strWidth = (origWidth + 9) / 8;
@@ -1169,16 +1186,16 @@ static s32 DrawResultsTextWindow(const u8 *text, u8 spriteId)
s32 i;
struct Sprite *sprite;
const u8 *src, *windowTilesPtr;
- windowTilesPtr = (u8 *)(GetWindowAttribute(windowId, WINDOW_TILE_DATA));
- src = (u8 *)(sUnknown_0858D6D0);
+ windowTilesPtr = (u8 *)GetWindowAttribute(windowId, WINDOW_TILE_DATA);
+ src = (u8 *)sResultsTextWindow_Gfx;
sprite = &gSprites[spriteId];
spriteTilePtrs[0] = (u8 *)(sprite->oam.tileNum * 32 + OBJ_VRAM0);
- for (i = 1; i < 4; i++)
+ for (i = 1; i < (int)ARRAY_COUNT(spriteTilePtrs); i++)
spriteTilePtrs[i] = (void*)(gSprites[sprite->data[i - 1]].oam.tileNum * 32 + OBJ_VRAM0);
- for (i = 0; i < 4; i++)
+ for (i = 0; i < (int)ARRAY_COUNT(spriteTilePtrs); i++)
CpuFill32(0, spriteTilePtrs[i], 0x400);
dst = spriteTilePtrs[0];
@@ -1208,27 +1225,31 @@ static s32 DrawResultsTextWindow(const u8 *text, u8 spriteId)
return (DISPLAY_WIDTH - (strWidth + 2) * 8) / 2;
}
-static void LoadContestResultSprites(void)
+static void CreateResultsTextWindowSprites(void)
{
int i;
struct SpriteTemplate template;
- u8 spriteIds[ARRAY_COUNT(sUnknown_0858D810)];
+ u8 spriteIds[ARRAY_COUNT(sSpriteSheets_ResultsTextWindow)];
- template = sSpriteTemplate_858D7F8;
- for (i = 0; i < (int)ARRAY_COUNT(sUnknown_0858D810); i++)
- LoadSpriteSheet(&sUnknown_0858D810[i]);
+ template = sSpriteTemplate_ResultsTextWindow;
+ for (i = 0; i < (int)ARRAY_COUNT(sSpriteSheets_ResultsTextWindow); i++)
+ LoadSpriteSheet(&sSpriteSheets_ResultsTextWindow[i]);
- LoadSpritePalette(&sUnknown_0858D850);
- for (i = 0; i < (int)ARRAY_COUNT(sUnknown_0858D810); i++)
+ LoadSpritePalette(&sSpritePalette_ResultsTextWindow);
+
+ // Create sprites for the two window types, each made up of 4 sprites
+ for (i = 0; i < (int)ARRAY_COUNT(sSpriteSheets_ResultsTextWindow); i++)
{
- spriteIds[i] = CreateSprite(&template, DISPLAY_WIDTH + 32, DISPLAY_HEIGHT - 16, 10);
+ spriteIds[i] = CreateSprite(&template, TEXT_BOX_X, TEXT_BOX_Y, 10);
template.tileTag++;
}
+ // Save sprite ids of the sliding text box onto its leftmost sprite
gSprites[spriteIds[0]].data[0] = spriteIds[1];
gSprites[spriteIds[0]].data[1] = spriteIds[2];
gSprites[spriteIds[0]].data[2] = spriteIds[3];
+ // Save sprite ids of the link text box onto its leftmost sprite
gSprites[spriteIds[4]].data[0] = spriteIds[5];
gSprites[spriteIds[4]].data[1] = spriteIds[6];
gSprites[spriteIds[4]].data[2] = spriteIds[7];
@@ -1248,7 +1269,7 @@ static void LoadContestResultSprites(void)
static void StartTextBoxSlideIn(s16 x, u16 y, u16 slideOutTimer, u16 slideIncrement)
{
struct Sprite *sprite = &gSprites[sContestResults->data->slidingTextBoxSpriteId];
- sprite->pos1.x = DISPLAY_WIDTH + 32;
+ sprite->pos1.x = TEXT_BOX_X;
sprite->pos1.y = y;
sprite->pos2.x = 0;
sprite->pos2.y = 0;
@@ -1275,8 +1296,8 @@ static void StartTextBoxSlideOut(u16 slideIncrement)
static void EndTextBoxSlideOut(struct Sprite *sprite)
{
- sprite->pos1.x = DISPLAY_WIDTH + 32;
- sprite->pos1.y = DISPLAY_HEIGHT - 16;
+ sprite->pos1.x = TEXT_BOX_X;
+ sprite->pos1.y = TEXT_BOX_Y;
sprite->pos2.y = 0;
sprite->pos2.x = 0;
sprite->callback = SpriteCallbackDummy;
@@ -1377,7 +1398,7 @@ static void HideLinkResultsTextBox(void)
| WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
}
-static void LoadContestResultsTilemaps(void)
+static void LoadContestResultsTitleBarTilemaps(void)
{
u8 palette;
int x, y;
@@ -1386,58 +1407,58 @@ static void LoadContestResultsTilemaps(void)
y = 1;
if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK)
{
- CopyToBgTilemapBufferRect(2, gLinkContestResults_Tilemap, 5, 1, 5, 2);
+ CopyToBgTilemapBufferRect(2, gContestResultsTitle_Link_Tilemap, 5, 1, 5, 2);
x = 10;
}
else if (gSpecialVar_ContestRank == CONTEST_RANK_NORMAL)
{
- CopyToBgTilemapBufferRect(2, gNormalContestResults_Tilemap, 5, 1, 10, 2);
+ CopyToBgTilemapBufferRect(2, gContestResultsTitle_Normal_Tilemap, 5, 1, 10, 2);
x = 15;
}
else if (gSpecialVar_ContestRank == CONTEST_RANK_SUPER)
{
- CopyToBgTilemapBufferRect(2, gSuperContestResults_Tilemap, 5, 1, 10, 2);
+ CopyToBgTilemapBufferRect(2, gContestResultsTitle_Super_Tilemap, 5, 1, 10, 2);
x = 15;
}
else if (gSpecialVar_ContestRank == CONTEST_RANK_HYPER)
{
- CopyToBgTilemapBufferRect(2, gHyperContestResults_Tilemap, 5, 1, 10, 2);
+ CopyToBgTilemapBufferRect(2, gContestResultsTitle_Hyper_Tilemap, 5, 1, 10, 2);
x = 15;
}
else // CONTEST_RANK_MASTER
{
- CopyToBgTilemapBufferRect(2, gMasterContestResults_Tilemap, 5, 1, 10, 2);
+ CopyToBgTilemapBufferRect(2, gContestResultsTitle_Master_Tilemap, 5, 1, 10, 2);
x = 15;
}
if (gSpecialVar_ContestCategory == CONTEST_CATEGORY_COOL)
{
palette = 0;
- CopyToBgTilemapBufferRect(2, gCoolContestResults_Tilemap, x, y, 5, 2);
+ CopyToBgTilemapBufferRect(2, gContestResultsTitle_Cool_Tilemap, x, y, 5, 2);
}
else if (gSpecialVar_ContestCategory == CONTEST_CATEGORY_BEAUTY)
{
palette = 1;
- CopyToBgTilemapBufferRect(2, gBeautyContestResults_Tilemap, x, y, 5, 2);
+ CopyToBgTilemapBufferRect(2, gContestResultsTitle_Beauty_Tilemap, x, y, 5, 2);
}
else if (gSpecialVar_ContestCategory == CONTEST_CATEGORY_CUTE)
{
palette = 2;
- CopyToBgTilemapBufferRect(2, gCuteContestResults_Tilemap, x, y, 5, 2);
+ CopyToBgTilemapBufferRect(2, gContestResultsTitle_Cute_Tilemap, x, y, 5, 2);
}
else if (gSpecialVar_ContestCategory == CONTEST_CATEGORY_SMART)
{
palette = 3;
- CopyToBgTilemapBufferRect(2, gSmartContestResults_Tilemap, x, y, 5, 2);
+ CopyToBgTilemapBufferRect(2, gContestResultsTitle_Smart_Tilemap, x, y, 5, 2);
}
else // CONTEST_CATEGORY_TOUGH
{
palette = 4;
- CopyToBgTilemapBufferRect(2, gToughContestResults_Tilemap, x, y, 5, 2);
+ CopyToBgTilemapBufferRect(2, gContestResultsTitle_Tough_Tilemap, x, y, 5, 2);
}
x += 5;
- CopyToBgTilemapBufferRect(2, gContestResults_Tilemap, x, y, 6, 2);
+ CopyToBgTilemapBufferRect(2, gContestResultsTitle_Tilemap, x, y, 6, 2);
CopyToBgTilemapBufferRect_ChangePalette(2, sContestResults->tilemapBuffers[2], 0, 0, 32, 4, palette);
}
@@ -1567,10 +1588,10 @@ static void SpriteCB_WinnerMonSlideIn(struct Sprite *sprite)
sprite->pos1.x -= delta >> 8;
sprite->data[1] += 0x600;
sprite->data[1] &= 0xFF;
- if (sprite->pos1.x < 120)
- sprite->pos1.x = 120;
+ if (sprite->pos1.x < DISPLAY_WIDTH / 2)
+ sprite->pos1.x = DISPLAY_WIDTH / 2;
- if (sprite->pos1.x == 120)
+ if (sprite->pos1.x == DISPLAY_WIDTH / 2)
{
sprite->callback = SpriteCallbackDummy;
sprite->data[1] = 0;
@@ -1628,7 +1649,7 @@ static void SpriteCB_Confetti(struct Sprite *sprite)
if (sContestResults->data->destroyConfetti)
sprite->invisible = TRUE;
- if (sprite->pos1.x > 248 || sprite->pos1.y > 116)
+ if (sprite->pos1.x > DISPLAY_WIDTH + 8 || sprite->pos1.y > 116)
{
DestroySprite(sprite);
sContestResults->data->confettiCount--;
@@ -2035,7 +2056,7 @@ void GiveMonContestRibbon(void)
void BufferContestantTrainerName(void)
{
StringCopy(gStringVar1, gContestMons[gSpecialVar_0x8006].trainerName);
- sub_81DB5AC(gStringVar1);
+ ConvertInternationalContestantName(gStringVar1);
}
void BufferContestantMonNickname(void)
@@ -2074,7 +2095,7 @@ void BufferContestWinnerTrainerName(void)
u8 i;
GET_CONTEST_WINNER_ID(i);
StringCopy(gStringVar3, gContestMons[i].trainerName);
- sub_81DB5AC(gStringVar3);
+ ConvertInternationalContestantName(gStringVar3);
}
void BufferContestWinnerMonName(void)
@@ -2257,6 +2278,10 @@ static void Task_LinkContest_WaitDisconnect(u8 taskId)
}
}
+/*
+ A section of contest script functions starts here
+*/
+
void SetContestTrainerGfxIds(void)
{
gSaveBlock1Ptr->vars[VAR_OBJ_GFX_ID_0 - VARS_START] = gContestMons[0].trainerGfxId;
@@ -2265,27 +2290,27 @@ void SetContestTrainerGfxIds(void)
}
// Unused
-void sub_80F8814(void)
+void GetNpcContestantLocalId(void)
{
- u16 var1;
- u8 var0 = gSpecialVar_0x8005;
- switch (var0)
+ u16 localId;
+ u8 contestant = gSpecialVar_0x8005;
+ switch (contestant)
{
case 0:
- var1 = 3;
+ localId = 3;
break;
case 1:
- var1 = 4;
+ localId = 4;
break;
case 2:
- var1 = 5;
+ localId = 5;
break;
- default:
- var1 = 100;
+ default: // Invalid
+ localId = 100;
break;
}
- gSpecialVar_0x8004 = var1;
+ gSpecialVar_0x8004 = localId;
}
void BufferContestTrainerAndMonNames(void)
@@ -2296,26 +2321,26 @@ void BufferContestTrainerAndMonNames(void)
}
// Unused
-void DoesContestCategoryHaveWinner(void)
+void DoesContestCategoryHaveMuseumPainting(void)
{
int contestWinner;
switch (gSpecialVar_ContestCategory)
{
case CONTEST_CATEGORY_COOL:
- contestWinner = 8;
+ contestWinner = CONTEST_WINNER_MUSEUM_COOL - 1;
break;
case CONTEST_CATEGORY_BEAUTY:
- contestWinner = 9;
+ contestWinner = CONTEST_WINNER_MUSEUM_BEAUTY - 1;
break;
case CONTEST_CATEGORY_CUTE:
- contestWinner = 10;
+ contestWinner = CONTEST_WINNER_MUSEUM_CUTE - 1;
break;
case CONTEST_CATEGORY_SMART:
- contestWinner = 11;
+ contestWinner = CONTEST_WINNER_MUSEUM_SMART - 1;
break;
case CONTEST_CATEGORY_TOUGH:
default:
- contestWinner = 12;
+ contestWinner = CONTEST_WINNER_MUSEUM_TOUGH - 1;
break;
}
@@ -2327,7 +2352,7 @@ void DoesContestCategoryHaveWinner(void)
void SaveMuseumContestPainting(void)
{
- sub_80DEDA8(0xFF);
+ SaveContestWinner(CONTEST_SAVE_FOR_MUSEUM);
}
void ShouldReadyContestArtist(void)
@@ -2344,14 +2369,14 @@ void ShouldReadyContestArtist(void)
}
}
-u8 CountPlayerContestPaintings(void)
+u8 CountPlayerMuseumPaintings(void)
{
int i;
u8 count = 0;
- for (i = 0; i < 5; i++)
+ for (i = 0; i < NUM_CONTEST_WINNERS - MUSEUM_CONTEST_WINNERS_START; i++)
{
- if (gSaveBlock1Ptr->contestWinners[8 + i].species)
+ if (gSaveBlock1Ptr->contestWinners[MUSEUM_CONTEST_WINNERS_START + i].species)
count++;
}
@@ -2359,19 +2384,21 @@ u8 CountPlayerContestPaintings(void)
}
// Unused
-void sub_80F8970(void)
+void GetContestantNamesAtRank(void)
{
s16 conditions[CONTESTANT_COUNT];
int i, j;
s16 condition;
- s8 var0;
- u8 var2;
- u8 r8;
- u8 r7;
+ s8 numAtCondition;
+ u8 contestantOffset;
+ u8 tieRank;
+ u8 rank;
+ // Get round 1 points
for (i = 0; i < CONTESTANT_COUNT; i++)
conditions[i] = gContestMonRound1Points[i];
+ // Sort round 1 points
for (i = 0; i < CONTESTANT_COUNT - 1; i++)
{
for (j = CONTESTANT_COUNT - 1; j > i; j--)
@@ -2384,58 +2411,65 @@ void sub_80F8970(void)
}
}
+ // Get round 1 points at specified rank
condition = conditions[gSpecialVar_0x8006];
- var0 = 0;
- r8 = 0;
+
+ // Count number of contestants with the same number of points
+ numAtCondition = 0;
+ tieRank = 0;
for (i = 0; i < CONTESTANT_COUNT; i++)
{
if (conditions[i] == condition)
{
- var0++;
+ numAtCondition++;
if (i == gSpecialVar_0x8006)
- r8 = var0;
+ tieRank = numAtCondition;
}
}
+ // Get rank of first contestant with the same number of points
for (i = 0; i < CONTESTANT_COUNT; i++)
{
if (conditions[i] == condition)
break;
}
+ rank = i;
- r7 = i;
- var2 = r8;
+ // Get contestant id of player at rank (taking ties into account)
+ contestantOffset = tieRank;
for (i = 0; i < CONTESTANT_COUNT; i++)
{
if (condition == gContestMonRound1Points[i])
{
- if (var2 == 1)
+ if (contestantOffset == 1)
break;
- var2--;
+ contestantOffset--;
}
}
+ // Use contestant id to get names
StringCopy(gStringVar1, gContestMons[i].nickname);
StringCopy(gStringVar2, gContestMons[i].trainerName);
- sub_81DB5AC(gStringVar2);
+ ConvertInternationalContestantName(gStringVar2);
- if (var0 == 1)
- gSpecialVar_0x8006 = r7;
- else if (r8 == var0)
- gSpecialVar_0x8006 = r7;
+ // Return adjusted rank
+ if (numAtCondition == 1)
+ gSpecialVar_0x8006 = rank;
+ else if (tieRank == numAtCondition)
+ gSpecialVar_0x8006 = rank;
else
- gSpecialVar_0x8006 = r7 + 4;
+ gSpecialVar_0x8006 = rank + CONTESTANT_COUNT;
}
-static void ExitContestWinnerPainting(void)
+static void ExitContestPainting(void)
{
SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
}
-void ShowContestWinnerPainting(void)
+void ShowContestPainting(void)
{
SetMainCallback2(CB2_ContestPainting);
- gMain.savedCallback = ExitContestWinnerPainting;
+ gMain.savedCallback = ExitContestPainting;
}
void SetLinkContestPlayerGfx(void)
diff --git a/src/data.c b/src/data.c
index 30672f7c4..5856d17b8 100644
--- a/src/data.c
+++ b/src/data.c
@@ -124,172 +124,178 @@ static const union AnimCmd sAnim_GeneralFrame3[] =
ANIMCMD_END,
};
-static const union AffineAnimCmd gUnknown_082FF548[] =
+// Many of these affine anims seem to go unused, and
+// instead SetSpriteRotScale is used to manipulate
+// the battler sprites directly (for instance, in AnimTask_SwitchOutShrinkMon).
+// Those with explicit indexes are referenced elsewhere.
+
+static const union AffineAnimCmd sAffineAnim_Battler_Normal[] =
{
- AFFINEANIMCMD_FRAME(0x0100, 0x0100, 0x00, 0x00),
+ AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
AFFINEANIMCMD_END,
};
-static const union AffineAnimCmd gUnknown_082FF558[] =
+static const union AffineAnimCmd sAffineAnim_Battler_Flipped[] =
{
- AFFINEANIMCMD_FRAME(0xff00, 0x0100, 0x00, 0x00),
+ AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0),
AFFINEANIMCMD_END,
};
-static const union AffineAnimCmd gUnknown_082FF568[] =
+static const union AffineAnimCmd sAffineAnim_Battler_Emerge[] =
{
- AFFINEANIMCMD_FRAME(0x0028, 0x0028, 0x00, 0x00),
- AFFINEANIMCMD_FRAME(0x0012, 0x0012, 0x00, 0x0c),
+ AFFINEANIMCMD_FRAME(0x28, 0x28, 0, 0),
+ AFFINEANIMCMD_FRAME(0x12, 0x12, 0, 12),
AFFINEANIMCMD_END,
};
-static const union AffineAnimCmd gUnknown_082FF580[] =
+static const union AffineAnimCmd sAffineAnim_Battler_Return[] =
{
- AFFINEANIMCMD_FRAME(0xfffe, 0xfffe, 0x00, 0x12),
- AFFINEANIMCMD_FRAME(0xfff0, 0xfff0, 0x00, 0x0f),
+ AFFINEANIMCMD_FRAME( -0x2, -0x2, 0, 18),
+ AFFINEANIMCMD_FRAME(-0x10, -0x10, 0, 15),
AFFINEANIMCMD_END,
};
-static const union AffineAnimCmd gUnknown_082FF598[] =
+static const union AffineAnimCmd sAffineAnim_Battler_HorizontalSquishLoop[] =
{
- AFFINEANIMCMD_FRAME(0x00a0, 0x0100, 0x00, 0x00),
- AFFINEANIMCMD_FRAME(0x0004, 0x0000, 0x00, 0x08),
- AFFINEANIMCMD_FRAME(0xfffc, 0x0000, 0x00, 0x08),
+ AFFINEANIMCMD_FRAME(0xA0, 0x100, 0, 0),
+ AFFINEANIMCMD_FRAME( 0x4, 0x0, 0, 8),
+ AFFINEANIMCMD_FRAME(-0x4, 0x0, 0, 8),
AFFINEANIMCMD_JUMP(1),
};
-static const union AffineAnimCmd gUnknown_082FF5B8[] =
+static const union AffineAnimCmd sAffineAnim_Battler_Grow[] =
{
- AFFINEANIMCMD_FRAME(0x0002, 0x0002, 0x00, 0x14),
+ AFFINEANIMCMD_FRAME(0x2, 0x2, 0, 20),
AFFINEANIMCMD_END,
};
-static const union AffineAnimCmd gUnknown_082FF5C8[] =
+static const union AffineAnimCmd sAffineAnim_Battler_Shrink[] =
{
- AFFINEANIMCMD_FRAME(0xfffe, 0xfffe, 0x00, 0x14),
+ AFFINEANIMCMD_FRAME(-0x2, -0x2, 0, 20),
AFFINEANIMCMD_END,
};
-static const union AffineAnimCmd gUnknown_082FF5D8[] =
+static const union AffineAnimCmd sAffineAnim_Battler_BigToSmall[] =
{
- AFFINEANIMCMD_FRAME(0x0100, 0x0100, 0x00, 0000),
- AFFINEANIMCMD_FRAME(0xfff0, 0xfff0, 0x00, 0x09),
+ AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
+ AFFINEANIMCMD_FRAME(-0x10, -0x10, 0, 9),
AFFINEANIMCMD_END,
};
-static const union AffineAnimCmd gUnknown_082FF5F0[] =
+static const union AffineAnimCmd sAffineAnim_Battler_GrowLarge[] =
{
- AFFINEANIMCMD_FRAME(0x0004, 0x0004, 0x00, 0x3f),
+ AFFINEANIMCMD_FRAME(0x4, 0x4, 0, 63),
AFFINEANIMCMD_END,
};
-static const union AffineAnimCmd gUnknown_082FF600[] =
+static const union AffineAnimCmd sAffineAnim_Battler_TipRight[] =
{
- AFFINEANIMCMD_FRAME(0x0000, 0x0000, 0xfd, 0x05),
- AFFINEANIMCMD_FRAME(0x0000, 0x0000, 0x03, 0x05),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -3, 5),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 3, 5),
AFFINEANIMCMD_END,
};
const union AffineAnimCmd *const gAffineAnims_BattleSpritePlayerSide[] =
{
- gUnknown_082FF548,
- gUnknown_082FF568,
- gUnknown_082FF580,
- gUnknown_082FF598,
- gUnknown_082FF5B8,
- gUnknown_082FF5C8,
- gUnknown_082FF5F0,
- gUnknown_082FF600,
- gUnknown_082FF5D8,
+ [BATTLER_AFFINE_NORMAL] = sAffineAnim_Battler_Normal,
+ [BATTLER_AFFINE_EMERGE] = sAffineAnim_Battler_Emerge,
+ [BATTLER_AFFINE_RETURN] = sAffineAnim_Battler_Return,
+ sAffineAnim_Battler_HorizontalSquishLoop,
+ sAffineAnim_Battler_Grow,
+ sAffineAnim_Battler_Shrink,
+ sAffineAnim_Battler_GrowLarge,
+ sAffineAnim_Battler_TipRight,
+ sAffineAnim_Battler_BigToSmall,
};
-static const union AffineAnimCmd gUnknown_082FF63C[] =
+static const union AffineAnimCmd sAffineAnim_Battler_SpinShrink[] =
{
- AFFINEANIMCMD_FRAME(0xfffc, 0xfffc, 0x04, 0x3f),
+ AFFINEANIMCMD_FRAME(-0x4, -0x4, 4, 63),
AFFINEANIMCMD_END,
};
-static const union AffineAnimCmd gUnknown_082FF64C[] =
+static const union AffineAnimCmd sAffineAnim_Battler_TipLeft[] =
{
- AFFINEANIMCMD_FRAME(0x0000, 0x0000, 0x03, 0x05),
- AFFINEANIMCMD_FRAME(0x0000, 0x0000, 0xfd, 0x05),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 3, 5),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -3, 5),
AFFINEANIMCMD_END,
};
-static const union AffineAnimCmd gUnknown_082FF664[] =
+static const union AffineAnimCmd sAffineAnim_Battler_RotateUpAndBack[] =
{
- AFFINEANIMCMD_FRAME(0x0000, 0x0000, 0xfb, 0x14),
- AFFINEANIMCMD_FRAME(0x0000, 0x0000, 0x00, 0x14),
- AFFINEANIMCMD_FRAME(0x0000, 0x0000, 0x05, 0x14),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, -5, 20),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 20),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 5, 20),
AFFINEANIMCMD_END,
};
-static const union AffineAnimCmd gUnknown_082FF684[] =
+static const union AffineAnimCmd sAffineAnim_Battler_Spin[] =
{
- AFFINEANIMCMD_FRAME(0x0000, 0x0000, 0x09, 0x6e),
+ AFFINEANIMCMD_FRAME(0x0, 0x0, 9, 110),
AFFINEANIMCMD_END,
};
const union AffineAnimCmd *const gAffineAnims_BattleSpriteOpponentSide[] =
{
- gUnknown_082FF548,
- gUnknown_082FF568,
- gUnknown_082FF580,
- gUnknown_082FF598,
- gUnknown_082FF5B8,
- gUnknown_082FF5C8,
- gUnknown_082FF63C,
- gUnknown_082FF64C,
- gUnknown_082FF664,
- gUnknown_082FF5D8,
- gUnknown_082FF684,
+ [BATTLER_AFFINE_NORMAL] = sAffineAnim_Battler_Normal,
+ [BATTLER_AFFINE_EMERGE] = sAffineAnim_Battler_Emerge,
+ [BATTLER_AFFINE_RETURN] = sAffineAnim_Battler_Return,
+ sAffineAnim_Battler_HorizontalSquishLoop,
+ sAffineAnim_Battler_Grow,
+ sAffineAnim_Battler_Shrink,
+ sAffineAnim_Battler_SpinShrink,
+ sAffineAnim_Battler_TipLeft,
+ sAffineAnim_Battler_RotateUpAndBack,
+ sAffineAnim_Battler_BigToSmall,
+ sAffineAnim_Battler_Spin,
};
-const union AffineAnimCmd *const gUnknown_082FF6C0[] =
+const union AffineAnimCmd *const gAffineAnims_BattleSpriteContest[] =
{
- gUnknown_082FF558,
- gUnknown_082FF568,
- gUnknown_082FF580,
- gUnknown_082FF598,
- gUnknown_082FF5B8,
- gUnknown_082FF5C8,
- gUnknown_082FF63C,
- gUnknown_082FF64C,
- gUnknown_082FF664,
- gUnknown_082FF5D8,
- gUnknown_082FF684,
+ [BATTLER_AFFINE_NORMAL] = sAffineAnim_Battler_Flipped,
+ [BATTLER_AFFINE_EMERGE] = sAffineAnim_Battler_Emerge,
+ [BATTLER_AFFINE_RETURN] = sAffineAnim_Battler_Return,
+ sAffineAnim_Battler_HorizontalSquishLoop,
+ sAffineAnim_Battler_Grow,
+ sAffineAnim_Battler_Shrink,
+ sAffineAnim_Battler_SpinShrink,
+ sAffineAnim_Battler_TipLeft,
+ sAffineAnim_Battler_RotateUpAndBack,
+ sAffineAnim_Battler_BigToSmall,
+ sAffineAnim_Battler_Spin,
};
-static const union AnimCmd gUnknown_082FF6EC[] =
+
+static const union AnimCmd sAnim_MonPic_0[] =
{
ANIMCMD_FRAME(0, 0),
ANIMCMD_END,
};
-static const union AnimCmd gUnknown_082FF6F4[] =
+static const union AnimCmd sAnim_MonPic_1[] =
{
ANIMCMD_FRAME(1, 0),
ANIMCMD_END,
};
-static const union AnimCmd gUnknown_082FF6FC[] =
+static const union AnimCmd sAnim_MonPic_2[] =
{
ANIMCMD_FRAME(2, 0),
ANIMCMD_END,
};
-static const union AnimCmd gUnknown_082FF704[] =
+static const union AnimCmd sAnim_MonPic_3[] =
{
ANIMCMD_FRAME(3, 0),
ANIMCMD_END,
};
-const union AnimCmd *const gUnknown_082FF70C[] =
+const union AnimCmd *const gAnims_MonPic[] =
{
- gUnknown_082FF6EC,
- gUnknown_082FF6F4,
- gUnknown_082FF6FC,
- gUnknown_082FF704,
+ sAnim_MonPic_0,
+ sAnim_MonPic_1,
+ sAnim_MonPic_2,
+ sAnim_MonPic_3,
};
#define SPECIES_SPRITE(species, sprite) [SPECIES_##species] = {sprite, MON_PIC_SIZE, SPECIES_##species}
@@ -313,120 +319,7 @@ const union AnimCmd *const gUnknown_082FF70C[] =
#include "data/pokemon_graphics/enemy_mon_elevation.h"
#include "data/pokemon_graphics/front_pic_anims.h"
#include "data/pokemon_graphics/front_pic_table.h"
-
-static const u32 sUnused[] =
-{
- 0x00000888, 0x00000888, 0x00000888, 0x00000888,
- 0x00000088, 0x00000888, 0x00000888, 0x00000886,
- 0x00000888, 0x00000886, 0x00000888, 0x00000888,
- 0x00000888, 0x00000888, 0x00000888, 0x00000888,
- 0x00000886, 0x00000888, 0x00000888, 0x00000888,
- 0x00000888, 0x00000888, 0x00000886, 0x00000886,
- 0x00000888, 0x00000088, 0x00000088, 0x00000088,
- 0x00000088, 0x00000888, 0x00000886, 0x00000888,
- 0x00000888, 0x00000888, 0x00000886, 0x00000886,
- 0x00000888, 0x00000088, 0x00000088, 0x00000088,
- 0x00000088, 0x00000886, 0x00000886, 0x00000088,
- 0x00000886, 0x00000886, 0x00000888, 0x00000888,
- 0x00000888, 0x00000888, 0x00000888, 0x00000888,
- 0x00000886, 0x00000888, 0x00000088, 0x00000088,
- 0x00000888, 0x00000888, 0x00000888, 0x00000886,
- 0x00000888, 0x00000888, 0x00000888, 0x00000886,
- 0x00000886, 0x00000886, 0x00000886, 0x00000886,
- 0x00000886, 0x00000886, 0x00000888, 0x00000888,
- 0x00000886, 0x00000886, 0x00000886, 0x00000886,
- 0x00000886, 0x00000888, 0x00000888, 0x00000888,
- 0x00000888, 0x00000886, 0x00000886, 0x00000888,
- 0x00000886, 0x00000886, 0x00000888, 0x00000888,
- 0x00000088, 0x00000088, 0x00000888, 0x00000888,
- 0x00000888, 0x00000888, 0x00000888, 0x00000888,
- 0x00000888, 0x00000888, 0x00000888, 0x00000888,
- 0x00000886, 0x00000886, 0x00000888, 0x00000888,
- 0x00000888, 0x00000888, 0x00000088, 0x00000886,
- 0x00000888, 0x00000088, 0x00000088, 0x00000088,
- 0x00000088, 0x00000888, 0x00000886, 0x00000888,
- 0x00000088, 0x00000088, 0x00000886, 0x00000886,
- 0x00000088, 0x00000088, 0x00000888, 0x00000886,
- 0x00000886, 0x00000888, 0x00000888, 0x00000088,
- 0x00000888, 0x00000886, 0x00000886, 0x00000888,
- 0x00000886, 0x00000888, 0x00000888, 0x00000886,
- 0x00000888, 0x00000888, 0x00000888, 0x00000888,
- 0x00000888, 0x00000888, 0x00000888, 0x00000888,
- 0x00000888, 0x00000888, 0x00000888, 0x00000888,
- 0x00000888, 0x00000888, 0x00000088, 0x00000888,
- 0x00000888, 0x00000888, 0x00000888, 0x00000888,
- 0x00000088, 0x00000888, 0x00000888, 0x00000886,
- 0x00000886, 0x00000888, 0x00000888, 0x00000888,
- 0x00000888, 0x00000888, 0x00000888, 0x00000886,
- 0x00000888, 0x00000886, 0x00000088, 0x00000088,
- 0x00000088, 0x00000888, 0x00000088, 0x00000888,
- 0x00000888, 0x00000088, 0x00000088, 0x00000888,
- 0x00000886, 0x00000888, 0x00000886, 0x00000886,
- 0x00000886, 0x00000888, 0x00000888, 0x00000888,
- 0x00000088, 0x00000888, 0x00000888, 0x00000888,
- 0x00000088, 0x00000888, 0x00000888, 0x00000888,
- 0x00000888, 0x00000888, 0x00000888, 0x00000888,
- 0x00000888, 0x00000888, 0x00000088, 0x00000088,
- 0x00000886, 0x00000888, 0x00000888, 0x00000888,
- 0x00000888, 0x00000888, 0x00000888, 0x00000888,
- 0x00000888, 0x00000888, 0x00000088, 0x00000888,
- 0x00000886, 0x00000888, 0x00000088, 0x00000088,
- 0x00000888, 0x00000888, 0x00000088, 0x00000888,
- 0x00000888, 0x00000888, 0x00000888, 0x00000088,
- 0x00000888, 0x00000888, 0x00000088, 0x00000088,
- 0x00000088, 0x00000888, 0x00000088, 0x00000888,
- 0x00000888, 0x00000888, 0x00000888, 0x00000888,
- 0x00000888, 0x00000888, 0x00000888, 0x00000888,
- 0x00000888, 0x00000888, 0x00000888, 0x00000888,
- 0x00000888, 0x00000886, 0x00000888, 0x00000888,
- 0x00000888, 0x00000888, 0x00000888, 0x00000888,
- 0x00000888, 0x00000888, 0x00000888, 0x00000888,
- 0x00000888, 0x00000888, 0x00000888, 0x00000888,
- 0x00000888, 0x00000888, 0x00000888, 0x00000888,
- 0x00000888, 0x00000888, 0x00000888, 0x00000888,
- 0x00000888, 0x00000888, 0x00000888, 0x00000888,
- 0x00000888, 0x00000886, 0x00000886, 0x00000886,
- 0x00000088, 0x00000088, 0x00000088, 0x00000886,
- 0x00000088, 0x00000886, 0x00000886, 0x00000886,
- 0x00000088, 0x00000886, 0x00000088, 0x00000088,
- 0x00000088, 0x00000088, 0x00000088, 0x00000886,
- 0x00000886, 0x00000886, 0x00000888, 0x00000888,
- 0x00000886, 0x00000886, 0x00000886, 0x00000886,
- 0x00000088, 0x00000088, 0x00000886, 0x00000886,
- 0x00001882, 0x00000088, 0x00000088, 0x00000088,
- 0x00000088, 0x00000886, 0x00000886, 0x00000886,
- 0x00000088, 0x00000088, 0x00000088, 0x00000088,
- 0x00000886, 0x00000088, 0x00000886, 0x00000088,
- 0x00000088, 0x00000088, 0x00000088, 0x00000088,
- 0x00000088, 0x00000088, 0x00000886, 0x00000886,
- 0x00000088, 0x00000088, 0x00000088, 0x00000886,
- 0x00000886, 0x00000088, 0x00000088, 0x00000088,
- 0x00000088, 0x00000088, 0x00000088, 0x00000088,
- 0x00000088, 0x00000088, 0x00000088, 0x00000088,
- 0x00000088, 0x00000088, 0x00000886, 0x00000088,
- 0x00000088, 0x00000886, 0x00000886, 0x00000886,
- 0x00000886, 0x00000886, 0x00000088, 0x00000088,
- 0x00000088, 0x00000088, 0x00000088, 0x00000886,
- 0x00000886, 0x00000886, 0x00000886, 0x00000088,
- 0x00000886, 0x00000088, 0x00000886, 0x00000886,
- 0x00000886, 0x00000088, 0x00000088, 0x00000088,
- 0x00000088, 0x00000088, 0x00000088, 0x00000088,
- 0x00000088, 0x00000088, 0x00000886, 0x00000886,
- 0x00000886, 0x00000888, 0x00000886, 0x00000886,
- 0x00000088, 0x00000088, 0x00000088, 0x00000088,
- 0x00000886, 0x00000886, 0x00000088, 0x00000088,
- 0x00000088, 0x00000088, 0x00000088, 0x00000088,
- 0x00000088, 0x00000088, 0x00000088, 0x00000088,
- 0x00000088, 0x00000088, 0x00000088, 0x00000088,
- 0x00000088, 0x00000088, 0x00000088, 0x00000088,
- 0x00000088, 0x00000888, 0x00000888, 0x00000888,
- 0x00000888, 0x00000888, 0x00000888, 0x00000888,
- 0x00000888, 0x00000888, 0x00000888, 0x00000888,
- 0x00000888, 0x00000888, 0x00000888, 0x00000888,
- 0x00000888, 0x00000888, 0x00000888, 0x00000888,
- 0x00000888, 0x00000888, 0x00000888, 0x00000888,
- 0x00000888, 0x00000888, 0x00000888, 0x00000888,
-};
+#include "data/pokemon_graphics/unknown_table.h"
#include "data/trainer_parties.h"
#include "data/text/trainer_class_names.h"
diff --git a/src/data/contest_opponents.h b/src/data/contest_opponents.h
index 127457bbe..b5466904b 100644
--- a/src/data/contest_opponents.h
+++ b/src/data/contest_opponents.h
@@ -138,7 +138,7 @@
const struct ContestWinner gDefaultContestWinners[] =
{
- {
+ [CONTEST_WINNER_HALL_1 - 1] = {
.personality = 0,
.trainerId = 0xFFFF,
.species = SPECIES_ELECTRIKE,
@@ -147,7 +147,7 @@ const struct ContestWinner gDefaultContestWinners[] =
.trainerName = _("EZRA"),
.contestRank = CONTEST_RANK_NORMAL
},
- {
+ [CONTEST_WINNER_HALL_2 - 1] = {
.personality = 0,
.trainerId = 0xFFFF,
.species = SPECIES_TROPIUS,
@@ -156,7 +156,7 @@ const struct ContestWinner gDefaultContestWinners[] =
.trainerName = _("ALLAN"),
.contestRank = CONTEST_RANK_HYPER
},
- {
+ [CONTEST_WINNER_HALL_3 - 1] = {
.personality = 0,
.trainerId = 0xFFFF,
.species = SPECIES_XATU,
@@ -165,7 +165,7 @@ const struct ContestWinner gDefaultContestWinners[] =
.trainerName = _("JULIET"),
.contestRank = CONTEST_RANK_NORMAL
},
- {
+ [CONTEST_WINNER_HALL_4 - 1] = {
.personality = 0,
.trainerId = 0xFFFF,
.species = SPECIES_PLUSLE,
@@ -174,7 +174,7 @@ const struct ContestWinner gDefaultContestWinners[] =
.trainerName = _("BAILY"),
.contestRank = CONTEST_RANK_MASTER
},
- {
+ [CONTEST_WINNER_HALL_5 - 1] = {
.personality = 0,
.trainerId = 0xFFFF,
.species = SPECIES_SHUPPET,
@@ -183,7 +183,7 @@ const struct ContestWinner gDefaultContestWinners[] =
.trainerName = _("MELANY"),
.contestRank = CONTEST_RANK_SUPER
},
- {
+ [CONTEST_WINNER_HALL_6 - 1] = {
.personality = 0,
.trainerId = 0xFFFF,
.species = SPECIES_ZANGOOSE,
@@ -192,7 +192,7 @@ const struct ContestWinner gDefaultContestWinners[] =
.trainerName = _("HANA"),
.contestRank = CONTEST_RANK_HYPER
},
- {
+ [CONTEST_WINNER_HALL_UNUSED_1 - 1] = {
.personality = 0,
.trainerId = 0xFFFF,
.species = SPECIES_LOUDRED,
@@ -201,7 +201,7 @@ const struct ContestWinner gDefaultContestWinners[] =
.trainerName = _("BRYANT"),
.contestRank = CONTEST_RANK_HYPER
},
- {
+ [CONTEST_WINNER_HALL_UNUSED_2 - 1] = {
.personality = 0,
.trainerId = 0xFFFF,
.species = SPECIES_DELCATTY,
diff --git a/src/data/pokemon_graphics/unknown_table.h b/src/data/pokemon_graphics/unknown_table.h
new file mode 100644
index 000000000..737b79c1b
--- /dev/null
+++ b/src/data/pokemon_graphics/unknown_table.h
@@ -0,0 +1,444 @@
+// Unknown and unused
+static const u32 sUnused[] =
+{
+ [SPECIES_NONE] = 0x888,
+ [SPECIES_BULBASAUR] = 0x888,
+ [SPECIES_IVYSAUR] = 0x888,
+ [SPECIES_VENUSAUR] = 0x888,
+ [SPECIES_CHARMANDER] = 0x88,
+ [SPECIES_CHARMELEON] = 0x888,
+ [SPECIES_CHARIZARD] = 0x888,
+ [SPECIES_SQUIRTLE] = 0x886,
+ [SPECIES_WARTORTLE] = 0x888,
+ [SPECIES_BLASTOISE] = 0x886,
+ [SPECIES_CATERPIE] = 0x888,
+ [SPECIES_METAPOD] = 0x888,
+ [SPECIES_BUTTERFREE] = 0x888,
+ [SPECIES_WEEDLE] = 0x888,
+ [SPECIES_KAKUNA] = 0x888,
+ [SPECIES_BEEDRILL] = 0x888,
+ [SPECIES_PIDGEY] = 0x886,
+ [SPECIES_PIDGEOTTO] = 0x888,
+ [SPECIES_PIDGEOT] = 0x888,
+ [SPECIES_RATTATA] = 0x888,
+ [SPECIES_RATICATE] = 0x888,
+ [SPECIES_SPEAROW] = 0x888,
+ [SPECIES_FEAROW] = 0x886,
+ [SPECIES_EKANS] = 0x886,
+ [SPECIES_ARBOK] = 0x888,
+ [SPECIES_PIKACHU] = 0x88,
+ [SPECIES_RAICHU] = 0x88,
+ [SPECIES_SANDSHREW] = 0x88,
+ [SPECIES_SANDSLASH] = 0x88,
+ [SPECIES_NIDORAN_F] = 0x888,
+ [SPECIES_NIDORINA] = 0x886,
+ [SPECIES_NIDOQUEEN] = 0x888,
+ [SPECIES_NIDORAN_M] = 0x888,
+ [SPECIES_NIDORINO] = 0x888,
+ [SPECIES_NIDOKING] = 0x886,
+ [SPECIES_CLEFAIRY] = 0x886,
+ [SPECIES_CLEFABLE] = 0x888,
+ [SPECIES_VULPIX] = 0x88,
+ [SPECIES_NINETALES] = 0x88,
+ [SPECIES_JIGGLYPUFF] = 0x88,
+ [SPECIES_WIGGLYTUFF] = 0x88,
+ [SPECIES_ZUBAT] = 0x886,
+ [SPECIES_GOLBAT] = 0x886,
+ [SPECIES_ODDISH] = 0x88,
+ [SPECIES_GLOOM] = 0x886,
+ [SPECIES_VILEPLUME] = 0x886,
+ [SPECIES_PARAS] = 0x888,
+ [SPECIES_PARASECT] = 0x888,
+ [SPECIES_VENONAT] = 0x888,
+ [SPECIES_VENOMOTH] = 0x888,
+ [SPECIES_DIGLETT] = 0x888,
+ [SPECIES_DUGTRIO] = 0x888,
+ [SPECIES_MEOWTH] = 0x886,
+ [SPECIES_PERSIAN] = 0x888,
+ [SPECIES_PSYDUCK] = 0x88,
+ [SPECIES_GOLDUCK] = 0x88,
+ [SPECIES_MANKEY] = 0x888,
+ [SPECIES_PRIMEAPE] = 0x888,
+ [SPECIES_GROWLITHE] = 0x888,
+ [SPECIES_ARCANINE] = 0x886,
+ [SPECIES_POLIWAG] = 0x888,
+ [SPECIES_POLIWHIRL] = 0x888,
+ [SPECIES_POLIWRATH] = 0x888,
+ [SPECIES_ABRA] = 0x886,
+ [SPECIES_KADABRA] = 0x886,
+ [SPECIES_ALAKAZAM] = 0x886,
+ [SPECIES_MACHOP] = 0x886,
+ [SPECIES_MACHOKE] = 0x886,
+ [SPECIES_MACHAMP] = 0x886,
+ [SPECIES_BELLSPROUT] = 0x886,
+ [SPECIES_WEEPINBELL] = 0x888,
+ [SPECIES_VICTREEBEL] = 0x888,
+ [SPECIES_TENTACOOL] = 0x886,
+ [SPECIES_TENTACRUEL] = 0x886,
+ [SPECIES_GEODUDE] = 0x886,
+ [SPECIES_GRAVELER] = 0x886,
+ [SPECIES_GOLEM] = 0x886,
+ [SPECIES_PONYTA] = 0x888,
+ [SPECIES_RAPIDASH] = 0x888,
+ [SPECIES_SLOWPOKE] = 0x888,
+ [SPECIES_SLOWBRO] = 0x888,
+ [SPECIES_MAGNEMITE] = 0x886,
+ [SPECIES_MAGNETON] = 0x886,
+ [SPECIES_FARFETCHD] = 0x888,
+ [SPECIES_DODUO] = 0x886,
+ [SPECIES_DODRIO] = 0x886,
+ [SPECIES_SEEL] = 0x888,
+ [SPECIES_DEWGONG] = 0x888,
+ [SPECIES_GRIMER] = 0x88,
+ [SPECIES_MUK] = 0x88,
+ [SPECIES_SHELLDER] = 0x888,
+ [SPECIES_CLOYSTER] = 0x888,
+ [SPECIES_GASTLY] = 0x888,
+ [SPECIES_HAUNTER] = 0x888,
+ [SPECIES_GENGAR] = 0x888,
+ [SPECIES_ONIX] = 0x888,
+ [SPECIES_DROWZEE] = 0x888,
+ [SPECIES_HYPNO] = 0x888,
+ [SPECIES_KRABBY] = 0x888,
+ [SPECIES_KINGLER] = 0x888,
+ [SPECIES_VOLTORB] = 0x886,
+ [SPECIES_ELECTRODE] = 0x886,
+ [SPECIES_EXEGGCUTE] = 0x888,
+ [SPECIES_EXEGGUTOR] = 0x888,
+ [SPECIES_CUBONE] = 0x888,
+ [SPECIES_MAROWAK] = 0x888,
+ [SPECIES_HITMONLEE] = 0x88,
+ [SPECIES_HITMONCHAN] = 0x886,
+ [SPECIES_LICKITUNG] = 0x888,
+ [SPECIES_KOFFING] = 0x88,
+ [SPECIES_WEEZING] = 0x88,
+ [SPECIES_RHYHORN] = 0x88,
+ [SPECIES_RHYDON] = 0x88,
+ [SPECIES_CHANSEY] = 0x888,
+ [SPECIES_TANGELA] = 0x886,
+ [SPECIES_KANGASKHAN] = 0x888,
+ [SPECIES_HORSEA] = 0x88,
+ [SPECIES_SEADRA] = 0x88,
+ [SPECIES_GOLDEEN] = 0x886,
+ [SPECIES_SEAKING] = 0x886,
+ [SPECIES_STARYU] = 0x88,
+ [SPECIES_STARMIE] = 0x88,
+ [SPECIES_MR_MIME] = 0x888,
+ [SPECIES_SCYTHER] = 0x886,
+ [SPECIES_JYNX] = 0x886,
+ [SPECIES_ELECTABUZZ] = 0x888,
+ [SPECIES_MAGMAR] = 0x888,
+ [SPECIES_PINSIR] = 0x88,
+ [SPECIES_TAUROS] = 0x888,
+ [SPECIES_MAGIKARP] = 0x886,
+ [SPECIES_GYARADOS] = 0x886,
+ [SPECIES_LAPRAS] = 0x888,
+ [SPECIES_DITTO] = 0x886,
+ [SPECIES_EEVEE] = 0x888,
+ [SPECIES_VAPOREON] = 0x888,
+ [SPECIES_JOLTEON] = 0x886,
+ [SPECIES_FLAREON] = 0x888,
+ [SPECIES_PORYGON] = 0x888,
+ [SPECIES_OMANYTE] = 0x888,
+ [SPECIES_OMASTAR] = 0x888,
+ [SPECIES_KABUTO] = 0x888,
+ [SPECIES_KABUTOPS] = 0x888,
+ [SPECIES_AERODACTYL] = 0x888,
+ [SPECIES_SNORLAX] = 0x888,
+ [SPECIES_ARTICUNO] = 0x888,
+ [SPECIES_ZAPDOS] = 0x888,
+ [SPECIES_MOLTRES] = 0x888,
+ [SPECIES_DRATINI] = 0x888,
+ [SPECIES_DRAGONAIR] = 0x888,
+ [SPECIES_DRAGONITE] = 0x888,
+ [SPECIES_MEWTWO] = 0x88,
+ [SPECIES_MEW] = 0x888,
+ [SPECIES_CHIKORITA] = 0x888,
+ [SPECIES_BAYLEEF] = 0x888,
+ [SPECIES_MEGANIUM] = 0x888,
+ [SPECIES_CYNDAQUIL] = 0x888,
+ [SPECIES_QUILAVA] = 0x88,
+ [SPECIES_TYPHLOSION] = 0x888,
+ [SPECIES_TOTODILE] = 0x888,
+ [SPECIES_CROCONAW] = 0x886,
+ [SPECIES_FERALIGATR] = 0x886,
+ [SPECIES_SENTRET] = 0x888,
+ [SPECIES_FURRET] = 0x888,
+ [SPECIES_HOOTHOOT] = 0x888,
+ [SPECIES_NOCTOWL] = 0x888,
+ [SPECIES_LEDYBA] = 0x888,
+ [SPECIES_LEDIAN] = 0x888,
+ [SPECIES_SPINARAK] = 0x886,
+ [SPECIES_ARIADOS] = 0x888,
+ [SPECIES_CROBAT] = 0x886,
+ [SPECIES_CHINCHOU] = 0x88,
+ [SPECIES_LANTURN] = 0x88,
+ [SPECIES_PICHU] = 0x88,
+ [SPECIES_CLEFFA] = 0x888,
+ [SPECIES_IGGLYBUFF] = 0x88,
+ [SPECIES_TOGEPI] = 0x888,
+ [SPECIES_TOGETIC] = 0x888,
+ [SPECIES_NATU] = 0x88,
+ [SPECIES_XATU] = 0x88,
+ [SPECIES_MAREEP] = 0x888,
+ [SPECIES_FLAAFFY] = 0x886,
+ [SPECIES_AMPHAROS] = 0x888,
+ [SPECIES_BELLOSSOM] = 0x886,
+ [SPECIES_MARILL] = 0x886,
+ [SPECIES_AZUMARILL] = 0x886,
+ [SPECIES_SUDOWOODO] = 0x888,
+ [SPECIES_POLITOED] = 0x888,
+ [SPECIES_HOPPIP] = 0x888,
+ [SPECIES_SKIPLOOM] = 0x88,
+ [SPECIES_JUMPLUFF] = 0x888,
+ [SPECIES_AIPOM] = 0x888,
+ [SPECIES_SUNKERN] = 0x888,
+ [SPECIES_SUNFLORA] = 0x88,
+ [SPECIES_YANMA] = 0x888,
+ [SPECIES_WOOPER] = 0x888,
+ [SPECIES_QUAGSIRE] = 0x888,
+ [SPECIES_ESPEON] = 0x888,
+ [SPECIES_UMBREON] = 0x888,
+ [SPECIES_MURKROW] = 0x888,
+ [SPECIES_SLOWKING] = 0x888,
+ [SPECIES_MISDREAVUS] = 0x888,
+ [SPECIES_UNOWN] = 0x888,
+ [SPECIES_WOBBUFFET] = 0x88,
+ [SPECIES_GIRAFARIG] = 0x88,
+ [SPECIES_PINECO] = 0x886,
+ [SPECIES_FORRETRESS] = 0x888,
+ [SPECIES_DUNSPARCE] = 0x888,
+ [SPECIES_GLIGAR] = 0x888,
+ [SPECIES_STEELIX] = 0x888,
+ [SPECIES_SNUBBULL] = 0x888,
+ [SPECIES_GRANBULL] = 0x888,
+ [SPECIES_QWILFISH] = 0x888,
+ [SPECIES_SCIZOR] = 0x888,
+ [SPECIES_SHUCKLE] = 0x888,
+ [SPECIES_HERACROSS] = 0x88,
+ [SPECIES_SNEASEL] = 0x888,
+ [SPECIES_TEDDIURSA] = 0x886,
+ [SPECIES_URSARING] = 0x888,
+ [SPECIES_SLUGMA] = 0x88,
+ [SPECIES_MAGCARGO] = 0x88,
+ [SPECIES_SWINUB] = 0x888,
+ [SPECIES_PILOSWINE] = 0x888,
+ [SPECIES_CORSOLA] = 0x88,
+ [SPECIES_REMORAID] = 0x888,
+ [SPECIES_OCTILLERY] = 0x888,
+ [SPECIES_DELIBIRD] = 0x888,
+ [SPECIES_MANTINE] = 0x888,
+ [SPECIES_SKARMORY] = 0x88,
+ [SPECIES_HOUNDOUR] = 0x888,
+ [SPECIES_HOUNDOOM] = 0x888,
+ [SPECIES_KINGDRA] = 0x88,
+ [SPECIES_PHANPY] = 0x88,
+ [SPECIES_DONPHAN] = 0x88,
+ [SPECIES_PORYGON2] = 0x888,
+ [SPECIES_STANTLER] = 0x88,
+ [SPECIES_SMEARGLE] = 0x888,
+ [SPECIES_TYROGUE] = 0x888,
+ [SPECIES_HITMONTOP] = 0x888,
+ [SPECIES_SMOOCHUM] = 0x888,
+ [SPECIES_ELEKID] = 0x888,
+ [SPECIES_MAGBY] = 0x888,
+ [SPECIES_MILTANK] = 0x888,
+ [SPECIES_BLISSEY] = 0x888,
+ [SPECIES_RAIKOU] = 0x888,
+ [SPECIES_ENTEI] = 0x888,
+ [SPECIES_SUICUNE] = 0x888,
+ [SPECIES_LARVITAR] = 0x888,
+ [SPECIES_PUPITAR] = 0x888,
+ [SPECIES_TYRANITAR] = 0x888,
+ [SPECIES_LUGIA] = 0x886,
+ [SPECIES_HO_OH] = 0x888,
+ [SPECIES_CELEBI] = 0x888,
+ [SPECIES_OLD_UNOWN_B] = 0x888,
+ [SPECIES_OLD_UNOWN_C] = 0x888,
+ [SPECIES_OLD_UNOWN_D] = 0x888,
+ [SPECIES_OLD_UNOWN_E] = 0x888,
+ [SPECIES_OLD_UNOWN_F] = 0x888,
+ [SPECIES_OLD_UNOWN_G] = 0x888,
+ [SPECIES_OLD_UNOWN_H] = 0x888,
+ [SPECIES_OLD_UNOWN_I] = 0x888,
+ [SPECIES_OLD_UNOWN_J] = 0x888,
+ [SPECIES_OLD_UNOWN_K] = 0x888,
+ [SPECIES_OLD_UNOWN_L] = 0x888,
+ [SPECIES_OLD_UNOWN_M] = 0x888,
+ [SPECIES_OLD_UNOWN_N] = 0x888,
+ [SPECIES_OLD_UNOWN_O] = 0x888,
+ [SPECIES_OLD_UNOWN_P] = 0x888,
+ [SPECIES_OLD_UNOWN_Q] = 0x888,
+ [SPECIES_OLD_UNOWN_R] = 0x888,
+ [SPECIES_OLD_UNOWN_S] = 0x888,
+ [SPECIES_OLD_UNOWN_T] = 0x888,
+ [SPECIES_OLD_UNOWN_U] = 0x888,
+ [SPECIES_OLD_UNOWN_V] = 0x888,
+ [SPECIES_OLD_UNOWN_W] = 0x888,
+ [SPECIES_OLD_UNOWN_X] = 0x888,
+ [SPECIES_OLD_UNOWN_Y] = 0x888,
+ [SPECIES_OLD_UNOWN_Z] = 0x888,
+ [SPECIES_TREECKO] = 0x886,
+ [SPECIES_GROVYLE] = 0x886,
+ [SPECIES_SCEPTILE] = 0x886,
+ [SPECIES_TORCHIC] = 0x88,
+ [SPECIES_COMBUSKEN] = 0x88,
+ [SPECIES_BLAZIKEN] = 0x88,
+ [SPECIES_MUDKIP] = 0x886,
+ [SPECIES_MARSHTOMP] = 0x88,
+ [SPECIES_SWAMPERT] = 0x886,
+ [SPECIES_POOCHYENA] = 0x886,
+ [SPECIES_MIGHTYENA] = 0x886,
+ [SPECIES_ZIGZAGOON] = 0x88,
+ [SPECIES_LINOONE] = 0x886,
+ [SPECIES_WURMPLE] = 0x88,
+ [SPECIES_SILCOON] = 0x88,
+ [SPECIES_BEAUTIFLY] = 0x88,
+ [SPECIES_CASCOON] = 0x88,
+ [SPECIES_DUSTOX] = 0x88,
+ [SPECIES_LOTAD] = 0x886,
+ [SPECIES_LOMBRE] = 0x886,
+ [SPECIES_LUDICOLO] = 0x886,
+ [SPECIES_SEEDOT] = 0x888,
+ [SPECIES_NUZLEAF] = 0x888,
+ [SPECIES_SHIFTRY] = 0x886,
+ [SPECIES_NINCADA] = 0x886,
+ [SPECIES_NINJASK] = 0x886,
+ [SPECIES_SHEDINJA] = 0x886,
+ [SPECIES_TAILLOW] = 0x88,
+ [SPECIES_SWELLOW] = 0x88,
+ [SPECIES_SHROOMISH] = 0x886,
+ [SPECIES_BRELOOM] = 0x886,
+ [SPECIES_SPINDA] = 0x1882,
+ [SPECIES_WINGULL] = 0x88,
+ [SPECIES_PELIPPER] = 0x88,
+ [SPECIES_SURSKIT] = 0x88,
+ [SPECIES_MASQUERAIN] = 0x88,
+ [SPECIES_WAILMER] = 0x886,
+ [SPECIES_WAILORD] = 0x886,
+ [SPECIES_SKITTY] = 0x886,
+ [SPECIES_DELCATTY] = 0x88,
+ [SPECIES_KECLEON] = 0x88,
+ [SPECIES_BALTOY] = 0x88,
+ [SPECIES_CLAYDOL] = 0x88,
+ [SPECIES_NOSEPASS] = 0x886,
+ [SPECIES_TORKOAL] = 0x88,
+ [SPECIES_SABLEYE] = 0x886,
+ [SPECIES_BARBOACH] = 0x88,
+ [SPECIES_WHISCASH] = 0x88,
+ [SPECIES_LUVDISC] = 0x88,
+ [SPECIES_CORPHISH] = 0x88,
+ [SPECIES_CRAWDAUNT] = 0x88,
+ [SPECIES_FEEBAS] = 0x88,
+ [SPECIES_MILOTIC] = 0x88,
+ [SPECIES_CARVANHA] = 0x886,
+ [SPECIES_SHARPEDO] = 0x886,
+ [SPECIES_TRAPINCH] = 0x88,
+ [SPECIES_VIBRAVA] = 0x88,
+ [SPECIES_FLYGON] = 0x88,
+ [SPECIES_MAKUHITA] = 0x886,
+ [SPECIES_HARIYAMA] = 0x886,
+ [SPECIES_ELECTRIKE] = 0x88,
+ [SPECIES_MANECTRIC] = 0x88,
+ [SPECIES_NUMEL] = 0x88,
+ [SPECIES_CAMERUPT] = 0x88,
+ [SPECIES_SPHEAL] = 0x88,
+ [SPECIES_SEALEO] = 0x88,
+ [SPECIES_WALREIN] = 0x88,
+ [SPECIES_CACNEA] = 0x88,
+ [SPECIES_CACTURNE] = 0x88,
+ [SPECIES_SNORUNT] = 0x88,
+ [SPECIES_GLALIE] = 0x88,
+ [SPECIES_LUNATONE] = 0x88,
+ [SPECIES_SOLROCK] = 0x88,
+ [SPECIES_AZURILL] = 0x886,
+ [SPECIES_SPOINK] = 0x88,
+ [SPECIES_GRUMPIG] = 0x88,
+ [SPECIES_PLUSLE] = 0x886,
+ [SPECIES_MINUN] = 0x886,
+ [SPECIES_MAWILE] = 0x886,
+ [SPECIES_MEDITITE] = 0x886,
+ [SPECIES_MEDICHAM] = 0x886,
+ [SPECIES_SWABLU] = 0x88,
+ [SPECIES_ALTARIA] = 0x88,
+ [SPECIES_WYNAUT] = 0x88,
+ [SPECIES_DUSKULL] = 0x88,
+ [SPECIES_DUSCLOPS] = 0x88,
+ [SPECIES_ROSELIA] = 0x886,
+ [SPECIES_SLAKOTH] = 0x886,
+ [SPECIES_VIGOROTH] = 0x886,
+ [SPECIES_SLAKING] = 0x886,
+ [SPECIES_GULPIN] = 0x88,
+ [SPECIES_SWALOT] = 0x886,
+ [SPECIES_TROPIUS] = 0x88,
+ [SPECIES_WHISMUR] = 0x886,
+ [SPECIES_LOUDRED] = 0x886,
+ [SPECIES_EXPLOUD] = 0x886,
+ [SPECIES_CLAMPERL] = 0x88,
+ [SPECIES_HUNTAIL] = 0x88,
+ [SPECIES_GOREBYSS] = 0x88,
+ [SPECIES_ABSOL] = 0x88,
+ [SPECIES_SHUPPET] = 0x88,
+ [SPECIES_BANETTE] = 0x88,
+ [SPECIES_SEVIPER] = 0x88,
+ [SPECIES_ZANGOOSE] = 0x88,
+ [SPECIES_RELICANTH] = 0x88,
+ [SPECIES_ARON] = 0x886,
+ [SPECIES_LAIRON] = 0x886,
+ [SPECIES_AGGRON] = 0x886,
+ [SPECIES_CASTFORM] = 0x888,
+ [SPECIES_VOLBEAT] = 0x886,
+ [SPECIES_ILLUMISE] = 0x886,
+ [SPECIES_LILEEP] = 0x88,
+ [SPECIES_CRADILY] = 0x88,
+ [SPECIES_ANORITH] = 0x88,
+ [SPECIES_ARMALDO] = 0x88,
+ [SPECIES_RALTS] = 0x886,
+ [SPECIES_KIRLIA] = 0x886,
+ [SPECIES_GARDEVOIR] = 0x88,
+ [SPECIES_BAGON] = 0x88,
+ [SPECIES_SHELGON] = 0x88,
+ [SPECIES_SALAMENCE] = 0x88,
+ [SPECIES_BELDUM] = 0x88,
+ [SPECIES_METANG] = 0x88,
+ [SPECIES_METAGROSS] = 0x88,
+ [SPECIES_REGIROCK] = 0x88,
+ [SPECIES_REGICE] = 0x88,
+ [SPECIES_REGISTEEL] = 0x88,
+ [SPECIES_KYOGRE] = 0x88,
+ [SPECIES_GROUDON] = 0x88,
+ [SPECIES_RAYQUAZA] = 0x88,
+ [SPECIES_LATIAS] = 0x88,
+ [SPECIES_LATIOS] = 0x88,
+ [SPECIES_JIRACHI] = 0x88,
+ [SPECIES_DEOXYS] = 0x88,
+ [SPECIES_CHIMECHO] = 0x88,
+ [SPECIES_EGG] = 0x88,
+ [SPECIES_UNOWN_B] = 0x888,
+ [SPECIES_UNOWN_C] = 0x888,
+ [SPECIES_UNOWN_D] = 0x888,
+ [SPECIES_UNOWN_E] = 0x888,
+ [SPECIES_UNOWN_F] = 0x888,
+ [SPECIES_UNOWN_G] = 0x888,
+ [SPECIES_UNOWN_H] = 0x888,
+ [SPECIES_UNOWN_I] = 0x888,
+ [SPECIES_UNOWN_J] = 0x888,
+ [SPECIES_UNOWN_K] = 0x888,
+ [SPECIES_UNOWN_L] = 0x888,
+ [SPECIES_UNOWN_M] = 0x888,
+ [SPECIES_UNOWN_N] = 0x888,
+ [SPECIES_UNOWN_O] = 0x888,
+ [SPECIES_UNOWN_P] = 0x888,
+ [SPECIES_UNOWN_Q] = 0x888,
+ [SPECIES_UNOWN_R] = 0x888,
+ [SPECIES_UNOWN_S] = 0x888,
+ [SPECIES_UNOWN_T] = 0x888,
+ [SPECIES_UNOWN_U] = 0x888,
+ [SPECIES_UNOWN_V] = 0x888,
+ [SPECIES_UNOWN_W] = 0x888,
+ [SPECIES_UNOWN_X] = 0x888,
+ [SPECIES_UNOWN_Y] = 0x888,
+ [SPECIES_UNOWN_Z] = 0x888,
+ [SPECIES_UNOWN_EMARK] = 0x888,
+ [SPECIES_UNOWN_QMARK] = 0x888,
+};
diff --git a/src/daycare.c b/src/daycare.c
index 14cf57806..6a1715049 100644
--- a/src/daycare.c
+++ b/src/daycare.c
@@ -23,11 +23,13 @@
#include "constants/moves.h"
#include "constants/region_map_sections.h"
+extern const struct Evolution gEvolutionTable[][EVOS_PER_MON];
+
// this file's functions
-static void ClearDaycareMonMail(struct DayCareMail *mail);
+static void ClearDaycareMonMail(struct DaycareMail *mail);
static void SetInitialEggData(struct Pokemon *mon, u16 species, struct DayCare *daycare);
static u8 GetDaycareCompatibilityScore(struct DayCare *daycare);
-static void DaycarePrintMonInfo(u8 windowId, s32 daycareSlotId, u8 y);
+static void DaycarePrintMonInfo(u8 windowId, u32 daycareSlotId, u8 y);
// RAM buffers used to assist with BuildEggMoveset()
EWRAM_DATA static u16 sHatchedEggLevelUpMoves[EGG_LVL_UP_MOVES_ARRAY_COUNT] = {0};
@@ -120,7 +122,7 @@ u8 CountPokemonInDaycare(struct DayCare *daycare)
return count;
}
-void InitDaycareMailRecordMixing(struct DayCare *daycare, struct RecordMixingDayCareMail *daycareMail)
+void InitDaycareMailRecordMixing(struct DayCare *daycare, struct RecordMixingDaycareMail *daycareMail)
{
u8 i;
u8 numDaycareMons = 0;
@@ -131,13 +133,9 @@ void InitDaycareMailRecordMixing(struct DayCare *daycare, struct RecordMixingDay
{
numDaycareMons++;
if (GetBoxMonData(&daycare->mons[i].mon, MON_DATA_HELD_ITEM) == ITEM_NONE)
- {
daycareMail->holdsItem[i] = FALSE;
- }
else
- {
daycareMail->holdsItem[i] = TRUE;
- }
}
else
{
@@ -154,7 +152,7 @@ static s8 Daycare_FindEmptySpot(struct DayCare *daycare)
for (i = 0; i < DAYCARE_MON_COUNT; i++)
{
- if (GetBoxMonData(&daycare->mons[i].mon, MON_DATA_SPECIES) == 0)
+ if (GetBoxMonData(&daycare->mons[i].mon, MON_DATA_SPECIES) == SPECIES_NONE)
return i;
}
@@ -349,7 +347,7 @@ u8 GetNumLevelsGainedFromDaycare(void)
return 0;
}
-static void ClearDaycareMonMail(struct DayCareMail *mail)
+static void ClearDaycareMonMail(struct DaycareMail *mail)
{
s32 i;
@@ -1228,7 +1226,7 @@ static void DaycarePrintMonLvl(struct DayCare *daycare, u8 windowId, u32 daycare
DaycareAddTextPrinter(windowId, lvlText, x, y);
}
-static void DaycarePrintMonInfo(u8 windowId, s32 daycareSlotId, u8 y)
+static void DaycarePrintMonInfo(u8 windowId, u32 daycareSlotId, u8 y)
{
if (daycareSlotId < (unsigned) DAYCARE_MON_COUNT)
{
diff --git a/src/decoration.c b/src/decoration.c
index b9a243708..ebd7eb26c 100644
--- a/src/decoration.c
+++ b/src/decoration.c
@@ -147,7 +147,7 @@ static void ReturnToActionsMenuFromCategories(u8 taskId);
static void ExitTraderDecorationMenu(u8 taskId);
static void CopyDecorationMenuItemName(u8 *dest, u16 decoration);
static void DecorationItemsMenu_OnCursorMove(s32 itemIndex, bool8 flag, struct ListMenu *menu);
-static void DecorationItemsMenu_PrintDecorationInUse(u8 windowId, s32 itemIndex, u8 y);
+static void DecorationItemsMenu_PrintDecorationInUse(u8 windowId, u32 itemIndex, u8 y);
static void ShowDecorationItemsWindow(u8 taskId);
static void HandleDecorationItemsMenuInput(u8 taskId);
static void PrintDecorationItemDescription(s32 itemIndex);
@@ -912,9 +912,9 @@ static void DecorationItemsMenu_OnCursorMove(s32 itemIndex, bool8 flag, struct L
PrintDecorationItemDescription(itemIndex);
}
-static void DecorationItemsMenu_PrintDecorationInUse(u8 windowId, s32 itemIndex, u8 y)
+static void DecorationItemsMenu_PrintDecorationInUse(u8 windowId, u32 itemIndex, u8 y)
{
- if (itemIndex != -2)
+ if (itemIndex != LIST_CANCEL)
{
if (IsDecorationIndexInSecretBase(itemIndex + 1) == TRUE)
BlitMenuInfoIcon(windowId, MENU_INFO_ICON_BALL_RED, 92, y + 2);
@@ -1652,7 +1652,7 @@ static void PlaceDecoration(u8 taskId)
gSprites[sDecor_CameraSpriteObjectIdx1].pos1.y += 2;
if (gMapHeader.regionMapSectionId == MAPSEC_SECRET_BASE)
- TV_PutSecretBaseVisitOnTheAir();
+ TryPutSecretBaseVisitOnAir();
CancelDecorating_(taskId);
}
@@ -2260,7 +2260,7 @@ static void Task_PutAwayDecoration(u8 taskId)
StringExpandPlaceholders(gStringVar4, gText_DecorationReturnedToPC);
DisplayItemMessageOnField(taskId, gStringVar4, ContinuePuttingAwayDecorationsPrompt);
if (gMapHeader.regionMapSectionId == MAPSEC_SECRET_BASE)
- TV_PutSecretBaseVisitOnTheAir();
+ TryPutSecretBaseVisitOnAir();
}
break;
}
diff --git a/src/easy_chat.c b/src/easy_chat.c
index 96d680840..753c2df76 100644
--- a/src/easy_chat.c
+++ b/src/easy_chat.c
@@ -1474,8 +1474,8 @@ void ShowEasyChatScreen(void)
words = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8005].fanclubOpinions.words[gSpecialVar_0x8006];
displayedPersonType = EASY_CHAT_PERSON_REPORTER_FEMALE;
break;
- case EASY_CHAT_TYPE_UNK_8:
- words = gSaveBlock1Ptr->tvShows[gSpecialVar_0x8005].unkShow04.words;
+ case EASY_CHAT_TYPE_DUMMY_SHOW:
+ words = gSaveBlock1Ptr->tvShows[gSpecialVar_0x8005].dummy.words;
displayedPersonType = EASY_CHAT_PERSON_REPORTER_MALE;
break;
case EASY_CHAT_TYPE_TRENDY_PHRASE:
diff --git a/src/egg_hatch.c b/src/egg_hatch.c
index 042173a4e..576e5c0d9 100644
--- a/src/egg_hatch.c
+++ b/src/egg_hatch.c
@@ -584,6 +584,9 @@ static void Task_EggHatchPlayBGM(u8 taskID)
PlayBGM(MUS_EVOLUTION);
DestroyTask(taskID);
// UB: task is destroyed, yet the value is incremented
+ #ifdef UBFIX
+ return;
+ #endif
}
gTasks[taskID].data[0]++;
}
@@ -811,7 +814,7 @@ static void SpriteCB_Egg_5(struct Sprite* sprite)
if (sprite->data[0] == 0)
{
gSprites[sEggHatchData->pokeSpriteID].invisible = FALSE;
- StartSpriteAffineAnim(&gSprites[sEggHatchData->pokeSpriteID], 1);
+ StartSpriteAffineAnim(&gSprites[sEggHatchData->pokeSpriteID], BATTLER_AFFINE_EMERGE);
}
if (sprite->data[0] == 8)
BeginNormalPaletteFade(PALETTES_ALL, -1, 0x10, 0, RGB_WHITEALPHA);
diff --git a/src/ereader_helpers.c b/src/ereader_helpers.c
index 5edfc120c..eef2a15d8 100755
--- a/src/ereader_helpers.c
+++ b/src/ereader_helpers.c
@@ -14,34 +14,64 @@
#include "constants/trainers.h"
#include "constants/moves.h"
#include "constants/items.h"
+#include "constants/trainer_hill.h"
+
+enum {
+ EREADER_XFR_STATE_INIT = 0,
+ EREADER_XFR_STATE_HANDSHAKE,
+ EREADER_XFR_STATE_START,
+ EREADER_XFR_STATE_TRANSFER,
+ EREADER_XFR_STATE_TRANSFER_DONE,
+ EREADER_XFR_STATE_CHECKSUM,
+ EREADER_XFR_STATE_DONE
+};
+
+#define EREADER_XFER_EXE 1
+#define EREADER_XFER_CHK 2
+#define EREADER_XFER_SHIFT 0
+#define EREADER_XFER_MASK 3
+
+#define EREADER_CANCEL_TIMEOUT 1
+#define EREADER_CANCEL_KEY 2
+#define EREADER_CANCEL_MASK 0xC
+#define EREADER_CANCEL_SHIFT 2
-struct Unknown030012C8
+#define EREADER_CHECKSUM_OK 1
+#define EREADER_CHECKSUM_ERR 2
+#define EREADER_CHECKSUM_MASK 0x30
+#define EREADER_CHECKSUM_SHIFT 4
+
+struct SendRecvMgr
{
- u8 unk0[8];
- u32 *unk8;
- int unkC;
- int unk10;
- int unk14;
+ bool8 isParent;
+ u8 state; // EREADER_XFR_STATE_*
+ u8 xferState; // EREADER_XFER_*
+ u8 checksumResult; // EREADER_CHECKSUM_*
+ u8 cancellationReason; // EREADER_CANCEL_*
+ u32 *data; // Payload source or destination
+ int cursor; // Index of the next word
+ int size; // Last word index
+ int checksum;
};
-static void sub_81D4170(void);
-static u16 sub_81D3EE8(u8);
-static void sub_81D413C(void);
-static void sub_81D414C(void);
-static void sub_81D3F1C(u32, u32*, u32*);
-static void sub_81D3F68(void);
-
-static struct Unknown030012C8 gUnknown_030012C8;
-static u16 gUnknown_030012E0;
-static u16 gUnknown_030012E2;
-static u16 gUnknown_030012E4;
-static u16 gUnknown_030012E6;
-static u32 gUnknown_030012E8;
-static u16 gUnknown_030012EC;
-static u16 gUnknown_030012EE;
-static u16 gUnknown_030012F0;
-static u16 gUnknown_030012F2;
-static u16 gUnknown_030012F4;
+static void GetKeyInput(void);
+static u16 DetermineSendRecvState(u8);
+static void EnableSio(void);
+static void DisableTm3(void);
+static void SetUpTransferManager(size_t, const void *, void *);
+static void StartTm3(void);
+
+static struct SendRecvMgr sSendRecvMgr;
+static u16 sJoyNewOrRepeated;
+static u16 sJoyNew;
+static u16 sSendRecvStatus;
+static u16 sCounter1;
+static u32 sCounter2;
+static u16 sSavedIme;
+static u16 sSavedIe;
+static u16 sSavedTm3Cnt;
+static u16 sSavedSioCnt;
+static u16 sSavedRCnt;
static const struct TrainerHillTrainer sTrainerHillTrainerTemplates_JP[] = {
[0] = {
@@ -390,217 +420,217 @@ static const struct TrainerHillTrainer sTrainerHillTrainerTemplates_JP[] = {
},
};
-static u8 sub_81D38D4(void)
+static u8 GetTrainerHillUnkVal(void)
{
return (gSaveBlock1Ptr->trainerHill.unused + 1) % 256;
}
-static bool32 Struct_EReaderTrainerHillTrainer_ValidateChecksum(struct EReaderTrainerHillTrainer *arg0)
+static bool32 ValidateTrainerChecksum(struct EReaderTrainerHillTrainer * hillTrainer)
{
- int checksum = CalcByteArraySum((u8 *)arg0, 0x270);
- if (checksum != arg0->checksum)
+ int checksum = CalcByteArraySum((u8 *)hillTrainer, offsetof(typeof(*hillTrainer), checksum));
+ if (checksum != hillTrainer->checksum)
return FALSE;
return TRUE;
}
-bool8 EReader_IsReceivedDataValid(struct EReaderTrainerHillSet *buffer)
+bool8 ValidateTrainerHillData(struct EReaderTrainerHillSet * hillSet)
{
u32 i;
u32 checksum;
- int var0 = buffer->count;
- if (var0 < 1 || var0 > 8)
+ int numTrainers = hillSet->numTrainers;
+
+ // Validate number of trainers
+ if (numTrainers < 1 || numTrainers > NUM_TRAINER_HILL_TRAINERS)
return FALSE;
- for (i = 0; i < var0; i++)
+ // Validate trainers
+ for (i = 0; i < numTrainers; i++)
{
- if (!Struct_EReaderTrainerHillTrainer_ValidateChecksum(&buffer->unk_8[i]))
+ if (!ValidateTrainerChecksum(&hillSet->trainers[i]))
return FALSE;
}
- checksum = CalcByteArraySum((u8 *)buffer->unk_8, var0 * sizeof(struct EReaderTrainerHillTrainer));
- if (checksum != buffer->checksum)
+ // Validate checksum
+ checksum = CalcByteArraySum((u8 *)hillSet->trainers, numTrainers * sizeof(struct EReaderTrainerHillTrainer));
+ if (checksum != hillSet->checksum)
return FALSE;
return TRUE;
}
-static bool32 TrainerHill_VerifyChecksum(struct EReaderTrainerHillSet *buffer)
+static bool32 ValidateTrainerHillChecksum(struct EReaderTrainerHillSet *hillSet)
{
u32 checksum;
- int var0 = buffer->count;
- if (var0 < 1 || var0 > 8)
+ int numTrainers = hillSet->numTrainers;
+ if (numTrainers < 1 || numTrainers > NUM_TRAINER_HILL_TRAINERS)
return FALSE;
- checksum = CalcByteArraySum((u8 *)buffer->unk_8, sizeof(struct EReaderTrainerHillSet) - offsetof(struct EReaderTrainerHillSet, unk_8));
- if (checksum != buffer->checksum)
+ checksum = CalcByteArraySum((u8 *)hillSet->trainers, sizeof(struct EReaderTrainerHillSet) - offsetof(struct EReaderTrainerHillSet, trainers));
+ if (checksum != hillSet->checksum)
return FALSE;
return TRUE;
}
-static bool32 TryWriteTrainerHill_r(struct EReaderTrainerHillSet *ttdata, struct TrHillTag *buffer2)
+static bool32 TryWriteTrainerHill_Internal(struct EReaderTrainerHillSet * hillSet, struct TrHillTag * hillTag)
{
int i;
- AGB_ASSERT_EX(ttdata->dummy == 0, "cereader_tool.c", 450);
- AGB_ASSERT_EX(ttdata->id == 0, "cereader_tool.c", 452);
+ AGB_ASSERT_EX(hillSet->dummy == 0, "cereader_tool.c", 450);
+ AGB_ASSERT_EX(hillSet->id == 0, "cereader_tool.c", 452);
- memset(buffer2, 0, 0x1000);
- buffer2->numTrainers = ttdata->count;
- buffer2->unused1 = sub_81D38D4();
- buffer2->numFloors = (ttdata->count + 1) / 2;
+ memset(hillTag, 0, SECTOR_SIZE);
+ hillTag->numTrainers = hillSet->numTrainers;
+ hillTag->unused1 = GetTrainerHillUnkVal();
+ hillTag->numFloors = (hillSet->numTrainers + 1) / TRAINER_HILL_TRAINERS_PER_FLOOR;
- for (i = 0; i < ttdata->count; i++)
+ for (i = 0; i < hillSet->numTrainers; i++)
{
if (!(i & 1))
{
- buffer2->floors[i / 2].trainerNum1 = ttdata->unk_8[i].unk0;
- buffer2->floors[i / 2].display = ttdata->unk_8[i].unk14C;
- buffer2->floors[i / 2].trainers[0] = ttdata->unk_8[i].unk4;
+ hillTag->floors[i / TRAINER_HILL_TRAINERS_PER_FLOOR].trainerNum1 = hillSet->trainers[i].trainerNum;
+ hillTag->floors[i / TRAINER_HILL_TRAINERS_PER_FLOOR].display = hillSet->trainers[i].display;
+ hillTag->floors[i / TRAINER_HILL_TRAINERS_PER_FLOOR].trainers[0] = hillSet->trainers[i].trainer;
}
else
{
- buffer2->floors[i / 2].trainerNum2 = ttdata->unk_8[i].unk0;
- buffer2->floors[i / 2].trainers[1] = ttdata->unk_8[i].unk4;
+ hillTag->floors[i / TRAINER_HILL_TRAINERS_PER_FLOOR].trainerNum2 = hillSet->trainers[i].trainerNum;
+ hillTag->floors[i / TRAINER_HILL_TRAINERS_PER_FLOOR].trainers[1] = hillSet->trainers[i].trainer;
}
}
if (i & 1)
{
- buffer2->floors[i / 2].trainers[1] = sTrainerHillTrainerTemplates_JP[i / 2];
+ hillTag->floors[i / TRAINER_HILL_TRAINERS_PER_FLOOR].trainers[1] = sTrainerHillTrainerTemplates_JP[i / TRAINER_HILL_TRAINERS_PER_FLOOR];
}
- buffer2->checksum = CalcByteArraySum((u8 *)buffer2->floors, 4 * sizeof(struct TrHillFloor));
- if (TryWriteSpecialSaveSection(SECTOR_ID_TRAINER_HILL, (u8 *)buffer2) != SAVE_STATUS_OK)
+ hillTag->checksum = CalcByteArraySum((u8 *)hillTag->floors, NUM_TRAINER_HILL_FLOORS * sizeof(struct TrHillFloor));
+ if (TryWriteSpecialSaveSection(SECTOR_ID_TRAINER_HILL, (u8 *)hillTag) != SAVE_STATUS_OK)
return FALSE;
return TRUE;
}
-bool32 TryWriteTrainerHill(struct EReaderTrainerHillSet *arg0)
+bool32 TryWriteTrainerHill(struct EReaderTrainerHillSet * hillSet)
{
- void *var0 = AllocZeroed(0x1000);
- bool32 result = TryWriteTrainerHill_r(arg0, var0);
- Free(var0);
+ void *buffer = AllocZeroed(SECTOR_SIZE);
+ bool32 result = TryWriteTrainerHill_Internal(hillSet, buffer);
+ Free(buffer);
return result;
}
-static bool32 TryReadTrainerHill_r(struct EReaderTrainerHillSet *dst, u8 *buffer)
+static bool32 TryReadTrainerHill_Internal(struct EReaderTrainerHillSet * dest, u8 * buffer)
{
if (TryReadSpecialSaveSection(SECTOR_ID_TRAINER_HILL, buffer) != SAVE_STATUS_OK)
return FALSE;
- memcpy(dst, buffer, sizeof(struct EReaderTrainerHillSet));
- if (!TrainerHill_VerifyChecksum(dst))
+ memcpy(dest, buffer, sizeof(struct EReaderTrainerHillSet));
+ if (!ValidateTrainerHillChecksum(dest))
return FALSE;
return TRUE;
}
-static bool32 TryReadTrainerHill(struct EReaderTrainerHillSet *arg0)
+static bool32 TryReadTrainerHill(struct EReaderTrainerHillSet * hillSet)
{
- u8 *var0 = AllocZeroed(0x1000);
- bool32 result = TryReadTrainerHill_r(arg0, var0);
- Free(var0);
+ u8 *buffer = AllocZeroed(SECTOR_SIZE);
+ bool32 result = TryReadTrainerHill_Internal(hillSet, buffer);
+ Free(buffer);
return result;
}
bool32 ReadTrainerHillAndValidate(void)
{
- struct EReaderTrainerHillSet *var0 = AllocZeroed(0x1000);
- bool32 result = TryReadTrainerHill(var0);
- Free(var0);
+ struct EReaderTrainerHillSet *hillSet = AllocZeroed(SECTOR_SIZE);
+ bool32 result = TryReadTrainerHill(hillSet);
+ Free(hillSet);
return result;
}
-int EReader_Send(int arg0, u32 *arg1)
+int EReader_Send(int size, const void * src)
{
int result;
- u16 var0;
- int var1;
+ int sendStatus;
EReaderHelper_SaveRegsState();
while (1)
{
- sub_81D4170();
- if (gUnknown_030012E2 & 2)
+ GetKeyInput();
+ if (sJoyNew & B_BUTTON)
gShouldAdvanceLinkState = 2;
- var1 = EReaderHandleTransfer(1, arg0, arg1, NULL);
- gUnknown_030012E4 = var1;
- if ((gUnknown_030012E4 & 0x13) == 0x10)
+ sendStatus = EReaderHandleTransfer(1, size, src, NULL);
+ sSendRecvStatus = sendStatus;
+ if ((sSendRecvStatus & 0x13) == 0x10)
{
result = 0;
break;
}
-
- if (gUnknown_030012E4 & 0x8)
+ else if (sSendRecvStatus & 0x8)
{
result = 1;
break;
}
-
- var0 = gUnknown_030012E4 & 0x4;
- if (var0)
+ else if (sSendRecvStatus & 0x4)
{
result = 2;
break;
}
-
- gShouldAdvanceLinkState = var0;
- VBlankIntrWait();
+ else
+ {
+ gShouldAdvanceLinkState = 0;
+ VBlankIntrWait();
+ }
}
- CpuFill32(0, &gUnknown_030012C8, sizeof(struct Unknown030012C8));
+ CpuFill32(0, &sSendRecvMgr, sizeof(sSendRecvMgr));
EReaderHelper_RestoreRegsState();
return result;
}
-int EReader_Recv(u32 *arg0)
+int EReader_Recv(void * dest)
{
int result;
- u16 var0;
- int var1;
+ int recvStatus;
EReaderHelper_SaveRegsState();
while (1)
{
- sub_81D4170();
- if (gUnknown_030012E2 & 2)
+ GetKeyInput();
+ if (sJoyNew & B_BUTTON)
gShouldAdvanceLinkState = 2;
- var1 = EReaderHandleTransfer(0, 0, NULL, arg0);
- gUnknown_030012E4 = var1;
- if ((gUnknown_030012E4 & 0x13) == 0x10)
+ recvStatus = EReaderHandleTransfer(0, 0, NULL, dest);
+ sSendRecvStatus = recvStatus;
+ if ((sSendRecvStatus & 0x13) == 0x10)
{
result = 0;
break;
}
-
- if (gUnknown_030012E4 & 0x8)
+ else if (sSendRecvStatus & 0x8)
{
result = 1;
break;
}
-
- var0 = gUnknown_030012E4 & 0x4;
- if (var0)
+ else if (sSendRecvStatus & 0x4)
{
result = 2;
break;
}
-
- gShouldAdvanceLinkState = var0;
- VBlankIntrWait();
+ else
+ {
+ gShouldAdvanceLinkState = 0;
+ VBlankIntrWait();
+ }
}
- CpuFill32(0, &gUnknown_030012C8, sizeof(struct Unknown030012C8));
+ CpuFill32(0, &sSendRecvMgr, sizeof(sSendRecvMgr));
EReaderHelper_RestoreRegsState();
return result;
}
-static void sub_81D3C7C(void)
+static void CloseSerial(void)
{
REG_IME = 0;
REG_IE &= ~(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL);
@@ -610,7 +640,7 @@ static void sub_81D3C7C(void)
REG_IF = INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL;
}
-static void sub_81D3CBC(void)
+static void OpenSerialMulti(void)
{
REG_IME = 0;
REG_IE &= ~(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL);
@@ -622,273 +652,271 @@ static void sub_81D3CBC(void)
REG_IE |= INTR_FLAG_SERIAL;
REG_IME = 1;
- if (!gUnknown_030012C8.unk0[1])
- CpuFill32(0, &gUnknown_030012C8, sizeof(struct Unknown030012C8));
+ if (sSendRecvMgr.state == 0)
+ CpuFill32(0, &sSendRecvMgr, sizeof(sSendRecvMgr));
}
-static void sub_81D3D34(void)
+static void OpenSerial32(void)
{
REG_RCNT = 0;
REG_SIOCNT = SIO_32BIT_MODE | SIO_INTR_ENABLE;
REG_SIOCNT |= SIO_MULTI_SD;
gShouldAdvanceLinkState = 0;
- gUnknown_030012E6 = 0;
- gUnknown_030012E8 = 0;
+ sCounter1 = 0;
+ sCounter2 = 0;
}
-int EReaderHandleTransfer(u8 arg0, u32 arg1, u32 *arg2, u32 *arg3)
+int EReaderHandleTransfer(u8 mode, size_t size, const void * data, void * recvBuffer)
{
- switch (gUnknown_030012C8.unk0[1])
+ switch (sSendRecvMgr.state)
{
- case 0:
- sub_81D3CBC();
- gUnknown_030012C8.unk0[2] = 1;
- gUnknown_030012C8.unk0[1] = 1;
+ case EREADER_XFR_STATE_INIT:
+ OpenSerialMulti();
+ sSendRecvMgr.xferState = EREADER_XFER_EXE;
+ sSendRecvMgr.state = EREADER_XFR_STATE_HANDSHAKE;
break;
- case 1:
- if (sub_81D3EE8(arg0))
- sub_81D413C();
+ case EREADER_XFR_STATE_HANDSHAKE:
+ if (DetermineSendRecvState(mode))
+ EnableSio();
if (gShouldAdvanceLinkState == 2)
{
- gUnknown_030012C8.unk0[4] = 2;
- gUnknown_030012C8.unk0[1] = 6;
+ sSendRecvMgr.cancellationReason = EREADER_CANCEL_KEY;
+ sSendRecvMgr.state = EREADER_XFR_STATE_DONE;
}
break;
- case 2:
- sub_81D3D34();
- sub_81D3F1C(arg1, arg2, arg3);
- gUnknown_030012C8.unk0[1] = 3;
+ case EREADER_XFR_STATE_START:
+ OpenSerial32();
+ SetUpTransferManager(size, data, recvBuffer);
+ sSendRecvMgr.state = EREADER_XFR_STATE_TRANSFER;
// fall through
- case 3:
+ case EREADER_XFR_STATE_TRANSFER:
if (gShouldAdvanceLinkState == 2)
{
- gUnknown_030012C8.unk0[4] = 2;
- gUnknown_030012C8.unk0[1] = 6;
+ sSendRecvMgr.cancellationReason = EREADER_CANCEL_KEY;
+ sSendRecvMgr.state = EREADER_XFR_STATE_DONE;
}
else
{
- gUnknown_030012E6++;
- gUnknown_030012E8++;
- if (!gUnknown_030012C8.unk0[0] && gUnknown_030012E8 > 60)
+ sCounter1++;
+ sCounter2++;
+ if (!sSendRecvMgr.isParent && sCounter2 > 60)
{
- gUnknown_030012C8.unk0[4] = 1;
- gUnknown_030012C8.unk0[1] = 6;
+ sSendRecvMgr.cancellationReason = EREADER_CANCEL_TIMEOUT;
+ sSendRecvMgr.state = EREADER_XFR_STATE_DONE;
}
- if (gUnknown_030012C8.unk0[2] != 2)
+ if (sSendRecvMgr.xferState != EREADER_XFER_CHK)
{
- if (gUnknown_030012C8.unk0[0] && gUnknown_030012E6 > 2)
+ if (sSendRecvMgr.isParent && sCounter1 > 2)
{
- sub_81D413C();
- gUnknown_030012C8.unk0[2] = 2;
+ EnableSio();
+ sSendRecvMgr.xferState = EREADER_XFER_CHK;
}
else
{
- sub_81D413C();
- gUnknown_030012C8.unk0[2] = 2;
+ EnableSio();
+ sSendRecvMgr.xferState = EREADER_XFER_CHK;
}
}
}
break;
- case 4:
- sub_81D3CBC();
- gUnknown_030012C8.unk0[1] = 5;
+ case EREADER_XFR_STATE_TRANSFER_DONE:
+ OpenSerialMulti();
+ sSendRecvMgr.state = EREADER_XFR_STATE_CHECKSUM;
break;
- case 5:
- if (gUnknown_030012C8.unk0[0] == 1 && gUnknown_030012E6 > 2)
- sub_81D413C();
+ case EREADER_XFR_STATE_CHECKSUM:
+ if (sSendRecvMgr.isParent == TRUE && sCounter1 > 2)
+ EnableSio();
- if (++gUnknown_030012E6 > 60)
+ if (++sCounter1 > 60)
{
- gUnknown_030012C8.unk0[4] = 1;
- gUnknown_030012C8.unk0[1] = 6;
+ sSendRecvMgr.cancellationReason = EREADER_CANCEL_TIMEOUT;
+ sSendRecvMgr.state = EREADER_XFR_STATE_DONE;
}
break;
- case 6:
- if (gUnknown_030012C8.unk0[2])
+ case EREADER_XFR_STATE_DONE:
+ if (sSendRecvMgr.xferState)
{
- sub_81D3C7C();
- gUnknown_030012C8.unk0[2] = 0;
+ CloseSerial();
+ sSendRecvMgr.xferState = 0;
}
break;
}
- return gUnknown_030012C8.unk0[2] | (gUnknown_030012C8.unk0[4] << 2) | (gUnknown_030012C8.unk0[3] << 4);
+ return (sSendRecvMgr.xferState << EREADER_XFER_SHIFT)
+ | (sSendRecvMgr.cancellationReason << EREADER_CANCEL_SHIFT)
+ | (sSendRecvMgr.checksumResult << EREADER_CHECKSUM_SHIFT);
}
-static u16 sub_81D3EE8(u8 arg0)
+static u16 DetermineSendRecvState(u8 mode)
{
- u16 terminal = (*(vu32 *)REG_ADDR_SIOCNT) & (SIO_MULTI_SI | SIO_MULTI_SD);
- if (terminal == SIO_MULTI_SD && arg0)
- {
- gUnknown_030012C8.unk0[0] = 1;
- return 1;
- }
+ bool16 resp;
+ if ((*(vu32 *)REG_ADDR_SIOCNT & (SIO_MULTI_SI | SIO_MULTI_SD)) == SIO_MULTI_SD && mode)
+ resp = sSendRecvMgr.isParent = TRUE;
else
- {
- gUnknown_030012C8.unk0[0] = 0;
- return 0;
- }
+ resp = sSendRecvMgr.isParent = FALSE;
+ return resp;
}
-static void sub_81D3F1C(u32 arg0, u32 *arg1, u32 *arg2)
+static void SetUpTransferManager(size_t size, const void * data, void * recvBuffer)
{
- if (gUnknown_030012C8.unk0[0])
+ if (sSendRecvMgr.isParent)
{
REG_SIOCNT |= SIO_38400_BPS;
- gUnknown_030012C8.unk8 = arg1;
- REG_SIODATA32 = arg0;
- gUnknown_030012C8.unk10 = arg0 / 4 + 1;
- sub_81D3F68();
+ sSendRecvMgr.data = (void *)data;
+ REG_SIODATA32 = size;
+ sSendRecvMgr.size = size / 4 + 1;
+ StartTm3();
}
else
{
REG_SIOCNT = REG_SIOCNT;
- gUnknown_030012C8.unk8 = arg2;
+ sSendRecvMgr.data = recvBuffer;
}
}
-static void sub_81D3F68(void)
+static void StartTm3(void)
{
- REG_TM3CNT_L = 0xFDA7;
+ REG_TM3CNT_L = -601;
REG_TM3CNT_H = TIMER_INTR_ENABLE;
REG_IME = 0;
REG_IE |= INTR_FLAG_TIMER3;
REG_IME = 1;
}
-void sub_81D3F9C(void)
+void EReaderHelper_Timer3Callback(void)
{
- sub_81D414C();
- sub_81D413C();
+ DisableTm3();
+ EnableSio();
}
-void sub_81D3FAC(void)
+void EReaderHelper_SerialCallback(void)
{
- u16 i, playerCount, k;
- u32 value;
- u16 var0;
- u16 recvBuffer[4];
+ u16 i, cnt1, cnt2;
+ u32 recv32;
+ u16 recv[4];
- switch (gUnknown_030012C8.unk0[1])
+ switch (sSendRecvMgr.state)
{
- case 1:
+ case EREADER_XFR_STATE_HANDSHAKE:
REG_SIOMLT_SEND = 0xCCD0; // Handshake id
- *(u64 *)recvBuffer = REG_SIOMLT_RECV;
- for (i = 0, playerCount = 0, k = 0; i < 4; i++)
+ *(u64 *)recv = REG_SIOMLT_RECV;
+ for (i = 0, cnt1 = 0, cnt2 = 0; i < 4; i++)
{
- if (recvBuffer[i] == 0xCCD0)
- playerCount++;
- else if (recvBuffer[i] != 0xFFFF)
- k++;
+ if (recv[i] == 0xCCD0)
+ cnt1++;
+ else if (recv[i] != 0xFFFF)
+ cnt2++;
}
- if (playerCount == 2 && k == 0)
- gUnknown_030012C8.unk0[1] = 2;
+ if (cnt1 == 2 && cnt2 == 0)
+ sSendRecvMgr.state = 2;
break;
- case 3:
- value = REG_SIODATA32;
- if (!gUnknown_030012C8.unkC && !gUnknown_030012C8.unk0[0])
- gUnknown_030012C8.unk10 = value / 4 + 1;
+ case EREADER_XFR_STATE_TRANSFER:
+ recv32 = REG_SIODATA32;
+ // The first value sent by the EReader is the payload size
+ if (!sSendRecvMgr.cursor && !sSendRecvMgr.isParent)
+ sSendRecvMgr.size = recv32 / 4 + 1;
- if (gUnknown_030012C8.unk0[0] == 1)
+ if (sSendRecvMgr.isParent == TRUE)
{
- if (gUnknown_030012C8.unkC < gUnknown_030012C8.unk10)
+ // Send mode
+ if (sSendRecvMgr.cursor < sSendRecvMgr.size)
{
- REG_SIODATA32 = gUnknown_030012C8.unk8[gUnknown_030012C8.unkC];
- gUnknown_030012C8.unk14 += gUnknown_030012C8.unk8[gUnknown_030012C8.unkC];
+ REG_SIODATA32 = sSendRecvMgr.data[sSendRecvMgr.cursor];
+ sSendRecvMgr.checksum += sSendRecvMgr.data[sSendRecvMgr.cursor];
}
else
{
- REG_SIODATA32 = gUnknown_030012C8.unk14;
+ REG_SIODATA32 = sSendRecvMgr.checksum;
}
}
else
{
- if (gUnknown_030012C8.unkC > 0 && gUnknown_030012C8.unkC < gUnknown_030012C8.unk10 + 1)
+ // Receive mode
+ if (sSendRecvMgr.cursor > 0 && sSendRecvMgr.cursor < sSendRecvMgr.size + 1)
{
- gUnknown_030012C8.unk8[gUnknown_030012C8.unkC - 1] = value;
- gUnknown_030012C8.unk14 += value;
+ sSendRecvMgr.data[sSendRecvMgr.cursor - 1] = recv32;
+ sSendRecvMgr.checksum += recv32;
}
- else if (gUnknown_030012C8.unkC)
+ else if (sSendRecvMgr.cursor)
{
- if (gUnknown_030012C8.unk14 == value)
- gUnknown_030012C8.unk0[3] = 1;
+ if (sSendRecvMgr.checksum == recv32)
+ sSendRecvMgr.checksumResult = EREADER_CHECKSUM_OK;
else
- gUnknown_030012C8.unk0[3] = 2;
+ sSendRecvMgr.checksumResult = EREADER_CHECKSUM_ERR;
}
- gUnknown_030012E8 = 0;
+ sCounter2 = 0;
}
- if (++gUnknown_030012C8.unkC < gUnknown_030012C8.unk10 + 2)
+ if (++sSendRecvMgr.cursor < sSendRecvMgr.size + 2)
{
- if (gUnknown_030012C8.unk0[0])
+ if (sSendRecvMgr.isParent)
REG_TM3CNT_H |= TIMER_ENABLE;
else
- sub_81D413C();
+ EnableSio();
}
else
{
- gUnknown_030012C8.unk0[1] = 4;
- gUnknown_030012E6 = 0;
+ sSendRecvMgr.state = EREADER_XFR_STATE_TRANSFER_DONE;
+ sCounter1 = 0;
}
break;
- case 5:
- if (!gUnknown_030012C8.unk0[0])
- REG_SIOMLT_SEND = gUnknown_030012C8.unk0[3];
+ case EREADER_XFR_STATE_CHECKSUM:
+ if (!sSendRecvMgr.isParent)
+ REG_SIOMLT_SEND = sSendRecvMgr.checksumResult;
- *(u64 *)recvBuffer = REG_SIOMLT_RECV;
- var0 = recvBuffer[1] - 1;
- if (var0 < 2)
+ *(vu64 *)recv = REG_SIOMLT_RECV;
+ if (recv[1] == EREADER_CHECKSUM_OK || recv[1] == EREADER_CHECKSUM_ERR)
{
- if (gUnknown_030012C8.unk0[0] == 1)
- gUnknown_030012C8.unk0[3] = recvBuffer[1];
+ if (sSendRecvMgr.isParent == TRUE)
+ sSendRecvMgr.checksumResult = recv[1]; // EReader has (in)validated the payload
- gUnknown_030012C8.unk0[1] = 6;
+ sSendRecvMgr.state = EREADER_XFR_STATE_DONE;
}
break;
}
}
-static void sub_81D413C(void)
+static void EnableSio(void)
{
REG_SIOCNT |= SIO_ENABLE;
}
-static void sub_81D414C(void)
+static void DisableTm3(void)
{
REG_TM3CNT_H &= ~TIMER_ENABLE;
REG_TM3CNT_L = 0xFDA7;
}
-static void sub_81D4170(void)
+static void GetKeyInput(void)
{
- int keysMask = REG_KEYINPUT ^ KEYS_MASK;
- gUnknown_030012E2 = keysMask & ~gUnknown_030012E0;
- gUnknown_030012E0 = keysMask;
+ int rawKeys = REG_KEYINPUT ^ KEYS_MASK;
+ sJoyNew = rawKeys & ~sJoyNewOrRepeated;
+ sJoyNewOrRepeated = rawKeys;
}
void EReaderHelper_SaveRegsState(void)
{
- gUnknown_030012EC = REG_IME;
- gUnknown_030012EE = REG_IE;
- gUnknown_030012F0 = REG_TM3CNT_H;
- gUnknown_030012F2 = REG_SIOCNT;
- gUnknown_030012F4 = REG_RCNT;
+ sSavedIme = REG_IME;
+ sSavedIe = REG_IE;
+ sSavedTm3Cnt = REG_TM3CNT_H;
+ sSavedSioCnt = REG_SIOCNT;
+ sSavedRCnt = REG_RCNT;
}
void EReaderHelper_RestoreRegsState(void)
{
- REG_IME = gUnknown_030012EC;
- REG_IE = gUnknown_030012EE;
- REG_TM3CNT_H = gUnknown_030012F0;
- REG_SIOCNT = gUnknown_030012F2;
- REG_RCNT = gUnknown_030012F4;
+ REG_IME = sSavedIme;
+ REG_IE = sSavedIe;
+ REG_TM3CNT_H = sSavedTm3Cnt;
+ REG_SIOCNT = sSavedSioCnt;
+ REG_RCNT = sSavedRCnt;
}
-void sub_81D4238(void)
+void EReaderHelper_ClearSendRecvMgr(void)
{
- CpuFill32(0, &gUnknown_030012C8, sizeof(struct Unknown030012C8));
+ CpuFill32(0, &sSendRecvMgr, sizeof(sSendRecvMgr));
}
diff --git a/src/ereader_screen.c b/src/ereader_screen.c
index d27605c1d..438c4bec9 100755
--- a/src/ereader_screen.c
+++ b/src/ereader_screen.c
@@ -47,10 +47,10 @@ static void sub_81D4D50(struct Unk03006370 *arg0, int arg1, u32 *arg2)
{
volatile u16 backupIME = REG_IME;
REG_IME = 0;
- gIntrTable[1] = sub_81D3FAC;
- gIntrTable[2] = sub_81D3F9C;
+ gIntrTable[1] = EReaderHelper_SerialCallback;
+ gIntrTable[2] = EReaderHelper_Timer3Callback;
EReaderHelper_SaveRegsState();
- sub_81D4238();
+ EReaderHelper_ClearSendRecvMgr();
REG_IE |= INTR_FLAG_VCOUNT;
REG_IME = backupIME;
arg0->unk0 = 0;
@@ -62,7 +62,7 @@ static void sub_81D4DB8(struct Unk03006370 *arg0)
{
volatile u16 backupIME = REG_IME;
REG_IME = 0;
- sub_81D4238();
+ EReaderHelper_ClearSendRecvMgr();
EReaderHelper_RestoreRegsState();
RestoreSerialTimer3IntrHandlers();
REG_IME = backupIME;
@@ -401,7 +401,7 @@ static void sub_81D5084(u8 taskId)
}
break;
case 15:
- data->unkE = EReader_IsReceivedDataValid((struct EReaderTrainerHillSet *)gDecompressionBuffer);
+ data->unkE = ValidateTrainerHillData((struct EReaderTrainerHillSet *)gDecompressionBuffer);
SetCloseLinkCallbackAndType(data->unkE);
data->unk8 = 16;
break;
diff --git a/src/event_object_lock.c b/src/event_object_lock.c
index dec2d7906..179c72813 100644
--- a/src/event_object_lock.c
+++ b/src/event_object_lock.c
@@ -40,7 +40,7 @@ bool8 IsFreezePlayerFinished(void)
}
-void ScriptFreezeObjectEvents(void)
+void FreezeObjects_WaitForPlayer(void)
{
FreezeObjectEvents();
CreateTask(Task_FreezePlayer, 80);
@@ -82,7 +82,9 @@ bool8 IsFreezeSelectedObjectAndPlayerFinished(void)
}
}
-void LockSelectedObjectEvent(void)
+// Freeze all objects immediately except the selected object and the player.
+// The selected object and player are frozen once their movement is finished.
+void FreezeObjects_WaitForPlayerAndSelected(void)
{
u8 taskId;
FreezeObjectEventsExceptOne(gSelectedObjectEvent);
@@ -144,6 +146,8 @@ static void Task_FreezeObjectAndPlayer(u8 taskId)
DestroyTask(taskId);
}
+// Freeze all objects immediately except the player and the approaching trainers.
+// The approaching trainers and player are frozen once their movement is finished
void FreezeForApproachingTrainers(void)
{
u8 trainerObjectId1, trainerObjectId2, taskId;
diff --git a/src/evolution_scene.c b/src/evolution_scene.c
index 39e917161..08f816f4f 100644
--- a/src/evolution_scene.c
+++ b/src/evolution_scene.c
@@ -34,6 +34,8 @@
#include "constants/rgb.h"
#include "constants/items.h"
+extern struct Evolution gEvolutionTable[][EVOS_PER_MON];
+
struct EvoInfo
{
u8 preEvoSpriteId;
@@ -550,8 +552,6 @@ static void CreateShedinja(u16 preEvoSpecies, struct Pokemon* mon)
{
s32 i;
struct Pokemon* shedinja = &gPlayerParty[gPlayerPartyCount];
- const struct Evolution *evos;
- const struct Evolution *evos2;
CopyMon(&gPlayerParty[gPlayerPartyCount], mon, sizeof(struct Pokemon));
SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_SPECIES, &gEvolutionTable[preEvoSpecies][1].targetSpecies);
@@ -572,12 +572,8 @@ static void CreateShedinja(u16 preEvoSpecies, struct Pokemon* mon)
CalculateMonStats(&gPlayerParty[gPlayerPartyCount]);
CalculatePlayerPartyCount();
- // can't match it otherwise, ehh
- evos2 = gEvolutionTable[0];
- evos = evos2 + EVOS_PER_MON * preEvoSpecies;
-
- GetSetPokedexFlag(SpeciesToNationalPokedexNum(evos[1].targetSpecies), FLAG_SET_SEEN);
- GetSetPokedexFlag(SpeciesToNationalPokedexNum(evos[1].targetSpecies), FLAG_SET_CAUGHT);
+ GetSetPokedexFlag(SpeciesToNationalPokedexNum(gEvolutionTable[preEvoSpecies][1].targetSpecies), FLAG_SET_SEEN);
+ GetSetPokedexFlag(SpeciesToNationalPokedexNum(gEvolutionTable[preEvoSpecies][1].targetSpecies), FLAG_SET_CAUGHT);
if (GetMonData(shedinja, MON_DATA_SPECIES) == SPECIES_SHEDINJA
&& GetMonData(shedinja, MON_DATA_LANGUAGE) == LANGUAGE_JAPANESE
diff --git a/src/field_specials.c b/src/field_specials.c
index f85de29f5..83857e1ff 100644
--- a/src/field_specials.c
+++ b/src/field_specials.c
@@ -57,7 +57,6 @@
#include "constants/map_types.h"
#include "constants/maps.h"
#include "constants/mevent.h"
-#include "constants/tv.h"
#include "constants/script_menu.h"
#include "constants/slot_machine.h"
#include "constants/songs.h"
@@ -1622,7 +1621,7 @@ void BufferLottoTicketNumber(void)
{
if (gSpecialVar_Result >= 10000)
{
- TV_PrintIntToStringVar(0, gSpecialVar_Result);
+ ConvertIntToDecimalString(0, gSpecialVar_Result);
}
else if (gSpecialVar_Result >= 1000)
{
diff --git a/src/fldeff_misc.c b/src/fldeff_misc.c
index 914ba2880..3d3b83fef 100644
--- a/src/fldeff_misc.c
+++ b/src/fldeff_misc.c
@@ -22,7 +22,6 @@
#include "constants/metatile_behaviors.h"
#include "constants/metatile_labels.h"
#include "constants/songs.h"
-#include "constants/tv.h"
EWRAM_DATA struct MapPosition gPlayerFacingPosition = {0};
diff --git a/src/frontier_util.c b/src/frontier_util.c
index 491aef936..4aec27944 100644
--- a/src/frontier_util.c
+++ b/src/frontier_util.c
@@ -1552,16 +1552,16 @@ static void CheckPutFrontierTVShowOnAir(void)
switch (battleMode)
{
case FRONTIER_MODE_SINGLES:
- TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode], 1);
+ TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode], FRONTIER_SHOW_TOWER_SINGLES);
break;
case FRONTIER_MODE_DOUBLES:
- TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode], 2);
+ TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode], FRONTIER_SHOW_TOWER_DOUBLES);
break;
case FRONTIER_MODE_MULTIS:
- TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode], 3);
+ TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode], FRONTIER_SHOW_TOWER_MULTIS);
break;
case FRONTIER_MODE_LINK_MULTIS:
- TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode], 4);
+ TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode], FRONTIER_SHOW_TOWER_LINK_MULTIS);
break;
}
}
@@ -1575,9 +1575,9 @@ static void CheckPutFrontierTVShowOnAir(void)
&& ShouldAirFrontierTVShow())
{
if (battleMode == FRONTIER_MODE_SINGLES)
- TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.domeWinStreaks[battleMode][lvlMode], 5);
+ TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.domeWinStreaks[battleMode][lvlMode], FRONTIER_SHOW_DOME_SINGLES);
else
- TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.domeWinStreaks[battleMode][lvlMode], 6);
+ TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.domeWinStreaks[battleMode][lvlMode], FRONTIER_SHOW_DOME_DOUBLES);
}
}
break;
@@ -1589,9 +1589,9 @@ static void CheckPutFrontierTVShowOnAir(void)
&& ShouldAirFrontierTVShow())
{
if (battleMode == FRONTIER_MODE_SINGLES)
- TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode], 11);
+ TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode], FRONTIER_SHOW_PALACE_SINGLES);
else
- TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode], 12);
+ TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode], FRONTIER_SHOW_PALACE_DOUBLES);
}
}
break;
@@ -1602,7 +1602,7 @@ static void CheckPutFrontierTVShowOnAir(void)
if (gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode] > 1
&& ShouldAirFrontierTVShow())
{
- TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode], 10);
+ TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode], FRONTIER_SHOW_ARENA);
}
}
break;
@@ -1615,9 +1615,9 @@ static void CheckPutFrontierTVShowOnAir(void)
&& ShouldAirFrontierTVShow())
{
if (battleMode == FRONTIER_MODE_SINGLES)
- TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode], 7);
+ TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode], FRONTIER_SHOW_FACTORY_SINGLES);
else
- TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode], 8);
+ TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode], FRONTIER_SHOW_FACTORY_DOUBLES);
}
}
break;
@@ -1628,7 +1628,7 @@ static void CheckPutFrontierTVShowOnAir(void)
if (gSaveBlock2Ptr->frontier.pikeWinStreaks[lvlMode] > 1
&& ShouldAirFrontierTVShow())
{
- TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.pikeWinStreaks[lvlMode], 9);
+ TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.pikeWinStreaks[lvlMode], FRONTIER_SHOW_PIKE);
}
}
break;
@@ -1639,7 +1639,7 @@ static void CheckPutFrontierTVShowOnAir(void)
if (gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvlMode] > 1
&& ShouldAirFrontierTVShow())
{
- TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvlMode], 13);
+ TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvlMode], FRONTIER_SHOW_PYRAMID);
}
}
break;
diff --git a/src/graphics.c b/src/graphics.c
index 829849c8c..c3ac6c2df 100644
--- a/src/graphics.c
+++ b/src/graphics.c
@@ -471,11 +471,11 @@ const u8 gContestSliderHeart_Gfx[] = INCBIN_U8("graphics/contest/slider_heart.4b
const u32 gUnknownGfx_C19470[] = INCBIN_U32("graphics/unknown/unknown_C19470.4bpp.lz");
const u32 gUnknownPal_C19470[] = INCBIN_U32("graphics/unknown/unknown_C19470.gbapal.lz");
-const u32 gContestResults_Gfx[] = INCBIN_U32("graphics/contest/results_screen.4bpp.lz");
-const u32 gUnknown_08C19EEC[] = INCBIN_U32("graphics/contest/misc_2_tilemap_1.bin.lz");
-const u32 gUnknown_08C1A000[] = INCBIN_U32("graphics/contest/misc_2_tilemap_2.bin.lz");
-const u32 gUnknown_08C1A12C[] = INCBIN_U32("graphics/contest/misc_2_tilemap_3.bin.lz");
-const u32 gContestResults_Pal[] = INCBIN_U32("graphics/contest/results_screen.gbapal.lz");
+const u32 gContestResults_Gfx[] = INCBIN_U32("graphics/contest/results_screen/tiles.4bpp.lz");
+const u32 gContestResults_WinnerBanner_Tilemap[] = INCBIN_U32("graphics/contest/results_screen/winner_banner.bin.lz");
+const u32 gContestResults_Interface_Tilemap[] = INCBIN_U32("graphics/contest/results_screen/interface.bin.lz");
+const u32 gContestResults_Bg_Tilemap[] = INCBIN_U32("graphics/contest/results_screen/bg.bin.lz");
+const u32 gContestResults_Pal[] = INCBIN_U32("graphics/contest/results_screen/tiles.gbapal.lz");
const u32 gBattleAnimSpriteGfx_Impact[] = INCBIN_U32("graphics/battle_anims/sprites/impact.4bpp.lz");
const u32 gBattleAnimSpritePal_Impact[] = INCBIN_U32("graphics/battle_anims/sprites/impact.gbapal.lz");
@@ -1296,17 +1296,17 @@ const u8 gBagMenuHMIcon_Gfx[] = INCBIN_U8("graphics/interface/hm.4bpp");
// contest results screen
-const u16 gNormalContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_normal.bin");
-const u16 gSuperContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_super.bin");
-const u16 gHyperContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_hyper.bin");
-const u16 gMasterContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_master.bin");
-const u16 gLinkContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_link.bin");
-const u16 gCoolContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_cool.bin");
-const u16 gBeautyContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_beauty.bin");
-const u16 gCuteContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_cute.bin");
-const u16 gSmartContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_smart.bin");
-const u16 gToughContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_tough.bin");
-const u16 gContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen.bin");
+const u16 gContestResultsTitle_Normal_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title_normal.bin");
+const u16 gContestResultsTitle_Super_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title_super.bin");
+const u16 gContestResultsTitle_Hyper_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title_hyper.bin");
+const u16 gContestResultsTitle_Master_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title_master.bin");
+const u16 gContestResultsTitle_Link_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title_link.bin");
+const u16 gContestResultsTitle_Cool_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title_cool.bin");
+const u16 gContestResultsTitle_Beauty_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title_beauty.bin");
+const u16 gContestResultsTitle_Cute_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title_cute.bin");
+const u16 gContestResultsTitle_Smart_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title_smart.bin");
+const u16 gContestResultsTitle_Tough_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title_tough.bin");
+const u16 gContestResultsTitle_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title.bin");
// pokenav
diff --git a/src/hall_of_fame.c b/src/hall_of_fame.c
index 3eb8d3f0a..5746260f3 100644
--- a/src/hall_of_fame.c
+++ b/src/hall_of_fame.c
@@ -66,13 +66,12 @@ static EWRAM_DATA struct HofGfx *sHofGfxPtr = NULL;
extern struct MusicPlayerInfo gMPlayInfo_BGM;
-// this file's functions
static void ClearVramOamPltt_LoadHofPal(void);
static void LoadHofGfx(void);
static void InitHofBgs(void);
static bool8 CreateHofConfettiSprite(void);
static void StartCredits(void);
-static bool8 sub_8175024(void);
+static bool8 LoadHofBgs(void);
static void Task_Hof_InitMonData(u8 taskId);
static void Task_Hof_InitTeamSaveData(u8 taskId);
static void Task_Hof_SetMonDisplayTask(u8 taskId);
@@ -104,7 +103,6 @@ static void HallOfFame_PrintPlayerInfo(u8 unused1, u8 unused2);
static void Task_DoDomeConfetti(u8 taskId);
static void SpriteCB_HofConfetti(struct Sprite* sprite);
-// const rom data
static const struct BgTemplate sHof_BgTemplates[] =
{
{
@@ -136,12 +134,19 @@ static const struct BgTemplate sHof_BgTemplates[] =
},
};
-static const struct WindowTemplate sHof_WindowTemplate = {0, 2, 2, 0xE, 6, 0xE, 1};
+static const struct WindowTemplate sHof_WindowTemplate = {
+ .bg = 0,
+ .tilemapLeft = 2,
+ .tilemapTop = 2,
+ .width = 14,
+ .height = 6,
+ .paletteNum = 14,
+ .baseBlock = 1
+};
static const u8 sMonInfoTextColors[4] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY};
static const u8 sPlayerInfoTextColors[4] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY};
-
-static const u8 sUnused_085E538C[] = {4, 5, 0, 0};
+static const u8 sUnusedTextColors[4] = {TEXT_COLOR_RED, TEXT_COLOR_LIGHT_RED, TEXT_COLOR_TRANSPARENT};
static const struct CompressedSpriteSheet sSpriteSheet_Confetti[] =
{
@@ -383,7 +388,7 @@ static bool8 InitHallOfFameScreen(void)
gMain.state++;
break;
case 3:
- if (!sub_8175024())
+ if (!LoadHofBgs())
{
SetVBlankCallback(VBlankCB_HallOfFame);
BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK);
@@ -819,7 +824,7 @@ void CB2_DoHallOfFamePC(void)
gMain.state++;
break;
case 3:
- if (!sub_8175024())
+ if (!LoadHofBgs())
{
struct HallofFameTeam *fameTeam = (struct HallofFameTeam*)(gDecompressionBuffer);
fameTeam->mon[0] = sDummyFameMon;
@@ -1301,7 +1306,7 @@ static void InitHofBgs(void)
ChangeBgY(3, 0, 0);
}
-static bool8 sub_8175024(void)
+static bool8 LoadHofBgs(void)
{
switch (sHofGfxPtr->state)
{
diff --git a/src/international_string_util.c b/src/international_string_util.c
index ed1e17816..ab812de89 100644
--- a/src/international_string_util.c
+++ b/src/international_string_util.c
@@ -185,7 +185,7 @@ void ConvertInternationalPlayerNameStripChar(u8 *str, u8 removeChar)
}
}
-void sub_81DB5AC(u8 *str)
+void ConvertInternationalContestantName(u8 *str)
{
if (*str++ == EXT_CTRL_CODE_BEGIN && *str++ == EXT_CTRL_CODE_JPN)
{
diff --git a/src/item.c b/src/item.c
index 892092184..156034262 100644
--- a/src/item.c
+++ b/src/item.c
@@ -14,7 +14,6 @@
#include "battle_pyramid_bag.h"
#include "constants/items.h"
#include "constants/hold_effects.h"
-#include "constants/tv.h"
extern u16 gUnknown_0203CF30[];
@@ -281,10 +280,6 @@ bool8 AddBagItem(u16 itemId, u16 count)
{
// successfully added to already existing item's count
SetBagItemQuantity(&newItems[i].quantity, ownedCount + count);
-
- // goto SUCCESS_ADD_ITEM;
- // is equivalent but won't match
-
memcpy(itemPocket->itemSlots, newItems, itemPocket->capacity * sizeof(struct ItemSlot));
Free(newItems);
return TRUE;
@@ -304,7 +299,7 @@ bool8 AddBagItem(u16 itemId, u16 count)
// don't create another instance of the item if it's at max slot capacity and count is equal to 0
if (count == 0)
{
- goto SUCCESS_ADD_ITEM;
+ break;
}
}
}
@@ -335,7 +330,8 @@ bool8 AddBagItem(u16 itemId, u16 count)
{
// created a new slot and added quantity
SetBagItemQuantity(&newItems[i].quantity, count);
- goto SUCCESS_ADD_ITEM;
+ count = 0;
+ break;
}
}
}
@@ -346,11 +342,9 @@ bool8 AddBagItem(u16 itemId, u16 count)
return FALSE;
}
}
-
- SUCCESS_ADD_ITEM:
- memcpy(itemPocket->itemSlots, newItems, itemPocket->capacity * sizeof(struct ItemSlot));
- Free(newItems);
- return TRUE;
+ memcpy(itemPocket->itemSlots, newItems, itemPocket->capacity * sizeof(struct ItemSlot));
+ Free(newItems);
+ return TRUE;
}
}
@@ -554,7 +548,6 @@ bool8 AddPCItem(u16 itemId, u16 count)
void RemovePCItem(u8 index, u16 count)
{
- // UB: should use GetPCItemQuantity and SetPCItemQuantity functions
gSaveBlock1Ptr->pcItems[index].quantity -= count;
if (gSaveBlock1Ptr->pcItems[index].quantity == 0)
{
@@ -820,7 +813,7 @@ bool8 RemovePyramidBagItem(u16 itemId, u16 count)
u16 *items = gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode];
u8 *quantities = gSaveBlock2Ptr->frontier.pyramidBag.quantity[gSaveBlock2Ptr->frontier.lvlMode];
- i = gPyramidBagCursorData.cursorPosition + gPyramidBagCursorData.scrollPosition;
+ i = gPyramidBagMenuState.cursorPosition + gPyramidBagMenuState.scrollPosition;
if (items[i] == itemId && quantities[i] >= count)
{
quantities[i] -= count;
diff --git a/src/item_menu.c b/src/item_menu.c
index 865f8d8d1..39abf883a 100755
--- a/src/item_menu.c
+++ b/src/item_menu.c
@@ -133,7 +133,7 @@ void UpdatePocketScrollPositions(void);
u8 CreateBagInputHandlerTask(u8);
void sub_81AC23C(u8);
void BagMenu_MoveCursorCallback(s32 a, bool8 b, struct ListMenu*);
-void BagMenu_ItemPrintCallback(u8 windowId, s32 itemIndex, u8 a);
+void BagMenu_ItemPrintCallback(u8 windowId, u32 itemIndex, u8 a);
void ItemMenu_UseOutOfBattle(u8 taskId);
void ItemMenu_Toss(u8 taskId);
void ItemMenu_Register(u8 taskId);
@@ -509,7 +509,6 @@ EWRAM_DATA u16 gSpecialVar_ItemId = 0;
static EWRAM_DATA struct TempWallyStruct *sTempWallyBag = 0;
extern u8 *const gPocketNamesStringsTable[];
-extern u8* gReturnToXStringsTable[];
extern const u8 EventScript_SelectWithoutRegisteredItem[];
extern const u16 gUnknown_0860F074[];
@@ -530,7 +529,7 @@ void CB2_BagMenuFromBattle(void)
if (!InBattlePyramid())
GoToBagMenu(ITEMMENULOCATION_BATTLE, POCKETS_COUNT, CB2_SetUpReshowBattleScreenAfterMenu2);
else
- GoToBattlePyramidBagMenu(1, CB2_SetUpReshowBattleScreenAfterMenu2);
+ GoToBattlePyramidBagMenu(PYRAMIDBAG_LOC_BATTLE, CB2_SetUpReshowBattleScreenAfterMenu2);
}
// Choosing berry to plant
@@ -894,7 +893,7 @@ void BagMenu_MoveCursorCallback(s32 itemIndex, bool8 onInit, struct ListMenu *li
}
}
-void BagMenu_ItemPrintCallback(u8 windowId, s32 itemIndex, u8 y)
+void BagMenu_ItemPrintCallback(u8 windowId, u32 itemIndex, u8 y)
{
u16 itemId;
u16 itemQuantity;
@@ -947,7 +946,7 @@ void BagMenu_PrintDescription(int itemIndex)
}
else
{
- StringCopy(gStringVar1, gReturnToXStringsTable[gBagPositionStruct.location]);
+ StringCopy(gStringVar1, gBagMenu_ReturnToStrings[gBagPositionStruct.location]);
StringExpandPlaceholders(gStringVar4, gText_ReturnToVar1);
str = gStringVar4;
}
@@ -1458,7 +1457,7 @@ void sub_81AC590(u8 taskId)
gTasks[taskId].func = Task_BagMenu_HandleInput;
}
-void OpenContextMenu(u8 unused)
+static void OpenContextMenu(u8 unused)
{
switch (gBagPositionStruct.location)
{
@@ -1604,8 +1603,8 @@ void sub_81ACAF8(u8 a)
void sub_81ACB54(u8 a, u8 b, u8 c)
{
- sub_8198DBC(a, 7, 8, 1, 0x38, b, c, sItemMenuActions, gBagMenu->contextMenuItemsPtr);
- sub_8199944(a, 0x38, b, c, 0);
+ PrintMenuActionGrid(a, 7, 8, 1, 0x38, b, c, sItemMenuActions, gBagMenu->contextMenuItemsPtr);
+ InitMenuActionGrid(a, 0x38, b, c, 0);
}
void Task_ItemContext_FieldOrBattle(u8 taskId)
@@ -1850,7 +1849,7 @@ void ItemMenu_Register(u8 taskId)
void ItemMenu_Give(u8 taskId)
{
BagMenu_RemoveSomeWindow();
- if (!itemid_80BF6D8_mail_related(gSpecialVar_ItemId))
+ if (!IsWritingMailAllowed(gSpecialVar_ItemId))
{
DisplayItemMessage(taskId, 1, gText_CantWriteMail, sub_81AD350);
}
@@ -1925,7 +1924,7 @@ void CB2_ReturnToBagMenuPocket(void)
void Task_ItemContext_FieldGive(u8 taskId)
{
- if (!itemid_80BF6D8_mail_related(gSpecialVar_ItemId))
+ if (!IsWritingMailAllowed(gSpecialVar_ItemId))
{
DisplayItemMessage(taskId, 1, gText_CantWriteMail, sub_81AD350);
}
diff --git a/src/item_use.c b/src/item_use.c
index af0ca9ee5..c9087e929 100755
--- a/src/item_use.c
+++ b/src/item_use.c
@@ -109,8 +109,8 @@ static void SetUpItemUseCallback(u8 taskId)
}
else
{
- gPyramidBagResources->callback2 = sItemUseCallbacks[type];
- CloseBattlePyramidBagAndSetCallback(taskId);
+ gPyramidBagMenu->exitCallback = sItemUseCallbacks[type];
+ CloseBattlePyramidBag(taskId);
}
}
@@ -822,8 +822,8 @@ static void RemoveUsedItem(void)
}
else
{
- sub_81C5924();
- sub_81C59BC();
+ UpdatePyramidBagList();
+ UpdatePyramidBagCursorPos();
}
}
@@ -910,7 +910,7 @@ static void ItemUseOnFieldCB_EscapeRope(u8 taskId)
bool8 CanUseDigOrEscapeRopeOnCurMap(void)
{
- if (gMapHeader.flags & MAP_ALLOW_ESCAPING)
+ if (gMapHeader.allowEscaping)
return TRUE;
else
return FALSE;
@@ -943,7 +943,7 @@ void ItemUseInBattle_PokeBall(u8 taskId)
if (!InBattlePyramid())
Task_FadeAndCloseBagMenu(taskId);
else
- CloseBattlePyramidBagAndSetCallback(taskId);
+ CloseBattlePyramidBag(taskId);
}
else if (!InBattlePyramid())
{
@@ -960,7 +960,7 @@ static void Task_CloseStatIncreaseMessage(u8 taskId)
if (!InBattlePyramid())
Task_FadeAndCloseBagMenu(taskId);
else
- CloseBattlePyramidBagAndSetCallback(taskId);
+ CloseBattlePyramidBag(taskId);
}
}
@@ -1005,8 +1005,8 @@ static void ItemUseInBattle_ShowPartyMenu(u8 taskId)
}
else
{
- gPyramidBagResources->callback2 = ChooseMonForInBattleItem;
- CloseBattlePyramidBagAndSetCallback(taskId);
+ gPyramidBagMenu->exitCallback = ChooseMonForInBattleItem;
+ CloseBattlePyramidBag(taskId);
}
}
@@ -1039,7 +1039,7 @@ void ItemUseInBattle_Escape(u8 taskId)
if (!InBattlePyramid())
DisplayItemMessage(taskId, 1, gStringVar4, Task_FadeAndCloseBagMenu);
else
- DisplayItemMessageInBattlePyramid(taskId, gStringVar4, CloseBattlePyramidBagAndSetCallback);
+ DisplayItemMessageInBattlePyramid(taskId, gStringVar4, CloseBattlePyramidBag);
}
else
{
diff --git a/src/m4a.c b/src/m4a.c
index 3bb440f65..105312a40 100644
--- a/src/m4a.c
+++ b/src/m4a.c
@@ -1525,6 +1525,10 @@ void ply_xwave(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track
{
u32 wav;
+#ifdef UBFIX
+ wav = 0;
+#endif
+
READ_XCMD_BYTE(wav, 0) // UB: uninitialized variable
READ_XCMD_BYTE(wav, 1)
READ_XCMD_BYTE(wav, 2)
@@ -1592,6 +1596,10 @@ void ply_xcmd_0C(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *tra
{
u32 unk;
+#ifdef UBFIX
+ unk = 0;
+#endif
+
READ_XCMD_BYTE(unk, 0) // UB: uninitialized variable
READ_XCMD_BYTE(unk, 1)
@@ -1611,6 +1619,7 @@ void ply_xcmd_0C(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *tra
void ply_xcmd_0D(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track)
{
u32 unk;
+
#ifdef UBFIX
unk = 0;
#endif
@@ -1703,14 +1712,14 @@ void SetPokemonCryProgress(u32 val)
gPokemonCrySong.unkCmd0DParam = val;
}
-int IsPokemonCryPlaying(struct MusicPlayerInfo *mplayInfo)
+bool32 IsPokemonCryPlaying(struct MusicPlayerInfo *mplayInfo)
{
struct MusicPlayerTrack *track = mplayInfo->tracks;
if (track->chan && track->chan->track == track)
- return 1;
+ return TRUE;
else
- return 0;
+ return FALSE;
}
void SetPokemonCryChorus(s8 val)
diff --git a/src/main_menu.c b/src/main_menu.c
index 38859b860..38e7648d0 100644
--- a/src/main_menu.c
+++ b/src/main_menu.c
@@ -1387,11 +1387,9 @@ static void Task_NewGameBirchSpeechSub_WaitForLotad(u8 taskId)
switch (tState)
{
case 0:
- if (sprite->callback == SpriteCallbackDummy)
- {
- sprite->oam.affineMode = ST_OAM_AFFINE_OFF;
- goto incrementStateAndTimer;
- }
+ if (sprite->callback != SpriteCallbackDummy)
+ return;
+ sprite->oam.affineMode = ST_OAM_AFFINE_OFF;
break;
case 1:
if (gTasks[sBirchSpeechMainTaskId].tTimer >= 96)
@@ -1400,14 +1398,11 @@ static void Task_NewGameBirchSpeechSub_WaitForLotad(u8 taskId)
if (gTasks[sBirchSpeechMainTaskId].tTimer < 0x4000)
gTasks[sBirchSpeechMainTaskId].tTimer++;
}
- break;
- incrementStateAndTimer:
- default:
- tState++;
- if (gTasks[sBirchSpeechMainTaskId].tTimer < 0x4000)
- gTasks[sBirchSpeechMainTaskId].tTimer++;
- break;
+ return;
}
+ tState++;
+ if (gTasks[sBirchSpeechMainTaskId].tTimer < 0x4000)
+ gTasks[sBirchSpeechMainTaskId].tTimer++;
}
#undef tState
diff --git a/src/mauville_old_man.c b/src/mauville_old_man.c
index 228415628..239639e0b 100644
--- a/src/mauville_old_man.c
+++ b/src/mauville_old_man.c
@@ -680,45 +680,43 @@ void ScrSpecial_SetMauvilleOldManObjEventGfx(void)
// Language fixers?
-void sub_8120B70(union OldMan * oldMan)
+void SanitizeMauvilleOldManForRuby(union OldMan * oldMan)
{
s32 i;
u8 playerName[PLAYER_NAME_LENGTH + 1];
switch (oldMan->common.id)
{
- case MAUVILLE_MAN_TRADER:
+ case MAUVILLE_MAN_TRADER:
+ {
+ struct MauvilleOldManTrader * trader = &oldMan->trader;
+ for (i = 0; i < NUM_TRADER_ITEMS; i++)
{
- struct MauvilleOldManTrader * trader = &oldMan->trader;
- for (i = 0; i < NUM_TRADER_ITEMS; i++)
- {
- if (trader->language[i] == LANGUAGE_JAPANESE)
- {
- ConvertInternationalString(trader->playerNames[i], LANGUAGE_JAPANESE);
- }
- }
+ if (trader->language[i] == LANGUAGE_JAPANESE)
+ ConvertInternationalString(trader->playerNames[i], LANGUAGE_JAPANESE);
}
- break;
- case MAUVILLE_MAN_STORYTELLER:
+ break;
+ }
+ case MAUVILLE_MAN_STORYTELLER:
+ {
+ struct MauvilleManStoryteller * storyteller = &oldMan->storyteller;
+ for (i = 0; i < NUM_STORYTELLER_TALES; i++)
{
- struct MauvilleManStoryteller * storyteller = &oldMan->storyteller;
- for (i = 0; i < NUM_STORYTELLER_TALES; i++)
+ if (storyteller->gameStatIDs[i] != 0)
{
- if (storyteller->gameStatIDs[i] != 0)
+ memcpy(playerName, storyteller->trainerNames[i], PLAYER_NAME_LENGTH);
+ playerName[PLAYER_NAME_LENGTH] = EOS;
+ if (IsStringJapanese(playerName))
{
- memcpy(playerName, storyteller->trainerNames[i], PLAYER_NAME_LENGTH);
- playerName[PLAYER_NAME_LENGTH] = EOS;
- if (IsStringJapanese(playerName))
- {
- memset(playerName, CHAR_SPACE, PLAYER_NAME_LENGTH + 1);
- StringCopy(playerName, gText_Friend);
- memcpy(storyteller->trainerNames[i], playerName, PLAYER_NAME_LENGTH);
- storyteller->language[i] = GAME_LANGUAGE;
- }
+ memset(playerName, CHAR_SPACE, PLAYER_NAME_LENGTH + 1);
+ StringCopy(playerName, gText_Friend);
+ memcpy(storyteller->trainerNames[i], playerName, PLAYER_NAME_LENGTH);
+ storyteller->language[i] = GAME_LANGUAGE;
}
}
}
- break;
+ break;
+ }
}
}
diff --git a/src/menu.c b/src/menu.c
index 44b39d762..90e7d8c75 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -509,12 +509,14 @@ void RemoveStartMenuWindow(void)
}
}
-u16 sub_8197A30(void)
+// Unused
+static u16 GetDialogFrameBaseTileNum(void)
{
return DLG_WINDOW_BASE_TILE_NUM;
}
-u16 sub_8197A38(void)
+// Unused
+static u16 GetStandardFrameBaseTileNum(void)
{
return STD_WINDOW_BASE_TILE_NUM;
}
@@ -1241,7 +1243,7 @@ void sub_8198D54(u8 windowId, u8 fontId, u8 a2, u8 a3, u8 a4, u8 a5, const struc
sub_8198C94(windowId, fontId, GetFontAttribute(fontId, 0), 0, a2, a3, a4, a5, strs);
}
-void sub_8198DBC(u8 windowId, u8 fontId, u8 left, u8 top, u8 a4, u8 itemCount, u8 itemCount2, const struct MenuAction *strs, const u8 *a8)
+void PrintMenuActionGrid(u8 windowId, u8 fontId, u8 left, u8 top, u8 optionWidth, u8 horizontalCount, u8 verticalCount, const struct MenuAction *strs, const u8 *strIds)
{
u8 i;
u8 j;
@@ -1256,13 +1258,13 @@ void sub_8198DBC(u8 windowId, u8 fontId, u8 left, u8 top, u8 a4, u8 itemCount, u
printer.letterSpacing = GetFontAttribute(fontId, FONTATTR_LETTER_SPACING);
printer.lineSpacing = GetFontAttribute(fontId, FONTATTR_LINE_SPACING);
- for (i = 0; i < itemCount2; i++)
+ for (i = 0; i < verticalCount; i++)
{
- for (j = 0; j < itemCount; j++)
+ for (j = 0; j < horizontalCount; j++)
{
- printer.currentChar = strs[a8[(itemCount * i) + j]].text;
- printer.x = (a4 * j) + left;
- printer.y = (GetFontAttribute(fontId, 1) * i) + top;
+ printer.currentChar = strs[strIds[(horizontalCount * i) + j]].text;
+ printer.x = (optionWidth * j) + left;
+ printer.y = (GetFontAttribute(fontId, FONTATTR_MAX_LETTER_HEIGHT) * i) + top;
printer.currentX = printer.x;
printer.currentY = printer.y;
AddTextPrinter(&printer, 0xFF, NULL);
@@ -1272,9 +1274,10 @@ void sub_8198DBC(u8 windowId, u8 fontId, u8 left, u8 top, u8 a4, u8 itemCount, u
CopyWindowToVram(windowId, 2);
}
-void sub_8198EF8(u8 windowId, u8 fontId, u8 a2, u8 a3, u8 a4, u8 a5, const struct MenuAction *strs, const u8 *a8)
+// Unused
+static void PrintMenuActionGrid_TopLeft(u8 windowId, u8 fontId, u8 optionWidth, u8 unused, u8 horizontalCount, u8 verticalCount, const struct MenuAction *strs, const u8 *strIds)
{
- sub_8198DBC(windowId, fontId, GetFontAttribute(fontId, 0), 0, a2, a4, a5, strs, a8);
+ PrintMenuActionGrid(windowId, fontId, GetFontAttribute(fontId, FONTATTR_MAX_LETTER_WIDTH), 0, optionWidth, horizontalCount, verticalCount, strs, strIds);
}
u8 sub_8198F58(u8 windowId, u8 fontId, u8 left, u8 top, u8 a4, u8 cursorHeight, u8 a6, u8 a7, u8 numChoices, u8 a9)
@@ -1701,7 +1704,7 @@ void sub_819983C(u8 windowId, u8 a4, u8 itemCount, u8 itemCount2, const struct M
CopyWindowToVram(windowId, 2);
}
-u8 sub_8199944(u8 windowId, u8 optionWidth, u8 columns, u8 rows, u8 initialCursorPos)
+u8 InitMenuActionGrid(u8 windowId, u8 optionWidth, u8 columns, u8 rows, u8 initialCursorPos)
{
s32 pos;
diff --git a/src/menu_helpers.c b/src/menu_helpers.c
index 5a6ac8394..151de0bd4 100644
--- a/src/menu_helpers.c
+++ b/src/menu_helpers.c
@@ -287,7 +287,7 @@ bool8 sub_8122148(u16 itemId)
return FALSE;
}
-bool8 itemid_80BF6D8_mail_related(u16 itemId)
+bool8 IsWritingMailAllowed(u16 itemId)
{
if (IsUpdateLinkStateCBActive() != TRUE && InUnionRoom() != TRUE)
return TRUE;
diff --git a/src/menu_specialized.c b/src/menu_specialized.c
index 4c4be57f0..2afcf51ca 100644
--- a/src/menu_specialized.c
+++ b/src/menu_specialized.c
@@ -253,7 +253,7 @@ static u8 sub_81D1D34(u8 a0)
return sUnknown_0203CF48[a0];
}
-static void sub_81D1D44(u8 windowId, s32 itemId, u8 y)
+static void sub_81D1D44(u8 windowId, u32 itemId, u8 y)
{
u8 buffer[30];
u16 length;
diff --git a/src/mystery_gift.c b/src/mystery_gift.c
index 1e00a5788..afbe50e4d 100644
--- a/src/mystery_gift.c
+++ b/src/mystery_gift.c
@@ -558,14 +558,12 @@ bool32 MG_PrintTextOnWindow1AndWaitButton(u8 *textState, const u8 *str)
{
case 0:
AddTextPrinterToWindow1(str);
- goto inc;
+ (*textState)++;
+ break;
case 1:
DrawDownArrow(1, 0xD0, 0x14, 1, FALSE, &sDownArrowCounterAndYCoordIdx[0], &sDownArrowCounterAndYCoordIdx[1]);
if (({JOY_NEW(A_BUTTON | B_BUTTON);}))
- {
- inc:
(*textState)++;
- }
break;
case 2:
DrawDownArrow(1, 0xD0, 0x14, 1, TRUE, &sDownArrowCounterAndYCoordIdx[0], &sDownArrowCounterAndYCoordIdx[1]);
@@ -574,7 +572,7 @@ bool32 MG_PrintTextOnWindow1AndWaitButton(u8 *textState, const u8 *str)
return TRUE;
case 0xFF:
*textState = 2;
- break;
+ return FALSE;
}
return FALSE;
}
@@ -809,8 +807,6 @@ static bool32 ValidateCardOrNews(bool32 cardOrNews)
static bool32 HandleLoadWonderCardOrNews(u8 * state, bool32 cardOrNews)
{
- s32 v0;
-
switch (*state)
{
case 0:
@@ -827,20 +823,18 @@ static bool32 HandleLoadWonderCardOrNews(u8 * state, bool32 cardOrNews)
case 1:
if (cardOrNews == 0)
{
- v0 = FadeToWonderCardMenu();
- check:
- if (v0 != 0)
+ if (!FadeToWonderCardMenu())
{
- goto done;
+ return FALSE;
}
- break;
}
else
{
- v0 = FadeToWonderNewsMenu();
- goto check;
+ if (!FadeToWonderNewsMenu())
+ {
+ return FALSE;
+ }
}
- done:
*state = 0;
return TRUE;
}
diff --git a/src/new_game.c b/src/new_game.c
index 05d86aa8c..2a950efbc 100644
--- a/src/new_game.c
+++ b/src/new_game.c
@@ -48,23 +48,19 @@
extern const u8 EventScript_ResetAllMapFlags[];
-// this file's functions
static void ClearFrontierRecord(void);
static void WarpToTruck(void);
static void ResetMiniGamesRecords(void);
-// EWRAM vars
EWRAM_DATA bool8 gDifferentSaveFile = FALSE;
EWRAM_DATA bool8 gEnableContestDebugging = FALSE;
-// const rom data
static const struct ContestWinner sContestWinnerPicDummy =
{
.monName = _(""),
.trainerName = _("")
};
-// code
void SetTrainerId(u32 trainerId, u8 *dst)
{
dst[0] = trainerId;
@@ -114,7 +110,9 @@ void ClearAllContestWinnerPics(void)
s32 i;
ClearContestWinnerPicsInContestHall();
- for (i = 8; i < 13; i++)
+
+ // Clear Museum paintings
+ for (i = MUSEUM_CONTEST_WINNERS_START; i < NUM_CONTEST_WINNERS; i++)
gSaveBlock1Ptr->contestWinners[i] = sContestWinnerPicDummy;
}
diff --git a/src/overworld.c b/src/overworld.c
index 600333a47..979ebb74c 100644
--- a/src/overworld.c
+++ b/src/overworld.c
@@ -962,7 +962,7 @@ static u16 GetCenterScreenMetatileBehavior(void)
bool32 Overworld_IsBikingAllowed(void)
{
- if (!(gMapHeader.flags & MAP_ALLOW_CYCLING))
+ if (!gMapHeader.allowCycling)
return FALSE;
else
return TRUE;
@@ -1687,7 +1687,7 @@ void CB2_ReturnToFieldFadeFromBlack(void)
static void FieldCB_FadeTryShowMapPopup(void)
{
- if (SHOW_MAP_NAME_ENABLED && SecretBaseMapPopupEnabled() == TRUE)
+ if (gMapHeader.showMapName == TRUE && SecretBaseMapPopupEnabled() == TRUE)
ShowMapNamePopup();
FieldCB_WarpExitFadeFromBlack();
}
@@ -1933,7 +1933,7 @@ static bool32 LoadMapInStepsLocal(u8 *state, bool32 a2)
(*state)++;
break;
case 11:
- if (SHOW_MAP_NAME_ENABLED && SecretBaseMapPopupEnabled() == TRUE)
+ if (gMapHeader.showMapName == TRUE && SecretBaseMapPopupEnabled() == TRUE)
ShowMapNamePopup();
(*state)++;
break;
diff --git a/src/party_menu.c b/src/party_menu.c
index 81c39949b..681dc5f93 100755
--- a/src/party_menu.c
+++ b/src/party_menu.c
@@ -3020,7 +3020,7 @@ static void CB2_SelectBagItemToGive(void)
if (InBattlePyramid() == FALSE)
GoToBagMenu(ITEMMENULOCATION_PARTY, POCKETS_COUNT, CB2_GiveHoldItem);
else
- GoToBattlePyramidBagMenu(2, CB2_GiveHoldItem);
+ GoToBattlePyramidBagMenu(PYRAMIDBAG_LOC_PARTY, CB2_GiveHoldItem);
}
static void CB2_GiveHoldItem(void)
@@ -4203,7 +4203,7 @@ static void CB2_ReturnToBagMenu(void)
if (InBattlePyramid() == FALSE)
GoToBagMenu(ITEMMENULOCATION_LAST, POCKETS_COUNT, NULL);
else
- GoToBattlePyramidBagMenu(4, gPyramidBagCursorData.callback);
+ GoToBattlePyramidBagMenu(PYRAMIDBAG_LOC_PREV, gPyramidBagMenuState.callback);
}
static void Task_SetSacredAshCB(u8 taskId)
diff --git a/src/player_pc.c b/src/player_pc.c
index e5c3c5a18..946f0645c 100644
--- a/src/player_pc.c
+++ b/src/player_pc.c
@@ -119,7 +119,7 @@ static void sub_816C060(u16 itemId);
static void sub_816BEF0(s32 id);
static void sub_816B4DC(u8 taskId);
static void ItemStorage_MoveCursor(s32 id, bool8 b, struct ListMenu * thisMenu);
-static void fish4_goto_x5_or_x6(u8 windowId, s32 id, u8 yOffset);
+static void fish4_goto_x5_or_x6(u8 windowId, u32 id, u8 yOffset);
// EWRAM
static EWRAM_DATA const u8 *gPcItemMenuOptionOrder = NULL;
@@ -943,7 +943,7 @@ static void ItemStorage_MoveCursor(s32 id, bool8 b, struct ListMenu *thisMenu)
if (gUnknown_0203BCC4->unk666 == 0xFF)
{
sub_816C0C8();
- if (id != -2)
+ if (id != LIST_CANCEL)
sub_816C060(gSaveBlock1Ptr->pcItems[id].itemId);
else
sub_816C060(ITEMPC_GO_BACK_TO_PREV);
@@ -951,9 +951,9 @@ static void ItemStorage_MoveCursor(s32 id, bool8 b, struct ListMenu *thisMenu)
}
}
-static void fish4_goto_x5_or_x6(u8 windowId, s32 id, u8 yOffset)
+static void fish4_goto_x5_or_x6(u8 windowId, u32 id, u8 yOffset)
{
- if (id != -2)
+ if (id != LIST_CANCEL)
{
if (gUnknown_0203BCC4->unk666 != 0xFF)
{
@@ -1245,7 +1245,6 @@ static void ItemStorage_DoItemSwap(u8 taskId, bool8 a)
{
s16 *data;
u16 b;
- u8 c;
data = gTasks[taskId].data;
b = (playerPCItemPageInfo.itemsAbove + playerPCItemPageInfo.cursorPos);
@@ -1253,21 +1252,17 @@ static void ItemStorage_DoItemSwap(u8 taskId, bool8 a)
DestroyListMenuTask(data[5], &(playerPCItemPageInfo.itemsAbove), &(playerPCItemPageInfo.cursorPos));
if (!a)
{
- c = gUnknown_0203BCC4->unk666;
- if (c != b)
+ if (gUnknown_0203BCC4->unk666 != b)
{
- if (c != b - 1)
+ if (gUnknown_0203BCC4->unk666 != b - 1)
{
- MoveItemSlotInList(gSaveBlock1Ptr->pcItems, c, b);
+ MoveItemSlotInList(gSaveBlock1Ptr->pcItems, gUnknown_0203BCC4->unk666, b);
ItemStorage_RefreshListMenu();
}
}
- else
- goto LABEL_SKIP_CURSOR_DECREMENT;
}
if (gUnknown_0203BCC4->unk666 < b)
playerPCItemPageInfo.cursorPos--;
- LABEL_SKIP_CURSOR_DECREMENT:
SetSwapLineSpritesInvisibility(gUnknown_0203BCC4->spriteIds, 7, TRUE);
gUnknown_0203BCC4->unk666 = 0xFF;
data[5] = ListMenuInit(&gMultiuseListMenuTemplate, playerPCItemPageInfo.itemsAbove, playerPCItemPageInfo.cursorPos);
diff --git a/src/pokeball.c b/src/pokeball.c
index 77d2b119c..3671e6a35 100644
--- a/src/pokeball.c
+++ b/src/pokeball.c
@@ -12,28 +12,29 @@
#include "task.h"
#include "trig.h"
#include "util.h"
+#include "data.h"
#include "constants/songs.h"
extern struct MusicPlayerInfo gMPlayInfo_BGM;
// this file's functions
static void Task_DoPokeballSendOutAnim(u8 taskId);
-static void SpriteCB_TestBallThrow(struct Sprite *sprite);
static void SpriteCB_PlayerMonSendOut_1(struct Sprite *sprite);
static void SpriteCB_PlayerMonSendOut_2(struct Sprite *sprite);
static void SpriteCB_OpponentMonSendOut(struct Sprite *sprite);
-static void sub_80756D4(struct Sprite *sprite);
-static void sub_80756E0(struct Sprite *sprite);
-static void sub_807574C(struct Sprite *sprite);
-static void sub_80757E4(struct Sprite *sprite);
-static void sub_8075838(struct Sprite *sprite);
-static void sub_8075930(struct Sprite *sprite);
+static void SpriteCB_BallThrow(struct Sprite *sprite);
+static void SpriteCB_BallThrow_ReachMon(struct Sprite *sprite);
+static void SpriteCB_BallThrow_StartShrinkMon(struct Sprite *sprite);
+static void SpriteCB_BallThrow_ShrinkMon(struct Sprite *sprite);
+static void SpriteCB_BallThrow_Close(struct Sprite *sprite);
+static void SpriteCB_BallThrow_FallToGround(struct Sprite *sprite);
+static void SpriteCB_BallThrow_StartShakes(struct Sprite *sprite);
+static void SpriteCB_BallThrow_Shake(struct Sprite *sprite);
+static void SpriteCB_BallThrow_StartCaptureMon(struct Sprite *sprite);
+static void SpriteCB_BallThrow_CaptureMon(struct Sprite *sprite);
static void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite);
static void SpriteCB_ReleaseMon2FromBall(struct Sprite *sprite);
-static void sub_8075970(struct Sprite *sprite);
static void HandleBallAnimEnd(struct Sprite *sprite);
-static void sub_8075FB4(struct Sprite *sprite);
-static void sub_80760F8(struct Sprite *sprite);
static void SpriteCB_PokeballReleaseMon(struct Sprite *sprite);
static void SpriteCB_ReleasedMonFlyOut(struct Sprite *sprite);
static void SpriteCB_TradePokeball(struct Sprite *sprite);
@@ -213,7 +214,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.anims = sBallAnimSequences,
.images = NULL,
.affineAnims = sAffineAnim_BallRotate,
- .callback = SpriteCB_TestBallThrow,
+ .callback = SpriteCB_BallThrow,
},
{
.tileTag = GFX_TAG_GREATBALL,
@@ -222,7 +223,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.anims = sBallAnimSequences,
.images = NULL,
.affineAnims = sAffineAnim_BallRotate,
- .callback = SpriteCB_TestBallThrow,
+ .callback = SpriteCB_BallThrow,
},
{
.tileTag = GFX_TAG_SAFARIBALL,
@@ -231,7 +232,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.anims = sBallAnimSequences,
.images = NULL,
.affineAnims = sAffineAnim_BallRotate,
- .callback = SpriteCB_TestBallThrow,
+ .callback = SpriteCB_BallThrow,
},
{
.tileTag = GFX_TAG_ULTRABALL,
@@ -240,7 +241,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.anims = sBallAnimSequences,
.images = NULL,
.affineAnims = sAffineAnim_BallRotate,
- .callback = SpriteCB_TestBallThrow,
+ .callback = SpriteCB_BallThrow,
},
{
.tileTag = GFX_TAG_MASTERBALL,
@@ -249,7 +250,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.anims = sBallAnimSequences,
.images = NULL,
.affineAnims = sAffineAnim_BallRotate,
- .callback = SpriteCB_TestBallThrow,
+ .callback = SpriteCB_BallThrow,
},
{
.tileTag = GFX_TAG_NETBALL,
@@ -258,7 +259,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.anims = sBallAnimSequences,
.images = NULL,
.affineAnims = sAffineAnim_BallRotate,
- .callback = SpriteCB_TestBallThrow,
+ .callback = SpriteCB_BallThrow,
},
{
.tileTag = GFX_TAG_DIVEBALL,
@@ -267,7 +268,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.anims = sBallAnimSequences,
.images = NULL,
.affineAnims = sAffineAnim_BallRotate,
- .callback = SpriteCB_TestBallThrow,
+ .callback = SpriteCB_BallThrow,
},
{
.tileTag = GFX_TAG_NESTBALL,
@@ -276,7 +277,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.anims = sBallAnimSequences,
.images = NULL,
.affineAnims = sAffineAnim_BallRotate,
- .callback = SpriteCB_TestBallThrow,
+ .callback = SpriteCB_BallThrow,
},
{
.tileTag = GFX_TAG_REPEATBALL,
@@ -285,7 +286,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.anims = sBallAnimSequences,
.images = NULL,
.affineAnims = sAffineAnim_BallRotate,
- .callback = SpriteCB_TestBallThrow,
+ .callback = SpriteCB_BallThrow,
},
{
.tileTag = GFX_TAG_TIMERBALL,
@@ -294,7 +295,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.anims = sBallAnimSequences,
.images = NULL,
.affineAnims = sAffineAnim_BallRotate,
- .callback = SpriteCB_TestBallThrow,
+ .callback = SpriteCB_BallThrow,
},
{
.tileTag = GFX_TAG_LUXURYBALL,
@@ -303,7 +304,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.anims = sBallAnimSequences,
.images = NULL,
.affineAnims = sAffineAnim_BallRotate,
- .callback = SpriteCB_TestBallThrow,
+ .callback = SpriteCB_BallThrow,
},
{
.tileTag = GFX_TAG_PREMIERBALL,
@@ -312,7 +313,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.anims = sBallAnimSequences,
.images = NULL,
.affineAnims = sAffineAnim_BallRotate,
- .callback = SpriteCB_TestBallThrow,
+ .callback = SpriteCB_BallThrow,
},
};
@@ -408,7 +409,10 @@ static void Task_DoPokeballSendOutAnim(u8 taskId)
PlaySE(SE_BALL_THROW);
}
-static void SpriteCB_TestBallThrow(struct Sprite *sprite)
+// This sequence of functions is very similar to those that get run when
+// a Pokéball gets thrown at a wild Pokémon, starting at SpriteCB_Ball_Arc.
+// These do not seem to get run.
+static void SpriteCB_BallThrow(struct Sprite *sprite)
{
if (TranslateAnimHorizontalArc(sprite))
{
@@ -430,7 +434,7 @@ static void SpriteCB_TestBallThrow(struct Sprite *sprite)
sprite->sBattler = opponentBattler;
sprite->data[7] = noOfShakes;
DestroyTask(taskId);
- sprite->callback = sub_80756D4;
+ sprite->callback = SpriteCB_BallThrow_ReachMon;
}
}
@@ -440,26 +444,24 @@ static void SpriteCB_TestBallThrow(struct Sprite *sprite)
#undef tBattler
#undef tOpponentBattler
-static void sub_80756D4(struct Sprite *sprite)
+static void SpriteCB_BallThrow_ReachMon(struct Sprite *sprite)
{
- sprite->callback = sub_80756E0;
+ sprite->callback = SpriteCB_BallThrow_StartShrinkMon;
}
-// Start something for battler
-static void sub_80756E0(struct Sprite *sprite)
+static void SpriteCB_BallThrow_StartShrinkMon(struct Sprite *sprite)
{
if (++sprite->data[5] == 10)
{
sprite->data[5] = 0;
- sprite->callback = sub_807574C;
- StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[sprite->sBattler]], 2);
+ sprite->callback = SpriteCB_BallThrow_ShrinkMon;
+ StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[sprite->sBattler]], BATTLER_AFFINE_RETURN);
AnimateSprite(&gSprites[gBattlerSpriteIds[sprite->sBattler]]);
gSprites[gBattlerSpriteIds[sprite->sBattler]].data[1] = 0;
}
}
-// Shrink player
-static void sub_807574C(struct Sprite *sprite)
+static void SpriteCB_BallThrow_ShrinkMon(struct Sprite *sprite)
{
sprite->data[5]++;
if (sprite->data[5] == 11)
@@ -469,7 +471,7 @@ static void sub_807574C(struct Sprite *sprite)
StartSpriteAnim(sprite, 2);
gSprites[gBattlerSpriteIds[sprite->sBattler]].invisible = TRUE;
sprite->data[5] = 0;
- sprite->callback = sub_80757E4;
+ sprite->callback = SpriteCB_BallThrow_Close;
}
else
{
@@ -478,7 +480,7 @@ static void sub_807574C(struct Sprite *sprite)
}
}
-static void sub_80757E4(struct Sprite *sprite)
+static void SpriteCB_BallThrow_Close(struct Sprite *sprite)
{
if (sprite->animEnded)
{
@@ -490,12 +492,12 @@ static void sub_80757E4(struct Sprite *sprite)
sprite->data[5] = 0;
sprite->pos1.y += Cos(0, 32);
sprite->pos2.y = -Cos(0, sprite->data[4]);
- sprite->callback = sub_8075838;
+ sprite->callback = SpriteCB_BallThrow_FallToGround;
}
}
}
-static void sub_8075838(struct Sprite *sprite)
+static void SpriteCB_BallThrow_FallToGround(struct Sprite *sprite)
{
bool8 r5 = FALSE;
@@ -548,14 +550,14 @@ static void sub_8075838(struct Sprite *sprite)
}
else
{
- sprite->callback = sub_8075930;
+ sprite->callback = SpriteCB_BallThrow_StartShakes;
sprite->data[4] = 1;
sprite->data[5] = 0;
}
}
}
-static void sub_8075930(struct Sprite *sprite)
+static void SpriteCB_BallThrow_StartShakes(struct Sprite *sprite)
{
sprite->data[3]++;
if (sprite->data[3] == 31)
@@ -563,12 +565,12 @@ static void sub_8075930(struct Sprite *sprite)
sprite->data[3] = 0;
sprite->affineAnimPaused = TRUE;
StartSpriteAffineAnim(sprite, 1);
- sprite->callback = sub_8075970;
+ sprite->callback = SpriteCB_BallThrow_Shake;
PlaySE(SE_BALL);
}
}
-static void sub_8075970(struct Sprite *sprite)
+static void SpriteCB_BallThrow_Shake(struct Sprite *sprite)
{
switch (sprite->data[3] & 0xFF)
{
@@ -611,7 +613,7 @@ static void sub_8075970(struct Sprite *sprite)
{
if (sprite->data[7] == 4 && sprite->data[3] >> 8 == 3)
{
- sprite->callback = sub_8075FB4;
+ sprite->callback = SpriteCB_BallThrow_StartCaptureMon;
sprite->affineAnimPaused = TRUE;
}
else
@@ -796,7 +798,7 @@ static void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite)
gTasks[taskId].tCryTaskState = 0;
}
- StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[sprite->sBattler]], 1);
+ StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[sprite->sBattler]], BATTLER_AFFINE_EMERGE);
if (GetBattlerSide(sprite->sBattler) == B_SIDE_OPPONENT)
gSprites[gBattlerSpriteIds[sprite->sBattler]].callback = SpriteCb_OpponentMonFromBall;
@@ -817,10 +819,10 @@ static void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite)
#undef tCryTaskFrames
#undef tCryTaskState
-static void sub_8075FB4(struct Sprite *sprite)
+static void SpriteCB_BallThrow_StartCaptureMon(struct Sprite *sprite)
{
sprite->animPaused = TRUE;
- sprite->callback = sub_80760F8;
+ sprite->callback = SpriteCB_BallThrow_CaptureMon;
sprite->data[3] = 0;
sprite->data[4] = 0;
sprite->data[5] = 0;
@@ -836,7 +838,7 @@ static void HandleBallAnimEnd(struct Sprite *sprite)
sprite->invisible = TRUE;
if (gSprites[gBattlerSpriteIds[battlerId]].affineAnimEnded)
{
- StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[battlerId]], 0);
+ StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[battlerId]], BATTLER_AFFINE_NORMAL);
affineAnimEnded = TRUE;
}
else
@@ -867,7 +869,7 @@ static void HandleBallAnimEnd(struct Sprite *sprite)
}
}
-static void sub_80760F8(struct Sprite *sprite)
+static void SpriteCB_BallThrow_CaptureMon(struct Sprite *sprite)
{
u8 battlerId = sprite->sBattler;
@@ -1042,7 +1044,7 @@ static void SpriteCB_PokeballReleaseMon(struct Sprite *sprite)
sprite->data[1] = LaunchBallFadeMonTaskForPokeball(1, battlerId, r4);
sprite->callback = SpriteCB_ReleasedMonFlyOut;
gSprites[r7].invisible = FALSE;
- StartSpriteAffineAnim(&gSprites[r7], 1);
+ StartSpriteAffineAnim(&gSprites[r7], BATTLER_AFFINE_EMERGE);
AnimateSprite(&gSprites[r7]);
gSprites[r7].data[1] = 0x1000;
sprite->data[7] = 0;
@@ -1065,7 +1067,7 @@ static void SpriteCB_ReleasedMonFlyOut(struct Sprite *sprite)
sprite->invisible = TRUE;
if (gSprites[monSpriteId].affineAnimEnded)
{
- StartSpriteAffineAnim(&gSprites[monSpriteId], 0);
+ StartSpriteAffineAnim(&gSprites[monSpriteId], BATTLER_AFFINE_NORMAL);
r12 = TRUE;
}
var1 = (sprite->data[5] - sprite->pos1.x) * sprite->data[7] / 128 + sprite->pos1.x;
@@ -1139,7 +1141,7 @@ static void SpriteCB_TradePokeball(struct Sprite *sprite)
// play the shrink anim properly due to being paused. Works together with the fix to `sub_817F77C`.
gSprites[monSpriteId].affineAnimPaused = FALSE;
#endif // BUGFIX
- StartSpriteAffineAnim(&gSprites[monSpriteId], 2);
+ StartSpriteAffineAnim(&gSprites[monSpriteId], BATTLER_AFFINE_RETURN);
AnimateSprite(&gSprites[monSpriteId]);
gSprites[monSpriteId].data[1] = 0;
}
diff --git a/src/pokemon.c b/src/pokemon.c
index 1d736be74..28b402216 100644
--- a/src/pokemon.c
+++ b/src/pokemon.c
@@ -1642,6 +1642,7 @@ static const u8 sMonFrontAnimIdsTable[] =
[SPECIES_LUGIA - 1] = ANIM_GROW_IN_STAGES,
[SPECIES_HO_OH - 1] = ANIM_GROW_VIBRATE,
[SPECIES_CELEBI - 1] = ANIM_RISING_WOBBLE,
+ [SPECIES_TREECKO - 1] = ANIM_V_SQUISH_AND_BOUNCE,
[SPECIES_GROVYLE - 1] = ANIM_V_STRETCH,
[SPECIES_SCEPTILE - 1] = ANIM_V_SHAKE,
[SPECIES_TORCHIC - 1] = ANIM_H_STRETCH,
@@ -3433,7 +3434,7 @@ void SetMultiuseSpriteTemplateToPokemon(u16 speciesTag, u8 battlerPosition)
gMultiuseSpriteTemplate.paletteTag = speciesTag;
if (battlerPosition == B_POSITION_PLAYER_LEFT || battlerPosition == B_POSITION_PLAYER_RIGHT)
- gMultiuseSpriteTemplate.anims = gUnknown_082FF70C;
+ gMultiuseSpriteTemplate.anims = gAnims_MonPic;
else if (speciesTag > SPECIES_SHINY_TAG)
gMultiuseSpriteTemplate.anims = gMonFrontAnimsPtrTable[speciesTag - SPECIES_SHINY_TAG];
else
@@ -6826,7 +6827,7 @@ static void sub_806F1FC(struct Unknown_806F160_Struct* structPtr)
structPtr->frameImages[i * structPtr->field_0_0 + j].data = &structPtr->byteArrays[i][j * 0x800];
}
structPtr->templates[i].images = &structPtr->frameImages[i * structPtr->field_0_0];
- structPtr->templates[i].anims = gUnknown_082FF70C;
+ structPtr->templates[i].anims = gAnims_MonPic;
structPtr->templates[i].paletteTag = i;
}
}
diff --git a/src/pokemon_animation.c b/src/pokemon_animation.c
index 14a17437c..500916b0e 100644
--- a/src/pokemon_animation.c
+++ b/src/pokemon_animation.c
@@ -2604,9 +2604,9 @@ static void RotateUpSlamDown_0(struct Sprite *sprite)
{
TryFlipX(sprite);
sprite->data[7]--;
- sprite->pos2.x = Cos(sprite->data[7], sprite->data[6]) + sprite->data[6];
+ sprite->pos2.x = sprite->data[6] + Cos(sprite->data[7], sprite->data[6]);
- sprite->pos2.y = -(Sin(sprite->data[7], sprite->data[6] += 0)); // dummy += 0 is needed to match
+ sprite->pos2.y = -(Sin(sprite->data[7], sprite->data[6]));
HandleSetAffineData(sprite, 256, 256, (sprite->data[7] - 128) << 8);
if (sprite->data[7] <= 120)
@@ -2634,9 +2634,9 @@ static void RotateUpSlamDown_2(struct Sprite *sprite)
{
TryFlipX(sprite);
sprite->data[7] += 2;
- sprite->pos2.x = Cos(sprite->data[7], sprite->data[6]) + sprite->data[6];
+ sprite->pos2.x = sprite->data[6] + Cos(sprite->data[7], sprite->data[6]);
- sprite->pos2.y = -(Sin(sprite->data[7], sprite->data[6] += 0)); // dummy += 0 is needed to match
+ sprite->pos2.y = -(Sin(sprite->data[7], sprite->data[6]));
HandleSetAffineData(sprite, 256, 256, (sprite->data[7] - 128) << 8);
if (sprite->data[7] >= 128)
@@ -4066,16 +4066,15 @@ static void VerticalShakeLowTwice(struct Sprite *sprite)
u8 var8 = sprite->data[2];
u8 var9 = sprite->data[6];
u8 var5 = sVerticalShakeData[sprite->data[5]][0];
- u8 var2 = var5;
if (var5 != (u8)-1)
var5 = sprite->data[7];
- else
- var5 = (u8)-1; // needed to match
var6 = sVerticalShakeData[sprite->data[5]][1];
var7 = 0;
- if (var2 != (u8)-2)
+ if (sVerticalShakeData[sprite->data[5]][0] != (u8)-2)
var7 = (var6 - var9) * var5 / var6;
+ else
+ var7 = 0;
if (var5 == (u8)-1)
{
diff --git a/src/pokemon_size_record.c b/src/pokemon_size_record.c
index 4beb9c83f..7c88e5bf1 100644
--- a/src/pokemon_size_record.c
+++ b/src/pokemon_size_record.c
@@ -97,7 +97,7 @@ static void FormatMonSizeRecord(u8 *string, u32 size)
{
#ifdef UNITS_IMPERIAL
//Convert size from centimeters to inches
- size = (double)(size * 10) / (CM_PER_INCH * 10);
+ size = (f64)(size * 10) / (CM_PER_INCH * 10);
#endif
string = ConvertIntToDecimalStringN(string, size / 10, STR_CONV_MODE_LEFT_ALIGN, 8);
diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c
index e5720d914..c82caf0b0 100644
--- a/src/pokemon_storage_system.c
+++ b/src/pokemon_storage_system.c
@@ -5437,15 +5437,16 @@ static bool32 WaitForWallpaperGfxLoad(void)
static void DrawWallpaper(const void *tilemap, s8 direction, u8 offset)
{
- s16 var = (offset * 2) + 3;
+ s16 var = offset * 256;
+ s16 var2 = (offset * 2) + 3;
s16 x = ((sStorage->bg2_X / 8 + 10) + (direction * 24)) & 0x3F;
- CopyRectToBgTilemapBufferRect(2, tilemap, 0, 0, 0x14, 0x12, x, 2, 0x14, 0x12, 0x11, offset << 8, var);
+ CopyRectToBgTilemapBufferRect(2, tilemap, 0, 0, 0x14, 0x12, x, 2, 0x14, 0x12, 0x11, var, var2);
if (direction == 0)
return;
if (direction > 0)
- x *= 1, x += 0x14; // x * 1 is needed to match, but can be safely removed as it makes no functional difference
+ x += 0x14;
else
x -= 4;
diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c
index 8f16321b2..31505b7c9 100644
--- a/src/pokemon_summary_screen.c
+++ b/src/pokemon_summary_screen.c
@@ -119,6 +119,11 @@ enum
SPRITE_ARR_ID_COUNT = SPRITE_ARR_ID_MOVE_SELECTOR2 + MOVE_SELECTOR_SPRITES_COUNT
};
+#define TILE_EMPTY_APPEAL_HEART 0x1039
+#define TILE_FILLED_APPEAL_HEART 0x103A
+#define TILE_FILLED_JAM_HEART 0x103C
+#define TILE_EMPTY_JAM_HEART 0x103D
+
static EWRAM_DATA struct PokemonSummaryScreenData
{
/*0x00*/ union {
@@ -2645,29 +2650,30 @@ static void DrawContestMoveHearts(u16 move)
if (move != MOVE_NONE)
{
+ // Draw appeal hearts
u8 effectValue = gContestEffects[gContestMoves[move].effect].appeal;
if (effectValue != 0xFF)
effectValue /= 10;
- for (i = 0; i < 8; i++)
+ for (i = 0; i < MAX_CONTEST_MOVE_HEARTS; i++)
{
if (effectValue != 0xFF && i < effectValue)
- tilemap[(i / 4 * 32) + (i & 3) + 0x1E6] = 0x103A;
+ tilemap[(i / 4 * 32) + (i & 3) + 0x1E6] = TILE_FILLED_APPEAL_HEART;
else
- tilemap[(i / 4 * 32) + (i & 3) + 0x1E6] = 0x1039;
+ tilemap[(i / 4 * 32) + (i & 3) + 0x1E6] = TILE_EMPTY_APPEAL_HEART;
}
+ // Draw jam hearts
effectValue = gContestEffects[gContestMoves[move].effect].jam;
-
if (effectValue != 0xFF)
effectValue /= 10;
- for (i = 0; i < 8; i++)
+ for (i = 0; i < MAX_CONTEST_MOVE_HEARTS; i++)
{
if (effectValue != 0xFF && i < effectValue)
- tilemap[(i / 4 * 32) + (i & 3) + 0x226] = 0x103C;
+ tilemap[(i / 4 * 32) + (i & 3) + 0x226] = TILE_FILLED_JAM_HEART;
else
- tilemap[(i / 4 * 32) + (i & 3) + 0x226] = 0x103D;
+ tilemap[(i / 4 * 32) + (i & 3) + 0x226] = TILE_EMPTY_JAM_HEART;
}
}
}
diff --git a/src/pokenav_region_map.c b/src/pokenav_region_map.c
index 2dd2e4408..3d53bc98a 100755
--- a/src/pokenav_region_map.c
+++ b/src/pokenav_region_map.c
@@ -327,7 +327,9 @@ static u32 LoopedTask_OpenRegionMap(s32 taskState)
}
else
{
- sub_8123030(RGB_BLACK, 6);
+ // Dim the region map when zoom is disabled
+ // (when the player is off the map)
+ BlendRegionMap(RGB_BLACK, 6);
}
return LT_INC_AND_PAUSE;
case 2:
diff --git a/src/post_battle_event_funcs.c b/src/post_battle_event_funcs.c
index 78ebe02e4..081a40218 100644
--- a/src/post_battle_event_funcs.c
+++ b/src/post_battle_event_funcs.c
@@ -8,7 +8,6 @@
#include "script_pokemon_util.h"
#include "tv.h"
#include "constants/heal_locations.h"
-#include "constants/tv.h"
int GameClear(void)
{
diff --git a/src/record_mixing.c b/src/record_mixing.c
index 7cc88a54c..aa6e4eef2 100644
--- a/src/record_mixing.c
+++ b/src/record_mixing.c
@@ -51,7 +51,7 @@ struct PlayerRecordsRS
PokeNews pokeNews[POKE_NEWS_COUNT];
OldMan oldMan;
struct DewfordTrend dewfordTrends[SAVED_TRENDS_COUNT];
- struct RecordMixingDayCareMail dayCareMail;
+ struct RecordMixingDaycareMail daycareMail;
struct RSBattleTowerRecord battleTowerRecord;
u16 giftItem;
u16 filler11C8[0x32];
@@ -64,7 +64,7 @@ struct PlayerRecordsEmerald
/* 0x1004 */ PokeNews pokeNews[POKE_NEWS_COUNT];
/* 0x1044 */ OldMan oldMan;
/* 0x1084 */ struct DewfordTrend dewfordTrends[SAVED_TRENDS_COUNT];
- /* 0x10ac */ struct RecordMixingDayCareMail dayCareMail;
+ /* 0x10ac */ struct RecordMixingDaycareMail daycareMail;
/* 0x1124 */ struct EmeraldBattleTowerRecord battleTowerRecord;
/* 0x1210 */ u16 giftItem;
/* 0x1214 */ LilycoveLady lilycoveLady;
@@ -87,7 +87,7 @@ static TVShow *sTvShowsSave;
static PokeNews *sPokeNewsSave;
static OldMan *sOldManSave;
static struct DewfordTrend *sDewfordTrendsSave;
-static struct RecordMixingDayCareMail *gUnknown_03001148;
+static struct RecordMixingDaycareMail *sDaycareMailSave;
static void *sBattleTowerSave;
static LilycoveLady *sLilycoveLadySave;
static void *sApprenticesSave;
@@ -96,7 +96,7 @@ static u32 sRecordStructSize;
static u8 gUnknown_03001160;
static struct PlayerHallRecords *gUnknown_03001168[3];
-static EWRAM_DATA struct RecordMixingDayCareMail gUnknown_02039F9C = {0};
+static EWRAM_DATA struct RecordMixingDaycareMail sDaycareMail = {0};
static EWRAM_DATA union PlayerRecords *sReceivedRecords = NULL;
static EWRAM_DATA union PlayerRecords *sSentRecord = NULL;
@@ -115,14 +115,14 @@ static void ReceiveOldManData(OldMan *, size_t, u8);
static void ReceiveBattleTowerData(void *battleTowerRecord, size_t, u8);
static void ReceiveLilycoveLadyData(LilycoveLady *, size_t, u8);
static void sub_80E7B2C(const u8 *);
-static void ReceiveDaycareMailData(struct RecordMixingDayCareMail *, size_t, u8, TVShow *);
+static void ReceiveDaycareMailData(struct RecordMixingDaycareMail *, size_t, u8, TVShow *);
static void ReceiveGiftItem(u16 *item, u8 which);
static void Task_DoRecordMixing(u8 taskId);
static void GetSavedApprentices(struct Apprentice *dst, struct Apprentice *src);
static void ReceiveApprenticeData(struct Apprentice *mixApprentice, size_t recordSize, u32 multiplayerId);
static void ReceiveRankingHallRecords(struct PlayerHallRecords *hallRecords, size_t arg1, u32 arg2);
-static void sub_80E89F8(struct RecordMixingDayCareMail *dst);
-static void SanitizeDayCareMailForRuby(struct RecordMixingDayCareMail *src);
+static void GetRecordMixingDaycareMail(struct RecordMixingDaycareMail *dst);
+static void SanitizeDaycareMailForRuby(struct RecordMixingDaycareMail *src);
static void SanitizeEmeraldBattleTowerRecord(struct EmeraldBattleTowerRecord *arg0);
static void SanitizeRubyBattleTowerRecord(struct RSBattleTowerRecord *src);
@@ -180,7 +180,7 @@ static void SetSrcLookupPointers(void)
sPokeNewsSave = gSaveBlock1Ptr->pokeNews;
sOldManSave = &gSaveBlock1Ptr->oldMan;
sDewfordTrendsSave = gSaveBlock1Ptr->dewfordTrends;
- gUnknown_03001148 = &gUnknown_02039F9C;
+ sDaycareMailSave = &sDaycareMail;
sBattleTowerSave = &gSaveBlock2Ptr->frontier.towerPlayer;
sLilycoveLadySave = &gSaveBlock1Ptr->lilycoveLady;
sApprenticesSave = gSaveBlock2Ptr->apprentices;
@@ -191,11 +191,11 @@ static void PrepareUnknownExchangePacket(struct PlayerRecordsRS *dest)
{
memcpy(dest->secretBases, sSecretBasesSave, sizeof(dest->secretBases));
memcpy(dest->tvShows, sTvShowsSave, sizeof(dest->tvShows));
- sub_80F14F8(dest->tvShows);
+ SanitizeTVShowLocationsForRuby(dest->tvShows);
memcpy(dest->pokeNews, sPokeNewsSave, sizeof(dest->pokeNews));
memcpy(&dest->oldMan, sOldManSave, sizeof(dest->oldMan));
memcpy(dest->dewfordTrends, sDewfordTrendsSave, sizeof(dest->dewfordTrends));
- sub_80E89F8(&dest->dayCareMail);
+ GetRecordMixingDaycareMail(&dest->daycareMail);
EmeraldBattleTowerRecordToRuby(sBattleTowerSave, &dest->battleTowerRecord);
if (GetMultiplayerId() == 0)
@@ -207,13 +207,13 @@ static void PrepareExchangePacketForRubySapphire(struct PlayerRecordsRS *dest)
memcpy(dest->secretBases, sSecretBasesSave, sizeof(dest->secretBases));
ClearJapaneseSecretBases(dest->secretBases);
memcpy(dest->tvShows, sTvShowsSave, sizeof(dest->tvShows));
- sub_80F1208(dest->tvShows);
+ SanitizeTVShowsForRuby(dest->tvShows);
memcpy(dest->pokeNews, sPokeNewsSave, sizeof(dest->pokeNews));
memcpy(&dest->oldMan, sOldManSave, sizeof(dest->oldMan));
- sub_8120B70(&dest->oldMan);
+ SanitizeMauvilleOldManForRuby(&dest->oldMan);
memcpy(dest->dewfordTrends, sDewfordTrendsSave, sizeof(dest->dewfordTrends));
- sub_80E89F8(&dest->dayCareMail);
- SanitizeDayCareMailForRuby(&dest->dayCareMail);
+ GetRecordMixingDaycareMail(&dest->daycareMail);
+ SanitizeDaycareMailForRuby(&dest->daycareMail);
EmeraldBattleTowerRecordToRuby(sBattleTowerSave, &dest->battleTowerRecord);
SanitizeRubyBattleTowerRecord(&dest->battleTowerRecord);
@@ -224,7 +224,7 @@ static void PrepareExchangePacketForRubySapphire(struct PlayerRecordsRS *dest)
static void PrepareExchangePacket(void)
{
SetPlayerSecretBaseParty();
- sub_80F0BB8();
+ DeactivateAllNormalTVShows();
SetSrcLookupPointers();
if (Link_AnyPartnersPlayingRubyOrSapphire())
@@ -242,7 +242,7 @@ static void PrepareExchangePacket(void)
memcpy(&sSentRecord->emerald.oldMan, sOldManSave, sizeof(sSentRecord->emerald.oldMan));
memcpy(&sSentRecord->emerald.lilycoveLady, sLilycoveLadySave, sizeof(sSentRecord->emerald.lilycoveLady));
memcpy(sSentRecord->emerald.dewfordTrends, sDewfordTrendsSave, sizeof(sSentRecord->emerald.dewfordTrends));
- sub_80E89F8(&sSentRecord->emerald.dayCareMail);
+ GetRecordMixingDaycareMail(&sSentRecord->emerald.daycareMail);
memcpy(&sSentRecord->emerald.battleTowerRecord, sBattleTowerSave, sizeof(sSentRecord->emerald.battleTowerRecord));
SanitizeEmeraldBattleTowerRecord(&sSentRecord->emerald.battleTowerRecord);
@@ -261,7 +261,7 @@ static void ReceiveExchangePacket(u32 which)
// Ruby/Sapphire
sub_80E7B2C((void *)sReceivedRecords->ruby.tvShows);
ReceiveSecretBasesData(sReceivedRecords->ruby.secretBases, sizeof(struct PlayerRecordsRS), which);
- ReceiveDaycareMailData(&sReceivedRecords->ruby.dayCareMail, sizeof(struct PlayerRecordsRS), which, sReceivedRecords->ruby.tvShows);
+ ReceiveDaycareMailData(&sReceivedRecords->ruby.daycareMail, sizeof(struct PlayerRecordsRS), which, sReceivedRecords->ruby.tvShows);
ReceiveBattleTowerData(&sReceivedRecords->ruby.battleTowerRecord, sizeof(struct PlayerRecordsRS), which);
ReceiveTvShowsData(sReceivedRecords->ruby.tvShows, sizeof(struct PlayerRecordsRS), which);
ReceivePokeNewsData(sReceivedRecords->ruby.pokeNews, sizeof(struct PlayerRecordsRS), which);
@@ -278,7 +278,7 @@ static void ReceiveExchangePacket(u32 which)
ReceivePokeNewsData(sReceivedRecords->emerald.pokeNews, sizeof(struct PlayerRecordsEmerald), which);
ReceiveOldManData(&sReceivedRecords->emerald.oldMan, sizeof(struct PlayerRecordsEmerald), which);
ReceiveDewfordTrendData(sReceivedRecords->emerald.dewfordTrends, sizeof(struct PlayerRecordsEmerald), which);
- ReceiveDaycareMailData(&sReceivedRecords->emerald.dayCareMail, sizeof(struct PlayerRecordsEmerald), which, sReceivedRecords->emerald.tvShows);
+ ReceiveDaycareMailData(&sReceivedRecords->emerald.daycareMail, sizeof(struct PlayerRecordsEmerald), which, sReceivedRecords->emerald.tvShows);
ReceiveBattleTowerData(&sReceivedRecords->emerald.battleTowerRecord, sizeof(struct PlayerRecordsEmerald), which);
ReceiveGiftItem(&sReceivedRecords->emerald.giftItem, which);
ReceiveLilycoveLadyData(&sReceivedRecords->emerald.lilycoveLady, sizeof(struct PlayerRecordsEmerald), which);
@@ -319,7 +319,7 @@ static void Task_RecordMixing_Main(u8 taskId)
{
case 0: // init
sSentRecord = malloc(sizeof(union PlayerRecords));
- sReceivedRecords = malloc(sizeof(union PlayerRecords) * 4);
+ sReceivedRecords = malloc(sizeof(union PlayerRecords) * MAX_LINK_PLAYERS);
SetLocalLinkPlayerId(gSpecialVar_0x8005);
VarSet(VAR_TEMP_0, 1);
gUnknown_03001130 = FALSE;
@@ -665,7 +665,7 @@ static void ReceiveBattleTowerData(void *battleTowerRecord, size_t recordSize, u
{
memcpy((void *)battleTowerRecord + recordSize * which, (void *)battleTowerRecord + recordSize * mixIndices[which], sizeof(struct EmeraldBattleTowerRecord));
dest = (void *)battleTowerRecord + recordSize * which;
- for (i = 0; i < 4; i ++)
+ for (i = 0; i < MAX_FRONTIER_PARTY_SIZE; i++)
{
btPokemon = &dest->party[i];
if (btPokemon->species != SPECIES_NONE && IsStringJapanese(btPokemon->nickname))
@@ -706,22 +706,22 @@ static void ReceiveLilycoveLadyData(LilycoveLady *lilycoveLady, size_t recordSiz
}
}
-static u8 sub_80E7A9C(struct DayCareMail *rmMail)
+static u8 sub_80E7A9C(struct DaycareMail *rmMail)
{
return rmMail->message.itemId;
}
-static void sub_80E7AA4(struct RecordMixingDayCareMail *src, size_t recordSize, u8 (*idxs)[2], u8 which0, u8 which1)
+static void sub_80E7AA4(struct RecordMixingDaycareMail *src, size_t recordSize, u8 (*idxs)[2], u8 which0, u8 which1)
{
- struct DayCareMail buffer;
- struct RecordMixingDayCareMail *mail1;
- struct RecordMixingDayCareMail *mail2;
+ struct DaycareMail buffer;
+ struct RecordMixingDaycareMail *mail1;
+ struct RecordMixingDaycareMail *mail2;
mail1 = (void *)src + recordSize * idxs[which0][0];
- memcpy(&buffer, &mail1->mail[idxs[which0][1]], sizeof(struct DayCareMail));
+ memcpy(&buffer, &mail1->mail[idxs[which0][1]], sizeof(struct DaycareMail));
mail2 = (void *)src + recordSize * idxs[which1][0];
- memcpy(&mail1->mail[idxs[which0][1]], &mail2->mail[idxs[which1][1]], sizeof(struct DayCareMail));
- memcpy(&mail2->mail[idxs[which1][1]], &buffer, sizeof(struct DayCareMail));
+ memcpy(&mail1->mail[idxs[which0][1]], &mail2->mail[idxs[which1][1]], sizeof(struct DaycareMail));
+ memcpy(&mail2->mail[idxs[which1][1]], &buffer, sizeof(struct DaycareMail));
}
static void sub_80E7B2C(const u8 *src)
@@ -730,7 +730,7 @@ static void sub_80E7B2C(const u8 *src)
s32 i;
sum = 0;
- for (i = 0; i < 256; i ++)
+ for (i = 0; i < 256; i++)
sum += src[i];
gUnknown_03001160 = sum;
@@ -741,17 +741,17 @@ static u8 sub_80E7B54(void)
return gUnknown_03001160;
}
-static void ReceiveDaycareMailData(struct RecordMixingDayCareMail *src, size_t recordSize, u8 which, TVShow *shows)
+static void ReceiveDaycareMailData(struct RecordMixingDaycareMail *src, size_t recordSize, u8 which, TVShow *shows)
{
u16 i, j;
u8 linkPlayerCount;
u8 tableId;
- struct RecordMixingDayCareMail *_src;
+ struct RecordMixingDaycareMail *_src;
u8 which0, which1;
void *ptr;
u8 sp04[4];
u8 sp08[4];
- struct RecordMixingDayCareMail *sp0c[4];
+ struct RecordMixingDaycareMail *sp0c[4];
u8 sp1c[4][2];
u8 sp24[4][2];
u8 sp34;
@@ -777,10 +777,10 @@ static void ReceiveDaycareMailData(struct RecordMixingDayCareMail *src, size_t r
_src = (void *)src + i * recordSize;
language = gLinkPlayers[i].language;
version = gLinkPlayers[i].version & 0xFF;
- for (j = 0; j < _src->numDaycareMons; j ++)
+ for (j = 0; j < _src->numDaycareMons; j++)
{
u16 otNameLanguage, nicknameLanguage;
- struct DayCareMail *recordMixingMail = &_src->mail[j];
+ struct DaycareMail *recordMixingMail = &_src->mail[j];
if (!recordMixingMail->message.itemId)
continue;
@@ -835,7 +835,7 @@ static void ReceiveDaycareMailData(struct RecordMixingDayCareMail *src, size_t r
if (_src->numDaycareMons == 0)
continue;
- for (j = 0; j < _src->numDaycareMons; j ++)
+ for (j = 0; j < _src->numDaycareMons; j++)
{
if (!_src->holdsItem[j])
sp1c[i][j] = 1;
@@ -913,8 +913,8 @@ static void ReceiveDaycareMailData(struct RecordMixingDayCareMail *src, size_t r
}
_src = (void *)src + which * recordSize;
- memcpy(&gSaveBlock1Ptr->daycare.mons[0].mail, &_src->mail[0], sizeof(struct DayCareMail));
- memcpy(&gSaveBlock1Ptr->daycare.mons[1].mail, &_src->mail[1], sizeof(struct DayCareMail));
+ memcpy(&gSaveBlock1Ptr->daycare.mons[0].mail, &_src->mail[0], sizeof(struct DaycareMail));
+ memcpy(&gSaveBlock1Ptr->daycare.mons[1].mail, &_src->mail[1], sizeof(struct DaycareMail));
SeedRng(oldSeed);
}
@@ -957,7 +957,7 @@ static void Task_DoRecordMixing(u8 taskId)
case 2:
SetContinueGameWarpStatusToDynamicWarp();
FullSaveGame();
- task->data[0] ++;
+ task->data[0]++;
break;
case 3:
if (CheckSaveFile())
@@ -971,7 +971,7 @@ static void Task_DoRecordMixing(u8 taskId)
if (++task->data[1] > 10)
{
SetCloseLinkCallback();
- task->data[0] ++;
+ task->data[0]++;
}
break;
case 5:
@@ -984,7 +984,7 @@ static void Task_DoRecordMixing(u8 taskId)
if (!sub_801048C(FALSE))
{
CreateTask(Task_LinkSave, 5);
- task->data[0] ++;
+ task->data[0]++;
}
break;
case 7: // wait for Task_LinkSave to finish.
@@ -1003,7 +1003,7 @@ static void Task_DoRecordMixing(u8 taskId)
break;
case 8:
SetLinkStandbyCallback();
- task->data[0] ++;
+ task->data[0]++;
break;
case 9:
if (IsLinkTaskFinished())
@@ -1061,13 +1061,9 @@ static void GetSavedApprentices(struct Apprentice *dst, struct Apprentice *src)
break;
case 2:
if (Random2() > 0x3333)
- {
dst[1] = src[gSaveBlock2Ptr->playerApprentice.saveId + 1];
- }
else
- {
dst[1] = src[((gSaveBlock2Ptr->playerApprentice.saveId + 1) % (APPRENTICE_COUNT - 1) + 1)];
- }
break;
}
}
@@ -1221,7 +1217,7 @@ static void sub_80E8578(struct RecordMixingHallRecords *dst, void *hallRecords,
for (l = 0; l < 3; l++)
{
if (GetTrainerId(dst->hallRecords2P[j][l].id1) == GetTrainerId(gUnknown_03001168[k]->twoPlayers[j].id1)
- && GetTrainerId(dst->hallRecords2P[j][l].id2) == GetTrainerId(gUnknown_03001168[k]->twoPlayers[j].id2))
+ && GetTrainerId(dst->hallRecords2P[j][l].id2) == GetTrainerId(gUnknown_03001168[k]->twoPlayers[j].id2))
{
var_68++;
if (dst->hallRecords2P[j][l].winStreak < gUnknown_03001168[k]->twoPlayers[j].winStreak)
@@ -1308,21 +1304,21 @@ static void ReceiveRankingHallRecords(struct PlayerHallRecords *hallRecords, siz
Free(largeStructPtr);
}
-static void sub_80E89F8(struct RecordMixingDayCareMail *dst)
+static void GetRecordMixingDaycareMail(struct RecordMixingDaycareMail *dst)
{
- gUnknown_02039F9C.mail[0] = gSaveBlock1Ptr->daycare.mons[0].mail;
- gUnknown_02039F9C.mail[1] = gSaveBlock1Ptr->daycare.mons[1].mail;
- InitDaycareMailRecordMixing(&gSaveBlock1Ptr->daycare, &gUnknown_02039F9C);
- *dst = *gUnknown_03001148;
+ sDaycareMail.mail[0] = gSaveBlock1Ptr->daycare.mons[0].mail;
+ sDaycareMail.mail[1] = gSaveBlock1Ptr->daycare.mons[1].mail;
+ InitDaycareMailRecordMixing(&gSaveBlock1Ptr->daycare, &sDaycareMail);
+ *dst = *sDaycareMailSave;
}
-static void SanitizeDayCareMailForRuby(struct RecordMixingDayCareMail *src)
+static void SanitizeDaycareMailForRuby(struct RecordMixingDaycareMail *src)
{
s32 i;
for (i = 0; i < src->numDaycareMons; i++)
{
- struct DayCareMail *mail = &src->mail[i];
+ struct DaycareMail *mail = &src->mail[i];
if (mail->message.itemId != 0)
{
if (mail->gameLanguage != LANGUAGE_JAPANESE)
@@ -1342,10 +1338,10 @@ static void SanitizeEmeraldBattleTowerRecord(struct EmeraldBattleTowerRecord *ds
{
s32 i;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < MAX_FRONTIER_PARTY_SIZE; i++)
{
struct BattleTowerPokemon *towerMon = &dst->party[i];
- if (towerMon->species != 0)
+ if (towerMon->species != SPECIES_NONE)
StripExtCtrlCodes(towerMon->nickname);
}
diff --git a/src/region_map.c b/src/region_map.c
index bec51ebf0..335323421 100644
--- a/src/region_map.c
+++ b/src/region_map.c
@@ -71,7 +71,7 @@ static EWRAM_DATA struct {
bool8 choseFlyLocation;
} *sFlyMap = NULL;
-static bool32 gUnknown_03001180;
+static bool32 sDrawFlyDestTextWindow;
// Static ROM declarations
@@ -621,7 +621,7 @@ bool8 LoadRegionMapGfx(void)
return TRUE;
}
-void sub_8123030(u16 color, u32 coeff)
+void BlendRegionMap(u16 color, u32 coeff)
{
BlendPalettes(0x380, coeff, color);
CpuCopy16(gPlttBufferFaded + 0x70, gPlttBufferUnfaded + 0x70, 0x60);
@@ -1007,7 +1007,7 @@ static void InitMapBasedOnPlayerLocation(void)
break;
case MAP_TYPE_UNDERGROUND:
case MAP_TYPE_UNKNOWN:
- if (gMapHeader.flags & MAP_ALLOW_ESCAPING)
+ if (gMapHeader.allowEscaping)
{
mapHeader = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->escapeWarp.mapGroup, gSaveBlock1Ptr->escapeWarp.mapNum);
gRegionMap->mapSecId = mapHeader->regionMapSectionId;
@@ -1696,7 +1696,7 @@ void CB2_OpenFlyMap(void)
CreateRegionMapPlayerIcon(1, 1);
sFlyMap->mapSecId = sFlyMap->regionMap.mapSecId;
StringFill(sFlyMap->nameBuffer, CHAR_SPACE, MAP_NAME_LENGTH);
- gUnknown_03001180 = TRUE;
+ sDrawFlyDestTextWindow = TRUE;
DrawFlyDestTextWindow();
gMain.state++;
break;
@@ -1782,30 +1782,32 @@ static void DrawFlyDestTextWindow(void)
name = sMultiNameFlyDestinations[i].name[sFlyMap->regionMap.posWithinMapSec];
AddTextPrinterParameterized(1, 1, name, GetStringRightAlignXOffset(1, name, 96), 17, 0, NULL);
ScheduleBgCopyTilemapToVram(0);
- gUnknown_03001180 = TRUE;
+ sDrawFlyDestTextWindow = TRUE;
}
break;
}
}
if (!namePrinted)
{
- if (gUnknown_03001180 == TRUE)
+ if (sDrawFlyDestTextWindow == TRUE)
{
ClearStdWindowAndFrameToTransparent(1, FALSE);
DrawStdFrameWithCustomTileAndPalette(0, FALSE, 101, 13);
}
else
{
+ // Window is already drawn, just empty it
FillWindowPixelBuffer(0, PIXEL_FILL(1));
}
AddTextPrinterParameterized(0, 1, sFlyMap->regionMap.mapSecName, 0, 1, 0, NULL);
ScheduleBgCopyTilemapToVram(0);
- gUnknown_03001180 = FALSE;
+ sDrawFlyDestTextWindow = FALSE;
}
}
else
{
- if (gUnknown_03001180 == TRUE)
+ // Selection is on MAPSECTYPE_NONE, draw empty fly destination text window
+ if (sDrawFlyDestTextWindow == TRUE)
{
ClearStdWindowAndFrameToTransparent(1, FALSE);
DrawStdFrameWithCustomTileAndPalette(0, FALSE, 101, 13);
@@ -1813,7 +1815,7 @@ static void DrawFlyDestTextWindow(void)
FillWindowPixelBuffer(0, PIXEL_FILL(1));
CopyWindowToVram(0, 2);
ScheduleBgCopyTilemapToVram(0);
- gUnknown_03001180 = FALSE;
+ sDrawFlyDestTextWindow = FALSE;
}
}
diff --git a/src/rotating_gate.c b/src/rotating_gate.c
index 22a0b0bdf..36c23c2a5 100644
--- a/src/rotating_gate.c
+++ b/src/rotating_gate.c
@@ -670,7 +670,8 @@ static void RotatingGate_RotateInDirection(u8 gateId, u32 rotationDirection)
}
else
{
- orientation = ++orientation % GATE_ORIENTATION_MAX;
+ orientation++;
+ orientation = orientation % GATE_ORIENTATION_MAX;
}
RotatingGate_SetGateOrientation(gateId, orientation);
}
diff --git a/src/roulette.c b/src/roulette.c
index f0b484fe8..adde16199 100644
--- a/src/roulette.c
+++ b/src/roulette.c
@@ -275,7 +275,7 @@ struct RouletteTable
struct Taillow taillow;
u16 ballSpeed;
u16 baseTravelDist;
- float var1C;
+ f32 var1C;
};
struct GridSelection
@@ -340,13 +340,13 @@ static EWRAM_DATA struct Roulette
s16 ballTravelDistFast;
u16 ballTravelDistMed;
u16 ballTravelDistSlow;
- float ballAngle;
- float ballAngleSpeed;
- float ballAngleAccel;
- float ballDistToCenter;
- float ballFallSpeed;
- float ballFallAccel;
- float varA0;
+ f32 ballAngle;
+ f32 ballAngleSpeed;
+ f32 ballAngleAccel;
+ f32 ballDistToCenter;
+ f32 ballFallSpeed;
+ f32 ballFallAccel;
+ f32 varA0;
u8 playTaskId;
u8 spinTaskId;
u8 filler_1[2];
@@ -1968,7 +1968,7 @@ static void ExitRoulette(u8 taskId)
gSpecialVar_0x8004 = TRUE;
else
gSpecialVar_0x8004 = FALSE;
- AlertTVOfNewCoinTotal(GetCoins());
+ TryPutFindThatGamerOnAir(GetCoins());
BeginHardwarePaletteFade(0xFF, 0, 0, 16, 0);
gTasks[taskId].func = Task_ExitRoulette;
}
@@ -2896,7 +2896,9 @@ static const union AnimCmd sAnim_CreditDigit[] =
ANIMCMD_FRAME(18, 0), // 9
// BUG: Animation not terminated properly
// Doesn't matter in practice, the frames are set directly and not looped
- //ANIMCMD_END
+#ifdef BUGFIX
+ ANIMCMD_END
+#endif
};
static const union AnimCmd *const sAnims_CreditDigit[] =
@@ -3948,7 +3950,7 @@ static s16 UpdateBallRelativeWheelAngle(struct Sprite *sprite)
static u8 UpdateSlotBelowBall(struct Sprite *sprite)
{
- sRoulette->hitSlot = UpdateBallRelativeWheelAngle(sprite) / (float) DEGREES_PER_SLOT;
+ sRoulette->hitSlot = UpdateBallRelativeWheelAngle(sprite) / (f32)DEGREES_PER_SLOT;
return sRoulette->hitSlot;
}
@@ -4050,7 +4052,7 @@ static void SpriteCB_UnstickBall_ShroomishBallFall(struct Sprite *sprite)
static void SpriteCB_UnstickBall_Shroomish(struct Sprite *sprite)
{
- float slotOffset, ballFallDist, ballFallSpeed;
+ f32 slotOffset, ballFallDist, ballFallSpeed;
UpdateBallPos(sprite);
switch (sprite->sBallAngle)
@@ -4233,7 +4235,7 @@ static void SpriteCB_RollBall_TryLand(struct Sprite *sprite)
}
else // fall left
{
- float temp;
+ f32 temp;
sRoulette->ballAngleSpeed = (temp = sRouletteTables[sRoulette->tableId].var1C) * 2.0f;
slotId = (sRoulette->hitSlot + NUM_ROULETTE_SLOTS - 1) % NUM_ROULETTE_SLOTS;
sRoulette->stuckHitSlot = sRoulette->hitSlot;
@@ -4279,7 +4281,7 @@ static void SpriteCB_RollBall_Slow(struct Sprite *sprite)
{
// Reached slot to land in
sRoulette->ballAngleAccel = 0.0f;
- sRoulette->ballAngleSpeed -= (float)(sRouletteTables[sRoulette->tableId].wheelSpeed)
+ sRoulette->ballAngleSpeed -= (f32)(sRouletteTables[sRoulette->tableId].wheelSpeed)
/ (sRouletteTables[sRoulette->tableId].wheelDelay + 1);
sprite->sState = 4;
sprite->callback = SpriteCB_RollBall_TryLand;
@@ -4304,8 +4306,8 @@ static void SpriteCB_RollBall_Medium(struct Sprite *sprite)
if (sRoulette->ballDistToCenter > 40.0f)
return;
- sRoulette->ballFallSpeed = -(4.0f / (float)(sRoulette->ballTravelDistSlow));
- sRoulette->ballAngleAccel = -(sRoulette->ballAngleSpeed / (float)(sRoulette->ballTravelDistSlow));
+ sRoulette->ballFallSpeed = -(4.0f / (f32)(sRoulette->ballTravelDistSlow));
+ sRoulette->ballAngleAccel = -(sRoulette->ballAngleSpeed / (f32)(sRoulette->ballTravelDistSlow));
sprite->animNum = 2;
sprite->animBeginning = TRUE;
sprite->animEnded = FALSE;
@@ -4320,8 +4322,8 @@ static void SpriteCB_RollBall_Fast(struct Sprite *sprite)
return;
m4aSongNumStartOrChange(SE_ROULETTE_BALL2);
- sRoulette->ballFallSpeed = -(20.0f / (float)(sRoulette->ballTravelDistMed));
- sRoulette->ballAngleAccel = ((1.0f - sRoulette->ballAngleSpeed) / (float)(sRoulette->ballTravelDistMed));
+ sRoulette->ballFallSpeed = -(20.0f / (f32)(sRoulette->ballTravelDistMed));
+ sRoulette->ballAngleAccel = ((1.0f - sRoulette->ballAngleSpeed) / (f32)(sRoulette->ballTravelDistMed));
sprite->animNum = 1;
sprite->animBeginning = TRUE;
sprite->animEnded = FALSE;
@@ -4558,7 +4560,7 @@ static void SpriteCB_ShroomishShakeScreen(struct Sprite *sprite)
static void SpriteCB_ShroomishFall(struct Sprite *sprite)
{
- float timer;
+ f32 timer;
sprite->data[1]++;
timer = sprite->data[1];
sprite->pos2.y = timer * 0.039f * timer;
diff --git a/src/safari_zone.c b/src/safari_zone.c
index 3b86bc464..1f1397656 100644
--- a/src/safari_zone.c
+++ b/src/safari_zone.c
@@ -65,7 +65,7 @@ void EnterSafariMode(void)
void ExitSafariMode(void)
{
- sub_80EE44C(sSafariZoneCaughtMons, sSafariZonePkblkUses);
+ TryPutSafariFanClubOnAir(sSafariZoneCaughtMons, sSafariZonePkblkUses);
ResetSafariZoneFlag();
ClearAllPokeblockFeeders();
gNumSafariBalls = 0;
diff --git a/src/scrcmd.c b/src/scrcmd.c
index 7dc02b6a8..f53483978 100644
--- a/src/scrcmd.c
+++ b/src/scrcmd.c
@@ -1203,6 +1203,8 @@ bool8 ScrCmd_turnvobject(struct ScriptContext *ctx)
return FALSE;
}
+// lockall freezes all object events except the player immediately.
+// The player is frozen after waiting for their current movement to finish.
bool8 ScrCmd_lockall(struct ScriptContext *ctx)
{
if (IsUpdateLinkStateCBActive())
@@ -1211,12 +1213,14 @@ bool8 ScrCmd_lockall(struct ScriptContext *ctx)
}
else
{
- ScriptFreezeObjectEvents();
+ FreezeObjects_WaitForPlayer();
SetupNativeScript(ctx, IsFreezePlayerFinished);
return TRUE;
}
}
+// lock freezes all object events except the player and the selected object immediately.
+// The player and selected object are frozen after waiting for their current movement to finish.
bool8 ScrCmd_lock(struct ScriptContext *ctx)
{
if (IsUpdateLinkStateCBActive())
@@ -1227,12 +1231,12 @@ bool8 ScrCmd_lock(struct ScriptContext *ctx)
{
if (gObjectEvents[gSelectedObjectEvent].active)
{
- LockSelectedObjectEvent();
+ FreezeObjects_WaitForPlayerAndSelected();
SetupNativeScript(ctx, IsFreezeSelectedObjectAndPlayerFinished);
}
else
{
- ScriptFreezeObjectEvents();
+ FreezeObjects_WaitForPlayer();
SetupNativeScript(ctx, IsFreezePlayerFinished);
}
return TRUE;
@@ -1466,15 +1470,15 @@ bool8 ScrCmd_hidemonpic(struct ScriptContext *ctx)
return TRUE;
}
-bool8 ScrCmd_showcontestwinner(struct ScriptContext *ctx)
+bool8 ScrCmd_showcontestpainting(struct ScriptContext *ctx)
{
u8 contestWinnerId = ScriptReadByte(ctx);
- // Don't save artist's painting yet
+ // Artist's painting is temporary and already has its data loaded
if (contestWinnerId != CONTEST_WINNER_ARTIST)
SetContestWinnerForPainting(contestWinnerId);
- ShowContestWinnerPainting();
+ ShowContestPainting();
ScriptContext1_Stop();
return TRUE;
}
diff --git a/src/script_menu.c b/src/script_menu.c
index 51c37b5b6..f3317773a 100644
--- a/src/script_menu.c
+++ b/src/script_menu.c
@@ -279,7 +279,7 @@ bool8 ScriptMenu_MultichoiceGrid(u8 left, u8 top, u8 multichoiceId, bool8 ignore
gTasks[taskId].tWindowId = CreateWindowFromRect(left, top, columnCount * newWidth, rowCount * 2);
SetStandardWindowBorderStyle(gTasks[taskId].tWindowId, 0);
PrintMenuGridTable(gTasks[taskId].tWindowId, newWidth * 8, columnCount, rowCount, sMultichoiceLists[multichoiceId].list);
- sub_8199944(gTasks[taskId].tWindowId, newWidth * 8, columnCount, rowCount, 0);
+ InitMenuActionGrid(gTasks[taskId].tWindowId, newWidth * 8, columnCount, rowCount, 0);
CopyWindowToVram(gTasks[taskId].tWindowId, 3);
return TRUE;
}
diff --git a/src/script_pokemon_util.c b/src/script_pokemon_util.c
index ad1a55230..93a747772 100755
--- a/src/script_pokemon_util.c
+++ b/src/script_pokemon_util.c
@@ -22,7 +22,6 @@
#include "string_util.h"
#include "tv.h"
#include "constants/items.h"
-#include "constants/tv.h"
#include "constants/battle_frontier.h"
static void CB2_ReturnFromChooseHalfParty(void);
diff --git a/src/secret_base.c b/src/secret_base.c
index ddc051dca..e1c62e2f2 100644
--- a/src/secret_base.c
+++ b/src/secret_base.c
@@ -47,7 +47,6 @@
#include "constants/secret_bases.h"
#include "constants/songs.h"
#include "constants/trainers.h"
-#include "constants/tv.h"
// Values for registryStatus
enum {
diff --git a/src/shop.c b/src/shop.c
index dac43c96d..2a30bea22 100755
--- a/src/shop.c
+++ b/src/shop.c
@@ -38,7 +38,6 @@
#include "constants/metatile_behaviors.h"
#include "constants/rgb.h"
#include "constants/songs.h"
-#include "constants/tv.h"
#define TAG_SCROLL_ARROW 2100
#define TAG_ITEM_ICON_BASE 2110
@@ -48,7 +47,7 @@ static EWRAM_DATA struct ShopData *sShopData = NULL;
static EWRAM_DATA struct ListMenuItem *sListMenuItems = NULL;
static EWRAM_DATA u8 (*sItemNames)[16] = {0};
static EWRAM_DATA u8 sPurchaseHistoryId = 0;
-EWRAM_DATA struct ItemSlot gMartPurchaseHistory[3] = {0};
+EWRAM_DATA struct ItemSlot gMartPurchaseHistory[SMARTSHOPPER_NUM_ITEMS] = {0};
static void Task_ShopMenu(u8 taskId);
static void Task_HandleShopMenuQuit(u8 taskId);
@@ -92,7 +91,7 @@ static void Task_ReturnToItemListAfterDecorationPurchase(u8 taskId);
static void Task_HandleShopMenuBuy(u8 taskId);
static void Task_HandleShopMenuSell(u8 taskId);
static void BuyMenuPrintItemDescriptionAndShowItemIcon(s32 item, bool8 onInit, struct ListMenu *list);
-static void BuyMenuPrintPriceInList(u8 windowId, s32 item, u8 y);
+static void BuyMenuPrintPriceInList(u8 windowId, u32 itemId, u8 y);
static const struct YesNoFuncTable sShopPurchaseYesNoFuncs =
{
@@ -373,7 +372,7 @@ static void Task_HandleShopMenuQuit(u8 taskId)
{
ClearStdWindowAndFrameToTransparent(sMartInfo.windowId, 2);
RemoveWindow(sMartInfo.windowId);
- SaveRecordedItemPurchasesForTVShow();
+ TryPutSmartShopperOnAir();
ScriptContext2_Disable();
DestroyTask(taskId);
@@ -553,17 +552,17 @@ static void BuyMenuPrintItemDescriptionAndShowItemIcon(s32 item, bool8 onInit, s
BuyMenuPrint(2, description, 3, 1, 0, 0);
}
-static void BuyMenuPrintPriceInList(u8 windowId, s32 item, u8 y)
+static void BuyMenuPrintPriceInList(u8 windowId, u32 itemId, u8 y)
{
u8 x;
- if (item != LIST_CANCEL)
+ if (itemId != LIST_CANCEL)
{
if (sMartInfo.martType == MART_TYPE_NORMAL)
{
ConvertIntToDecimalStringN(
gStringVar1,
- ItemId_GetPrice(item) >> GetPriceReduction(POKENEWS_SLATEPORT),
+ ItemId_GetPrice(itemId) >> GetPriceReduction(POKENEWS_SLATEPORT),
STR_CONV_MODE_LEFT_ALIGN,
5);
}
@@ -571,7 +570,7 @@ static void BuyMenuPrintPriceInList(u8 windowId, s32 item, u8 y)
{
ConvertIntToDecimalStringN(
gStringVar1,
- gDecorations[item].price,
+ gDecorations[itemId].price,
STR_CONV_MODE_LEFT_ALIGN,
5);
}
diff --git a/src/siirtc.c b/src/siirtc.c
index 5c153a841..5f4fc0a23 100644
--- a/src/siirtc.c
+++ b/src/siirtc.c
@@ -71,6 +71,7 @@ static bool8 sLocked;
static int WriteCommand(u8 value);
static int WriteData(u8 value);
static u8 ReadData();
+
static void EnableGpioPortRead();
static void DisableGpioPortRead();
@@ -98,8 +99,12 @@ u8 SiiRtcProbe(void)
errorCode = 0;
+#ifdef BUGFIX
+ if (!(rtc.status & SIIRTCINFO_24HOUR) || (rtc.status & SIIRTCINFO_POWER))
+#else
if ((rtc.status & (SIIRTCINFO_POWER | SIIRTCINFO_24HOUR)) == SIIRTCINFO_POWER
|| (rtc.status & (SIIRTCINFO_POWER | SIIRTCINFO_24HOUR)) == 0)
+#endif
{
// The RTC is in 12-hour mode. Reset it and switch to 24-hour mode.
@@ -131,7 +136,7 @@ u8 SiiRtcProbe(void)
bool8 SiiRtcReset(void)
{
- u8 result;
+ bool8 result;
struct SiiRtcInfo rtc;
if (sLocked == TRUE)
@@ -392,7 +397,11 @@ static int WriteCommand(u8 value)
GPIO_PORT_DATA = (temp << 1) | SCK_HI | CS_HI;
}
- // control reaches end of non-void function
+ // Nothing uses the returned value from this function,
+ // so the undefined behavior is harmless in the vanilla game.
+#ifdef UBFIX
+ return 0;
+#endif
}
static int WriteData(u8 value)
@@ -409,7 +418,11 @@ static int WriteData(u8 value)
GPIO_PORT_DATA = (temp << 1) | SCK_HI | CS_HI;
}
- // control reaches end of non-void function
+ // Nothing uses the returned value from this function,
+ // so the undefined behavior is harmless in the vanilla game.
+#ifdef UBFIX
+ return 0;
+#endif
}
static u8 ReadData()
@@ -418,6 +431,10 @@ static u8 ReadData()
u8 temp;
u8 value;
+#ifdef UBFIX
+ value = 0;
+#endif
+
for (i = 0; i < 8; i++)
{
GPIO_PORT_DATA = CS_HI;
@@ -428,7 +445,7 @@ static u8 ReadData()
GPIO_PORT_DATA = SCK_HI | CS_HI;
temp = ((GPIO_PORT_DATA & SIO_HI) >> 1);
- value = (value >> 1) | (temp << 7); // UB: accessing uninitialized var
+ value = (value >> 1) | (temp << 7);
}
return value;
@@ -436,10 +453,10 @@ static u8 ReadData()
static void EnableGpioPortRead()
{
- GPIO_PORT_READ_ENABLE = 1;
+ GPIO_PORT_READ_ENABLE = TRUE;
}
static void DisableGpioPortRead()
{
- GPIO_PORT_READ_ENABLE = 0;
+ GPIO_PORT_READ_ENABLE = FALSE;
}
diff --git a/src/slot_machine.c b/src/slot_machine.c
index aa32d5d95..9a3a9ee06 100644
--- a/src/slot_machine.c
+++ b/src/slot_machine.c
@@ -1592,7 +1592,7 @@ static bool8 SlotAction_WaitMsg_NoMoreCoins(struct Task *task)
static bool8 SlotAction_EndGame(struct Task *task)
{
SetCoins(sSlotMachine->coins);
- AlertTVOfNewCoinTotal(GetCoins());
+ TryPutFindThatGamerOnAir(GetCoins());
BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB(0, 0, 0));
sSlotMachine->state++; // SLOT_ACTION_FREE
return FALSE;
diff --git a/src/strings.c b/src/strings.c
index 5c9b09c83..4987e32d2 100644
--- a/src/strings.c
+++ b/src/strings.c
@@ -1,5 +1,6 @@
#include "global.h"
#include "strings.h"
+#include "battle_pyramid_bag.h"
ALIGNED(4)
const u8 gText_ExpandedPlaceholder_Empty[] = _("");
@@ -252,7 +253,7 @@ const u8 gText_ThePokemonList[] = _("the POKéMON LIST");
const u8 gText_TheShop[] = _("the shop");
const u8 gText_ThePC[] = _("the PC");
-const u8 *const gReturnToXStringsTable[] =
+const u8 *const gBagMenu_ReturnToStrings[] =
{
gText_TheField,
gText_TheBattle,
@@ -268,12 +269,12 @@ const u8 *const gReturnToXStringsTable[] =
gText_ThePC
};
-const u8 *const gReturnToXStringsTable2[] =
+const u8 *const gPyramidBagMenu_ReturnToStrings[] =
{
- gText_TheField,
- gText_TheBattle,
- gText_ThePokemonList,
- gText_TheField
+ [PYRAMIDBAG_LOC_FIELD] = gText_TheField,
+ [PYRAMIDBAG_LOC_BATTLE] = gText_TheBattle,
+ [PYRAMIDBAG_LOC_PARTY] = gText_ThePokemonList,
+ [PYRAMIDBAG_LOC_CHOOSE_TOSS] = gText_TheField
};
const u8 gText_ReturnToVar1[] = _("Return to\n{STR_VAR_1}.");
@@ -1228,7 +1229,7 @@ ALIGNED(4) const u8 gText_Facility[] = _("{STR_VAR_1}");
const u8 gText_Give[] = _("Give");
const u8 gText_NoNeed[] = _("No need");
-const u8 gText_ColorLightShadowDarkGrey[] = _("{COLOR LIGHT_GRAY}{SHADOW DARK_GRAY}");
+const u8 gText_ColorLightShadowDarkGray[] = _("{COLOR LIGHT_GRAY}{SHADOW DARK_GRAY}");
const u8 gText_ColorBlue[] = _("{COLOR BLUE}");
const u8 gText_ColorTransparent[] = _("{HIGHLIGHT TRANSPARENT}{COLOR TRANSPARENT}");
const u8 gText_CDot[] = _("C.");
@@ -1238,9 +1239,9 @@ const u8 gText_PreliminaryResults[] = _("The preliminary results!");
const u8 gText_Round2Results[] = _("Round 2 results!");
const u8 gText_ContestantsMonWon[] = _("{STR_VAR_1}'s {STR_VAR_2} won!");
const u8 gText_CommunicationStandby[] = _("Communication standby…");
-const u8 gText_ColorDarkGrey[] = _("{COLOR DARK_GRAY}");
+const u8 gText_ColorDarkGray[] = _("{COLOR DARK_GRAY}");
const u8 gText_ColorDynamic6WhiteDynamic5[] = _("{COLOR_HIGHLIGHT_SHADOW DYNAMIC_COLOR6 WHITE DYNAMIC_COLOR5}"); // Unused
-const u8 gText_HighlightDarkGrey[] = _("{HIGHLIGHT DARK_GRAY}");
+const u8 gText_HighlightDarkGray[] = _("{HIGHLIGHT DARK_GRAY}");
const u8 gText_EmptySpace2[] = _(" "); // Unused
const u8 gText_DynColor2Male[] = _("{COLOR DYNAMIC_COLOR2}♂");
const u8 gText_DynColor1Female[] = _("{COLOR DYNAMIC_COLOR1}♀");
diff --git a/src/trainer_card.c b/src/trainer_card.c
index 03a7b9219..1ec519c90 100755
--- a/src/trainer_card.c
+++ b/src/trainer_card.c
@@ -661,7 +661,7 @@ u32 CountPlayerTrainerStars(void)
stars++;
if (HasAllHoennMons())
stars++;
- if (CountPlayerContestPaintings() > 4)
+ if (CountPlayerMuseumPaintings() >= CONTEST_CATEGORIES_COUNT)
stars++;
if (HasAllFrontierSymbols())
stars++;
@@ -735,7 +735,7 @@ static void SetPlayerCardData(struct TrainerCard *trainerCard, u8 cardType)
case CARD_TYPE_FRLG:
trainerCard->contestsWithFriends = GetCappedGameStat(GAME_STAT_WON_LINK_CONTEST, 999);
trainerCard->pokeblocksWithFriends = GetCappedGameStat(GAME_STAT_POKEBLOCKS_WITH_FRIENDS, 0xFFFF);
- if (CountPlayerContestPaintings() > 4)
+ if (CountPlayerMuseumPaintings() >= CONTEST_CATEGORIES_COUNT)
trainerCard->hasAllPaintings = TRUE;
trainerCard->stars = GetRubyTrainerStars(trainerCard);
break;
diff --git a/src/trainer_hill.c b/src/trainer_hill.c
index 059773a0b..3ce90c430 100644
--- a/src/trainer_hill.c
+++ b/src/trainer_hill.c
@@ -678,10 +678,10 @@ static u16 GetMetatileForFloor(u8 floorId, u32 x, u32 y, u32 stride) // stride i
u16 elevation;
impassable = (sHillData->floors[floorId].display.collisionData[y] >> (15 - x) & 1);
- metatile = sHillData->floors[floorId].display.metatileData[stride * y + x] + 0x200;
- elevation = 0x3000;
+ metatile = sHillData->floors[floorId].display.metatileData[stride * y + x] + NUM_METATILES_IN_PRIMARY;
+ elevation = 3 << METATILE_ELEVATION_SHIFT;
- return (((impassable << 10) & METATILE_COLLISION_MASK) | elevation) | (metatile & METATILE_ID_MASK);
+ return ((impassable << METATILE_COLLISION_SHIFT) & METATILE_COLLISION_MASK) | elevation | (metatile & METATILE_ID_MASK);
}
void GenerateTrainerHillFloorLayout(u16 *mapArg)
@@ -710,6 +710,8 @@ void GenerateTrainerHillFloorLayout(u16 *mapArg)
gBackupMapLayout.width = 31;
gBackupMapLayout.height = 35;
dst = mapArg + 224;
+
+ // First 5 rows of the map (Entrance / Exit) are always the same
for (i = 0; i < 5; i++)
{
for (j = 0; j < 16; j++)
@@ -718,10 +720,11 @@ void GenerateTrainerHillFloorLayout(u16 *mapArg)
src += 16;
}
+ // Load the 16x16 floor-specific layout
for (i = 0; i < 16; i++)
{
for (j = 0; j < 16; j++)
- dst[j] = GetMetatileForFloor(mapId, j, i, 0x10);
+ dst[j] = GetMetatileForFloor(mapId, j, i, 16);
dst += 31;
}
diff --git a/src/trainer_pokemon_sprites.c b/src/trainer_pokemon_sprites.c
index aab4142db..477c11faf 100644
--- a/src/trainer_pokemon_sprites.c
+++ b/src/trainer_pokemon_sprites.c
@@ -137,7 +137,7 @@ static void LoadPicPaletteBySlot(u16 species, u32 otId, u32 personality, u8 pale
static void AssignSpriteAnimsTable(bool8 isTrainer)
{
if (!isTrainer)
- sCreatingSpriteTemplate.anims = gUnknown_082FF70C;
+ sCreatingSpriteTemplate.anims = gAnims_MonPic;
else
sCreatingSpriteTemplate.anims = gTrainerFrontAnimsPtrTable[0];
}
diff --git a/src/tv.c b/src/tv.c
index 95baa0d0e..14a0dc53f 100644
--- a/src/tv.c
+++ b/src/tv.c
@@ -42,18 +42,27 @@
#include "constants/lilycove_lady.h"
#include "constants/maps.h"
#include "constants/metatile_behaviors.h"
+#include "constants/metatile_labels.h"
#include "constants/moves.h"
#include "constants/region_map_sections.h"
#include "constants/script_menu.h"
-#include "constants/tv.h"
-
-// Static type declarations
#define LAST_TVSHOW_IDX (TV_SHOWS_COUNT - 1)
-#define rbernoulli(num, den) TV_BernoulliTrial(0xFFFF * (num) / (den))
+#define rbernoulli(num, den) BernoulliTrial(0xFFFF * (num) / (den))
-// Static RAM declarations
+enum {
+ TVGROUP_NONE,
+ TVGROUP_UNUSED,
+ TVGROUP_NORMAL,
+ TVGROUP_RECORD_MIX,
+ TVGROUP_OUTBREAK,
+};
+
+enum {
+ SLOT_MACHINE,
+ ROULETTE,
+};
s8 sCurTVShowSlot;
u16 sTV_SecretBaseVisitMovesTemp[8];
@@ -68,79 +77,77 @@ static u8 sTVShowMixingNumPlayers;
static u8 sTVShowNewsMixingNumPlayers;
static s8 sTVShowMixingCurSlot;
-EWRAM_DATA u16 sPokemonAnglerSpecies = 0;
-EWRAM_DATA u16 sPokemonAnglerAttemptCounters = 0;
-EWRAM_DATA u16 sFindThatGamerCoinsSpent = 0;
-EWRAM_DATA u8 sFindThatGamerWhichGame = SLOT_MACHINE;
-EWRAM_DATA ALIGNED(4) u8 sRecordMixingPartnersWithoutShowsToShare = 0;
-EWRAM_DATA ALIGNED(4) u8 sTVShowState = 0;
-EWRAM_DATA u8 sTVSecretBaseSecretsRandomValues[3] = {};
-
-// Static ROM declarations
-void ClearPokemonNews(void);
-u8 GetTVChannelByShowType(u8 kind);
-u8 FindFirstActiveTVShowThatIsNotAMassOutbreak(void);
-u8 CheckForBigMovieOrEmergencyNewsOnTV(void);
-void SetTVMetatilesOnMap(int width, int height, u16 tileId);
-u8 FindAnyTVNewsOnTheAir(void);
-bool8 IsTVShowInSearchOfTrainersAiring(void);
-void TakeTVShowInSearchOfTrainersOffTheAir(void);
-bool8 TV_BernoulliTrial(u16 ratio);
-s8 FindEmptyTVSlotBeyondFirstFiveShowsOfArray(TVShow *shows);
-bool8 HasMixableShowAlreadyBeenSpawnedWithPlayerID(u8 kind, bool8 flag);
-void tv_store_id_3x(TVShow *show);
-void DeleteTVShowInArrayByIdx(TVShow *shows, u8 idx);
-s8 FindEmptyTVSlotWithinFirstFiveShowsOfArray(TVShow *shows);
-void FindActiveBroadcastByShowType_SetScriptResult(u8 kind);
+static EWRAM_DATA u16 sPokemonAnglerSpecies = 0;
+static EWRAM_DATA u16 sPokemonAnglerAttemptCounters = 0;
+static EWRAM_DATA u16 sFindThatGamerCoinsSpent = 0;
+static EWRAM_DATA u8 sFindThatGamerWhichGame = SLOT_MACHINE;
+static EWRAM_DATA ALIGNED(4) u8 sRecordMixingPartnersWithoutShowsToShare = 0;
+static EWRAM_DATA ALIGNED(4) u8 sTVShowState = 0;
+static EWRAM_DATA u8 sTVSecretBaseSecretsRandomValues[3] = {};
+
+static void ClearPokeNews(void);
+static u8 GetTVGroupByShowId(u8);
+static u8 FindFirstActiveTVShowThatIsNotAMassOutbreak(void);
+static void SetTVMetatilesOnMap(int, int, u16);
+static u8 FindAnyPokeNewsOnTheAir(void);
+static void TakeGabbyAndTyOffTheAir(void);
+static bool8 BernoulliTrial(u16 ratio);
+static s8 FindFirstEmptyRecordMixTVShowSlot(TVShow *);
+static bool8 IsRecordMixShowAlreadySpawned(u8, bool8);
+static void StorePlayerIdInRecordMixShow(TVShow *);
+static void DeleteTVShowInArrayByIdx(TVShow *, u8);
+static s8 FindFirstEmptyNormalTVShowSlot(TVShow *);
+static void TryReplaceOldTVShowOfKind(u8);
static void InterviewBefore_BravoTrainerPkmnProfile(void);
static void InterviewBefore_NameRater(void);
-u16 TV_GetSomeOtherSpeciesAlreadySeenByPlayer(u16 passedSpecies);
-static void sub_80EFA88(void);
-static void sub_80EF93C(TVShow *shows);
-s8 sub_80EEE30(PokeNews *pokeNews);
-bool8 sub_80EF0E4(u8 newsKind);
-void ClearPokemonNewsI(u8 i);
-static void sub_80F1254(TVShow *shows);
-static void sub_80F12A4(TVShow *shows);
-static void sub_80F0358(TVShow *player1, TVShow *player2, TVShow *player3, TVShow *player4);
-static void sub_80F0C04(void);
-static void sub_80F0708(void);
-static void sub_80F0B64(void);
-static s8 sub_80F06D0(TVShow *tvShows);
-static bool8 sub_80F049C(TVShow *dest[], TVShow *src[], u8 idx);
-static bool8 sub_80F0580(TVShow *tv1, TVShow *tv2, u8 idx);
-static bool8 sub_80F05E8(TVShow *tv1, TVShow *tv2, u8 idx);
-static bool8 sub_80F0668(TVShow *tv1, TVShow *tv2, u8 idx);
-void SetTvShowInactive(u8 showIdx);
-static void sub_80F0B24(u16 species, u8 showIdx);
-static void sub_80F0D60(PokeNews *player1, PokeNews *player2, PokeNews *player3, PokeNews *player4);
-static void sub_80F0EEC(void);
-static void sub_80F0F24(void);
-static s8 sub_80F0ECC(PokeNews *pokeNews, u8 idx);
-static void sub_80F0E58(PokeNews *dest[], PokeNews *src[]);
-static bool8 sub_80F0E84(PokeNews *dest, PokeNews *src, s8 slot);
-void TVShowDone(void);
+static u16 GetRandomDifferentSpeciesSeenByPlayer(u16);
+static void Script_FindFirstEmptyNormalTVShowSlot(void);
+static void CompactTVShowArray(TVShow *);
+static s8 GetFirstEmptyPokeNewsSlot(PokeNews *);
+static bool8 IsAddingPokeNewsDisallowed(u8);
+static void ClearPokeNewsBySlot(u8);
+static void TranslateRubyShows(TVShow *);
+static void TranslateJapaneseEmeraldShows(TVShow *);
+static void SetMixedTVShows(TVShow *, TVShow *, TVShow *, TVShow *);
+static void DeleteExcessMixedShows(void);
+static void DeactivateShowsWithUnseenSpecies(void);
+static void DeactivateGameCompleteShowsIfNotUnlocked(void);
+static s8 FindInactiveShowInArray(TVShow *);
+static bool8 TryMixTVShow(TVShow *[], TVShow *[], u8);
+static bool8 TryMixNormalTVShow(TVShow *, TVShow *, u8);
+static bool8 TryMixRecordMixTVShow(TVShow *, TVShow *, u8);
+static bool8 TryMixOutbreakTVShow(TVShow *, TVShow *, u8);
+static void DeactivateShow(u8 showIdx);
+static void DeactivateShowIfNotSeenSpecies(u16, u8);
+static void SetMixedPokeNews(PokeNews *, PokeNews *, PokeNews *, PokeNews *);
+static void ClearInvalidPokeNews(void);
+static void ClearPokeNewsIfGameNotComplete(void);
+static s8 GetPokeNewsSlotIfActive(PokeNews *, u8);
+static void InitTryMixPokeNewsShow(PokeNews *[], PokeNews *[]);
+static bool8 TryMixPokeNewsShow(PokeNews *, PokeNews *, s8);
+static void TVShowDone(void);
static void InterviewAfter_FanClubLetter(void);
static void InterviewAfter_RecentHappenings(void);
static void InterviewAfter_PkmnFanClubOpinions(void);
-static void InterviewAfter_DummyShow4(void);
+static void InterviewAfter_Dummy(void);
static void InterviewAfter_BravoTrainerPokemonProfile(void);
static void InterviewAfter_BravoTrainerBattleTowerProfile(void);
static void InterviewAfter_ContestLiveUpdates(void);
-void UpdateWorldOfMastersAndPutItOnTheAir(void);
-void PutPokemonTodayFailedOnTheAir(void);
-static void sub_80ED718(void);
-static void sub_80EED88(void);
-void TV_SortPurchasesByQuantity(void);
-static void UpdateMassOutbreakTimeLeft(u16 days);
-static void TryEndMassOutbreak(u16 days);
-static void sub_80EF120(u16 days);
-static void sub_80EDA48(u16 days);
-static void sub_80EEB98(u16 days);
-void PutFishingAdviceShowOnTheAir(void);
-static u8 MonDataIdxToRibbon(u8 monDataIdx);
-static void sub_80EEBF4(u8 actionIdx);
-bool8 IsPriceDiscounted(u8 newsKind);
+static void InitWorldOfMastersShowAttempt(void);
+static void TryPutPokemonTodayFailedOnTheAir(void);
+static void TryStartRandomMassOutbreak(void);
+static void TryPutRandomPokeNewsOnAir(void);
+static void SortPurchasesByQuantity(void);
+static void UpdateMassOutbreakTimeLeft(u16);
+static void TryEndMassOutbreak(u16);
+static void UpdatePokeNewsTimeLeft(u16);
+static void ResolveWorldOfMastersShow(u16);
+static void ResolveNumberOneShow(u16);
+static void TryPutFishingAdviceOnAir(void);
+static u8 MonDataIdxToRibbon(u8);
+static void TryPutNumberOneOnAir(u8);
+static bool8 IsPriceDiscounted(u8);
+static void TryPutWorldOfMastersOnAir(void);
static void InterviewBefore_FanClubLetter(void);
static void InterviewBefore_RecentHappenings(void);
static void InterviewBefore_PkmnFanClubOpinions(void);
@@ -149,7 +156,7 @@ static void InterviewBefore_BravoTrainerBTProfile(void);
static void InterviewBefore_ContestLiveUpdates(void);
static void InterviewBefore_3CheersForPokeblocks(void);
static void InterviewBefore_FanClubSpecial(void);
-void ChangeBoxPokemonNickname_CB(void);
+static void ChangeBoxPokemonNickname_CB(void);
static void DoTVShowPokemonFanClubLetter(void);
static void DoTVShowRecentHappenings(void);
static void DoTVShowPokemonFanClubOpinions(void);
@@ -183,8 +190,6 @@ static void DoTVShowSecretBaseSecrets(void);
static void DoTVShowSafariFanClub(void);
static void DoTVShowLilycoveContestLady(void);
-// .rodata
-
static const struct {
u16 species;
u16 moves[MAX_MON_MOVES];
@@ -331,19 +336,19 @@ static const u8 *const sTVPokemonTodaySuccessfulTextGroup[] = {
};
static const u8 *const sTVTodaysSmartShopperTextGroup[] = {
- gTVTodaysSmartShopperText00,
- gTVTodaysSmartShopperText01,
- gTVTodaysSmartShopperText02,
- gTVTodaysSmartShopperText03,
- gTVTodaysSmartShopperText04,
- gTVTodaysSmartShopperText05,
- gTVTodaysSmartShopperText06,
- gTVTodaysSmartShopperText07,
- gTVTodaysSmartShopperText08,
- gTVTodaysSmartShopperText09,
- gTVTodaysSmartShopperText10,
- gTVTodaysSmartShopperText11,
- gTVTodaysSmartShopperText12
+ [SMARTSHOPPER_STATE_INTRO] = SmartShopper_Text_Intro,
+ [SMARTSHOPPER_STATE_CLERK_NORMAL] = SmartShopper_Text_ClerkNormal,
+ [SMARTSHOPPER_STATE_RAND_COMMENT_1] = SmartShopper_Text_RandomComment1,
+ [SMARTSHOPPER_STATE_RAND_COMMENT_2] = SmartShopper_Text_RandomComment2,
+ [SMARTSHOPPER_STATE_RAND_COMMENT_3] = SmartShopper_Text_RandomComment3,
+ [SMARTSHOPPER_STATE_RAND_COMMENT_4] = SmartShopper_Text_RandomComment4,
+ [SMARTSHOPPER_STATE_SECOND_ITEM] = SmartShopper_Text_SecondItem,
+ [SMARTSHOPPER_STATE_THIRD_ITEM] = SmartShopper_Text_ThirdItem,
+ [SMARTSHOPPER_STATE_DURING_SALE] = SmartShopper_Text_DuringSale,
+ [SMARTSHOPPER_STATE_OUTRO_NORMAL] = SmartShopper_Text_OutroNormal,
+ [SMARTSHOPPER_STATE_IS_VIP] = SmartShopper_Text_IsVIP,
+ [SMARTSHOPPER_STATE_CLERK_MAX] = SmartShopper_Text_ClerkMax,
+ [SMARTSHOPPER_STATE_OUTRO_MAX] = SmartShopper_Text_OutroMax
};
static const u8 *const sTVBravoTrainerTextGroup[] = {
@@ -754,23 +759,18 @@ const u8 sTVSecretBaseSecretsActions[NUM_SECRET_BASE_FLAGS] =
SBSECRETS_NUM_STATES // SECRET_BASE_UNUSED_FLAG. Odd that this is included, if it were used it would overflow sTVSecretBaseSecretsTextGroup
};
-// .text
-
void ClearTVShowData(void)
{
- u8 i;
- u8 j;
+ u8 i, j;
- for (i = 0; i < ARRAY_COUNT(gSaveBlock1Ptr->tvShows); i ++)
+ for (i = 0; i < ARRAY_COUNT(gSaveBlock1Ptr->tvShows); i++)
{
gSaveBlock1Ptr->tvShows[i].commonInit.kind = 0;
gSaveBlock1Ptr->tvShows[i].commonInit.active = 0;
- for (j = 0; j < ARRAY_COUNT(gSaveBlock1Ptr->tvShows[i].commonInit.pad02); j ++)
- {
- gSaveBlock1Ptr->tvShows[i].commonInit.pad02[j] = 0;
- }
+ for (j = 0; j < ARRAY_COUNT(gSaveBlock1Ptr->tvShows[i].commonInit.data); j++)
+ gSaveBlock1Ptr->tvShows[i].commonInit.data[j] = 0;
}
- ClearPokemonNews();
+ ClearPokeNews();
}
u8 GetRandomActiveShowIdx(void)
@@ -780,7 +780,8 @@ u8 GetRandomActiveShowIdx(void)
u8 selIdx;
TVShow *show;
- for (i = 5; i < ARRAY_COUNT(gSaveBlock1Ptr->tvShows) - 1; i ++)
+ // Include all normal TV shows, and up through any present Record Mix shows
+ for (i = NUM_NORMAL_TVSHOW_SLOTS; i < LAST_TVSHOW_IDX; i++)
{
if (gSaveBlock1Ptr->tvShows[i].common.kind == TVSHOW_OFF_AIR)
break;
@@ -789,7 +790,7 @@ u8 GetRandomActiveShowIdx(void)
selIdx = j;
do
{
- if (GetTVChannelByShowType(gSaveBlock1Ptr->tvShows[j].common.kind) != 4)
+ if (GetTVGroupByShowId(gSaveBlock1Ptr->tvShows[j].common.kind) != TVGROUP_OUTBREAK)
{
if (gSaveBlock1Ptr->tvShows[j].common.active == TRUE)
return j;
@@ -804,7 +805,7 @@ u8 GetRandomActiveShowIdx(void)
if (j == 0)
j = ARRAY_COUNT(gSaveBlock1Ptr->tvShows) - 2;
else
- j --;
+ j--;
} while (j != selIdx);
return 0xFF;
@@ -812,88 +813,88 @@ u8 GetRandomActiveShowIdx(void)
u8 FindAnyTVShowOnTheAir(void)
{
- u8 show;
-
- show = GetRandomActiveShowIdx();
- if (show == 0xFF)
- {
+ u8 slot = GetRandomActiveShowIdx();
+ if (slot == 0xFF)
return 0xFF;
- }
- if (gSaveBlock1Ptr->outbreakPokemonSpecies != SPECIES_NONE && gSaveBlock1Ptr->tvShows[show].common.kind == TVSHOW_MASS_OUTBREAK)
- {
+
+ if (gSaveBlock1Ptr->outbreakPokemonSpecies != SPECIES_NONE
+ && gSaveBlock1Ptr->tvShows[slot].common.kind == TVSHOW_MASS_OUTBREAK)
return FindFirstActiveTVShowThatIsNotAMassOutbreak();
- }
- return show;
+
+ return slot;
}
void UpdateTVScreensOnMap(int width, int height)
{
FlagSet(FLAG_SYS_TV_WATCH);
- switch (CheckForBigMovieOrEmergencyNewsOnTV())
+ switch (CheckForPlayersHouseNews())
{
- case 1:
- SetTVMetatilesOnMap(width, height, 0x3);
- break;
- case 2:
- break;
- default:
- if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(LILYCOVE_CITY_COVE_LILY_MOTEL_1F) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(LILYCOVE_CITY_COVE_LILY_MOTEL_1F))
- {
- SetTVMetatilesOnMap(width, height, 0x3);
- }
- else if (FlagGet(FLAG_SYS_TV_START) && (FindAnyTVShowOnTheAir() != 0xFF || FindAnyTVNewsOnTheAir() != 0xFF || IsTVShowInSearchOfTrainersAiring()))
- {
- FlagClear(FLAG_SYS_TV_WATCH);
- SetTVMetatilesOnMap(width, height, 0x3);
- }
- break;
+ case PLAYERS_HOUSE_TV_LATI:
+ SetTVMetatilesOnMap(width, height, METATILE_Building_TV_On);
+ break;
+ case PLAYERS_HOUSE_TV_MOVIE:
+ // Don't flash TV for movie text in player's house
+ break;
+// case PLAYERS_HOUSE_TV_NONE:
+ default:
+ if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(LILYCOVE_CITY_COVE_LILY_MOTEL_1F)
+ && gSaveBlock1Ptr->location.mapNum == MAP_NUM(LILYCOVE_CITY_COVE_LILY_MOTEL_1F))
+ {
+ // NPC in Lilycove Hotel is always watching TV
+ SetTVMetatilesOnMap(width, height, METATILE_Building_TV_On);
+ }
+ else if (FlagGet(FLAG_SYS_TV_START) && (FindAnyTVShowOnTheAir() != 0xFF || FindAnyPokeNewsOnTheAir() != 0xFF || IsGabbyAndTyShowOnTheAir()))
+ {
+ FlagClear(FLAG_SYS_TV_WATCH);
+ SetTVMetatilesOnMap(width, height, METATILE_Building_TV_On);
+ }
+ break;
}
}
-void SetTVMetatilesOnMap(int width, int height, u16 tileId)
+static void SetTVMetatilesOnMap(int width, int height, u16 tileId)
{
int x;
int y;
- for (y = 0; y < height; y ++)
+ for (y = 0; y < height; y++)
{
- for (x = 0; x < width; x ++)
+ for (x = 0; x < width; x++)
{
if (MapGridGetMetatileBehaviorAt(x, y) == MB_TELEVISION)
- {
MapGridSetMetatileIdAt(x, y, tileId | METATILE_COLLISION_MASK);
- }
}
}
}
void TurnOffTVScreen(void)
{
- SetTVMetatilesOnMap(gBackupMapLayout.width, gBackupMapLayout.height, 0x0002);
+ SetTVMetatilesOnMap(gBackupMapLayout.width, gBackupMapLayout.height, METATILE_Building_TV_Off);
DrawWholeMapView();
}
void TurnOnTVScreen(void)
{
- SetTVMetatilesOnMap(gBackupMapLayout.width, gBackupMapLayout.height, 0x0003);
+ SetTVMetatilesOnMap(gBackupMapLayout.width, gBackupMapLayout.height, METATILE_Building_TV_On);
DrawWholeMapView();
}
+// gSpecialVar_0x8004 here is set from GetRandomActiveShowIdx in EventScript_TryDoTVShow
u8 GetSelectedTVShow(void)
{
return gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004].common.kind;
}
-u8 FindFirstActiveTVShowThatIsNotAMassOutbreak(void)
+static u8 FindFirstActiveTVShowThatIsNotAMassOutbreak(void)
{
u8 i;
- for (i = 0; i < ARRAY_COUNT(gSaveBlock1Ptr->tvShows) - 1; i ++)
+ for (i = 0; i < ARRAY_COUNT(gSaveBlock1Ptr->tvShows) - 1; i++)
{
- if (gSaveBlock1Ptr->tvShows[i].common.kind != TVSHOW_OFF_AIR && gSaveBlock1Ptr->tvShows[i].common.kind != TVSHOW_MASS_OUTBREAK && gSaveBlock1Ptr->tvShows[i].common.active == TRUE)
- {
+ if (gSaveBlock1Ptr->tvShows[i].common.kind != TVSHOW_OFF_AIR
+ && gSaveBlock1Ptr->tvShows[i].common.kind != TVSHOW_MASS_OUTBREAK
+ && gSaveBlock1Ptr->tvShows[i].common.active == TRUE)
return i;
- }
}
return 0xFF;
}
@@ -904,9 +905,8 @@ u8 GetNextActiveShowIfMassOutbreak(void)
tvShow = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
if (tvShow->common.kind == TVSHOW_MASS_OUTBREAK && gSaveBlock1Ptr->outbreakPokemonSpecies != SPECIES_NONE)
- {
return FindFirstActiveTVShowThatIsNotAMassOutbreak();
- }
+
return gSpecialVar_0x8004;
}
@@ -942,28 +942,23 @@ void GabbyAndTyBeforeInterview(void)
gSaveBlock1Ptr->gabbyAndTyData.lastMove = gBattleResults.lastUsedMovePlayer;
if (gSaveBlock1Ptr->gabbyAndTyData.battleNum != 0xFF)
{
- gSaveBlock1Ptr->gabbyAndTyData.battleNum ++;
+ gSaveBlock1Ptr->gabbyAndTyData.battleNum++;
}
gSaveBlock1Ptr->gabbyAndTyData.battleTookMoreThanOneTurn = gBattleResults.playerMonWasDamaged;
+
if (gBattleResults.playerFaintCounter != 0)
- {
gSaveBlock1Ptr->gabbyAndTyData.playerLostAMon = TRUE;
- }
else
- {
gSaveBlock1Ptr->gabbyAndTyData.playerLostAMon = FALSE;
- }
+
if (gBattleResults.numHealingItemsUsed != 0)
- {
gSaveBlock1Ptr->gabbyAndTyData.playerUsedHealingItem = TRUE;
- }
else
- {
gSaveBlock1Ptr->gabbyAndTyData.playerUsedHealingItem = FALSE;
- }
+
if (!gBattleResults.usedMasterBall)
{
- for (i = 0; i < POKEBALL_COUNT - 1; i ++)
+ for (i = 0; i < POKEBALL_COUNT - 1; i++)
{
if (gBattleResults.catchAttempts[i])
{
@@ -974,9 +969,11 @@ void GabbyAndTyBeforeInterview(void)
}
else
{
+ // Player threw a Master Ball at Gabby and Ty
gSaveBlock1Ptr->gabbyAndTyData.playerThrewABall = TRUE;
}
- TakeTVShowInSearchOfTrainersOffTheAir();
+
+ TakeGabbyAndTyOffTheAir();
if (gSaveBlock1Ptr->gabbyAndTyData.lastMove == MOVE_NONE)
{
FlagSet(FLAG_TEMP_1);
@@ -994,7 +991,7 @@ void GabbyAndTyAfterInterview(void)
IncrementGameStat(GAME_STAT_GOT_INTERVIEWED);
}
-void TakeTVShowInSearchOfTrainersOffTheAir(void)
+static void TakeGabbyAndTyOffTheAir(void)
{
gSaveBlock1Ptr->gabbyAndTyData.onAir = FALSE;
}
@@ -1002,13 +999,12 @@ void TakeTVShowInSearchOfTrainersOffTheAir(void)
u8 GabbyAndTyGetBattleNum(void)
{
if (gSaveBlock1Ptr->gabbyAndTyData.battleNum > 5)
- {
return (gSaveBlock1Ptr->gabbyAndTyData.battleNum % 3) + 6;
- }
+
return gSaveBlock1Ptr->gabbyAndTyData.battleNum;
}
-bool8 IsTVShowInSearchOfTrainersAiring(void)
+bool8 IsGabbyAndTyShowOnTheAir(void)
{
return gSaveBlock1Ptr->gabbyAndTyData.onAir;
}
@@ -1027,60 +1023,56 @@ bool8 GabbyAndTyGetLastQuote(void)
u8 GabbyAndTyGetLastBattleTrivia(void)
{
if (!gSaveBlock1Ptr->gabbyAndTyData.battleTookMoreThanOneTurn2)
- {
return 1;
- }
+
if (gSaveBlock1Ptr->gabbyAndTyData.playerThrewABall2)
- {
return 2;
- }
+
if (gSaveBlock1Ptr->gabbyAndTyData.playerUsedHealingItem2)
- {
return 3;
- }
+
if (gSaveBlock1Ptr->gabbyAndTyData.playerLostAMon2)
- {
return 4;
- }
+
return 0;
}
-void GabbyAndTySetScriptVarsToObjectEventLocalIds(void)
+void GetGabbyAndTyLocalIds(void)
{
switch (GabbyAndTyGetBattleNum())
{
- case 1:
- gSpecialVar_0x8004 = 14;
- gSpecialVar_0x8005 = 13;
- break;
- case 2:
- gSpecialVar_0x8004 = 5;
- gSpecialVar_0x8005 = 6;
- break;
- case 3:
- gSpecialVar_0x8004 = 18;
- gSpecialVar_0x8005 = 17;
- break;
- case 4:
- gSpecialVar_0x8004 = 21;
- gSpecialVar_0x8005 = 22;
- break;
- case 5:
- gSpecialVar_0x8004 = 8;
- gSpecialVar_0x8005 = 9;
- break;
- case 6:
- gSpecialVar_0x8004 = 19;
- gSpecialVar_0x8005 = 20;
- break;
- case 7:
- gSpecialVar_0x8004 = 23;
- gSpecialVar_0x8005 = 24;
- break;
- case 8:
- gSpecialVar_0x8004 = 10;
- gSpecialVar_0x8005 = 11;
- break;
+ case 1:
+ gSpecialVar_0x8004 = 14;
+ gSpecialVar_0x8005 = 13;
+ break;
+ case 2:
+ gSpecialVar_0x8004 = 5;
+ gSpecialVar_0x8005 = 6;
+ break;
+ case 3:
+ gSpecialVar_0x8004 = 18;
+ gSpecialVar_0x8005 = 17;
+ break;
+ case 4:
+ gSpecialVar_0x8004 = 21;
+ gSpecialVar_0x8005 = 22;
+ break;
+ case 5:
+ gSpecialVar_0x8004 = 8;
+ gSpecialVar_0x8005 = 9;
+ break;
+ case 6:
+ gSpecialVar_0x8004 = 19;
+ gSpecialVar_0x8005 = 20;
+ break;
+ case 7:
+ gSpecialVar_0x8004 = 23;
+ gSpecialVar_0x8005 = 24;
+ break;
+ case 8:
+ gSpecialVar_0x8004 = 10;
+ gSpecialVar_0x8005 = 11;
+ break;
}
}
@@ -1088,88 +1080,85 @@ void InterviewAfter(void)
{
switch (gSpecialVar_0x8005)
{
- case TVSHOW_FAN_CLUB_LETTER:
- InterviewAfter_FanClubLetter();
- break;
- case TVSHOW_RECENT_HAPPENINGS:
- InterviewAfter_RecentHappenings();
- break;
- case TVSHOW_PKMN_FAN_CLUB_OPINIONS:
- InterviewAfter_PkmnFanClubOpinions();
- break;
- case TVSHOW_UNKN_SHOWTYPE_04:
- InterviewAfter_DummyShow4();
- break;
- case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE:
- InterviewAfter_BravoTrainerPokemonProfile();
- break;
- case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE:
- InterviewAfter_BravoTrainerBattleTowerProfile();
- break;
- case TVSHOW_CONTEST_LIVE_UPDATES:
- InterviewAfter_ContestLiveUpdates();
- break;
+ case TVSHOW_FAN_CLUB_LETTER:
+ InterviewAfter_FanClubLetter();
+ break;
+ case TVSHOW_RECENT_HAPPENINGS:
+ InterviewAfter_RecentHappenings();
+ break;
+ case TVSHOW_PKMN_FAN_CLUB_OPINIONS:
+ InterviewAfter_PkmnFanClubOpinions();
+ break;
+ case TVSHOW_DUMMY:
+ InterviewAfter_Dummy();
+ break;
+ case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE:
+ InterviewAfter_BravoTrainerPokemonProfile();
+ break;
+ case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE:
+ InterviewAfter_BravoTrainerBattleTowerProfile();
+ break;
+ case TVSHOW_CONTEST_LIVE_UPDATES:
+ InterviewAfter_ContestLiveUpdates();
+ break;
}
}
-void PutPokemonTodayCaughtOnAir(void)
+void TryPutPokemonTodayOnAir(void)
{
u8 i;
- u16 ct;
+ u16 ballsUsed;
TVShow *show;
u32 language2;
u16 itemLastUsed;
- ct = 0;
- sub_80EED88();
- sub_80ED718();
+ ballsUsed = 0;
+ TryPutRandomPokeNewsOnAir();
+ TryStartRandomMassOutbreak();
+
+ // Try either the Failed or Caught version of the show
if (gBattleResults.caughtMonSpecies == SPECIES_NONE)
{
- PutPokemonTodayFailedOnTheAir();
+ TryPutPokemonTodayFailedOnTheAir();
}
else
{
- UpdateWorldOfMastersAndPutItOnTheAir();
+ InitWorldOfMastersShowAttempt();
if (!rbernoulli(1, 1) && StringCompare(gSpeciesNames[gBattleResults.caughtMonSpecies], gBattleResults.caughtMonNick))
{
- sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
- if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_POKEMON_TODAY_CAUGHT, FALSE) != TRUE)
+ sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1 && IsRecordMixShowAlreadySpawned(TVSHOW_POKEMON_TODAY_CAUGHT, FALSE) != TRUE)
{
- for (i = 0; i < POKEBALL_COUNT - 1; i ++)
- {
- ct += gBattleResults.catchAttempts[i];
- }
- if (ct != 0 || gBattleResults.usedMasterBall)
+ for (i = 0; i < POKEBALL_COUNT - 1; i++)
+ ballsUsed += gBattleResults.catchAttempts[i];
+
+ if (ballsUsed != 0 || gBattleResults.usedMasterBall)
{
- ct = 0;
+ ballsUsed = 0;
show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
show->pokemonToday.kind = TVSHOW_POKEMON_TODAY_CAUGHT;
- show->pokemonToday.active = FALSE;
+ show->pokemonToday.active = FALSE; // NOTE: Show is not active until passed via Record Mix.
if (gBattleResults.usedMasterBall)
{
- ct = 1;
+ ballsUsed = 1;
itemLastUsed = ITEM_MASTER_BALL;
}
else
{
- for (i = 0; i < POKEBALL_COUNT - 1; i ++)
- {
- ct += gBattleResults.catchAttempts[i];
- }
- if (ct > 0xFF)
- {
- ct = 0xFF;
- }
+ for (i = 0; i < POKEBALL_COUNT - 1; i++)
+ ballsUsed += gBattleResults.catchAttempts[i];
+ if (ballsUsed > 255)
+ ballsUsed = 255;
itemLastUsed = gLastUsedItem;
}
- show->pokemonToday.nBallsUsed = ct;
+ show->pokemonToday.nBallsUsed = ballsUsed;
show->pokemonToday.ball = itemLastUsed;
StringCopy(show->pokemonToday.playerName, gSaveBlock2Ptr->playerName);
StringCopy(show->pokemonToday.nickname, gBattleResults.caughtMonNick);
language2 = sub_81DB604(show->pokemonToday.nickname);
StripExtCtrlCodes(show->pokemonToday.nickname);
show->pokemonToday.species = gBattleResults.caughtMonSpecies;
- tv_store_id_3x(show);
+ StorePlayerIdInRecordMixShow(show);
show->pokemonToday.language = gGameLanguage;
show->pokemonToday.language2 = language2;
}
@@ -1178,65 +1167,60 @@ void PutPokemonTodayCaughtOnAir(void)
}
}
-void UpdateWorldOfMastersAndPutItOnTheAir(void)
+// Show is initialized in last slot and updated there until it's
+// either triggered or deleted at the end of the day by ResolveWorldOfMastersShow
+static void InitWorldOfMastersShowAttempt(void)
{
- TVShow *show;
-
- show = &gSaveBlock1Ptr->tvShows[LAST_TVSHOW_IDX];
- if (show->worldOfMasters.kind != TVSHOW_WORLD_OF_MASTERS)
+ TVShow *show = &gSaveBlock1Ptr->tvShows[LAST_TVSHOW_IDX];
+ if (show->common.kind != TVSHOW_WORLD_OF_MASTERS)
{
DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, LAST_TVSHOW_IDX);
show->worldOfMasters.steps = GetGameStat(GAME_STAT_STEPS);
show->worldOfMasters.kind = TVSHOW_WORLD_OF_MASTERS;
}
- show->worldOfMasters.numPokeCaught ++;
+ show->worldOfMasters.numPokeCaught++;
show->worldOfMasters.caughtPoke = gBattleResults.caughtMonSpecies;
show->worldOfMasters.species = gBattleResults.playerMon1Species;
show->worldOfMasters.location = gMapHeader.regionMapSectionId;
}
-void PutPokemonTodayFailedOnTheAir(void)
+static void TryPutPokemonTodayFailedOnTheAir(void)
{
- u16 ct;
+ u16 ballsUsed;
u8 i;
TVShow *show;
if (!rbernoulli(1, 1))
{
- for (i = 0, ct = 0; i < POKEBALL_COUNT - 1; i ++)
- {
- ct += gBattleResults.catchAttempts[i];
- }
- if (ct > 0xFF)
- {
- ct = 0xFF;
- }
- if (ct > 2 && (gBattleOutcome == B_OUTCOME_MON_FLED || gBattleOutcome == B_OUTCOME_WON))
+ for (i = 0, ballsUsed = 0; i < POKEBALL_COUNT - 1; i++)
+ ballsUsed += gBattleResults.catchAttempts[i];
+ if (ballsUsed > 255)
+ ballsUsed = 255;
+
+ if (ballsUsed > 2 && (gBattleOutcome == B_OUTCOME_MON_FLED || gBattleOutcome == B_OUTCOME_WON))
{
- sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
- if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_POKEMON_TODAY_FAILED, FALSE) != TRUE)
+ sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1 && IsRecordMixShowAlreadySpawned(TVSHOW_POKEMON_TODAY_FAILED, FALSE) != TRUE)
{
show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
show->pokemonTodayFailed.kind = TVSHOW_POKEMON_TODAY_FAILED;
- show->pokemonTodayFailed.active = FALSE;
+ show->pokemonTodayFailed.active = FALSE; // NOTE: Show is not active until passed via Record Mix.
show->pokemonTodayFailed.species = gBattleResults.playerMon1Species;
show->pokemonTodayFailed.species2 = gBattleResults.lastOpponentSpecies;
- show->pokemonTodayFailed.nBallsUsed = ct;
+ show->pokemonTodayFailed.nBallsUsed = ballsUsed;
show->pokemonTodayFailed.outcome = gBattleOutcome;
show->pokemonTodayFailed.location = gMapHeader.regionMapSectionId;
StringCopy(show->pokemonTodayFailed.playerName, gSaveBlock2Ptr->playerName);
- tv_store_id_3x(show);
+ StorePlayerIdInRecordMixShow(show);
show->pokemonTodayFailed.language = gGameLanguage;
}
}
}
}
-void tv_store_id_3x(TVShow *show)
+static void StorePlayerIdInRecordMixShow(TVShow *show)
{
- u32 id;
-
- id = GetPlayerIDAsU32();
+ u32 id = GetPlayerIDAsU32();
show->common.srcTrainerId2Lo = id;
show->common.srcTrainerId2Hi = id >> 8;
show->common.srcTrainerIdLo = id;
@@ -1245,11 +1229,9 @@ void tv_store_id_3x(TVShow *show)
show->common.trainerIdHi = id >> 8;
}
-void tv_store_id_2x(TVShow *show)
+static void StorePlayerIdInNormalShow(TVShow *show)
{
- u32 id;
-
- id = GetPlayerIDAsU32();
+ u32 id = GetPlayerIDAsU32();
show->common.srcTrainerIdLo = id;
show->common.srcTrainerIdHi = id >> 8;
show->common.trainerIdLo = id;
@@ -1277,7 +1259,7 @@ static void InterviewAfter_ContestLiveUpdates(void)
show2->contestLiveUpdates.move = show->contestLiveUpdates.move;
show2->contestLiveUpdates.winnerAppealFlag = show->contestLiveUpdates.winnerAppealFlag;
StringCopy(show2->contestLiveUpdates.losingTrainerName, show->contestLiveUpdates.losingTrainerName);
- tv_store_id_2x(show2);
+ StorePlayerIdInNormalShow(show2);
show2->contestLiveUpdates.winningTrainerLanguage = gGameLanguage;
show2->contestLiveUpdates.losingTrainerLanguage = show->contestLiveUpdates.losingTrainerLanguage;
DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, LAST_TVSHOW_IDX);
@@ -1289,44 +1271,36 @@ void PutBattleUpdateOnTheAir(u8 opponentLinkPlayerId, u16 move, u16 speciesPlaye
TVShow *show;
u8 name[32];
- sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ sCurTVShowSlot = FindFirstEmptyNormalTVShowSlot(gSaveBlock1Ptr->tvShows);
if (sCurTVShowSlot != -1)
{
- FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_BATTLE_UPDATE);
- if (gSpecialVar_Result != 1)
+ TryReplaceOldTVShowOfKind(TVSHOW_BATTLE_UPDATE);
+ if (gSpecialVar_Result != TRUE)
{
show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
show->battleUpdate.kind = TVSHOW_BATTLE_UPDATE;
show->battleUpdate.active = TRUE;
StringCopy(show->battleUpdate.playerName, gSaveBlock2Ptr->playerName);
+
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
- {
show->battleUpdate.battleType = 2;
- }
else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
- {
show->battleUpdate.battleType = 1;
- }
else
- {
show->battleUpdate.battleType = 0;
- }
+
show->battleUpdate.move = move;
show->battleUpdate.speciesPlayer = speciesPlayer;
show->battleUpdate.speciesOpponent = speciesOpponent;
StringCopy(name, gLinkPlayers[opponentLinkPlayerId].name);
StripExtCtrlCodes(name);
StringCopy(show->battleUpdate.linkOpponentName, name);
- tv_store_id_2x(show);
+ StorePlayerIdInNormalShow(show);
show->battleUpdate.language = gGameLanguage;
if (show->battleUpdate.language == LANGUAGE_JAPANESE || gLinkPlayers[opponentLinkPlayerId].language == LANGUAGE_JAPANESE)
- {
show->battleUpdate.linkOpponentLanguage = LANGUAGE_JAPANESE;
- }
else
- {
show->battleUpdate.linkOpponentLanguage = gLinkPlayers[opponentLinkPlayerId].language;
- }
}
}
}
@@ -1336,16 +1310,14 @@ bool8 Put3CheersForPokeblocksOnTheAir(const u8 *partnersName, u8 flavor, u8 colo
TVShow *show;
u8 name[32];
- sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ sCurTVShowSlot = FindFirstEmptyNormalTVShowSlot(gSaveBlock1Ptr->tvShows);
if (sCurTVShowSlot == -1)
- {
return FALSE;
- }
- FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_3_CHEERS_FOR_POKEBLOCKS);
- if (gSpecialVar_Result == 1)
- {
- return FALSE;
- }
+
+ TryReplaceOldTVShowOfKind(TVSHOW_3_CHEERS_FOR_POKEBLOCKS);
+ if (gSpecialVar_Result == TRUE)
+ return FALSE; // Old show is still active
+
show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
show->threeCheers.kind = TVSHOW_3_CHEERS_FOR_POKEBLOCKS;
show->threeCheers.active = TRUE;
@@ -1356,16 +1328,12 @@ bool8 Put3CheersForPokeblocksOnTheAir(const u8 *partnersName, u8 flavor, u8 colo
show->threeCheers.flavor = flavor;
show->threeCheers.color = color;
show->threeCheers.sheen = sheen;
- tv_store_id_2x(show);
+ StorePlayerIdInNormalShow(show);
show->threeCheers.language = gGameLanguage;
if (show->threeCheers.language == LANGUAGE_JAPANESE || language == LANGUAGE_JAPANESE)
- {
show->threeCheers.worstBlenderLanguage = LANGUAGE_JAPANESE;
- }
else
- {
show->threeCheers.worstBlenderLanguage = language;
- }
return TRUE;
}
@@ -1386,16 +1354,12 @@ void PutFanClubSpecialOnTheAir(void)
StringCopy(name, gStringVar1);
StripExtCtrlCodes(name);
StringCopy(show->fanClubSpecial.idolName, name);
- tv_store_id_2x(show);
+ StorePlayerIdInNormalShow(show);
show->fanClubSpecial.language = gGameLanguage;
if (show->fanClubSpecial.language == LANGUAGE_JAPANESE || gSaveBlock1Ptr->linkBattleRecords.languages[0] == LANGUAGE_JAPANESE)
- {
show->fanClubSpecial.idolNameLanguage = LANGUAGE_JAPANESE;
- }
else
- {
show->fanClubSpecial.idolNameLanguage = gSaveBlock1Ptr->linkBattleRecords.languages[0];
- }
}
void ContestLiveUpdates_Init(u8 round1Placing)
@@ -1403,7 +1367,7 @@ void ContestLiveUpdates_Init(u8 round1Placing)
TVShow *show;
DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, LAST_TVSHOW_IDX);
- sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ sCurTVShowSlot = FindFirstEmptyNormalTVShowSlot(gSaveBlock1Ptr->tvShows);
if (sCurTVShowSlot != -1)
{
show = &gSaveBlock1Ptr->tvShows[LAST_TVSHOW_IDX];
@@ -1414,64 +1378,45 @@ void ContestLiveUpdates_Init(u8 round1Placing)
void ContestLiveUpdates_SetRound2Placing(u8 round2Placing)
{
- TVShow *show;
-
- show = &gSaveBlock1Ptr->tvShows[LAST_TVSHOW_IDX];
- sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ TVShow *show = &gSaveBlock1Ptr->tvShows[LAST_TVSHOW_IDX];
+ sCurTVShowSlot = FindFirstEmptyNormalTVShowSlot(gSaveBlock1Ptr->tvShows);
if (sCurTVShowSlot != -1)
- {
show->contestLiveUpdates.round2Placing = round2Placing;
- }
}
void ContestLiveUpdates_SetWinnerAppealFlag(u8 flag)
{
- TVShow *show;
-
- show = &gSaveBlock1Ptr->tvShows[LAST_TVSHOW_IDX];
- sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ TVShow *show = &gSaveBlock1Ptr->tvShows[LAST_TVSHOW_IDX];
+ sCurTVShowSlot = FindFirstEmptyNormalTVShowSlot(gSaveBlock1Ptr->tvShows);
if (sCurTVShowSlot != -1)
- {
show->contestLiveUpdates.winnerAppealFlag = flag;
- }
}
void ContestLiveUpdates_SetWinnerMoveUsed(u16 move)
{
- TVShow *show;
-
- show = &gSaveBlock1Ptr->tvShows[LAST_TVSHOW_IDX];
- sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ TVShow *show = &gSaveBlock1Ptr->tvShows[LAST_TVSHOW_IDX];
+ sCurTVShowSlot = FindFirstEmptyNormalTVShowSlot(gSaveBlock1Ptr->tvShows);
if (sCurTVShowSlot != -1)
- {
show->contestLiveUpdates.move = move;
- }
}
void ContestLiveUpdates_SetLoserData(u8 flag, u8 loser)
{
- TVShow *show;
-
- show = &gSaveBlock1Ptr->tvShows[LAST_TVSHOW_IDX];
- sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ TVShow *show = &gSaveBlock1Ptr->tvShows[LAST_TVSHOW_IDX];
+ sCurTVShowSlot = FindFirstEmptyNormalTVShowSlot(gSaveBlock1Ptr->tvShows);
if (sCurTVShowSlot != -1)
{
show->contestLiveUpdates.losingSpecies = gContestMons[loser].species;
StringCopy(show->contestLiveUpdates.losingTrainerName, gContestMons[loser].trainerName);
StripExtCtrlCodes(show->contestLiveUpdates.losingTrainerName);
show->contestLiveUpdates.loserAppealFlag = flag;
+
if (loser + 1 > gNumLinkContestPlayers)
- {
show->contestLiveUpdates.losingTrainerLanguage = gLinkPlayers[0].language;
- }
else if (gGameLanguage == LANGUAGE_JAPANESE || gLinkPlayers[loser].language == LANGUAGE_JAPANESE)
- {
show->contestLiveUpdates.losingTrainerLanguage = LANGUAGE_JAPANESE;
- }
else
- {
show->contestLiveUpdates.losingTrainerLanguage = gLinkPlayers[loser].language;
- }
}
}
@@ -1494,27 +1439,21 @@ static void InterviewAfter_BravoTrainerPokemonProfile(void)
show2->bravoTrainer.move = show->bravoTrainer.move;
show2->bravoTrainer.contestResult = show->bravoTrainer.contestResult;
show2->bravoTrainer.contestCategory = show->bravoTrainer.contestCategory;
- tv_store_id_2x(show2);
+ StorePlayerIdInNormalShow(show2);
show2->bravoTrainer.language = gGameLanguage;
if (show2->bravoTrainer.language == LANGUAGE_JAPANESE || show->bravoTrainer.pokemonNameLanguage == LANGUAGE_JAPANESE)
- {
show2->bravoTrainer.pokemonNameLanguage = LANGUAGE_JAPANESE;
- }
else
- {
show2->bravoTrainer.pokemonNameLanguage = show->bravoTrainer.pokemonNameLanguage;
- }
DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, LAST_TVSHOW_IDX);
}
}
void BravoTrainerPokemonProfile_BeforeInterview1(u16 a0)
{
- TVShow *show;
-
- show = &gSaveBlock1Ptr->tvShows[LAST_TVSHOW_IDX];
+ TVShow *show = &gSaveBlock1Ptr->tvShows[LAST_TVSHOW_IDX];
InterviewBefore_BravoTrainerPkmnProfile();
- sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ sCurTVShowSlot = FindFirstEmptyNormalTVShowSlot(gSaveBlock1Ptr->tvShows);
if (sCurTVShowSlot != -1)
{
DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, LAST_TVSHOW_IDX);
@@ -1525,10 +1464,8 @@ void BravoTrainerPokemonProfile_BeforeInterview1(u16 a0)
void BravoTrainerPokemonProfile_BeforeInterview2(u8 contestStandingPlace)
{
- TVShow *show;
-
- show = &gSaveBlock1Ptr->tvShows[LAST_TVSHOW_IDX];
- sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ TVShow *show = &gSaveBlock1Ptr->tvShows[LAST_TVSHOW_IDX];
+ sCurTVShowSlot = FindFirstEmptyNormalTVShowSlot(gSaveBlock1Ptr->tvShows);
if (sCurTVShowSlot != -1)
{
show->bravoTrainer.contestResult = contestStandingPlace;
@@ -1543,9 +1480,7 @@ void BravoTrainerPokemonProfile_BeforeInterview2(u8 contestStandingPlace)
static void InterviewAfter_BravoTrainerBattleTowerProfile(void)
{
- TVShow *show;
-
- show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ TVShow *show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
show->bravoTrainerTower.kind = TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE;
show->bravoTrainerTower.active = TRUE;
StringCopy(show->bravoTrainerTower.trainerName, gSaveBlock2Ptr->playerName);
@@ -1555,27 +1490,19 @@ static void InterviewAfter_BravoTrainerBattleTowerProfile(void)
show->bravoTrainerTower.numFights = GetCurrentBattleTowerWinStreak(gSaveBlock2Ptr->frontier.towerLvlMode, 0);
show->bravoTrainerTower.wonTheChallenge = gSaveBlock2Ptr->frontier.towerBattleOutcome;
if (gSaveBlock2Ptr->frontier.towerLvlMode == FRONTIER_LVL_50)
- {
show->bravoTrainerTower.btLevel = 50;
- }
else
- {
show->bravoTrainerTower.btLevel = 100;
- }
show->bravoTrainerTower.interviewResponse = gSpecialVar_0x8004;
- tv_store_id_2x(show);
+ StorePlayerIdInNormalShow(show);
show->bravoTrainerTower.language = gGameLanguage;
if (show->bravoTrainerTower.language == LANGUAGE_JAPANESE || gSaveBlock2Ptr->frontier.towerInterview.opponentLanguage == LANGUAGE_JAPANESE)
- {
show->bravoTrainerTower.pokemonNameLanguage = LANGUAGE_JAPANESE;
- }
else
- {
show->bravoTrainerTower.pokemonNameLanguage = gSaveBlock2Ptr->frontier.towerInterview.opponentLanguage;
- }
}
-void SaveRecordedItemPurchasesForTVShow(void)
+void TryPutSmartShopperOnAir(void)
{
TVShow *show;
u8 i;
@@ -1584,24 +1511,24 @@ void SaveRecordedItemPurchasesForTVShow(void)
&& !(gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BATTLE_FRONTIER_MART) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(BATTLE_FRONTIER_MART))
&& !rbernoulli(1, 3))
{
- sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
- if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_SMART_SHOPPER, FALSE) != TRUE)
+ sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1 && IsRecordMixShowAlreadySpawned(TVSHOW_SMART_SHOPPER, FALSE) != TRUE)
{
- TV_SortPurchasesByQuantity();
+ SortPurchasesByQuantity();
if (gMartPurchaseHistory[0].quantity >= 20)
{
show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
show->smartshopperShow.kind = TVSHOW_SMART_SHOPPER;
- show->smartshopperShow.active = FALSE;
+ show->smartshopperShow.active = FALSE; // NOTE: Show is not active until passed via Record Mix.
show->smartshopperShow.shopLocation = gMapHeader.regionMapSectionId;
- for (i = 0; i < 3; i ++)
+ for (i = 0; i < SMARTSHOPPER_NUM_ITEMS; i++)
{
show->smartshopperShow.itemIds[i] = gMartPurchaseHistory[i].itemId;
show->smartshopperShow.itemAmounts[i] = gMartPurchaseHistory[i].quantity;
}
show->smartshopperShow.priceReduced = GetPriceReduction(POKENEWS_SLATEPORT);
StringCopy(show->smartshopperShow.playerName, gSaveBlock2Ptr->playerName);
- tv_store_id_3x(show);
+ StorePlayerIdInRecordMixShow(show);
show->smartshopperShow.language = gGameLanguage;
}
}
@@ -1624,11 +1551,11 @@ void PutNameRaterShowOnTheAir(void)
show->nameRaterShow.species = GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_SPECIES, NULL);
show->nameRaterShow.random = Random() % 3;
show->nameRaterShow.random2 = Random() % 2;
- show->nameRaterShow.randomSpecies = TV_GetSomeOtherSpeciesAlreadySeenByPlayer(show->nameRaterShow.species);
+ show->nameRaterShow.randomSpecies = GetRandomDifferentSpeciesSeenByPlayer(show->nameRaterShow.species);
StringCopy(show->nameRaterShow.trainerName, gSaveBlock2Ptr->playerName);
GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, show->nameRaterShow.pokemonName);
StripExtCtrlCodes(show->nameRaterShow.pokemonName);
- tv_store_id_2x(show);
+ StorePlayerIdInNormalShow(show);
show->nameRaterShow.language = gGameLanguage;
show->nameRaterShow.pokemonNameLanguage = GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_LANGUAGE);
}
@@ -1637,9 +1564,7 @@ void PutNameRaterShowOnTheAir(void)
void StartMassOutbreak(void)
{
- TVShow *show;
-
- show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
+ TVShow *show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
gSaveBlock1Ptr->outbreakPokemonSpecies = show->massOutbreak.species;
gSaveBlock1Ptr->outbreakLocationMapNum = show->massOutbreak.locationMapNum;
gSaveBlock1Ptr->outbreakLocationMapGroup = show->massOutbreak.locationMapGroup;
@@ -1659,7 +1584,7 @@ void PutLilycoveContestLadyShowOnTheAir(void)
{
TVShow *show;
- sub_80EFA88();
+ Script_FindFirstEmptyNormalTVShowSlot();
if (gSpecialVar_Result != TRUE)
{
show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
@@ -1670,41 +1595,35 @@ void PutLilycoveContestLadyShowOnTheAir(void)
BufferContestLadyPlayerName(show->contestLady.playerName);
BufferContestLadyMonName(&show->contestLady.contestCategory, show->contestLady.nickname);
show->contestLady.pokeblockState = GetContestLadyPokeblockState();
- tv_store_id_2x(show);
+ StorePlayerIdInNormalShow(show);
}
}
static void InterviewAfter_FanClubLetter(void)
{
- TVShow *show;
-
- show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ TVShow *show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
show->fanclubLetter.kind = TVSHOW_FAN_CLUB_LETTER;
show->fanclubLetter.active = TRUE;
StringCopy(show->fanclubLetter.playerName, gSaveBlock2Ptr->playerName);
show->fanclubLetter.species = GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, NULL);
- tv_store_id_2x(show);
+ StorePlayerIdInNormalShow(show);
show->fanclubLetter.language = gGameLanguage;
}
static void InterviewAfter_RecentHappenings(void)
{
- TVShow *show;
-
- show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ TVShow *show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
show->recentHappenings.kind = TVSHOW_RECENT_HAPPENINGS;
show->recentHappenings.active = TRUE;
StringCopy(show->recentHappenings.playerName, gSaveBlock2Ptr->playerName);
- show->recentHappenings.var02 = 0;
- tv_store_id_2x(show);
+ show->recentHappenings.species = SPECIES_NONE;
+ StorePlayerIdInNormalShow(show);
show->recentHappenings.language = gGameLanguage;
}
static void InterviewAfter_PkmnFanClubOpinions(void)
{
- TVShow *show;
-
- show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ TVShow *show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
show->fanclubOpinions.kind = TVSHOW_PKMN_FAN_CLUB_OPINIONS;
show->fanclubOpinions.active = TRUE;
show->fanclubOpinions.friendshipHighNybble = GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_FRIENDSHIP, NULL) >> 4;
@@ -1713,26 +1632,20 @@ static void InterviewAfter_PkmnFanClubOpinions(void)
GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_NICKNAME, show->fanclubOpinions.nickname);
StripExtCtrlCodes(show->fanclubOpinions.nickname);
show->fanclubOpinions.species = GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, NULL);
- tv_store_id_2x(show);
+ StorePlayerIdInNormalShow(show);
show->fanclubOpinions.language = gGameLanguage;
if (gGameLanguage == LANGUAGE_JAPANESE || GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_LANGUAGE) == LANGUAGE_JAPANESE)
- {
show->fanclubOpinions.pokemonNameLanguage = LANGUAGE_JAPANESE;
- }
else
- {
show->fanclubOpinions.pokemonNameLanguage = GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_LANGUAGE);
- }
}
-static void InterviewAfter_DummyShow4(void)
+static void InterviewAfter_Dummy(void)
{
- TVShow *show;
-
- show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
+ TVShow *show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
}
-static void sub_80ED718(void)
+static void TryStartRandomMassOutbreak(void)
{
u8 i;
u16 outbreakIdx;
@@ -1740,16 +1653,14 @@ static void sub_80ED718(void)
if (FlagGet(FLAG_SYS_GAME_CLEAR))
{
- for (i = 0; i < LAST_TVSHOW_IDX; i ++)
+ for (i = 0; i < LAST_TVSHOW_IDX; i++)
{
if (gSaveBlock1Ptr->tvShows[i].common.kind == TVSHOW_MASS_OUTBREAK)
- {
return;
- }
}
if (!rbernoulli(1, 200))
{
- sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ sCurTVShowSlot = FindFirstEmptyNormalTVShowSlot(gSaveBlock1Ptr->tvShows);
if (sCurTVShowSlot != -1)
{
outbreakIdx = Random() % ARRAY_COUNT(sPokeOutbreakSpeciesList);
@@ -1771,7 +1682,7 @@ static void sub_80ED718(void)
show->massOutbreak.probability = 50;
show->massOutbreak.var15 = 0;
show->massOutbreak.daysLeft = 1;
- tv_store_id_2x(show);
+ StorePlayerIdInNormalShow(show);
show->massOutbreak.language = gGameLanguage;
}
}
@@ -1799,9 +1710,9 @@ void UpdateTVShowsPerDay(u16 days)
{
UpdateMassOutbreakTimeLeft(days);
TryEndMassOutbreak(days);
- sub_80EF120(days);
- sub_80EDA48(days);
- sub_80EEB98(days);
+ UpdatePokeNewsTimeLeft(days);
+ ResolveWorldOfMastersShow(days);
+ ResolveNumberOneShow(days);
}
static void UpdateMassOutbreakTimeLeft(u16 days)
@@ -1811,7 +1722,7 @@ static void UpdateMassOutbreakTimeLeft(u16 days)
if (gSaveBlock1Ptr->outbreakPokemonSpecies == SPECIES_NONE)
{
- for (i = 0; i < LAST_TVSHOW_IDX; i ++)
+ for (i = 0; i < LAST_TVSHOW_IDX; i++)
{
if (gSaveBlock1Ptr->tvShows[i].massOutbreak.kind == TVSHOW_MASS_OUTBREAK && gSaveBlock1Ptr->tvShows[i].massOutbreak.active == TRUE)
{
@@ -1840,7 +1751,7 @@ void RecordFishingAttemptForTV(bool8 caughtFish)
if (caughtFish)
{
if (sPokemonAnglerAttemptCounters >> 8 > 4)
- PutFishingAdviceShowOnTheAir();
+ TryPutFishingAdviceOnAir();
sPokemonAnglerAttemptCounters &= 0xFF;
if (sPokemonAnglerAttemptCounters != 0xFF)
@@ -1849,7 +1760,7 @@ void RecordFishingAttemptForTV(bool8 caughtFish)
else
{
if ((u8)sPokemonAnglerAttemptCounters > 4)
- PutFishingAdviceShowOnTheAir();
+ TryPutFishingAdviceOnAir();
sPokemonAnglerAttemptCounters &= 0xFF00;
if (sPokemonAnglerAttemptCounters >> 8 != 0xFF)
@@ -1857,21 +1768,21 @@ void RecordFishingAttemptForTV(bool8 caughtFish)
}
}
-void PutFishingAdviceShowOnTheAir(void)
+static void TryPutFishingAdviceOnAir(void)
{
TVShow *show;
- sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
- if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_FISHING_ADVICE, FALSE) != TRUE)
+ sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1 && IsRecordMixShowAlreadySpawned(TVSHOW_FISHING_ADVICE, FALSE) != TRUE)
{
show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
show->pokemonAngler.kind = TVSHOW_FISHING_ADVICE;
- show->pokemonAngler.active = FALSE;
+ show->pokemonAngler.active = FALSE; // NOTE: Show is not active until passed via Record Mix.
show->pokemonAngler.nBites = sPokemonAnglerAttemptCounters;
show->pokemonAngler.nFails = sPokemonAnglerAttemptCounters >> 8;
show->pokemonAngler.species = sPokemonAnglerSpecies;
StringCopy(show->pokemonAngler.playerName, gSaveBlock2Ptr->playerName);
- tv_store_id_3x(show);
+ StorePlayerIdInRecordMixShow(show);
show->pokemonAngler.language = gGameLanguage;
}
}
@@ -1881,7 +1792,11 @@ void SetPokemonAnglerSpecies(u16 species)
sPokemonAnglerSpecies = species;
}
-static void sub_80EDA48(u16 days)
+// World of Masters is initialized in the last slot by InitWorldOfMastersShowAttempt
+// If enough Pokémon were caught during the day the show can be put on air (and will
+// be moved out of the last slot).
+// Either way the temporary version of the show in the last slot is deleted.
+static void ResolveWorldOfMastersShow(u16 days)
{
TVShow *show;
@@ -1889,14 +1804,13 @@ static void sub_80EDA48(u16 days)
if (show->worldOfMasters.kind == TVSHOW_WORLD_OF_MASTERS)
{
if (show->worldOfMasters.numPokeCaught >= 20)
- {
- sub_80EDA80();
- }
+ TryPutWorldOfMastersOnAir();
+
DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, LAST_TVSHOW_IDX);
}
}
-void sub_80EDA80(void)
+static void TryPutWorldOfMastersOnAir(void)
{
TVShow *show;
TVShow *show2;
@@ -1904,19 +1818,19 @@ void sub_80EDA80(void)
show = &gSaveBlock1Ptr->tvShows[LAST_TVSHOW_IDX];
if (!rbernoulli(1, 1))
{
- sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
- if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_WORLD_OF_MASTERS, FALSE) != TRUE)
+ sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1 && IsRecordMixShowAlreadySpawned(TVSHOW_WORLD_OF_MASTERS, FALSE) != TRUE)
{
show2 = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
show2->worldOfMasters.kind = TVSHOW_WORLD_OF_MASTERS;
- show2->worldOfMasters.active = FALSE;
+ show2->worldOfMasters.active = FALSE; // NOTE: Show is not active until passed via Record Mix.
show2->worldOfMasters.numPokeCaught = show->worldOfMasters.numPokeCaught;
show2->worldOfMasters.steps = GetGameStat(GAME_STAT_STEPS) - show->worldOfMasters.steps;
show2->worldOfMasters.caughtPoke = show->worldOfMasters.caughtPoke;
show2->worldOfMasters.species = show->worldOfMasters.species;
show2->worldOfMasters.location = show->worldOfMasters.location;
StringCopy(show2->worldOfMasters.playerName, gSaveBlock2Ptr->playerName);
- tv_store_id_3x(show2);
+ StorePlayerIdInRecordMixShow(show2);
show2->worldOfMasters.language = gGameLanguage;
DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, LAST_TVSHOW_IDX);
}
@@ -1929,47 +1843,38 @@ void TryPutTodaysRivalTrainerOnAir(void)
u32 i;
u8 nBadges;
- HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_TODAYS_RIVAL_TRAINER, TRUE);
- sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ IsRecordMixShowAlreadySpawned(TVSHOW_TODAYS_RIVAL_TRAINER, TRUE); // Delete old version of show
+ sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows);
if (sCurTVShowSlot != -1)
{
show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
show->rivalTrainer.kind = TVSHOW_TODAYS_RIVAL_TRAINER;
- show->rivalTrainer.active = FALSE;
- for (i = FLAG_BADGE01_GET, nBadges = 0; i < FLAG_BADGE01_GET + NUM_BADGES; i ++)
+ show->rivalTrainer.active = FALSE; // NOTE: Show is not active until passed via Record Mix.
+ for (i = FLAG_BADGE01_GET, nBadges = 0; i < FLAG_BADGE01_GET + NUM_BADGES; i++)
{
if (FlagGet(i))
- {
- nBadges ++;
- }
+ nBadges++;
}
show->rivalTrainer.badgeCount = nBadges;
if (IsNationalPokedexEnabled())
- {
show->rivalTrainer.dexCount = GetNationalPokedexCount(FLAG_GET_CAUGHT);
- }
else
- {
show->rivalTrainer.dexCount = GetHoennPokedexCount(FLAG_GET_CAUGHT);
- }
show->rivalTrainer.location = gMapHeader.regionMapSectionId;
show->rivalTrainer.mapLayoutId = gMapHeader.mapLayoutId;
show->rivalTrainer.nSilverSymbols = 0;
show->rivalTrainer.nGoldSymbols = 0;
- for (i = 0; i < 7; i ++)
+ for (i = 0; i < 7; i++)
{
if (FlagGet(sSilverSymbolFlags[i]) == TRUE)
- {
- show->rivalTrainer.nSilverSymbols ++;
- }
+ show->rivalTrainer.nSilverSymbols++;
+
if (FlagGet(sGoldSymbolFlags[i]) == TRUE)
- {
- show->rivalTrainer.nGoldSymbols ++;
- }
+ show->rivalTrainer.nGoldSymbols++;
}
show->rivalTrainer.battlePoints = gSaveBlock2Ptr->frontier.battlePoints;
StringCopy(show->rivalTrainer.playerName, gSaveBlock2Ptr->playerName);
- tv_store_id_3x(show);
+ StorePlayerIdInRecordMixShow(show);
show->rivalTrainer.language = gGameLanguage;
}
}
@@ -1978,17 +1883,17 @@ void TryPutTrendWatcherOnAir(const u16 *words)
{
TVShow *show;
- sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
- if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_TREND_WATCHER, FALSE) != TRUE)
+ sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1 && IsRecordMixShowAlreadySpawned(TVSHOW_TREND_WATCHER, FALSE) != TRUE)
{
show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
show->trendWatcher.kind = TVSHOW_TREND_WATCHER;
- show->trendWatcher.active = FALSE;
+ show->trendWatcher.active = FALSE; // NOTE: Show is not active until passed via Record Mix.
show->trendWatcher.gender = gSaveBlock2Ptr->playerGender;
show->trendWatcher.words[0] = words[0];
show->trendWatcher.words[1] = words[1];
StringCopy(show->trendWatcher.playerName, gSaveBlock2Ptr->playerName);
- tv_store_id_3x(show);
+ StorePlayerIdInRecordMixShow(show);
show->trendWatcher.language = gGameLanguage;
}
}
@@ -1997,70 +1902,70 @@ void TryPutTreasureInvestigatorsOnAir(void)
{
TVShow *show;
- sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
- if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_TREASURE_INVESTIGATORS, FALSE) != TRUE)
+ sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1 && IsRecordMixShowAlreadySpawned(TVSHOW_TREASURE_INVESTIGATORS, FALSE) != TRUE)
{
show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
show->treasureInvestigators.kind = TVSHOW_TREASURE_INVESTIGATORS;
- show->treasureInvestigators.active = FALSE;
+ show->treasureInvestigators.active = FALSE; // NOTE: Show is not active until passed via Record Mix.
show->treasureInvestigators.item = gSpecialVar_0x8005;
show->treasureInvestigators.location = gMapHeader.regionMapSectionId;
show->treasureInvestigators.mapLayoutId = gMapHeader.mapLayoutId;
StringCopy(show->treasureInvestigators.playerName, gSaveBlock2Ptr->playerName);
- tv_store_id_3x(show);
+ StorePlayerIdInRecordMixShow(show);
show->treasureInvestigators.language = gGameLanguage;
}
}
-void AlertTVOfNewCoinTotal(u16 nCoinsPaidOut)
+void TryPutFindThatGamerOnAir(u16 nCoinsPaidOut)
{
TVShow *show;
bool8 flag;
u16 nCoinsWon;
- sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
- if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_FIND_THAT_GAMER, FALSE) != TRUE)
+ sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1 && IsRecordMixShowAlreadySpawned(TVSHOW_FIND_THAT_GAMER, FALSE) != TRUE)
{
flag = FALSE;
switch (sFindThatGamerWhichGame)
{
- case SLOT_MACHINE:
- if (nCoinsPaidOut >= sFindThatGamerCoinsSpent + 200)
- {
- flag = TRUE;
- nCoinsWon = nCoinsPaidOut - sFindThatGamerCoinsSpent;
- break;
- }
- if (sFindThatGamerCoinsSpent >= 100 && nCoinsPaidOut <= sFindThatGamerCoinsSpent - 100)
- {
- nCoinsWon = sFindThatGamerCoinsSpent - nCoinsPaidOut;
- break;
- }
- return;
- case ROULETTE:
- if (nCoinsPaidOut >= sFindThatGamerCoinsSpent + 50)
- {
- flag = TRUE;
- nCoinsWon = nCoinsPaidOut - sFindThatGamerCoinsSpent;
- break;
- }
- if (sFindThatGamerCoinsSpent >= 50 && nCoinsPaidOut <= sFindThatGamerCoinsSpent - 50)
- {
- nCoinsWon = sFindThatGamerCoinsSpent - nCoinsPaidOut;
- break;
- }
- return;
- default:
- return;
+ case SLOT_MACHINE:
+ if (nCoinsPaidOut >= sFindThatGamerCoinsSpent + 200)
+ {
+ flag = TRUE;
+ nCoinsWon = nCoinsPaidOut - sFindThatGamerCoinsSpent;
+ break;
+ }
+ if (sFindThatGamerCoinsSpent >= 100 && nCoinsPaidOut <= sFindThatGamerCoinsSpent - 100)
+ {
+ nCoinsWon = sFindThatGamerCoinsSpent - nCoinsPaidOut;
+ break;
+ }
+ return;
+ case ROULETTE:
+ if (nCoinsPaidOut >= sFindThatGamerCoinsSpent + 50)
+ {
+ flag = TRUE;
+ nCoinsWon = nCoinsPaidOut - sFindThatGamerCoinsSpent;
+ break;
+ }
+ if (sFindThatGamerCoinsSpent >= 50 && nCoinsPaidOut <= sFindThatGamerCoinsSpent - 50)
+ {
+ nCoinsWon = sFindThatGamerCoinsSpent - nCoinsPaidOut;
+ break;
+ }
+ return;
+ default:
+ return;
}
show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
show->findThatGamer.kind = TVSHOW_FIND_THAT_GAMER;
- show->findThatGamer.active = FALSE;
+ show->findThatGamer.active = FALSE; // NOTE: Show is not active until passed via Record Mix.
show->findThatGamer.nCoins = nCoinsWon;
show->findThatGamer.whichGame = sFindThatGamerWhichGame;
show->findThatGamer.won = flag;
StringCopy(show->findThatGamer.playerName, gSaveBlock2Ptr->playerName);
- tv_store_id_3x(show);
+ StorePlayerIdInRecordMixShow(show);
show->findThatGamer.language = gGameLanguage;
}
}
@@ -2077,71 +1982,64 @@ void AlertTVThatPlayerPlayedRoulette(u16 nCoinsSpent)
sFindThatGamerCoinsSpent = nCoinsSpent;
}
-static void sub_80EDE98(TVShow *show)
+static void SecretBaseVisit_CalculateDecorationData(TVShow *show)
{
- u8 i;
- u8 j;
+ u8 i, j;
u16 k;
u8 n;
- u8 deco;
+ u8 decoration;
- for (i = 0; i < DECOR_MAX_SECRET_BASE; i ++)
- {
+ for (i = 0; i < DECOR_MAX_SECRET_BASE; i++)
sTV_DecorationsBuffer[i] = 0;
- }
- for (i = 0, n = 0; i < DECOR_MAX_SECRET_BASE; i ++)
+
+ for (i = 0, n = 0; i < DECOR_MAX_SECRET_BASE; i++)
{
- deco = gSaveBlock1Ptr->secretBases[0].decorations[i];
- if (deco)
+ decoration = gSaveBlock1Ptr->secretBases[0].decorations[i];
+ if (decoration)
{
- for (j = 0; j < DECOR_MAX_SECRET_BASE; j ++)
+ for (j = 0; j < DECOR_MAX_SECRET_BASE; j++)
{
if (sTV_DecorationsBuffer[j] == 0)
{
- sTV_DecorationsBuffer[j] = deco;
- n ++;
+ sTV_DecorationsBuffer[j] = decoration;
+ n++;
break;
}
- if (sTV_DecorationsBuffer[j] == deco)
- {
+ if (sTV_DecorationsBuffer[j] == decoration)
break;
- }
}
}
}
+
if (n > 4)
- {
show->secretBaseVisit.nDecorations = 4;
- }
else
- {
show->secretBaseVisit.nDecorations = n;
- }
+
switch (show->secretBaseVisit.nDecorations)
{
- case 0:
- break;
- case 1:
- show->secretBaseVisit.decorations[0] = sTV_DecorationsBuffer[0];
- break;
- default:
- for (k = 0; k < n * n; k ++)
- {
- deco = Random() % n;
- j = Random() % n;
- i = sTV_DecorationsBuffer[deco];
- sTV_DecorationsBuffer[deco] = sTV_DecorationsBuffer[j];
- sTV_DecorationsBuffer[j] = i;
- }
- for (i = 0; i < show->secretBaseVisit.nDecorations; i ++)
- {
- show->secretBaseVisit.decorations[i] = sTV_DecorationsBuffer[i];
- }
- break;
+ case 0:
+ break;
+ case 1:
+ show->secretBaseVisit.decorations[0] = sTV_DecorationsBuffer[0];
+ break;
+ default:
+ for (k = 0; k < n * n; k++)
+ {
+ decoration = Random() % n;
+ j = Random() % n;
+ i = sTV_DecorationsBuffer[decoration];
+ sTV_DecorationsBuffer[decoration] = sTV_DecorationsBuffer[j];
+ sTV_DecorationsBuffer[j] = i;
+ }
+
+ for (i = 0; i < show->secretBaseVisit.nDecorations; i++)
+ show->secretBaseVisit.decorations[i] = sTV_DecorationsBuffer[i];
+ break;
}
}
-static void sub_80EDFB4(TVShow *show)
+static void SecretBaseVisit_CalculatePartyData(TVShow *show)
{
u8 i;
u16 move;
@@ -2150,7 +2048,7 @@ static void sub_80EDFB4(TVShow *show)
u8 nPokemon;
u16 sum;
- for (i = 0, nPokemon = 0; i < PARTY_SIZE; i ++)
+ for (i = 0, nPokemon = 0; i < PARTY_SIZE; i++)
{
if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != SPECIES_NONE && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG))
{
@@ -2161,128 +2059,119 @@ static void sub_80EDFB4(TVShow *show)
if (move != MOVE_NONE)
{
sTV_SecretBaseVisitMovesTemp[nMoves] = move;
- nMoves ++;
+ nMoves++;
}
move = GetMonData(&gPlayerParty[i], MON_DATA_MOVE2);
if (move != MOVE_NONE)
{
sTV_SecretBaseVisitMovesTemp[nMoves] = move;
- nMoves ++;
+ nMoves++;
}
move = GetMonData(&gPlayerParty[i], MON_DATA_MOVE3);
if (move != MOVE_NONE)
{
sTV_SecretBaseVisitMovesTemp[nMoves] = move;
- nMoves ++;
+ nMoves++;
}
move = GetMonData(&gPlayerParty[i], MON_DATA_MOVE4);
if (move != MOVE_NONE)
{
sTV_SecretBaseVisitMovesTemp[nMoves] = move;
- nMoves ++;
+ nMoves++;
}
sTV_SecretBaseVisitMonsTemp[nPokemon].move = sTV_SecretBaseVisitMovesTemp[Random() % nMoves];
- nPokemon ++;
+ nPokemon++;
}
}
- for (i = 0, sum = 0; i < nPokemon; i ++)
- {
+ for (i = 0, sum = 0; i < nPokemon; i++)
sum += sTV_SecretBaseVisitMonsTemp[i].level;
- }
+
show->secretBaseVisit.avgLevel = sum / nPokemon;
j = Random() % nPokemon;
show->secretBaseVisit.species = sTV_SecretBaseVisitMonsTemp[j].species;
show->secretBaseVisit.move = sTV_SecretBaseVisitMonsTemp[j].move;
}
-void TV_PutSecretBaseVisitOnTheAir(void)
+void TryPutSecretBaseVisitOnAir(void)
{
TVShow *show;
- HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_SECRET_BASE_VISIT, TRUE);
- sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ IsRecordMixShowAlreadySpawned(TVSHOW_SECRET_BASE_VISIT, TRUE); // Delete old version of show
+ sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows);
if (sCurTVShowSlot != -1)
{
show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
show->secretBaseVisit.kind = TVSHOW_SECRET_BASE_VISIT;
- show->secretBaseVisit.active = FALSE;
+ show->secretBaseVisit.active = FALSE; // NOTE: Show is not active until passed via Record Mix.
StringCopy(show->secretBaseVisit.playerName, gSaveBlock2Ptr->playerName);
- sub_80EDE98(show);
- sub_80EDFB4(show);
- tv_store_id_3x(show);
+ SecretBaseVisit_CalculateDecorationData(show);
+ SecretBaseVisit_CalculatePartyData(show);
+ StorePlayerIdInRecordMixShow(show);
show->secretBaseVisit.language = gGameLanguage;
}
}
-void sub_80EE184(void)
+void TryPutBreakingNewsOnAir(void)
{
TVShow *show;
u8 i;
u16 balls;
- sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
- if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_BREAKING_NEWS, FALSE) != TRUE)
+ sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1 && IsRecordMixShowAlreadySpawned(TVSHOW_BREAKING_NEWS, FALSE) != TRUE)
{
show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
show->breakingNews.kind = TVSHOW_BREAKING_NEWS;
- show->breakingNews.active = FALSE;
+ show->breakingNews.active = FALSE; // NOTE: Show is not active until passed via Record Mix.
balls = 0;
- for (i = 0; i < POKEBALL_COUNT - 1; i ++)
- {
+ for (i = 0; i < POKEBALL_COUNT - 1; i++)
balls += gBattleResults.catchAttempts[i];
- }
+
if (gBattleResults.usedMasterBall)
- {
- balls ++;
- }
+ balls++;
show->breakingNews.location = gMapHeader.regionMapSectionId;
StringCopy(show->breakingNews.playerName, gSaveBlock2Ptr->playerName);
show->breakingNews.poke1Species = gBattleResults.playerMon1Species;
switch (gBattleOutcome)
{
- case B_OUTCOME_LOST:
- case B_OUTCOME_DREW:
- show->breakingNews.kind = TVSHOW_OFF_AIR;
- return;
- case B_OUTCOME_CAUGHT:
- show->breakingNews.outcome = 0;
- break;
- case B_OUTCOME_WON:
- show->breakingNews.outcome = 1;
- break;
- case B_OUTCOME_RAN:
- case B_OUTCOME_PLAYER_TELEPORTED:
- case B_OUTCOME_NO_SAFARI_BALLS:
- show->breakingNews.outcome = 2;
- break;
- case B_OUTCOME_MON_FLED:
- case B_OUTCOME_MON_TELEPORTED:
- show->breakingNews.outcome = 3;
- break;
+ case B_OUTCOME_LOST:
+ case B_OUTCOME_DREW:
+ show->breakingNews.kind = TVSHOW_OFF_AIR;
+ return;
+ case B_OUTCOME_CAUGHT:
+ show->breakingNews.outcome = 0;
+ break;
+ case B_OUTCOME_WON:
+ show->breakingNews.outcome = 1;
+ break;
+ case B_OUTCOME_RAN:
+ case B_OUTCOME_PLAYER_TELEPORTED:
+ case B_OUTCOME_NO_SAFARI_BALLS:
+ show->breakingNews.outcome = 2;
+ break;
+ case B_OUTCOME_MON_FLED:
+ case B_OUTCOME_MON_TELEPORTED:
+ show->breakingNews.outcome = 3;
+ break;
}
show->breakingNews.lastOpponentSpecies = gBattleResults.lastOpponentSpecies;
switch (show->breakingNews.outcome)
{
- case 0:
- if (gBattleResults.usedMasterBall)
- {
- show->breakingNews.caughtMonBall = ITEM_MASTER_BALL;
- }
- else
- {
- show->breakingNews.caughtMonBall = gBattleResults.caughtMonBall;
- }
- show->breakingNews.balls = balls;
- break;
- case 1:
- show->breakingNews.lastUsedMove = gBattleResults.lastUsedMovePlayer;
- break;
- case 2:
- break;
- case 3:
- break;
+ case 0:
+ if (gBattleResults.usedMasterBall)
+ show->breakingNews.caughtMonBall = ITEM_MASTER_BALL;
+ else
+ show->breakingNews.caughtMonBall = gBattleResults.caughtMonBall;
+ show->breakingNews.balls = balls;
+ break;
+ case 1:
+ show->breakingNews.lastUsedMove = gBattleResults.lastUsedMovePlayer;
+ break;
+ case 2:
+ case 3:
+ break;
}
- tv_store_id_3x(show);
+ StorePlayerIdInRecordMixShow(show);
show->breakingNews.language = gGameLanguage;
}
}
@@ -2291,16 +2180,16 @@ void TryPutLotteryWinnerReportOnAir(void)
{
TVShow *show;
- sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
- if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_LOTTO_WINNER, FALSE) != TRUE)
+ sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1 && IsRecordMixShowAlreadySpawned(TVSHOW_LOTTO_WINNER, FALSE) != TRUE)
{
show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
show->lottoWinner.kind = TVSHOW_LOTTO_WINNER;
- show->lottoWinner.active = FALSE;
+ show->lottoWinner.active = FALSE; // NOTE: Show is not active until passed via Record Mix.
StringCopy(show->lottoWinner.playerName, gSaveBlock2Ptr->playerName);
show->lottoWinner.whichPrize = 4 - gSpecialVar_0x8004;
show->lottoWinner.item = gSpecialVar_0x8005;
- tv_store_id_3x(show);
+ StorePlayerIdInRecordMixShow(show);
show->lottoWinner.language = gGameLanguage;
}
}
@@ -2311,45 +2200,45 @@ void TryPutBattleSeminarOnAir(u16 foeSpecies, u16 species, u8 moveIdx, const u16
u8 i;
u8 j;
- sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
- if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_BATTLE_SEMINAR, FALSE) != TRUE)
+ sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1 && IsRecordMixShowAlreadySpawned(TVSHOW_BATTLE_SEMINAR, FALSE) != TRUE)
{
show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
show->battleSeminar.kind = TVSHOW_BATTLE_SEMINAR;
- show->battleSeminar.active = FALSE;
+ show->battleSeminar.active = FALSE; // NOTE: Show is not active until passed via Record Mix.
StringCopy(show->battleSeminar.playerName, gSaveBlock2Ptr->playerName);
show->battleSeminar.foeSpecies = foeSpecies;
show->battleSeminar.species = species;
show->battleSeminar.move = movePtr[moveIdx];
- for (i = 0, j = 0; i < MAX_MON_MOVES; i ++)
+ for (i = 0, j = 0; i < MAX_MON_MOVES; i++)
{
if (i != moveIdx && movePtr[i])
{
show->battleSeminar.otherMoves[j] = movePtr[i];
- j ++;
+ j++;
}
}
show->battleSeminar.nOtherMoves = j;
show->battleSeminar.betterMove = betterMove;
- tv_store_id_3x(show);
+ StorePlayerIdInRecordMixShow(show);
show->battleSeminar.language = gGameLanguage;
}
}
-void sub_80EE44C(u8 nMonsCaught, u8 nPkblkUsed)
+void TryPutSafariFanClubOnAir(u8 nMonsCaught, u8 nPkblkUsed)
{
TVShow *show;
- sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
- if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_SAFARI_FAN_CLUB, FALSE) != TRUE)
+ sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1 && IsRecordMixShowAlreadySpawned(TVSHOW_SAFARI_FAN_CLUB, FALSE) != TRUE)
{
show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
show->safariFanClub.kind = TVSHOW_SAFARI_FAN_CLUB;
- show->safariFanClub.active = FALSE;
+ show->safariFanClub.active = FALSE; // NOTE: Show is not active until passed via Record Mix.
StringCopy(show->safariFanClub.playerName, gSaveBlock2Ptr->playerName);
show->safariFanClub.nMonsCaught = nMonsCaught;
show->safariFanClub.nPkblkUsed = nPkblkUsed;
- tv_store_id_3x(show);
+ StorePlayerIdInRecordMixShow(show);
show->safariFanClub.language = gGameLanguage;
}
}
@@ -2358,27 +2247,23 @@ void TryPutSpotTheCutiesOnAir(struct Pokemon *pokemon, u8 ribbonMonDataIdx)
{
TVShow *show;
- sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
- if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_CUTIES, FALSE) != TRUE)
+ sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1 && IsRecordMixShowAlreadySpawned(TVSHOW_CUTIES, FALSE) != TRUE)
{
show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
show->cuties.kind = TVSHOW_CUTIES;
- show->cuties.active = FALSE;
+ show->cuties.active = FALSE; // NOTE: Show is not active until passed via Record Mix.
StringCopy(show->cuties.playerName, gSaveBlock2Ptr->playerName);
GetMonData(pokemon, MON_DATA_NICKNAME, show->cuties.nickname);
StripExtCtrlCodes(show->cuties.nickname);
show->cuties.nRibbons = GetRibbonCount(pokemon);
show->cuties.selectedRibbon = MonDataIdxToRibbon(ribbonMonDataIdx);
- tv_store_id_3x(show);
+ StorePlayerIdInRecordMixShow(show);
show->cuties.language = gGameLanguage;
if (show->cuties.language == LANGUAGE_JAPANESE || GetMonData(pokemon, MON_DATA_LANGUAGE) == LANGUAGE_JAPANESE)
- {
show->cuties.pokemonNameLanguage = LANGUAGE_JAPANESE;
- }
else
- {
show->cuties.pokemonNameLanguage = GetMonData(pokemon, MON_DATA_LANGUAGE);
- }
}
}
@@ -2429,31 +2314,31 @@ static u8 MonDataIdxToRibbon(u8 monDataIdx)
return CHAMPION_RIBBON;
}
-void TrySetUpTrainerFanClubSpecial(void)
+void TryPutTrainerFanClubOnAir(void)
{
TVShow *show;
- sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
- if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_TRAINER_FAN_CLUB, FALSE) != TRUE)
+ sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows);
+ if (sCurTVShowSlot != -1 && IsRecordMixShowAlreadySpawned(TVSHOW_TRAINER_FAN_CLUB, FALSE) != TRUE)
{
show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
show->trainerFanClub.kind = TVSHOW_TRAINER_FAN_CLUB;
- show->trainerFanClub.active = FALSE;
+ show->trainerFanClub.active = FALSE; // NOTE: Show is not active until passed via Record Mix.
StringCopy(show->trainerFanClub.playerName, gSaveBlock2Ptr->playerName);
show->trainerFanClub.words[0] = gSaveBlock1Ptr->easyChatProfile[0];
show->trainerFanClub.words[1] = gSaveBlock1Ptr->easyChatProfile[1];
- tv_store_id_3x(show);
+ StorePlayerIdInRecordMixShow(show);
show->trainerFanClub.language = gGameLanguage;
}
}
bool8 ShouldHideFanClubInterviewer(void)
{
- sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ sCurTVShowSlot = FindFirstEmptyNormalTVShowSlot(gSaveBlock1Ptr->tvShows);
if (sCurTVShowSlot == -1)
return TRUE;
- FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_FAN_CLUB_SPECIAL);
+ TryReplaceOldTVShowOfKind(TVSHOW_FAN_CLUB_SPECIAL);
if (gSpecialVar_Result == TRUE)
return TRUE;
@@ -2469,25 +2354,24 @@ bool8 ShouldAirFrontierTVShow(void)
u8 showIdx;
TVShow *shows;
- if (HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_FRONTIER, FALSE) == TRUE)
+ if (IsRecordMixShowAlreadySpawned(TVSHOW_FRONTIER, FALSE) == TRUE)
{
shows = gSaveBlock1Ptr->tvShows;
playerId = GetPlayerIDAsU32();
- for (showIdx = 5; showIdx < LAST_TVSHOW_IDX; showIdx ++)
+ for (showIdx = NUM_NORMAL_TVSHOW_SLOTS; showIdx < LAST_TVSHOW_IDX; showIdx++)
{
if (shows[showIdx].common.kind == TVSHOW_FRONTIER && (playerId & 0xFF) == shows[showIdx].common.trainerIdLo && ((playerId >> 8) & 0xFF) == shows[showIdx].common.trainerIdHi)
{
DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, showIdx);
- sub_80EF93C(gSaveBlock1Ptr->tvShows);
+ CompactTVShowArray(gSaveBlock1Ptr->tvShows);
return TRUE;
}
}
}
- sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows);
if (sCurTVShowSlot == -1)
- {
return FALSE;
- }
+
return TRUE;
}
@@ -2495,47 +2379,47 @@ void TryPutFrontierTVShowOnAir(u16 winStreak, u8 facilityAndMode)
{
TVShow *show;
- sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows);
if (sCurTVShowSlot != -1)
{
show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
show->frontier.kind = TVSHOW_FRONTIER;
- show->frontier.active = FALSE;
+ show->frontier.active = FALSE; // NOTE: Show is not active until passed via Record Mix.
StringCopy(show->frontier.playerName, gSaveBlock2Ptr->playerName);
show->frontier.winStreak = winStreak;
- show->frontier.facility = facilityAndMode;
+ show->frontier.facilityAndMode = facilityAndMode;
switch (facilityAndMode)
{
- case 1:
- case 5:
- case 6:
- case 7:
- case 8:
- case 9:
- case 10:
- case 11:
- case 12:
- case 13:
- show->frontier.species1 = GetMonData(&gPlayerParty[0], MON_DATA_SPECIES, NULL);
- show->frontier.species2 = GetMonData(&gPlayerParty[1], MON_DATA_SPECIES, NULL);
- show->frontier.species3 = GetMonData(&gPlayerParty[2], MON_DATA_SPECIES, NULL);
- break;
- case 2:
- show->frontier.species1 = GetMonData(&gPlayerParty[0], MON_DATA_SPECIES, NULL);
- show->frontier.species2 = GetMonData(&gPlayerParty[1], MON_DATA_SPECIES, NULL);
- show->frontier.species3 = GetMonData(&gPlayerParty[2], MON_DATA_SPECIES, NULL);
- show->frontier.species4 = GetMonData(&gPlayerParty[3], MON_DATA_SPECIES, NULL);
- break;
- case 3:
- show->frontier.species1 = GetMonData(&gPlayerParty[0], MON_DATA_SPECIES, NULL);
- show->frontier.species2 = GetMonData(&gPlayerParty[1], MON_DATA_SPECIES, NULL);
- break;
- case 4:
- show->frontier.species1 = GetMonData(&gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[0] - 1], MON_DATA_SPECIES, NULL);
- show->frontier.species2 = GetMonData(&gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[1] - 1], MON_DATA_SPECIES, NULL);
- break;
+ case FRONTIER_SHOW_TOWER_SINGLES:
+ case FRONTIER_SHOW_DOME_SINGLES:
+ case FRONTIER_SHOW_DOME_DOUBLES:
+ case FRONTIER_SHOW_FACTORY_SINGLES:
+ case FRONTIER_SHOW_FACTORY_DOUBLES:
+ case FRONTIER_SHOW_PIKE:
+ case FRONTIER_SHOW_ARENA:
+ case FRONTIER_SHOW_PALACE_SINGLES:
+ case FRONTIER_SHOW_PALACE_DOUBLES:
+ case FRONTIER_SHOW_PYRAMID:
+ show->frontier.species1 = GetMonData(&gPlayerParty[0], MON_DATA_SPECIES, NULL);
+ show->frontier.species2 = GetMonData(&gPlayerParty[1], MON_DATA_SPECIES, NULL);
+ show->frontier.species3 = GetMonData(&gPlayerParty[2], MON_DATA_SPECIES, NULL);
+ break;
+ case FRONTIER_SHOW_TOWER_DOUBLES:
+ show->frontier.species1 = GetMonData(&gPlayerParty[0], MON_DATA_SPECIES, NULL);
+ show->frontier.species2 = GetMonData(&gPlayerParty[1], MON_DATA_SPECIES, NULL);
+ show->frontier.species3 = GetMonData(&gPlayerParty[2], MON_DATA_SPECIES, NULL);
+ show->frontier.species4 = GetMonData(&gPlayerParty[3], MON_DATA_SPECIES, NULL);
+ break;
+ case FRONTIER_SHOW_TOWER_MULTIS:
+ show->frontier.species1 = GetMonData(&gPlayerParty[0], MON_DATA_SPECIES, NULL);
+ show->frontier.species2 = GetMonData(&gPlayerParty[1], MON_DATA_SPECIES, NULL);
+ break;
+ case FRONTIER_SHOW_TOWER_LINK_MULTIS:
+ show->frontier.species1 = GetMonData(&gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[0] - 1], MON_DATA_SPECIES, NULL);
+ show->frontier.species2 = GetMonData(&gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[1] - 1], MON_DATA_SPECIES, NULL);
+ break;
}
- tv_store_id_3x(show);
+ StorePlayerIdInRecordMixShow(show);
show->frontier.language = gGameLanguage;
}
}
@@ -2545,14 +2429,14 @@ void TryPutSecretBaseSecretsOnAir(void)
TVShow *show;
u8 strbuf[32];
- if (HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_SECRET_BASE_SECRETS, FALSE) != TRUE)
+ if (IsRecordMixShowAlreadySpawned(TVSHOW_SECRET_BASE_SECRETS, FALSE) != TRUE)
{
- sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows);
if (sCurTVShowSlot != -1)
{
show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
show->secretBaseSecrets.kind = TVSHOW_SECRET_BASE_SECRETS;
- show->secretBaseSecrets.active = FALSE;
+ show->secretBaseSecrets.active = FALSE; // NOTE: Show is not active until passed via Record Mix.
StringCopy(show->secretBaseSecrets.playerName, gSaveBlock2Ptr->playerName);
show->secretBaseSecrets.stepsInBase = VarGet(VAR_SECRET_BASE_STEP_COUNTER);
CopyCurSecretBaseOwnerName_StrVar1();
@@ -2561,53 +2445,50 @@ void TryPutSecretBaseSecretsOnAir(void)
StringCopy(show->secretBaseSecrets.baseOwnersName, strbuf);
show->secretBaseSecrets.item = VarGet(VAR_SECRET_BASE_LAST_ITEM_USED);
show->secretBaseSecrets.flags = VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) + (VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) << 16);
- tv_store_id_3x(show);
+ StorePlayerIdInRecordMixShow(show);
show->secretBaseSecrets.language = gGameLanguage;
if (show->secretBaseSecrets.language == LANGUAGE_JAPANESE || gSaveBlock1Ptr->secretBases[VarGet(VAR_CURRENT_SECRET_BASE)].language == LANGUAGE_JAPANESE)
- {
show->secretBaseSecrets.baseOwnersNameLanguage = LANGUAGE_JAPANESE;
- }
else
- {
show->secretBaseSecrets.baseOwnersNameLanguage = gSaveBlock1Ptr->secretBases[VarGet(VAR_CURRENT_SECRET_BASE)].language;
- }
}
}
}
-static void sub_80EEB98(u16 days)
+// Check var thresholds required to trigger the Number One show
+// The vars are reset afterwards regardless
+static void ResolveNumberOneShow(u16 days)
{
u8 i;
- for (i = 0; i < ARRAY_COUNT(sNumberOneVarsAndThresholds); i ++)
+ for (i = 0; i < ARRAY_COUNT(sNumberOneVarsAndThresholds); i++)
{
if (VarGet(sNumberOneVarsAndThresholds[i][0]) >= sNumberOneVarsAndThresholds[i][1])
{
- sub_80EEBF4(i);
+ TryPutNumberOneOnAir(i);
break;
}
}
- for (i = 0; i < ARRAY_COUNT(sNumberOneVarsAndThresholds); i ++)
- {
+
+ for (i = 0; i < ARRAY_COUNT(sNumberOneVarsAndThresholds); i++)
VarSet(sNumberOneVarsAndThresholds[i][0], 0);
- }
}
-static void sub_80EEBF4(u8 actionIdx)
+static void TryPutNumberOneOnAir(u8 actionIdx)
{
TVShow *show;
- HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_NUMBER_ONE, TRUE);
- sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ IsRecordMixShowAlreadySpawned(TVSHOW_NUMBER_ONE, TRUE); // Delete old version of show
+ sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows);
if (sCurTVShowSlot != -1)
{
show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot];
show->numberOne.kind = TVSHOW_NUMBER_ONE;
- show->numberOne.active = FALSE;
+ show->numberOne.active = FALSE; // NOTE: Show is not active until passed via Record Mix.
StringCopy(show->numberOne.playerName, gSaveBlock2Ptr->playerName);
show->numberOne.actionIdx = actionIdx;
show->numberOne.count = VarGet(sNumberOneVarsAndThresholds[actionIdx][0]);
- tv_store_id_3x(show);
+ StorePlayerIdInRecordMixShow(show);
show->numberOne.language = gGameLanguage;
}
}
@@ -2649,72 +2530,66 @@ void IncrementDailyBattlePoints(u16 delta)
// PokeNews
-static void sub_80EED88(void)
+static void TryPutRandomPokeNewsOnAir(void)
{
- u8 newsKind;
-
if (FlagGet(FLAG_SYS_GAME_CLEAR))
{
- sCurTVShowSlot = sub_80EEE30(gSaveBlock1Ptr->pokeNews);
+ sCurTVShowSlot = GetFirstEmptyPokeNewsSlot(gSaveBlock1Ptr->pokeNews);
if (sCurTVShowSlot != -1 && rbernoulli(1, 100) != TRUE)
{
- newsKind = (Random() % 4) + POKENEWS_SLATEPORT;
- if (sub_80EF0E4(newsKind) != TRUE)
+ u8 newsKind = (Random() % NUM_POKENEWS_TYPES) + POKENEWS_SLATEPORT;
+ if (IsAddingPokeNewsDisallowed(newsKind) != TRUE)
{
gSaveBlock1Ptr->pokeNews[sCurTVShowSlot].kind = newsKind;
gSaveBlock1Ptr->pokeNews[sCurTVShowSlot].days = 4;
- gSaveBlock1Ptr->pokeNews[sCurTVShowSlot].state = TRUE;
+ gSaveBlock1Ptr->pokeNews[sCurTVShowSlot].state = 1;
}
}
}
}
-s8 sub_80EEE30(PokeNews *pokeNews)
+static s8 GetFirstEmptyPokeNewsSlot(PokeNews *pokeNews)
{
s8 i;
- for (i = 0; i < POKE_NEWS_COUNT; i ++)
+ for (i = 0; i < POKE_NEWS_COUNT; i++)
{
- if (pokeNews[i].kind == 0)
- {
+ if (pokeNews[i].kind == POKENEWS_NONE)
return i;
- }
}
return -1;
}
-void ClearPokemonNews(void)
+static void ClearPokeNews(void)
{
u8 i;
- for (i = 0; i < POKE_NEWS_COUNT; i ++)
- {
- ClearPokemonNewsI(i);
- }
+ for (i = 0; i < POKE_NEWS_COUNT; i++)
+ ClearPokeNewsBySlot(i);
}
-void ClearPokemonNewsI(u8 i)
+static void ClearPokeNewsBySlot(u8 i)
{
gSaveBlock1Ptr->pokeNews[i].kind = POKENEWS_NONE;
gSaveBlock1Ptr->pokeNews[i].state = FALSE;
gSaveBlock1Ptr->pokeNews[i].days = 0;
}
-static void sub_80EEEB8(void)
+static void CompactPokeNews(void)
{
u8 i;
u8 j;
- for (i = 0; i < POKE_NEWS_COUNT - 1; i ++)
+ for (i = 0; i < POKE_NEWS_COUNT - 1; i++)
{
if (gSaveBlock1Ptr->pokeNews[i].kind == POKENEWS_NONE)
{
- for (j = i + 1; j < POKE_NEWS_COUNT; j ++)
+ for (j = i + 1; j < POKE_NEWS_COUNT; j++)
{
if (gSaveBlock1Ptr->pokeNews[j].kind != POKENEWS_NONE)
{
gSaveBlock1Ptr->pokeNews[i] = gSaveBlock1Ptr->pokeNews[j];
- ClearPokemonNewsI(j);
+ ClearPokeNewsBySlot(j);
break;
}
}
@@ -2722,16 +2597,16 @@ static void sub_80EEEB8(void)
}
}
-u8 FindAnyTVNewsOnTheAir(void)
+static u8 FindAnyPokeNewsOnTheAir(void)
{
u8 i;
- for (i = 0; i < POKE_NEWS_COUNT; i ++)
+ for (i = 0; i < POKE_NEWS_COUNT; i++)
{
- if (gSaveBlock1Ptr->pokeNews[i].kind != POKENEWS_NONE && gSaveBlock1Ptr->pokeNews[i].state == TRUE && gSaveBlock1Ptr->pokeNews[i].days < 3)
- {
+ if (gSaveBlock1Ptr->pokeNews[i].kind != POKENEWS_NONE
+ && gSaveBlock1Ptr->pokeNews[i].state == 1
+ && gSaveBlock1Ptr->pokeNews[i].days < 3)
return i;
- }
}
return 0xFF;
}
@@ -2741,7 +2616,7 @@ void DoPokeNews(void)
u8 i;
u16 n;
- i = FindAnyTVNewsOnTheAir();
+ i = FindAnyPokeNewsOnTheAir();
if (i == 0xFF)
{
gSpecialVar_Result = FALSE;
@@ -2752,13 +2627,9 @@ void DoPokeNews(void)
{
gSaveBlock1Ptr->pokeNews[i].state = 2;
if (gLocalTime.hours < 20)
- {
ShowFieldMessage(sPokeNewsTextGroup_Ongoing[gSaveBlock1Ptr->pokeNews[i].kind]);
- }
else
- {
ShowFieldMessage(sPokeNewsTextGroup_Ending[gSaveBlock1Ptr->pokeNews[i].kind]);
- }
}
else
{
@@ -2776,101 +2647,92 @@ bool8 GetPriceReduction(u8 newsKind)
u8 i;
if (newsKind == POKENEWS_NONE)
- {
return FALSE;
- }
- for (i = 0; i < POKE_NEWS_COUNT; i ++)
+
+ for (i = 0; i < POKE_NEWS_COUNT; i++)
{
if (gSaveBlock1Ptr->pokeNews[i].kind == newsKind)
{
if (gSaveBlock1Ptr->pokeNews[i].state == 2 && IsPriceDiscounted(newsKind))
- {
return TRUE;
- }
+
return FALSE;
}
}
return FALSE;
}
-bool8 IsPriceDiscounted(u8 newsKind)
+static bool8 IsPriceDiscounted(u8 newsKind)
{
switch (newsKind)
{
- case POKENEWS_SLATEPORT:
- if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SLATEPORT_CITY) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SLATEPORT_CITY) && gSpecialVar_LastTalked == 25)
- {
- return TRUE;
- }
- return FALSE;
- case POKENEWS_LILYCOVE:
- if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP))
- {
- return TRUE;
- }
- return FALSE;
+ case POKENEWS_SLATEPORT:
+ if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SLATEPORT_CITY) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SLATEPORT_CITY) && gSpecialVar_LastTalked == 25)
+ return TRUE;
+ return FALSE;
+ case POKENEWS_LILYCOVE:
+ if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP))
+ return TRUE;
+ return FALSE;
}
return TRUE;
}
-bool8 sub_80EF0E4(u8 newsKind)
+static bool8 IsAddingPokeNewsDisallowed(u8 newsKind)
{
u8 i;
if (newsKind == POKENEWS_NONE)
- {
return TRUE;
- }
- for (i = 0; i < POKE_NEWS_COUNT; i ++)
+
+ // Check if this type of news is already active
+ for (i = 0; i < POKE_NEWS_COUNT; i++)
{
if (gSaveBlock1Ptr->pokeNews[i].kind == newsKind)
- {
return TRUE;
- }
}
return FALSE;
}
-static void sub_80EF120(u16 days)
+static void UpdatePokeNewsTimeLeft(u16 days)
{
u8 i;
- for (i = 0; i < POKE_NEWS_COUNT; i ++)
+ for (i = 0; i < POKE_NEWS_COUNT; i++)
{
if (gSaveBlock1Ptr->pokeNews[i].kind != POKENEWS_NONE)
{
if (gSaveBlock1Ptr->pokeNews[i].days < days)
{
- ClearPokemonNewsI(i);
+ ClearPokeNewsBySlot(i);
}
else
{
if (gSaveBlock1Ptr->pokeNews[i].state == 0 && FlagGet(FLAG_SYS_GAME_CLEAR) == TRUE)
- {
gSaveBlock1Ptr->pokeNews[i].state = 1;
- }
+
gSaveBlock1Ptr->pokeNews[i].days -= days;
}
}
}
- sub_80EEEB8();
+ CompactPokeNews();
}
void CopyContestRankToStringVar(u8 varIdx, u8 rank)
{
switch (rank)
{
- case CONTEST_RANK_NORMAL:
- StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_NORMAL]);
- break;
- case CONTEST_RANK_SUPER:
- StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_SUPER]);
- break;
- case CONTEST_RANK_HYPER:
- StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_HYPER]);
- break;
- case CONTEST_RANK_MASTER:
- StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_MASTER]);
- break;
+ case CONTEST_RANK_NORMAL:
+ StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_NORMAL]);
+ break;
+ case CONTEST_RANK_SUPER:
+ StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_SUPER]);
+ break;
+ case CONTEST_RANK_HYPER:
+ StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_HYPER]);
+ break;
+ case CONTEST_RANK_MASTER:
+ StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_MASTER]);
+ break;
}
}
@@ -2878,21 +2740,21 @@ void CopyContestCategoryToStringVar(u8 varIdx, u8 category)
{
switch (category)
{
- case CONTEST_CATEGORY_COOL:
- StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_COOL]);
- break;
- case CONTEST_CATEGORY_BEAUTY:
- StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_BEAUTY]);
- break;
- case CONTEST_CATEGORY_CUTE:
- StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_CUTE]);
- break;
- case CONTEST_CATEGORY_SMART:
- StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_SMART]);
- break;
- case CONTEST_CATEGORY_TOUGH:
- StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_TOUGH]);
- break;
+ case CONTEST_CATEGORY_COOL:
+ StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_COOL]);
+ break;
+ case CONTEST_CATEGORY_BEAUTY:
+ StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_BEAUTY]);
+ break;
+ case CONTEST_CATEGORY_CUTE:
+ StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_CUTE]);
+ break;
+ case CONTEST_CATEGORY_SMART:
+ StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_SMART]);
+ break;
+ case CONTEST_CATEGORY_TOUGH:
+ StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_TOUGH]);
+ break;
}
}
@@ -2904,11 +2766,9 @@ void SetContestCategoryStringVarForInterview(void)
CopyContestCategoryToStringVar(1, show->bravoTrainer.contestCategory);
}
-void TV_PrintIntToStringVar(u8 varIdx, int value)
+void ConvertIntToDecimalString(u8 varIdx, int value)
{
- int nDigits;
-
- nDigits = CountDigits(value);
+ int nDigits = CountDigits(value);
ConvertIntToDecimalStringN(gTVStringVarPtrs[varIdx], value, STR_CONV_MODE_LEFT_ALIGN, nDigits);
}
@@ -2926,30 +2786,25 @@ size_t CountDigits(int value)
return 1;
}
-static void sub_80EF40C(u8 varIdx, TVShow *show)
+static void SmartShopper_BufferPurchaseTotal(u8 varIdx, TVShow *show)
{
u8 i;
int price;
price = 0;
- for (i = 0; i < 3; i ++)
+ for (i = 0; i < SMARTSHOPPER_NUM_ITEMS; i++)
{
if (show->smartshopperShow.itemIds[i] != ITEM_NONE)
- {
price += ItemId_GetPrice(show->smartshopperShow.itemIds[i]) * show->smartshopperShow.itemAmounts[i];
- }
}
+
if (show->smartshopperShow.priceReduced == TRUE)
- {
- TV_PrintIntToStringVar(varIdx, price >> 1);
- }
+ ConvertIntToDecimalString(varIdx, price >> 1);
else
- {
- TV_PrintIntToStringVar(varIdx, price);
- }
+ ConvertIntToDecimalString(varIdx, price);
}
-bool8 HasMixableShowAlreadyBeenSpawnedWithPlayerID(u8 kind, bool8 flag)
+static bool8 IsRecordMixShowAlreadySpawned(u8 kind, bool8 delete)
{
u32 playerId;
TVShow *shows;
@@ -2957,14 +2812,16 @@ bool8 HasMixableShowAlreadyBeenSpawnedWithPlayerID(u8 kind, bool8 flag)
shows = gSaveBlock1Ptr->tvShows;
playerId = GetPlayerIDAsU32();
- for (i = 5; i < LAST_TVSHOW_IDX; i ++)
+ for (i = NUM_NORMAL_TVSHOW_SLOTS; i < LAST_TVSHOW_IDX; i++)
{
- if (shows[i].common.kind == kind && (playerId & 0xFF) == shows[i].common.trainerIdLo && ((playerId >> 8) & 0xFF) == shows[i].common.trainerIdHi)
+ if (shows[i].common.kind == kind
+ && (playerId & 0xFF) == shows[i].common.trainerIdLo
+ && ((playerId >> 8) & 0xFF) == shows[i].common.trainerIdHi)
{
- if (flag == TRUE)
+ if (delete == TRUE)
{
DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, i);
- sub_80EF93C(gSaveBlock1Ptr->tvShows);
+ CompactTVShowArray(gSaveBlock1Ptr->tvShows);
}
return TRUE;
}
@@ -2972,16 +2829,15 @@ bool8 HasMixableShowAlreadyBeenSpawnedWithPlayerID(u8 kind, bool8 flag)
return FALSE;
}
-void TV_SortPurchasesByQuantity(void)
+static void SortPurchasesByQuantity(void)
{
- u8 i;
- u8 j;
+ u8 i, j;
u16 tmpId;
u16 tmpQn;
- for (i = 0; i < 2; i ++)
+ for (i = 0; i < SMARTSHOPPER_NUM_ITEMS - 1; i++)
{
- for (j = i + 1; j < 3; j ++)
+ for (j = i + 1; j < SMARTSHOPPER_NUM_ITEMS; j++)
{
if (gMartPurchaseHistory[i].quantity < gMartPurchaseHistory[j].quantity)
{
@@ -2996,27 +2852,31 @@ void TV_SortPurchasesByQuantity(void)
}
}
-void FindActiveBroadcastByShowType_SetScriptResult(u8 kind)
+static void TryReplaceOldTVShowOfKind(u8 kind)
{
u8 i;
- for (i = 0; i < 5; i ++)
+ for (i = 0; i < NUM_NORMAL_TVSHOW_SLOTS; i++)
{
if (gSaveBlock1Ptr->tvShows[i].common.kind == kind)
{
if (gSaveBlock1Ptr->tvShows[i].common.active == TRUE)
{
+ // Old TV show is still active, don't replace
gSpecialVar_Result = TRUE;
}
else
{
+ // Old TV show is inactive, replace it and get new slot
DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, i);
- sub_80EF93C(gSaveBlock1Ptr->tvShows);
- sub_80EFA88();
+ CompactTVShowArray(gSaveBlock1Ptr->tvShows);
+ Script_FindFirstEmptyNormalTVShowSlot();
}
return;
}
}
- sub_80EFA88();
+
+ // Old TV show doesn't exist, just get new slot
+ Script_FindFirstEmptyNormalTVShowSlot();
}
void InterviewBefore(void)
@@ -3024,42 +2884,42 @@ void InterviewBefore(void)
gSpecialVar_Result = FALSE;
switch (gSpecialVar_0x8005)
{
- case TVSHOW_FAN_CLUB_LETTER:
- InterviewBefore_FanClubLetter();
- break;
- case TVSHOW_RECENT_HAPPENINGS:
- InterviewBefore_RecentHappenings();
- break;
- case TVSHOW_PKMN_FAN_CLUB_OPINIONS:
- InterviewBefore_PkmnFanClubOpinions();
- break;
- case TVSHOW_UNKN_SHOWTYPE_04:
- InterviewBefore_Dummy();
- break;
- case TVSHOW_NAME_RATER_SHOW:
- InterviewBefore_NameRater();
- break;
- case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE:
- InterviewBefore_BravoTrainerPkmnProfile();
- break;
- case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE:
- InterviewBefore_BravoTrainerBTProfile();
- break;
- case TVSHOW_CONTEST_LIVE_UPDATES:
- InterviewBefore_ContestLiveUpdates();
- break;
- case TVSHOW_3_CHEERS_FOR_POKEBLOCKS:
- InterviewBefore_3CheersForPokeblocks();
- break;
- case TVSHOW_FAN_CLUB_SPECIAL:
- InterviewBefore_FanClubSpecial();
- break;
+ case TVSHOW_FAN_CLUB_LETTER:
+ InterviewBefore_FanClubLetter();
+ break;
+ case TVSHOW_RECENT_HAPPENINGS:
+ InterviewBefore_RecentHappenings();
+ break;
+ case TVSHOW_PKMN_FAN_CLUB_OPINIONS:
+ InterviewBefore_PkmnFanClubOpinions();
+ break;
+ case TVSHOW_DUMMY:
+ InterviewBefore_Dummy();
+ break;
+ case TVSHOW_NAME_RATER_SHOW:
+ InterviewBefore_NameRater();
+ break;
+ case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE:
+ InterviewBefore_BravoTrainerPkmnProfile();
+ break;
+ case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE:
+ InterviewBefore_BravoTrainerBTProfile();
+ break;
+ case TVSHOW_CONTEST_LIVE_UPDATES:
+ InterviewBefore_ContestLiveUpdates();
+ break;
+ case TVSHOW_3_CHEERS_FOR_POKEBLOCKS:
+ InterviewBefore_3CheersForPokeblocks();
+ break;
+ case TVSHOW_FAN_CLUB_SPECIAL:
+ InterviewBefore_FanClubSpecial();
+ break;
}
}
static void InterviewBefore_FanClubLetter(void)
{
- FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_FAN_CLUB_LETTER);
+ TryReplaceOldTVShowOfKind(TVSHOW_FAN_CLUB_LETTER);
if (!gSpecialVar_Result)
{
StringCopy(gStringVar1, gSpeciesNames[GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, NULL)]);
@@ -3069,7 +2929,7 @@ static void InterviewBefore_FanClubLetter(void)
static void InterviewBefore_RecentHappenings(void)
{
- FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_RECENT_HAPPENINGS);
+ TryReplaceOldTVShowOfKind(TVSHOW_RECENT_HAPPENINGS);
if (!gSpecialVar_Result)
{
InitializeEasyChatWordArray(gSaveBlock1Ptr->tvShows[sCurTVShowSlot].recentHappenings.words, 6);
@@ -3078,7 +2938,7 @@ static void InterviewBefore_RecentHappenings(void)
static void InterviewBefore_PkmnFanClubOpinions(void)
{
- FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_PKMN_FAN_CLUB_OPINIONS);
+ TryReplaceOldTVShowOfKind(TVSHOW_PKMN_FAN_CLUB_OPINIONS);
if (!gSpecialVar_Result)
{
StringCopy(gStringVar1, gSpeciesNames[GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, NULL)]);
@@ -3095,44 +2955,38 @@ static void InterviewBefore_Dummy(void)
static void InterviewBefore_NameRater(void)
{
- FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_NAME_RATER_SHOW);
+ TryReplaceOldTVShowOfKind(TVSHOW_NAME_RATER_SHOW);
}
static void InterviewBefore_BravoTrainerPkmnProfile(void)
{
- FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE);
+ TryReplaceOldTVShowOfKind(TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE);
if (!gSpecialVar_Result)
- {
InitializeEasyChatWordArray(gSaveBlock1Ptr->tvShows[sCurTVShowSlot].bravoTrainer.words, 2);
- }
}
static void InterviewBefore_ContestLiveUpdates(void)
{
- FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_CONTEST_LIVE_UPDATES);
+ TryReplaceOldTVShowOfKind(TVSHOW_CONTEST_LIVE_UPDATES);
}
static void InterviewBefore_3CheersForPokeblocks(void)
{
- FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_3_CHEERS_FOR_POKEBLOCKS);
+ TryReplaceOldTVShowOfKind(TVSHOW_3_CHEERS_FOR_POKEBLOCKS);
}
static void InterviewBefore_BravoTrainerBTProfile(void)
{
- FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE);
+ TryReplaceOldTVShowOfKind(TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE);
if (!gSpecialVar_Result)
- {
InitializeEasyChatWordArray(gSaveBlock1Ptr->tvShows[sCurTVShowSlot].bravoTrainerTower.words, 1);
- }
}
static void InterviewBefore_FanClubSpecial(void)
{
- FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_FAN_CLUB_SPECIAL);
+ TryReplaceOldTVShowOfKind(TVSHOW_FAN_CLUB_SPECIAL);
if (!gSpecialVar_Result)
- {
InitializeEasyChatWordArray(gSaveBlock1Ptr->tvShows[sCurTVShowSlot].fanClubSpecial.words, 1);
- }
}
static bool8 IsPartyMonNicknamedOrNotEnglish(u8 monIdx)
@@ -3144,9 +2998,8 @@ static bool8 IsPartyMonNicknamedOrNotEnglish(u8 monIdx)
GetMonData(pokemon, MON_DATA_NICKNAME, gStringVar1);
language = GetMonData(pokemon, MON_DATA_LANGUAGE, &language);
if (language == GAME_LANGUAGE && !StringCompare(gSpeciesNames[GetMonData(pokemon, MON_DATA_SPECIES, NULL)], gStringVar1))
- {
return FALSE;
- }
+
return TRUE;
}
@@ -3155,28 +3008,27 @@ bool8 IsLeadMonNicknamedOrNotEnglish(void)
return IsPartyMonNicknamedOrNotEnglish(GetLeadMonIndex());
}
-void DeleteTVShowInArrayByIdx(TVShow *shows, u8 idx)
+static void DeleteTVShowInArrayByIdx(TVShow *shows, u8 idx)
{
u8 i;
shows[idx].commonInit.kind = TVSHOW_OFF_AIR;
shows[idx].commonInit.active = FALSE;
- for (i = 0; i < ARRAY_COUNT(shows[idx].commonInit.pad02); i++)
- {
- shows[idx].commonInit.pad02[i] = 0;
- }
+ for (i = 0; i < ARRAY_COUNT(shows[idx].commonInit.data); i++)
+ shows[idx].commonInit.data[i] = 0;
}
-static void sub_80EF93C(TVShow *shows)
+static void CompactTVShowArray(TVShow *shows)
{
u8 i;
u8 j;
- for (i = 0; i < 4; i ++)
+ // Compact normal TV shows
+ for (i = 0; i < NUM_NORMAL_TVSHOW_SLOTS - 1; i++)
{
if (shows[i].common.kind == TVSHOW_OFF_AIR)
{
- for (j = i + 1; j < 5; j ++)
+ for (j = i + 1; j < NUM_NORMAL_TVSHOW_SLOTS; j++)
{
if (shows[j].common.kind != TVSHOW_OFF_AIR)
{
@@ -3187,11 +3039,13 @@ static void sub_80EF93C(TVShow *shows)
}
}
}
- for (i = 5; i < LAST_TVSHOW_IDX; i ++)
+
+ // Compact Record Mix TV shows
+ for (i = NUM_NORMAL_TVSHOW_SLOTS; i < LAST_TVSHOW_IDX; i++)
{
if (shows[i].common.kind == TVSHOW_OFF_AIR)
{
- for (j = i + 1; j < LAST_TVSHOW_IDX; j ++)
+ for (j = i + 1; j < LAST_TVSHOW_IDX; j++)
{
if (shows[j].common.kind != TVSHOW_OFF_AIR)
{
@@ -3204,16 +3058,16 @@ static void sub_80EF93C(TVShow *shows)
}
}
-u16 TV_GetSomeOtherSpeciesAlreadySeenByPlayer_AndPrintName(u8 varIdx, u16 passedSpecies)
+static u16 GetRandomDifferentSpeciesAndNameSeenByPlayer(u8 varIdx, u16 passedSpecies)
{
u16 species;
- species = TV_GetSomeOtherSpeciesAlreadySeenByPlayer(passedSpecies);
+ species = GetRandomDifferentSpeciesSeenByPlayer(passedSpecies);
StringCopy(gTVStringVarPtrs[varIdx], gSpeciesNames[species]);
return species;
}
-u16 TV_GetSomeOtherSpeciesAlreadySeenByPlayer(u16 passedSpecies)
+static u16 GetRandomDifferentSpeciesSeenByPlayer(u16 passedSpecies)
{
u16 species;
u16 initSpecies;
@@ -3223,13 +3077,10 @@ u16 TV_GetSomeOtherSpeciesAlreadySeenByPlayer(u16 passedSpecies)
while (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_SEEN) != TRUE || species == passedSpecies)
{
if (species == SPECIES_NONE + 1)
- {
species = NUM_SPECIES - 1;
- }
else
- {
- species --;
- }
+ species--;
+
if (species == initSpecies)
{
species = passedSpecies;
@@ -3239,65 +3090,60 @@ u16 TV_GetSomeOtherSpeciesAlreadySeenByPlayer(u16 passedSpecies)
return species;
}
-static void sub_80EFA88(void)
+static void Script_FindFirstEmptyNormalTVShowSlot(void)
{
- sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
+ sCurTVShowSlot = FindFirstEmptyNormalTVShowSlot(gSaveBlock1Ptr->tvShows);
gSpecialVar_0x8006 = sCurTVShowSlot;
if (sCurTVShowSlot == -1)
- {
- gSpecialVar_Result = TRUE;
- }
+ gSpecialVar_Result = TRUE; // Failed to find empty slot
else
- {
- gSpecialVar_Result = FALSE;
- }
+ gSpecialVar_Result = FALSE; // Found empty slot
}
-s8 FindEmptyTVSlotWithinFirstFiveShowsOfArray(TVShow *shows)
+static s8 FindFirstEmptyNormalTVShowSlot(TVShow *shows)
{
u8 i;
- for (i = 0; i < 5; i ++)
+ for (i = 0; i < NUM_NORMAL_TVSHOW_SLOTS; i++)
{
if (shows[i].common.kind == TVSHOW_OFF_AIR)
- {
return i;
- }
}
return -1;
}
-s8 FindEmptyTVSlotBeyondFirstFiveShowsOfArray(TVShow *shows)
+static s8 FindFirstEmptyRecordMixTVShowSlot(TVShow *shows)
{
s8 i;
- for (i = 5; i < LAST_TVSHOW_IDX; i ++)
+ for (i = NUM_NORMAL_TVSHOW_SLOTS; i < LAST_TVSHOW_IDX; i++)
{
if (shows[i].common.kind == TVSHOW_OFF_AIR)
- {
return i;
- }
}
return -1;
}
-bool8 TV_BernoulliTrial(u16 ratio)
+static bool8 BernoulliTrial(u16 ratio)
{
if (Random() <= ratio)
- {
return FALSE;
- }
+
return TRUE;
}
-void TV_FanClubLetter_RandomWordToStringVar3(TVShow *show)
+// For TVSHOW_FAN_CLUB_LETTER / TVSHOW_RECENT_HAPPENINGS
+// Both are assumed to have the same struct layout
+static void GetRandomWordFromShow(TVShow *show)
{
u8 i;
- i = Random() % 6;
+ i = Random() % ARRAY_COUNT(show->fanclubLetter.words);
+
+ // From random point, get first non-empty word
while (TRUE)
{
- if (i == 6)
+ if (i == ARRAY_COUNT(show->fanclubLetter.words))
i = 0;
if (show->fanclubLetter.words[i] != EC_EMPTY_WORD)
@@ -3307,33 +3153,31 @@ void TV_FanClubLetter_RandomWordToStringVar3(TVShow *show)
CopyEasyChatWord(gStringVar3, show->fanclubLetter.words[i]);
}
-u8 TV_GetNicknameSumMod8(TVShow *show)
+static u8 GetRandomNameRaterStateFromName(TVShow *show)
{
u8 i;
- u16 ct;
+ u16 nameSum;
- ct = 0;
- for (i = 0; i < 11; i ++)
+ nameSum = 0;
+ for (i = 0; i < POKEMON_NAME_LENGTH + 1; i++)
{
if (show->nameRaterShow.pokemonName[i] == EOS)
- {
break;
- }
- ct += show->nameRaterShow.pokemonName[i];
+
+ nameSum += show->nameRaterShow.pokemonName[i];
}
- return ct & 7;
+ return nameSum & 7;
}
-void TV_GetNicknameSubstring(u8 varIdx, u8 whichPosition, u8 charParam, u16 whichString, u16 species, TVShow *show)
+static void GetNicknameSubstring(u8 varIdx, u8 whichPosition, u8 charParam, u16 whichString, u16 species, TVShow *show)
{
u8 buff[16];
u8 i;
u16 strlen;
- for (i = 0; i < 3; i ++)
- {
+ for (i = 0; i < 3; i++)
buff[i] = EOS;
- }
+
if (whichString == 0)
{
strlen = StringLength(show->nameRaterShow.trainerName);
@@ -3405,16 +3249,15 @@ void TV_GetNicknameSubstring(u8 varIdx, u8 whichPosition, u8 charParam, u16 whic
StringCopy(gTVStringVarPtrs[varIdx], buff);
}
-bool8 TV_IsScriptShowKindAlreadyInQueue(void)
+// Unused script special
+bool8 IsTVShowAlreadyInQueue(void)
{
u8 i;
- for (i = 0; i < 5; i ++)
+ for (i = 0; i < NUM_NORMAL_TVSHOW_SLOTS; i++)
{
if (gSaveBlock1Ptr->tvShows[i].common.kind == gSpecialVar_0x8004)
- {
return TRUE;
- }
}
return FALSE;
}
@@ -3456,7 +3299,7 @@ void ChangeBoxPokemonNickname(void)
DoNamingScreen(NAMING_SCREEN_NICKNAME, gStringVar2, GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL), GetBoxMonGender(boxMon), GetBoxMonData(boxMon, MON_DATA_PERSONALITY, NULL), ChangeBoxPokemonNickname_CB);
}
-void ChangeBoxPokemonNickname_CB(void)
+static void ChangeBoxPokemonNickname_CB(void)
{
SetBoxMonNickAt(gSpecialVar_MonBoxId, gSpecialVar_MonBoxPos, gStringVar2);
CB2_ReturnToFieldContinueScriptPlayMapMusic();
@@ -3476,25 +3319,21 @@ void IsMonOTIDNotPlayers(void)
gSpecialVar_Result = TRUE;
}
-u8 GetTVChannelByShowType(u8 kind)
+static u8 GetTVGroupByShowId(u8 kind)
{
if (kind == TVSHOW_OFF_AIR)
- {
- return 0;
- }
- if (kind >= TVSHOW_FAN_CLUB_LETTER && kind < TVSHOW_POKEMON_TODAY_CAUGHT)
- {
- return 2;
- }
- if (kind >= TVSHOW_POKEMON_TODAY_CAUGHT && kind < TVSHOW_MASS_OUTBREAK)
- {
- return 3;
- }
- if (kind >= TVSHOW_MASS_OUTBREAK && kind < 61)
- {
- return 4;
- }
- return 0;
+ return TVGROUP_NONE;
+
+ if (kind >= TVGROUP_NORMAL_START && kind <= TVGROUP_NORMAL_END)
+ return TVGROUP_NORMAL;
+
+ if (kind >= TVGROUP_RECORD_MIX_START && kind <= TVGROUP_RECORD_MIX_END)
+ return TVGROUP_RECORD_MIX;
+
+ if (kind >= TVGROUP_OUTBREAK_START && kind <= TVGROUP_OUTBREAK_END)
+ return TVGROUP_OUTBREAK;
+
+ return TVGROUP_NONE;
}
u32 GetPlayerIDAsU32(void)
@@ -3502,35 +3341,31 @@ u32 GetPlayerIDAsU32(void)
return (gSaveBlock2Ptr->playerTrainerId[3] << 24) | (gSaveBlock2Ptr->playerTrainerId[2] << 16) | (gSaveBlock2Ptr->playerTrainerId[1] << 8) | gSaveBlock2Ptr->playerTrainerId[0];
}
-u8 CheckForBigMovieOrEmergencyNewsOnTV(void)
+u8 CheckForPlayersHouseNews(void)
{
+ // Check if not in Littleroot house map group
if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP(LITTLEROOT_TOWN_BRENDANS_HOUSE_1F))
- {
- return 0;
- }
+ return PLAYERS_HOUSE_TV_NONE;
+
+ // Check if not in player's house (dependent on gender)
if (gSaveBlock2Ptr->playerGender == MALE)
{
if (gSaveBlock1Ptr->location.mapNum != MAP_NUM(LITTLEROOT_TOWN_BRENDANS_HOUSE_1F))
- {
- return 0;
- }
+ return PLAYERS_HOUSE_TV_NONE;
}
else
{
if (gSaveBlock1Ptr->location.mapNum != MAP_NUM(LITTLEROOT_TOWN_MAYS_HOUSE_1F))
- {
- return 0;
- }
+ return PLAYERS_HOUSE_TV_NONE;
}
+
if (FlagGet(FLAG_SYS_TV_LATIAS_LATIOS) == TRUE)
- {
- return 1;
- }
+ return PLAYERS_HOUSE_TV_LATI;
+
if (FlagGet(FLAG_SYS_TV_HOME) == TRUE)
- {
- return 2;
- }
- return 1;
+ return PLAYERS_HOUSE_TV_MOVIE;
+
+ return PLAYERS_HOUSE_TV_LATI;
}
void GetMomOrDadStringForTVMessage(void)
@@ -3591,129 +3426,120 @@ void HideBattleTowerReporter(void)
FlagSet(FLAG_HIDE_BATTLE_TOWER_REPORTER);
}
-void ReceiveTvShowsData(void *src, u32 size, u8 masterIdx)
+void ReceiveTvShowsData(void *src, u32 size, u8 playersLinkId)
{
u8 i;
u16 version;
- TVShow (*rmBuffer2)[4][25];
- TVShow (*rmBuffer)[4][25];
+ TVShow (*rmBuffer2)[MAX_LINK_PLAYERS][TV_SHOWS_COUNT];
+ TVShow (*rmBuffer)[MAX_LINK_PLAYERS][TV_SHOWS_COUNT];
- rmBuffer2 = malloc(4 * 25 * sizeof(TVShow));
+ rmBuffer2 = malloc(MAX_LINK_PLAYERS * TV_SHOWS_COUNT * sizeof(TVShow));
if (rmBuffer2 != NULL)
{
- for (i = 0; i < 4; i ++)
- {
+ for (i = 0; i < MAX_LINK_PLAYERS; i++)
memcpy((*rmBuffer2)[i], src + i * size, sizeof((*rmBuffer2)[i]));
- }
+
rmBuffer = rmBuffer2;
- for (i = 0; i < GetLinkPlayerCount(); i ++)
+ for (i = 0; i < GetLinkPlayerCount(); i++)
{
version = (u8)gLinkPlayers[i].version;
if (version == VERSION_RUBY || version == VERSION_SAPPHIRE)
- {
- sub_80F1254((*rmBuffer)[i]);
- }
+ TranslateRubyShows((*rmBuffer)[i]);
else if (version == VERSION_EMERALD && gLinkPlayers[i].language == LANGUAGE_JAPANESE)
- {
- sub_80F12A4((*rmBuffer)[i]);
- }
+ TranslateJapaneseEmeraldShows((*rmBuffer)[i]);
}
- switch (masterIdx)
+
+ // Position player's TV shows in argument list depending on link id
+ switch (playersLinkId)
{
- case 0:
- sub_80F0358(gSaveBlock1Ptr->tvShows, (*rmBuffer)[1], (*rmBuffer)[2], (*rmBuffer)[3]);
- break;
- case 1:
- sub_80F0358((*rmBuffer)[0], gSaveBlock1Ptr->tvShows, (*rmBuffer)[2], (*rmBuffer)[3]);
- break;
- case 2:
- sub_80F0358((*rmBuffer)[0], (*rmBuffer)[1], gSaveBlock1Ptr->tvShows, (*rmBuffer)[3]);
- break;
- case 3:
- sub_80F0358((*rmBuffer)[0], (*rmBuffer)[1], (*rmBuffer)[2], gSaveBlock1Ptr->tvShows);
- break;
+ case 0:
+ SetMixedTVShows(gSaveBlock1Ptr->tvShows, (*rmBuffer)[1], (*rmBuffer)[2], (*rmBuffer)[3]);
+ break;
+ case 1:
+ SetMixedTVShows((*rmBuffer)[0], gSaveBlock1Ptr->tvShows, (*rmBuffer)[2], (*rmBuffer)[3]);
+ break;
+ case 2:
+ SetMixedTVShows((*rmBuffer)[0], (*rmBuffer)[1], gSaveBlock1Ptr->tvShows, (*rmBuffer)[3]);
+ break;
+ case 3:
+ SetMixedTVShows((*rmBuffer)[0], (*rmBuffer)[1], (*rmBuffer)[2], gSaveBlock1Ptr->tvShows);
+ break;
}
- sub_80EF93C(gSaveBlock1Ptr->tvShows);
- sub_80F0C04();
- sub_80EF93C(gSaveBlock1Ptr->tvShows);
- sub_80F0708();
- sub_80F0B64();
+
+ CompactTVShowArray(gSaveBlock1Ptr->tvShows);
+ DeleteExcessMixedShows();
+ CompactTVShowArray(gSaveBlock1Ptr->tvShows);
+ DeactivateShowsWithUnseenSpecies();
+ DeactivateGameCompleteShowsIfNotUnlocked();
free(rmBuffer2);
}
}
-static void sub_80F0358(TVShow player1[25], TVShow player2[25], TVShow player3[25], TVShow player4[25])
+static void SetMixedTVShows(TVShow player1[TV_SHOWS_COUNT], TVShow player2[TV_SHOWS_COUNT], TVShow player3[TV_SHOWS_COUNT], TVShow player4[TV_SHOWS_COUNT])
{
u8 i;
u8 j;
- TVShow **argslist[4];
+ TVShow **tvShows[MAX_LINK_PLAYERS];
- argslist[0] = &player1;
- argslist[1] = &player2;
- argslist[2] = &player3;
- argslist[3] = &player4;
+ tvShows[0] = &player1;
+ tvShows[1] = &player2;
+ tvShows[2] = &player3;
+ tvShows[3] = &player4;
sTVShowMixingNumPlayers = GetLinkPlayerCount();
while (1)
{
- for (i = 0; i < sTVShowMixingNumPlayers; i ++)
+ for (i = 0; i < sTVShowMixingNumPlayers; i++)
{
if (i == 0)
- {
- sRecordMixingPartnersWithoutShowsToShare = i;
- }
- sTVShowMixingCurSlot = sub_80F06D0(argslist[i][0]);
+ sRecordMixingPartnersWithoutShowsToShare = 0;
+
+ sTVShowMixingCurSlot = FindInactiveShowInArray(tvShows[i][0]);
if (sTVShowMixingCurSlot == -1)
{
- sRecordMixingPartnersWithoutShowsToShare ++;
+ sRecordMixingPartnersWithoutShowsToShare++;
if (sRecordMixingPartnersWithoutShowsToShare == sTVShowMixingNumPlayers)
- {
return;
- }
}
else
{
- for (j = 0; j < sTVShowMixingNumPlayers - 1; j ++)
+ for (j = 0; j < sTVShowMixingNumPlayers - 1; j++)
{
- sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(argslist[(i + j + 1) % sTVShowMixingNumPlayers][0]);
+ sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(tvShows[(i + j + 1) % sTVShowMixingNumPlayers][0]);
if (sCurTVShowSlot != -1
- && sub_80F049C(&argslist[(i + j + 1) % sTVShowMixingNumPlayers][0], &argslist[i][0], (i + j + 1) % sTVShowMixingNumPlayers) == 1)
- {
+ && TryMixTVShow(&tvShows[(i + j + 1) % sTVShowMixingNumPlayers][0], &tvShows[i][0], (i + j + 1) % sTVShowMixingNumPlayers) == 1)
break;
- }
}
if (j == sTVShowMixingNumPlayers - 1)
- {
- DeleteTVShowInArrayByIdx(argslist[i][0], sTVShowMixingCurSlot);
- }
+ DeleteTVShowInArrayByIdx(tvShows[i][0], sTVShowMixingCurSlot);
}
}
}
}
-static bool8 sub_80F049C(TVShow *dest[25], TVShow *src[25], u8 idx)
+static bool8 TryMixTVShow(TVShow *dest[TV_SHOWS_COUNT], TVShow *src[TV_SHOWS_COUNT], u8 idx)
{
- u8 value;
- u8 switchval;
- TVShow *tv1;
- TVShow *tv2;
+ bool8 success;
+ u8 type;
+ TVShow *tv1 = *dest;
+ TVShow *tv2 = *src;
- tv1 = *dest;
- tv2 = *src;
- value = FALSE;
- switchval = GetTVChannelByShowType(tv2[sTVShowMixingCurSlot].common.kind);
- switch (switchval)
+ success = FALSE;
+ type = GetTVGroupByShowId(tv2[sTVShowMixingCurSlot].common.kind);
+ switch (type)
{
- case 2:
- value = sub_80F0580(&tv1[sCurTVShowSlot], &tv2[sTVShowMixingCurSlot], idx);
- break;
- case 3:
- value = sub_80F05E8(&tv1[sCurTVShowSlot], &tv2[sTVShowMixingCurSlot], idx);
- break;
- case 4:
- value = sub_80F0668(&tv1[sCurTVShowSlot], &tv2[sTVShowMixingCurSlot], idx);
- break;
+ case TVGROUP_NORMAL:
+ success = TryMixNormalTVShow(&tv1[sCurTVShowSlot], &tv2[sTVShowMixingCurSlot], idx);
+ break;
+ case TVGROUP_RECORD_MIX:
+ success = TryMixRecordMixTVShow(&tv1[sCurTVShowSlot], &tv2[sTVShowMixingCurSlot], idx);
+ break;
+ case TVGROUP_OUTBREAK:
+ success = TryMixOutbreakTVShow(&tv1[sCurTVShowSlot], &tv2[sTVShowMixingCurSlot], idx);
+ break;
}
- if (value == TRUE)
+
+ // Show was mixed, delete from array
+ if (success == TRUE)
{
DeleteTVShowInArrayByIdx(tv2, sTVShowMixingCurSlot);
return TRUE;
@@ -3721,385 +3547,354 @@ static bool8 sub_80F049C(TVShow *dest[25], TVShow *src[25], u8 idx)
return FALSE;
}
-static bool8 sub_80F0580(TVShow *tv1, TVShow *tv2, u8 idx)
+static bool8 TryMixNormalTVShow(TVShow *dest, TVShow *src, u8 idx)
{
u32 linkTrainerId = GetLinkPlayerTrainerId(idx);
- if ((linkTrainerId & 0xFF) == tv2->common.trainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.trainerIdHi)
- {
+ if ((linkTrainerId & 0xFF) == src->common.trainerIdLo
+ && ((linkTrainerId >> 8) & 0xFF) == src->common.trainerIdHi)
return FALSE;
- }
- tv2->common.trainerIdLo = tv2->common.srcTrainerIdLo;
- tv2->common.trainerIdHi = tv2->common.srcTrainerIdHi;
- tv2->common.srcTrainerIdLo = linkTrainerId & 0xFF;
- tv2->common.srcTrainerIdHi = linkTrainerId >> 8;
- *tv1 = *tv2;
- tv1->common.active = TRUE;
+
+ src->common.trainerIdLo = src->common.srcTrainerIdLo;
+ src->common.trainerIdHi = src->common.srcTrainerIdHi;
+ src->common.srcTrainerIdLo = linkTrainerId & 0xFF;
+ src->common.srcTrainerIdHi = linkTrainerId >> 8;
+ *dest = *src;
+ dest->common.active = TRUE;
return TRUE;
}
-static bool8 sub_80F05E8(TVShow *tv1, TVShow *tv2, u8 idx)
+static bool8 TryMixRecordMixTVShow(TVShow *dest, TVShow *src, u8 idx)
{
u32 linkTrainerId = GetLinkPlayerTrainerId(idx);
- if ((linkTrainerId & 0xFF) == tv2->common.srcTrainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.srcTrainerIdHi)
- {
+
+ if ((linkTrainerId & 0xFF) == src->common.srcTrainerIdLo
+ && ((linkTrainerId >> 8) & 0xFF) == src->common.srcTrainerIdHi)
return FALSE;
- }
- if ((linkTrainerId & 0xFF) == tv2->common.trainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.trainerIdHi)
- {
+
+ if ((linkTrainerId & 0xFF) == src->common.trainerIdLo
+ && ((linkTrainerId >> 8) & 0xFF) == src->common.trainerIdHi)
return FALSE;
- }
- tv2->common.srcTrainerIdLo = tv2->common.srcTrainerId2Lo;
- tv2->common.srcTrainerIdHi = tv2->common.srcTrainerId2Hi;
- tv2->common.srcTrainerId2Lo = linkTrainerId & 0xFF;
- tv2->common.srcTrainerId2Hi = linkTrainerId >> 8;
- *tv1 = *tv2;
- tv1->common.active = TRUE;
+
+ src->common.srcTrainerIdLo = src->common.srcTrainerId2Lo;
+ src->common.srcTrainerIdHi = src->common.srcTrainerId2Hi;
+ src->common.srcTrainerId2Lo = linkTrainerId & 0xFF;
+ src->common.srcTrainerId2Hi = linkTrainerId >> 8;
+ *dest = *src;
+ dest->common.active = TRUE;
return TRUE;
}
-static bool8 sub_80F0668(TVShow *tv1, TVShow *tv2, u8 idx)
+static bool8 TryMixOutbreakTVShow(TVShow *dest, TVShow *src, u8 idx)
{
u32 linkTrainerId = GetLinkPlayerTrainerId(idx);
- if ((linkTrainerId & 0xFF) == tv2->common.trainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.trainerIdHi)
- {
+
+ if ((linkTrainerId & 0xFF) == src->common.trainerIdLo
+ && ((linkTrainerId >> 8) & 0xFF) == src->common.trainerIdHi)
return FALSE;
- }
- tv2->common.trainerIdLo = tv2->common.srcTrainerIdLo;
- tv2->common.trainerIdHi = tv2->common.srcTrainerIdHi;
- tv2->common.srcTrainerIdLo = linkTrainerId & 0xFF;
- tv2->common.srcTrainerIdHi = linkTrainerId >> 8;
- *tv1 = *tv2;
- tv1->common.active = TRUE;
- tv1->massOutbreak.daysLeft = 1;
+
+ src->common.trainerIdLo = src->common.srcTrainerIdLo;
+ src->common.trainerIdHi = src->common.srcTrainerIdHi;
+ src->common.srcTrainerIdLo = linkTrainerId & 0xFF;
+ src->common.srcTrainerIdHi = linkTrainerId >> 8;
+ *dest = *src;
+ dest->common.active = TRUE;
+ dest->massOutbreak.daysLeft = 1;
return TRUE;
}
-static s8 sub_80F06D0(TVShow *tvShows)
+static s8 FindInactiveShowInArray(TVShow *tvShows)
{
u8 i;
- for (i = 0; i < LAST_TVSHOW_IDX; i ++)
+ for (i = 0; i < LAST_TVSHOW_IDX; i++)
{
- if (tvShows[i].common.active == FALSE && (u8)(tvShows[i].common.kind - 1) < 60)
- {
+ // Second check is to make sure its a valid show (not too high, not TVSHOW_OFF_AIR)
+ if (tvShows[i].common.active == FALSE && (u8)(tvShows[i].common.kind - 1) < TVGROUP_OUTBREAK_END)
return i;
- }
}
return -1;
}
-static void sub_80F0708(void) // FIXME: register allocation shenanigans
+static void DeactivateShowsWithUnseenSpecies(void)
{
u16 i;
- u16 j;
+ u16 species;
- for (i = 0; i < LAST_TVSHOW_IDX; i ++)
+ for (i = 0; i < LAST_TVSHOW_IDX; i++)
{
switch (gSaveBlock1Ptr->tvShows[i].common.kind)
{
- case TVSHOW_CONTEST_LIVE_UPDATES:
- j = (&gSaveBlock1Ptr->tvShows[i])->contestLiveUpdates.winningSpecies;
- sub_80F0B24(j, i);
- j = (&gSaveBlock1Ptr->tvShows[i])->contestLiveUpdates.losingSpecies;
- sub_80F0B24(j, i);
- break;
- case TVSHOW_3_CHEERS_FOR_POKEBLOCKS:
- break;
- case TVSHOW_BATTLE_UPDATE:
- j = (&gSaveBlock1Ptr->tvShows[i])->battleUpdate.speciesPlayer;
- sub_80F0B24(j, i);
- j = (&gSaveBlock1Ptr->tvShows[i])->battleUpdate.speciesOpponent;
- sub_80F0B24(j, i);
- break;
- case TVSHOW_FAN_CLUB_SPECIAL:
- break;
- case TVSHOW_LILYCOVE_CONTEST_LADY:
- break;
- case TVSHOW_OFF_AIR:
- break;
- case TVSHOW_FAN_CLUB_LETTER:
- j = (&gSaveBlock1Ptr->tvShows[i])->fanclubLetter.species;
- sub_80F0B24(j, i);
- break;
- case TVSHOW_RECENT_HAPPENINGS:
- break;
- case TVSHOW_PKMN_FAN_CLUB_OPINIONS:
- j = (&gSaveBlock1Ptr->tvShows[i])->fanclubOpinions.species;
- sub_80F0B24(j, i);
- break;
- case TVSHOW_UNKN_SHOWTYPE_04:
- j = (&gSaveBlock1Ptr->tvShows[i])->unkShow04.var06;
- sub_80F0B24(j, i);
- break;
- case TVSHOW_NAME_RATER_SHOW:
- j = (&gSaveBlock1Ptr->tvShows[i])->nameRaterShow.species;
- sub_80F0B24(j, i);
- j = (&gSaveBlock1Ptr->tvShows[i])->nameRaterShow.randomSpecies;
- sub_80F0B24(j, i);
- break;
- case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE:
- j = (&gSaveBlock1Ptr->tvShows[i])->bravoTrainer.species;
- sub_80F0B24(j, i);
- break;
- case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE:
- j = (&gSaveBlock1Ptr->tvShows[i])->bravoTrainerTower.species;
- sub_80F0B24(j, i);
- j = (&gSaveBlock1Ptr->tvShows[i])->bravoTrainerTower.defeatedSpecies;
- sub_80F0B24(j, i);
- break;
-
- case TVSHOW_POKEMON_TODAY_CAUGHT:
- j = (&gSaveBlock1Ptr->tvShows[i])->pokemonToday.species;
- sub_80F0B24(j, i);
- break;
- case TVSHOW_SMART_SHOPPER:
- break;
- case TVSHOW_POKEMON_TODAY_FAILED:
- j = (&gSaveBlock1Ptr->tvShows[i])->pokemonTodayFailed.species;
- sub_80F0B24(j, i);
- j = (&gSaveBlock1Ptr->tvShows[i])->pokemonTodayFailed.species2;
- sub_80F0B24(j, i);
- break;
- case TVSHOW_FISHING_ADVICE:
- j = (&gSaveBlock1Ptr->tvShows[i])->pokemonAngler.species;
- sub_80F0B24(j, i);
- break;
- case TVSHOW_WORLD_OF_MASTERS:
- j = (&gSaveBlock1Ptr->tvShows[i])->worldOfMasters.species;
- sub_80F0B24(j, i);
- j = (&gSaveBlock1Ptr->tvShows[i])->worldOfMasters.caughtPoke;
- sub_80F0B24(j, i);
- break;
-
- case TVSHOW_TODAYS_RIVAL_TRAINER:
- break;
- case TVSHOW_TREND_WATCHER:
- break;
- case TVSHOW_TREASURE_INVESTIGATORS:
- break;
- case TVSHOW_FIND_THAT_GAMER:
- break;
- case TVSHOW_BREAKING_NEWS:
- j = (&gSaveBlock1Ptr->tvShows[i])->breakingNews.lastOpponentSpecies;
- sub_80F0B24(j, i);
- j = (&gSaveBlock1Ptr->tvShows[i])->breakingNews.poke1Species;
- sub_80F0B24(j, i);
- break;
- case TVSHOW_SECRET_BASE_VISIT:
- j = (&gSaveBlock1Ptr->tvShows[i])->secretBaseVisit.species;
- sub_80F0B24(j, i);
- break;
- case TVSHOW_LOTTO_WINNER:
- break;
- case TVSHOW_BATTLE_SEMINAR:
- j = (&gSaveBlock1Ptr->tvShows[i])->battleSeminar.species;
- sub_80F0B24(j, i);
- j = (&gSaveBlock1Ptr->tvShows[i])->battleSeminar.foeSpecies;
- sub_80F0B24(j, i);
- break;
- case TVSHOW_TRAINER_FAN_CLUB:
- break;
- case TVSHOW_CUTIES:
- break;
- case TVSHOW_FRONTIER:
- j = (&gSaveBlock1Ptr->tvShows[i])->frontier.species1;
- sub_80F0B24(j, i);
- j = (&gSaveBlock1Ptr->tvShows[i])->frontier.species2;
- sub_80F0B24(j, i);
- j = (&gSaveBlock1Ptr->tvShows[i])->frontier.facility;
- switch (j)
- {
- case 3:
- case 4:
- break;
- case 1:
- case 5 ... 13:
- j = (&gSaveBlock1Ptr->tvShows[i])->frontier.species3;
- sub_80F0B24(j, i);
- break;
- case 2:
- j = (&gSaveBlock1Ptr->tvShows[i])->frontier.species3;
- sub_80F0B24(j, i);
- j = (&gSaveBlock1Ptr->tvShows[i])->frontier.species4;
- sub_80F0B24(j, i);
- break;
- }
- break;
- case TVSHOW_NUMBER_ONE:
- break;
- case TVSHOW_SECRET_BASE_SECRETS:
- break;
- case TVSHOW_SAFARI_FAN_CLUB:
- break;
-
- case TVSHOW_MASS_OUTBREAK:
- break;
-
- default:
- SetTvShowInactive(i);
- break;
+ case TVSHOW_CONTEST_LIVE_UPDATES:
+ species = (&gSaveBlock1Ptr->tvShows[i])->contestLiveUpdates.winningSpecies;
+ DeactivateShowIfNotSeenSpecies(species, i);
+ species = (&gSaveBlock1Ptr->tvShows[i])->contestLiveUpdates.losingSpecies;
+ DeactivateShowIfNotSeenSpecies(species, i);
+ break;
+ case TVSHOW_BATTLE_UPDATE:
+ species = (&gSaveBlock1Ptr->tvShows[i])->battleUpdate.speciesPlayer;
+ DeactivateShowIfNotSeenSpecies(species, i);
+ species = (&gSaveBlock1Ptr->tvShows[i])->battleUpdate.speciesOpponent;
+ DeactivateShowIfNotSeenSpecies(species, i);
+ break;
+ case TVSHOW_FAN_CLUB_LETTER:
+ species = (&gSaveBlock1Ptr->tvShows[i])->fanclubLetter.species;
+ DeactivateShowIfNotSeenSpecies(species, i);
+ break;
+ case TVSHOW_PKMN_FAN_CLUB_OPINIONS:
+ species = (&gSaveBlock1Ptr->tvShows[i])->fanclubOpinions.species;
+ DeactivateShowIfNotSeenSpecies(species, i);
+ break;
+ case TVSHOW_DUMMY:
+ species = (&gSaveBlock1Ptr->tvShows[i])->dummy.species;
+ DeactivateShowIfNotSeenSpecies(species, i);
+ break;
+ case TVSHOW_NAME_RATER_SHOW:
+ species = (&gSaveBlock1Ptr->tvShows[i])->nameRaterShow.species;
+ DeactivateShowIfNotSeenSpecies(species, i);
+ species = (&gSaveBlock1Ptr->tvShows[i])->nameRaterShow.randomSpecies;
+ DeactivateShowIfNotSeenSpecies(species, i);
+ break;
+ case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE:
+ species = (&gSaveBlock1Ptr->tvShows[i])->bravoTrainer.species;
+ DeactivateShowIfNotSeenSpecies(species, i);
+ break;
+ case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE:
+ species = (&gSaveBlock1Ptr->tvShows[i])->bravoTrainerTower.species;
+ DeactivateShowIfNotSeenSpecies(species, i);
+ species = (&gSaveBlock1Ptr->tvShows[i])->bravoTrainerTower.defeatedSpecies;
+ DeactivateShowIfNotSeenSpecies(species, i);
+ break;
+ case TVSHOW_POKEMON_TODAY_CAUGHT:
+ species = (&gSaveBlock1Ptr->tvShows[i])->pokemonToday.species;
+ DeactivateShowIfNotSeenSpecies(species, i);
+ break;
+ case TVSHOW_POKEMON_TODAY_FAILED:
+ species = (&gSaveBlock1Ptr->tvShows[i])->pokemonTodayFailed.species;
+ DeactivateShowIfNotSeenSpecies(species, i);
+ species = (&gSaveBlock1Ptr->tvShows[i])->pokemonTodayFailed.species2;
+ DeactivateShowIfNotSeenSpecies(species, i);
+ break;
+ case TVSHOW_FISHING_ADVICE:
+ species = (&gSaveBlock1Ptr->tvShows[i])->pokemonAngler.species;
+ DeactivateShowIfNotSeenSpecies(species, i);
+ break;
+ case TVSHOW_WORLD_OF_MASTERS:
+ species = (&gSaveBlock1Ptr->tvShows[i])->worldOfMasters.species;
+ DeactivateShowIfNotSeenSpecies(species, i);
+ species = (&gSaveBlock1Ptr->tvShows[i])->worldOfMasters.caughtPoke;
+ DeactivateShowIfNotSeenSpecies(species, i);
+ break;
+ case TVSHOW_BREAKING_NEWS:
+ species = (&gSaveBlock1Ptr->tvShows[i])->breakingNews.lastOpponentSpecies;
+ DeactivateShowIfNotSeenSpecies(species, i);
+ species = (&gSaveBlock1Ptr->tvShows[i])->breakingNews.poke1Species;
+ DeactivateShowIfNotSeenSpecies(species, i);
+ break;
+ case TVSHOW_SECRET_BASE_VISIT:
+ species = (&gSaveBlock1Ptr->tvShows[i])->secretBaseVisit.species;
+ DeactivateShowIfNotSeenSpecies(species, i);
+ break;
+ case TVSHOW_BATTLE_SEMINAR:
+ species = (&gSaveBlock1Ptr->tvShows[i])->battleSeminar.species;
+ DeactivateShowIfNotSeenSpecies(species, i);
+ species = (&gSaveBlock1Ptr->tvShows[i])->battleSeminar.foeSpecies;
+ DeactivateShowIfNotSeenSpecies(species, i);
+ break;
+ case TVSHOW_FRONTIER:
+ species = (&gSaveBlock1Ptr->tvShows[i])->frontier.species1;
+ DeactivateShowIfNotSeenSpecies(species, i);
+ species = (&gSaveBlock1Ptr->tvShows[i])->frontier.species2;
+ DeactivateShowIfNotSeenSpecies(species, i);
+ // Species var re-used here
+ species = (&gSaveBlock1Ptr->tvShows[i])->frontier.facilityAndMode;
+ switch (species)
+ {
+ case FRONTIER_SHOW_TOWER_MULTIS:
+ case FRONTIER_SHOW_TOWER_LINK_MULTIS:
+ break;
+ case FRONTIER_SHOW_TOWER_SINGLES:
+ case FRONTIER_SHOW_DOME_SINGLES:
+ case FRONTIER_SHOW_DOME_DOUBLES:
+ case FRONTIER_SHOW_FACTORY_SINGLES:
+ case FRONTIER_SHOW_FACTORY_DOUBLES:
+ case FRONTIER_SHOW_PIKE:
+ case FRONTIER_SHOW_ARENA:
+ case FRONTIER_SHOW_PALACE_SINGLES:
+ case FRONTIER_SHOW_PALACE_DOUBLES:
+ case FRONTIER_SHOW_PYRAMID:
+ species = (&gSaveBlock1Ptr->tvShows[i])->frontier.species3;
+ DeactivateShowIfNotSeenSpecies(species, i);
+ break;
+ case FRONTIER_SHOW_TOWER_DOUBLES:
+ species = (&gSaveBlock1Ptr->tvShows[i])->frontier.species3;
+ DeactivateShowIfNotSeenSpecies(species, i);
+ species = (&gSaveBlock1Ptr->tvShows[i])->frontier.species4;
+ DeactivateShowIfNotSeenSpecies(species, i);
+ break;
+ }
+ break;
+ // Shows with no species
+ case TVSHOW_OFF_AIR:
+ case TVSHOW_RECENT_HAPPENINGS:
+ case TVSHOW_3_CHEERS_FOR_POKEBLOCKS:
+ case TVSHOW_TODAYS_RIVAL_TRAINER:
+ case TVSHOW_TREND_WATCHER:
+ case TVSHOW_TREASURE_INVESTIGATORS:
+ case TVSHOW_FIND_THAT_GAMER:
+ case TVSHOW_TRAINER_FAN_CLUB:
+ case TVSHOW_CUTIES:
+ case TVSHOW_SMART_SHOPPER:
+ case TVSHOW_FAN_CLUB_SPECIAL:
+ case TVSHOW_LILYCOVE_CONTEST_LADY:
+ case TVSHOW_LOTTO_WINNER:
+ case TVSHOW_NUMBER_ONE:
+ case TVSHOW_SECRET_BASE_SECRETS:
+ case TVSHOW_SAFARI_FAN_CLUB:
+ case TVSHOW_MASS_OUTBREAK:
+ break;
+ default:
+ DeactivateShow(i);
+ break;
}
}
}
-void SetTvShowInactive(u8 showIdx)
+static void DeactivateShow(u8 showIdx)
{
gSaveBlock1Ptr->tvShows[showIdx].common.active = FALSE;
}
-static void sub_80F0B24(u16 species, u8 showIdx)
+static void DeactivateShowIfNotSeenSpecies(u16 species, u8 showIdx)
{
if (!GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_SEEN))
- {
gSaveBlock1Ptr->tvShows[showIdx].common.active = FALSE;
- }
}
-static void sub_80F0B64(void)
+static void DeactivateGameCompleteShowsIfNotUnlocked(void)
{
u16 i;
if (FlagGet(FLAG_SYS_GAME_CLEAR) != TRUE)
{
- for (i = 0; i < LAST_TVSHOW_IDX; i ++)
+ for (i = 0; i < LAST_TVSHOW_IDX; i++)
{
if (gSaveBlock1Ptr->tvShows[i].common.kind == TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE)
- {
gSaveBlock1Ptr->tvShows[i].common.active = FALSE;
- }
else if (gSaveBlock1Ptr->tvShows[i].common.kind == TVSHOW_MASS_OUTBREAK)
- {
gSaveBlock1Ptr->tvShows[i].common.active = FALSE;
- }
}
}
}
-void sub_80F0BB8(void)
+void DeactivateAllNormalTVShows(void)
{
u8 i;
- for (i = 0; i < 5; i ++)
+ for (i = 0; i < NUM_NORMAL_TVSHOW_SLOTS; i++)
{
- if (GetTVChannelByShowType(gSaveBlock1Ptr->tvShows[i].common.kind) == 2)
- {
+ if (GetTVGroupByShowId(gSaveBlock1Ptr->tvShows[i].common.kind) == TVGROUP_NORMAL)
gSaveBlock1Ptr->tvShows[i].common.active = FALSE;
- }
}
}
-static void sub_80F0C04(void)
+// Ensures a minimum of 5 empty mixed show slots
+static void DeleteExcessMixedShows(void)
{
s8 i;
- s8 ct;
-
- ct = 0;
- for (i = 5; i < LAST_TVSHOW_IDX; i ++)
+ s8 numEmptyMixSlots = 0;
+ for (i = NUM_NORMAL_TVSHOW_SLOTS; i < LAST_TVSHOW_IDX; i++)
{
if (gSaveBlock1Ptr->tvShows[i].common.kind == TVSHOW_OFF_AIR)
- {
- ct ++;
- }
- }
- for (i = 0; i < 5 - ct; i ++)
- {
- DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, i + 5);
+ numEmptyMixSlots++;
}
+ for (i = 0; i < NUM_NORMAL_TVSHOW_SLOTS - numEmptyMixSlots; i++)
+ DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, i + NUM_NORMAL_TVSHOW_SLOTS);
}
-void ReceivePokeNewsData(void *src, u32 size, u8 masterIdx)
+void ReceivePokeNewsData(void *src, u32 size, u8 playersLinkId)
{
u8 i;
- PokeNews (*rmBuffer2)[4][16];
- PokeNews (*rmBuffer)[4][16];
+ PokeNews (*rmBuffer2)[MAX_LINK_PLAYERS][POKE_NEWS_COUNT];
+ PokeNews (*rmBuffer)[MAX_LINK_PLAYERS][POKE_NEWS_COUNT];
- rmBuffer2 = malloc(4 * 16 * sizeof(PokeNews));
+ rmBuffer2 = malloc(MAX_LINK_PLAYERS * POKE_NEWS_COUNT * sizeof(PokeNews));
if (rmBuffer2 != NULL)
{
- for (i = 0; i < 4; i ++)
- {
+ for (i = 0; i < MAX_LINK_PLAYERS; i++)
memcpy((*rmBuffer2)[i], src + i * size, sizeof((*rmBuffer2)[i]));
- }
+
rmBuffer = rmBuffer2;
- switch (masterIdx)
+
+ // Position player's PokeNews in argument list depending on link id
+ switch (playersLinkId)
{
- case 0:
- sub_80F0D60(gSaveBlock1Ptr->pokeNews, (*rmBuffer)[1], (*rmBuffer)[2], (*rmBuffer)[3]);
- break;
- case 1:
- sub_80F0D60((*rmBuffer)[0], gSaveBlock1Ptr->pokeNews, (*rmBuffer)[2], (*rmBuffer)[3]);
- break;
- case 2:
- sub_80F0D60((*rmBuffer)[0], (*rmBuffer)[1], gSaveBlock1Ptr->pokeNews, (*rmBuffer)[3]);
- break;
- case 3:
- sub_80F0D60((*rmBuffer)[0], (*rmBuffer)[1], (*rmBuffer)[2], gSaveBlock1Ptr->pokeNews);
- break;
+ case 0:
+ SetMixedPokeNews(gSaveBlock1Ptr->pokeNews, (*rmBuffer)[1], (*rmBuffer)[2], (*rmBuffer)[3]);
+ break;
+ case 1:
+ SetMixedPokeNews((*rmBuffer)[0], gSaveBlock1Ptr->pokeNews, (*rmBuffer)[2], (*rmBuffer)[3]);
+ break;
+ case 2:
+ SetMixedPokeNews((*rmBuffer)[0], (*rmBuffer)[1], gSaveBlock1Ptr->pokeNews, (*rmBuffer)[3]);
+ break;
+ case 3:
+ SetMixedPokeNews((*rmBuffer)[0], (*rmBuffer)[1], (*rmBuffer)[2], gSaveBlock1Ptr->pokeNews);
+ break;
}
- sub_80F0EEC();
- sub_80F0F24();
+ ClearInvalidPokeNews();
+ ClearPokeNewsIfGameNotComplete();
free(rmBuffer2);
}
}
-static void sub_80F0D60(PokeNews player1[16], PokeNews player2[16], PokeNews player3[16], PokeNews player4[16])
+static void SetMixedPokeNews(PokeNews player1[POKE_NEWS_COUNT], PokeNews player2[POKE_NEWS_COUNT], PokeNews player3[POKE_NEWS_COUNT], PokeNews player4[POKE_NEWS_COUNT])
{
- u8 i;
- u8 j;
- u8 k;
- PokeNews **argslist[4];
+ u8 i, j, k;
+ PokeNews **pokeNews[MAX_LINK_PLAYERS];
- argslist[0] = &player1;
- argslist[1] = &player2;
- argslist[2] = &player3;
- argslist[3] = &player4;
+ pokeNews[0] = &player1;
+ pokeNews[1] = &player2;
+ pokeNews[2] = &player3;
+ pokeNews[3] = &player4;
sTVShowNewsMixingNumPlayers = GetLinkPlayerCount();
- for (i = 0; i < POKE_NEWS_COUNT; i ++)
+ for (i = 0; i < POKE_NEWS_COUNT; i++)
{
- for (j = 0; j < sTVShowNewsMixingNumPlayers; j ++)
+ for (j = 0; j < sTVShowNewsMixingNumPlayers; j++)
{
- sTVShowMixingCurSlot = sub_80F0ECC(*argslist[j], i);
+ sTVShowMixingCurSlot = GetPokeNewsSlotIfActive(*pokeNews[j], i);
if (sTVShowMixingCurSlot != -1)
{
for (k = 0; k < sTVShowNewsMixingNumPlayers - 1; k++)
{
- sCurTVShowSlot = sub_80EEE30(*argslist[(j + k + 1) % sTVShowNewsMixingNumPlayers]);
+ sCurTVShowSlot = GetFirstEmptyPokeNewsSlot(*pokeNews[(j + k + 1) % sTVShowNewsMixingNumPlayers]);
if (sCurTVShowSlot != -1)
- {
- sub_80F0E58(argslist[(j + k + 1) % sTVShowNewsMixingNumPlayers], argslist[j]);
- }
+ InitTryMixPokeNewsShow(pokeNews[(j + k + 1) % sTVShowNewsMixingNumPlayers], pokeNews[j]);
}
}
}
}
}
-static void sub_80F0E58(PokeNews *dest[16], PokeNews *src[16])
+static void InitTryMixPokeNewsShow(PokeNews *dest[POKE_NEWS_COUNT], PokeNews *src[POKE_NEWS_COUNT])
{
- PokeNews *ptr1;
- PokeNews *ptr2;
-
- ptr1 = *dest;
- ptr2 = *src;
+ PokeNews *ptr1 = *dest;
+ PokeNews *ptr2 = *src;
ptr2 += sTVShowMixingCurSlot;
- sub_80F0E84(ptr1, ptr2, sCurTVShowSlot);
+ TryMixPokeNewsShow(ptr1, ptr2, sCurTVShowSlot);
}
-static bool8 sub_80F0E84(PokeNews *dest, PokeNews *src, s8 slot)
+static bool8 TryMixPokeNewsShow(PokeNews *dest, PokeNews *src, s8 slot)
{
u8 i;
if (src->kind == POKENEWS_NONE)
- {
return FALSE;
- }
- for (i = 0; i < POKE_NEWS_COUNT; i ++)
+
+ for (i = 0; i < POKE_NEWS_COUNT; i++)
{
if (dest[i].kind == src->kind)
- {
return FALSE;
- }
}
dest[slot].kind = src->kind;
dest[slot].state = 1;
@@ -4107,43 +3902,38 @@ static bool8 sub_80F0E84(PokeNews *dest, PokeNews *src, s8 slot)
return TRUE;
}
-static s8 sub_80F0ECC(PokeNews *pokeNews, u8 idx)
+static s8 GetPokeNewsSlotIfActive(PokeNews *pokeNews, u8 idx)
{
if (pokeNews[idx].kind == POKENEWS_NONE)
- {
return -1;
- }
+
return idx;
}
-static void sub_80F0EEC(void)
+static void ClearInvalidPokeNews(void)
{
u8 i;
- for (i = 0; i < POKE_NEWS_COUNT; i ++)
+ for (i = 0; i < POKE_NEWS_COUNT; i++)
{
if (gSaveBlock1Ptr->pokeNews[i].kind > POKENEWS_BLENDMASTER)
- {
- ClearPokemonNewsI(i);
- }
+ ClearPokeNewsBySlot(i);
}
- sub_80EEEB8();
+ CompactPokeNews();
}
-static void sub_80F0F24(void)
+static void ClearPokeNewsIfGameNotComplete(void)
{
u8 i;
if (FlagGet(FLAG_SYS_GAME_CLEAR) != TRUE)
{
- for (i = 0; i < POKE_NEWS_COUNT; i ++)
- {
+ for (i = 0; i < POKE_NEWS_COUNT; i++)
gSaveBlock1Ptr->pokeNews[i].state = 0;
- }
}
}
-#define tvlangfix(strptr, langptr, langfix) \
+#define SetStrLanguage(strptr, langptr, langfix) \
if (IsStringJapanese(strptr)) \
{ \
(langptr) = LANGUAGE_JAPANESE; \
@@ -4153,348 +3943,341 @@ else \
(langptr) = langfix; \
}
-static void sub_80F0F64(TVShow *show, u32 language)
+// Unused
+static void TranslateShowNames(TVShow *show, u32 language)
{
int i;
- TVShow **r4;
+ TVShow **shows;
- r4 = calloc(11, sizeof(TVShow *));
- for (i = 0; i < LAST_TVSHOW_IDX; i ++)
+ shows = calloc(11, sizeof(TVShow *));
+ for (i = 0; i < LAST_TVSHOW_IDX; i++)
{
switch (show[i].common.kind)
{
- case TVSHOW_FAN_CLUB_LETTER:
- case TVSHOW_RECENT_HAPPENINGS:
- r4[0] = &show[i];
- tvlangfix(r4[0]->fanclubLetter.playerName, r4[0]->fanclubLetter.language, language);
- break;
- case TVSHOW_PKMN_FAN_CLUB_OPINIONS:
- r4[1] = &show[i];
- tvlangfix(r4[1]->fanclubOpinions.playerName, r4[1]->fanclubOpinions.language, language);
- tvlangfix(r4[1]->fanclubOpinions.nickname, r4[1]->fanclubOpinions.pokemonNameLanguage, language);
- break;
- case TVSHOW_POKEMON_TODAY_CAUGHT:
- r4[6] = &show[i];
- tvlangfix(r4[6]->pokemonToday.playerName, r4[6]->pokemonToday.language, language);
- tvlangfix(r4[6]->pokemonToday.nickname, r4[6]->pokemonToday.language2, language);
- break;
- case TVSHOW_SMART_SHOPPER:
- r4[7] = &show[i];
- tvlangfix(r4[7]->smartshopperShow.playerName, r4[7]->smartshopperShow.language, language);
- break;
- case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE:
- r4[5] = &show[i];
- tvlangfix(r4[5]->bravoTrainerTower.trainerName, r4[5]->bravoTrainerTower.language, language);
- tvlangfix(r4[5]->bravoTrainerTower.pokemonName, r4[5]->bravoTrainerTower.pokemonNameLanguage, language);
- break;
- case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE:
- r4[4] = &show[i];
- tvlangfix(r4[4]->bravoTrainer.playerName, r4[4]->bravoTrainer.language, language);
- tvlangfix(r4[4]->bravoTrainer.pokemonNickname, r4[4]->bravoTrainer.pokemonNameLanguage, language);
- break;
- case TVSHOW_NAME_RATER_SHOW:
- r4[3] = &show[i];
- tvlangfix(r4[3]->nameRaterShow.trainerName, r4[3]->nameRaterShow.language, language);
- tvlangfix(r4[3]->nameRaterShow.pokemonName, r4[3]->nameRaterShow.pokemonNameLanguage, language);
- break;
- case TVSHOW_POKEMON_TODAY_FAILED:
- r4[2] = &show[i];
- tvlangfix(r4[2]->pokemonTodayFailed.playerName, r4[2]->pokemonTodayFailed.language, language);
- break;
- case TVSHOW_FISHING_ADVICE:
- r4[8] = &show[i];
- tvlangfix(r4[8]->pokemonAngler.playerName, r4[8]->pokemonAngler.language, language);
- break;
- case TVSHOW_WORLD_OF_MASTERS:
- r4[9] = &show[i];
- tvlangfix(r4[9]->worldOfMasters.playerName, r4[9]->worldOfMasters.language, language);
- break;
- case TVSHOW_MASS_OUTBREAK:
- r4[10] = &show[i];
- r4[10]->massOutbreak.language = language;
- break;
+ case TVSHOW_FAN_CLUB_LETTER:
+ case TVSHOW_RECENT_HAPPENINGS: // NOTE: These two shows are assumed to have the same struct layout
+ shows[0] = &show[i];
+ SetStrLanguage(shows[0]->fanclubLetter.playerName, shows[0]->fanclubLetter.language, language);
+ break;
+ case TVSHOW_PKMN_FAN_CLUB_OPINIONS:
+ shows[1] = &show[i];
+ SetStrLanguage(shows[1]->fanclubOpinions.playerName, shows[1]->fanclubOpinions.language, language);
+ SetStrLanguage(shows[1]->fanclubOpinions.nickname, shows[1]->fanclubOpinions.pokemonNameLanguage, language);
+ break;
+ case TVSHOW_POKEMON_TODAY_CAUGHT:
+ shows[6] = &show[i];
+ SetStrLanguage(shows[6]->pokemonToday.playerName, shows[6]->pokemonToday.language, language);
+ SetStrLanguage(shows[6]->pokemonToday.nickname, shows[6]->pokemonToday.language2, language);
+ break;
+ case TVSHOW_SMART_SHOPPER:
+ shows[7] = &show[i];
+ SetStrLanguage(shows[7]->smartshopperShow.playerName, shows[7]->smartshopperShow.language, language);
+ break;
+ case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE:
+ shows[5] = &show[i];
+ SetStrLanguage(shows[5]->bravoTrainerTower.trainerName, shows[5]->bravoTrainerTower.language, language);
+ SetStrLanguage(shows[5]->bravoTrainerTower.pokemonName, shows[5]->bravoTrainerTower.pokemonNameLanguage, language);
+ break;
+ case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE:
+ shows[4] = &show[i];
+ SetStrLanguage(shows[4]->bravoTrainer.playerName, shows[4]->bravoTrainer.language, language);
+ SetStrLanguage(shows[4]->bravoTrainer.pokemonNickname, shows[4]->bravoTrainer.pokemonNameLanguage, language);
+ break;
+ case TVSHOW_NAME_RATER_SHOW:
+ shows[3] = &show[i];
+ SetStrLanguage(shows[3]->nameRaterShow.trainerName, shows[3]->nameRaterShow.language, language);
+ SetStrLanguage(shows[3]->nameRaterShow.pokemonName, shows[3]->nameRaterShow.pokemonNameLanguage, language);
+ break;
+ case TVSHOW_POKEMON_TODAY_FAILED:
+ shows[2] = &show[i];
+ SetStrLanguage(shows[2]->pokemonTodayFailed.playerName, shows[2]->pokemonTodayFailed.language, language);
+ break;
+ case TVSHOW_FISHING_ADVICE:
+ shows[8] = &show[i];
+ SetStrLanguage(shows[8]->pokemonAngler.playerName, shows[8]->pokemonAngler.language, language);
+ break;
+ case TVSHOW_WORLD_OF_MASTERS:
+ shows[9] = &show[i];
+ SetStrLanguage(shows[9]->worldOfMasters.playerName, shows[9]->worldOfMasters.language, language);
+ break;
+ case TVSHOW_MASS_OUTBREAK:
+ shows[10] = &show[i];
+ shows[10]->massOutbreak.language = language;
+ break;
}
}
- free(r4);
+ free(shows);
}
-void sub_80F1208(TVShow *shows)
+void SanitizeTVShowsForRuby(TVShow *shows)
{
TVShow *curShow;
- sub_80F14F8(shows);
- for (curShow = shows; curShow < shows + LAST_TVSHOW_IDX; curShow ++)
+ SanitizeTVShowLocationsForRuby(shows);
+ for (curShow = shows; curShow < shows + LAST_TVSHOW_IDX; curShow++)
{
if (curShow->bravoTrainerTower.kind == TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE)
{
- if ((curShow->bravoTrainerTower.language == LANGUAGE_JAPANESE && curShow->bravoTrainerTower.pokemonNameLanguage != LANGUAGE_JAPANESE) || (curShow->bravoTrainerTower.language != LANGUAGE_JAPANESE && curShow->bravoTrainerTower.pokemonNameLanguage == LANGUAGE_JAPANESE))
- {
+ if ((curShow->bravoTrainerTower.language == LANGUAGE_JAPANESE && curShow->bravoTrainerTower.pokemonNameLanguage != LANGUAGE_JAPANESE)
+ || (curShow->bravoTrainerTower.language != LANGUAGE_JAPANESE && curShow->bravoTrainerTower.pokemonNameLanguage == LANGUAGE_JAPANESE))
memset(curShow, 0, sizeof(TVShow));
- }
}
}
}
-static void sub_80F1254(TVShow *shows)
+static void TranslateRubyShows(TVShow *shows)
{
TVShow *curShow;
- for (curShow = shows; curShow < shows + LAST_TVSHOW_IDX; curShow ++)
+ for (curShow = shows; curShow < shows + LAST_TVSHOW_IDX; curShow++)
{
if (curShow->bravoTrainerTower.kind == TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE)
{
if (IsStringJapanese(curShow->bravoTrainerTower.pokemonName))
- {
curShow->bravoTrainerTower.pokemonNameLanguage = LANGUAGE_JAPANESE;
- }
else
- {
curShow->bravoTrainerTower.pokemonNameLanguage = GAME_LANGUAGE;
- }
}
}
}
-u8 TV_GetStringLanguage(u8 *str)
+static u8 GetStringLanguage(u8 *str)
{
return IsStringJapanese(str) ? LANGUAGE_JAPANESE : GAME_LANGUAGE;
}
-static void sub_80F12A4(TVShow *shows)
+static void TranslateJapaneseEmeraldShows(TVShow *shows)
{
TVShow *curShow;
- for (curShow = shows; curShow < shows + LAST_TVSHOW_IDX; curShow ++)
+ for (curShow = shows; curShow < shows + LAST_TVSHOW_IDX; curShow++)
{
switch(curShow->common.kind)
{
- case TVSHOW_FAN_CLUB_LETTER:
- curShow->fanclubLetter.language = TV_GetStringLanguage(curShow->fanclubLetter.playerName);
- break;
- case TVSHOW_RECENT_HAPPENINGS:
- curShow->recentHappenings.language = TV_GetStringLanguage(curShow->recentHappenings.playerName);
- break;
- case TVSHOW_PKMN_FAN_CLUB_OPINIONS:
- curShow->fanclubOpinions.language = TV_GetStringLanguage(curShow->fanclubOpinions.playerName);
- curShow->fanclubOpinions.pokemonNameLanguage = TV_GetStringLanguage(curShow->fanclubOpinions.nickname);
- break;
- case TVSHOW_UNKN_SHOWTYPE_04:
- curShow->unkShow04.language = TV_GetStringLanguage(curShow->unkShow04.string_0b);
- break;
- case TVSHOW_NAME_RATER_SHOW:
- curShow->nameRaterShow.language = TV_GetStringLanguage(curShow->nameRaterShow.trainerName);
- curShow->nameRaterShow.pokemonNameLanguage = TV_GetStringLanguage(curShow->nameRaterShow.pokemonName);
- break;
- case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE:
- curShow->bravoTrainer.language = TV_GetStringLanguage(curShow->bravoTrainer.playerName);
- curShow->bravoTrainer.pokemonNameLanguage = TV_GetStringLanguage(curShow->bravoTrainer.pokemonNickname);
- break;
- case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE:
- curShow->bravoTrainerTower.language = TV_GetStringLanguage(curShow->bravoTrainerTower.trainerName);
- curShow->bravoTrainerTower.pokemonNameLanguage = TV_GetStringLanguage(curShow->bravoTrainerTower.pokemonName);
- break;
- case TVSHOW_CONTEST_LIVE_UPDATES:
- curShow->contestLiveUpdates.winningTrainerLanguage = TV_GetStringLanguage(curShow->contestLiveUpdates.winningTrainerName);
- curShow->contestLiveUpdates.losingTrainerLanguage = TV_GetStringLanguage(curShow->contestLiveUpdates.losingTrainerName);
- break;
- case TVSHOW_3_CHEERS_FOR_POKEBLOCKS:
- curShow->threeCheers.language = TV_GetStringLanguage(curShow->threeCheers.playerName);
- curShow->threeCheers.worstBlenderLanguage = TV_GetStringLanguage(curShow->threeCheers.worstBlenderName);
- break;
- case TVSHOW_BATTLE_UPDATE:
- curShow->battleUpdate.language = TV_GetStringLanguage(curShow->battleUpdate.playerName);
- curShow->battleUpdate.linkOpponentLanguage = TV_GetStringLanguage(curShow->battleUpdate.linkOpponentName);
- break;
- case TVSHOW_FAN_CLUB_SPECIAL:
- curShow->fanClubSpecial.language = TV_GetStringLanguage(curShow->fanClubSpecial.playerName);
- curShow->fanClubSpecial.idolNameLanguage = TV_GetStringLanguage(curShow->fanClubSpecial.idolName);
- break;
- case TVSHOW_LILYCOVE_CONTEST_LADY:
- curShow->contestLady.language = TV_GetStringLanguage(curShow->contestLady.playerName);
- curShow->contestLady.pokemonNameLanguage = TV_GetStringLanguage(curShow->contestLady.nickname);
- break;
- case TVSHOW_POKEMON_TODAY_CAUGHT:
- curShow->pokemonToday.language = TV_GetStringLanguage(curShow->pokemonToday.playerName);
- curShow->pokemonToday.language2 = TV_GetStringLanguage(curShow->pokemonToday.nickname);
- break;
- case TVSHOW_SMART_SHOPPER:
- curShow->smartshopperShow.language = TV_GetStringLanguage(curShow->smartshopperShow.playerName);
- break;
- case TVSHOW_POKEMON_TODAY_FAILED:
- curShow->pokemonTodayFailed.language = TV_GetStringLanguage(curShow->pokemonTodayFailed.playerName);
- break;
- case TVSHOW_FISHING_ADVICE:
- curShow->pokemonAngler.language = TV_GetStringLanguage(curShow->pokemonAngler.playerName);
- break;
- case TVSHOW_WORLD_OF_MASTERS:
- curShow->worldOfMasters.language = TV_GetStringLanguage(curShow->worldOfMasters.playerName);
- break;
- case TVSHOW_TREND_WATCHER:
- curShow->trendWatcher.language = TV_GetStringLanguage(curShow->trendWatcher.playerName);
- break;
- case TVSHOW_BREAKING_NEWS:
- curShow->breakingNews.language = TV_GetStringLanguage(curShow->breakingNews.playerName);
- break;
- case TVSHOW_BATTLE_SEMINAR:
- curShow->battleSeminar.language = TV_GetStringLanguage(curShow->battleSeminar.playerName);
- break;
- case TVSHOW_FIND_THAT_GAMER:
- case TVSHOW_TRAINER_FAN_CLUB:
- curShow->trainerFanClub.language = TV_GetStringLanguage(curShow->trainerFanClub.playerName);
- break;
- case TVSHOW_CUTIES:
- curShow->cuties.language = TV_GetStringLanguage(curShow->cuties.playerName);
- curShow->cuties.pokemonNameLanguage = TV_GetStringLanguage(curShow->cuties.nickname);
- break;
- case TVSHOW_TODAYS_RIVAL_TRAINER:
- case TVSHOW_SECRET_BASE_VISIT:
- case TVSHOW_FRONTIER:
- curShow->rivalTrainer.language = TV_GetStringLanguage(curShow->rivalTrainer.playerName);
- break;
- case TVSHOW_TREASURE_INVESTIGATORS:
- case TVSHOW_LOTTO_WINNER:
- case TVSHOW_NUMBER_ONE:
- curShow->treasureInvestigators.language = TV_GetStringLanguage(curShow->treasureInvestigators.playerName);
- break;
- case TVSHOW_SECRET_BASE_SECRETS:
- curShow->secretBaseSecrets.language = TV_GetStringLanguage(curShow->secretBaseSecrets.playerName);
- curShow->secretBaseSecrets.baseOwnersNameLanguage = TV_GetStringLanguage(curShow->secretBaseSecrets.baseOwnersName);
- break;
- case TVSHOW_SAFARI_FAN_CLUB:
- curShow->safariFanClub.language = TV_GetStringLanguage(curShow->safariFanClub.playerName);
- break;
- case TVSHOW_MASS_OUTBREAK:
- break;
+ case TVSHOW_FAN_CLUB_LETTER:
+ curShow->fanclubLetter.language = GetStringLanguage(curShow->fanclubLetter.playerName);
+ break;
+ case TVSHOW_RECENT_HAPPENINGS:
+ curShow->recentHappenings.language = GetStringLanguage(curShow->recentHappenings.playerName);
+ break;
+ case TVSHOW_PKMN_FAN_CLUB_OPINIONS:
+ curShow->fanclubOpinions.language = GetStringLanguage(curShow->fanclubOpinions.playerName);
+ curShow->fanclubOpinions.pokemonNameLanguage = GetStringLanguage(curShow->fanclubOpinions.nickname);
+ break;
+ case TVSHOW_DUMMY:
+ curShow->dummy.language = GetStringLanguage(curShow->dummy.name);
+ break;
+ case TVSHOW_NAME_RATER_SHOW:
+ curShow->nameRaterShow.language = GetStringLanguage(curShow->nameRaterShow.trainerName);
+ curShow->nameRaterShow.pokemonNameLanguage = GetStringLanguage(curShow->nameRaterShow.pokemonName);
+ break;
+ case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE:
+ curShow->bravoTrainer.language = GetStringLanguage(curShow->bravoTrainer.playerName);
+ curShow->bravoTrainer.pokemonNameLanguage = GetStringLanguage(curShow->bravoTrainer.pokemonNickname);
+ break;
+ case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE:
+ curShow->bravoTrainerTower.language = GetStringLanguage(curShow->bravoTrainerTower.trainerName);
+ curShow->bravoTrainerTower.pokemonNameLanguage = GetStringLanguage(curShow->bravoTrainerTower.pokemonName);
+ break;
+ case TVSHOW_CONTEST_LIVE_UPDATES:
+ curShow->contestLiveUpdates.winningTrainerLanguage = GetStringLanguage(curShow->contestLiveUpdates.winningTrainerName);
+ curShow->contestLiveUpdates.losingTrainerLanguage = GetStringLanguage(curShow->contestLiveUpdates.losingTrainerName);
+ break;
+ case TVSHOW_3_CHEERS_FOR_POKEBLOCKS:
+ curShow->threeCheers.language = GetStringLanguage(curShow->threeCheers.playerName);
+ curShow->threeCheers.worstBlenderLanguage = GetStringLanguage(curShow->threeCheers.worstBlenderName);
+ break;
+ case TVSHOW_BATTLE_UPDATE:
+ curShow->battleUpdate.language = GetStringLanguage(curShow->battleUpdate.playerName);
+ curShow->battleUpdate.linkOpponentLanguage = GetStringLanguage(curShow->battleUpdate.linkOpponentName);
+ break;
+ case TVSHOW_FAN_CLUB_SPECIAL:
+ curShow->fanClubSpecial.language = GetStringLanguage(curShow->fanClubSpecial.playerName);
+ curShow->fanClubSpecial.idolNameLanguage = GetStringLanguage(curShow->fanClubSpecial.idolName);
+ break;
+ case TVSHOW_LILYCOVE_CONTEST_LADY:
+ curShow->contestLady.language = GetStringLanguage(curShow->contestLady.playerName);
+ curShow->contestLady.pokemonNameLanguage = GetStringLanguage(curShow->contestLady.nickname);
+ break;
+ case TVSHOW_POKEMON_TODAY_CAUGHT:
+ curShow->pokemonToday.language = GetStringLanguage(curShow->pokemonToday.playerName);
+ curShow->pokemonToday.language2 = GetStringLanguage(curShow->pokemonToday.nickname);
+ break;
+ case TVSHOW_SMART_SHOPPER:
+ curShow->smartshopperShow.language = GetStringLanguage(curShow->smartshopperShow.playerName);
+ break;
+ case TVSHOW_POKEMON_TODAY_FAILED:
+ curShow->pokemonTodayFailed.language = GetStringLanguage(curShow->pokemonTodayFailed.playerName);
+ break;
+ case TVSHOW_FISHING_ADVICE:
+ curShow->pokemonAngler.language = GetStringLanguage(curShow->pokemonAngler.playerName);
+ break;
+ case TVSHOW_WORLD_OF_MASTERS:
+ curShow->worldOfMasters.language = GetStringLanguage(curShow->worldOfMasters.playerName);
+ break;
+ case TVSHOW_TREND_WATCHER:
+ curShow->trendWatcher.language = GetStringLanguage(curShow->trendWatcher.playerName);
+ break;
+ case TVSHOW_BREAKING_NEWS:
+ curShow->breakingNews.language = GetStringLanguage(curShow->breakingNews.playerName);
+ break;
+ case TVSHOW_BATTLE_SEMINAR:
+ curShow->battleSeminar.language = GetStringLanguage(curShow->battleSeminar.playerName);
+ break;
+ case TVSHOW_FIND_THAT_GAMER:
+ case TVSHOW_TRAINER_FAN_CLUB:
+ curShow->trainerFanClub.language = GetStringLanguage(curShow->trainerFanClub.playerName);
+ break;
+ case TVSHOW_CUTIES:
+ curShow->cuties.language = GetStringLanguage(curShow->cuties.playerName);
+ curShow->cuties.pokemonNameLanguage = GetStringLanguage(curShow->cuties.nickname);
+ break;
+ case TVSHOW_TODAYS_RIVAL_TRAINER:
+ case TVSHOW_SECRET_BASE_VISIT:
+ case TVSHOW_FRONTIER:
+ curShow->rivalTrainer.language = GetStringLanguage(curShow->rivalTrainer.playerName);
+ break;
+ case TVSHOW_TREASURE_INVESTIGATORS:
+ case TVSHOW_LOTTO_WINNER:
+ case TVSHOW_NUMBER_ONE:
+ curShow->treasureInvestigators.language = GetStringLanguage(curShow->treasureInvestigators.playerName);
+ break;
+ case TVSHOW_SECRET_BASE_SECRETS:
+ curShow->secretBaseSecrets.language = GetStringLanguage(curShow->secretBaseSecrets.playerName);
+ curShow->secretBaseSecrets.baseOwnersNameLanguage = GetStringLanguage(curShow->secretBaseSecrets.baseOwnersName);
+ break;
+ case TVSHOW_SAFARI_FAN_CLUB:
+ curShow->safariFanClub.language = GetStringLanguage(curShow->safariFanClub.playerName);
+ break;
+ case TVSHOW_MASS_OUTBREAK:
+ break;
}
}
}
-void sub_80F14F8(TVShow *shows)
+void SanitizeTVShowLocationsForRuby(TVShow *shows)
{
int i;
- for (i = 0; i < LAST_TVSHOW_IDX; i ++)
+ for (i = 0; i < LAST_TVSHOW_IDX; i++)
{
switch (shows[i].common.kind)
{
- case TVSHOW_WORLD_OF_MASTERS:
- if (shows[i].worldOfMasters.location > KANTO_MAPSEC_START)
- {
- memset(&shows[i], 0, sizeof(TVShow));
- }
- break;
- case TVSHOW_POKEMON_TODAY_FAILED:
- if (shows[i].pokemonTodayFailed.location > KANTO_MAPSEC_START)
- {
- memset(&shows[i], 0, sizeof(TVShow));
- }
- break;
+ case TVSHOW_WORLD_OF_MASTERS:
+ if (shows[i].worldOfMasters.location > KANTO_MAPSEC_START)
+ memset(&shows[i], 0, sizeof(TVShow));
+ break;
+ case TVSHOW_POKEMON_TODAY_FAILED:
+ if (shows[i].pokemonTodayFailed.location > KANTO_MAPSEC_START)
+ memset(&shows[i], 0, sizeof(TVShow));
+ break;
}
}
}
+// gSpecialVar_0x8004 here is set from GetRandomActiveShowIdx in EventScript_TryDoTVShow
void DoTVShow(void)
{
if (gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004].common.active)
{
switch (gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004].common.kind)
{
- case TVSHOW_FAN_CLUB_LETTER:
- DoTVShowPokemonFanClubLetter();
- break;
- case TVSHOW_RECENT_HAPPENINGS:
- DoTVShowRecentHappenings();
- break;
- case TVSHOW_PKMN_FAN_CLUB_OPINIONS:
- DoTVShowPokemonFanClubOpinions();
- break;
- case TVSHOW_UNKN_SHOWTYPE_04:
- DoTVShowDummiedOut();
- break;
- case TVSHOW_MASS_OUTBREAK:
- DoTVShowPokemonNewsMassOutbreak();
- break;
- case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE:
- DoTVShowBravoTrainerPokemonProfile();
- break;
- case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE:
- DoTVShowBravoTrainerBattleTower();
- break;
- case TVSHOW_POKEMON_TODAY_CAUGHT:
- DoTVShowPokemonTodaySuccessfulCapture();
- break;
- case TVSHOW_SMART_SHOPPER:
- DoTVShowTodaysSmartShopper();
- break;
- case TVSHOW_NAME_RATER_SHOW:
- DoTVShowTheNameRaterShow();
- break;
- case TVSHOW_CONTEST_LIVE_UPDATES:
- DoTVShowPokemonContestLiveUpdates();
- break;
- case TVSHOW_BATTLE_UPDATE:
- DoTVShowPokemonBattleUpdate();
- break;
- case TVSHOW_3_CHEERS_FOR_POKEBLOCKS:
- DoTVShow3CheersForPokeblocks();
- break;
- case TVSHOW_POKEMON_TODAY_FAILED:
- DoTVShowPokemonTodayFailedCapture();
- break;
- case TVSHOW_FISHING_ADVICE:
- DoTVShowPokemonAngler();
- break;
- case TVSHOW_WORLD_OF_MASTERS:
- DoTVShowTheWorldOfMasters();
- break;
- case TVSHOW_TODAYS_RIVAL_TRAINER:
- DoTVShowTodaysRivalTrainer();
- break;
- case TVSHOW_TREND_WATCHER:
- DoTVShowDewfordTrendWatcherNetwork();
- break;
- case TVSHOW_TREASURE_INVESTIGATORS:
- DoTVShowHoennTreasureInvestigators();
- break;
- case TVSHOW_FIND_THAT_GAMER:
- DoTVShowFindThatGamer();
- break;
- case TVSHOW_BREAKING_NEWS:
- DoTVShowBreakingNewsTV();
- break;
- case TVSHOW_SECRET_BASE_VISIT:
- DoTVShowSecretBaseVisit();
- break;
- case TVSHOW_LOTTO_WINNER:
- DoTVShowPokemonLotteryWinnerFlashReport();
- break;
- case TVSHOW_BATTLE_SEMINAR:
- DoTVShowThePokemonBattleSeminar();
- break;
- case TVSHOW_FAN_CLUB_SPECIAL:
- DoTVShowTrainerFanClubSpecial();
- break;
- case TVSHOW_TRAINER_FAN_CLUB:
- DoTVShowTrainerFanClub();
- break;
- case TVSHOW_CUTIES:
- DoTVShowSpotTheCuties();
- break;
- case TVSHOW_FRONTIER:
- DoTVShowPokemonNewsBattleFrontier();
- break;
- case TVSHOW_NUMBER_ONE:
- DoTVShowWhatsNo1InHoennToday();
- break;
- case TVSHOW_SECRET_BASE_SECRETS:
- DoTVShowSecretBaseSecrets();
- break;
- case TVSHOW_SAFARI_FAN_CLUB:
- DoTVShowSafariFanClub();
- break;
- case TVSHOW_LILYCOVE_CONTEST_LADY:
- DoTVShowLilycoveContestLady();
- break;
+ case TVSHOW_FAN_CLUB_LETTER:
+ DoTVShowPokemonFanClubLetter();
+ break;
+ case TVSHOW_RECENT_HAPPENINGS:
+ DoTVShowRecentHappenings();
+ break;
+ case TVSHOW_PKMN_FAN_CLUB_OPINIONS:
+ DoTVShowPokemonFanClubOpinions();
+ break;
+ case TVSHOW_DUMMY:
+ DoTVShowDummiedOut();
+ break;
+ case TVSHOW_MASS_OUTBREAK:
+ DoTVShowPokemonNewsMassOutbreak();
+ break;
+ case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE:
+ DoTVShowBravoTrainerPokemonProfile();
+ break;
+ case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE:
+ DoTVShowBravoTrainerBattleTower();
+ break;
+ case TVSHOW_POKEMON_TODAY_CAUGHT:
+ DoTVShowPokemonTodaySuccessfulCapture();
+ break;
+ case TVSHOW_SMART_SHOPPER:
+ DoTVShowTodaysSmartShopper();
+ break;
+ case TVSHOW_NAME_RATER_SHOW:
+ DoTVShowTheNameRaterShow();
+ break;
+ case TVSHOW_CONTEST_LIVE_UPDATES:
+ DoTVShowPokemonContestLiveUpdates();
+ break;
+ case TVSHOW_BATTLE_UPDATE:
+ DoTVShowPokemonBattleUpdate();
+ break;
+ case TVSHOW_3_CHEERS_FOR_POKEBLOCKS:
+ DoTVShow3CheersForPokeblocks();
+ break;
+ case TVSHOW_POKEMON_TODAY_FAILED:
+ DoTVShowPokemonTodayFailedCapture();
+ break;
+ case TVSHOW_FISHING_ADVICE:
+ DoTVShowPokemonAngler();
+ break;
+ case TVSHOW_WORLD_OF_MASTERS:
+ DoTVShowTheWorldOfMasters();
+ break;
+ case TVSHOW_TODAYS_RIVAL_TRAINER:
+ DoTVShowTodaysRivalTrainer();
+ break;
+ case TVSHOW_TREND_WATCHER:
+ DoTVShowDewfordTrendWatcherNetwork();
+ break;
+ case TVSHOW_TREASURE_INVESTIGATORS:
+ DoTVShowHoennTreasureInvestigators();
+ break;
+ case TVSHOW_FIND_THAT_GAMER:
+ DoTVShowFindThatGamer();
+ break;
+ case TVSHOW_BREAKING_NEWS:
+ DoTVShowBreakingNewsTV();
+ break;
+ case TVSHOW_SECRET_BASE_VISIT:
+ DoTVShowSecretBaseVisit();
+ break;
+ case TVSHOW_LOTTO_WINNER:
+ DoTVShowPokemonLotteryWinnerFlashReport();
+ break;
+ case TVSHOW_BATTLE_SEMINAR:
+ DoTVShowThePokemonBattleSeminar();
+ break;
+ case TVSHOW_FAN_CLUB_SPECIAL:
+ DoTVShowTrainerFanClubSpecial();
+ break;
+ case TVSHOW_TRAINER_FAN_CLUB:
+ DoTVShowTrainerFanClub();
+ break;
+ case TVSHOW_CUTIES:
+ DoTVShowSpotTheCuties();
+ break;
+ case TVSHOW_FRONTIER:
+ DoTVShowPokemonNewsBattleFrontier();
+ break;
+ case TVSHOW_NUMBER_ONE:
+ DoTVShowWhatsNo1InHoennToday();
+ break;
+ case TVSHOW_SECRET_BASE_SECRETS:
+ DoTVShowSecretBaseSecrets();
+ break;
+ case TVSHOW_SAFARI_FAN_CLUB:
+ DoTVShowSafariFanClub();
+ break;
+ case TVSHOW_LILYCOVE_CONTEST_LADY:
+ DoTVShowLilycoveContestLady();
+ break;
}
}
}
@@ -4509,64 +4292,64 @@ static void DoTVShowBravoTrainerPokemonProfile(void)
state = sTVShowState;
switch (state)
{
- case 0:
- TVShowConvertInternationalString(gStringVar1, show->bravoTrainer.playerName, show->bravoTrainer.language);
- CopyContestCategoryToStringVar(1, show->bravoTrainer.contestCategory);
- CopyContestRankToStringVar(2, show->bravoTrainer.contestRank);
- if (!StringCompare(gSpeciesNames[show->bravoTrainer.species], show->bravoTrainer.pokemonNickname))
- sTVShowState = 8;
- else
- sTVShowState = 1;
- break;
- case 1:
- StringCopy(gStringVar1, gSpeciesNames[show->bravoTrainer.species]);
- TVShowConvertInternationalString(gStringVar2, show->bravoTrainer.pokemonNickname, show->bravoTrainer.pokemonNameLanguage);
- CopyContestCategoryToStringVar(2, show->bravoTrainer.contestCategory);
- sTVShowState = 2;
- break;
- case 2:
- TVShowConvertInternationalString(gStringVar1, show->bravoTrainer.playerName, show->bravoTrainer.language);
- if (show->bravoTrainer.contestResult == 0) // placed first
- sTVShowState = 3;
- else
- sTVShowState = 4;
- break;
- case 3:
- TVShowConvertInternationalString(gStringVar1, show->bravoTrainer.playerName, show->bravoTrainer.language);
- CopyEasyChatWord(gStringVar2, show->bravoTrainer.words[0]);
- TV_PrintIntToStringVar(2, show->bravoTrainer.contestResult + 1);
- sTVShowState = 5;
- break;
- case 4:
- TVShowConvertInternationalString(gStringVar1, show->bravoTrainer.playerName, show->bravoTrainer.language);
- CopyEasyChatWord(gStringVar2, show->bravoTrainer.words[0]);
- TV_PrintIntToStringVar(2, show->bravoTrainer.contestResult + 1);
- sTVShowState = 5;
- break;
- case 5:
- TVShowConvertInternationalString(gStringVar1, show->bravoTrainer.playerName, show->bravoTrainer.language);
- CopyContestCategoryToStringVar(1, show->bravoTrainer.contestCategory);
- CopyEasyChatWord(gStringVar3, show->bravoTrainer.words[1]);
- if (show->bravoTrainer.move)
- sTVShowState = 6;
- else
- sTVShowState = 7;
- break;
- case 6:
- StringCopy(gStringVar1, gSpeciesNames[show->bravoTrainer.species]);
- StringCopy(gStringVar2, gMoveNames[show->bravoTrainer.move]);
- CopyEasyChatWord(gStringVar3, show->bravoTrainer.words[1]);
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->bravoTrainer.playerName, show->bravoTrainer.language);
+ CopyContestCategoryToStringVar(1, show->bravoTrainer.contestCategory);
+ CopyContestRankToStringVar(2, show->bravoTrainer.contestRank);
+ if (!StringCompare(gSpeciesNames[show->bravoTrainer.species], show->bravoTrainer.pokemonNickname))
+ sTVShowState = 8;
+ else
+ sTVShowState = 1;
+ break;
+ case 1:
+ StringCopy(gStringVar1, gSpeciesNames[show->bravoTrainer.species]);
+ TVShowConvertInternationalString(gStringVar2, show->bravoTrainer.pokemonNickname, show->bravoTrainer.pokemonNameLanguage);
+ CopyContestCategoryToStringVar(2, show->bravoTrainer.contestCategory);
+ sTVShowState = 2;
+ break;
+ case 2:
+ TVShowConvertInternationalString(gStringVar1, show->bravoTrainer.playerName, show->bravoTrainer.language);
+ if (show->bravoTrainer.contestResult == 0) // placed first
+ sTVShowState = 3;
+ else
+ sTVShowState = 4;
+ break;
+ case 3:
+ TVShowConvertInternationalString(gStringVar1, show->bravoTrainer.playerName, show->bravoTrainer.language);
+ CopyEasyChatWord(gStringVar2, show->bravoTrainer.words[0]);
+ ConvertIntToDecimalString(2, show->bravoTrainer.contestResult + 1);
+ sTVShowState = 5;
+ break;
+ case 4:
+ TVShowConvertInternationalString(gStringVar1, show->bravoTrainer.playerName, show->bravoTrainer.language);
+ CopyEasyChatWord(gStringVar2, show->bravoTrainer.words[0]);
+ ConvertIntToDecimalString(2, show->bravoTrainer.contestResult + 1);
+ sTVShowState = 5;
+ break;
+ case 5:
+ TVShowConvertInternationalString(gStringVar1, show->bravoTrainer.playerName, show->bravoTrainer.language);
+ CopyContestCategoryToStringVar(1, show->bravoTrainer.contestCategory);
+ CopyEasyChatWord(gStringVar3, show->bravoTrainer.words[1]);
+ if (show->bravoTrainer.move)
+ sTVShowState = 6;
+ else
sTVShowState = 7;
- break;
- case 7:
- TVShowConvertInternationalString(gStringVar1, show->bravoTrainer.playerName, show->bravoTrainer.language);
- StringCopy(gStringVar2, gSpeciesNames[show->bravoTrainer.species]);
- TVShowDone();
- break;
- case 8:
- StringCopy(gStringVar1, gSpeciesNames[show->bravoTrainer.species]);
- sTVShowState = 2;
- break;
+ break;
+ case 6:
+ StringCopy(gStringVar1, gSpeciesNames[show->bravoTrainer.species]);
+ StringCopy(gStringVar2, gMoveNames[show->bravoTrainer.move]);
+ CopyEasyChatWord(gStringVar3, show->bravoTrainer.words[1]);
+ sTVShowState = 7;
+ break;
+ case 7:
+ TVShowConvertInternationalString(gStringVar1, show->bravoTrainer.playerName, show->bravoTrainer.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->bravoTrainer.species]);
+ TVShowDone();
+ break;
+ case 8:
+ StringCopy(gStringVar1, gSpeciesNames[show->bravoTrainer.species]);
+ sTVShowState = 2;
+ break;
}
ShowFieldMessage(sTVBravoTrainerTextGroup[state]);
}
@@ -4581,89 +4364,89 @@ static void DoTVShowBravoTrainerBattleTower(void)
state = sTVShowState;
switch(state)
{
- case 0:
- TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.trainerName, show->bravoTrainerTower.language);
- StringCopy(gStringVar2, gSpeciesNames[show->bravoTrainerTower.species]);
- if (show->bravoTrainerTower.numFights >= 7)
- sTVShowState = 1;
- else
- sTVShowState = 2;
- break;
- case 1:
- if (show->bravoTrainerTower.btLevel == 50)
- {
- StringCopy(gStringVar1, gText_Lv50);
- }
- else
- {
- StringCopy(gStringVar1, gText_OpenLevel);
- }
- TV_PrintIntToStringVar(1, show->bravoTrainerTower.numFights);
- if (show->bravoTrainerTower.wonTheChallenge == TRUE)
- sTVShowState = 3;
- else
- sTVShowState = 4;
- break;
- case 2:
- TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage);
- TV_PrintIntToStringVar(1, show->bravoTrainerTower.numFights + 1);
- if (show->bravoTrainerTower.interviewResponse == 0)
- sTVShowState = 5;
- else
- sTVShowState = 6;
- break;
- case 3:
- TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage);
- StringCopy(gStringVar2, gSpeciesNames[show->bravoTrainerTower.defeatedSpecies]);
- if (show->bravoTrainerTower.interviewResponse == 0)
- sTVShowState = 5;
- else
- sTVShowState = 6;
- break;
- case 4:
- TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage);
- StringCopy(gStringVar2, gSpeciesNames[show->bravoTrainerTower.defeatedSpecies]);
- if (show->bravoTrainerTower.interviewResponse == 0)
- sTVShowState = 5;
- else
- sTVShowState = 6;
- break;
- case 5:
- TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage);
- sTVShowState = 11;
- break;
- case 6:
- TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage);
- sTVShowState = 11;
- break;
- case 7:
- sTVShowState = 11;
- break;
- case 8:
- case 9:
- case 10:
- TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.trainerName, show->bravoTrainerTower.language);
- sTVShowState = 11;
- break;
- case 11:
- CopyEasyChatWord(gStringVar1, show->bravoTrainerTower.words[0]);
- if (show->bravoTrainerTower.interviewResponse == 0)
- sTVShowState = 12;
- else
- sTVShowState = 13;
- break;
- case 12:
- case 13:
- CopyEasyChatWord(gStringVar1, show->bravoTrainerTower.words[0]);
- TVShowConvertInternationalString(gStringVar2, show->bravoTrainerTower.trainerName, show->bravoTrainerTower.language);
- TVShowConvertInternationalString(gStringVar3, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage);
- sTVShowState = 14;
- break;
- case 14:
- TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.trainerName, show->bravoTrainerTower.language);
- StringCopy(gStringVar2, gSpeciesNames[show->bravoTrainerTower.species]);
- TVShowDone();
- break;
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.trainerName, show->bravoTrainerTower.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->bravoTrainerTower.species]);
+ if (show->bravoTrainerTower.numFights >= 7)
+ sTVShowState = 1;
+ else
+ sTVShowState = 2;
+ break;
+ case 1:
+ if (show->bravoTrainerTower.btLevel == 50)
+ {
+ StringCopy(gStringVar1, gText_Lv50);
+ }
+ else
+ {
+ StringCopy(gStringVar1, gText_OpenLevel);
+ }
+ ConvertIntToDecimalString(1, show->bravoTrainerTower.numFights);
+ if (show->bravoTrainerTower.wonTheChallenge == TRUE)
+ sTVShowState = 3;
+ else
+ sTVShowState = 4;
+ break;
+ case 2:
+ TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage);
+ ConvertIntToDecimalString(1, show->bravoTrainerTower.numFights + 1);
+ if (show->bravoTrainerTower.interviewResponse == 0)
+ sTVShowState = 5;
+ else
+ sTVShowState = 6;
+ break;
+ case 3:
+ TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage);
+ StringCopy(gStringVar2, gSpeciesNames[show->bravoTrainerTower.defeatedSpecies]);
+ if (show->bravoTrainerTower.interviewResponse == 0)
+ sTVShowState = 5;
+ else
+ sTVShowState = 6;
+ break;
+ case 4:
+ TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage);
+ StringCopy(gStringVar2, gSpeciesNames[show->bravoTrainerTower.defeatedSpecies]);
+ if (show->bravoTrainerTower.interviewResponse == 0)
+ sTVShowState = 5;
+ else
+ sTVShowState = 6;
+ break;
+ case 5:
+ TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage);
+ sTVShowState = 11;
+ break;
+ case 6:
+ TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage);
+ sTVShowState = 11;
+ break;
+ case 7:
+ sTVShowState = 11;
+ break;
+ case 8:
+ case 9:
+ case 10:
+ TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.trainerName, show->bravoTrainerTower.language);
+ sTVShowState = 11;
+ break;
+ case 11:
+ CopyEasyChatWord(gStringVar1, show->bravoTrainerTower.words[0]);
+ if (show->bravoTrainerTower.interviewResponse == 0)
+ sTVShowState = 12;
+ else
+ sTVShowState = 13;
+ break;
+ case 12:
+ case 13:
+ CopyEasyChatWord(gStringVar1, show->bravoTrainerTower.words[0]);
+ TVShowConvertInternationalString(gStringVar2, show->bravoTrainerTower.trainerName, show->bravoTrainerTower.language);
+ TVShowConvertInternationalString(gStringVar3, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage);
+ sTVShowState = 14;
+ break;
+ case 14:
+ TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.trainerName, show->bravoTrainerTower.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->bravoTrainerTower.species]);
+ TVShowDone();
+ break;
}
ShowFieldMessage(sTVBravoTrainerBattleTowerTextGroup[state]);
}
@@ -4678,115 +4461,88 @@ static void DoTVShowTodaysSmartShopper(void)
state = sTVShowState;
switch(state)
{
- case 0:
- TVShowConvertInternationalString(gStringVar1, show->smartshopperShow.playerName, show->smartshopperShow.language);
- GetMapName(gStringVar2, show->smartshopperShow.shopLocation, 0);
- if (show->smartshopperShow.itemAmounts[0] >= 255)
- {
- sTVShowState = 11;
- }
- else
- {
- sTVShowState = 1;
- }
- break;
- case 1:
- TVShowConvertInternationalString(gStringVar1, show->smartshopperShow.playerName, show->smartshopperShow.language);
- StringCopy(gStringVar2, ItemId_GetName(show->smartshopperShow.itemIds[0]));
- TV_PrintIntToStringVar(2, show->smartshopperShow.itemAmounts[0]);
- sTVShowState += 1 + (Random() % 4);
- break;
- case 2:
- case 4:
- case 5:
- if (show->smartshopperShow.itemIds[1] != ITEM_NONE)
- {
- sTVShowState = 6;
- }
- else
- {
- sTVShowState = 10;
- }
- break;
- case 3:
- TV_PrintIntToStringVar(2, show->smartshopperShow.itemAmounts[0] + 1);
- if (show->smartshopperShow.itemIds[1] != ITEM_NONE)
- {
- sTVShowState = 6;
- }
- else
- {
- sTVShowState = 10;
- }
- break;
- case 6:
- StringCopy(gStringVar2, ItemId_GetName(show->smartshopperShow.itemIds[1]));
- TV_PrintIntToStringVar(2, show->smartshopperShow.itemAmounts[1]);
- if (show->smartshopperShow.itemIds[2] != ITEM_NONE)
- {
- sTVShowState = 7;
- }
- else if (show->smartshopperShow.priceReduced == TRUE)
- {
- sTVShowState = 8;
- }
- else
- {
- sTVShowState = 9;
- }
- break;
- case 7:
- StringCopy(gStringVar2, ItemId_GetName(show->smartshopperShow.itemIds[2]));
- TV_PrintIntToStringVar(2, show->smartshopperShow.itemAmounts[2]);
- if (show->smartshopperShow.priceReduced == TRUE)
- {
- sTVShowState = 8;
- }
- else
- {
- sTVShowState = 9;
- }
- break;
- case 8:
- if (show->smartshopperShow.itemAmounts[0] >= 255)
- {
- sTVShowState = 12;
- }
- else
- {
- sTVShowState = 9;
- }
- break;
- case 9:
- sub_80EF40C(1, show);
- TVShowDone();
- break;
- case 10:
- if (show->smartshopperShow.priceReduced == TRUE)
- {
- sTVShowState = 8;
- }
- else
- {
- sTVShowState = 9;
- }
- break;
- case 11:
- TVShowConvertInternationalString(gStringVar1, show->smartshopperShow.playerName, show->smartshopperShow.language);
- StringCopy(gStringVar2, ItemId_GetName(show->smartshopperShow.itemIds[0]));
- if (show->smartshopperShow.priceReduced == TRUE)
- {
- sTVShowState = 8;
- }
- else
- {
- sTVShowState = 12;
- }
- break;
- case 12:
- TVShowConvertInternationalString(gStringVar1, show->smartshopperShow.playerName, show->smartshopperShow.language);
- TVShowDone();
- break;
+ case SMARTSHOPPER_STATE_INTRO:
+ TVShowConvertInternationalString(gStringVar1, show->smartshopperShow.playerName, show->smartshopperShow.language);
+ GetMapName(gStringVar2, show->smartshopperShow.shopLocation, 0);
+ if (show->smartshopperShow.itemAmounts[0] >= 255)
+ sTVShowState = SMARTSHOPPER_STATE_CLERK_MAX;
+ else
+ sTVShowState = SMARTSHOPPER_STATE_CLERK_NORMAL;
+ break;
+ case SMARTSHOPPER_STATE_CLERK_NORMAL:
+ TVShowConvertInternationalString(gStringVar1, show->smartshopperShow.playerName, show->smartshopperShow.language);
+ StringCopy(gStringVar2, ItemId_GetName(show->smartshopperShow.itemIds[0]));
+ ConvertIntToDecimalString(2, show->smartshopperShow.itemAmounts[0]);
+ // Pick a random comment (SMARTSHOPPER_STATE_RAND_COMMENT_#)
+ sTVShowState += SMARTSHOPPER_STATE_CLERK_NORMAL + (Random() % (SMARTSHOPPER_STATE_RAND_COMMENT_4 - SMARTSHOPPER_STATE_RAND_COMMENT_1 + 1));
+ break;
+ case SMARTSHOPPER_STATE_RAND_COMMENT_1:
+ case SMARTSHOPPER_STATE_RAND_COMMENT_3:
+ case SMARTSHOPPER_STATE_RAND_COMMENT_4:
+ if (show->smartshopperShow.itemIds[1] != ITEM_NONE)
+ sTVShowState = SMARTSHOPPER_STATE_SECOND_ITEM;
+ else
+ sTVShowState = SMARTSHOPPER_STATE_IS_VIP;
+ break;
+ case SMARTSHOPPER_STATE_RAND_COMMENT_2:
+ ConvertIntToDecimalString(2, show->smartshopperShow.itemAmounts[0] + 1);
+ if (show->smartshopperShow.itemIds[1] != ITEM_NONE)
+ sTVShowState = SMARTSHOPPER_STATE_SECOND_ITEM;
+ else
+ sTVShowState = SMARTSHOPPER_STATE_IS_VIP;
+ break;
+ case SMARTSHOPPER_STATE_SECOND_ITEM:
+ // Clerk describes 2nd type of item player purchased
+ StringCopy(gStringVar2, ItemId_GetName(show->smartshopperShow.itemIds[1]));
+ ConvertIntToDecimalString(2, show->smartshopperShow.itemAmounts[1]);
+ if (show->smartshopperShow.itemIds[2] != ITEM_NONE)
+ sTVShowState = SMARTSHOPPER_STATE_THIRD_ITEM;
+ else if (show->smartshopperShow.priceReduced == TRUE)
+ sTVShowState = SMARTSHOPPER_STATE_DURING_SALE;
+ else
+ sTVShowState = SMARTSHOPPER_STATE_OUTRO_NORMAL;
+ break;
+ case SMARTSHOPPER_STATE_THIRD_ITEM:
+ // Clerk describes 3rd type of item player purchased
+ StringCopy(gStringVar2, ItemId_GetName(show->smartshopperShow.itemIds[2]));
+ ConvertIntToDecimalString(2, show->smartshopperShow.itemAmounts[2]);
+ if (show->smartshopperShow.priceReduced == TRUE)
+ sTVShowState = SMARTSHOPPER_STATE_DURING_SALE;
+ else
+ sTVShowState = SMARTSHOPPER_STATE_OUTRO_NORMAL;
+ break;
+ case SMARTSHOPPER_STATE_DURING_SALE:
+ if (show->smartshopperShow.itemAmounts[0] >= 255)
+ sTVShowState = SMARTSHOPPER_STATE_OUTRO_MAX;
+ else
+ sTVShowState = SMARTSHOPPER_STATE_OUTRO_NORMAL;
+ break;
+ case SMARTSHOPPER_STATE_OUTRO_NORMAL:
+ SmartShopper_BufferPurchaseTotal(1, show);
+ TVShowDone();
+ break;
+ case SMARTSHOPPER_STATE_IS_VIP:
+ // Clerk says customer is a VIP
+ // Said if player only purchased one type of item
+ if (show->smartshopperShow.priceReduced == TRUE)
+ sTVShowState = SMARTSHOPPER_STATE_DURING_SALE;
+ else
+ sTVShowState = SMARTSHOPPER_STATE_OUTRO_NORMAL;
+ break;
+ case SMARTSHOPPER_STATE_CLERK_MAX:
+ // Clerk's comments if player purchased maximum number of 1st item
+ TVShowConvertInternationalString(gStringVar1, show->smartshopperShow.playerName, show->smartshopperShow.language);
+ StringCopy(gStringVar2, ItemId_GetName(show->smartshopperShow.itemIds[0]));
+ if (show->smartshopperShow.priceReduced == TRUE)
+ sTVShowState = SMARTSHOPPER_STATE_DURING_SALE;
+ else
+ sTVShowState = SMARTSHOPPER_STATE_OUTRO_MAX;
+ break;
+ case SMARTSHOPPER_STATE_OUTRO_MAX:
+ // Outro comments if player purchased maximum number of 1st item
+ TVShowConvertInternationalString(gStringVar1, show->smartshopperShow.playerName, show->smartshopperShow.language);
+ TVShowDone();
+ break;
}
ShowFieldMessage(sTVTodaysSmartShopperTextGroup[state]);
}
@@ -4801,90 +4557,78 @@ static void DoTVShowTheNameRaterShow(void)
state = sTVShowState;
switch (state)
{
- case 0:
- TVShowConvertInternationalString(gStringVar1, show->nameRaterShow.trainerName, show->nameRaterShow.language);
- StringCopy(gStringVar2, gSpeciesNames[show->nameRaterShow.species]);
- TVShowConvertInternationalString(gStringVar3, show->nameRaterShow.pokemonName, show->nameRaterShow.pokemonNameLanguage);
- sTVShowState = TV_GetNicknameSumMod8(show) + 1;
- break;
- case 1:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- case 8:
- if (show->nameRaterShow.random == 0)
- {
- sTVShowState = 9;
- }
- else if (show->nameRaterShow.random == 1)
- {
- sTVShowState = 10;
- }
- else if (show->nameRaterShow.random == 2)
- {
- sTVShowState = 11;
- }
- break;
- case 2:
- TVShowConvertInternationalString(gStringVar1, show->nameRaterShow.trainerName, show->nameRaterShow.language);
- if (show->nameRaterShow.random == 0)
- {
- sTVShowState = 9;
- }
- else if (show->nameRaterShow.random == 1)
- {
- sTVShowState = 10;
- }
- else if (show->nameRaterShow.random == 2)
- {
- sTVShowState = 11;
- }
- break;
- case 9:
- case 10:
- case 11:
- TVShowConvertInternationalString(gStringVar1, show->nameRaterShow.pokemonName, show->nameRaterShow.pokemonNameLanguage);
- TV_GetNicknameSubstring(1, 0, 0, 1, 0, show);
- TV_GetNicknameSubstring(2, 1, 0, 1, 0, show);
- sTVShowState = 12;
- break;
- case 13:
- TVShowConvertInternationalString(gStringVar1, show->nameRaterShow.trainerName, show->nameRaterShow.language);
- TV_GetNicknameSubstring(1, 0, 2, 0, 0, show);
- TV_GetNicknameSubstring(2, 0, 3, 1, 0, show);
- sTVShowState = 14;
- break;
- case 14:
- TV_GetNicknameSubstring(1, 0, 2, 1, 0, show);
- TV_GetNicknameSubstring(2, 0, 3, 0, 0, show);
- sTVShowState = 18;
- break;
- case 15:
- TV_GetNicknameSubstring(0, 0, 2, 1, 0, show);
- StringCopy(gStringVar2, gSpeciesNames[show->nameRaterShow.species]);
- TV_GetNicknameSubstring(2, 0, 3, 2, show->nameRaterShow.species, show);
- sTVShowState = 16;
- break;
- case 16:
- TV_GetNicknameSubstring(0, 0, 2, 2, show->nameRaterShow.species, show);
- TV_GetNicknameSubstring(2, 0, 3, 1, 0, show);
- sTVShowState = 17;
- break;
- case 17:
- TV_GetNicknameSubstring(0, 0, 2, 1, 0, show);
- StringCopy(gStringVar2, gSpeciesNames[show->nameRaterShow.randomSpecies]);
- TV_GetNicknameSubstring(2, 0, 3, 2, show->nameRaterShow.randomSpecies, show);
- sTVShowState = 18;
- break;
- case 12:
- state = 18;
- sTVShowState = 18;
- case 18:
- TVShowConvertInternationalString(gStringVar1, show->nameRaterShow.pokemonName, show->nameRaterShow.pokemonNameLanguage);
- TVShowDone();
- break;
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->nameRaterShow.trainerName, show->nameRaterShow.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->nameRaterShow.species]);
+ TVShowConvertInternationalString(gStringVar3, show->nameRaterShow.pokemonName, show->nameRaterShow.pokemonNameLanguage);
+ sTVShowState = GetRandomNameRaterStateFromName(show) + 1;
+ break;
+ case 1:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ if (show->nameRaterShow.random == 0)
+ sTVShowState = 9;
+ else if (show->nameRaterShow.random == 1)
+ sTVShowState = 10;
+ else if (show->nameRaterShow.random == 2)
+ sTVShowState = 11;
+ break;
+ case 2:
+ TVShowConvertInternationalString(gStringVar1, show->nameRaterShow.trainerName, show->nameRaterShow.language);
+ if (show->nameRaterShow.random == 0)
+ sTVShowState = 9;
+ else if (show->nameRaterShow.random == 1)
+ sTVShowState = 10;
+ else if (show->nameRaterShow.random == 2)
+ sTVShowState = 11;
+ break;
+ case 9:
+ case 10:
+ case 11:
+ TVShowConvertInternationalString(gStringVar1, show->nameRaterShow.pokemonName, show->nameRaterShow.pokemonNameLanguage);
+ GetNicknameSubstring(1, 0, 0, 1, 0, show);
+ GetNicknameSubstring(2, 1, 0, 1, 0, show);
+ sTVShowState = 12;
+ break;
+ case 13:
+ TVShowConvertInternationalString(gStringVar1, show->nameRaterShow.trainerName, show->nameRaterShow.language);
+ GetNicknameSubstring(1, 0, 2, 0, 0, show);
+ GetNicknameSubstring(2, 0, 3, 1, 0, show);
+ sTVShowState = 14;
+ break;
+ case 14:
+ GetNicknameSubstring(1, 0, 2, 1, 0, show);
+ GetNicknameSubstring(2, 0, 3, 0, 0, show);
+ sTVShowState = 18;
+ break;
+ case 15:
+ GetNicknameSubstring(0, 0, 2, 1, 0, show);
+ StringCopy(gStringVar2, gSpeciesNames[show->nameRaterShow.species]);
+ GetNicknameSubstring(2, 0, 3, 2, show->nameRaterShow.species, show);
+ sTVShowState = 16;
+ break;
+ case 16:
+ GetNicknameSubstring(0, 0, 2, 2, show->nameRaterShow.species, show);
+ GetNicknameSubstring(2, 0, 3, 1, 0, show);
+ sTVShowState = 17;
+ break;
+ case 17:
+ GetNicknameSubstring(0, 0, 2, 1, 0, show);
+ StringCopy(gStringVar2, gSpeciesNames[show->nameRaterShow.randomSpecies]);
+ GetNicknameSubstring(2, 0, 3, 2, show->nameRaterShow.randomSpecies, show);
+ sTVShowState = 18;
+ break;
+ case 12:
+ state = 18;
+ sTVShowState = 18;
+ case 18:
+ TVShowConvertInternationalString(gStringVar1, show->nameRaterShow.pokemonName, show->nameRaterShow.pokemonNameLanguage);
+ TVShowDone();
+ break;
}
ShowFieldMessage(sTVNameRaterTextGroup[state]);
}
@@ -4899,70 +4643,62 @@ static void DoTVShowPokemonTodaySuccessfulCapture(void)
state = sTVShowState;
switch (state)
{
- case 0:
- TVShowConvertInternationalString(gStringVar1, show->pokemonToday.playerName, show->pokemonToday.language);
- StringCopy(gStringVar2, gSpeciesNames[show->pokemonToday.species]);
- TVShowConvertInternationalString(gStringVar3, show->pokemonToday.nickname, show->pokemonToday.language2);
- if (show->pokemonToday.ball == ITEM_MASTER_BALL)
- {
- sTVShowState = 5;
- }
- else
- {
- sTVShowState = 1;
- }
- break;
- case 1:
- sTVShowState = 2;
- break;
- case 2:
- StringCopy(gStringVar2, ItemId_GetName(show->pokemonToday.ball));
- TV_PrintIntToStringVar(2, show->pokemonToday.nBallsUsed);
- if (show->pokemonToday.nBallsUsed < 4)
- {
- sTVShowState = 3;
- }
- else
- {
- sTVShowState = 4;
- }
- break;
- case 3:
- TVShowConvertInternationalString(gStringVar1, show->pokemonToday.playerName, show->pokemonToday.language);
- StringCopy(gStringVar2, gSpeciesNames[show->pokemonToday.species]);
- TVShowConvertInternationalString(gStringVar3, show->pokemonToday.nickname, show->pokemonToday.language2);
- sTVShowState = 6;
- break;
- case 4:
- sTVShowState = 6;
- break;
- case 5:
- TVShowConvertInternationalString(gStringVar1, show->pokemonToday.playerName, show->pokemonToday.language);
- StringCopy(gStringVar2, gSpeciesNames[show->pokemonToday.species]);
- sTVShowState = 6;
- break;
- case 6:
- TVShowConvertInternationalString(gStringVar1, show->pokemonToday.playerName, show->pokemonToday.language);
- StringCopy(gStringVar2, gSpeciesNames[show->pokemonToday.species]);
- TVShowConvertInternationalString(gStringVar3, show->pokemonToday.nickname, show->pokemonToday.language2);
- sTVShowState += 1 + (Random() % 4);
- break;
- case 7:
- case 8:
- StringCopy(gStringVar1, gSpeciesNames[show->pokemonToday.species]);
- TVShowConvertInternationalString(gStringVar2, show->pokemonToday.nickname, show->pokemonToday.language2);
- TV_GetSomeOtherSpeciesAlreadySeenByPlayer_AndPrintName(2, show->pokemonToday.species);
- sTVShowState = 11;
- break;
- case 9:
- case 10:
- StringCopy(gStringVar1, gSpeciesNames[show->pokemonToday.species]);
- TVShowConvertInternationalString(gStringVar2, show->pokemonToday.nickname, show->pokemonToday.language2);
- sTVShowState = 11;
- break;
- case 11:
- TVShowDone();
- break;
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->pokemonToday.playerName, show->pokemonToday.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->pokemonToday.species]);
+ TVShowConvertInternationalString(gStringVar3, show->pokemonToday.nickname, show->pokemonToday.language2);
+ if (show->pokemonToday.ball == ITEM_MASTER_BALL)
+ sTVShowState = 5;
+ else
+ sTVShowState = 1;
+ break;
+ case 1:
+ sTVShowState = 2;
+ break;
+ case 2:
+ StringCopy(gStringVar2, ItemId_GetName(show->pokemonToday.ball));
+ ConvertIntToDecimalString(2, show->pokemonToday.nBallsUsed);
+ if (show->pokemonToday.nBallsUsed < 4)
+ sTVShowState = 3;
+ else
+ sTVShowState = 4;
+ break;
+ case 3:
+ TVShowConvertInternationalString(gStringVar1, show->pokemonToday.playerName, show->pokemonToday.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->pokemonToday.species]);
+ TVShowConvertInternationalString(gStringVar3, show->pokemonToday.nickname, show->pokemonToday.language2);
+ sTVShowState = 6;
+ break;
+ case 4:
+ sTVShowState = 6;
+ break;
+ case 5:
+ TVShowConvertInternationalString(gStringVar1, show->pokemonToday.playerName, show->pokemonToday.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->pokemonToday.species]);
+ sTVShowState = 6;
+ break;
+ case 6:
+ TVShowConvertInternationalString(gStringVar1, show->pokemonToday.playerName, show->pokemonToday.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->pokemonToday.species]);
+ TVShowConvertInternationalString(gStringVar3, show->pokemonToday.nickname, show->pokemonToday.language2);
+ sTVShowState += 1 + (Random() % 4);
+ break;
+ case 7:
+ case 8:
+ StringCopy(gStringVar1, gSpeciesNames[show->pokemonToday.species]);
+ TVShowConvertInternationalString(gStringVar2, show->pokemonToday.nickname, show->pokemonToday.language2);
+ GetRandomDifferentSpeciesAndNameSeenByPlayer(2, show->pokemonToday.species);
+ sTVShowState = 11;
+ break;
+ case 9:
+ case 10:
+ StringCopy(gStringVar1, gSpeciesNames[show->pokemonToday.species]);
+ TVShowConvertInternationalString(gStringVar2, show->pokemonToday.nickname, show->pokemonToday.language2);
+ sTVShowState = 11;
+ break;
+ case 11:
+ TVShowDone();
+ break;
}
ShowFieldMessage(sTVPokemonTodaySuccessfulTextGroup[state]);
}
@@ -4977,45 +4713,37 @@ static void DoTVShowPokemonTodayFailedCapture(void)
state = sTVShowState;
switch (state)
{
- case 0:
- TVShowConvertInternationalString(gStringVar1, show->pokemonTodayFailed.playerName, show->pokemonTodayFailed.language);
- StringCopy(gStringVar2, gSpeciesNames[show->pokemonTodayFailed.species]);
- sTVShowState = 1;
- break;
- case 1:
- TVShowConvertInternationalString(gStringVar1, show->pokemonTodayFailed.playerName, show->pokemonTodayFailed.language);
- GetMapName(gStringVar2, show->pokemonTodayFailed.location, 0);
- StringCopy(gStringVar3, gSpeciesNames[show->pokemonTodayFailed.species2]);
- if (show->pokemonTodayFailed.outcome == 1)
- {
- sTVShowState = 3;
- }
- else
- {
- sTVShowState = 2;
- }
- break;
- case 2:
- case 3:
- TVShowConvertInternationalString(gStringVar1, show->pokemonTodayFailed.playerName, show->pokemonTodayFailed.language);
- TV_PrintIntToStringVar(1, show->pokemonTodayFailed.nBallsUsed);
- if (Random() % 3 == 0)
- {
- sTVShowState = 5;
- }
- else
- {
- sTVShowState = 4;
- }
- break;
- case 4:
- case 5:
- TVShowConvertInternationalString(gStringVar1, show->pokemonTodayFailed.playerName, show->pokemonTodayFailed.language);
- sTVShowState = 6;
- break;
- case 6:
- TVShowDone();
- break;
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->pokemonTodayFailed.playerName, show->pokemonTodayFailed.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->pokemonTodayFailed.species]);
+ sTVShowState = 1;
+ break;
+ case 1:
+ TVShowConvertInternationalString(gStringVar1, show->pokemonTodayFailed.playerName, show->pokemonTodayFailed.language);
+ GetMapName(gStringVar2, show->pokemonTodayFailed.location, 0);
+ StringCopy(gStringVar3, gSpeciesNames[show->pokemonTodayFailed.species2]);
+ if (show->pokemonTodayFailed.outcome == 1)
+ sTVShowState = 3;
+ else
+ sTVShowState = 2;
+ break;
+ case 2:
+ case 3:
+ TVShowConvertInternationalString(gStringVar1, show->pokemonTodayFailed.playerName, show->pokemonTodayFailed.language);
+ ConvertIntToDecimalString(1, show->pokemonTodayFailed.nBallsUsed);
+ if (Random() % 3 == 0)
+ sTVShowState = 5;
+ else
+ sTVShowState = 4;
+ break;
+ case 4:
+ case 5:
+ TVShowConvertInternationalString(gStringVar1, show->pokemonTodayFailed.playerName, show->pokemonTodayFailed.language);
+ sTVShowState = 6;
+ break;
+ case 6:
+ TVShowDone();
+ break;
}
ShowFieldMessage(sTVPokemonTodayFailedTextGroup[state]);
}
@@ -5031,45 +4759,45 @@ static void DoTVShowPokemonFanClubLetter(void)
state = sTVShowState;
switch (state)
{
- case 0:
- TVShowConvertInternationalString(gStringVar1, show->fanclubLetter.playerName, show->fanclubLetter.language);
- StringCopy(gStringVar2, gSpeciesNames[show->fanclubLetter.species]);
- sTVShowState = 50;
- break;
- case 1:
- rval = (Random() % 4) + 1;
- if (rval == 1)
- sTVShowState = 2;
- else
- sTVShowState = rval + 2;
- break;
- case 2:
- sTVShowState = 51;
- break;
- case 3:
- sTVShowState += (Random() % 3) + 1;
- break;
- case 4:
- case 5:
- case 6:
- TV_FanClubLetter_RandomWordToStringVar3(show);
- sTVShowState = 7;
- break;
- case 7:
- rval = (Random() % 0x1f) + 0x46;
- TV_PrintIntToStringVar(2, rval);
- TVShowDone();
- break;
- case 50:
- ConvertEasyChatWordsToString(gStringVar4, show->fanclubLetter.words, 2, 2);
- ShowFieldMessage(gStringVar4);
- sTVShowState = 1;
- return;
- case 51:
- ConvertEasyChatWordsToString(gStringVar4, show->fanclubLetter.words, 2, 2);
- ShowFieldMessage(gStringVar4);
- sTVShowState = 3;
- return;
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->fanclubLetter.playerName, show->fanclubLetter.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->fanclubLetter.species]);
+ sTVShowState = 50;
+ break;
+ case 1:
+ rval = (Random() % 4) + 1;
+ if (rval == 1)
+ sTVShowState = 2;
+ else
+ sTVShowState = rval + 2;
+ break;
+ case 2:
+ sTVShowState = 51;
+ break;
+ case 3:
+ sTVShowState += (Random() % 3) + 1;
+ break;
+ case 4:
+ case 5:
+ case 6:
+ GetRandomWordFromShow(show);
+ sTVShowState = 7;
+ break;
+ case 7:
+ rval = (Random() % 0x1f) + 0x46;
+ ConvertIntToDecimalString(2, rval);
+ TVShowDone();
+ break;
+ case 50:
+ ConvertEasyChatWordsToString(gStringVar4, show->fanclubLetter.words, 2, 2);
+ ShowFieldMessage(gStringVar4);
+ sTVShowState = 1;
+ return;
+ case 51:
+ ConvertEasyChatWordsToString(gStringVar4, show->fanclubLetter.words, 2, 2);
+ ShowFieldMessage(gStringVar4);
+ sTVShowState = 3;
+ return;
}
ShowFieldMessage(sTVFanClubTextGroup[state]);
}
@@ -5084,27 +4812,27 @@ static void DoTVShowRecentHappenings(void)
state = sTVShowState;
switch (state)
{
- case 0:
- TVShowConvertInternationalString(gStringVar1, show->recentHappenings.playerName, show->recentHappenings.language);
- TV_FanClubLetter_RandomWordToStringVar3(show);
- sTVShowState = 50;
- break;
- case 1:
- sTVShowState += 1 + (Random() % 3);
- break;
- case 2:
- case 3:
- case 4:
- sTVShowState = 5;
- break;
- case 5:
- TVShowDone();
- break;
- case 50:
- ConvertEasyChatWordsToString(gStringVar4, show->recentHappenings.words, 2, 2);
- ShowFieldMessage(gStringVar4);
- sTVShowState = 1;
- return;
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->recentHappenings.playerName, show->recentHappenings.language);
+ GetRandomWordFromShow(show);
+ sTVShowState = 50;
+ break;
+ case 1:
+ sTVShowState += 1 + (Random() % 3);
+ break;
+ case 2:
+ case 3:
+ case 4:
+ sTVShowState = 5;
+ break;
+ case 5:
+ TVShowDone();
+ break;
+ case 50:
+ ConvertEasyChatWordsToString(gStringVar4, show->recentHappenings.words, 2, 2);
+ ShowFieldMessage(gStringVar4);
+ sTVShowState = 1;
+ return;
}
ShowFieldMessage(sTVRecentHappeninssTextGroup[state]);
}
@@ -5119,25 +4847,25 @@ static void DoTVShowPokemonFanClubOpinions(void)
state = sTVShowState;
switch (state)
{
- case 0:
- TVShowConvertInternationalString(gStringVar1, show->fanclubOpinions.playerName, show->fanclubOpinions.language);
- StringCopy(gStringVar2, gSpeciesNames[show->fanclubOpinions.species]);
- TVShowConvertInternationalString(gStringVar3, show->fanclubOpinions.nickname, show->fanclubOpinions.pokemonNameLanguage);
- sTVShowState = show->fanclubOpinions.questionAsked + 1;
- break;
- case 1:
- case 2:
- case 3:
- TVShowConvertInternationalString(gStringVar1, show->fanclubOpinions.playerName, show->fanclubOpinions.language);
- StringCopy(gStringVar2, gSpeciesNames[show->fanclubOpinions.species]);
- CopyEasyChatWord(gStringVar3, show->fanclubOpinions.words[0]);
- sTVShowState = 4;
- break;
- case 4:
- TVShowConvertInternationalString(gStringVar1, show->fanclubOpinions.playerName, show->fanclubOpinions.language);
- CopyEasyChatWord(gStringVar3, show->fanclubOpinions.words[1]);
- TVShowDone();
- break;
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->fanclubOpinions.playerName, show->fanclubOpinions.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->fanclubOpinions.species]);
+ TVShowConvertInternationalString(gStringVar3, show->fanclubOpinions.nickname, show->fanclubOpinions.pokemonNameLanguage);
+ sTVShowState = show->fanclubOpinions.questionAsked + 1;
+ break;
+ case 1:
+ case 2:
+ case 3:
+ TVShowConvertInternationalString(gStringVar1, show->fanclubOpinions.playerName, show->fanclubOpinions.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->fanclubOpinions.species]);
+ CopyEasyChatWord(gStringVar3, show->fanclubOpinions.words[0]);
+ sTVShowState = 4;
+ break;
+ case 4:
+ TVShowConvertInternationalString(gStringVar1, show->fanclubOpinions.playerName, show->fanclubOpinions.language);
+ CopyEasyChatWord(gStringVar3, show->fanclubOpinions.words[1]);
+ TVShowDone();
+ break;
}
ShowFieldMessage(sTVFanClubOpinionsTextGroup[state]);
}
@@ -5182,13 +4910,9 @@ static void DoTVShowPokemonContestLiveUpdates(void)
if (show->contestLiveUpdates.round1Placing == show->contestLiveUpdates.round2Placing)
{
if (show->contestLiveUpdates.round1Placing == 0)
- {
sTVShowState = CONTESTLIVE_STATE_WON_BOTH_ROUNDS;
- }
else
- {
sTVShowState = CONTESTLIVE_STATE_EQUAL_ROUNDS;
- }
}
else if (show->contestLiveUpdates.round1Placing > show->contestLiveUpdates.round2Placing)
{
@@ -5521,64 +5245,64 @@ static void DoTVShowPokemonBattleUpdate(void)
state = sTVShowState;
switch (state)
{
+ case 0:
+ switch (show->battleUpdate.battleType)
+ {
case 0:
- switch (show->battleUpdate.battleType)
- {
- case 0:
- case 1:
- sTVShowState = 1;
- break;
- case 2:
- sTVShowState = 5;
- break;
- }
- break;
case 1:
- TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language);
- TVShowConvertInternationalString(gStringVar2, show->battleUpdate.linkOpponentName, show->battleUpdate.linkOpponentLanguage);
- if (show->battleUpdate.battleType == 0)
- {
- StringCopy(gStringVar3, gText_Single);
- }
- else
- {
- StringCopy(gStringVar3, gText_Double);
- }
- sTVShowState = 2;
+ sTVShowState = 1;
break;
case 2:
- TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language);
- StringCopy(gStringVar2, gSpeciesNames[show->battleUpdate.speciesPlayer]);
- StringCopy(gStringVar3, gMoveNames[show->battleUpdate.move]);
- sTVShowState = 3;
- break;
- case 3:
- TVShowConvertInternationalString(gStringVar1, show->battleUpdate.linkOpponentName, show->battleUpdate.linkOpponentLanguage);
- StringCopy(gStringVar2, gSpeciesNames[show->battleUpdate.speciesOpponent]);
- sTVShowState = 4;
- break;
- case 4:
- TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language);
- TVShowConvertInternationalString(gStringVar2, show->battleUpdate.linkOpponentName, show->battleUpdate.linkOpponentLanguage);
- TVShowDone();
- break;
- case 5:
- TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language);
- TVShowConvertInternationalString(gStringVar2, show->battleUpdate.linkOpponentName, show->battleUpdate.linkOpponentLanguage);
- sTVShowState = 6;
- break;
- case 6:
- TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language);
- StringCopy(gStringVar2, gSpeciesNames[show->battleUpdate.speciesPlayer]);
- StringCopy(gStringVar3, gMoveNames[show->battleUpdate.move]);
- sTVShowState = 7;
- break;
- case 7:
- TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language);
- TVShowConvertInternationalString(gStringVar2, show->battleUpdate.linkOpponentName, show->battleUpdate.linkOpponentLanguage);
- StringCopy(gStringVar3, gSpeciesNames[show->battleUpdate.speciesOpponent]);
- TVShowDone();
+ sTVShowState = 5;
break;
+ }
+ break;
+ case 1:
+ TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language);
+ TVShowConvertInternationalString(gStringVar2, show->battleUpdate.linkOpponentName, show->battleUpdate.linkOpponentLanguage);
+ if (show->battleUpdate.battleType == 0)
+ {
+ StringCopy(gStringVar3, gText_Single);
+ }
+ else
+ {
+ StringCopy(gStringVar3, gText_Double);
+ }
+ sTVShowState = 2;
+ break;
+ case 2:
+ TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->battleUpdate.speciesPlayer]);
+ StringCopy(gStringVar3, gMoveNames[show->battleUpdate.move]);
+ sTVShowState = 3;
+ break;
+ case 3:
+ TVShowConvertInternationalString(gStringVar1, show->battleUpdate.linkOpponentName, show->battleUpdate.linkOpponentLanguage);
+ StringCopy(gStringVar2, gSpeciesNames[show->battleUpdate.speciesOpponent]);
+ sTVShowState = 4;
+ break;
+ case 4:
+ TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language);
+ TVShowConvertInternationalString(gStringVar2, show->battleUpdate.linkOpponentName, show->battleUpdate.linkOpponentLanguage);
+ TVShowDone();
+ break;
+ case 5:
+ TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language);
+ TVShowConvertInternationalString(gStringVar2, show->battleUpdate.linkOpponentName, show->battleUpdate.linkOpponentLanguage);
+ sTVShowState = 6;
+ break;
+ case 6:
+ TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->battleUpdate.speciesPlayer]);
+ StringCopy(gStringVar3, gMoveNames[show->battleUpdate.move]);
+ sTVShowState = 7;
+ break;
+ case 7:
+ TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language);
+ TVShowConvertInternationalString(gStringVar2, show->battleUpdate.linkOpponentName, show->battleUpdate.linkOpponentLanguage);
+ StringCopy(gStringVar3, gSpeciesNames[show->battleUpdate.speciesOpponent]);
+ TVShowDone();
+ break;
}
ShowFieldMessage(sTVPokemonBattleUpdateTextGroup[state]);
}
@@ -5593,95 +5317,88 @@ static void DoTVShow3CheersForPokeblocks(void)
state = sTVShowState;
switch (state)
{
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->threeCheers.playerName, show->threeCheers.language);
+ if (show->threeCheers.sheen > 20)
+ sTVShowState = 1;
+ else
+ sTVShowState = 3;
+ break;
+ case 1:
+ switch (show->threeCheers.flavor)
+ {
case 0:
- TVShowConvertInternationalString(gStringVar1, show->threeCheers.playerName, show->threeCheers.language);
- if (show->threeCheers.sheen > 20)
- {
- sTVShowState = 1;
- }
- else
- {
- sTVShowState = 3;
- }
+ StringCopy(gStringVar1, gText_Spicy2);
break;
case 1:
- switch (show->threeCheers.flavor)
- {
- case 0:
- StringCopy(gStringVar1, gText_Spicy2);
- break;
- case 1:
- StringCopy(gStringVar1, gText_Dry2);
- break;
- case 2:
- StringCopy(gStringVar1, gText_Sweet2);
- break;
- case 3:
- StringCopy(gStringVar1, gText_Bitter2);
- break;
- case 4:
- StringCopy(gStringVar1, gText_Sour2);
- break;
- }
- if (show->threeCheers.sheen > 24)
- {
- StringCopy(gStringVar2, gText_Excellent);
- } else if (show->threeCheers.sheen > 22)
- {
- StringCopy(gStringVar2, gText_VeryGood);
- }
- else
- {
- StringCopy(gStringVar2, gText_Good);
- }
- TVShowConvertInternationalString(gStringVar3, show->threeCheers.playerName, show->threeCheers.language);
- sTVShowState = 2;
+ StringCopy(gStringVar1, gText_Dry2);
break;
case 2:
- TVShowConvertInternationalString(gStringVar1, show->threeCheers.worstBlenderName, show->threeCheers.worstBlenderLanguage);
- sTVShowState = 5;
+ StringCopy(gStringVar1, gText_Sweet2);
break;
case 3:
- switch (show->threeCheers.flavor)
- {
- case 0:
- StringCopy(gStringVar1, gText_Spicy2);
- break;
- case 1:
- StringCopy(gStringVar1, gText_Dry2);
- break;
- case 2:
- StringCopy(gStringVar1, gText_Sweet2);
- break;
- case 3:
- StringCopy(gStringVar1, gText_Bitter2);
- break;
- case 4:
- StringCopy(gStringVar1, gText_Sour2);
- break;
- }
- if (show->threeCheers.sheen > 16)
- {
- StringCopy(gStringVar2, gText_SoSo);
- } else if (show->threeCheers.sheen > 13)
- {
- StringCopy(gStringVar2, gText_Bad);
- }
- else
- {
- StringCopy(gStringVar2, gText_TheWorst);
- }
- TVShowConvertInternationalString(gStringVar3, show->threeCheers.playerName, show->threeCheers.language);
- sTVShowState = 4;
+ StringCopy(gStringVar1, gText_Bitter2);
break;
case 4:
- TVShowConvertInternationalString(gStringVar1, show->threeCheers.worstBlenderName, show->threeCheers.worstBlenderLanguage);
- TVShowConvertInternationalString(gStringVar2, show->threeCheers.playerName, show->threeCheers.language);
- sTVShowState = 5;
+ StringCopy(gStringVar1, gText_Sour2);
break;
- case 5:
- TVShowDone();
+ }
+ if (show->threeCheers.sheen > 24)
+ {
+ StringCopy(gStringVar2, gText_Excellent);
+ } else if (show->threeCheers.sheen > 22)
+ {
+ StringCopy(gStringVar2, gText_VeryGood);
+ }
+ else
+ {
+ StringCopy(gStringVar2, gText_Good);
+ }
+ TVShowConvertInternationalString(gStringVar3, show->threeCheers.playerName, show->threeCheers.language);
+ sTVShowState = 2;
+ break;
+ case 2:
+ TVShowConvertInternationalString(gStringVar1, show->threeCheers.worstBlenderName, show->threeCheers.worstBlenderLanguage);
+ sTVShowState = 5;
+ break;
+ case 3:
+ switch (show->threeCheers.flavor)
+ {
+ case 0:
+ StringCopy(gStringVar1, gText_Spicy2);
+ break;
+ case 1:
+ StringCopy(gStringVar1, gText_Dry2);
+ break;
+ case 2:
+ StringCopy(gStringVar1, gText_Sweet2);
+ break;
+ case 3:
+ StringCopy(gStringVar1, gText_Bitter2);
break;
+ case 4:
+ StringCopy(gStringVar1, gText_Sour2);
+ break;
+ }
+
+ if (show->threeCheers.sheen > 16)
+ StringCopy(gStringVar2, gText_SoSo);
+ else if (show->threeCheers.sheen > 13)
+ StringCopy(gStringVar2, gText_Bad);
+ else
+ StringCopy(gStringVar2, gText_TheWorst);
+
+ TVShowConvertInternationalString(gStringVar3, show->threeCheers.playerName, show->threeCheers.language);
+ sTVShowState = 4;
+ break;
+ case 4:
+ TVShowConvertInternationalString(gStringVar1, show->threeCheers.worstBlenderName, show->threeCheers.worstBlenderLanguage);
+ TVShowConvertInternationalString(gStringVar2, show->threeCheers.playerName, show->threeCheers.language);
+ sTVShowState = 5;
+ break;
+ case 5:
+ TVShowDone();
+ break;
}
ShowFieldMessage(sTV3CheersForPokeblocksTextGroup[state]);
}
@@ -5694,62 +5411,48 @@ void DoTVShowInSearchOfTrainers(void)
state = sTVShowState;
switch (state)
{
- case 0:
- GetMapName(gStringVar1, gSaveBlock1Ptr->gabbyAndTyData.mapnum, 0);
- if (gSaveBlock1Ptr->gabbyAndTyData.battleNum > 1)
- {
- sTVShowState = 1;
- }
- else
- {
- sTVShowState = 2;
- }
- break;
- case 1:
+ case 0:
+ GetMapName(gStringVar1, gSaveBlock1Ptr->gabbyAndTyData.mapnum, 0);
+ if (gSaveBlock1Ptr->gabbyAndTyData.battleNum > 1)
+ sTVShowState = 1;
+ else
sTVShowState = 2;
- break;
- case 2:
- if (!gSaveBlock1Ptr->gabbyAndTyData.battleTookMoreThanOneTurn)
- {
- sTVShowState = 4;
- }
- else if (gSaveBlock1Ptr->gabbyAndTyData.playerThrewABall)
- {
- sTVShowState = 5;
- }
- else if (gSaveBlock1Ptr->gabbyAndTyData.playerUsedHealingItem)
- {
- sTVShowState = 6;
- }
- else if (gSaveBlock1Ptr->gabbyAndTyData.playerLostAMon)
- {
- sTVShowState = 7;
- }
- else
- {
- sTVShowState = 3;
- }
- break;
- case 3:
- StringCopy(gStringVar1, gSpeciesNames[gSaveBlock1Ptr->gabbyAndTyData.mon1]);
- StringCopy(gStringVar2, gMoveNames[gSaveBlock1Ptr->gabbyAndTyData.lastMove]);
- StringCopy(gStringVar3, gSpeciesNames[gSaveBlock1Ptr->gabbyAndTyData.mon2]);
- sTVShowState = 8;
- break;
- case 4:
- case 5:
- case 6:
- case 7:
- sTVShowState = 8;
- break;
- case 8:
- CopyEasyChatWord(gStringVar1, gSaveBlock1Ptr->gabbyAndTyData.quote[0]);
- StringCopy(gStringVar2, gSpeciesNames[gSaveBlock1Ptr->gabbyAndTyData.mon1]);
- StringCopy(gStringVar3, gSpeciesNames[gSaveBlock1Ptr->gabbyAndTyData.mon2]);
- gSpecialVar_Result = TRUE;
- sTVShowState = 0;
- TakeTVShowInSearchOfTrainersOffTheAir();
- break;
+ break;
+ case 1:
+ sTVShowState = 2;
+ break;
+ case 2:
+ if (!gSaveBlock1Ptr->gabbyAndTyData.battleTookMoreThanOneTurn)
+ sTVShowState = 4;
+ else if (gSaveBlock1Ptr->gabbyAndTyData.playerThrewABall)
+ sTVShowState = 5;
+ else if (gSaveBlock1Ptr->gabbyAndTyData.playerUsedHealingItem)
+ sTVShowState = 6;
+ else if (gSaveBlock1Ptr->gabbyAndTyData.playerLostAMon)
+ sTVShowState = 7;
+ else
+ sTVShowState = 3;
+ break;
+ case 3:
+ StringCopy(gStringVar1, gSpeciesNames[gSaveBlock1Ptr->gabbyAndTyData.mon1]);
+ StringCopy(gStringVar2, gMoveNames[gSaveBlock1Ptr->gabbyAndTyData.lastMove]);
+ StringCopy(gStringVar3, gSpeciesNames[gSaveBlock1Ptr->gabbyAndTyData.mon2]);
+ sTVShowState = 8;
+ break;
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ sTVShowState = 8;
+ break;
+ case 8:
+ CopyEasyChatWord(gStringVar1, gSaveBlock1Ptr->gabbyAndTyData.quote[0]);
+ StringCopy(gStringVar2, gSpeciesNames[gSaveBlock1Ptr->gabbyAndTyData.mon1]);
+ StringCopy(gStringVar3, gSpeciesNames[gSaveBlock1Ptr->gabbyAndTyData.mon2]);
+ gSpecialVar_Result = TRUE;
+ sTVShowState = 0;
+ TakeGabbyAndTyOffTheAir();
+ break;
}
ShowFieldMessage(sTVInSearchOfTrainersTextGroup[state]);
}
@@ -5762,28 +5465,24 @@ static void DoTVShowPokemonAngler(void)
show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004];
gSpecialVar_Result = FALSE;
if (show->pokemonAngler.nBites < show->pokemonAngler.nFails)
- {
sTVShowState = 0;
- }
else
- {
sTVShowState = 1;
- }
state = sTVShowState;
switch (state)
{
- case 0:
- TVShowConvertInternationalString(gStringVar1, show->pokemonAngler.playerName, show->pokemonAngler.language);
- StringCopy(gStringVar2, gSpeciesNames[show->pokemonAngler.species]);
- TV_PrintIntToStringVar(2, show->pokemonAngler.nFails);
- TVShowDone();
- break;
- case 1:
- TVShowConvertInternationalString(gStringVar1, show->pokemonAngler.playerName, show->pokemonAngler.language);
- StringCopy(gStringVar2, gSpeciesNames[show->pokemonAngler.species]);
- TV_PrintIntToStringVar(2, show->pokemonAngler.nBites);
- TVShowDone();
- break;
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->pokemonAngler.playerName, show->pokemonAngler.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->pokemonAngler.species]);
+ ConvertIntToDecimalString(2, show->pokemonAngler.nFails);
+ TVShowDone();
+ break;
+ case 1:
+ TVShowConvertInternationalString(gStringVar1, show->pokemonAngler.playerName, show->pokemonAngler.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->pokemonAngler.species]);
+ ConvertIntToDecimalString(2, show->pokemonAngler.nBites);
+ TVShowDone();
+ break;
}
ShowFieldMessage(sTVPokemonAnslerTextGroup[state]);
}
@@ -5798,22 +5497,22 @@ static void DoTVShowTheWorldOfMasters(void)
state = sTVShowState;
switch (state)
{
- case 0:
- TVShowConvertInternationalString(gStringVar1, show->worldOfMasters.playerName, show->worldOfMasters.language);
- TV_PrintIntToStringVar(1, show->worldOfMasters.steps);
- TV_PrintIntToStringVar(2, show->worldOfMasters.numPokeCaught);
- sTVShowState = 1;
- break;
- case 1:
- StringCopy(gStringVar1, gSpeciesNames[show->worldOfMasters.species]);
- sTVShowState = 2;
- break;
- case 2:
- TVShowConvertInternationalString(gStringVar1, show->worldOfMasters.playerName, show->worldOfMasters.language);
- GetMapName(gStringVar2, show->worldOfMasters.location, 0);
- StringCopy(gStringVar3, gSpeciesNames[show->worldOfMasters.caughtPoke]);
- TVShowDone();
- break;
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->worldOfMasters.playerName, show->worldOfMasters.language);
+ ConvertIntToDecimalString(1, show->worldOfMasters.steps);
+ ConvertIntToDecimalString(2, show->worldOfMasters.numPokeCaught);
+ sTVShowState = 1;
+ break;
+ case 1:
+ StringCopy(gStringVar1, gSpeciesNames[show->worldOfMasters.species]);
+ sTVShowState = 2;
+ break;
+ case 2:
+ TVShowConvertInternationalString(gStringVar1, show->worldOfMasters.playerName, show->worldOfMasters.language);
+ GetMapName(gStringVar2, show->worldOfMasters.location, 0);
+ StringCopy(gStringVar3, gSpeciesNames[show->worldOfMasters.caughtPoke]);
+ TVShowDone();
+ break;
}
ShowFieldMessage(sTVWorldOfMastersTextGroup[state]);
}
@@ -5828,143 +5527,111 @@ static void DoTVShowTodaysRivalTrainer(void)
state = sTVShowState;
switch (state)
{
- case 0:
- switch (show->rivalTrainer.location)
- {
- default:
- sTVShowState = 7;
- break;
- case MAPSEC_SECRET_BASE:
- sTVShowState = 8;
- break;
- case MAPSEC_DYNAMIC:
- switch (show->rivalTrainer.mapLayoutId)
- {
- case LAYOUT_SS_TIDAL_CORRIDOR:
- case LAYOUT_SS_TIDAL_LOWER_DECK:
- case LAYOUT_SS_TIDAL_ROOMS:
- sTVShowState = 10;
- break;
- default:
- sTVShowState = 9;
- break;
- }
- break;
- }
- break;
- case 7:
- TVShowConvertInternationalString(gStringVar1, show->rivalTrainer.playerName, show->rivalTrainer.language);
- TV_PrintIntToStringVar(1, show->rivalTrainer.dexCount);
- GetMapName(gStringVar3, show->rivalTrainer.location, 0);
- if (show->rivalTrainer.badgeCount != 0)
- {
- sTVShowState = 1;
- }
- else
- {
- sTVShowState = 2;
- }
- break;
- case 8:
- TVShowConvertInternationalString(gStringVar1, show->rivalTrainer.playerName, show->rivalTrainer.language);
- TV_PrintIntToStringVar(1, show->rivalTrainer.dexCount);
- if (show->rivalTrainer.badgeCount != 0)
- {
- sTVShowState = 1;
- }
- else
- {
- sTVShowState = 2;
- }
- break;
- case 9:
- TVShowConvertInternationalString(gStringVar1, show->rivalTrainer.playerName, show->rivalTrainer.language);
- TV_PrintIntToStringVar(1, show->rivalTrainer.dexCount);
- if (show->rivalTrainer.badgeCount != 0)
- {
- sTVShowState = 1;
- }
- else
- {
- sTVShowState = 2;
- }
- break;
- case 10:
- TVShowConvertInternationalString(gStringVar1, show->rivalTrainer.playerName, show->rivalTrainer.language);
- TV_PrintIntToStringVar(1, show->rivalTrainer.dexCount);
- if (show->rivalTrainer.badgeCount != 0)
- {
- sTVShowState = 1;
- }
- else
- {
- sTVShowState = 2;
- }
+ case 0:
+ switch (show->rivalTrainer.location)
+ {
+ default:
+ sTVShowState = 7;
break;
- case 1:
- TV_PrintIntToStringVar(0, show->rivalTrainer.badgeCount);
- if (FlagGet(FLAG_LANDMARK_BATTLE_FRONTIER))
- {
- if (show->rivalTrainer.nSilverSymbols || show->rivalTrainer.nGoldSymbols)
- {
- sTVShowState = 4;
- }
- else
- {
- sTVShowState = 3;
- }
- }
- else
- {
- sTVShowState = 6;
- }
+ case MAPSEC_SECRET_BASE:
+ sTVShowState = 8;
break;
- case 2:
- if (FlagGet(FLAG_LANDMARK_BATTLE_FRONTIER))
- {
- if (show->rivalTrainer.nSilverSymbols || show->rivalTrainer.nGoldSymbols)
- {
- sTVShowState = 4;
- }
- else
- {
- sTVShowState = 3;
- }
- }
- else
+ case MAPSEC_DYNAMIC:
+ switch (show->rivalTrainer.mapLayoutId)
{
- sTVShowState = 6;
+ case LAYOUT_SS_TIDAL_CORRIDOR:
+ case LAYOUT_SS_TIDAL_LOWER_DECK:
+ case LAYOUT_SS_TIDAL_ROOMS:
+ sTVShowState = 10;
+ break;
+ default:
+ sTVShowState = 9;
+ break;
}
break;
- case 3:
- if (show->rivalTrainer.battlePoints == 0)
- {
- sTVShowState = 6;
- }
+ }
+ break;
+ case 7:
+ TVShowConvertInternationalString(gStringVar1, show->rivalTrainer.playerName, show->rivalTrainer.language);
+ ConvertIntToDecimalString(1, show->rivalTrainer.dexCount);
+ GetMapName(gStringVar3, show->rivalTrainer.location, 0);
+ if (show->rivalTrainer.badgeCount != 0)
+ sTVShowState = 1;
+ else
+ sTVShowState = 2;
+ break;
+ case 8:
+ TVShowConvertInternationalString(gStringVar1, show->rivalTrainer.playerName, show->rivalTrainer.language);
+ ConvertIntToDecimalString(1, show->rivalTrainer.dexCount);
+ if (show->rivalTrainer.badgeCount != 0)
+ sTVShowState = 1;
+ else
+ sTVShowState = 2;
+ break;
+ case 9:
+ TVShowConvertInternationalString(gStringVar1, show->rivalTrainer.playerName, show->rivalTrainer.language);
+ ConvertIntToDecimalString(1, show->rivalTrainer.dexCount);
+ if (show->rivalTrainer.badgeCount != 0)
+ sTVShowState = 1;
+ else
+ sTVShowState = 2;
+ break;
+ case 10:
+ TVShowConvertInternationalString(gStringVar1, show->rivalTrainer.playerName, show->rivalTrainer.language);
+ ConvertIntToDecimalString(1, show->rivalTrainer.dexCount);
+ if (show->rivalTrainer.badgeCount != 0)
+ sTVShowState = 1;
+ else
+ sTVShowState = 2;
+ break;
+ case 1:
+ ConvertIntToDecimalString(0, show->rivalTrainer.badgeCount);
+ if (FlagGet(FLAG_LANDMARK_BATTLE_FRONTIER))
+ {
+ if (show->rivalTrainer.nSilverSymbols || show->rivalTrainer.nGoldSymbols)
+ sTVShowState = 4;
else
- {
- sTVShowState = 5;
- }
- break;
- case 4:
- TV_PrintIntToStringVar(0, show->rivalTrainer.nGoldSymbols);
- TV_PrintIntToStringVar(1, show->rivalTrainer.nSilverSymbols);
- if (show->rivalTrainer.battlePoints == 0)
- {
- sTVShowState = 6;
- }
+ sTVShowState = 3;
+ }
+ else
+ {
+ sTVShowState = 6;
+ }
+ break;
+ case 2:
+ if (FlagGet(FLAG_LANDMARK_BATTLE_FRONTIER))
+ {
+ if (show->rivalTrainer.nSilverSymbols || show->rivalTrainer.nGoldSymbols)
+ sTVShowState = 4;
else
- {
- sTVShowState = 5;
- }
- break;
- case 5:
- TV_PrintIntToStringVar(0, show->rivalTrainer.battlePoints);
+ sTVShowState = 3;
+ }
+ else
+ {
sTVShowState = 6;
- break;
- case 6:
- TVShowConvertInternationalString(gStringVar1, show->rivalTrainer.playerName, show->rivalTrainer.language);
- TVShowDone();
+ }
+ break;
+ case 3:
+ if (show->rivalTrainer.battlePoints == 0)
+ sTVShowState = 6;
+ else
+ sTVShowState = 5;
+ break;
+ case 4:
+ ConvertIntToDecimalString(0, show->rivalTrainer.nGoldSymbols);
+ ConvertIntToDecimalString(1, show->rivalTrainer.nSilverSymbols);
+ if (show->rivalTrainer.battlePoints == 0)
+ sTVShowState = 6;
+ else
+ sTVShowState = 5;
+ break;
+ case 5:
+ ConvertIntToDecimalString(0, show->rivalTrainer.battlePoints);
+ sTVShowState = 6;
+ break;
+ case 6:
+ TVShowConvertInternationalString(gStringVar1, show->rivalTrainer.playerName, show->rivalTrainer.language);
+ TVShowDone();
}
ShowFieldMessage(sTVTodaysRivalTrainerTextGroup[state]);
}
@@ -6027,38 +5694,38 @@ static void DoTVShowHoennTreasureInvestigators(void)
state = sTVShowState;
switch (state)
{
- case 0:
- StringCopy(gStringVar1, ItemId_GetName(show->treasureInvestigators.item));
- if (show->treasureInvestigators.location == MAPSEC_DYNAMIC)
- {
- switch (show->treasureInvestigators.mapLayoutId)
- {
- case LAYOUT_SS_TIDAL_CORRIDOR:
- case LAYOUT_SS_TIDAL_LOWER_DECK:
- case LAYOUT_SS_TIDAL_ROOMS:
- sTVShowState = 2;
- break;
- default:
- sTVShowState = 1;
- break;
- }
- }
- else
+ case 0:
+ StringCopy(gStringVar1, ItemId_GetName(show->treasureInvestigators.item));
+ if (show->treasureInvestigators.location == MAPSEC_DYNAMIC)
+ {
+ switch (show->treasureInvestigators.mapLayoutId)
{
+ case LAYOUT_SS_TIDAL_CORRIDOR:
+ case LAYOUT_SS_TIDAL_LOWER_DECK:
+ case LAYOUT_SS_TIDAL_ROOMS:
+ sTVShowState = 2;
+ break;
+ default:
sTVShowState = 1;
+ break;
}
- break;
- case 1:
- StringCopy(gStringVar1, ItemId_GetName(show->treasureInvestigators.item));
- TVShowConvertInternationalString(gStringVar2, show->treasureInvestigators.playerName, show->treasureInvestigators.language);
- GetMapName(gStringVar3, show->treasureInvestigators.location, 0);
- TVShowDone();
- break;
- case 2:
- StringCopy(gStringVar1, ItemId_GetName(show->treasureInvestigators.item));
- TVShowConvertInternationalString(gStringVar2, show->treasureInvestigators.playerName, show->treasureInvestigators.language);
- TVShowDone();
- break;
+ }
+ else
+ {
+ sTVShowState = 1;
+ }
+ break;
+ case 1:
+ StringCopy(gStringVar1, ItemId_GetName(show->treasureInvestigators.item));
+ TVShowConvertInternationalString(gStringVar2, show->treasureInvestigators.playerName, show->treasureInvestigators.language);
+ GetMapName(gStringVar3, show->treasureInvestigators.location, 0);
+ TVShowDone();
+ break;
+ case 2:
+ StringCopy(gStringVar1, ItemId_GetName(show->treasureInvestigators.item));
+ TVShowConvertInternationalString(gStringVar2, show->treasureInvestigators.playerName, show->treasureInvestigators.language);
+ TVShowDone();
+ break;
}
ShowFieldMessage(sTVHoennTreasureInvestisatorsTextGroup[state]);
}
@@ -6073,66 +5740,62 @@ static void DoTVShowFindThatGamer(void)
state = sTVShowState;
switch (state)
{
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->findThatGamer.playerName, show->findThatGamer.language);
+ switch (show->findThatGamer.whichGame)
+ {
case 0:
- TVShowConvertInternationalString(gStringVar1, show->findThatGamer.playerName, show->findThatGamer.language);
- switch (show->findThatGamer.whichGame)
- {
- case 0:
- StringCopy(gStringVar2, gText_Slots);
- break;
- case 1:
- StringCopy(gStringVar2, gText_Roulette);
- break;
- }
- if (show->findThatGamer.won == TRUE)
- {
- sTVShowState = 1;
- }
- else
- {
- sTVShowState = 2;
- }
+ StringCopy(gStringVar2, gText_Slots);
break;
case 1:
- TVShowConvertInternationalString(gStringVar1, show->findThatGamer.playerName, show->findThatGamer.language);
- switch (show->findThatGamer.whichGame)
- {
- case 0:
- StringCopy(gStringVar2, gText_Slots);
- break;
- case 1:
- StringCopy(gStringVar2, gText_Roulette);
- break;
- }
- TV_PrintIntToStringVar(2, show->findThatGamer.nCoins);
- TVShowDone(); break;
- case 2:
- TVShowConvertInternationalString(gStringVar1, show->findThatGamer.playerName, show->findThatGamer.language);
- switch (show->findThatGamer.whichGame)
- {
- case 0:
- StringCopy(gStringVar2, gText_Slots);
- break;
- case 1:
- StringCopy(gStringVar2, gText_Roulette);
- break;
- }
- TV_PrintIntToStringVar(2, show->findThatGamer.nCoins);
- sTVShowState = 3;
+ StringCopy(gStringVar2, gText_Roulette);
break;
- case 3:
- TVShowConvertInternationalString(gStringVar1, show->findThatGamer.playerName, show->findThatGamer.language);
- switch (show->findThatGamer.whichGame)
- {
- case 0:
- StringCopy(gStringVar2, gText_Roulette);
- break;
- case 1:
- StringCopy(gStringVar2, gText_Slots);
- break;
- }
- TVShowDone();
+ }
+ if (show->findThatGamer.won == TRUE)
+ sTVShowState = 1;
+ else
+ sTVShowState = 2;
+ break;
+ case 1:
+ TVShowConvertInternationalString(gStringVar1, show->findThatGamer.playerName, show->findThatGamer.language);
+ switch (show->findThatGamer.whichGame)
+ {
+ case 0:
+ StringCopy(gStringVar2, gText_Slots);
break;
+ case 1:
+ StringCopy(gStringVar2, gText_Roulette);
+ break;
+ }
+ ConvertIntToDecimalString(2, show->findThatGamer.nCoins);
+ TVShowDone(); break;
+ case 2:
+ TVShowConvertInternationalString(gStringVar1, show->findThatGamer.playerName, show->findThatGamer.language);
+ switch (show->findThatGamer.whichGame)
+ {
+ case 0:
+ StringCopy(gStringVar2, gText_Slots);
+ break;
+ case 1:
+ StringCopy(gStringVar2, gText_Roulette);
+ break;
+ }
+ ConvertIntToDecimalString(2, show->findThatGamer.nCoins);
+ sTVShowState = 3;
+ break;
+ case 3:
+ TVShowConvertInternationalString(gStringVar1, show->findThatGamer.playerName, show->findThatGamer.language);
+ switch (show->findThatGamer.whichGame)
+ {
+ case 0:
+ StringCopy(gStringVar2, gText_Roulette);
+ break;
+ case 1:
+ StringCopy(gStringVar2, gText_Slots);
+ break;
+ }
+ TVShowDone();
+ break;
}
ShowFieldMessage(sTVFindThatGamerTextGroup[state]);
}
@@ -6147,95 +5810,87 @@ static void DoTVShowBreakingNewsTV(void)
state = sTVShowState;
switch (state)
{
- case 0:
- if (show->breakingNews.outcome == 0)
- {
- sTVShowState = 1;
- }
- else
- {
- sTVShowState = 5;
- }
- break;
+ case 0:
+ if (show->breakingNews.outcome == 0)
+ sTVShowState = 1;
+ else
+ sTVShowState = 5;
+ break;
+ case 1:
+ TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]);
+ GetMapName(gStringVar3, show->breakingNews.location, 0);
+ sTVShowState = 2;
+ break;
+ case 2:
+ TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]);
+ StringCopy(gStringVar3, gSpeciesNames[show->breakingNews.poke1Species]);
+ sTVShowState = 3;
+ break;
+ case 3:
+ ConvertIntToDecimalString(0, show->breakingNews.balls);
+ StringCopy(gStringVar2, ItemId_GetName(show->breakingNews.caughtMonBall));
+ sTVShowState = 4;
+ break;
+ case 4:
+ TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language);
+ GetMapName(gStringVar2, show->breakingNews.location, 0);
+ TVShowDone();
+ break;
+ case 5:
+ TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]);
+ GetMapName(gStringVar3, show->breakingNews.location, 0);
+ sTVShowState = 6;
+ break;
+ case 6:
+ TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]);
+ StringCopy(gStringVar3, gSpeciesNames[show->breakingNews.poke1Species]);
+ switch (show->breakingNews.outcome)
+ {
case 1:
- TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language);
- StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]);
- GetMapName(gStringVar3, show->breakingNews.location, 0);
- sTVShowState = 2;
+ if (show->breakingNews.lastUsedMove == MOVE_NONE)
+ sTVShowState = 12;
+ else
+ sTVShowState = 7;
break;
case 2:
- TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language);
- StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]);
- StringCopy(gStringVar3, gSpeciesNames[show->breakingNews.poke1Species]);
- sTVShowState = 3;
+ sTVShowState = 9;
break;
case 3:
- TV_PrintIntToStringVar(0, show->breakingNews.balls);
- StringCopy(gStringVar2, ItemId_GetName(show->breakingNews.caughtMonBall));
- sTVShowState = 4;
- break;
- case 4:
- TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language);
- GetMapName(gStringVar2, show->breakingNews.location, 0);
- TVShowDone();
- break;
- case 5:
- TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language);
- StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]);
- GetMapName(gStringVar3, show->breakingNews.location, 0);
- sTVShowState = 6;
- break;
- case 6:
- TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language);
- StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]);
- StringCopy(gStringVar3, gSpeciesNames[show->breakingNews.poke1Species]);
- switch (show->breakingNews.outcome)
- {
- case 1:
- if (show->breakingNews.lastUsedMove == MOVE_NONE)
- {
- sTVShowState = 12;
- }
- else
- {
- sTVShowState = 7;
- }
- break;
- case 2:
- sTVShowState = 9;
- break;
- case 3:
- sTVShowState = 10;
- break;
- }
- break;
- case 7:
- StringCopy(gStringVar1, gMoveNames[show->breakingNews.lastUsedMove]);
- StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.poke1Species]);
- sTVShowState = 8;
- break;
- case 12:
- TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language);
- StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]);
- StringCopy(gStringVar3, gSpeciesNames[show->breakingNews.poke1Species]);
- sTVShowState = 8;
- break;
- case 8:
- TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language);
- GetMapName(gStringVar2, show->breakingNews.location, 0);
- sTVShowState = 11;
- break;
- case 9:
- case 10:
- TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language);
- StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]);
- GetMapName(gStringVar3, show->breakingNews.location, 0);
- sTVShowState = 11;
- break;
- case 11:
- TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language);
- TVShowDone();
+ sTVShowState = 10;
break;
+ }
+ break;
+ case 7:
+ StringCopy(gStringVar1, gMoveNames[show->breakingNews.lastUsedMove]);
+ StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.poke1Species]);
+ sTVShowState = 8;
+ break;
+ case 12:
+ TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]);
+ StringCopy(gStringVar3, gSpeciesNames[show->breakingNews.poke1Species]);
+ sTVShowState = 8;
+ break;
+ case 8:
+ TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language);
+ GetMapName(gStringVar2, show->breakingNews.location, 0);
+ sTVShowState = 11;
+ break;
+ case 9:
+ case 10:
+ TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]);
+ GetMapName(gStringVar3, show->breakingNews.location, 0);
+ sTVShowState = 11;
+ break;
+ case 11:
+ TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language);
+ TVShowDone();
+ break;
}
ShowFieldMessage(sTVBreakingNewsTextGroup[state]);
}
@@ -6250,88 +5905,72 @@ static void DoTVShowSecretBaseVisit(void)
state = sTVShowState;
switch (state)
{
- case 0:
- TVShowConvertInternationalString(gStringVar1, show->secretBaseVisit.playerName, show->secretBaseVisit.language);
- if (show->secretBaseVisit.nDecorations == 0)
- {
- sTVShowState = 2;
- }
- else
- {
- sTVShowState = 1;
- }
- break;
- case 1:
- StringCopy(gStringVar2, gDecorations[show->secretBaseVisit.decorations[0]].name);
- if (show->secretBaseVisit.nDecorations == 1)
- {
- sTVShowState = 4;
- }
- else
- {
- sTVShowState = 3;
- }
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->secretBaseVisit.playerName, show->secretBaseVisit.language);
+ if (show->secretBaseVisit.nDecorations == 0)
+ sTVShowState = 2;
+ else
+ sTVShowState = 1;
+ break;
+ case 1:
+ StringCopy(gStringVar2, gDecorations[show->secretBaseVisit.decorations[0]].name);
+ if (show->secretBaseVisit.nDecorations == 1)
+ sTVShowState = 4;
+ else
+ sTVShowState = 3;
+ break;
+ case 3:
+ StringCopy(gStringVar2, gDecorations[show->secretBaseVisit.decorations[1]].name);
+ switch (show->secretBaseVisit.nDecorations)
+ {
+ case 2:
+ sTVShowState = 7;
break;
case 3:
- StringCopy(gStringVar2, gDecorations[show->secretBaseVisit.decorations[1]].name);
- switch (show->secretBaseVisit.nDecorations)
- {
- case 2:
- sTVShowState = 7;
- break;
- case 3:
- sTVShowState = 6;
- break;
- case 4:
- sTVShowState = 5;
- break;
- }
- break;
- case 5:
- StringCopy(gStringVar2, gDecorations[show->secretBaseVisit.decorations[2]].name);
- StringCopy(gStringVar3, gDecorations[show->secretBaseVisit.decorations[3]].name);
- sTVShowState = 8;
- break;
- case 6:
- StringCopy(gStringVar2, gDecorations[show->secretBaseVisit.decorations[2]].name);
- sTVShowState = 8;
+ sTVShowState = 6;
break;
- case 2:
case 4:
- case 7:
- sTVShowState = 8;
- break;
- case 8:
- TVShowConvertInternationalString(gStringVar1, show->secretBaseVisit.playerName, show->secretBaseVisit.language);
- if (show->secretBaseVisit.avgLevel < 25)
- {
- sTVShowState = 12;
- }
- else if (show->secretBaseVisit.avgLevel < 50)
- {
- sTVShowState = 11;
- }
- else if (show->secretBaseVisit.avgLevel < 70)
- {
- sTVShowState = 10;
- }
- else
- {
- sTVShowState = 9;
- }
- break;
- case 9:
- case 10:
- case 11:
- case 12:
- TVShowConvertInternationalString(gStringVar1, show->secretBaseVisit.playerName, show->secretBaseVisit.language);
- StringCopy(gStringVar2, gSpeciesNames[show->secretBaseVisit.species]);
- StringCopy(gStringVar3, gMoveNames[show->secretBaseVisit.move]);
- sTVShowState = 13;
- break;
- case 13:
- TVShowDone();
+ sTVShowState = 5;
break;
+ }
+ break;
+ case 5:
+ StringCopy(gStringVar2, gDecorations[show->secretBaseVisit.decorations[2]].name);
+ StringCopy(gStringVar3, gDecorations[show->secretBaseVisit.decorations[3]].name);
+ sTVShowState = 8;
+ break;
+ case 6:
+ StringCopy(gStringVar2, gDecorations[show->secretBaseVisit.decorations[2]].name);
+ sTVShowState = 8;
+ break;
+ case 2:
+ case 4:
+ case 7:
+ sTVShowState = 8;
+ break;
+ case 8:
+ TVShowConvertInternationalString(gStringVar1, show->secretBaseVisit.playerName, show->secretBaseVisit.language);
+ if (show->secretBaseVisit.avgLevel < 25)
+ sTVShowState = 12;
+ else if (show->secretBaseVisit.avgLevel < 50)
+ sTVShowState = 11;
+ else if (show->secretBaseVisit.avgLevel < 70)
+ sTVShowState = 10;
+ else
+ sTVShowState = 9;
+ break;
+ case 9:
+ case 10:
+ case 11:
+ case 12:
+ TVShowConvertInternationalString(gStringVar1, show->secretBaseVisit.playerName, show->secretBaseVisit.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->secretBaseVisit.species]);
+ StringCopy(gStringVar3, gMoveNames[show->secretBaseVisit.move]);
+ sTVShowState = 13;
+ break;
+ case 13:
+ TVShowDone();
+ break;
}
ShowFieldMessage(sTVSecretBaseVisitTextGroup[state]);
}
@@ -6376,56 +6015,56 @@ static void DoTVShowThePokemonBattleSeminar(void)
state = sTVShowState;
switch (state)
{
- case 0:
- TVShowConvertInternationalString(gStringVar1, show->battleSeminar.playerName, show->battleSeminar.language);
- StringCopy(gStringVar2, gSpeciesNames[show->battleSeminar.species]);
- StringCopy(gStringVar3, gSpeciesNames[show->battleSeminar.foeSpecies]);
- sTVShowState = 1;
- break;
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->battleSeminar.playerName, show->battleSeminar.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->battleSeminar.species]);
+ StringCopy(gStringVar3, gSpeciesNames[show->battleSeminar.foeSpecies]);
+ sTVShowState = 1;
+ break;
+ case 1:
+ TVShowConvertInternationalString(gStringVar1, show->battleSeminar.playerName, show->battleSeminar.language);
+ StringCopy(gStringVar2, gSpeciesNames[show->battleSeminar.foeSpecies]);
+ StringCopy(gStringVar3, gMoveNames[show->battleSeminar.move]);
+ sTVShowState = 2;
+ break;
+ case 2:
+ StringCopy(gStringVar1, gSpeciesNames[show->battleSeminar.species]);
+ switch (show->battleSeminar.nOtherMoves)
+ {
case 1:
- TVShowConvertInternationalString(gStringVar1, show->battleSeminar.playerName, show->battleSeminar.language);
- StringCopy(gStringVar2, gSpeciesNames[show->battleSeminar.foeSpecies]);
- StringCopy(gStringVar3, gMoveNames[show->battleSeminar.move]);
- sTVShowState = 2;
+ sTVShowState = 5;
break;
case 2:
- StringCopy(gStringVar1, gSpeciesNames[show->battleSeminar.species]);
- switch (show->battleSeminar.nOtherMoves)
- {
- case 1:
- sTVShowState = 5;
- break;
- case 2:
- sTVShowState = 4;
- break;
- case 3:
- sTVShowState = 3;
- break;
- default:
- sTVShowState = 6;
- break;
- }
+ sTVShowState = 4;
break;
case 3:
- StringCopy(gStringVar1, gMoveNames[show->battleSeminar.otherMoves[0]]);
- StringCopy(gStringVar2, gMoveNames[show->battleSeminar.otherMoves[1]]);
- StringCopy(gStringVar3, gMoveNames[show->battleSeminar.otherMoves[2]]);
- sTVShowState = 6;
- break;
- case 4:
- StringCopy(gStringVar1, gMoveNames[show->battleSeminar.otherMoves[0]]);
- StringCopy(gStringVar2, gMoveNames[show->battleSeminar.otherMoves[1]]);
- sTVShowState = 6;
+ sTVShowState = 3;
break;
- case 5:
- StringCopy(gStringVar2, gMoveNames[show->battleSeminar.otherMoves[0]]);
+ default:
sTVShowState = 6;
break;
- case 6:
- StringCopy(gStringVar1, gMoveNames[show->battleSeminar.betterMove]);
- StringCopy(gStringVar2, gMoveNames[show->battleSeminar.move]);
- TVShowDone();
- break;
+ }
+ break;
+ case 3:
+ StringCopy(gStringVar1, gMoveNames[show->battleSeminar.otherMoves[0]]);
+ StringCopy(gStringVar2, gMoveNames[show->battleSeminar.otherMoves[1]]);
+ StringCopy(gStringVar3, gMoveNames[show->battleSeminar.otherMoves[2]]);
+ sTVShowState = 6;
+ break;
+ case 4:
+ StringCopy(gStringVar1, gMoveNames[show->battleSeminar.otherMoves[0]]);
+ StringCopy(gStringVar2, gMoveNames[show->battleSeminar.otherMoves[1]]);
+ sTVShowState = 6;
+ break;
+ case 5:
+ StringCopy(gStringVar2, gMoveNames[show->battleSeminar.otherMoves[0]]);
+ sTVShowState = 6;
+ break;
+ case 6:
+ StringCopy(gStringVar1, gMoveNames[show->battleSeminar.betterMove]);
+ StringCopy(gStringVar2, gMoveNames[show->battleSeminar.move]);
+ TVShowDone();
+ break;
}
ShowFieldMessage(sTVThePokemonBattleSeminarTextGroup[state]);
}
@@ -6440,57 +6079,49 @@ static void DoTVShowTrainerFanClubSpecial(void)
state = sTVShowState;
switch (state)
{
- case 0:
- TVShowConvertInternationalString(gStringVar1, show->fanClubSpecial.idolName, show->fanClubSpecial.idolNameLanguage);
- TVShowConvertInternationalString(gStringVar2, show->fanClubSpecial.playerName, show->fanClubSpecial.language);
- CopyEasyChatWord(gStringVar3, show->fanClubSpecial.words[0]);
- if (show->fanClubSpecial.score >= 90)
- {
- sTVShowState = 1;
- }
- else if (show->fanClubSpecial.score >= 70)
- {
- sTVShowState = 2;
- }
- else if (show->fanClubSpecial.score >= 30)
- {
- sTVShowState = 3;
- }
- else
- {
- sTVShowState = 4;
- }
- break;
- case 1:
- TVShowConvertInternationalString(gStringVar1, show->fanClubSpecial.idolName, show->fanClubSpecial.idolNameLanguage);
- TVShowConvertInternationalString(gStringVar2, show->fanClubSpecial.playerName, show->fanClubSpecial.language);
- TV_PrintIntToStringVar(2, show->fanClubSpecial.score);
- sTVShowState = 5;
- break;
- case 2:
- TVShowConvertInternationalString(gStringVar1, show->fanClubSpecial.idolName, show->fanClubSpecial.idolNameLanguage);
- TVShowConvertInternationalString(gStringVar2, show->fanClubSpecial.playerName, show->fanClubSpecial.language);
- TV_PrintIntToStringVar(2, show->fanClubSpecial.score);
- sTVShowState = 5;
- break;
- case 3:
- TVShowConvertInternationalString(gStringVar1, show->fanClubSpecial.idolName, show->fanClubSpecial.idolNameLanguage);
- TVShowConvertInternationalString(gStringVar2, show->fanClubSpecial.playerName, show->fanClubSpecial.language);
- TV_PrintIntToStringVar(2, show->fanClubSpecial.score);
- sTVShowState = 5;
- break;
- case 4:
- TVShowConvertInternationalString(gStringVar1, show->fanClubSpecial.idolName, show->fanClubSpecial.idolNameLanguage);
- TVShowConvertInternationalString(gStringVar2, show->fanClubSpecial.playerName, show->fanClubSpecial.language);
- TV_PrintIntToStringVar(2, show->fanClubSpecial.score);
- sTVShowState = 5;
- break;
- case 5:
- TVShowConvertInternationalString(gStringVar1, show->fanClubSpecial.idolName, show->fanClubSpecial.idolNameLanguage);
- TVShowConvertInternationalString(gStringVar2, show->fanClubSpecial.playerName, show->fanClubSpecial.language);
- CopyEasyChatWord(gStringVar3, show->fanClubSpecial.words[0]);
- TVShowDone();
- break;
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->fanClubSpecial.idolName, show->fanClubSpecial.idolNameLanguage);
+ TVShowConvertInternationalString(gStringVar2, show->fanClubSpecial.playerName, show->fanClubSpecial.language);
+ CopyEasyChatWord(gStringVar3, show->fanClubSpecial.words[0]);
+ if (show->fanClubSpecial.score >= 90)
+ sTVShowState = 1;
+ else if (show->fanClubSpecial.score >= 70)
+ sTVShowState = 2;
+ else if (show->fanClubSpecial.score >= 30)
+ sTVShowState = 3;
+ else
+ sTVShowState = 4;
+ break;
+ case 1:
+ TVShowConvertInternationalString(gStringVar1, show->fanClubSpecial.idolName, show->fanClubSpecial.idolNameLanguage);
+ TVShowConvertInternationalString(gStringVar2, show->fanClubSpecial.playerName, show->fanClubSpecial.language);
+ ConvertIntToDecimalString(2, show->fanClubSpecial.score);
+ sTVShowState = 5;
+ break;
+ case 2:
+ TVShowConvertInternationalString(gStringVar1, show->fanClubSpecial.idolName, show->fanClubSpecial.idolNameLanguage);
+ TVShowConvertInternationalString(gStringVar2, show->fanClubSpecial.playerName, show->fanClubSpecial.language);
+ ConvertIntToDecimalString(2, show->fanClubSpecial.score);
+ sTVShowState = 5;
+ break;
+ case 3:
+ TVShowConvertInternationalString(gStringVar1, show->fanClubSpecial.idolName, show->fanClubSpecial.idolNameLanguage);
+ TVShowConvertInternationalString(gStringVar2, show->fanClubSpecial.playerName, show->fanClubSpecial.language);
+ ConvertIntToDecimalString(2, show->fanClubSpecial.score);
+ sTVShowState = 5;
+ break;
+ case 4:
+ TVShowConvertInternationalString(gStringVar1, show->fanClubSpecial.idolName, show->fanClubSpecial.idolNameLanguage);
+ TVShowConvertInternationalString(gStringVar2, show->fanClubSpecial.playerName, show->fanClubSpecial.language);
+ ConvertIntToDecimalString(2, show->fanClubSpecial.score);
+ sTVShowState = 5;
+ break;
+ case 5:
+ TVShowConvertInternationalString(gStringVar1, show->fanClubSpecial.idolName, show->fanClubSpecial.idolNameLanguage);
+ TVShowConvertInternationalString(gStringVar2, show->fanClubSpecial.playerName, show->fanClubSpecial.language);
+ CopyEasyChatWord(gStringVar3, show->fanClubSpecial.words[0]);
+ TVShowDone();
+ break;
}
ShowFieldMessage(sTVTrainerFanClubSpecialTextGroup[state]);
}
@@ -6506,78 +6137,79 @@ static void DoTVShowTrainerFanClub(void)
state = sTVShowState;
switch (state)
{
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->trainerFanClub.playerName, show->trainerFanClub.language);
+ playerId = ((show->common.trainerIdHi << 8) + show->common.trainerIdLo);
+ switch (playerId % 10)
+ {
case 0:
- TVShowConvertInternationalString(gStringVar1, show->trainerFanClub.playerName, show->trainerFanClub.language);
- playerId = ((show->common.trainerIdHi << 8) + show->common.trainerIdLo);
- switch (playerId % 10)
- {
- case 0:
- sTVShowState = 1;
- break;
- case 1:
- sTVShowState = 2;
- break;
- case 2:
- sTVShowState = 3;
- break;
- case 3:
- sTVShowState = 4;
- break;
- case 4:
- sTVShowState = 5;
- break;
- case 5:
- sTVShowState = 6;
- break;
- case 6:
- sTVShowState = 7;
- break;
- case 7:
- sTVShowState = 8;
- break;
- case 8:
- sTVShowState = 9;
- break;
- case 9:
- sTVShowState = 10;
- break;
- }
+ sTVShowState = 1;
break;
case 1:
- sTVShowState = 11;
+ sTVShowState = 2;
break;
case 2:
- sTVShowState = 11;
+ sTVShowState = 3;
break;
case 3:
- sTVShowState = 11;
+ sTVShowState = 4;
break;
case 4:
- sTVShowState = 11;
+ sTVShowState = 5;
break;
case 5:
- sTVShowState = 11;
+ sTVShowState = 6;
break;
case 6:
- sTVShowState = 11;
+ sTVShowState = 7;
break;
case 7:
- sTVShowState = 11;
+ sTVShowState = 8;
break;
case 8:
- sTVShowState = 11;
+ sTVShowState = 9;
break;
case 9:
- sTVShowState = 11;
- break;
- case 10:
- sTVShowState = 11;
+ sTVShowState = 10;
break;
- case 11:
- TVShowConvertInternationalString(gStringVar1, show->trainerFanClub.playerName, show->trainerFanClub.language);
- CopyEasyChatWord(gStringVar2, show->trainerFanClub.words[0]);
- CopyEasyChatWord(gStringVar3, show->trainerFanClub.words[1]);
- TVShowDone();
+ }
+ break;
+ case 1:
+ sTVShowState = 11;
+ break;
+ case 2:
+ sTVShowState = 11;
+ break;
+ case 3:
+ sTVShowState = 11;
+ break;
+ case 4:
+ sTVShowState = 11;
+ break;
+ case 5:
+ sTVShowState = 11;
+ break;
+ case 6:
+ sTVShowState = 11;
+ break;
+ case 7:
+ sTVShowState = 11;
+ break;
+ case 8:
+ sTVShowState = 11;
+ break;
+ case 9:
+ sTVShowState = 11;
+ break;
+ case 10:
+ sTVShowState = 11;
+ break;
+ case 11:
+ TVShowConvertInternationalString(gStringVar1, show->trainerFanClub.playerName, show->trainerFanClub.language);
+ CopyEasyChatWord(gStringVar2, show->trainerFanClub.words[0]);
+ CopyEasyChatWord(gStringVar3, show->trainerFanClub.words[1]);
+ TVShowDone();
+ break;
}
ShowFieldMessage(sTVTrainerFanClubTextGroup[state]);
}
@@ -6595,95 +6227,95 @@ static void DoTVShowSpotTheCuties(void)
state = sTVShowState;
switch (state)
{
- case SPOTCUTIES_STATE_INTRO:
- TVShowConvertInternationalString(gStringVar1, show->cuties.playerName, show->cuties.language);
- TVShowConvertInternationalString(gStringVar2, show->cuties.nickname, show->cuties.pokemonNameLanguage);
+ case SPOTCUTIES_STATE_INTRO:
+ TVShowConvertInternationalString(gStringVar1, show->cuties.playerName, show->cuties.language);
+ TVShowConvertInternationalString(gStringVar2, show->cuties.nickname, show->cuties.pokemonNameLanguage);
- // Comments following the intro depend on how many ribbons the pokemon has
- if (show->cuties.nRibbons < 10)
- sTVShowState = SPOTCUTIES_STATE_RIBBONS_LOW;
- else if (show->cuties.nRibbons < 20)
- sTVShowState = SPOTCUTIES_STATE_RIBBONS_MID;
- else
- sTVShowState = SPOTCUTIES_STATE_RIBBONS_HIGH;
- break;
- case SPOTCUTIES_STATE_RIBBONS_LOW:
- case SPOTCUTIES_STATE_RIBBONS_MID:
- case SPOTCUTIES_STATE_RIBBONS_HIGH:
- TVShowConvertInternationalString(gStringVar1, show->cuties.playerName, show->cuties.language);
- TVShowConvertInternationalString(gStringVar2, show->cuties.nickname, show->cuties.pokemonNameLanguage);
- TV_PrintIntToStringVar(2, show->cuties.nRibbons);
- sTVShowState = SPOTCUTIES_STATE_RIBBON_INTRO;
- break;
- case SPOTCUTIES_STATE_RIBBON_INTRO:
- TVShowConvertInternationalString(gStringVar2, show->cuties.nickname, show->cuties.pokemonNameLanguage);
- switch (show->cuties.selectedRibbon)
- {
- case CHAMPION_RIBBON:
- sTVShowState = SPOTCUTIES_STATE_RIBBON_CHAMPION;
- break;
- case COOL_RIBBON_NORMAL:
- case COOL_RIBBON_SUPER:
- case COOL_RIBBON_HYPER:
- case COOL_RIBBON_MASTER:
- sTVShowState = SPOTCUTIES_STATE_RIBBON_COOL;
- break;
- case BEAUTY_RIBBON_NORMAL:
- case BEAUTY_RIBBON_SUPER:
- case BEAUTY_RIBBON_HYPER:
- case BEAUTY_RIBBON_MASTER:
- sTVShowState = SPOTCUTIES_STATE_RIBBON_BEAUTY;
- break;
- case CUTE_RIBBON_NORMAL:
- case CUTE_RIBBON_SUPER:
- case CUTE_RIBBON_HYPER:
- case CUTE_RIBBON_MASTER:
- sTVShowState = SPOTCUTIES_STATE_RIBBON_CUTE;
- break;
- case SMART_RIBBON_NORMAL:
- case SMART_RIBBON_SUPER:
- case SMART_RIBBON_HYPER:
- case SMART_RIBBON_MASTER:
- sTVShowState = SPOTCUTIES_STATE_RIBBON_SMART;
- break;
- case TOUGH_RIBBON_NORMAL:
- case TOUGH_RIBBON_SUPER:
- case TOUGH_RIBBON_HYPER:
- case TOUGH_RIBBON_MASTER:
- sTVShowState = SPOTCUTIES_STATE_RIBBON_TOUGH;
- break;
- case WINNING_RIBBON:
- sTVShowState = SPOTCUTIES_STATE_RIBBON_WINNING;
- break;
- case VICTORY_RIBBON:
- sTVShowState = SPOTCUTIES_STATE_RIBBON_VICTORY;
- break;
- case ARTIST_RIBBON:
- sTVShowState = SPOTCUTIES_STATE_RIBBON_ARTIST;
- break;
- case EFFORT_RIBBON:
- sTVShowState = SPOTCUTIES_STATE_RIBBON_EFFORT;
- break;
- // No comment is made for any of the gift ribbons.
- // If the show is created for a gift ribbon
- // then this state will repeat indefinitely
- }
- break;
- case SPOTCUTIES_STATE_RIBBON_CHAMPION:
- case SPOTCUTIES_STATE_RIBBON_COOL:
- case SPOTCUTIES_STATE_RIBBON_BEAUTY:
- case SPOTCUTIES_STATE_RIBBON_CUTE:
- case SPOTCUTIES_STATE_RIBBON_SMART:
- case SPOTCUTIES_STATE_RIBBON_TOUGH:
- case SPOTCUTIES_STATE_RIBBON_WINNING:
- case SPOTCUTIES_STATE_RIBBON_VICTORY:
- case SPOTCUTIES_STATE_RIBBON_ARTIST:
- case SPOTCUTIES_STATE_RIBBON_EFFORT:
- TVShowConvertInternationalString(gStringVar2, show->cuties.nickname, show->cuties.pokemonNameLanguage);
- sTVShowState = SPOTCUTIES_STATE_OUTRO;
- break;
- case SPOTCUTIES_STATE_OUTRO:
- TVShowDone();
+ // Comments following the intro depend on how many ribbons the pokemon has
+ if (show->cuties.nRibbons < 10)
+ sTVShowState = SPOTCUTIES_STATE_RIBBONS_LOW;
+ else if (show->cuties.nRibbons < 20)
+ sTVShowState = SPOTCUTIES_STATE_RIBBONS_MID;
+ else
+ sTVShowState = SPOTCUTIES_STATE_RIBBONS_HIGH;
+ break;
+ case SPOTCUTIES_STATE_RIBBONS_LOW:
+ case SPOTCUTIES_STATE_RIBBONS_MID:
+ case SPOTCUTIES_STATE_RIBBONS_HIGH:
+ TVShowConvertInternationalString(gStringVar1, show->cuties.playerName, show->cuties.language);
+ TVShowConvertInternationalString(gStringVar2, show->cuties.nickname, show->cuties.pokemonNameLanguage);
+ ConvertIntToDecimalString(2, show->cuties.nRibbons);
+ sTVShowState = SPOTCUTIES_STATE_RIBBON_INTRO;
+ break;
+ case SPOTCUTIES_STATE_RIBBON_INTRO:
+ TVShowConvertInternationalString(gStringVar2, show->cuties.nickname, show->cuties.pokemonNameLanguage);
+ switch (show->cuties.selectedRibbon)
+ {
+ case CHAMPION_RIBBON:
+ sTVShowState = SPOTCUTIES_STATE_RIBBON_CHAMPION;
+ break;
+ case COOL_RIBBON_NORMAL:
+ case COOL_RIBBON_SUPER:
+ case COOL_RIBBON_HYPER:
+ case COOL_RIBBON_MASTER:
+ sTVShowState = SPOTCUTIES_STATE_RIBBON_COOL;
+ break;
+ case BEAUTY_RIBBON_NORMAL:
+ case BEAUTY_RIBBON_SUPER:
+ case BEAUTY_RIBBON_HYPER:
+ case BEAUTY_RIBBON_MASTER:
+ sTVShowState = SPOTCUTIES_STATE_RIBBON_BEAUTY;
+ break;
+ case CUTE_RIBBON_NORMAL:
+ case CUTE_RIBBON_SUPER:
+ case CUTE_RIBBON_HYPER:
+ case CUTE_RIBBON_MASTER:
+ sTVShowState = SPOTCUTIES_STATE_RIBBON_CUTE;
+ break;
+ case SMART_RIBBON_NORMAL:
+ case SMART_RIBBON_SUPER:
+ case SMART_RIBBON_HYPER:
+ case SMART_RIBBON_MASTER:
+ sTVShowState = SPOTCUTIES_STATE_RIBBON_SMART;
+ break;
+ case TOUGH_RIBBON_NORMAL:
+ case TOUGH_RIBBON_SUPER:
+ case TOUGH_RIBBON_HYPER:
+ case TOUGH_RIBBON_MASTER:
+ sTVShowState = SPOTCUTIES_STATE_RIBBON_TOUGH;
+ break;
+ case WINNING_RIBBON:
+ sTVShowState = SPOTCUTIES_STATE_RIBBON_WINNING;
+ break;
+ case VICTORY_RIBBON:
+ sTVShowState = SPOTCUTIES_STATE_RIBBON_VICTORY;
+ break;
+ case ARTIST_RIBBON:
+ sTVShowState = SPOTCUTIES_STATE_RIBBON_ARTIST;
+ break;
+ case EFFORT_RIBBON:
+ sTVShowState = SPOTCUTIES_STATE_RIBBON_EFFORT;
+ break;
+ // No comment is made for any of the gift ribbons.
+ // If the show is created for a gift ribbon
+ // then this state will repeat indefinitely
+ }
+ break;
+ case SPOTCUTIES_STATE_RIBBON_CHAMPION:
+ case SPOTCUTIES_STATE_RIBBON_COOL:
+ case SPOTCUTIES_STATE_RIBBON_BEAUTY:
+ case SPOTCUTIES_STATE_RIBBON_CUTE:
+ case SPOTCUTIES_STATE_RIBBON_SMART:
+ case SPOTCUTIES_STATE_RIBBON_TOUGH:
+ case SPOTCUTIES_STATE_RIBBON_WINNING:
+ case SPOTCUTIES_STATE_RIBBON_VICTORY:
+ case SPOTCUTIES_STATE_RIBBON_ARTIST:
+ case SPOTCUTIES_STATE_RIBBON_EFFORT:
+ TVShowConvertInternationalString(gStringVar2, show->cuties.nickname, show->cuties.pokemonNameLanguage);
+ sTVShowState = SPOTCUTIES_STATE_OUTRO;
+ break;
+ case SPOTCUTIES_STATE_OUTRO:
+ TVShowDone();
}
ShowFieldMessage(sTVCutiesTextGroup[state]);
}
@@ -6698,140 +6330,140 @@ static void DoTVShowPokemonNewsBattleFrontier(void)
state = sTVShowState;
switch (state)
{
- case 0:
- switch (show->frontier.facility)
- {
- case 1:
- sTVShowState = 1;
- break;
- case 2:
- sTVShowState = 2;
- break;
- case 3:
- sTVShowState = 3;
- break;
- case 4:
- sTVShowState = 4;
- break;
- case 5:
- sTVShowState = 5;
- break;
- case 6:
- sTVShowState = 6;
- break;
- case 7:
- sTVShowState = 7;
- break;
- case 8:
- sTVShowState = 8;
- break;
- case 9:
- sTVShowState = 9;
- break;
- case 10:
- sTVShowState = 10;
- break;
- case 11:
- sTVShowState = 11;
- break;
- case 12:
- sTVShowState = 12;
- break;
- case 13:
- sTVShowState = 13;
- break;
- }
- break;
+ case 0:
+ switch (show->frontier.facilityAndMode)
+ {
case 1:
- TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
- TV_PrintIntToStringVar(1, show->frontier.winStreak);
- sTVShowState = 14;
+ sTVShowState = 1;
break;
case 2:
- TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
- TV_PrintIntToStringVar(1, show->frontier.winStreak);
- sTVShowState = 16;
+ sTVShowState = 2;
break;
case 3:
- TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
- TV_PrintIntToStringVar(1, show->frontier.winStreak);
- sTVShowState = 15;
+ sTVShowState = 3;
break;
case 4:
- TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
- TV_PrintIntToStringVar(1, show->frontier.winStreak);
- sTVShowState = 15;
+ sTVShowState = 4;
break;
case 5:
- TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
- TV_PrintIntToStringVar(1, show->frontier.winStreak);
- sTVShowState = 14;
+ sTVShowState = 5;
break;
case 6:
- TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
- TV_PrintIntToStringVar(1, show->frontier.winStreak);
- sTVShowState = 14;
+ sTVShowState = 6;
break;
case 7:
- TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
- TV_PrintIntToStringVar(1, show->frontier.winStreak);
- sTVShowState = 14;
+ sTVShowState = 7;
break;
case 8:
- TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
- TV_PrintIntToStringVar(1, show->frontier.winStreak);
- sTVShowState = 14;
+ sTVShowState = 8;
break;
case 9:
- TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
- TV_PrintIntToStringVar(1, show->frontier.winStreak);
- sTVShowState = 14;
+ sTVShowState = 9;
break;
case 10:
- TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
- TV_PrintIntToStringVar(1, show->frontier.winStreak);
- sTVShowState = 14;
+ sTVShowState = 10;
break;
case 11:
- TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
- TV_PrintIntToStringVar(1, show->frontier.winStreak);
- sTVShowState = 14;
+ sTVShowState = 11;
break;
case 12:
- TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
- TV_PrintIntToStringVar(1, show->frontier.winStreak);
- sTVShowState = 14;
+ sTVShowState = 12;
break;
case 13:
- TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
- TV_PrintIntToStringVar(1, show->frontier.winStreak);
- sTVShowState = 14;
- break;
- case 14:
- StringCopy(gStringVar1, gSpeciesNames[show->frontier.species1]);
- StringCopy(gStringVar2, gSpeciesNames[show->frontier.species2]);
- StringCopy(gStringVar3, gSpeciesNames[show->frontier.species3]);
- sTVShowState = 18;
- break;
- case 15:
- StringCopy(gStringVar1, gSpeciesNames[show->frontier.species1]);
- StringCopy(gStringVar2, gSpeciesNames[show->frontier.species2]);
- sTVShowState = 18;
- break;
- case 16:
- StringCopy(gStringVar1, gSpeciesNames[show->frontier.species1]);
- StringCopy(gStringVar2, gSpeciesNames[show->frontier.species2]);
- StringCopy(gStringVar3, gSpeciesNames[show->frontier.species3]);
- sTVShowState = 17;
- break;
- case 17:
- StringCopy(gStringVar1, gSpeciesNames[show->frontier.species4]);
- sTVShowState = 18;
- break;
- case 18:
- TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
- TVShowDone();
+ sTVShowState = 13;
break;
+ }
+ break;
+ case 1:
+ TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
+ ConvertIntToDecimalString(1, show->frontier.winStreak);
+ sTVShowState = 14;
+ break;
+ case 2:
+ TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
+ ConvertIntToDecimalString(1, show->frontier.winStreak);
+ sTVShowState = 16;
+ break;
+ case 3:
+ TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
+ ConvertIntToDecimalString(1, show->frontier.winStreak);
+ sTVShowState = 15;
+ break;
+ case 4:
+ TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
+ ConvertIntToDecimalString(1, show->frontier.winStreak);
+ sTVShowState = 15;
+ break;
+ case 5:
+ TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
+ ConvertIntToDecimalString(1, show->frontier.winStreak);
+ sTVShowState = 14;
+ break;
+ case 6:
+ TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
+ ConvertIntToDecimalString(1, show->frontier.winStreak);
+ sTVShowState = 14;
+ break;
+ case 7:
+ TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
+ ConvertIntToDecimalString(1, show->frontier.winStreak);
+ sTVShowState = 14;
+ break;
+ case 8:
+ TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
+ ConvertIntToDecimalString(1, show->frontier.winStreak);
+ sTVShowState = 14;
+ break;
+ case 9:
+ TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
+ ConvertIntToDecimalString(1, show->frontier.winStreak);
+ sTVShowState = 14;
+ break;
+ case 10:
+ TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
+ ConvertIntToDecimalString(1, show->frontier.winStreak);
+ sTVShowState = 14;
+ break;
+ case 11:
+ TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
+ ConvertIntToDecimalString(1, show->frontier.winStreak);
+ sTVShowState = 14;
+ break;
+ case 12:
+ TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
+ ConvertIntToDecimalString(1, show->frontier.winStreak);
+ sTVShowState = 14;
+ break;
+ case 13:
+ TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
+ ConvertIntToDecimalString(1, show->frontier.winStreak);
+ sTVShowState = 14;
+ break;
+ case 14:
+ StringCopy(gStringVar1, gSpeciesNames[show->frontier.species1]);
+ StringCopy(gStringVar2, gSpeciesNames[show->frontier.species2]);
+ StringCopy(gStringVar3, gSpeciesNames[show->frontier.species3]);
+ sTVShowState = 18;
+ break;
+ case 15:
+ StringCopy(gStringVar1, gSpeciesNames[show->frontier.species1]);
+ StringCopy(gStringVar2, gSpeciesNames[show->frontier.species2]);
+ sTVShowState = 18;
+ break;
+ case 16:
+ StringCopy(gStringVar1, gSpeciesNames[show->frontier.species1]);
+ StringCopy(gStringVar2, gSpeciesNames[show->frontier.species2]);
+ StringCopy(gStringVar3, gSpeciesNames[show->frontier.species3]);
+ sTVShowState = 17;
+ break;
+ case 17:
+ StringCopy(gStringVar1, gSpeciesNames[show->frontier.species4]);
+ sTVShowState = 18;
+ break;
+ case 18:
+ TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language);
+ TVShowDone();
+ break;
}
ShowFieldMessage(sTVPokemonNewsBattleFrontierTextGroup[state]);
}
@@ -6846,72 +6478,72 @@ static void DoTVShowWhatsNo1InHoennToday(void)
state = sTVShowState;
switch (state)
{
+ case 0:
+ TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language);
+ switch (show->numberOne.actionIdx)
+ {
case 0:
- TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language);
- switch (show->numberOne.actionIdx)
- {
- case 0:
- sTVShowState = 1;
- break;
- case 1:
- sTVShowState = 2;
- break;
- case 2:
- sTVShowState = 3;
- break;
- case 3:
- sTVShowState = 4;
- break;
- case 4:
- sTVShowState = 5;
- break;
- case 5:
- sTVShowState = 6;
- break;
- case 6:
- sTVShowState = 7;
- break;
- }
+ sTVShowState = 1;
break;
case 1:
- TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language);
- TV_PrintIntToStringVar(1, show->numberOne.count);
- sTVShowState = 8;
+ sTVShowState = 2;
break;
case 2:
- TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language);
- TV_PrintIntToStringVar(1, show->numberOne.count);
- sTVShowState = 8;
+ sTVShowState = 3;
break;
case 3:
- TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language);
- TV_PrintIntToStringVar(1, show->numberOne.count);
- sTVShowState = 8;
+ sTVShowState = 4;
break;
case 4:
- TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language);
- TV_PrintIntToStringVar(1, show->numberOne.count);
- sTVShowState = 8;
+ sTVShowState = 5;
break;
case 5:
- TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language);
- TV_PrintIntToStringVar(1, show->numberOne.count);
- sTVShowState = 8;
+ sTVShowState = 6;
break;
case 6:
- TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language);
- TV_PrintIntToStringVar(1, show->numberOne.count);
- sTVShowState = 8;
- break;
- case 7:
- TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language);
- TV_PrintIntToStringVar(1, show->numberOne.count);
- sTVShowState = 8;
- break;
- case 8:
- TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language);
- TVShowDone();
+ sTVShowState = 7;
break;
+ }
+ break;
+ case 1:
+ TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language);
+ ConvertIntToDecimalString(1, show->numberOne.count);
+ sTVShowState = 8;
+ break;
+ case 2:
+ TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language);
+ ConvertIntToDecimalString(1, show->numberOne.count);
+ sTVShowState = 8;
+ break;
+ case 3:
+ TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language);
+ ConvertIntToDecimalString(1, show->numberOne.count);
+ sTVShowState = 8;
+ break;
+ case 4:
+ TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language);
+ ConvertIntToDecimalString(1, show->numberOne.count);
+ sTVShowState = 8;
+ break;
+ case 5:
+ TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language);
+ ConvertIntToDecimalString(1, show->numberOne.count);
+ sTVShowState = 8;
+ break;
+ case 6:
+ TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language);
+ ConvertIntToDecimalString(1, show->numberOne.count);
+ sTVShowState = 8;
+ break;
+ case 7:
+ TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language);
+ ConvertIntToDecimalString(1, show->numberOne.count);
+ sTVShowState = 8;
+ break;
+ case 8:
+ TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language);
+ TVShowDone();
+ break;
}
ShowFieldMessage(sTVWhatsNo1InHoennTodayTextGroup[state]);
}
@@ -6921,7 +6553,7 @@ u8 SecretBaseSecrets_GetNumActionsTaken(TVShow *show)
u8 i;
u8 flagsSet;
- for (i = 0, flagsSet = 0; i < NUM_SECRET_BASE_FLAGS; i ++)
+ for (i = 0, flagsSet = 0; i < NUM_SECRET_BASE_FLAGS; i++)
{
if ((show->secretBaseSecrets.flags >> i) & 1)
flagsSet++;
@@ -6934,7 +6566,7 @@ static u8 SecretBaseSecrets_GetStateByFlagNumber(TVShow *show, u8 flagId)
u8 i;
u8 flagsSet;
- for (i = 0, flagsSet = 0; i < NUM_SECRET_BASE_FLAGS; i ++)
+ for (i = 0, flagsSet = 0; i < NUM_SECRET_BASE_FLAGS; i++)
{
if ((show->secretBaseSecrets.flags >> i) & 1)
{
@@ -6959,130 +6591,112 @@ static void DoTVShowSecretBaseSecrets(void)
state = sTVShowState;
switch (state)
{
- case SBSECRETS_STATE_INTRO:
- TVShowConvertInternationalString(gStringVar1, show->secretBaseSecrets.baseOwnersName, show->secretBaseSecrets.baseOwnersNameLanguage);
- TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language);
- numActions = SecretBaseSecrets_GetNumActionsTaken(show);
- if (numActions == 0)
- {
- sTVShowState = SBSECRETS_STATE_NOTHING_USED1;
- }
- else
- {
- show->secretBaseSecrets.savedState = SBSECRETS_STATE_DO_NEXT1;
- sTVSecretBaseSecretsRandomValues[0] = Random() % numActions;
- sTVShowState = SecretBaseSecrets_GetStateByFlagNumber(show, sTVSecretBaseSecretsRandomValues[0]);
- }
- break;
- case SBSECRETS_STATE_DO_NEXT1:
- TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language);
- numActions = SecretBaseSecrets_GetNumActionsTaken(show);
- switch (numActions)
- {
- case 1:
- sTVShowState = SBSECRETS_STATE_NOTHING_USED2;
- break;
- case 2:
- show->secretBaseSecrets.savedState = SBSECRETS_STATE_DO_NEXT2;
- if (sTVSecretBaseSecretsRandomValues[0] == 0)
- {
- sTVShowState = SecretBaseSecrets_GetStateByFlagNumber(show, 1);
- }
- else
- {
- sTVShowState = SecretBaseSecrets_GetStateByFlagNumber(show, 0);
- }
- break;
- default:
- for (i = 0; i < 0xFFFF; i ++)
- {
- sTVSecretBaseSecretsRandomValues[1] = Random() % numActions;
- if (sTVSecretBaseSecretsRandomValues[1] != sTVSecretBaseSecretsRandomValues[0])
- {
- break;
- }
- }
- show->secretBaseSecrets.savedState = SBSECRETS_STATE_DO_NEXT2;
- sTVShowState = SecretBaseSecrets_GetStateByFlagNumber(show, sTVSecretBaseSecretsRandomValues[1]);
- break;
- }
+ case SBSECRETS_STATE_INTRO:
+ TVShowConvertInternationalString(gStringVar1, show->secretBaseSecrets.baseOwnersName, show->secretBaseSecrets.baseOwnersNameLanguage);
+ TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language);
+ numActions = SecretBaseSecrets_GetNumActionsTaken(show);
+ if (numActions == 0)
+ {
+ sTVShowState = SBSECRETS_STATE_NOTHING_USED1;
+ }
+ else
+ {
+ show->secretBaseSecrets.savedState = SBSECRETS_STATE_DO_NEXT1;
+ sTVSecretBaseSecretsRandomValues[0] = Random() % numActions;
+ sTVShowState = SecretBaseSecrets_GetStateByFlagNumber(show, sTVSecretBaseSecretsRandomValues[0]);
+ }
+ break;
+ case SBSECRETS_STATE_DO_NEXT1:
+ TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language);
+ numActions = SecretBaseSecrets_GetNumActionsTaken(show);
+ switch (numActions)
+ {
+ case 1:
+ sTVShowState = SBSECRETS_STATE_NOTHING_USED2;
break;
- case SBSECRETS_STATE_DO_NEXT2:
- TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language);
- numActions = SecretBaseSecrets_GetNumActionsTaken(show);
- if (numActions == 2)
- {
- sTVShowState = SBSECRETS_STATE_NOTHING_USED2;
- }
+ case 2:
+ show->secretBaseSecrets.savedState = SBSECRETS_STATE_DO_NEXT2;
+ if (sTVSecretBaseSecretsRandomValues[0] == 0)
+ sTVShowState = SecretBaseSecrets_GetStateByFlagNumber(show, 1);
else
- {
- for (i = 0; i < 0xFFFF; i ++)
- {
- sTVSecretBaseSecretsRandomValues[2] = Random() % numActions;
- if (sTVSecretBaseSecretsRandomValues[2] != sTVSecretBaseSecretsRandomValues[0] && sTVSecretBaseSecretsRandomValues[2] != sTVSecretBaseSecretsRandomValues[1])
- {
- break;
- }
- }
- show->secretBaseSecrets.savedState = SBSECRETS_STATE_TOOK_X_STEPS;
- sTVShowState = SecretBaseSecrets_GetStateByFlagNumber(show, sTVSecretBaseSecretsRandomValues[2]);
- }
+ sTVShowState = SecretBaseSecrets_GetStateByFlagNumber(show, 0);
break;
- case SBSECRETS_STATE_TOOK_X_STEPS:
- TVShowConvertInternationalString(gStringVar1, show->secretBaseSecrets.baseOwnersName, show->secretBaseSecrets.baseOwnersNameLanguage);
- TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language);
- TV_PrintIntToStringVar(2, show->secretBaseSecrets.stepsInBase);
- if (show->secretBaseSecrets.stepsInBase <= 30)
- {
- sTVShowState = SBSECRETS_STATE_BASE_INTEREST_LOW;
- }
- else if (show->secretBaseSecrets.stepsInBase <= 100)
- {
- sTVShowState = SBSECRETS_STATE_BASE_INTEREST_MED;
- }
- else
+ default:
+ for (i = 0; i < 0xFFFF; i++)
{
- sTVShowState = SBSECRETS_STATE_BASE_INTEREST_HIGH;
+ sTVSecretBaseSecretsRandomValues[1] = Random() % numActions;
+ if (sTVSecretBaseSecretsRandomValues[1] != sTVSecretBaseSecretsRandomValues[0])
+ break;
}
+ show->secretBaseSecrets.savedState = SBSECRETS_STATE_DO_NEXT2;
+ sTVShowState = SecretBaseSecrets_GetStateByFlagNumber(show, sTVSecretBaseSecretsRandomValues[1]);
break;
- case SBSECRETS_STATE_BASE_INTEREST_LOW ... SBSECRETS_STATE_BASE_INTEREST_HIGH:
- TVShowConvertInternationalString(gStringVar1, show->secretBaseSecrets.baseOwnersName, show->secretBaseSecrets.baseOwnersNameLanguage);
- TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language);
- sTVShowState = SBSECRETS_STATE_OUTRO;
- break;
- case SBSECRETS_STATE_OUTRO:
- TVShowConvertInternationalString(gStringVar1, show->secretBaseSecrets.baseOwnersName, show->secretBaseSecrets.baseOwnersNameLanguage);
- TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language);
- TVShowDone();
- break;
- // All below states are descriptions of what the player interacted with while in the secret base
- case SBSECRETS_STATE_NOTHING_USED1:
- sTVShowState = SBSECRETS_STATE_TOOK_X_STEPS;
- break;
- case SBSECRETS_STATE_NOTHING_USED2:
- sTVShowState = SBSECRETS_STATE_TOOK_X_STEPS;
- break;
- case SBSECRETS_STATE_USED_CHAIR ... SBSECRETS_STATE_USED_MUD_BALL:
- sTVShowState = show->secretBaseSecrets.savedState;
- break;
- case SBSECRETS_STATE_USED_BAG:
- StringCopy(gStringVar2, ItemId_GetName(show->secretBaseSecrets.item));
- sTVShowState = show->secretBaseSecrets.savedState;
- break;
- case SBSECRETS_STATE_USED_CUSHION:
- // Randomly decide based on trainer ID if the player hugged or hit the cushion
- if (show->common.trainerIdLo & 1)
- {
- sTVShowState = SBSECRETS_STATE_HUGGED_CUSHION;
- }
- else
+ }
+ break;
+ case SBSECRETS_STATE_DO_NEXT2:
+ TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language);
+ numActions = SecretBaseSecrets_GetNumActionsTaken(show);
+ if (numActions == 2)
+ {
+ sTVShowState = SBSECRETS_STATE_NOTHING_USED2;
+ }
+ else
+ {
+ for (i = 0; i < 0xFFFF; i++)
{
- sTVShowState = SBSECRETS_STATE_HIT_CUSHION;
+ sTVSecretBaseSecretsRandomValues[2] = Random() % numActions;
+ if (sTVSecretBaseSecretsRandomValues[2] != sTVSecretBaseSecretsRandomValues[0] && sTVSecretBaseSecretsRandomValues[2] != sTVSecretBaseSecretsRandomValues[1])
+ break;
}
- break;
- case SBSECRETS_STATE_HIT_CUSHION ... SBSECRETS_NUM_STATES:
- sTVShowState = show->secretBaseSecrets.savedState;
- break;
+ show->secretBaseSecrets.savedState = SBSECRETS_STATE_TOOK_X_STEPS;
+ sTVShowState = SecretBaseSecrets_GetStateByFlagNumber(show, sTVSecretBaseSecretsRandomValues[2]);
+ }
+ break;
+ case SBSECRETS_STATE_TOOK_X_STEPS:
+ TVShowConvertInternationalString(gStringVar1, show->secretBaseSecrets.baseOwnersName, show->secretBaseSecrets.baseOwnersNameLanguage);
+ TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language);
+ ConvertIntToDecimalString(2, show->secretBaseSecrets.stepsInBase);
+ if (show->secretBaseSecrets.stepsInBase <= 30)
+ sTVShowState = SBSECRETS_STATE_BASE_INTEREST_LOW;
+ else if (show->secretBaseSecrets.stepsInBase <= 100)
+ sTVShowState = SBSECRETS_STATE_BASE_INTEREST_MED;
+ else
+ sTVShowState = SBSECRETS_STATE_BASE_INTEREST_HIGH;
+ break;
+ case SBSECRETS_STATE_BASE_INTEREST_LOW ... SBSECRETS_STATE_BASE_INTEREST_HIGH:
+ TVShowConvertInternationalString(gStringVar1, show->secretBaseSecrets.baseOwnersName, show->secretBaseSecrets.baseOwnersNameLanguage);
+ TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language);
+ sTVShowState = SBSECRETS_STATE_OUTRO;
+ break;
+ case SBSECRETS_STATE_OUTRO:
+ TVShowConvertInternationalString(gStringVar1, show->secretBaseSecrets.baseOwnersName, show->secretBaseSecrets.baseOwnersNameLanguage);
+ TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language);
+ TVShowDone();
+ break;
+ // All below states are descriptions of what the player interacted with while in the secret base
+ case SBSECRETS_STATE_NOTHING_USED1:
+ sTVShowState = SBSECRETS_STATE_TOOK_X_STEPS;
+ break;
+ case SBSECRETS_STATE_NOTHING_USED2:
+ sTVShowState = SBSECRETS_STATE_TOOK_X_STEPS;
+ break;
+ case SBSECRETS_STATE_USED_CHAIR ... SBSECRETS_STATE_USED_MUD_BALL:
+ sTVShowState = show->secretBaseSecrets.savedState;
+ break;
+ case SBSECRETS_STATE_USED_BAG:
+ StringCopy(gStringVar2, ItemId_GetName(show->secretBaseSecrets.item));
+ sTVShowState = show->secretBaseSecrets.savedState;
+ break;
+ case SBSECRETS_STATE_USED_CUSHION:
+ // Randomly decide based on trainer ID if the player hugged or hit the cushion
+ if (show->common.trainerIdLo & 1)
+ sTVShowState = SBSECRETS_STATE_HUGGED_CUSHION;
+ else
+ sTVShowState = SBSECRETS_STATE_HIT_CUSHION;
+ break;
+ case SBSECRETS_STATE_HIT_CUSHION ... SBSECRETS_NUM_STATES:
+ sTVShowState = show->secretBaseSecrets.savedState;
+ break;
}
ShowFieldMessage(sTVSecretBaseSecretsTextGroup[state]);
}
@@ -7097,79 +6711,62 @@ static void DoTVShowSafariFanClub(void)
state = sTVShowState;
switch (state)
{
- case 0:
- if (show->safariFanClub.nMonsCaught == 0)
- {
- sTVShowState = 6;
- }
- else if (show->safariFanClub.nMonsCaught < 4)
- {
- sTVShowState = 5;
- }
- else
- {
- sTVShowState = 1;
- }
- break;
- case 1:
- TVShowConvertInternationalString(gStringVar1, show->safariFanClub.playerName, show->safariFanClub.language);
- TV_PrintIntToStringVar(1, show->safariFanClub.nMonsCaught);
- if (show->safariFanClub.nPkblkUsed == 0)
- {
- sTVShowState = 3;
- }
- else
- {
- sTVShowState = 2;
- }
- break;
- case 2:
- TV_PrintIntToStringVar(1, show->safariFanClub.nPkblkUsed);
- sTVShowState = 4;
- break;
- case 3:
- sTVShowState = 4;
- break;
- case 4:
- TVShowConvertInternationalString(gStringVar1, show->safariFanClub.playerName, show->safariFanClub.language);
- sTVShowState = 10;
- break;
- case 5:
- TVShowConvertInternationalString(gStringVar1, show->safariFanClub.playerName, show->safariFanClub.language);
- TV_PrintIntToStringVar(1, show->safariFanClub.nMonsCaught);
- if (show->safariFanClub.nPkblkUsed == 0)
- {
- sTVShowState = 8;
- }
- else
- {
- sTVShowState = 7;
- }
- break;
- case 6:
- TVShowConvertInternationalString(gStringVar1, show->safariFanClub.playerName, show->safariFanClub.language);
- if (show->safariFanClub.nPkblkUsed == 0)
- {
- sTVShowState = 8;
- }
- else
- {
- sTVShowState = 7;
- }
- break;
- case 7:
- TV_PrintIntToStringVar(1, show->safariFanClub.nPkblkUsed);
- sTVShowState = 9;
- break;
- case 8:
- sTVShowState = 9;
- break;
- case 9:
- TVShowConvertInternationalString(gStringVar1, show->safariFanClub.playerName, show->safariFanClub.language);
- sTVShowState = 10;
- break;
- case 10:
- TVShowDone();
+ case 0:
+ if (show->safariFanClub.nMonsCaught == 0)
+ sTVShowState = 6;
+ else if (show->safariFanClub.nMonsCaught < 4)
+ sTVShowState = 5;
+ else
+ sTVShowState = 1;
+ break;
+ case 1:
+ TVShowConvertInternationalString(gStringVar1, show->safariFanClub.playerName, show->safariFanClub.language);
+ ConvertIntToDecimalString(1, show->safariFanClub.nMonsCaught);
+ if (show->safariFanClub.nPkblkUsed == 0)
+ sTVShowState = 3;
+ else
+ sTVShowState = 2;
+ break;
+ case 2:
+ ConvertIntToDecimalString(1, show->safariFanClub.nPkblkUsed);
+ sTVShowState = 4;
+ break;
+ case 3:
+ sTVShowState = 4;
+ break;
+ case 4:
+ TVShowConvertInternationalString(gStringVar1, show->safariFanClub.playerName, show->safariFanClub.language);
+ sTVShowState = 10;
+ break;
+ case 5:
+ TVShowConvertInternationalString(gStringVar1, show->safariFanClub.playerName, show->safariFanClub.language);
+ ConvertIntToDecimalString(1, show->safariFanClub.nMonsCaught);
+ if (show->safariFanClub.nPkblkUsed == 0)
+ sTVShowState = 8;
+ else
+ sTVShowState = 7;
+ break;
+ case 6:
+ TVShowConvertInternationalString(gStringVar1, show->safariFanClub.playerName, show->safariFanClub.language);
+ if (show->safariFanClub.nPkblkUsed == 0)
+ sTVShowState = 8;
+ else
+ sTVShowState = 7;
+ break;
+ case 7:
+ ConvertIntToDecimalString(1, show->safariFanClub.nPkblkUsed);
+ sTVShowState = 9;
+ break;
+ case 8:
+ sTVShowState = 9;
+ break;
+ case 9:
+ TVShowConvertInternationalString(gStringVar1, show->safariFanClub.playerName, show->safariFanClub.language);
+ sTVShowState = 10;
+ break;
+ case 10:
+ TVShowDone();
+ break;
}
ShowFieldMessage(sTVSafariFanClubTextGroup[state]);
}
@@ -7188,17 +6785,11 @@ static void DoTVShowLilycoveContestLady(void)
case CONTESTLADYLIVE_STATE_INTRO:
BufferContestName(gStringVar1, show->contestLady.contestCategory);
if (show->contestLady.pokeblockState == CONTEST_LADY_GOOD)
- {
sTVShowState = CONTESTLADYLIVE_STATE_WON;
- }
else if (show->contestLady.pokeblockState == CONTEST_LADY_NORMAL)
- {
sTVShowState = CONTESTLADYLIVE_STATE_LOST;
- }
else // CONTEST_LADY_BAD
- {
sTVShowState = CONTESTLADYLIVE_STATE_LOST_BADLY;
- }
break;
case CONTESTLADYLIVE_STATE_WON:
case CONTESTLADYLIVE_STATE_LOST:
@@ -7211,7 +6802,7 @@ static void DoTVShowLilycoveContestLady(void)
ShowFieldMessage(sTVLilycoveContestLadyTextGroup[state]);
}
-void TVShowDone(void)
+static void TVShowDone(void)
{
gSpecialVar_Result = TRUE;
sTVShowState = 0;
diff --git a/src/union_room.c b/src/union_room.c
index f41cfd45f..8d02a260d 100644
--- a/src/union_room.c
+++ b/src/union_room.c
@@ -253,10 +253,10 @@ static bool32 UR_PrintFieldMessage(const u8 *);
static s32 GetChatLeaderActionRequestMessage(u8 *, u32, u16 *, struct WirelessLink_URoom *);
static void Task_InitUnionRoom(u8 taskId);
static bool8 AreGnameUnameDifferent(struct WirelessGnameUnamePair*, const struct WirelessGnameUnamePair*);
-static void ItemPrintFunc_PossibleGroupMembers(u8, s32, u8);
-static void ListMenuItemPrintFunc_UnionRoomGroups(u8, s32, u8);
-static void TradeBoardListMenuItemPrintFunc(u8, s32, u8);
-static void nullsub_14(u8, s32, u8);
+static void ItemPrintFunc_PossibleGroupMembers(u8 windowId, u32 id, u8 y);
+static void ListMenuItemPrintFunc_UnionRoomGroups(u8 windowId, u32 id, u8 y);
+static void TradeBoardListMenuItemPrintFunc(u8 windowId, u32 id, u8 y);
+static void nullsub_14(u8 windowId, u32 id, u8 y);
#include "data/union_room.h"
@@ -319,8 +319,13 @@ static void StringExpandPlaceholders_AwaitingCommFromAnother(u8 *dst, u8 caseId)
case ACTIVITY_CONTEST_CUTE:
case ACTIVITY_CONTEST_SMART:
case ACTIVITY_CONTEST_TOUGH:
- // UB: argument *dst isn't used, instead it always prints to gStringVar4
+ // BUG: argument *dst isn't used, instead it always prints to gStringVar4
+ // not an issue in practice since Gamefreak never used any other arguments here besides gStringVar4
+ #ifndef BUGFIX
StringExpandPlaceholders(gStringVar4, sText_AwaitingCommunication);
+ #else
+ StringExpandPlaceholders(dst, sText_AwaitingCommunication);
+ #endif
break;
}
}
@@ -830,7 +835,7 @@ static bool8 Leader_SetStateIfMemberListChanged(struct WirelessLink_Leader *data
return FALSE;
}
-static void ItemPrintFunc_PossibleGroupMembers(u8 windowId, s32 id, u8 y)
+static void ItemPrintFunc_PossibleGroupMembers(u8 windowId, u32 id, u8 y)
{
struct WirelessLink_Leader *data = sWirelessLinkMain.leader;
u8 colorIdx = UR_COLOR_DKE_WHT_LTE;
@@ -1358,7 +1363,7 @@ static u8 URoomGroupListGetTextColor(struct WirelessLink_Group *data, u32 id)
return UR_COLOR_DKE_WHT_LTE;
}
-static void ListMenuItemPrintFunc_UnionRoomGroups(u8 windowId, s32 id, u8 y)
+static void ListMenuItemPrintFunc_UnionRoomGroups(u8 windowId, u32 id, u8 y)
{
struct WirelessLink_Group *data = sWirelessLinkMain.group;
u8 colorId = URoomGroupListGetTextColor(data, id);
@@ -4069,9 +4074,8 @@ static s32 UnionRoomGetPlayerInteractionResponse(struct UnkStruct_Main0 *main0,
}
}
-void nullsub_14(u8 windowId, s32 itemId, u8 y)
+void nullsub_14(u8 windowId, u32 itemId, u8 y)
{
-
}
static void TradeBoardPrintItemInfo(u8 windowId, u8 y, struct GFtgtGname * gname, const u8 * uname, u8 colorIdx)
@@ -4095,7 +4099,7 @@ static void TradeBoardPrintItemInfo(u8 windowId, u8 y, struct GFtgtGname * gname
}
}
-static void TradeBoardListMenuItemPrintFunc(u8 windowId, s32 itemId, u8 y)
+static void TradeBoardListMenuItemPrintFunc(u8 windowId, u32 itemId, u8 y)
{
struct WirelessLink_Leader *data = sWirelessLinkMain.leader;
struct GFtgtGname *rfu;
@@ -4415,7 +4419,7 @@ static void HandleCancelActivity(bool32 setData)
static void UR_EnableScriptContext2AndFreezeObjectEvents(void)
{
ScriptContext2_Enable();
- ScriptFreezeObjectEvents();
+ FreezeObjects_WaitForPlayer();
}
static u8 GetActivePartnerSpriteGenderParam(struct WirelessLink_URoom *data)
diff --git a/src/union_room_chat.c b/src/union_room_chat.c
index fb875bbb4..8e9f78280 100755
--- a/src/union_room_chat.c
+++ b/src/union_room_chat.c
@@ -2984,7 +2984,7 @@ static void HideKeyboardSwapMenu(void)
static void PrintChatMessage(u16 row, u8 *str, u8 colorIdx)
{
- // colorIdx: 0 = grey, 1 = red, 2 = green, 3 = blue
+ // colorIdx: 0 = gray, 1 = red, 2 = green, 3 = blue
u8 color[3];
color[0] = TEXT_COLOR_WHITE;
color[1] = colorIdx * 2 + 2;
diff --git a/src/wild_encounter.c b/src/wild_encounter.c
index 767fbe4e7..8bcb17605 100644
--- a/src/wild_encounter.c
+++ b/src/wild_encounter.c
@@ -162,7 +162,7 @@ static u8 ChooseWildMonIndex_Land(void)
return 8;
else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_8 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_9)
return 9;
- else if (rand == ENCOUNTER_CHANCE_LAND_MONS_SLOT_9)
+ else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_9 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_10)
return 10;
else
return 11;
@@ -215,7 +215,7 @@ static u8 ChooseWildMonIndex_Fishing(u8 rod)
wildMonIndex = 7;
if (rand >= ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_7 && rand < ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_8)
wildMonIndex = 8;
- if (rand == ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_8)
+ if (rand >= ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_8 && rand < ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_9)
wildMonIndex = 9;
break;
}
diff --git a/tools/aif2pcm/Makefile b/tools/aif2pcm/Makefile
index 77df29152..dd48a8759 100644
--- a/tools/aif2pcm/Makefile
+++ b/tools/aif2pcm/Makefile
@@ -6,12 +6,18 @@ LIBS = -lm
SRCS = main.c extended.c
+ifeq ($(OS),Windows_NT)
+EXE := .exe
+else
+EXE :=
+endif
+
.PHONY: all clean
-all: aif2pcm
+all: aif2pcm$(EXE)
@:
-aif2pcm: $(SRCS)
+aif2pcm$(EXE): $(SRCS)
$(CC) $(CFLAGS) $(SRCS) -o $@ $(LDFLAGS) $(LIBS)
clean:
diff --git a/tools/bin2c/Makefile b/tools/bin2c/Makefile
index 52806e39c..4dbfab94f 100644
--- a/tools/bin2c/Makefile
+++ b/tools/bin2c/Makefile
@@ -6,10 +6,16 @@ CFLAGS = -Wall -Wextra -Werror -std=c11 -O2
SRCS = bin2c.c
-all: bin2c
+ifeq ($(OS),Windows_NT)
+EXE := .exe
+else
+EXE :=
+endif
+
+all: bin2c$(EXE)
@:
-bin2c: $(SRCS)
+bin2c$(EXE): $(SRCS)
$(CC) $(CFLAGS) $(SRCS) -o $@ $(LDFLAGS)
clean:
diff --git a/tools/gbafix/Makefile b/tools/gbafix/Makefile
index 91a60a9e4..efb016c97 100644
--- a/tools/gbafix/Makefile
+++ b/tools/gbafix/Makefile
@@ -3,10 +3,16 @@ CC ?= gcc
SRCS = gbafix.c
-all: gbafix
+ifeq ($(OS),Windows_NT)
+EXE := .exe
+else
+EXE :=
+endif
+
+all: gbafix$(EXE)
@:
-gbafix: $(SRCS)
+gbafix$(EXE): $(SRCS)
$(CC) $(SRCS) -o $@ $(LDFLAGS)
clean:
diff --git a/tools/gbagfx/Makefile b/tools/gbagfx/Makefile
index f0638414d..b4244aa8d 100644
--- a/tools/gbagfx/Makefile
+++ b/tools/gbagfx/Makefile
@@ -6,15 +6,21 @@ LIBS = -lpng -lz
SRCS = main.c convert_png.c gfx.c jasc_pal.c lz.c rl.c util.c font.c huff.c
+ifeq ($(OS),Windows_NT)
+EXE := .exe
+else
+EXE :=
+endif
+
.PHONY: all clean
-all: gbagfx
+all: gbagfx$(EXE)
@:
-gbagfx-debug: $(SRCS) convert_png.h gfx.h global.h jasc_pal.h lz.h rl.h util.h font.h
+gbagfx-debug$(EXE): $(SRCS) convert_png.h gfx.h global.h jasc_pal.h lz.h rl.h util.h font.h
$(CC) $(CFLAGS) -DDEBUG $(SRCS) -o $@ $(LDFLAGS) $(LIBS)
-gbagfx: $(SRCS) convert_png.h gfx.h global.h jasc_pal.h lz.h rl.h util.h font.h
+gbagfx$(EXE): $(SRCS) convert_png.h gfx.h global.h jasc_pal.h lz.h rl.h util.h font.h
$(CC) $(CFLAGS) $(SRCS) -o $@ $(LDFLAGS) $(LIBS)
clean:
diff --git a/tools/jsonproc/Makefile b/tools/jsonproc/Makefile
index 47198b171..eec73eb7b 100755
--- a/tools/jsonproc/Makefile
+++ b/tools/jsonproc/Makefile
@@ -8,12 +8,18 @@ SRCS := jsonproc.cpp
HEADERS := jsonproc.h inja.hpp nlohmann/json.hpp
+ifeq ($(OS),Windows_NT)
+EXE := .exe
+else
+EXE :=
+endif
+
.PHONY: all clean
-all: jsonproc
+all: jsonproc$(EXE)
@:
-jsonproc: $(SRCS) $(HEADERS)
+jsonproc$(EXE): $(SRCS) $(HEADERS)
$(CXX) $(CXXFLAGS) $(INCLUDES) $(SRCS) -o $@ $(LDFLAGS)
clean:
diff --git a/tools/mapjson/Makefile b/tools/mapjson/Makefile
index c1f703f9f..100e809c6 100644
--- a/tools/mapjson/Makefile
+++ b/tools/mapjson/Makefile
@@ -6,12 +6,18 @@ SRCS := json11.cpp mapjson.cpp
HEADERS := mapjson.h
+ifeq ($(OS),Windows_NT)
+EXE := .exe
+else
+EXE :=
+endif
+
.PHONY: all clean
-all: mapjson
+all: mapjson$(EXE)
@:
-mapjson: $(SRCS) $(HEADERS)
+mapjson$(EXE): $(SRCS) $(HEADERS)
$(CXX) $(CXXFLAGS) $(SRCS) -o $@ $(LDFLAGS)
clean:
diff --git a/tools/mapjson/mapjson.cpp b/tools/mapjson/mapjson.cpp
index 5e246ff24..d767b469e 100644
--- a/tools/mapjson/mapjson.cpp
+++ b/tools/mapjson/mapjson.cpp
@@ -395,7 +395,7 @@ string generate_map_constants_text(string groups_filepath, Json groups_data) {
int group_num = 0;
for (auto &group : groups_data["group_order"].array_items()) {
- text << "// Map Group " << group_num << "\n";
+ text << "// " << group.string_value() << "\n";
vector<Json> map_ids;
size_t max_length = 0;
diff --git a/tools/mid2agb/Makefile b/tools/mid2agb/Makefile
index 451d4b39f..553b7859e 100644
--- a/tools/mid2agb/Makefile
+++ b/tools/mid2agb/Makefile
@@ -6,12 +6,18 @@ SRCS := agb.cpp error.cpp main.cpp midi.cpp tables.cpp
HEADERS := agb.h error.h main.h midi.h tables.h
+ifeq ($(OS),Windows_NT)
+EXE := .exe
+else
+EXE :=
+endif
+
.PHONY: all clean
-all: mid2agb
+all: mid2agb$(EXE)
@:
-mid2agb: $(SRCS) $(HEADERS)
+mid2agb$(EXE): $(SRCS) $(HEADERS)
$(CXX) $(CXXFLAGS) $(SRCS) -o $@ $(LDFLAGS)
clean:
diff --git a/tools/preproc/Makefile b/tools/preproc/Makefile
index 8c48afea2..1507c973f 100644
--- a/tools/preproc/Makefile
+++ b/tools/preproc/Makefile
@@ -8,12 +8,18 @@ SRCS := asm_file.cpp c_file.cpp charmap.cpp preproc.cpp string_parser.cpp \
HEADERS := asm_file.h c_file.h char_util.h charmap.h preproc.h string_parser.h \
utf8.h
+ifeq ($(OS),Windows_NT)
+EXE := .exe
+else
+EXE :=
+endif
+
.PHONY: all clean
-all: preproc
+all: preproc$(EXE)
@:
-preproc: $(SRCS) $(HEADERS)
+preproc$(EXE): $(SRCS) $(HEADERS)
$(CXX) $(CXXFLAGS) $(SRCS) -o $@ $(LDFLAGS)
clean:
diff --git a/tools/preproc/c_file.cpp b/tools/preproc/c_file.cpp
index b996a048c..17a08cc9f 100644
--- a/tools/preproc/c_file.cpp
+++ b/tools/preproc/c_file.cpp
@@ -23,32 +23,59 @@
#include <stdexcept>
#include <string>
#include <memory>
+#include <cstring>
+#include <cerrno>
#include "preproc.h"
#include "c_file.h"
#include "char_util.h"
#include "utf8.h"
#include "string_parser.h"
-CFile::CFile(std::string filename) : m_filename(filename)
+CFile::CFile(const char * filenameCStr, bool isStdin)
{
- FILE *fp = std::fopen(filename.c_str(), "rb");
+ FILE *fp;
+
+ if (isStdin) {
+ fp = stdin;
+ m_filename = std::string{"<stdin>/"}.append(filenameCStr);
+ } else {
+ fp = std::fopen(filenameCStr, "rb");
+ m_filename = std::string(filenameCStr);
+ }
+
+ std::string& filename = m_filename;
if (fp == NULL)
FATAL_ERROR("Failed to open \"%s\" for reading.\n", filename.c_str());
- std::fseek(fp, 0, SEEK_END);
-
- m_size = std::ftell(fp);
+ m_size = 0;
+ m_buffer = (char *)malloc(CHUNK_SIZE + 1);
+ if (m_buffer == NULL) {
+ FATAL_ERROR("Failed to allocate memory to process file \"%s\"!", filename.c_str());
+ }
- if (m_size < 0)
- FATAL_ERROR("File size of \"%s\" is less than zero.\n", filename.c_str());
+ std::size_t numAllocatedBytes = CHUNK_SIZE + 1;
+ std::size_t bufferOffset = 0;
+ std::size_t count;
- m_buffer = new char[m_size + 1];
+ while ((count = std::fread(m_buffer + bufferOffset, 1, CHUNK_SIZE, fp)) != 0) {
+ if (!std::ferror(fp)) {
+ m_size += count;
- std::rewind(fp);
+ if (std::feof(fp)) {
+ break;
+ }
- if (std::fread(m_buffer, m_size, 1, fp) != 1)
- FATAL_ERROR("Failed to read \"%s\".\n", filename.c_str());
+ numAllocatedBytes += CHUNK_SIZE;
+ bufferOffset += CHUNK_SIZE;
+ m_buffer = (char *)realloc(m_buffer, numAllocatedBytes);
+ if (m_buffer == NULL) {
+ FATAL_ERROR("Failed to allocate memory to process file \"%s\"!", filename.c_str());
+ }
+ } else {
+ FATAL_ERROR("Failed to read \"%s\". (error: %s)", filename.c_str(), std::strerror(errno));
+ }
+ }
m_buffer[m_size] = 0;
@@ -56,6 +83,7 @@ CFile::CFile(std::string filename) : m_filename(filename)
m_pos = 0;
m_lineNum = 1;
+ m_isStdin = isStdin;
}
CFile::CFile(CFile&& other) : m_filename(std::move(other.m_filename))
@@ -64,13 +92,14 @@ CFile::CFile(CFile&& other) : m_filename(std::move(other.m_filename))
m_pos = other.m_pos;
m_size = other.m_size;
m_lineNum = other.m_lineNum;
+ m_isStdin = other.m_isStdin;
- other.m_buffer = nullptr;
+ other.m_buffer = NULL;
}
CFile::~CFile()
{
- delete[] m_buffer;
+ free(m_buffer);
}
void CFile::Preproc()
diff --git a/tools/preproc/c_file.h b/tools/preproc/c_file.h
index 7369aba85..49e633a18 100644
--- a/tools/preproc/c_file.h
+++ b/tools/preproc/c_file.h
@@ -30,7 +30,7 @@
class CFile
{
public:
- CFile(std::string filename);
+ CFile(const char * filenameCStr, bool isStdin);
CFile(CFile&& other);
CFile(const CFile&) = delete;
~CFile();
@@ -42,6 +42,7 @@ private:
long m_size;
long m_lineNum;
std::string m_filename;
+ bool m_isStdin;
bool ConsumeHorizontalWhitespace();
bool ConsumeNewline();
@@ -55,4 +56,6 @@ private:
void RaiseWarning(const char* format, ...);
};
+#define CHUNK_SIZE 4096
+
#endif // C_FILE_H
diff --git a/tools/preproc/preproc.cpp b/tools/preproc/preproc.cpp
index c9c6042df..eb2d4c8a2 100644
--- a/tools/preproc/preproc.cpp
+++ b/tools/preproc/preproc.cpp
@@ -103,9 +103,9 @@ void PreprocAsmFile(std::string filename)
}
}
-void PreprocCFile(std::string filename)
+void PreprocCFile(const char * filename, bool isStdin)
{
- CFile cFile(filename);
+ CFile cFile(filename, isStdin);
cFile.Preproc();
}
@@ -132,9 +132,9 @@ char* GetFileExtension(char* filename)
int main(int argc, char **argv)
{
- if (argc != 3)
+ if (argc < 3 || argc > 4)
{
- std::fprintf(stderr, "Usage: %s SRC_FILE CHARMAP_FILE", argv[0]);
+ std::fprintf(stderr, "Usage: %s SRC_FILE CHARMAP_FILE [-i]\nwhere -i denotes if input is from stdin\n", argv[0]);
return 1;
}
@@ -147,9 +147,17 @@ int main(int argc, char **argv)
if ((extension[0] == 's') && extension[1] == 0)
PreprocAsmFile(argv[1]);
- else if ((extension[0] == 'c' || extension[0] == 'i') && extension[1] == 0)
- PreprocCFile(argv[1]);
- else
+ else if ((extension[0] == 'c' || extension[0] == 'i') && extension[1] == 0) {
+ if (argc == 4) {
+ if (argv[3][0] == '-' && argv[3][1] == 'i' && argv[3][2] == '\0') {
+ PreprocCFile(argv[1], true);
+ } else {
+ FATAL_ERROR("unknown argument flag \"%s\".\n", argv[3]);
+ }
+ } else {
+ PreprocCFile(argv[1], false);
+ }
+ } else
FATAL_ERROR("\"%s\" has an unknown file extension of \"%s\".\n", argv[1], extension);
return 0;
diff --git a/tools/ramscrgen/Makefile b/tools/ramscrgen/Makefile
index 4e901a29c..a9375c87a 100644
--- a/tools/ramscrgen/Makefile
+++ b/tools/ramscrgen/Makefile
@@ -8,10 +8,16 @@ HEADERS := ramscrgen.h sym_file.h elf.h char_util.h
.PHONY: all clean
-all: ramscrgen
+ifeq ($(OS),Windows_NT)
+EXE := .exe
+else
+EXE :=
+endif
+
+all: ramscrgen$(EXE)
@:
-ramscrgen: $(SRCS) $(HEADERS)
+ramscrgen$(EXE): $(SRCS) $(HEADERS)
$(CXX) $(CXXFLAGS) $(SRCS) -o $@ $(LDFLAGS)
clean:
diff --git a/tools/rsfont/Makefile b/tools/rsfont/Makefile
index 930a92b36..0bc88a42b 100644
--- a/tools/rsfont/Makefile
+++ b/tools/rsfont/Makefile
@@ -8,10 +8,16 @@ SRCS = main.c convert_png.c util.c font.c
.PHONY: all clean
-all: rsfont
+ifeq ($(OS),Windows_NT)
+EXE := .exe
+else
+EXE :=
+endif
+
+all: rsfont$(EXE)
@:
-rsfont: $(SRCS) convert_png.h gfx.h global.h util.h font.h
+rsfont$(EXE): $(SRCS) convert_png.h gfx.h global.h util.h font.h
$(CC) $(CFLAGS) $(SRCS) -o $@ $(LDFLAGS) $(LIBS)
clean:
diff --git a/tools/scaninc/Makefile b/tools/scaninc/Makefile
index 52e663d8d..96d92f706 100644
--- a/tools/scaninc/Makefile
+++ b/tools/scaninc/Makefile
@@ -8,10 +8,16 @@ HEADERS := scaninc.h asm_file.h c_file.h source_file.h
.PHONY: all clean
-all: scaninc
+ifeq ($(OS),Windows_NT)
+EXE := .exe
+else
+EXE :=
+endif
+
+all: scaninc$(EXE)
@:
-scaninc: $(SRCS) $(HEADERS)
+scaninc$(EXE): $(SRCS) $(HEADERS)
$(CXX) $(CXXFLAGS) $(SRCS) -o $@ $(LDFLAGS)
clean: