diff --git a/.gitignore b/.gitignore
index fd16840c67..cac4a07e61 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,7 @@
*.i
*.elf
*.gba
+!data/*.gba
*.sgm
*.sa1
*.ss[0-9]
@@ -36,3 +37,4 @@ porymap.project.cfg
*.sna
*.diff
*.sym
+*.js
diff --git a/INSTALL.md b/INSTALL.md
index 1ad3b4b0c9..1f1e1164be 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -125,12 +125,12 @@ Otherwise, ask for help on Discord or IRC (see [README.md](README.md)), or conti
Note that in msys2, Copy is Ctrl+Insert and Paste is Shift+Insert.
-1. Open msys2 at C:\devkitPro\msys2\msys2_shell.bat.
+1. Open msys2 at C:\devkitPro\msys2\mingw64.exe or run `C:\devkitPro\msys2\msys2_shell.bat -mingw64`.
2. Certain packages are required to build pokeemerald. Install these by running the following command:
```bash
- pacman -S make gcc zlib-devel git
+ pacman -S make zlib-devel git mingw-w64-x86_64-gcc mingw-w64-x86_64-libpng
```
Note...
@@ -138,39 +138,6 @@ Note that in msys2, Copy is Ctrl+Insert and Paste is Shift+Insert.
> This command will ask for confirmation, just enter the yes action when prompted.
-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\\_\_**, where *\* 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\\_\_\Downloads** (the Downloads location for most users), enter this command:
-
- ```bash
- cd Downloads
- ```
-
-
- Notes...
-
- > 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.
-
-
-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.
diff --git a/Makefile b/Makefile
index c3ffb5c47a..be083ac713 100644
--- a/Makefile
+++ b/Makefile
@@ -150,7 +150,7 @@ 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 tidymodern tidynonmodern
+.PHONY: all rom clean compare tidy tools mostlyclean clean-tools $(TOOLDIRS) libagbsyscall modern tidymodern tidynonmodern
infoshell = $(foreach line, $(shell $1 | sed "s/ /__SPACE__/g"), $(info $(subst __SPACE__, ,$(line))))
@@ -158,7 +158,7 @@ infoshell = $(foreach line, $(shell $1 | sed "s/ /__SPACE__/g"), $(info $(subst
# Disable dependency scanning for clean/tidy/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)))
+ifeq (,$(filter-out all rom compare modern libagbsyscall syms,$(MAKECMDGOALS)))
$(call infoshell, $(MAKE) -f make_tools.mk)
else
NODEP ?= 1
@@ -169,8 +169,8 @@ 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)))
+ # libagbsyscall does its own thing
+ ifeq (,$(filter-out clean tidy tools mostlyclean clean-tools $(TOOLDIRS) tidymodern tidynonmodern libagbsyscall,$(MAKECMDGOALS)))
SCAN_DEPS ?= 0
else
SCAN_DEPS ?= 1
@@ -243,7 +243,6 @@ mostlyclean: tidynonmodern tidymodern
rm -f $(DATA_ASM_SUBDIR)/maps/connections.inc $(DATA_ASM_SUBDIR)/maps/events.inc $(DATA_ASM_SUBDIR)/maps/groups.inc $(DATA_ASM_SUBDIR)/maps/headers.inc
find $(DATA_ASM_SUBDIR)/maps \( -iname 'connections.inc' -o -iname 'events.inc' -o -iname 'header.inc' \) -exec rm {} +
rm -f $(AUTO_GEN_TARGETS)
- @$(MAKE) clean -C berry_fix
@$(MAKE) clean -C libagbsyscall
tidy: tidynonmodern tidymodern
@@ -419,7 +418,7 @@ endif
$(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
+$(ELF): $(OBJ_DIR)/ld_script.ld $(OBJS) libagbsyscall
@echo "cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ld_script.ld -o ../../$@ "
@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
@@ -430,11 +429,6 @@ $(ROM): $(ELF)
modern: all
-berry_fix/berry_fix.gba: berry_fix
-
-berry_fix:
- @$(MAKE) -C berry_fix COMPARE=$(COMPARE) TOOLCHAIN=$(TOOLCHAIN) MODERN=$(MODERN)
-
libagbsyscall:
@$(MAKE) -C libagbsyscall TOOLCHAIN=$(TOOLCHAIN) MODERN=$(MODERN)
diff --git a/asm/macros.inc b/asm/macros.inc
index 77f44a8475..95bb4e31b0 100644
--- a/asm/macros.inc
+++ b/asm/macros.inc
@@ -1,8 +1,6 @@
.include "asm/macros/asm.inc"
.include "asm/macros/function.inc"
.include "asm/macros/movement.inc"
- .include "asm/macros/window.inc"
- .include "asm/macros/pokemon_data.inc"
.include "asm/macros/map.inc"
.include "asm/macros/field_effect_script.inc"
.include "asm/macros/trainer_hill.inc"
@@ -16,130 +14,3 @@
.include "asm/macros/battle_frontier/battle_pyramid.inc"
.include "asm/macros/battle_frontier/battle_tower.inc"
.include "asm/macros/battle_frontier/frontier_util.inc"
-
- .macro region_map_entry x, y, width, height, name
- .byte \x
- .byte \y
- .byte \width
- .byte \height
- .4byte gMapName_\name
- .endm
-
- .macro obj_tiles address, uncompressed_size, tag = 0
- .4byte \address
- .2byte \uncompressed_size
- .2byte \tag
- .endm
-
- .macro null_obj_tiles
- obj_tiles 0, 0, 0
- .endm
-
- .macro obj_pal address, tag
- .4byte \address
- .2byte \tag
- .2byte 0@ padding
- .endm
-
- .macro null_obj_pal
- obj_pal 0, 0
- .endm
-
- .macro paired_pals tag, address
- .2byte \tag
- .2byte 0 @ padding
- .4byte \address
- .endm
-
-@ For object animation frames.
- .macro obj_frame_tiles address, uncompressed_size
- .4byte \address
- .2byte \uncompressed_size
- .2byte 0 @ padding
- .endm
-
- .macro spr_template tile_tag, pal_tag, oam, anims, images, affine_anims, callback
- .2byte \tile_tag
- .2byte \pal_tag
- .4byte \oam
- .4byte \anims
- .4byte \images
- .4byte \affine_anims
- .4byte \callback
- .endm
-
-@ Berry trees have a table defining the palette slot used for each of their 5
-@ stages. However, the first 2 stages always use the same slots regardless of
-@ the type of tree and the slots of the last 3 stages always equal each other.
- .macro berry_tree_palette_slot_table slot
- .byte 3, 4, \slot, \slot, \slot
- .endm
-
- .macro subsprite x, y, priority, tile_num_offset, size
- .byte \x
- .byte \y
- .2byte ((\priority) << 14) | ((\tile_num_offset) << 4) | SPRITE_SIZE_\size
- .endm
-
- .macro obj_image_anim_frame pic_id, duration, flags = 0
- .2byte \pic_id
- .byte (\flags) | (\duration)
- .byte 0 @ padding
- .endm
-
- .macro obj_image_anim_loop count
- .2byte 0xfffd
- .byte \count
- .byte 0 @ padding
- .endm
-
- .macro obj_image_anim_jump target_index
- .2byte 0xfffe
- .byte \target_index
- .byte 0 @ padding
- .endm
-
- .macro obj_image_anim_end
- .2byte 0xffff
- .2byte 0 @ padding
- .endm
-
- .macro obj_rot_scal_anim_frame delta_x_scale, delta_y_scale, delta_angle, duration
- .2byte \delta_x_scale
- .2byte \delta_y_scale
- .byte \delta_angle
- .byte \duration
- .2byte 0 @ padding
- .endm
-
- .macro obj_rot_scal_anim_loop count
- .2byte 0x7ffd
- .2byte \count
- .4byte 0 @ padding
- .endm
-
- .macro obj_rot_scal_anim_jump target_index
- .2byte 0x7ffe
- .2byte \target_index
- .4byte 0 @ padding
- .endm
-
- .macro obj_rot_scal_anim_end unknown=0
- .2byte 0x7fff
- .2byte \unknown
- .fill 4 @ padding
- .endm
-
- .macro door_anim_frame unknown, offset
- .byte \unknown
- .byte 0 @ padding
- .2byte \offset
- .endm
-
- .macro door_anim_gfx metatile_num, unknown, unknown2, tile_addr, palette_addr
- .2byte \metatile_num
- .byte \unknown
- .byte \unknown2
- .4byte \tile_addr
- .4byte \palette_addr
- .endm
diff --git a/asm/macros/asm.inc b/asm/macros/asm.inc
index 4ac003fabd..3f70145d31 100644
--- a/asm/macros/asm.inc
+++ b/asm/macros/asm.inc
@@ -1,4 +1,4 @@
- .macro inc x
+ .macro inc x:req
.set \x, \x + 1
.endm
@@ -6,7 +6,7 @@
.set __enum__, \x
.endm
- .macro enum constant
+ .macro enum constant:req
.equiv \constant, __enum__
inc __enum__
.endm
diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc
index a70c89a268..0aeb7309ce 100644
--- a/asm/macros/battle_script.inc
+++ b/asm/macros/battle_script.inc
@@ -1932,6 +1932,42 @@
various BS_ATTACKER, VARIOUS_SHELL_SIDE_ARM_CHECK
.endm
+ .macro jumpifcantfling battler:req, ptr:req
+ various \battler, VARIOUS_JUMP_IF_CANT_FLING
+ .4byte \ptr
+ .endm
+
+ .macro curecertainstatuses battler:req
+ various \battler, VARIOUS_CURE_CERTAIN_STATUSES
+ .endm
+
+ .macro tryresetnegativestatstages battler:req
+ various \battler, VARIOUS_TRY_RESET_NEGATIVE_STAT_STAGES
+ .endm
+
+ .macro jumpiflastuseditemberry ptr:req
+ various BS_ATTACKER, VARIOUS_JUMP_IF_LAST_USED_ITEM_BERRY
+ .4byte \ptr
+ .endm
+
+ .macro jumpiflastuseditemholdeffect battler:req, holdEffect:req, ptr:req
+ various \battler, VARIOUS_JUMP_IF_LAST_USED_ITEM_HOLD_EFFECT
+ .byte \holdEffect
+ .4byte \ptr
+ .endm
+
+ .macro savebattleritem battler:req
+ various \battler, VARIOUS_SAVE_BATTLER_ITEM
+ .endm
+
+ .macro restorebattleritem battler:req
+ various \battler, VARIOUS_RESTORE_BATTLER_ITEM
+ .endm
+
+ .macro battleritemtolastuseditem battler:req
+ various \battler, VARIOUS_BATTLER_ITEM_TO_LAST_USED_ITEM
+ .endm
+
@ helpful macros
.macro setstatchanger stat:req, stages:req, down:req
setbyte sSTATCHANGER, \stat | \stages << 3 | \down << 7
@@ -2061,3 +2097,26 @@
jumpifsideaffecting BS_TARGET, SIDE_STATUS_SAFEGUARD, \jumpptr
1:
.endm
+
+ @ Will jump to script pointer if the target weighs less than 200 kg, or 441 lbs.
+ .macro jumpifunder200 battler:req, ptr:req
+ various \battler, VARIOUS_JUMP_IF_UNDER_200
+ .4byte \ptr
+ .endm
+
+ @ Sets the sky drop status and does all other necessary operations
+ .macro setskydrop
+ various 0, VARIOUS_SET_SKY_DROP
+ .endm
+
+ @ Clears the sky drop status and does all other necessary operations.
+ @ If the target fainted in before this script is called, it goes to the given script.
+ .macro clearskydrop ptr:req
+ various 0, VARIOUS_CLEAR_SKY_DROP
+ .4byte \ptr
+ .endm
+
+ @ Accounts for if the target of Sky Drop was in confuse_lock when the attacker falls asleep due to Yawn.
+ .macro skydropyawn
+ various 0, VARIOUS_SKY_DROP_YAWN
+ .endm
diff --git a/asm/macros/event.inc b/asm/macros/event.inc
index abdeb8e69d..4420912fe7 100644
--- a/asm/macros/event.inc
+++ b/asm/macros/event.inc
@@ -604,9 +604,8 @@
.endm
@ Blocks script execution until the movements being applied to the specified (localId) object finish.
- @ If the specified object is 0, then the command will block script execution until all objects
- @ affected by applymovement finish their movements. If the specified object is not currently being
- @ manipulated with applymovement, then this command does nothing.
+ @ If localId is 0, then the id of the last-moved object will be used instead. If the specified object
+ @ is not currently being manipulated with applymovement, then this command does nothing.
@ If no map is specified, then the current map is used.
.macro waitmovement localId:req, map
.ifb \map
@@ -987,7 +986,7 @@
@ Gives the player a Pokémon of the specified species and level, holding the specified item. The trailing 0s are unused parameters.
@ VAR_RESULT will be set to MON_GIVEN_TO_PARTY, MON_GIVEN_TO_PC, or MON_CANT_GIVE depending on the outcome.
- .macro givemon species:req, level:req, item:req
+ .macro givemon species:req, level:req, item=ITEM_NONE
.byte 0x79
.2byte \species
.byte \level
@@ -1436,7 +1435,7 @@
@ that is also against 'species2' at 'level2' holding 'item2'.
@ Running this command will not affect normal wild battles. You start the prepared battle with dowildbattle.
@ If the player only has one Pokemon, a scripted double battle will be buggy.
- .macro setwildbattle species:req, level:req, item:req, species2=SPECIES_NONE, level2=0, item2=ITEM_NONE
+ .macro setwildbattle species:req, level:req, item=ITEM_NONE, species2=SPECIES_NONE, level2=0, item2=ITEM_NONE
.byte 0xb6
.2byte \species
.byte \level
@@ -1939,6 +1938,14 @@
closebraillemessage
.endm
+ @ Creates an "event legal" Pokémon for an encounter
+ .macro seteventmon species:req, level:req, item=ITEM_NONE
+ setvar VAR_0x8004, \species
+ setvar VAR_0x8005, \level
+ setvar VAR_0x8006, \item
+ special CreateEventLegalEnemyMon
+ .endm
+
@ Set up a totem boost for the next battle.
@ 'battler' is the position of the mon you want to gain a boost. see B_POSITION_xx in include/constants/battle.h.
@ The rest of the arguments are the stat change values to each stat.
diff --git a/asm/macros/field_effect_script.inc b/asm/macros/field_effect_script.inc
index 597b89acbb..38f7e31750 100644
--- a/asm/macros/field_effect_script.inc
+++ b/asm/macros/field_effect_script.inc
@@ -1,19 +1,21 @@
- .macro field_eff_loadtiles address
+@ The first .byte argument of each macro below is an index into gFieldEffectScriptFuncs
+
+ .macro field_eff_loadtiles address:req
.byte 0
.4byte \address
.endm
- .macro field_eff_loadfadedpal address
+ .macro field_eff_loadfadedpal address:req
.byte 1
.4byte \address
.endm
- .macro field_eff_loadpal address
+ .macro field_eff_loadpal address:req
.byte 2
.4byte \address
.endm
- .macro field_eff_callnative address
+ .macro field_eff_callnative address:req
.byte 3
.4byte \address
.endm
@@ -22,20 +24,20 @@
.byte 4
.endm
- .macro field_eff_loadgfx_callnative tiles_address, palette_address, function_address
+ .macro field_eff_loadgfx_callnative tiles_address:req, palette_address:req, function_address:req
.byte 5
.4byte \tiles_address
.4byte \palette_address
.4byte \function_address
.endm
- .macro field_eff_loadtiles_callnative tiles_address, function_address
+ .macro field_eff_loadtiles_callnative tiles_address:req, function_address:req
.byte 6
.4byte \tiles_address
.4byte \function_address
.endm
- .macro field_eff_loadfadedpal_callnative palette_address, function_address
+ .macro field_eff_loadfadedpal_callnative palette_address:req, function_address:req
.byte 7
.4byte \palette_address
.4byte \function_address
diff --git a/asm/macros/function.inc b/asm/macros/function.inc
index b109595dfd..0f4e6720c9 100644
--- a/asm/macros/function.inc
+++ b/asm/macros/function.inc
@@ -1,15 +1,15 @@
- .macro arm_func_start name
+ .macro arm_func_start name:req
.align 2, 0
.global \name
.arm
.type \name, %function
.endm
- .macro arm_func_end name
+ .macro arm_func_end name:req
.size \name, .-\name
.endm
- .macro thumb_func_start name
+ .macro thumb_func_start name:req
.align 2, 0
.global \name
.thumb
@@ -17,13 +17,13 @@
.type \name, %function
.endm
- .macro non_word_aligned_thumb_func_start name
+ .macro non_word_aligned_thumb_func_start name:req
.global \name
.thumb
.thumb_func
.type \name, %function
.endm
- .macro thumb_func_end name
+ .macro thumb_func_end name:req
.size \name, .-\name
.endm
diff --git a/asm/macros/m4a.inc b/asm/macros/m4a.inc
index 6c5abc09b5..b22da3d634 100644
--- a/asm/macros/m4a.inc
+++ b/asm/macros/m4a.inc
@@ -1,13 +1,13 @@
- .macro song label, music_player, unknown
+ .macro song label:req, music_player:req, unknown:req
.4byte \label
.2byte \music_player
.2byte \unknown
.endm
- .macro music_player info_struct, track_struct, unknown_1, unknown_2
+ .macro music_player info_struct:req, track_struct:req, num_tracks:req, unknown:req
.4byte \info_struct
.4byte \track_struct
- .byte \unknown_1
- .space 1
- .2byte \unknown_2
+ .byte \num_tracks
+ .space 1 @ Padding
+ .2byte \unknown
.endm
diff --git a/asm/macros/map.inc b/asm/macros/map.inc
index 74ed069179..662257e416 100644
--- a/asm/macros/map.inc
+++ b/asm/macros/map.inc
@@ -1,83 +1,110 @@
- .macro map map_id
+@ Most of the macros in this file are for arranging map event data, and are output by mapjson using data from each map's JSON file.
+
+ @ Takes a MAP constant and outputs the map group and map number as separate bytes
+ .macro map map_id:req
.byte \map_id >> 8 @ map group
.byte \map_id & 0xFF @ map num
.endm
- .macro map_script type, address
+ @ Defines a map script. 'type' is any MAP_SCRIPT_* constant (see include/constants/map_scripts.h)
+ .macro map_script type:req, script:req
.byte \type
- .4byte \address
+ .4byte \script
.endm
- .macro map_script_2 word1, word2, address
- .2byte \word1
- .2byte \word2
- .4byte \address
+ @ Defines an entry in a map script table (for either ON_WARP_INTO_MAP_TABLE or ON_FRAME_TABLE)
+ .macro map_script_2 var:req, compare:req, script:req
+ .2byte \var
+ .2byte \compare
+ .4byte \script
.endm
- .macro object_event index:req, gfx:req, replacement:req, x:req, y:req, elevation:req, movement_type:req, x_radius:req, y_radius:req, trainer_type:req, sight_radius_tree_etc:req, script:req, event_flag:req
- .byte \index, \gfx, \replacement, 0
- .2byte \x
- .2byte \y
- .byte \elevation, \movement_type, ((\y_radius << 4) | \x_radius), 0
- .2byte \trainer_type, \sight_radius_tree_etc
+ @ Defines an object event template for map data. Mirrors the struct layout of ObjectEventTemplate in include/global.fieldmap.h
+ .macro object_event index:req, gfx:req, inConnection:req, x:req, y:req, elevation:req, movement_type:req, x_radius:req, y_radius:req, trainer_type:req, sight_radius_tree_etc:req, script:req, event_flag:req
+ .byte \index
+ .byte \gfx
+ .byte \inConnection
+ .space 1 @ Padding
+ .2byte \x, \y
+ .byte \elevation
+ .byte \movement_type
+ .byte ((\y_radius << 4) | \x_radius)
+ .space 1 @ Padding
+ .2byte \trainer_type
+ .2byte \sight_radius_tree_etc
.4byte \script
.2byte \event_flag
- .2byte 0
+ .space 2 @ Padding
inc _num_npcs
.endm
- .macro warp_def x, y, byte, warp, map_id
+ @ Defines a warp event for map data. Mirrors the struct layout of WarpEvent in include/global.fieldmap.h
+ .macro warp_def x:req, y:req, elevation:req, warpId:req, map_id:req
.2byte \x, \y
- .byte \byte, \warp
+ .byte \elevation
+ .byte \warpId
.byte \map_id & 0xFF @ map num
.byte \map_id >> 8 @ map group
inc _num_warps
.endm
- .macro coord_event x, y, elevation, trigger, index, script
+ @ Defines a coord event for map data. Mirrors the struct layout of CoordEvent in include/global.fieldmap.h
+ .macro coord_event x:req, y:req, elevation:req, trigger:req, index:req, script:req
.2byte \x, \y
- .byte \elevation, 0
- .2byte \trigger, \index, 0
+ .byte \elevation
+ .space 1 @ Padding
+ .2byte \trigger
+ .2byte \index
+ .space 2 @ Padding
.4byte \script
inc _num_traps
.endm
- .macro coord_weather_event x, y, elevation, weather
- .2byte \x, \y
- .byte \elevation, 0
- .2byte \weather
- .2byte 0, 0
- .4byte 0
- inc _num_traps
+ @ Defines a weather coord event for map data. Any coord event is treated as a weather coord event if its script is NULL
+ .macro coord_weather_event x:req, y:req, elevation:req, weather:req
+ coord_event \x, \y, \elevation, \weather, 0, NULL
.endm
- .macro bg_event x, y, elevation, kind, arg6, arg7
+ @ Defines a generic background event for map data. Mirrors the struct layout of BgEvent in include/global.fieldmap.h
+ @ 'kind' is any BG_EVENT_* constant (see include/constants/event_bg.h).
+ @ 'arg6' and 'arg7' are used differently depending on the bg event type. See macros below
+ .macro bg_event x:req, y:req, elevation:req, kind:req, arg6:req, arg7
.2byte \x, \y
- .byte \elevation, \kind
- .2byte 0
+ .byte \elevation
+ .byte \kind
+ .space 2 @ Padding
.if \kind != BG_EVENT_HIDDEN_ITEM
- .4byte \arg6
+ .4byte \arg6
.else
- .2byte \arg6
- .2byte \arg7
+ .2byte \arg6
+ .2byte \arg7
.endif
inc _num_signs
.endm
- .macro bg_hidden_item_event x, y, height, item, flag
- bg_event \x, \y, \height, BG_EVENT_HIDDEN_ITEM, \item, ((\flag) - FLAG_HIDDEN_ITEMS_START)
+ @ Defines a background sign event for map data. 'facing_dir' is any of the BG_EVENT_PLAYER_FACING_* constants (see include/constants/event_bg.h)
+ .macro bg_sign_event x:req, y:req, elevation:req, facing_dir:req, script:req
+ bg_event \x, \y, \elevation, \facing_dir, \script
.endm
- .macro bg_secret_base_event x, y, height, secret_base_id
- bg_event \x, \y, \height, BG_EVENT_SECRET_BASE, \secret_base_id
+ @ Defines a background hidden item event for map data
+ .macro bg_hidden_item_event x:req, y:req, elevation:req, item:req, flag:req
+ bg_event \x, \y, \elevation, BG_EVENT_HIDDEN_ITEM, \item, ((\flag) - FLAG_HIDDEN_ITEMS_START)
.endm
- .macro map_events npcs, warps, traps, signs
+ @ Defines a background secret base event for map data
+ .macro bg_secret_base_event x:req, y:req, elevation:req, secret_base_id:req
+ bg_event \x, \y, \elevation, BG_EVENT_SECRET_BASE, \secret_base_id
+ .endm
+
+ @ Defines the table of event data for a map. Mirrors the struct layout of MapEvents in include/global.fieldmap.h
+ .macro map_events npcs:req, warps:req, traps:req, signs:req
.byte _num_npcs, _num_warps, _num_traps, _num_signs
.4byte \npcs, \warps, \traps, \signs
reset_map_events
.endm
+ @ Resets the event counters used to track how many events a map has. Run when the events table is created by map_events
.macro reset_map_events
.set _num_npcs, 0
.set _num_warps, 0
@@ -85,23 +112,29 @@
.set _num_signs, 0
.endm
+ @ Initialize the event counters for the first map
reset_map_events
- .equiv connection_down, 1
- .equiv connection_up, 2
- .equiv connection_left, 3
- .equiv connection_right, 4
- .equiv connection_dive, 5
- .equiv connection_emerge, 6
+ @ Directions for connecting maps
+ @ The map.json files will only have e.g. "down" as direction data, and this will be appended to "connection_" by the connection macro
+ .equiv connection_down, CONNECTION_SOUTH
+ .equiv connection_up, CONNECTION_NORTH
+ .equiv connection_left, CONNECTION_WEST
+ .equiv connection_right, CONNECTION_EAST
+ .equiv connection_dive, CONNECTION_DIVE
+ .equiv connection_emerge, CONNECTION_EMERGE
- .macro connection direction, offset, map
- .4byte connection_\direction
+ @ Defines a map connection. Mirrors the struct layout of MapConnection in include/global.fieldmap.h
+ .macro connection direction:req, offset:req, map:req
+ .byte connection_\direction
+ .space 3 @ Padding
.4byte \offset
map \map
- .space 2
+ .space 2 @ Padding
.endm
+ @ Defines the flags for a map header. Mirrors the layout of the bitfield in struct MapHeader in include/global.fieldmap.h
.macro map_header_flags allow_cycling:req, allow_escaping:req, allow_running:req, show_map_name:req
.byte ((\show_map_name & 1) << 3) | ((\allow_running & 1) << 2) | ((\allow_escaping & 1) << 1) | \allow_cycling
.endm
diff --git a/asm/macros/pokemon_data.inc b/asm/macros/pokemon_data.inc
deleted file mode 100644
index ce8ef98ac3..0000000000
--- a/asm/macros/pokemon_data.inc
+++ /dev/null
@@ -1,56 +0,0 @@
- .macro pokedex_entry height, width, text_pointer, pokemon_scale, pokemon_offset, trainer_scale, trainer_offset
- .2byte \height @ in decimeters
- .2byte \width @ in hectograms
- .4byte \text_pointer
- .2byte 0 @ unused
- .2byte \pokemon_scale
- .2byte \pokemon_offset
- .2byte \trainer_scale
- .2byte \trainer_offset
- .2byte 0 @ padding
- .endm
-
- .macro base_stats hp, attack, defense, speed, sp_attack, sp_defense
- .byte \hp
- .byte \attack
- .byte \defense
- .byte \speed
- .byte \sp_attack
- .byte \sp_defense
- .endm
-
- .macro ev_yield hp, attack, defense, speed, sp_attack, sp_defense
- .2byte (\sp_defense << 10) | (\sp_attack << 8) | (\speed << 6) | (\defense << 4) | (\attack << 2) | \hp
- .endm
-
- .macro level_up_move level, move
- .2byte (\level << 9) | \move
- .endm
-
- .macro evo_entry method, parameter, target_species
- .2byte \method
- .2byte \parameter
- .2byte \target_species
- .2byte 0 @ padding
- .endm
-
- .macro empty_evo_entries count
- .fill 8 * \count, 1, 0
- .endm
-
- .macro egg_moves_begin species
- .2byte 20000 + \species
- .endm
-
-@ If the min level equals the max level, only one level argument is needed.
- .macro wild_mon species, min_level, max_level
- .byte \min_level
-
- .ifb \max_level
- .byte \min_level
- .else
- .byte \max_level
- .endif
-
- .2byte \species
- .endm
diff --git a/asm/macros/window.inc b/asm/macros/window.inc
deleted file mode 100644
index a91782bbf8..0000000000
--- a/asm/macros/window.inc
+++ /dev/null
@@ -1,35 +0,0 @@
- .macro window_template bg_id, x, y, width, height, palette, vram_tile_offset
- .byte \bg_id
- .byte \x
- .byte \y
- .byte \width
- .byte \height
- .byte \palette
- .2byte \vram_tile_offset
- .endm
-
- .macro null_window_template
- window_template 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0000
- .endm
-
- .macro glyph_width_func font_id, func
- .4byte \font_id
- .4byte \func
- .endm
-
- .macro keypad_icon tile_offset, width, height
- .2byte \tile_offset
- .byte \width
- .byte \height
- .endm
-
- .macro font_info func, max_glyph_width, glyph_height, glyph_spacing, line_spacing, text_color, shadow_color, bg_color
- .4byte \func
- .byte \max_glyph_width
- .byte \glyph_height
- .byte \glyph_spacing
- .byte \line_spacing
- .byte \text_color << 4 @ low nybble seems unused
- .byte (\shadow_color << 4) | \bg_color
- .2byte 0 @ padding
- .endm
diff --git a/berry_fix/Makefile b/berry_fix/Makefile
deleted file mode 100644
index 464e5f9e9c..0000000000
--- a/berry_fix/Makefile
+++ /dev/null
@@ -1,203 +0,0 @@
-TOOLCHAIN := $(DEVKITARM)
-COMPARE ?= 0
-
-# 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
-endif
-
-PREFIX := arm-none-eabi-
-OBJCOPY := $(PREFIX)objcopy
-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
-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
-
-SHELL := /bin/bash -o pipefail
-
-CPPFLAGS := -I ../tools/agbcc/include -I ../tools/agbcc -iquote include -nostdinc -undef
-
-ROM := berry_fix.gba
-OBJ_DIR := build
-CC1 := ../tools/agbcc/bin/agbcc$(EXE)
-override CFLAGS += -mthumb-interwork -Wimplicit -Wparentheses -Werror -O2 -fhex-asm
-
-
-ELF = $(ROM:.gba=.elf)
-MAP = $(ROM:.gba=.map)
-
-C_SUBDIR = src
-ASM_SUBDIR = asm
-DATA_ASM_SUBDIR = data
-
-C_BUILDDIR = $(OBJ_DIR)/$(C_SUBDIR)
-ASM_BUILDDIR = $(OBJ_DIR)/$(ASM_SUBDIR)
-DATA_ASM_BUILDDIR = $(OBJ_DIR)/$(DATA_ASM_SUBDIR)
-
-ASFLAGS := -mcpu=arm7tdmi
-
-LDFLAGS = -Map ../$(MAP)
-
-SHA1 := $(shell { command -v sha1sum || command -v shasum; } 2>/dev/null) -c
-GFX := ../tools/gbagfx/gbagfx$(EXE)
-AIF := ../tools/aif2pcm/aif2pcm$(EXE)
-MID := ../tools/mid2agb/mid2agb$(EXE)
-SCANINC := ../tools/scaninc/scaninc$(EXE)
-PREPROC := ../tools/preproc/preproc$(EXE)
-RAMSCRGEN := ../tools/ramscrgen/ramscrgen$(EXE)
-FIX := ../tools/gbafix/gbafix$(EXE)
-
-# Clear the default suffixes
-.SUFFIXES:
-# Don't delete intermediate files
-.SECONDARY:
-# Delete files that weren't built properly
-.DELETE_ON_ERROR:
-
-# Secondary expansion is required for dependency variables in object rules.
-.SECONDEXPANSION:
-
-.PHONY: all rom clean compare tidy payload
-
-C_SRCS := $(wildcard $(C_SUBDIR)/*.c $(C_SUBDIR)/*/*.c $(C_SUBDIR)/*/*/*.c)
-C_OBJS := $(patsubst $(C_SUBDIR)/%.c,$(C_BUILDDIR)/%.o,$(C_SRCS))
-
-ASM_SRCS := $(wildcard $(ASM_SUBDIR)/*.s)
-ASM_OBJS := $(patsubst $(ASM_SUBDIR)/%.s,$(ASM_BUILDDIR)/%.o,$(ASM_SRCS))
-
-DATA_ASM_SRCS := $(wildcard $(DATA_ASM_SUBDIR)/*.s)
-DATA_ASM_OBJS := $(patsubst $(DATA_ASM_SUBDIR)/%.s,$(DATA_ASM_BUILDDIR)/%.o,$(DATA_ASM_SRCS))
-
-SONG_SRCS := $(wildcard $(SONG_SUBDIR)/*.s)
-SONG_OBJS := $(patsubst $(SONG_SUBDIR)/%.s,$(SONG_BUILDDIR)/%.o,$(SONG_SRCS))
-
-MID_SRCS := $(wildcard $(MID_SUBDIR)/*.mid)
-MID_OBJS := $(patsubst $(MID_SUBDIR)/%.mid,$(MID_BUILDDIR)/%.o,$(MID_SRCS))
-
-OBJS := $(C_OBJS) $(ASM_OBJS) $(DATA_ASM_OBJS) $(SONG_OBJS) $(MID_OBJS)
-# OBJS_REL := $(patsubst $(OBJ_DIR)/%,%,$(OBJS))
-
-SUBDIRS := $(sort $(dir $(OBJS)))
-
-$(shell mkdir -p $(SUBDIRS))
-
-all: payload rom
- @:
-
-rom: $(ROM)
-ifeq ($(COMPARE),1)
- @$(SHA1) rom.sha1
-endif
-
-# For contributors to make sure a change didn't affect the contents of the ROM.
-compare: ; @$(MAKE) COMPARE=1
-
-clean: tidy
- rm -f sound/direct_sound_samples/*.bin
- rm -f $(SONG_OBJS) $(MID_OBJS) $(MID_SUBDIR)/*.s
- find . \( -iname '*.1bpp' -o -iname '*.4bpp' -o -iname '*.8bpp' -o -iname '*.gbapal' -o -iname '*.lz' -o -iname '*.latfont' -o -iname '*.hwjpnfont' -o -iname '*.fwjpnfont' \) -exec rm {} +
- make -C payload clean
-
-tidy:
- rm -f $(ROM) $(ELF) $(MAP)
- rm -r build/*
- make -C payload tidy
-
-%.s: ;
-%.png: ;
-%.pal: ;
-%.aif: ;
-
-%.1bpp: %.png ; $(GFX) $< $@
-%.4bpp: %.png ; $(GFX) $< $@
-%.8bpp: %.png ; $(GFX) $< $@
-%.gbapal: %.pal ; $(GFX) $< $@
-%.gbapal: %.png ; $(GFX) $< $@
-%.lz: % ; $(GFX) $< $@
-%.rl: % ; $(GFX) $< $@
-
-
-ifeq ($(NODEP),1)
-$(C_BUILDDIR)/%.o: c_dep :=
-else
-$(C_BUILDDIR)/%.o: c_dep = $(shell $(SCANINC) -I include $(C_SUBDIR)/$*.c)
-endif
-
-$(C_BUILDDIR)/%.o : $(C_SUBDIR)/%.c $$(c_dep)
- @$(CPP) $(CPPFLAGS) $< -o $(C_BUILDDIR)/$*.i
- @$(PREPROC) $(C_BUILDDIR)/$*.i charmap.txt | $(CC1) $(CFLAGS) -o $(C_BUILDDIR)/$*.s
- $(AS) $(ASFLAGS) -o $@ $(C_BUILDDIR)/$*.s
-
-ifeq ($(NODEP),1)
-$(ASM_BUILDDIR)/%.o: asm_dep :=
-else
-$(ASM_BUILDDIR)/%.o: asm_dep = $(shell $(SCANINC) $(ASM_SUBDIR)/$*.s)
-endif
-
-$(ASM_BUILDDIR)/%.o: $(ASM_SUBDIR)/%.s $$(asm_dep)
- $(AS) $(ASFLAGS) -o $@ $<
-
-ifeq ($(NODEP),1)
-$(DATA_ASM_BUILDDIR)/%.o: data_dep :=
-else
-$(DATA_ASM_BUILDDIR)/%.o: data_dep = $(shell $(SCANINC) $(DATA_ASM_SUBDIR)/$*.s)
-endif
-
-payload:
- @$(MAKE) -C payload COMPARE=$(COMPARE) TOOLCHAIN=$(TOOLCHAIN) MODERN=$(MODERN)
-
-payload/payload.gba: payload
-
-data/payload.gba.lz: payload/payload.gba
- $(GFX) $< $@ -search 1
-
-$(DATA_ASM_BUILDDIR)/%.o: $(DATA_ASM_SUBDIR)/%.s $$(data_dep)
- $(PREPROC) $< charmap.txt | $(CPP) -I include - | $(AS) $(ASFLAGS) -o $@
-
-$(SONG_BUILDDIR)/%.o: $(SONG_SUBDIR)/%.s
- $(AS) $(ASFLAGS) -I sound -o $@ $<
-
-$(ELF): ld_script.txt $(OBJS)
- cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ../ld_script.txt -o ../$@
-
-$(ROM): $(ELF)
- $(OBJCOPY) -O binary $< $@
- $(FIX) $@ -c$(GAME_CODE) -m$(MAKER_CODE) -r$(REVISION) --silent
-
diff --git a/berry_fix/asm/berry_fix_header.inc b/berry_fix/asm/berry_fix_header.inc
deleted file mode 100644
index 5167d2ff03..0000000000
--- a/berry_fix/asm/berry_fix_header.inc
+++ /dev/null
@@ -1,35 +0,0 @@
- .global BerryFixMBHeaderNintendoLogo
-BerryFixMBHeaderNintendoLogo:
- .space 156
-
-BerryFixMBHeaderGameTitle:
- .space 12
-
- .global BerryFixMBHeaderGameCode
-BerryFixMBHeaderGameCode:
- .space 4
-
-BerryFixMBHeaderMakerCode:
- .space 2
-
-BerryFixMBHeaderMagic:
- .byte 0
-
-BerryFixMBHeaderMainUnitCode:
- .byte 0
-
-BerryFixMBHeaderDeviceType:
- .byte 0
-
-BerryFixMBHeaderReserved1:
- .space 7
-
- .global BerryFixMBHeaderSoftwareVersion
-BerryFixMBHeaderSoftwareVersion:
- .byte 0
-
-BerryFixMBHeaderChecksum:
- .byte 0
-
-BerryFixMBHeaderReserved2:
- .space 2
diff --git a/berry_fix/asm/loader.s b/berry_fix/asm/loader.s
deleted file mode 100644
index a780140785..0000000000
--- a/berry_fix/asm/loader.s
+++ /dev/null
@@ -1,119 +0,0 @@
- .include "../asm/macros/asm.inc"
- .include "../asm/macros/function.inc"
- .include "../constants/gba_constants.inc"
-
- .set SIO_ERROR, 0x0040
- .set SIO_MULTI_BUSY, 0x0080
-
- .set EWRAM_ORIG, 0x02000000
- .set gCode, 0x02010000
- .set PROG_ORIG, 0x00008000
-
- .syntax unified
-
- .text
-
- arm_func_start _start
-_start: @ 0
- b _entry
- arm_func_end _start
-
- .include "asm/berry_fix_header.inc"
-
-@ C0
- .word 0
-
- .global _GPIOPortData
-_GPIOPortData: @ C4
- .2byte 0
-
- .global _GPIOPortDirection
-_GPIOPortDirection: @ C6
- .2byte 0
-
- .global _GPIOPortReadEnable
-_GPIOPortReadEnable: @ C8
- .2byte 0
-
-@ CA
- .2byte 0
-
-@ CC
- .space 0x34
-
- arm_func_start _entry
-_entry: @ 100
- b _send
- arm_func_end _entry
-
- .space 0x1C
-
- arm_func_start _recv
-_recv:
- @ Waits until link cable is no longer busy.
- @ Returns nz if an error has occurred
- @ Otherwise, returns the received short in r1.
- @ Preserves r0
-_120:
- ldrh r1, [r0, 0x8] @ SIOCNT
- tst r1, SIO_MULTI_BUSY
- beq _120
-_12c:
- ldrh r1, [r0, 0x8] @ SIOCNT
- tst r1, SIO_MULTI_BUSY
- bne _12c
- ldrh r1, [r0, 0x8] @ SIOCNT
- tst r1, SIO_ERROR
- bxne lr
- ldrh r1, [r0] @ SIOMULTI0
- bx lr
- arm_func_end _recv
-
- arm_func_start _send
-_send: @ 14c
- ldr r0, =REG_SIOMULTI0
-_150:
- bl _recv
- bne _150
- mov r2, #0
- strh r2, [r0, 0xa] @ SIOMLT_SEND
- cmp r1, #0
- bne _150
- mov r2, 0x8000
-_16c:
- mov r1, #0
-_170:
- strh r1, [r0, 0xa] @ SIOMLT_SEND
- bl _recv
- bne _150
- cmp r1, r2
- bne _16c
- lsr r2, #5
- cmp r1, #0
- bne _170
- ldr r3, =BerryFixMBHeaderGameCode
- ldrh r2, [r3]
- strh r2, [r0, 0xa] @ SIOMLT_SEND
- bl _recv
-_1a0:
- bne _1a0
- cmp r1, r2
- bne _1a0
- ldrh r2, [r3, 0x2]
- strh r2, [r0, 0xa] @ SIOMLT_SEND
- bl _recv
- bne _1a0
- cmp r1, r2
- bne _1a0
- mov r1, #0
- strh r1, [r0, 0xa] @ SIOMLT_SEND
- ldr r0, =_data_2f0
- ldr r1, =gCode
- swi 0x11 << 16
- ldr lr, =gCode
- bx lr
- .pool
- arm_func_end _send
- @ 1f0
-
- .align 2, 0 @ don't pad with nop
diff --git a/berry_fix/charmap.txt b/berry_fix/charmap.txt
deleted file mode 100644
index 1c143ada4f..0000000000
--- a/berry_fix/charmap.txt
+++ /dev/null
@@ -1,1067 +0,0 @@
-' ' = 00
-'À' = 01
-'Á' = 02
-'Â' = 03
-'Ç' = 04
-'È' = 05
-'É' = 06
-'Ê' = 07
-'Ë' = 08
-'Ì' = 09
-'Î' = 0B
-'Ï' = 0C
-'Ò' = 0D
-'Ó' = 0E
-'Ô' = 0F
-'Œ' = 10
-'Ù' = 11
-'Ú' = 12
-'Û' = 13
-'Ñ' = 14
-'ß' = 15
-'à' = 16
-'á' = 17
-'ç' = 19
-'è' = 1A
-'é' = 1B
-'ê' = 1C
-'ë' = 1D
-'ì' = 1E
-'î' = 20
-'ï' = 21
-'ò' = 22
-'ó' = 23
-'ô' = 24
-'œ' = 25
-'ù' = 26
-'ú' = 27
-'û' = 28
-'ñ' = 29
-'º' = 2A
-'ª' = 2B
-SUPER_ER = 2C
-'&' = 2D
-'+' = 2E
-LV = 34
-'=' = 35
-';' = 36
-'¿' = 51
-'¡' = 52
-PK = 53
-PKMN = 53 54
-POKEBLOCK = 55 56 57 58 59
-'Í' = 5A
-'%' = 5B
-'(' = 5C
-')' = 5D
-'â' = 68
-'í' = 6F
-UNK_SPACER = 77
-UP_ARROW = 79
-DOWN_ARROW = 7A
-LEFT_ARROW = 7B
-RIGHT_ARROW = 7C
-'0' = A1
-'1' = A2
-'2' = A3
-'3' = A4
-'4' = A5
-'5' = A6
-'6' = A7
-'7' = A8
-'8' = A9
-'9' = AA
-'!' = AB
-'?' = AC
-'.' = AD
-'-' = AE
-'·' = AF
-'…' = B0
-'“' = B1
-'”' = B2
-'‘' = B3
-'’' = B4
-'♂' = B5
-'♀' = B6
-'¥' = B7
-',' = B8
-'×' = B9
-'/' = BA
-'A' = BB
-'B' = BC
-'C' = BD
-'D' = BE
-'E' = BF
-'F' = C0
-'G' = C1
-'H' = C2
-'I' = C3
-'J' = C4
-'K' = C5
-'L' = C6
-'M' = C7
-'N' = C8
-'O' = C9
-'P' = CA
-'Q' = CB
-'R' = CC
-'S' = CD
-'T' = CE
-'U' = CF
-'V' = D0
-'W' = D1
-'X' = D2
-'Y' = D3
-'Z' = D4
-'a' = D5
-'b' = D6
-'c' = D7
-'d' = D8
-'e' = D9
-'f' = DA
-'g' = DB
-'h' = DC
-'i' = DD
-'j' = DE
-'k' = DF
-'l' = E0
-'m' = E1
-'n' = E2
-'o' = E3
-'p' = E4
-'q' = E5
-'r' = E6
-'s' = E7
-'t' = E8
-'u' = E9
-'v' = EA
-'w' = EB
-'x' = EC
-'y' = ED
-'z' = EE
-'▶' = EF
-':' = F0
-'Ä' = F1
-'Ö' = F2
-'Ü' = F3
-'ä' = F4
-'ö' = F5
-'ü' = F6
-TALL_PLUS = FC 0C FB
-'$' = FF
-
-@ Hiragana
-'あ' = 01
-'い' = 02
-'う' = 03
-'え' = 04
-'お' = 05
-'か' = 06
-'き' = 07
-'く' = 08
-'け' = 09
-'こ' = 0A
-'さ' = 0B
-'し' = 0C
-'す' = 0D
-'せ' = 0E
-'そ' = 0F
-'た' = 10
-'ち' = 11
-'つ' = 12
-'て' = 13
-'と' = 14
-'な' = 15
-'に' = 16
-'ぬ' = 17
-'ね' = 18
-'の' = 19
-'は' = 1A
-'ひ' = 1B
-'ふ' = 1C
-'へ' = 1D
-'ほ' = 1E
-'ま' = 1F
-'み' = 20
-'む' = 21
-'め' = 22
-'も' = 23
-'や' = 24
-'ゆ' = 25
-'よ' = 26
-'ら' = 27
-'り' = 28
-'る' = 29
-'れ' = 2A
-'ろ' = 2B
-'わ' = 2C
-'を' = 2D
-'ん' = 2E
-'ぁ' = 2F
-'ぃ' = 30
-'ぅ' = 31
-'ぇ' = 32
-'ぉ' = 33
-'ゃ' = 34
-'ゅ' = 35
-'ょ' = 36
-'が' = 37
-'ぎ' = 38
-'ぐ' = 39
-'げ' = 3A
-'ご' = 3B
-'ざ' = 3C
-'じ' = 3D
-'ず' = 3E
-'ぜ' = 3F
-'ぞ' = 40
-'だ' = 41
-'ぢ' = 42
-'づ' = 43
-'で' = 44
-'ど' = 45
-'ば' = 46
-'び' = 47
-'ぶ' = 48
-'べ' = 49
-'ぼ' = 4A
-'ぱ' = 4B
-'ぴ' = 4C
-'ぷ' = 4D
-'ぺ' = 4E
-'ぽ' = 4F
-'っ' = 50
-
-@ Katakana
-'ア' = 51
-'イ' = 52
-'ウ' = 53
-'エ' = 54
-'オ' = 55
-'カ' = 56
-'キ' = 57
-'ク' = 58
-'ケ' = 59
-'コ' = 5A
-'サ' = 5B
-'シ' = 5C
-'ス' = 5D
-'セ' = 5E
-'ソ' = 5F
-'タ' = 60
-'チ' = 61
-'ツ' = 62
-'テ' = 63
-'ト' = 64
-'ナ' = 65
-'ニ' = 66
-'ヌ' = 67
-'ネ' = 68
-'ノ' = 69
-'ハ' = 6A
-'ヒ' = 6B
-'フ' = 6C
-'ヘ' = 6D
-'ホ' = 6E
-'マ' = 6F
-'ミ' = 70
-'ム' = 71
-'メ' = 72
-'モ' = 73
-'ヤ' = 74
-'ユ' = 75
-'ヨ' = 76
-'ラ' = 77
-'リ' = 78
-'ル' = 79
-'レ' = 7A
-'ロ' = 7B
-'ワ' = 7C
-'ヲ' = 7D
-'ン' = 7E
-'ァ' = 7F
-'ィ' = 80
-'ゥ' = 81
-'ェ' = 82
-'ォ' = 83
-'ャ' = 84
-'ュ' = 85
-'ョ' = 86
-'ガ' = 87
-'ギ' = 88
-'グ' = 89
-'ゲ' = 8A
-'ゴ' = 8B
-'ザ' = 8C
-'ジ' = 8D
-'ズ' = 8E
-'ゼ' = 8F
-'ゾ' = 90
-'ダ' = 91
-'ヂ' = 92
-'ヅ' = 93
-'デ' = 94
-'ド' = 95
-'バ' = 96
-'ビ' = 97
-'ブ' = 98
-'ベ' = 99
-'ボ' = 9A
-'パ' = 9B
-'ピ' = 9C
-'プ' = 9D
-'ペ' = 9E
-'ポ' = 9F
-'ッ' = A0
-
-@ Japanese punctuation
-' ' = 00
-'!' = AB
-'?' = AC
-'。' = AD
-'ー' = AE
-'⋯' = B0
-
-STRING = FD
-
-@ string placeholders
-PLAYER = FD 01
-STR_VAR_1 = FD 02
-STR_VAR_2 = FD 03
-STR_VAR_3 = FD 04
-KUN = FD 05
-RIVAL = FD 06
-@ version-dependent strings (originally made for Ruby/Sapphire differences)
-@ Emerald uses the Sapphire strings (except for VERSION).
-VERSION = FD 07 @ "EMERALD"
-AQUA = FD 08
-MAGMA = FD 09
-ARCHIE = FD 0A
-MAXIE = FD 0B
-KYOGRE = FD 0C
-GROUDON = FD 0D
-
-@ battle string placeholders
-
-B_BUFF1 = FD 00
-B_BUFF2 = FD 01
-B_COPY_VAR_1 = FD 02
-B_COPY_VAR_2 = FD 03
-B_COPY_VAR_3 = FD 04
-B_PLAYER_MON1_NAME = FD 05
-B_OPPONENT_MON1_NAME = FD 06
-B_PLAYER_MON2_NAME = FD 07
-B_OPPONENT_MON2_NAME = FD 08
-B_LINK_PLAYER_MON1_NAME = FD 09
-B_LINK_OPPONENT_MON1_NAME = FD 0A
-B_LINK_PLAYER_MON2_NAME = FD 0B
-B_LINK_OPPONENT_MON2_NAME = FD 0C
-B_ATK_NAME_WITH_PREFIX_MON1 = FD 0D
-B_ATK_PARTNER_NAME = FD 0E
-B_ATK_NAME_WITH_PREFIX = FD 0F
-B_DEF_NAME_WITH_PREFIX = FD 10
-B_EFF_NAME_WITH_PREFIX = FD 11 @ EFF = short for gEffectBattler
-B_ACTIVE_NAME_WITH_PREFIX = FD 12
-B_SCR_ACTIVE_NAME_WITH_PREFIX = FD 13
-B_CURRENT_MOVE = FD 14
-B_LAST_MOVE = FD 15
-B_LAST_ITEM = FD 16
-B_LAST_ABILITY = FD 17
-B_ATK_ABILITY = FD 18
-B_DEF_ABILITY = FD 19
-B_SCR_ACTIVE_ABILITY = FD 1A
-B_EFF_ABILITY = FD 1B
-B_TRAINER1_CLASS = FD 1C
-B_TRAINER1_NAME = FD 1D
-B_LINK_PLAYER_NAME = FD 1E
-B_LINK_PARTNER_NAME = FD 1F
-B_LINK_OPPONENT1_NAME = FD 20
-B_LINK_OPPONENT2_NAME = FD 21
-B_LINK_SCR_TRAINER_NAME = FD 22
-B_PLAYER_NAME = FD 23
-B_TRAINER1_LOSE_TEXT = FD 24
-B_TRAINER1_WIN_TEXT = FD 25
-B_26 = FD 26
-B_PC_CREATOR_NAME = FD 27
-B_ATK_PREFIX1 = FD 28
-B_DEF_PREFIX1 = FD 29
-B_ATK_PREFIX2 = FD 2A
-B_DEF_PREFIX2 = FD 2B
-B_ATK_PREFIX3 = FD 2C
-B_DEF_PREFIX3 = FD 2D
-B_TRAINER2_CLASS = FD 2E
-B_TRAINER2_NAME = FD 2F
-B_TRAINER2_LOSE_TEXT = FD 30
-B_TRAINER2_WIN_TEXT = FD 31
-B_PARTNER_CLASS = FD 32
-B_PARTNER_NAME = FD 33
-B_BUFF3 = FD 34
-
-@ indicates the end of a town/city name (before " TOWN" or " CITY")
-NAME_END = FC 00
-
-@ special 0xF7 character
-SPECIAL_F7 = F7
-
-@ more text functions
-
-COLOR = FC 01 @ use a color listed below right after
-HIGHLIGHT = FC 02 @ same as fc 01
-SHADOW = FC 03 @ same as fc 01
-COLOR_HIGHLIGHT_SHADOW = FC 04 @ takes 3 bytes
-PALETTE = FC 05 @ used in credits
-SIZE = FC 06 @ note that anything other than "SMALL" is invalid
-UNKNOWN_7 = FC 07
-PAUSE = FC 08 @ manually print the wait byte after this, havent mapped them
-PAUSE_UNTIL_PRESS = FC 09
-WAIT_SE = FC 0A
-PLAY_BGM = FC 0B
-ESCAPE = FC 0C
-SHIFT_TEXT = FC 0D
-UNKNOWN_E = FC 0E
-UNKNOWN_F = FC 0F
-PLAY_SE = FC 10
-CLEAR = FC 11
-SKIP = FC 12
-CLEAR_TO = FC 13
-UNKNOWN_14 = FC 14
-JPN = FC 15
-ENG = FC 16
-PAUSE_MUSIC = FC 17
-RESUME_MUSIC = FC 18
-
-@ colors
-
-TRANSPARENT = 00
-WHITE = 01
-DARK_GRAY = 02
-LIGHT_GRAY = 03
-RED = 04
-LIGHT_RED = 05
-GREEN = 06
-LIGHT_GREEN = 07
-BLUE = 08
-LIGHT_BLUE = 09
-@ these next colors can be set to anything arbitrary at runtime
-@ usually though they'll have the textbox border colors as described below
-DYNAMIC_COLOR1 = 0A @ white
-DYNAMIC_COLOR2 = 0B @ white with a tinge of green
-DYNAMIC_COLOR3 = 0C @ white 2
-DYNAMIC_COLOR4 = 0D @ aquamarine
-DYNAMIC_COLOR5 = 0E @ blue-green
-DYNAMIC_COLOR6 = 0F @ cerulean
-
-@ sound and music
-
-MUS_DUMMY = 00 00
-SE_USE_ITEM = 01 00
-SE_PC_LOGIN = 02 00
-SE_PC_OFF = 03 00
-SE_PC_ON = 04 00
-SE_SELECT = 05 00
-SE_WIN_OPEN = 06 00
-SE_WALL_HIT = 07 00
-SE_DOOR = 08 00
-SE_EXIT = 09 00
-SE_LEDGE = 0A 00
-SE_BIKE_BELL = 0B 00
-SE_NOT_EFFECTIVE = 0C 00
-SE_EFFECTIVE = 0D 00
-SE_SUPER_EFFECTIVE = 0E 00
-SE_BALL_OPEN = 0F 00
-SE_FAINT = 10 00
-SE_FLEE = 11 00
-SE_SLIDING_DOOR = 12 00
-SE_SHIP = 13 00
-SE_BANG = 14 00
-SE_PIN = 15 00
-SE_BOO = 16 00
-SE_BALL = 17 00
-SE_CONTEST_PLACE = 18 00
-SE_A = 19 00
-SE_I = 1A 00
-SE_U = 1B 00
-SE_E = 1C 00
-SE_O = 1D 00
-SE_N = 1E 00
-SE_SUCCESS = 1F 00
-SE_FAILURE = 20 00
-SE_EXP = 21 00
-SE_BIKE_HOP = 22 00
-SE_SWITCH = 23 00
-SE_CLICK = 24 00
-SE_FU_ZAKU = 25 00
-SE_CONTEST_CONDITION_LOSE = 26 00
-SE_LAVARIDGE_FALL_WARP = 27 00
-SE_ICE_STAIRS = 28 00
-SE_ICE_BREAK = 29 00
-SE_ICE_CRACK = 2A 00
-SE_FALL = 2B 00
-SE_UNLOCK = 2C 00
-SE_WARP_IN = 2D 00
-SE_WARP_OUT = 2E 00
-SE_REPEL = 2F 00
-SE_ROTATING_GATE = 30 00
-SE_TRUCK_MOVE = 31 00
-SE_TRUCK_STOP = 32 00
-SE_TRUCK_UNLOAD = 33 00
-SE_TRUCK_DOOR = 34 00
-SE_BERRY_BLENDER = 35 00
-SE_CARD = 36 00
-SE_SAVE = 37 00
-SE_BALL_BOUNCE_1 = 38 00
-SE_BALL_BOUNCE_2 = 39 00
-SE_BALL_BOUNCE_3 = 3A 00
-SE_BALL_BOUNCE_4 = 3B 00
-SE_BALL_TRADE = 3C 00
-SE_BALL_THROW = 3D 00
-SE_NOTE_C = 3E 00
-SE_NOTE_D = 3F 00
-SE_NOTE_E = 40 00
-SE_NOTE_F = 41 00
-SE_NOTE_G = 42 00
-SE_NOTE_A = 43 00
-SE_NOTE_B = 44 00
-SE_NOTE_C_HIGH = 45 00
-SE_PUDDLE = 46 00
-SE_BRIDGE_WALK = 47 00
-SE_ITEMFINDER = 48 00
-SE_DING_DONG = 49 00
-SE_BALLOON_RED = 4A 00
-SE_BALLOON_BLUE = 4B 00
-SE_BALLOON_YELLOW = 4C 00
-SE_BREAKABLE_DOOR = 4D 00
-SE_MUD_BALL = 4E 00
-SE_FIELD_POISON = 4F 00
-SE_ESCALATOR = 50 00
-SE_THUNDERSTORM = 51 00
-SE_THUNDERSTORM_STOP = 52 00
-SE_DOWNPOUR = 53 00
-SE_DOWNPOUR_STOP = 54 00
-SE_RAIN = 55 00
-SE_RAIN_STOP = 56 00
-SE_THUNDER = 57 00
-SE_THUNDER2 = 58 00
-SE_ELEVATOR = 59 00
-SE_LOW_HEALTH = 5A 00
-SE_EXP_MAX = 5B 00
-SE_ROULETTE_BALL = 5C 00
-SE_ROULETTE_BALL2 = 5D 00
-SE_TAILLOW_WING_FLAP = 5E 00
-SE_SHOP = 5F 00
-SE_CONTEST_HEART = 60 00
-SE_CONTEST_CURTAIN_RISE = 61 00
-SE_CONTEST_CURTAIN_FALL = 62 00
-SE_CONTEST_ICON_CHANGE = 63 00
-SE_CONTEST_ICON_CLEAR = 64 00
-SE_CONTEST_MONS_TURN = 65 00
-SE_SHINY = 66 00
-SE_INTRO_BLAST = 67 00
-SE_MUGSHOT = 68 00
-SE_APPLAUSE = 69 00
-SE_VEND = 6A 00
-SE_ORB = 6B 00
-SE_DEX_SCROLL = 6C 00
-SE_DEX_PAGE = 6D 00
-SE_POKENAV_ON = 6E 00
-SE_POKENAV_OFF = 6F 00
-SE_DEX_SEARCH = 70 00
-SE_EGG_HATCH = 71 00
-SE_BALL_TRAY_ENTER = 72 00
-SE_BALL_TRAY_BALL = 73 00
-SE_BALL_TRAY_EXIT = 74 00
-SE_GLASS_FLUTE = 75 00
-SE_M_THUNDERBOLT = 76 00
-SE_M_THUNDERBOLT2 = 77 00
-SE_M_HARDEN = 78 00
-SE_M_NIGHTMARE = 79 00
-SE_M_VITAL_THROW = 7A 00
-SE_M_VITAL_THROW2 = 7B 00
-SE_M_BUBBLE = 7C 00
-SE_M_BUBBLE2 = 7D 00
-SE_M_BUBBLE3 = 7E 00
-SE_M_RAIN_DANCE = 7F 00
-SE_M_CUT = 80 00
-SE_M_STRING_SHOT = 81 00
-SE_M_STRING_SHOT2 = 82 00
-SE_M_ROCK_THROW = 83 00
-SE_M_GUST = 84 00
-SE_M_GUST2 = 85 00
-SE_M_DOUBLE_SLAP = 86 00
-SE_M_DOUBLE_TEAM = 87 00
-SE_M_RAZOR_WIND = 88 00
-SE_M_ICY_WIND = 89 00
-SE_M_THUNDER_WAVE = 8A 00
-SE_M_COMET_PUNCH = 8B 00
-SE_M_MEGA_KICK = 8C 00
-SE_M_MEGA_KICK2 = 8D 00
-SE_M_CRABHAMMER = 8E 00
-SE_M_JUMP_KICK = 8F 00
-SE_M_FLAME_WHEEL = 90 00
-SE_M_FLAME_WHEEL2 = 91 00
-SE_M_FLAMETHROWER = 92 00
-SE_M_FIRE_PUNCH = 93 00
-SE_M_TOXIC = 94 00
-SE_M_SACRED_FIRE = 95 00
-SE_M_SACRED_FIRE2 = 96 00
-SE_M_EMBER = 97 00
-SE_M_TAKE_DOWN = 98 00
-SE_M_BLIZZARD = 99 00
-SE_M_BLIZZARD2 = 9A 00
-SE_M_SCRATCH = 9B 00
-SE_M_VICEGRIP = 9C 00
-SE_M_WING_ATTACK = 9D 00
-SE_M_FLY = 9E 00
-SE_M_SAND_ATTACK = 9F 00
-SE_M_RAZOR_WIND2 = A0 00
-SE_M_BITE = A1 00
-SE_M_HEADBUTT = A2 00
-SE_M_SURF = A3 00
-SE_M_HYDRO_PUMP = A4 00
-SE_M_WHIRLPOOL = A5 00
-SE_M_HORN_ATTACK = A6 00
-SE_M_TAIL_WHIP = A7 00
-SE_M_MIST = A8 00
-SE_M_POISON_POWDER = A9 00
-SE_M_BIND = AA 00
-SE_M_DRAGON_RAGE = AB 00
-SE_M_SING = AC 00
-SE_M_PERISH_SONG = AD 00
-SE_M_PAY_DAY = AE 00
-SE_M_DIG = AF 00
-SE_M_DIZZY_PUNCH = B0 00
-SE_M_SELF_DESTRUCT = B1 00
-SE_M_EXPLOSION = B2 00
-SE_M_ABSORB_2 = B3 00
-SE_M_ABSORB = B4 00
-SE_M_SCREECH = B5 00
-SE_M_BUBBLE_BEAM = B6 00
-SE_M_BUBBLE_BEAM2 = B7 00
-SE_M_SUPERSONIC = B8 00
-SE_M_BELLY_DRUM = B9 00
-SE_M_METRONOME = BA 00
-SE_M_BONEMERANG = BB 00
-SE_M_LICK = BC 00
-SE_M_PSYBEAM = BD 00
-SE_M_FAINT_ATTACK = BE 00
-SE_M_SWORDS_DANCE = BF 00
-SE_M_LEER = C0 00
-SE_M_SWAGGER = C1 00
-SE_M_SWAGGER2 = C2 00
-SE_M_HEAL_BELL = C3 00
-SE_M_CONFUSE_RAY = C4 00
-SE_M_SNORE = C5 00
-SE_M_BRICK_BREAK = C6 00
-SE_M_GIGA_DRAIN = C7 00
-SE_M_PSYBEAM2 = C8 00
-SE_M_SOLAR_BEAM = C9 00
-SE_M_PETAL_DANCE = CA 00
-SE_M_TELEPORT = CB 00
-SE_M_MINIMIZE = CC 00
-SE_M_SKETCH = CD 00
-SE_M_SWIFT = CE 00
-SE_M_REFLECT = CF 00
-SE_M_BARRIER = D0 00
-SE_M_DETECT = D1 00
-SE_M_LOCK_ON = D2 00
-SE_M_MOONLIGHT = D3 00
-SE_M_CHARM = D4 00
-SE_M_CHARGE = D5 00
-SE_M_STRENGTH = D6 00
-SE_M_HYPER_BEAM = D7 00
-SE_M_WATERFALL = D8 00
-SE_M_REVERSAL = D9 00
-SE_M_ACID_ARMOR = DA 00
-SE_M_SANDSTORM = DB 00
-SE_M_TRI_ATTACK = DC 00
-SE_M_TRI_ATTACK2 = DD 00
-SE_M_ENCORE = DE 00
-SE_M_ENCORE2 = DF 00
-SE_M_BATON_PASS = E0 00
-SE_M_MILK_DRINK = E1 00
-SE_M_ATTRACT = E2 00
-SE_M_ATTRACT2 = E3 00
-SE_M_MORNING_SUN = E4 00
-SE_M_FLATTER = E5 00
-SE_M_SAND_TOMB = E6 00
-SE_M_GRASSWHISTLE = E7 00
-SE_M_SPIT_UP = E8 00
-SE_M_DIVE = E9 00
-SE_M_EARTHQUAKE = EA 00
-SE_M_TWISTER = EB 00
-SE_M_SWEET_SCENT = EC 00
-SE_M_YAWN = ED 00
-SE_M_SKY_UPPERCUT = EE 00
-SE_M_STAT_INCREASE = EF 00
-SE_M_HEAT_WAVE = F0 00
-SE_M_UPROAR = F1 00
-SE_M_HAIL = F2 00
-SE_M_COSMIC_POWER = F3 00
-SE_M_TEETER_DANCE = F4 00
-SE_M_STAT_DECREASE = F5 00
-SE_M_HAZE = F6 00
-SE_M_HYPER_BEAM2 = F7 00
-SE_RG_DOOR = F8 00
-SE_RG_CARD_FLIP = F9 00
-SE_RG_CARD_FLIPPING = FA 00
-SE_RG_CARD_OPEN = FB 00
-SE_RG_BAG_CURSOR = FC 00
-SE_RG_BAG_POCKET = FD 00
-SE_RG_BALL_CLICK = FE 00
-SE_RG_SHOP = FF 00
-SE_RG_SS_ANNE_HORN = 00 01
-SE_RG_HELP_OPEN = 01 01
-SE_RG_HELP_CLOSE = 02 01
-SE_RG_HELP_ERROR = 03 01
-SE_RG_DEOXYS_MOVE = 04 01
-SE_RG_POKE_JUMP_SUCCESS = 05 01
-SE_RG_POKE_JUMP_FAILURE = 06 01
-SE_POKENAV_CALL = 07 01
-SE_POKENAV_HANG_UP = 08 01
-SE_ARENA_TIMEUP1 = 09 01
-SE_ARENA_TIMEUP2 = 0A 01
-SE_PIKE_CURTAIN_CLOSE = 0B 01
-SE_PIKE_CURTAIN_OPEN = 0C 01
-SE_SUDOWOODO_SHAKE = 0D 01
-MUS_LITTLEROOT_TEST = 5E 01
-MUS_GSC_ROUTE38 = 5F 01
-MUS_CAUGHT = 60 01
-MUS_VICTORY_WILD = 61 01
-MUS_VICTORY_GYM_LEADER = 62 01
-MUS_VICTORY_LEAGUE = 63 01
-MUS_C_COMM_CENTER = 64 01
-MUS_GSC_PEWTER = 65 01
-MUS_C_VS_LEGEND_BEAST = 66 01
-MUS_ROUTE101 = 67 01
-MUS_ROUTE110 = 68 01
-MUS_ROUTE120 = 69 01
-MUS_PETALBURG = 6A 01
-MUS_OLDALE = 6B 01
-MUS_GYM = 6C 01
-MUS_SURF = 6D 01
-MUS_PETALBURG_WOODS = 6E 01
-MUS_LEVEL_UP = 6F 01
-MUS_HEAL = 70 01
-MUS_OBTAIN_BADGE = 71 01
-MUS_OBTAIN_ITEM = 72 01
-MUS_EVOLVED = 73 01
-MUS_OBTAIN_TMHM = 74 01
-MUS_LILYCOVE_MUSEUM = 75 01
-MUS_ROUTE122 = 76 01
-MUS_OCEANIC_MUSEUM = 77 01
-MUS_EVOLUTION_INTRO = 78 01
-MUS_EVOLUTION = 79 01
-MUS_MOVE_DELETED = 7A 01
-MUS_ENCOUNTER_GIRL = 7B 01
-MUS_ENCOUNTER_MALE = 7C 01
-MUS_ABANDONED_SHIP = 7D 01
-MUS_FORTREE = 7E 01
-MUS_BIRCH_LAB = 7F 01
-MUS_B_TOWER_RS = 80 01
-MUS_ENCOUNTER_SWIMMER = 81 01
-MUS_CAVE_OF_ORIGIN = 82 01
-MUS_OBTAIN_BERRY = 83 01
-MUS_AWAKEN_LEGEND = 84 01
-MUS_SLOTS_JACKPOT = 85 01
-MUS_SLOTS_WIN = 86 01
-MUS_TOO_BAD = 87 01
-MUS_ROULETTE = 88 01
-MUS_LINK_CONTEST_P1 = 89 01
-MUS_LINK_CONTEST_P2 = 8A 01
-MUS_LINK_CONTEST_P3 = 8B 01
-MUS_LINK_CONTEST_P4 = 8C 01
-MUS_ENCOUNTER_RICH = 8D 01
-MUS_VERDANTURF = 8E 01
-MUS_RUSTBORO = 8F 01
-MUS_POKE_CENTER = 90 01
-MUS_ROUTE104 = 91 01
-MUS_ROUTE119 = 92 01
-MUS_CYCLING = 93 01
-MUS_POKE_MART = 94 01
-MUS_LITTLEROOT = 95 01
-MUS_MT_CHIMNEY = 96 01
-MUS_ENCOUNTER_FEMALE = 97 01
-MUS_LILYCOVE = 98 01
-MUS_ROUTE111 = 99 01
-MUS_HELP = 9A 01
-MUS_UNDERWATER = 9B 01
-MUS_VICTORY_TRAINER = 9C 01
-MUS_TITLE = 9D 01
-MUS_INTRO = 9E 01
-MUS_ENCOUNTER_MAY = 9F 01
-MUS_ENCOUNTER_INTENSE = A0 01
-MUS_ENCOUNTER_COOL = A1 01
-MUS_ROUTE113 = A2 01
-MUS_ENCOUNTER_AQUA = A3 01
-MUS_FOLLOW_ME = A4 01
-MUS_ENCOUNTER_BRENDAN = A5 01
-MUS_EVER_GRANDE = A6 01
-MUS_ENCOUNTER_SUSPICIOUS = A7 01
-MUS_VICTORY_AQUA_MAGMA = A8 01
-MUS_CABLE_CAR = A9 01
-MUS_GAME_CORNER = AA 01
-MUS_DEWFORD = AB 01
-MUS_SAFARI_ZONE = AC 01
-MUS_VICTORY_ROAD = AD 01
-MUS_AQUA_MAGMA_HIDEOUT = AE 01
-MUS_SAILING = AF 01
-MUS_MT_PYRE = B0 01
-MUS_SLATEPORT = B1 01
-MUS_MT_PYRE_EXTERIOR = B2 01
-MUS_SCHOOL = B3 01
-MUS_HALL_OF_FAME = B4 01
-MUS_FALLARBOR = B5 01
-MUS_SEALED_CHAMBER = B6 01
-MUS_CONTEST_WINNER = B7 01
-MUS_CONTEST = B8 01
-MUS_ENCOUNTER_MAGMA = B9 01
-MUS_INTRO_BATTLE = BA 01
-MUS_ABNORMAL_WEATHER = BB 01
-MUS_WEATHER_GROUDON = BC 01
-MUS_SOOTOPOLIS = BD 01
-MUS_CONTEST_RESULTS = BE 01
-MUS_HALL_OF_FAME_ROOM = BF 01
-MUS_TRICK_HOUSE = C0 01
-MUS_ENCOUNTER_TWINS = C1 01
-MUS_ENCOUNTER_ELITE_FOUR = C2 01
-MUS_ENCOUNTER_HIKER = C3 01
-MUS_CONTEST_LOBBY = C4 01
-MUS_ENCOUNTER_INTERVIEWER = C5 01
-MUS_ENCOUNTER_CHAMPION = C6 01
-MUS_CREDITS = C7 01
-MUS_END = C8 01
-MUS_B_FRONTIER = C9 01
-MUS_B_ARENA = CA 01
-MUS_OBTAIN_B_POINTS = CB 01
-MUS_REGISTER_MATCH_CALL = CC 01
-MUS_B_PYRAMID = CD 01
-MUS_B_PYRAMID_TOP = CE 01
-MUS_B_PALACE = CF 01
-MUS_RAYQUAZA_APPEARS = D0 01
-MUS_B_TOWER = D1 01
-MUS_OBTAIN_SYMBOL = D2 01
-MUS_B_DOME = D3 01
-MUS_B_PIKE = D4 01
-MUS_B_FACTORY = D5 01
-MUS_VS_RAYQUAZA = D6 01
-MUS_VS_FRONTIER_BRAIN = D7 01
-MUS_VS_MEW = D8 01
-MUS_B_DOME_LOBBY = D9 01
-MUS_VS_WILD = DA 01
-MUS_VS_AQUA_MAGMA = DB 01
-MUS_VS_TRAINER = DC 01
-MUS_VS_GYM_LEADER = DD 01
-MUS_VS_CHAMPION = DE 01
-MUS_VS_REGI = DF 01
-MUS_VS_KYOGRE_GROUDON = E0 01
-MUS_VS_RIVAL = E1 01
-MUS_VS_ELITE_FOUR = E2 01
-MUS_VS_AQUA_MAGMA_LEADER = E3 01
-MUS_RG_FOLLOW_ME = E4 01
-MUS_RG_GAME_CORNER = E5 01
-MUS_RG_ROCKET_HIDEOUT = E6 01
-MUS_RG_GYM = E7 01
-MUS_RG_JIGGLYPUFF = E8 01
-MUS_RG_INTRO_FIGHT = E9 01
-MUS_RG_TITLE = EA 01
-MUS_RG_CINNABAR = EB 01
-MUS_RG_LAVENDER = EC 01
-MUS_RG_HEAL = ED 01
-MUS_RG_CYCLING = EE 01
-MUS_RG_ENCOUNTER_ROCKET = EF 01
-MUS_RG_ENCOUNTER_GIRL = F0 01
-MUS_RG_ENCOUNTER_BOY = F1 01
-MUS_RG_HALL_OF_FAME = F2 01
-MUS_RG_VIRIDIAN_FOREST = F3 01
-MUS_RG_MT_MOON = F4 01
-MUS_RG_POKE_MANSION = F5 01
-MUS_RG_CREDITS = F6 01
-MUS_RG_ROUTE1 = F7 01
-MUS_RG_ROUTE24 = F8 01
-MUS_RG_ROUTE3 = F9 01
-MUS_RG_ROUTE11 = FA 01
-MUS_RG_VICTORY_ROAD = FB 01
-MUS_RG_VS_GYM_LEADER = FC 01
-MUS_RG_VS_TRAINER = FD 01
-MUS_RG_VS_WILD = FE 01
-MUS_RG_VS_CHAMPION = FF 01
-MUS_RG_PALLET = 00 02
-MUS_RG_OAK_LAB = 01 02
-MUS_RG_OAK = 02 02
-MUS_RG_POKE_CENTER = 03 02
-MUS_RG_SS_ANNE = 04 02
-MUS_RG_SURF = 05 02
-MUS_RG_POKE_TOWER = 06 02
-MUS_RG_SILPH = 07 02
-MUS_RG_FUCHSIA = 08 02
-MUS_RG_CELADON = 09 02
-MUS_RG_VICTORY_TRAINER = 0A 02
-MUS_RG_VICTORY_WILD = 0B 02
-MUS_RG_VICTORY_GYM_LEADER = 0C 02
-MUS_RG_VERMILLION = 0D 02
-MUS_RG_PEWTER = 0E 02
-MUS_RG_ENCOUNTER_RIVAL = 0F 02
-MUS_RG_RIVAL_EXIT = 10 02
-MUS_RG_DEX_RATING = 11 02
-MUS_RG_OBTAIN_KEY_ITEM = 12 02
-MUS_RG_CAUGHT_INTRO = 13 02
-MUS_RG_PHOTO = 14 02
-MUS_RG_GAME_FREAK = 15 02
-MUS_RG_CAUGHT = 16 02
-MUS_RG_NEW_GAME_INSTRUCT = 17 02
-MUS_RG_NEW_GAME_INTRO = 18 02
-MUS_RG_NEW_GAME_EXIT = 19 02
-MUS_RG_POKE_JUMP = 1A 02
-MUS_RG_UNION_ROOM = 1B 02
-MUS_RG_NET_CENTER = 1C 02
-MUS_RG_MYSTERY_GIFT = 1D 02
-MUS_RG_BERRY_PICK = 1E 02
-MUS_RG_SEVII_CAVE = 1F 02
-MUS_RG_TEACHY_TV_SHOW = 20 02
-MUS_RG_SEVII_ROUTE = 21 02
-MUS_RG_SEVII_DUNGEON = 22 02
-MUS_RG_SEVII_123 = 23 02
-MUS_RG_SEVII_45 = 24 02
-MUS_RG_SEVII_67 = 25 02
-MUS_RG_POKE_FLUTE = 26 02
-MUS_RG_VS_DEOXYS = 27 02
-MUS_RG_VS_MEWTWO = 28 02
-MUS_RG_VS_LEGEND = 29 02
-MUS_RG_ENCOUNTER_GYM_LEADER = 2A 02
-MUS_RG_ENCOUNTER_DEOXYS = 2B 02
-MUS_RG_TRAINER_TOWER = 2C 02
-MUS_RG_SLOW_PALLET = 2D 02
-MUS_RG_TEACHY_TV_MENU = 2E 02
-PH_TRAP_BLEND = 2F 02
-PH_TRAP_HELD = 30 02
-PH_TRAP_SOLO = 31 02
-PH_FACE_BLEND = 32 02
-PH_FACE_HELD = 33 02
-PH_FACE_SOLO = 34 02
-PH_CLOTH_BLEND = 35 02
-PH_CLOTH_HELD = 36 02
-PH_CLOTH_SOLO = 37 02
-PH_DRESS_BLEND = 38 02
-PH_DRESS_HELD = 39 02
-PH_DRESS_SOLO = 3A 02
-PH_FLEECE_BLEND = 3B 02
-PH_FLEECE_HELD = 3C 02
-PH_FLEECE_SOLO = 3D 02
-PH_KIT_BLEND = 3E 02
-PH_KIT_HELD = 3F 02
-PH_KIT_SOLO = 40 02
-PH_PRICE_BLEND = 41 02
-PH_PRICE_HELD = 42 02
-PH_PRICE_SOLO = 43 02
-PH_LOT_BLEND = 44 02
-PH_LOT_HELD = 45 02
-PH_LOT_SOLO = 46 02
-PH_GOAT_BLEND = 47 02
-PH_GOAT_HELD = 48 02
-PH_GOAT_SOLO = 49 02
-PH_THOUGHT_BLEND = 4A 02
-PH_THOUGHT_HELD = 4B 02
-PH_THOUGHT_SOLO = 4C 02
-PH_CHOICE_BLEND = 4D 02
-PH_CHOICE_HELD = 4E 02
-PH_CHOICE_SOLO = 4F 02
-PH_MOUTH_BLEND = 50 02
-PH_MOUTH_HELD = 51 02
-PH_MOUTH_SOLO = 52 02
-PH_FOOT_BLEND = 53 02
-PH_FOOT_HELD = 54 02
-PH_FOOT_SOLO = 55 02
-PH_GOOSE_BLEND = 56 02
-PH_GOOSE_HELD = 57 02
-PH_GOOSE_SOLO = 58 02
-PH_STRUT_BLEND = 59 02
-PH_STRUT_HELD = 5A 02
-PH_STRUT_SOLO = 5B 02
-PH_CURE_BLEND = 5C 02
-PH_CURE_HELD = 5D 02
-PH_CURE_SOLO = 5E 02
-PH_NURSE_BLEND = 5F 02
-PH_NURSE_HELD = 60 02
-PH_NURSE_SOLO = 61 02
-
-A_BUTTON = F8 00
-B_BUTTON = F8 01
-DPAD_UPDOWN = F8 0A
-DPAD_NONE = F8 0C
-
-UP_ARROW_2 = F9 00
-DOWN_ARROW_2 = F9 01
-LEFT_ARROW_2 = F9 02
-RIGHT_ARROW_2 = F9 03
-PLUS = F9 04
-LV_2 = F9 05
-PP = F9 06
-ID = F9 07
-NO = F9 08
-UNDERSCORE = F9 09
-CIRCLE_1 = F9 0A
-CIRCLE_2 = F9 0B
-CIRCLE_3 = F9 0C
-CIRCLE_4 = F9 0D
-CIRCLE_5 = F9 0E
-CIRCLE_6 = F9 0F
-CIRCLE_7 = F9 10
-CIRCLE_8 = F9 11
-CIRCLE_9 = F9 12
-ROUND_LEFT_PAREN = F9 13
-ROUND_RIGHT_PAREN = F9 14
-CIRCLE_DOT = F9 15
-TRIANGLE = F9 16
-BIG_MULT_X = F9 17
-
-EMOJI_UNDERSCORE = F9 D0
-EMOJI_PIPE = F9 D1
-EMOJI_HIGHBAR = F9 D2
-EMOJI_TILDE = F9 D3
-EMOJI_LEFT_PAREN = F9 D4
-EMOJI_RIGHT_PAREN = F9 D5
-EMOJI_UNION = F9 D6 @ ⊂
-EMOJI_GREATER_THAN = F9 D7
-EMOJI_LEFT_EYE = F9 D8
-EMOJI_RIGHT_EYE = F9 D9
-EMOJI_AT = F9 DA
-EMOJI_SEMICOLON = F9 DB
-EMOJI_PLUS = F9 DC
-EMOJI_MINUS = F9 DD
-EMOJI_EQUALS = F9 DE
-EMOJI_SPIRAL = F9 DF
-EMOJI_TONGUE = F9 E0
-EMOJI_TRIANGLE_OUTLINE = F9 E1
-EMOJI_ACUTE = F9 E2
-EMOJI_GRAVE = F9 E3
-EMOJI_CIRCLE = F9 E4
-EMOJI_TRIANGLE = F9 E5
-EMOJI_SQUARE = F9 E6
-EMOJI_HEART = F9 E7
-EMOJI_MOON = F9 E8
-EMOJI_NOTE = F9 E9
-EMOJI_BALL = F9 EA
-EMOJI_BOLT = F9 EB
-EMOJI_LEAF = F9 EC
-EMOJI_FIRE = F9 ED
-EMOJI_WATER = F9 EE
-EMOJI_LEFT_FIST = F9 EF
-EMOJI_RIGHT_FIST = F9 F0
-EMOJI_BIGWHEEL = F9 F1
-EMOJI_SMALLWHEEL = F9 F2
-EMOJI_SPHERE = F9 F3
-EMOJI_IRRITATED = F9 F4
-EMOJI_MISCHIEVOUS = F9 F5
-EMOJI_HAPPY = F9 F6
-EMOJI_ANGRY = F9 F7
-EMOJI_SURPRISED = F9 F8
-EMOJI_BIGSMILE = F9 F9
-EMOJI_EVIL = F9 FA
-EMOJI_TIRED = F9 FB
-EMOJI_NEUTRAL = F9 FC
-EMOJI_SHOCKED = F9 FD
-EMOJI_BIGANGER = F9 FE
-
-'\l' = FA @ scroll up window text
-'\p' = FB @ new paragraph
-'\n' = FE @ new line
diff --git a/berry_fix/data/data.s b/berry_fix/data/data.s
deleted file mode 100644
index dbb86b13ba..0000000000
--- a/berry_fix/data/data.s
+++ /dev/null
@@ -1,4 +0,0 @@
- .section .rodata
-
-_data_2f0::
- .incbin "data/payload.gba.lz"
diff --git a/berry_fix/ld_script.sed b/berry_fix/ld_script.sed
deleted file mode 100644
index b91542b6f8..0000000000
--- a/berry_fix/ld_script.sed
+++ /dev/null
@@ -1,14 +0,0 @@
-// {
- r sym_ewram.ld
- d
-}
-
-// {
- r sym_bss.ld
- d
-}
-
-// {
- r sym_common.ld
- d
-}
diff --git a/berry_fix/ld_script.txt b/berry_fix/ld_script.txt
deleted file mode 100644
index 2edeaef7cb..0000000000
--- a/berry_fix/ld_script.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-ENTRY(_start)
-
-SECTIONS {
- . = 0x2000000;
-
- .text :
- ALIGN(4)
- {
- asm/loader.o(.text);
- } =0
-
- . += 0x100;
- .rodata :
- ALIGN(4)
- {
- data/data.o(.rodata);
- } =0
-
- . = 0x2010000;
-
- ewram (NOLOAD) :
- ALIGN(4)
- {
- gCode = .;
- }
-
- /DISCARD/ :
- {
- *(*);
- }
-}
diff --git a/berry_fix/payload/Makefile b/berry_fix/payload/Makefile
deleted file mode 100644
index 2779c43ba8..0000000000
--- a/berry_fix/payload/Makefile
+++ /dev/null
@@ -1,209 +0,0 @@
-TOOLCHAIN := $(DEVKITARM)
-COMPARE ?= 0
-
-# 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
-endif
-
-PREFIX := arm-none-eabi-
-OBJCOPY := $(PREFIX)objcopy
-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
-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
-
-ROM := payload.gba
-OBJ_DIR := build
-CC1 := ../../tools/agbcc/bin/agbcc$(EXE)
-override CC1FLAGS += -mthumb-interwork -Wimplicit -Wparentheses -Werror -O2 -fhex-asm
-
-
-ELF = $(ROM:.gba=.elf)
-MAP = $(ROM:.gba=.map)
-
-C_SUBDIR = src
-ASM_SUBDIR = asm
-DATA_ASM_SUBDIR = data
-
-C_BUILDDIR = $(OBJ_DIR)/$(C_SUBDIR)
-ASM_BUILDDIR = $(OBJ_DIR)/$(ASM_SUBDIR)
-DATA_ASM_BUILDDIR = $(OBJ_DIR)/$(DATA_ASM_SUBDIR)
-
-ASFLAGS := -mcpu=arm7tdmi
-
-LDFLAGS = -Map ../$(MAP)
-
-LIB := -L ../../../tools/agbcc/lib -lgcc
-
-SHA1 := $(shell { command -v sha1sum || command -v shasum; } 2>/dev/null) -c
-GFX := ../../tools/gbagfx/gbagfx$(EXE)
-AIF := ../../tools/aif2pcm/aif2pcm$(EXE)
-MID := ../../tools/mid2agb/mid2agb$(EXE)
-SCANINC := ../../tools/scaninc/scaninc$(EXE)
-PREPROC := ../../tools/preproc/preproc$(EXE)
-RAMSCRGEN := ../../tools/ramscrgen/ramscrgen$(EXE)
-FIX := ../../tools/gbafix/gbafix$(EXE)
-
-# Clear the default suffixes
-.SUFFIXES:
-# Don't delete intermediate files
-.SECONDARY:
-# Delete files that weren't built properly
-.DELETE_ON_ERROR:
-
-# Secondary expansion is required for dependency variables in object rules.
-.SECONDEXPANSION:
-
-.PHONY: all rom clean compare tidy
-
-C_SRCS := $(wildcard $(C_SUBDIR)/*.c $(C_SUBDIR)/*/*.c $(C_SUBDIR)/*/*/*.c)
-C_OBJS := $(patsubst $(C_SUBDIR)/%.c,$(C_BUILDDIR)/%.o,$(C_SRCS))
-
-ASM_SRCS := $(wildcard $(ASM_SUBDIR)/*.s)
-ASM_OBJS := $(patsubst $(ASM_SUBDIR)/%.s,$(ASM_BUILDDIR)/%.o,$(ASM_SRCS))
-
-DATA_ASM_SRCS := $(wildcard $(DATA_ASM_SUBDIR)/*.s)
-DATA_ASM_OBJS := $(patsubst $(DATA_ASM_SUBDIR)/%.s,$(DATA_ASM_BUILDDIR)/%.o,$(DATA_ASM_SRCS))
-
-SONG_SRCS := $(wildcard $(SONG_SUBDIR)/*.s)
-SONG_OBJS := $(patsubst $(SONG_SUBDIR)/%.s,$(SONG_BUILDDIR)/%.o,$(SONG_SRCS))
-
-MID_SRCS := $(wildcard $(MID_SUBDIR)/*.mid)
-MID_OBJS := $(patsubst $(MID_SUBDIR)/%.mid,$(MID_BUILDDIR)/%.o,$(MID_SRCS))
-
-OBJS := $(C_OBJS) $(ASM_OBJS) $(DATA_ASM_OBJS) $(SONG_OBJS) $(MID_OBJS)
-# OBJS_REL := $(patsubst $(OBJ_DIR)/%,%,$(OBJS))
-
-SUBDIRS := $(sort $(dir $(OBJS)))
-
-$(shell mkdir -p $(SUBDIRS))
-
-$(C_BUILDDIR)/siirtc.o: CC1FLAGS := -mthumb-interwork
-$(C_BUILDDIR)/agb_flash.o: CC1FLAGS := -O1 -mthumb-interwork
-$(C_BUILDDIR)/agb_flash_1m.o: CC1FLAGS := -O1 -mthumb-interwork
-$(C_BUILDDIR)/agb_flash_mx.o: CC1FLAGS := -O1 -mthumb-interwork
-$(C_BUILDDIR)/agb_flash_le.o: CC1FLAGS := -O1 -mthumb-interwork
-
-all: rom
- @:
-
-rom: $(ROM)
-ifeq ($(COMPARE),1)
- @$(SHA1) rom.sha1
-endif
-
-# For contributors to make sure a change didn't affect the contents of the ROM.
-compare: ; @$(MAKE) COMPARE=1
-
-clean: tidy
- rm -f sound/direct_sound_samples/*.bin
- rm -f $(SONG_OBJS) $(MID_OBJS) $(MID_SUBDIR)/*.s
- find . \( -iname '*.1bpp' -o -iname '*.4bpp' -o -iname '*.8bpp' -o -iname '*.gbapal' -o -iname '*.lz' -o -iname '*.latfont' -o -iname '*.hwjpnfont' -o -iname '*.fwjpnfont' \) -exec rm {} +
-
-tidy:
- rm -f $(ROM) $(ELF) $(MAP)
- rm -r build/*
-
-%.s: ;
-%.png: ;
-%.pal: ;
-%.aif: ;
-
-%.1bpp: %.png ; $(GFX) $< $@
-%.4bpp: %.png ; $(GFX) $< $@
-%.8bpp: %.png ; $(GFX) $< $@
-%.gbapal: %.pal ; $(GFX) $< $@
-%.gbapal: %.png ; $(GFX) $< $@
-%.lz: % ; $(GFX) $< $@
-%.rl: % ; $(GFX) $< $@
-
-
-ifeq ($(NODEP),1)
-$(C_BUILDDIR)/%.o: c_dep :=
-else
-$(C_BUILDDIR)/%.o: c_dep = $(shell $(SCANINC) -I include $(C_SUBDIR)/$*.c)
-endif
-
-$(C_BUILDDIR)/%.o : $(C_SUBDIR)/%.c $$(c_dep)
- @$(CPP) $(CPPFLAGS) $< -o $(C_BUILDDIR)/$*.i
- @$(PREPROC) $(C_BUILDDIR)/$*.i charmap.txt | $(CC1) $(CC1FLAGS) -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)
-$(ASM_BUILDDIR)/%.o: asm_dep :=
-else
-$(ASM_BUILDDIR)/%.o: asm_dep = $(shell $(SCANINC) $(ASM_SUBDIR)/$*.s)
-endif
-
-$(ASM_BUILDDIR)/%.o: $(ASM_SUBDIR)/%.s $$(asm_dep)
- $(AS) $(ASFLAGS) -o $@ $<
-
-ifeq ($(NODEP),1)
-$(DATA_ASM_BUILDDIR)/%.o: data_dep :=
-else
-$(DATA_ASM_BUILDDIR)/%.o: data_dep = $(shell $(SCANINC) $(DATA_ASM_SUBDIR)/$*.s)
-endif
-
-$(DATA_ASM_BUILDDIR)/%.o: $(DATA_ASM_SUBDIR)/%.s $$(data_dep)
- $(PREPROC) $< charmap.txt | $(CPP) -I include | $(AS) $(ASFLAGS) -o $@
-
-$(SONG_BUILDDIR)/%.o: $(SONG_SUBDIR)/%.s
- $(AS) $(ASFLAGS) -I sound -o $@ $<
-
-$(OBJ_DIR)/sym_bss.ld: sym_bss.txt
- $(RAMSCRGEN) .bss $< ENGLISH > $@
-
-$(OBJ_DIR)/sym_common.ld: sym_common.txt $(C_OBJS) $(wildcard common_syms/*.txt)
- $(RAMSCRGEN) COMMON $< ENGLISH -c $(C_BUILDDIR),common_syms > $@
-
-$(OBJ_DIR)/sym_ewram.ld: sym_ewram.txt
- $(RAMSCRGEN) ewram_data $< ENGLISH > $@
-
-$(OBJ_DIR)/ld_script.ld: ld_script.txt $(OBJ_DIR)/sym_bss.ld $(OBJ_DIR)/sym_common.ld $(OBJ_DIR)/sym_ewram.ld
- cd $(OBJ_DIR) && sed -f ../../ld_script.sed ../$< | sed "s#tools/#../tools/#g" > ld_script.ld
-
-$(ELF): $(OBJ_DIR)/ld_script.ld $(OBJS)
- cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ld_script.ld -o ../$@ $(LIB)
-
-$(ROM): $(ELF)
- $(OBJCOPY) -O binary $< $@
-
diff --git a/berry_fix/payload/asm/crt0.s b/berry_fix/payload/asm/crt0.s
deleted file mode 100644
index 2bca006365..0000000000
--- a/berry_fix/payload/asm/crt0.s
+++ /dev/null
@@ -1,82 +0,0 @@
- .include "asm/macros/function.inc"
- .include "constants/gba_constants.inc"
-
- .syntax unified
-
- .text
-
- .arm
- .align 2, 0
- .global Init
-Init:
- mov r0, #PSR_IRQ_MODE
- msr cpsr_cf, r0
- ldr sp, sp_irq
- mov r0, #PSR_SYS_MODE
- msr cpsr_cf, r0
- ldr sp, sp_sys
- ldr r1, =INTR_VECTOR
- ldr r0, =IntrMain
- str r0, [r1]
- ldr r1, =AgbMain + 1
- mov lr, pc
- bx r1
- b Init
-
- .align 2, 0
-sp_sys: .word IWRAM_END - 0x100
-sp_irq: .word IWRAM_END - 0x60
-
- .pool
- .size Init, .-Init
-
- .arm
- .align 2, 0
- .global IntrMain
-IntrMain: @ 0x2010048
- mov ip, #REG_BASE
- add r3, ip, #OFFSET_REG_IE
- ldr r2, [r3]
- and r1, r2, r2, lsr #16
- mov r2, #0
- ands r0, r1, #0x2000
- strbne r0, [r3, #-0x17c]
-_02010064:
- bne _02010064
- ands r0, r1, #0xc0
- bne _020100DC
- add r2, r2, #4
- ands r0, r1, #1
- strhne r0, [ip, #-8]
- bne _020100DC
- add r2, r2, #4
- ands r0, r1, #2
- bne _020100DC
- add r2, r2, #4
- ands r0, r1, #4
- bne _020100DC
- add r2, r2, #4
- ands r0, r1, #0x100
- bne _020100DC
- add r2, r2, #4
- ands r0, r1, #0x200
- bne _020100DC
- add r2, r2, #4
- ands r0, r1, #0x400
- bne _020100DC
- add r2, r2, #4
- ands r0, r1, #0x800
- bne _020100DC
- add r2, r2, #4
- ands r0, r1, #0x1000
- bne _020100DC
- add r2, r2, #4
- ands r0, r1, #8
-_020100DC:
- strh r0, [r3, #2]
- ldr r1, =gIntrTable
- add r1, r1, r2
- ldr r0, [r1]
- bx r0
- .pool
- .size IntrMain, .-IntrMain
diff --git a/berry_fix/payload/asm/libagbsyscall.s b/berry_fix/payload/asm/libagbsyscall.s
deleted file mode 100644
index 9548e80d28..0000000000
--- a/berry_fix/payload/asm/libagbsyscall.s
+++ /dev/null
@@ -1,46 +0,0 @@
- .include "asm/macros/function.inc"
- .include "constants/gba_constants.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start CpuSet
-CpuSet: @ 81E3B64
- svc 0xB
- bx lr
- thumb_func_end CpuSet
-
- thumb_func_start Div
-Div: @ 81E3B68
- svc 0x6
- bx lr
- thumb_func_end Div
-
- thumb_func_start Mod
-Mod:
- svc 0x6
- adds r0, r1, 0
- bx lr
- thumb_func_end Mod
-
- thumb_func_start LZ77UnCompVram
-LZ77UnCompVram: @ 81E3B6C
- svc 0x12
- bx lr
- thumb_func_end LZ77UnCompVram
-
- thumb_func_start RegisterRamReset
-RegisterRamReset: @ 81E3B80
- svc 0x1
- bx lr
- thumb_func_end RegisterRamReset
-
- thumb_func_start VBlankIntrWait
-VBlankIntrWait: @ 81E3BA0
- movs r2, 0
- svc 0x5
- bx lr
- thumb_func_end VBlankIntrWait
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/berry_fix/payload/asm/macros/function.inc b/berry_fix/payload/asm/macros/function.inc
deleted file mode 100644
index 67fb373a80..0000000000
--- a/berry_fix/payload/asm/macros/function.inc
+++ /dev/null
@@ -1,29 +0,0 @@
- .macro arm_func_start name
- .align 2, 0
- .global \name
- .arm
- .type \name, function
- .endm
-
- .macro arm_func_end name
- .size \name, .-\name
- .endm
-
- .macro thumb_func_start name
- .align 2, 0
- .global \name
- .thumb
- .thumb_func
- .type \name, function
- .endm
-
- .macro non_word_aligned_thumb_func_start name
- .global \name
- .thumb
- .thumb_func
- .type \name, function
- .endm
-
- .macro thumb_func_end name
- .size \name, .-\name
- .endm
diff --git a/berry_fix/payload/charmap.txt b/berry_fix/payload/charmap.txt
deleted file mode 100644
index 1c143ada4f..0000000000
--- a/berry_fix/payload/charmap.txt
+++ /dev/null
@@ -1,1067 +0,0 @@
-' ' = 00
-'À' = 01
-'Á' = 02
-'Â' = 03
-'Ç' = 04
-'È' = 05
-'É' = 06
-'Ê' = 07
-'Ë' = 08
-'Ì' = 09
-'Î' = 0B
-'Ï' = 0C
-'Ò' = 0D
-'Ó' = 0E
-'Ô' = 0F
-'Œ' = 10
-'Ù' = 11
-'Ú' = 12
-'Û' = 13
-'Ñ' = 14
-'ß' = 15
-'à' = 16
-'á' = 17
-'ç' = 19
-'è' = 1A
-'é' = 1B
-'ê' = 1C
-'ë' = 1D
-'ì' = 1E
-'î' = 20
-'ï' = 21
-'ò' = 22
-'ó' = 23
-'ô' = 24
-'œ' = 25
-'ù' = 26
-'ú' = 27
-'û' = 28
-'ñ' = 29
-'º' = 2A
-'ª' = 2B
-SUPER_ER = 2C
-'&' = 2D
-'+' = 2E
-LV = 34
-'=' = 35
-';' = 36
-'¿' = 51
-'¡' = 52
-PK = 53
-PKMN = 53 54
-POKEBLOCK = 55 56 57 58 59
-'Í' = 5A
-'%' = 5B
-'(' = 5C
-')' = 5D
-'â' = 68
-'í' = 6F
-UNK_SPACER = 77
-UP_ARROW = 79
-DOWN_ARROW = 7A
-LEFT_ARROW = 7B
-RIGHT_ARROW = 7C
-'0' = A1
-'1' = A2
-'2' = A3
-'3' = A4
-'4' = A5
-'5' = A6
-'6' = A7
-'7' = A8
-'8' = A9
-'9' = AA
-'!' = AB
-'?' = AC
-'.' = AD
-'-' = AE
-'·' = AF
-'…' = B0
-'“' = B1
-'”' = B2
-'‘' = B3
-'’' = B4
-'♂' = B5
-'♀' = B6
-'¥' = B7
-',' = B8
-'×' = B9
-'/' = BA
-'A' = BB
-'B' = BC
-'C' = BD
-'D' = BE
-'E' = BF
-'F' = C0
-'G' = C1
-'H' = C2
-'I' = C3
-'J' = C4
-'K' = C5
-'L' = C6
-'M' = C7
-'N' = C8
-'O' = C9
-'P' = CA
-'Q' = CB
-'R' = CC
-'S' = CD
-'T' = CE
-'U' = CF
-'V' = D0
-'W' = D1
-'X' = D2
-'Y' = D3
-'Z' = D4
-'a' = D5
-'b' = D6
-'c' = D7
-'d' = D8
-'e' = D9
-'f' = DA
-'g' = DB
-'h' = DC
-'i' = DD
-'j' = DE
-'k' = DF
-'l' = E0
-'m' = E1
-'n' = E2
-'o' = E3
-'p' = E4
-'q' = E5
-'r' = E6
-'s' = E7
-'t' = E8
-'u' = E9
-'v' = EA
-'w' = EB
-'x' = EC
-'y' = ED
-'z' = EE
-'▶' = EF
-':' = F0
-'Ä' = F1
-'Ö' = F2
-'Ü' = F3
-'ä' = F4
-'ö' = F5
-'ü' = F6
-TALL_PLUS = FC 0C FB
-'$' = FF
-
-@ Hiragana
-'あ' = 01
-'い' = 02
-'う' = 03
-'え' = 04
-'お' = 05
-'か' = 06
-'き' = 07
-'く' = 08
-'け' = 09
-'こ' = 0A
-'さ' = 0B
-'し' = 0C
-'す' = 0D
-'せ' = 0E
-'そ' = 0F
-'た' = 10
-'ち' = 11
-'つ' = 12
-'て' = 13
-'と' = 14
-'な' = 15
-'に' = 16
-'ぬ' = 17
-'ね' = 18
-'の' = 19
-'は' = 1A
-'ひ' = 1B
-'ふ' = 1C
-'へ' = 1D
-'ほ' = 1E
-'ま' = 1F
-'み' = 20
-'む' = 21
-'め' = 22
-'も' = 23
-'や' = 24
-'ゆ' = 25
-'よ' = 26
-'ら' = 27
-'り' = 28
-'る' = 29
-'れ' = 2A
-'ろ' = 2B
-'わ' = 2C
-'を' = 2D
-'ん' = 2E
-'ぁ' = 2F
-'ぃ' = 30
-'ぅ' = 31
-'ぇ' = 32
-'ぉ' = 33
-'ゃ' = 34
-'ゅ' = 35
-'ょ' = 36
-'が' = 37
-'ぎ' = 38
-'ぐ' = 39
-'げ' = 3A
-'ご' = 3B
-'ざ' = 3C
-'じ' = 3D
-'ず' = 3E
-'ぜ' = 3F
-'ぞ' = 40
-'だ' = 41
-'ぢ' = 42
-'づ' = 43
-'で' = 44
-'ど' = 45
-'ば' = 46
-'び' = 47
-'ぶ' = 48
-'べ' = 49
-'ぼ' = 4A
-'ぱ' = 4B
-'ぴ' = 4C
-'ぷ' = 4D
-'ぺ' = 4E
-'ぽ' = 4F
-'っ' = 50
-
-@ Katakana
-'ア' = 51
-'イ' = 52
-'ウ' = 53
-'エ' = 54
-'オ' = 55
-'カ' = 56
-'キ' = 57
-'ク' = 58
-'ケ' = 59
-'コ' = 5A
-'サ' = 5B
-'シ' = 5C
-'ス' = 5D
-'セ' = 5E
-'ソ' = 5F
-'タ' = 60
-'チ' = 61
-'ツ' = 62
-'テ' = 63
-'ト' = 64
-'ナ' = 65
-'ニ' = 66
-'ヌ' = 67
-'ネ' = 68
-'ノ' = 69
-'ハ' = 6A
-'ヒ' = 6B
-'フ' = 6C
-'ヘ' = 6D
-'ホ' = 6E
-'マ' = 6F
-'ミ' = 70
-'ム' = 71
-'メ' = 72
-'モ' = 73
-'ヤ' = 74
-'ユ' = 75
-'ヨ' = 76
-'ラ' = 77
-'リ' = 78
-'ル' = 79
-'レ' = 7A
-'ロ' = 7B
-'ワ' = 7C
-'ヲ' = 7D
-'ン' = 7E
-'ァ' = 7F
-'ィ' = 80
-'ゥ' = 81
-'ェ' = 82
-'ォ' = 83
-'ャ' = 84
-'ュ' = 85
-'ョ' = 86
-'ガ' = 87
-'ギ' = 88
-'グ' = 89
-'ゲ' = 8A
-'ゴ' = 8B
-'ザ' = 8C
-'ジ' = 8D
-'ズ' = 8E
-'ゼ' = 8F
-'ゾ' = 90
-'ダ' = 91
-'ヂ' = 92
-'ヅ' = 93
-'デ' = 94
-'ド' = 95
-'バ' = 96
-'ビ' = 97
-'ブ' = 98
-'ベ' = 99
-'ボ' = 9A
-'パ' = 9B
-'ピ' = 9C
-'プ' = 9D
-'ペ' = 9E
-'ポ' = 9F
-'ッ' = A0
-
-@ Japanese punctuation
-' ' = 00
-'!' = AB
-'?' = AC
-'。' = AD
-'ー' = AE
-'⋯' = B0
-
-STRING = FD
-
-@ string placeholders
-PLAYER = FD 01
-STR_VAR_1 = FD 02
-STR_VAR_2 = FD 03
-STR_VAR_3 = FD 04
-KUN = FD 05
-RIVAL = FD 06
-@ version-dependent strings (originally made for Ruby/Sapphire differences)
-@ Emerald uses the Sapphire strings (except for VERSION).
-VERSION = FD 07 @ "EMERALD"
-AQUA = FD 08
-MAGMA = FD 09
-ARCHIE = FD 0A
-MAXIE = FD 0B
-KYOGRE = FD 0C
-GROUDON = FD 0D
-
-@ battle string placeholders
-
-B_BUFF1 = FD 00
-B_BUFF2 = FD 01
-B_COPY_VAR_1 = FD 02
-B_COPY_VAR_2 = FD 03
-B_COPY_VAR_3 = FD 04
-B_PLAYER_MON1_NAME = FD 05
-B_OPPONENT_MON1_NAME = FD 06
-B_PLAYER_MON2_NAME = FD 07
-B_OPPONENT_MON2_NAME = FD 08
-B_LINK_PLAYER_MON1_NAME = FD 09
-B_LINK_OPPONENT_MON1_NAME = FD 0A
-B_LINK_PLAYER_MON2_NAME = FD 0B
-B_LINK_OPPONENT_MON2_NAME = FD 0C
-B_ATK_NAME_WITH_PREFIX_MON1 = FD 0D
-B_ATK_PARTNER_NAME = FD 0E
-B_ATK_NAME_WITH_PREFIX = FD 0F
-B_DEF_NAME_WITH_PREFIX = FD 10
-B_EFF_NAME_WITH_PREFIX = FD 11 @ EFF = short for gEffectBattler
-B_ACTIVE_NAME_WITH_PREFIX = FD 12
-B_SCR_ACTIVE_NAME_WITH_PREFIX = FD 13
-B_CURRENT_MOVE = FD 14
-B_LAST_MOVE = FD 15
-B_LAST_ITEM = FD 16
-B_LAST_ABILITY = FD 17
-B_ATK_ABILITY = FD 18
-B_DEF_ABILITY = FD 19
-B_SCR_ACTIVE_ABILITY = FD 1A
-B_EFF_ABILITY = FD 1B
-B_TRAINER1_CLASS = FD 1C
-B_TRAINER1_NAME = FD 1D
-B_LINK_PLAYER_NAME = FD 1E
-B_LINK_PARTNER_NAME = FD 1F
-B_LINK_OPPONENT1_NAME = FD 20
-B_LINK_OPPONENT2_NAME = FD 21
-B_LINK_SCR_TRAINER_NAME = FD 22
-B_PLAYER_NAME = FD 23
-B_TRAINER1_LOSE_TEXT = FD 24
-B_TRAINER1_WIN_TEXT = FD 25
-B_26 = FD 26
-B_PC_CREATOR_NAME = FD 27
-B_ATK_PREFIX1 = FD 28
-B_DEF_PREFIX1 = FD 29
-B_ATK_PREFIX2 = FD 2A
-B_DEF_PREFIX2 = FD 2B
-B_ATK_PREFIX3 = FD 2C
-B_DEF_PREFIX3 = FD 2D
-B_TRAINER2_CLASS = FD 2E
-B_TRAINER2_NAME = FD 2F
-B_TRAINER2_LOSE_TEXT = FD 30
-B_TRAINER2_WIN_TEXT = FD 31
-B_PARTNER_CLASS = FD 32
-B_PARTNER_NAME = FD 33
-B_BUFF3 = FD 34
-
-@ indicates the end of a town/city name (before " TOWN" or " CITY")
-NAME_END = FC 00
-
-@ special 0xF7 character
-SPECIAL_F7 = F7
-
-@ more text functions
-
-COLOR = FC 01 @ use a color listed below right after
-HIGHLIGHT = FC 02 @ same as fc 01
-SHADOW = FC 03 @ same as fc 01
-COLOR_HIGHLIGHT_SHADOW = FC 04 @ takes 3 bytes
-PALETTE = FC 05 @ used in credits
-SIZE = FC 06 @ note that anything other than "SMALL" is invalid
-UNKNOWN_7 = FC 07
-PAUSE = FC 08 @ manually print the wait byte after this, havent mapped them
-PAUSE_UNTIL_PRESS = FC 09
-WAIT_SE = FC 0A
-PLAY_BGM = FC 0B
-ESCAPE = FC 0C
-SHIFT_TEXT = FC 0D
-UNKNOWN_E = FC 0E
-UNKNOWN_F = FC 0F
-PLAY_SE = FC 10
-CLEAR = FC 11
-SKIP = FC 12
-CLEAR_TO = FC 13
-UNKNOWN_14 = FC 14
-JPN = FC 15
-ENG = FC 16
-PAUSE_MUSIC = FC 17
-RESUME_MUSIC = FC 18
-
-@ colors
-
-TRANSPARENT = 00
-WHITE = 01
-DARK_GRAY = 02
-LIGHT_GRAY = 03
-RED = 04
-LIGHT_RED = 05
-GREEN = 06
-LIGHT_GREEN = 07
-BLUE = 08
-LIGHT_BLUE = 09
-@ these next colors can be set to anything arbitrary at runtime
-@ usually though they'll have the textbox border colors as described below
-DYNAMIC_COLOR1 = 0A @ white
-DYNAMIC_COLOR2 = 0B @ white with a tinge of green
-DYNAMIC_COLOR3 = 0C @ white 2
-DYNAMIC_COLOR4 = 0D @ aquamarine
-DYNAMIC_COLOR5 = 0E @ blue-green
-DYNAMIC_COLOR6 = 0F @ cerulean
-
-@ sound and music
-
-MUS_DUMMY = 00 00
-SE_USE_ITEM = 01 00
-SE_PC_LOGIN = 02 00
-SE_PC_OFF = 03 00
-SE_PC_ON = 04 00
-SE_SELECT = 05 00
-SE_WIN_OPEN = 06 00
-SE_WALL_HIT = 07 00
-SE_DOOR = 08 00
-SE_EXIT = 09 00
-SE_LEDGE = 0A 00
-SE_BIKE_BELL = 0B 00
-SE_NOT_EFFECTIVE = 0C 00
-SE_EFFECTIVE = 0D 00
-SE_SUPER_EFFECTIVE = 0E 00
-SE_BALL_OPEN = 0F 00
-SE_FAINT = 10 00
-SE_FLEE = 11 00
-SE_SLIDING_DOOR = 12 00
-SE_SHIP = 13 00
-SE_BANG = 14 00
-SE_PIN = 15 00
-SE_BOO = 16 00
-SE_BALL = 17 00
-SE_CONTEST_PLACE = 18 00
-SE_A = 19 00
-SE_I = 1A 00
-SE_U = 1B 00
-SE_E = 1C 00
-SE_O = 1D 00
-SE_N = 1E 00
-SE_SUCCESS = 1F 00
-SE_FAILURE = 20 00
-SE_EXP = 21 00
-SE_BIKE_HOP = 22 00
-SE_SWITCH = 23 00
-SE_CLICK = 24 00
-SE_FU_ZAKU = 25 00
-SE_CONTEST_CONDITION_LOSE = 26 00
-SE_LAVARIDGE_FALL_WARP = 27 00
-SE_ICE_STAIRS = 28 00
-SE_ICE_BREAK = 29 00
-SE_ICE_CRACK = 2A 00
-SE_FALL = 2B 00
-SE_UNLOCK = 2C 00
-SE_WARP_IN = 2D 00
-SE_WARP_OUT = 2E 00
-SE_REPEL = 2F 00
-SE_ROTATING_GATE = 30 00
-SE_TRUCK_MOVE = 31 00
-SE_TRUCK_STOP = 32 00
-SE_TRUCK_UNLOAD = 33 00
-SE_TRUCK_DOOR = 34 00
-SE_BERRY_BLENDER = 35 00
-SE_CARD = 36 00
-SE_SAVE = 37 00
-SE_BALL_BOUNCE_1 = 38 00
-SE_BALL_BOUNCE_2 = 39 00
-SE_BALL_BOUNCE_3 = 3A 00
-SE_BALL_BOUNCE_4 = 3B 00
-SE_BALL_TRADE = 3C 00
-SE_BALL_THROW = 3D 00
-SE_NOTE_C = 3E 00
-SE_NOTE_D = 3F 00
-SE_NOTE_E = 40 00
-SE_NOTE_F = 41 00
-SE_NOTE_G = 42 00
-SE_NOTE_A = 43 00
-SE_NOTE_B = 44 00
-SE_NOTE_C_HIGH = 45 00
-SE_PUDDLE = 46 00
-SE_BRIDGE_WALK = 47 00
-SE_ITEMFINDER = 48 00
-SE_DING_DONG = 49 00
-SE_BALLOON_RED = 4A 00
-SE_BALLOON_BLUE = 4B 00
-SE_BALLOON_YELLOW = 4C 00
-SE_BREAKABLE_DOOR = 4D 00
-SE_MUD_BALL = 4E 00
-SE_FIELD_POISON = 4F 00
-SE_ESCALATOR = 50 00
-SE_THUNDERSTORM = 51 00
-SE_THUNDERSTORM_STOP = 52 00
-SE_DOWNPOUR = 53 00
-SE_DOWNPOUR_STOP = 54 00
-SE_RAIN = 55 00
-SE_RAIN_STOP = 56 00
-SE_THUNDER = 57 00
-SE_THUNDER2 = 58 00
-SE_ELEVATOR = 59 00
-SE_LOW_HEALTH = 5A 00
-SE_EXP_MAX = 5B 00
-SE_ROULETTE_BALL = 5C 00
-SE_ROULETTE_BALL2 = 5D 00
-SE_TAILLOW_WING_FLAP = 5E 00
-SE_SHOP = 5F 00
-SE_CONTEST_HEART = 60 00
-SE_CONTEST_CURTAIN_RISE = 61 00
-SE_CONTEST_CURTAIN_FALL = 62 00
-SE_CONTEST_ICON_CHANGE = 63 00
-SE_CONTEST_ICON_CLEAR = 64 00
-SE_CONTEST_MONS_TURN = 65 00
-SE_SHINY = 66 00
-SE_INTRO_BLAST = 67 00
-SE_MUGSHOT = 68 00
-SE_APPLAUSE = 69 00
-SE_VEND = 6A 00
-SE_ORB = 6B 00
-SE_DEX_SCROLL = 6C 00
-SE_DEX_PAGE = 6D 00
-SE_POKENAV_ON = 6E 00
-SE_POKENAV_OFF = 6F 00
-SE_DEX_SEARCH = 70 00
-SE_EGG_HATCH = 71 00
-SE_BALL_TRAY_ENTER = 72 00
-SE_BALL_TRAY_BALL = 73 00
-SE_BALL_TRAY_EXIT = 74 00
-SE_GLASS_FLUTE = 75 00
-SE_M_THUNDERBOLT = 76 00
-SE_M_THUNDERBOLT2 = 77 00
-SE_M_HARDEN = 78 00
-SE_M_NIGHTMARE = 79 00
-SE_M_VITAL_THROW = 7A 00
-SE_M_VITAL_THROW2 = 7B 00
-SE_M_BUBBLE = 7C 00
-SE_M_BUBBLE2 = 7D 00
-SE_M_BUBBLE3 = 7E 00
-SE_M_RAIN_DANCE = 7F 00
-SE_M_CUT = 80 00
-SE_M_STRING_SHOT = 81 00
-SE_M_STRING_SHOT2 = 82 00
-SE_M_ROCK_THROW = 83 00
-SE_M_GUST = 84 00
-SE_M_GUST2 = 85 00
-SE_M_DOUBLE_SLAP = 86 00
-SE_M_DOUBLE_TEAM = 87 00
-SE_M_RAZOR_WIND = 88 00
-SE_M_ICY_WIND = 89 00
-SE_M_THUNDER_WAVE = 8A 00
-SE_M_COMET_PUNCH = 8B 00
-SE_M_MEGA_KICK = 8C 00
-SE_M_MEGA_KICK2 = 8D 00
-SE_M_CRABHAMMER = 8E 00
-SE_M_JUMP_KICK = 8F 00
-SE_M_FLAME_WHEEL = 90 00
-SE_M_FLAME_WHEEL2 = 91 00
-SE_M_FLAMETHROWER = 92 00
-SE_M_FIRE_PUNCH = 93 00
-SE_M_TOXIC = 94 00
-SE_M_SACRED_FIRE = 95 00
-SE_M_SACRED_FIRE2 = 96 00
-SE_M_EMBER = 97 00
-SE_M_TAKE_DOWN = 98 00
-SE_M_BLIZZARD = 99 00
-SE_M_BLIZZARD2 = 9A 00
-SE_M_SCRATCH = 9B 00
-SE_M_VICEGRIP = 9C 00
-SE_M_WING_ATTACK = 9D 00
-SE_M_FLY = 9E 00
-SE_M_SAND_ATTACK = 9F 00
-SE_M_RAZOR_WIND2 = A0 00
-SE_M_BITE = A1 00
-SE_M_HEADBUTT = A2 00
-SE_M_SURF = A3 00
-SE_M_HYDRO_PUMP = A4 00
-SE_M_WHIRLPOOL = A5 00
-SE_M_HORN_ATTACK = A6 00
-SE_M_TAIL_WHIP = A7 00
-SE_M_MIST = A8 00
-SE_M_POISON_POWDER = A9 00
-SE_M_BIND = AA 00
-SE_M_DRAGON_RAGE = AB 00
-SE_M_SING = AC 00
-SE_M_PERISH_SONG = AD 00
-SE_M_PAY_DAY = AE 00
-SE_M_DIG = AF 00
-SE_M_DIZZY_PUNCH = B0 00
-SE_M_SELF_DESTRUCT = B1 00
-SE_M_EXPLOSION = B2 00
-SE_M_ABSORB_2 = B3 00
-SE_M_ABSORB = B4 00
-SE_M_SCREECH = B5 00
-SE_M_BUBBLE_BEAM = B6 00
-SE_M_BUBBLE_BEAM2 = B7 00
-SE_M_SUPERSONIC = B8 00
-SE_M_BELLY_DRUM = B9 00
-SE_M_METRONOME = BA 00
-SE_M_BONEMERANG = BB 00
-SE_M_LICK = BC 00
-SE_M_PSYBEAM = BD 00
-SE_M_FAINT_ATTACK = BE 00
-SE_M_SWORDS_DANCE = BF 00
-SE_M_LEER = C0 00
-SE_M_SWAGGER = C1 00
-SE_M_SWAGGER2 = C2 00
-SE_M_HEAL_BELL = C3 00
-SE_M_CONFUSE_RAY = C4 00
-SE_M_SNORE = C5 00
-SE_M_BRICK_BREAK = C6 00
-SE_M_GIGA_DRAIN = C7 00
-SE_M_PSYBEAM2 = C8 00
-SE_M_SOLAR_BEAM = C9 00
-SE_M_PETAL_DANCE = CA 00
-SE_M_TELEPORT = CB 00
-SE_M_MINIMIZE = CC 00
-SE_M_SKETCH = CD 00
-SE_M_SWIFT = CE 00
-SE_M_REFLECT = CF 00
-SE_M_BARRIER = D0 00
-SE_M_DETECT = D1 00
-SE_M_LOCK_ON = D2 00
-SE_M_MOONLIGHT = D3 00
-SE_M_CHARM = D4 00
-SE_M_CHARGE = D5 00
-SE_M_STRENGTH = D6 00
-SE_M_HYPER_BEAM = D7 00
-SE_M_WATERFALL = D8 00
-SE_M_REVERSAL = D9 00
-SE_M_ACID_ARMOR = DA 00
-SE_M_SANDSTORM = DB 00
-SE_M_TRI_ATTACK = DC 00
-SE_M_TRI_ATTACK2 = DD 00
-SE_M_ENCORE = DE 00
-SE_M_ENCORE2 = DF 00
-SE_M_BATON_PASS = E0 00
-SE_M_MILK_DRINK = E1 00
-SE_M_ATTRACT = E2 00
-SE_M_ATTRACT2 = E3 00
-SE_M_MORNING_SUN = E4 00
-SE_M_FLATTER = E5 00
-SE_M_SAND_TOMB = E6 00
-SE_M_GRASSWHISTLE = E7 00
-SE_M_SPIT_UP = E8 00
-SE_M_DIVE = E9 00
-SE_M_EARTHQUAKE = EA 00
-SE_M_TWISTER = EB 00
-SE_M_SWEET_SCENT = EC 00
-SE_M_YAWN = ED 00
-SE_M_SKY_UPPERCUT = EE 00
-SE_M_STAT_INCREASE = EF 00
-SE_M_HEAT_WAVE = F0 00
-SE_M_UPROAR = F1 00
-SE_M_HAIL = F2 00
-SE_M_COSMIC_POWER = F3 00
-SE_M_TEETER_DANCE = F4 00
-SE_M_STAT_DECREASE = F5 00
-SE_M_HAZE = F6 00
-SE_M_HYPER_BEAM2 = F7 00
-SE_RG_DOOR = F8 00
-SE_RG_CARD_FLIP = F9 00
-SE_RG_CARD_FLIPPING = FA 00
-SE_RG_CARD_OPEN = FB 00
-SE_RG_BAG_CURSOR = FC 00
-SE_RG_BAG_POCKET = FD 00
-SE_RG_BALL_CLICK = FE 00
-SE_RG_SHOP = FF 00
-SE_RG_SS_ANNE_HORN = 00 01
-SE_RG_HELP_OPEN = 01 01
-SE_RG_HELP_CLOSE = 02 01
-SE_RG_HELP_ERROR = 03 01
-SE_RG_DEOXYS_MOVE = 04 01
-SE_RG_POKE_JUMP_SUCCESS = 05 01
-SE_RG_POKE_JUMP_FAILURE = 06 01
-SE_POKENAV_CALL = 07 01
-SE_POKENAV_HANG_UP = 08 01
-SE_ARENA_TIMEUP1 = 09 01
-SE_ARENA_TIMEUP2 = 0A 01
-SE_PIKE_CURTAIN_CLOSE = 0B 01
-SE_PIKE_CURTAIN_OPEN = 0C 01
-SE_SUDOWOODO_SHAKE = 0D 01
-MUS_LITTLEROOT_TEST = 5E 01
-MUS_GSC_ROUTE38 = 5F 01
-MUS_CAUGHT = 60 01
-MUS_VICTORY_WILD = 61 01
-MUS_VICTORY_GYM_LEADER = 62 01
-MUS_VICTORY_LEAGUE = 63 01
-MUS_C_COMM_CENTER = 64 01
-MUS_GSC_PEWTER = 65 01
-MUS_C_VS_LEGEND_BEAST = 66 01
-MUS_ROUTE101 = 67 01
-MUS_ROUTE110 = 68 01
-MUS_ROUTE120 = 69 01
-MUS_PETALBURG = 6A 01
-MUS_OLDALE = 6B 01
-MUS_GYM = 6C 01
-MUS_SURF = 6D 01
-MUS_PETALBURG_WOODS = 6E 01
-MUS_LEVEL_UP = 6F 01
-MUS_HEAL = 70 01
-MUS_OBTAIN_BADGE = 71 01
-MUS_OBTAIN_ITEM = 72 01
-MUS_EVOLVED = 73 01
-MUS_OBTAIN_TMHM = 74 01
-MUS_LILYCOVE_MUSEUM = 75 01
-MUS_ROUTE122 = 76 01
-MUS_OCEANIC_MUSEUM = 77 01
-MUS_EVOLUTION_INTRO = 78 01
-MUS_EVOLUTION = 79 01
-MUS_MOVE_DELETED = 7A 01
-MUS_ENCOUNTER_GIRL = 7B 01
-MUS_ENCOUNTER_MALE = 7C 01
-MUS_ABANDONED_SHIP = 7D 01
-MUS_FORTREE = 7E 01
-MUS_BIRCH_LAB = 7F 01
-MUS_B_TOWER_RS = 80 01
-MUS_ENCOUNTER_SWIMMER = 81 01
-MUS_CAVE_OF_ORIGIN = 82 01
-MUS_OBTAIN_BERRY = 83 01
-MUS_AWAKEN_LEGEND = 84 01
-MUS_SLOTS_JACKPOT = 85 01
-MUS_SLOTS_WIN = 86 01
-MUS_TOO_BAD = 87 01
-MUS_ROULETTE = 88 01
-MUS_LINK_CONTEST_P1 = 89 01
-MUS_LINK_CONTEST_P2 = 8A 01
-MUS_LINK_CONTEST_P3 = 8B 01
-MUS_LINK_CONTEST_P4 = 8C 01
-MUS_ENCOUNTER_RICH = 8D 01
-MUS_VERDANTURF = 8E 01
-MUS_RUSTBORO = 8F 01
-MUS_POKE_CENTER = 90 01
-MUS_ROUTE104 = 91 01
-MUS_ROUTE119 = 92 01
-MUS_CYCLING = 93 01
-MUS_POKE_MART = 94 01
-MUS_LITTLEROOT = 95 01
-MUS_MT_CHIMNEY = 96 01
-MUS_ENCOUNTER_FEMALE = 97 01
-MUS_LILYCOVE = 98 01
-MUS_ROUTE111 = 99 01
-MUS_HELP = 9A 01
-MUS_UNDERWATER = 9B 01
-MUS_VICTORY_TRAINER = 9C 01
-MUS_TITLE = 9D 01
-MUS_INTRO = 9E 01
-MUS_ENCOUNTER_MAY = 9F 01
-MUS_ENCOUNTER_INTENSE = A0 01
-MUS_ENCOUNTER_COOL = A1 01
-MUS_ROUTE113 = A2 01
-MUS_ENCOUNTER_AQUA = A3 01
-MUS_FOLLOW_ME = A4 01
-MUS_ENCOUNTER_BRENDAN = A5 01
-MUS_EVER_GRANDE = A6 01
-MUS_ENCOUNTER_SUSPICIOUS = A7 01
-MUS_VICTORY_AQUA_MAGMA = A8 01
-MUS_CABLE_CAR = A9 01
-MUS_GAME_CORNER = AA 01
-MUS_DEWFORD = AB 01
-MUS_SAFARI_ZONE = AC 01
-MUS_VICTORY_ROAD = AD 01
-MUS_AQUA_MAGMA_HIDEOUT = AE 01
-MUS_SAILING = AF 01
-MUS_MT_PYRE = B0 01
-MUS_SLATEPORT = B1 01
-MUS_MT_PYRE_EXTERIOR = B2 01
-MUS_SCHOOL = B3 01
-MUS_HALL_OF_FAME = B4 01
-MUS_FALLARBOR = B5 01
-MUS_SEALED_CHAMBER = B6 01
-MUS_CONTEST_WINNER = B7 01
-MUS_CONTEST = B8 01
-MUS_ENCOUNTER_MAGMA = B9 01
-MUS_INTRO_BATTLE = BA 01
-MUS_ABNORMAL_WEATHER = BB 01
-MUS_WEATHER_GROUDON = BC 01
-MUS_SOOTOPOLIS = BD 01
-MUS_CONTEST_RESULTS = BE 01
-MUS_HALL_OF_FAME_ROOM = BF 01
-MUS_TRICK_HOUSE = C0 01
-MUS_ENCOUNTER_TWINS = C1 01
-MUS_ENCOUNTER_ELITE_FOUR = C2 01
-MUS_ENCOUNTER_HIKER = C3 01
-MUS_CONTEST_LOBBY = C4 01
-MUS_ENCOUNTER_INTERVIEWER = C5 01
-MUS_ENCOUNTER_CHAMPION = C6 01
-MUS_CREDITS = C7 01
-MUS_END = C8 01
-MUS_B_FRONTIER = C9 01
-MUS_B_ARENA = CA 01
-MUS_OBTAIN_B_POINTS = CB 01
-MUS_REGISTER_MATCH_CALL = CC 01
-MUS_B_PYRAMID = CD 01
-MUS_B_PYRAMID_TOP = CE 01
-MUS_B_PALACE = CF 01
-MUS_RAYQUAZA_APPEARS = D0 01
-MUS_B_TOWER = D1 01
-MUS_OBTAIN_SYMBOL = D2 01
-MUS_B_DOME = D3 01
-MUS_B_PIKE = D4 01
-MUS_B_FACTORY = D5 01
-MUS_VS_RAYQUAZA = D6 01
-MUS_VS_FRONTIER_BRAIN = D7 01
-MUS_VS_MEW = D8 01
-MUS_B_DOME_LOBBY = D9 01
-MUS_VS_WILD = DA 01
-MUS_VS_AQUA_MAGMA = DB 01
-MUS_VS_TRAINER = DC 01
-MUS_VS_GYM_LEADER = DD 01
-MUS_VS_CHAMPION = DE 01
-MUS_VS_REGI = DF 01
-MUS_VS_KYOGRE_GROUDON = E0 01
-MUS_VS_RIVAL = E1 01
-MUS_VS_ELITE_FOUR = E2 01
-MUS_VS_AQUA_MAGMA_LEADER = E3 01
-MUS_RG_FOLLOW_ME = E4 01
-MUS_RG_GAME_CORNER = E5 01
-MUS_RG_ROCKET_HIDEOUT = E6 01
-MUS_RG_GYM = E7 01
-MUS_RG_JIGGLYPUFF = E8 01
-MUS_RG_INTRO_FIGHT = E9 01
-MUS_RG_TITLE = EA 01
-MUS_RG_CINNABAR = EB 01
-MUS_RG_LAVENDER = EC 01
-MUS_RG_HEAL = ED 01
-MUS_RG_CYCLING = EE 01
-MUS_RG_ENCOUNTER_ROCKET = EF 01
-MUS_RG_ENCOUNTER_GIRL = F0 01
-MUS_RG_ENCOUNTER_BOY = F1 01
-MUS_RG_HALL_OF_FAME = F2 01
-MUS_RG_VIRIDIAN_FOREST = F3 01
-MUS_RG_MT_MOON = F4 01
-MUS_RG_POKE_MANSION = F5 01
-MUS_RG_CREDITS = F6 01
-MUS_RG_ROUTE1 = F7 01
-MUS_RG_ROUTE24 = F8 01
-MUS_RG_ROUTE3 = F9 01
-MUS_RG_ROUTE11 = FA 01
-MUS_RG_VICTORY_ROAD = FB 01
-MUS_RG_VS_GYM_LEADER = FC 01
-MUS_RG_VS_TRAINER = FD 01
-MUS_RG_VS_WILD = FE 01
-MUS_RG_VS_CHAMPION = FF 01
-MUS_RG_PALLET = 00 02
-MUS_RG_OAK_LAB = 01 02
-MUS_RG_OAK = 02 02
-MUS_RG_POKE_CENTER = 03 02
-MUS_RG_SS_ANNE = 04 02
-MUS_RG_SURF = 05 02
-MUS_RG_POKE_TOWER = 06 02
-MUS_RG_SILPH = 07 02
-MUS_RG_FUCHSIA = 08 02
-MUS_RG_CELADON = 09 02
-MUS_RG_VICTORY_TRAINER = 0A 02
-MUS_RG_VICTORY_WILD = 0B 02
-MUS_RG_VICTORY_GYM_LEADER = 0C 02
-MUS_RG_VERMILLION = 0D 02
-MUS_RG_PEWTER = 0E 02
-MUS_RG_ENCOUNTER_RIVAL = 0F 02
-MUS_RG_RIVAL_EXIT = 10 02
-MUS_RG_DEX_RATING = 11 02
-MUS_RG_OBTAIN_KEY_ITEM = 12 02
-MUS_RG_CAUGHT_INTRO = 13 02
-MUS_RG_PHOTO = 14 02
-MUS_RG_GAME_FREAK = 15 02
-MUS_RG_CAUGHT = 16 02
-MUS_RG_NEW_GAME_INSTRUCT = 17 02
-MUS_RG_NEW_GAME_INTRO = 18 02
-MUS_RG_NEW_GAME_EXIT = 19 02
-MUS_RG_POKE_JUMP = 1A 02
-MUS_RG_UNION_ROOM = 1B 02
-MUS_RG_NET_CENTER = 1C 02
-MUS_RG_MYSTERY_GIFT = 1D 02
-MUS_RG_BERRY_PICK = 1E 02
-MUS_RG_SEVII_CAVE = 1F 02
-MUS_RG_TEACHY_TV_SHOW = 20 02
-MUS_RG_SEVII_ROUTE = 21 02
-MUS_RG_SEVII_DUNGEON = 22 02
-MUS_RG_SEVII_123 = 23 02
-MUS_RG_SEVII_45 = 24 02
-MUS_RG_SEVII_67 = 25 02
-MUS_RG_POKE_FLUTE = 26 02
-MUS_RG_VS_DEOXYS = 27 02
-MUS_RG_VS_MEWTWO = 28 02
-MUS_RG_VS_LEGEND = 29 02
-MUS_RG_ENCOUNTER_GYM_LEADER = 2A 02
-MUS_RG_ENCOUNTER_DEOXYS = 2B 02
-MUS_RG_TRAINER_TOWER = 2C 02
-MUS_RG_SLOW_PALLET = 2D 02
-MUS_RG_TEACHY_TV_MENU = 2E 02
-PH_TRAP_BLEND = 2F 02
-PH_TRAP_HELD = 30 02
-PH_TRAP_SOLO = 31 02
-PH_FACE_BLEND = 32 02
-PH_FACE_HELD = 33 02
-PH_FACE_SOLO = 34 02
-PH_CLOTH_BLEND = 35 02
-PH_CLOTH_HELD = 36 02
-PH_CLOTH_SOLO = 37 02
-PH_DRESS_BLEND = 38 02
-PH_DRESS_HELD = 39 02
-PH_DRESS_SOLO = 3A 02
-PH_FLEECE_BLEND = 3B 02
-PH_FLEECE_HELD = 3C 02
-PH_FLEECE_SOLO = 3D 02
-PH_KIT_BLEND = 3E 02
-PH_KIT_HELD = 3F 02
-PH_KIT_SOLO = 40 02
-PH_PRICE_BLEND = 41 02
-PH_PRICE_HELD = 42 02
-PH_PRICE_SOLO = 43 02
-PH_LOT_BLEND = 44 02
-PH_LOT_HELD = 45 02
-PH_LOT_SOLO = 46 02
-PH_GOAT_BLEND = 47 02
-PH_GOAT_HELD = 48 02
-PH_GOAT_SOLO = 49 02
-PH_THOUGHT_BLEND = 4A 02
-PH_THOUGHT_HELD = 4B 02
-PH_THOUGHT_SOLO = 4C 02
-PH_CHOICE_BLEND = 4D 02
-PH_CHOICE_HELD = 4E 02
-PH_CHOICE_SOLO = 4F 02
-PH_MOUTH_BLEND = 50 02
-PH_MOUTH_HELD = 51 02
-PH_MOUTH_SOLO = 52 02
-PH_FOOT_BLEND = 53 02
-PH_FOOT_HELD = 54 02
-PH_FOOT_SOLO = 55 02
-PH_GOOSE_BLEND = 56 02
-PH_GOOSE_HELD = 57 02
-PH_GOOSE_SOLO = 58 02
-PH_STRUT_BLEND = 59 02
-PH_STRUT_HELD = 5A 02
-PH_STRUT_SOLO = 5B 02
-PH_CURE_BLEND = 5C 02
-PH_CURE_HELD = 5D 02
-PH_CURE_SOLO = 5E 02
-PH_NURSE_BLEND = 5F 02
-PH_NURSE_HELD = 60 02
-PH_NURSE_SOLO = 61 02
-
-A_BUTTON = F8 00
-B_BUTTON = F8 01
-DPAD_UPDOWN = F8 0A
-DPAD_NONE = F8 0C
-
-UP_ARROW_2 = F9 00
-DOWN_ARROW_2 = F9 01
-LEFT_ARROW_2 = F9 02
-RIGHT_ARROW_2 = F9 03
-PLUS = F9 04
-LV_2 = F9 05
-PP = F9 06
-ID = F9 07
-NO = F9 08
-UNDERSCORE = F9 09
-CIRCLE_1 = F9 0A
-CIRCLE_2 = F9 0B
-CIRCLE_3 = F9 0C
-CIRCLE_4 = F9 0D
-CIRCLE_5 = F9 0E
-CIRCLE_6 = F9 0F
-CIRCLE_7 = F9 10
-CIRCLE_8 = F9 11
-CIRCLE_9 = F9 12
-ROUND_LEFT_PAREN = F9 13
-ROUND_RIGHT_PAREN = F9 14
-CIRCLE_DOT = F9 15
-TRIANGLE = F9 16
-BIG_MULT_X = F9 17
-
-EMOJI_UNDERSCORE = F9 D0
-EMOJI_PIPE = F9 D1
-EMOJI_HIGHBAR = F9 D2
-EMOJI_TILDE = F9 D3
-EMOJI_LEFT_PAREN = F9 D4
-EMOJI_RIGHT_PAREN = F9 D5
-EMOJI_UNION = F9 D6 @ ⊂
-EMOJI_GREATER_THAN = F9 D7
-EMOJI_LEFT_EYE = F9 D8
-EMOJI_RIGHT_EYE = F9 D9
-EMOJI_AT = F9 DA
-EMOJI_SEMICOLON = F9 DB
-EMOJI_PLUS = F9 DC
-EMOJI_MINUS = F9 DD
-EMOJI_EQUALS = F9 DE
-EMOJI_SPIRAL = F9 DF
-EMOJI_TONGUE = F9 E0
-EMOJI_TRIANGLE_OUTLINE = F9 E1
-EMOJI_ACUTE = F9 E2
-EMOJI_GRAVE = F9 E3
-EMOJI_CIRCLE = F9 E4
-EMOJI_TRIANGLE = F9 E5
-EMOJI_SQUARE = F9 E6
-EMOJI_HEART = F9 E7
-EMOJI_MOON = F9 E8
-EMOJI_NOTE = F9 E9
-EMOJI_BALL = F9 EA
-EMOJI_BOLT = F9 EB
-EMOJI_LEAF = F9 EC
-EMOJI_FIRE = F9 ED
-EMOJI_WATER = F9 EE
-EMOJI_LEFT_FIST = F9 EF
-EMOJI_RIGHT_FIST = F9 F0
-EMOJI_BIGWHEEL = F9 F1
-EMOJI_SMALLWHEEL = F9 F2
-EMOJI_SPHERE = F9 F3
-EMOJI_IRRITATED = F9 F4
-EMOJI_MISCHIEVOUS = F9 F5
-EMOJI_HAPPY = F9 F6
-EMOJI_ANGRY = F9 F7
-EMOJI_SURPRISED = F9 F8
-EMOJI_BIGSMILE = F9 F9
-EMOJI_EVIL = F9 FA
-EMOJI_TIRED = F9 FB
-EMOJI_NEUTRAL = F9 FC
-EMOJI_SHOCKED = F9 FD
-EMOJI_BIGANGER = F9 FE
-
-'\l' = FA @ scroll up window text
-'\p' = FB @ new paragraph
-'\n' = FE @ new line
diff --git a/berry_fix/payload/common_syms/agb_flash.txt b/berry_fix/payload/common_syms/agb_flash.txt
deleted file mode 100644
index cb421ec80d..0000000000
--- a/berry_fix/payload/common_syms/agb_flash.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-gFlashTimeoutFlag
-PollFlashStatus
-WaitForFlashWrite
-ProgramFlashSector
-gFlash
-ProgramFlashByte
-gFlashNumRemainingBytes
-EraseFlashChip
-EraseFlashSector
-gFlashMaxTime
diff --git a/berry_fix/payload/common_syms/main.txt b/berry_fix/payload/common_syms/main.txt
deleted file mode 100644
index b62c721240..0000000000
--- a/berry_fix/payload/common_syms/main.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-gIntrTable
-gHeldKeys
-gNewKeys
-gIntrVector
-gUpdateSuccessful
-gUnknown_3001194
-gUnknown_30011A0
-gMainCallbackState
-gGameVersion
diff --git a/berry_fix/payload/common_syms/rtc.txt b/berry_fix/payload/common_syms/rtc.txt
deleted file mode 100644
index 7aafbe65df..0000000000
--- a/berry_fix/payload/common_syms/rtc.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-gTimeSinceBerryUpdate
-gRtcUTCTime
diff --git a/berry_fix/payload/constants/gba_constants.inc b/berry_fix/payload/constants/gba_constants.inc
deleted file mode 100644
index 9d59c8fcdd..0000000000
--- a/berry_fix/payload/constants/gba_constants.inc
+++ /dev/null
@@ -1,490 +0,0 @@
- .set PSR_USR_MODE, 0x00000010
- .set PSR_FIQ_MODE, 0x00000011
- .set PSR_IRQ_MODE, 0x00000012
- .set PSR_SVC_MODE, 0x00000013
- .set PSR_ABT_MODE, 0x00000017
- .set PSR_UND_MODE, 0x0000001b
- .set PSR_SYS_MODE, 0x0000001f
- .set PSR_MODE_MASK, 0x0000001f
- .set PSR_T_BIT, 0x00000020
- .set PSR_F_BIT, 0x00000040
- .set PSR_I_BIT, 0x00000080
-
- .set EWRAM_START, 0x02000000
- .set EWRAM_END, EWRAM_START + 0x40000
- .set IWRAM_START, 0x03000000
- .set IWRAM_END, IWRAM_START + 0x8000
-
- .set PLTT, 0x5000000
- .set BG_PLTT, PLTT
- .set OBJ_PLTT, PLTT + 0x200
-
- .set VRAM, 0x6000000
- .set BG_VRAM, VRAM
- .set OBJ_VRAM0, VRAM + 0x10000 @ text-mode BG
- .set OBJ_VRAM1, VRAM + 0x14000 @ bitmap-mode BG
-
- .set OAM, 0x7000000
-
- .set SOUND_INFO_PTR, 0x3007FF0
- .set INTR_CHECK, 0x3007FF8
- .set INTR_VECTOR, 0x3007FFC
-
- .set INTR_FLAG_VBLANK, 1 << 0
- .set INTR_FLAG_HBLANK, 1 << 1
- .set INTR_FLAG_VCOUNT, 1 << 2
- .set INTR_FLAG_TIMER0, 1 << 3
- .set INTR_FLAG_TIMER1, 1 << 4
- .set INTR_FLAG_TIMER2, 1 << 5
- .set INTR_FLAG_TIMER3, 1 << 6
- .set INTR_FLAG_SERIAL, 1 << 7
- .set INTR_FLAG_DMA0, 1 << 8
- .set INTR_FLAG_DMA1, 1 << 9
- .set INTR_FLAG_DMA2, 1 << 10
- .set INTR_FLAG_DMA3, 1 << 11
- .set INTR_FLAG_KEYPAD, 1 << 12
- .set INTR_FLAG_GAMEPAK, 1 << 13
-
- .set VCOUNT_VBLANK, 160
- .set TOTAL_SCANLINES, 228
-
- .set REG_BASE, 0x4000000 @ I/O register base address
-
-@ I/O register offsets
- .set OFFSET_REG_DISPCNT, 0x0
- .set OFFSET_REG_DISPSTAT, 0x4
- .set OFFSET_REG_VCOUNT, 0x6
- .set OFFSET_REG_BG0CNT, 0x8
- .set OFFSET_REG_BG1CNT, 0xa
- .set OFFSET_REG_BG2CNT, 0xc
- .set OFFSET_REG_BG3CNT, 0xe
- .set OFFSET_REG_BG0HOFS, 0x10
- .set OFFSET_REG_BG0VOFS, 0x12
- .set OFFSET_REG_BG1HOFS, 0x14
- .set OFFSET_REG_BG1VOFS, 0x16
- .set OFFSET_REG_BG2HOFS, 0x18
- .set OFFSET_REG_BG2VOFS, 0x1a
- .set OFFSET_REG_BG3HOFS, 0x1c
- .set OFFSET_REG_BG3VOFS, 0x1e
- .set OFFSET_REG_BG2PA, 0x20
- .set OFFSET_REG_BG2PB, 0x22
- .set OFFSET_REG_BG2PC, 0x24
- .set OFFSET_REG_BG2PD, 0x26
- .set OFFSET_REG_BG2X_L, 0x28
- .set OFFSET_REG_BG2X_H, 0x2a
- .set OFFSET_REG_BG2Y_L, 0x2c
- .set OFFSET_REG_BG2Y_H, 0x2e
- .set OFFSET_REG_BG3PA, 0x30
- .set OFFSET_REG_BG3PB, 0x32
- .set OFFSET_REG_BG3PC, 0x34
- .set OFFSET_REG_BG3PD, 0x36
- .set OFFSET_REG_BG3X_L, 0x38
- .set OFFSET_REG_BG3X_H, 0x3a
- .set OFFSET_REG_BG3Y_L, 0x3c
- .set OFFSET_REG_BG3Y_H, 0x3e
- .set OFFSET_REG_WIN0H, 0x40
- .set OFFSET_REG_WIN1H, 0x42
- .set OFFSET_REG_WIN0V, 0x44
- .set OFFSET_REG_WIN1V, 0x46
- .set OFFSET_REG_WININ, 0x48
- .set OFFSET_REG_WINOUT, 0x4a
- .set OFFSET_REG_MOSAIC, 0x4c
- .set OFFSET_REG_BLDCNT, 0x50
- .set OFFSET_REG_BLDALPHA, 0x52
- .set OFFSET_REG_BLDY, 0x54
-
- .set OFFSET_REG_SOUND1CNT, 0x60
- .set OFFSET_REG_SOUND1CNT_L, 0x60
- .set OFFSET_REG_NR10, 0x60
- .set OFFSET_REG_SOUND1CNT_H, 0x62
- .set OFFSET_REG_NR11, 0x62
- .set OFFSET_REG_NR12, 0x63
- .set OFFSET_REG_SOUND1CNT_X, 0x64
- .set OFFSET_REG_NR13, 0x64
- .set OFFSET_REG_NR14, 0x65
- .set OFFSET_REG_SOUND2CNT, 0x68
- .set OFFSET_REG_SOUND2CNT_L, 0x68
- .set OFFSET_REG_NR21, 0x68
- .set OFFSET_REG_NR22, 0x69
- .set OFFSET_REG_SOUND2CNT_H, 0x6c
- .set OFFSET_REG_NR23, 0x6c
- .set OFFSET_REG_NR24, 0x6d
- .set OFFSET_REG_SOUND3CNT, 0x70
- .set OFFSET_REG_SOUND3CNT_L, 0x70
- .set OFFSET_REG_NR30, 0x70
- .set OFFSET_REG_SOUND3CNT_H, 0x72
- .set OFFSET_REG_NR31, 0x72
- .set OFFSET_REG_NR32, 0x73
- .set OFFSET_REG_SOUND3CNT_X, 0x74
- .set OFFSET_REG_NR33, 0x74
- .set OFFSET_REG_NR34, 0x75
- .set OFFSET_REG_SOUND4CNT, 0x78
- .set OFFSET_REG_SOUND4CNT_L, 0x78
- .set OFFSET_REG_NR41, 0x78
- .set OFFSET_REG_NR42, 0x79
- .set OFFSET_REG_SOUND4CNT_H, 0x7c
- .set OFFSET_REG_NR43, 0x7c
- .set OFFSET_REG_NR44, 0x7d
- .set OFFSET_REG_SOUNDCNT, 0x80
- .set OFFSET_REG_SOUNDCNT_L, 0x80
- .set OFFSET_REG_NR50, 0x80
- .set OFFSET_REG_NR51, 0x81
- .set OFFSET_REG_SOUNDCNT_H, 0x82
- .set OFFSET_REG_SOUNDCNT_X, 0x84
- .set OFFSET_REG_NR52, 0x84
- .set OFFSET_REG_SOUNDBIAS, 0x88
- .set OFFSET_REG_WAVE_RAM, 0x90
- .set OFFSET_REG_WAVE_RAM0, 0x90
- .set OFFSET_REG_WAVE_RAM0_L, 0x90
- .set OFFSET_REG_WAVE_RAM0_H, 0x92
- .set OFFSET_REG_WAVE_RAM1, 0x94
- .set OFFSET_REG_WAVE_RAM1_L, 0x94
- .set OFFSET_REG_WAVE_RAM1_H, 0x96
- .set OFFSET_REG_WAVE_RAM2, 0x98
- .set OFFSET_REG_WAVE_RAM2_L, 0x98
- .set OFFSET_REG_WAVE_RAM2_H, 0x9a
- .set OFFSET_REG_WAVE_RAM3, 0x9c
- .set OFFSET_REG_WAVE_RAM3_L, 0x9c
- .set OFFSET_REG_WAVE_RAM3_H, 0x9e
- .set OFFSET_REG_FIFO, 0xa0
- .set OFFSET_REG_FIFO_A, 0xa0
- .set OFFSET_REG_FIFO_A_L, 0xa0
- .set OFFSET_REG_FIFO_A_H, 0xa2
- .set OFFSET_REG_FIFO_B, 0xa4
- .set OFFSET_REG_FIFO_B_L, 0xa4
- .set OFFSET_REG_FIFO_B_H, 0xa6
-
- .set OFFSET_REG_DMA0, 0xb0
- .set OFFSET_REG_DMA0SAD, 0xb0
- .set OFFSET_REG_DMA0SAD_L, 0xb0
- .set OFFSET_REG_DMA0SAD_H, 0xb2
- .set OFFSET_REG_DMA0DAD, 0xb4
- .set OFFSET_REG_DMA0DAD_L, 0xb4
- .set OFFSET_REG_DMA0DAD_H, 0xb6
- .set OFFSET_REG_DMA0CNT, 0xb8
- .set OFFSET_REG_DMA0CNT_L, 0xb8
- .set OFFSET_REG_DMA0CNT_H, 0xba
- .set OFFSET_REG_DMA1, 0xbc
- .set OFFSET_REG_DMA1SAD, 0xbc
- .set OFFSET_REG_DMA1SAD_L, 0xbc
- .set OFFSET_REG_DMA1SAD_H, 0xbe
- .set OFFSET_REG_DMA1DAD, 0xc0
- .set OFFSET_REG_DMA1DAD_L, 0xc0
- .set OFFSET_REG_DMA1DAD_H, 0xc2
- .set OFFSET_REG_DMA1CNT, 0xc4
- .set OFFSET_REG_DMA1CNT_L, 0xc4
- .set OFFSET_REG_DMA1CNT_H, 0xc6
- .set OFFSET_REG_DMA2, 0xc8
- .set OFFSET_REG_DMA2SAD, 0xc8
- .set OFFSET_REG_DMA2SAD_L, 0xc8
- .set OFFSET_REG_DMA2SAD_H, 0xca
- .set OFFSET_REG_DMA2DAD, 0xcc
- .set OFFSET_REG_DMA2DAD_L, 0xcc
- .set OFFSET_REG_DMA2DAD_H, 0xce
- .set OFFSET_REG_DMA2CNT, 0xd0
- .set OFFSET_REG_DMA2CNT_L, 0xd0
- .set OFFSET_REG_DMA2CNT_H, 0xd2
- .set OFFSET_REG_DMA3, 0xd4
- .set OFFSET_REG_DMA3SAD, 0xd4
- .set OFFSET_REG_DMA3SAD_L, 0xd4
- .set OFFSET_REG_DMA3SAD_H, 0xd6
- .set OFFSET_REG_DMA3DAD, 0xd8
- .set OFFSET_REG_DMA3DAD_L, 0xd8
- .set OFFSET_REG_DMA3DAD_H, 0xda
- .set OFFSET_REG_DMA3CNT, 0xdc
- .set OFFSET_REG_DMA3CNT_L, 0xdc
- .set OFFSET_REG_DMA3CNT_H, 0xde
-
- .set OFFSET_REG_TM0CNT, 0x100
- .set OFFSET_REG_TM0CNT_L, 0x100
- .set OFFSET_REG_TM0CNT_H, 0x102
- .set OFFSET_REG_TM1CNT, 0x104
- .set OFFSET_REG_TM1CNT_L, 0x104
- .set OFFSET_REG_TM1CNT_H, 0x106
- .set OFFSET_REG_TM2CNT, 0x108
- .set OFFSET_REG_TM2CNT_L, 0x108
- .set OFFSET_REG_TM2CNT_H, 0x10a
- .set OFFSET_REG_TM3CNT, 0x10c
- .set OFFSET_REG_TM3CNT_L, 0x10c
- .set OFFSET_REG_TM3CNT_H, 0x10e
-
- .set OFFSET_REG_SIOCNT, 0x128
- .set OFFSET_REG_SIODATA8, 0x12a
- .set OFFSET_REG_SIODATA32, 0x120
- .set OFFSET_REG_SIOMLT_SEND, 0x12a
- .set OFFSET_REG_SIOMLT_RECV, 0x120
- .set OFFSET_REG_SIOMULTI0, 0x120
- .set OFFSET_REG_SIOMULTI1, 0x122
- .set OFFSET_REG_SIOMULTI2, 0x124
- .set OFFSET_REG_SIOMULTI3, 0x126
-
- .set OFFSET_REG_KEYINPUT, 0x130
- .set OFFSET_REG_KEYCNT, 0x132
-
- .set OFFSET_REG_RCNT, 0x134
-
- .set OFFSET_REG_JOYCNT, 0x140
- .set OFFSET_REG_JOYSTAT, 0x158
- .set OFFSET_REG_JOY_RECV, 0x150
- .set OFFSET_REG_JOY_RECV_L, 0x150
- .set OFFSET_REG_JOY_RECV_H, 0x152
- .set OFFSET_REG_JOY_TRANS, 0x154
- .set OFFSET_REG_JOY_TRANS_L, 0x154
- .set OFFSET_REG_JOY_TRANS_H, 0x156
-
- .set OFFSET_REG_IME, 0x208
- .set OFFSET_REG_IE, 0x200
- .set OFFSET_REG_IF, 0x202
-
- .set OFFSET_REG_WAITCNT, 0x204
-
-@ I/O register addresses
- .set REG_DISPCNT, REG_BASE + OFFSET_REG_DISPCNT
- .set REG_DISPSTAT, REG_BASE + OFFSET_REG_DISPSTAT
- .set REG_VCOUNT, REG_BASE + OFFSET_REG_VCOUNT
- .set REG_BG0CNT, REG_BASE + OFFSET_REG_BG0CNT
- .set REG_BG1CNT, REG_BASE + OFFSET_REG_BG1CNT
- .set REG_BG2CNT, REG_BASE + OFFSET_REG_BG2CNT
- .set REG_BG3CNT, REG_BASE + OFFSET_REG_BG3CNT
- .set REG_BG0HOFS, REG_BASE + OFFSET_REG_BG0HOFS
- .set REG_BG0VOFS, REG_BASE + OFFSET_REG_BG0VOFS
- .set REG_BG1HOFS, REG_BASE + OFFSET_REG_BG1HOFS
- .set REG_BG1VOFS, REG_BASE + OFFSET_REG_BG1VOFS
- .set REG_BG2HOFS, REG_BASE + OFFSET_REG_BG2HOFS
- .set REG_BG2VOFS, REG_BASE + OFFSET_REG_BG2VOFS
- .set REG_BG3HOFS, REG_BASE + OFFSET_REG_BG3HOFS
- .set REG_BG3VOFS, REG_BASE + OFFSET_REG_BG3VOFS
- .set REG_BG2PA, REG_BASE + OFFSET_REG_BG2PA
- .set REG_BG2PB, REG_BASE + OFFSET_REG_BG2PB
- .set REG_BG2PC, REG_BASE + OFFSET_REG_BG2PC
- .set REG_BG2PD, REG_BASE + OFFSET_REG_BG2PD
- .set REG_BG2X_L, REG_BASE + OFFSET_REG_BG2X_L
- .set REG_BG2X_H, REG_BASE + OFFSET_REG_BG2X_H
- .set REG_BG2Y_L, REG_BASE + OFFSET_REG_BG2Y_L
- .set REG_BG2Y_H, REG_BASE + OFFSET_REG_BG2Y_H
- .set REG_BG3PA, REG_BASE + OFFSET_REG_BG3PA
- .set REG_BG3PB, REG_BASE + OFFSET_REG_BG3PB
- .set REG_BG3PC, REG_BASE + OFFSET_REG_BG3PC
- .set REG_BG3PD, REG_BASE + OFFSET_REG_BG3PD
- .set REG_BG3X_L, REG_BASE + OFFSET_REG_BG3X_L
- .set REG_BG3X_H, REG_BASE + OFFSET_REG_BG3X_H
- .set REG_BG3Y_L, REG_BASE + OFFSET_REG_BG3Y_L
- .set REG_BG3Y_H, REG_BASE + OFFSET_REG_BG3Y_H
- .set REG_WIN0H, REG_BASE + OFFSET_REG_WIN0H
- .set REG_WIN1H, REG_BASE + OFFSET_REG_WIN1H
- .set REG_WIN0V, REG_BASE + OFFSET_REG_WIN0V
- .set REG_WIN1V, REG_BASE + OFFSET_REG_WIN1V
- .set REG_WININ, REG_BASE + OFFSET_REG_WININ
- .set REG_WINOUT, REG_BASE + OFFSET_REG_WINOUT
- .set REG_MOSAIC, REG_BASE + OFFSET_REG_MOSAIC
- .set REG_BLDCNT, REG_BASE + OFFSET_REG_BLDCNT
- .set REG_BLDALPHA, REG_BASE + OFFSET_REG_BLDALPHA
- .set REG_BLDY, REG_BASE + OFFSET_REG_BLDY
-
- .set REG_SOUND1CNT, REG_BASE + OFFSET_REG_SOUND1CNT
- .set REG_SOUND1CNT_L, REG_BASE + OFFSET_REG_SOUND1CNT_L
- .set REG_NR10, REG_BASE + OFFSET_REG_NR10
- .set REG_SOUND1CNT_H, REG_BASE + OFFSET_REG_SOUND1CNT_H
- .set REG_NR11, REG_BASE + OFFSET_REG_NR11
- .set REG_NR12, REG_BASE + OFFSET_REG_NR12
- .set REG_SOUND1CNT_X, REG_BASE + OFFSET_REG_SOUND1CNT_X
- .set REG_NR13, REG_BASE + OFFSET_REG_NR13
- .set REG_NR14, REG_BASE + OFFSET_REG_NR14
- .set REG_SOUND2CNT, REG_BASE + OFFSET_REG_SOUND2CNT
- .set REG_SOUND2CNT_L, REG_BASE + OFFSET_REG_SOUND2CNT_L
- .set REG_NR21, REG_BASE + OFFSET_REG_NR21
- .set REG_NR22, REG_BASE + OFFSET_REG_NR22
- .set REG_SOUND2CNT_H, REG_BASE + OFFSET_REG_SOUND2CNT_H
- .set REG_NR23, REG_BASE + OFFSET_REG_NR23
- .set REG_NR24, REG_BASE + OFFSET_REG_NR24
- .set REG_SOUND3CNT, REG_BASE + OFFSET_REG_SOUND3CNT
- .set REG_SOUND3CNT_L, REG_BASE + OFFSET_REG_SOUND3CNT_L
- .set REG_NR30, REG_BASE + OFFSET_REG_NR30
- .set REG_SOUND3CNT_H, REG_BASE + OFFSET_REG_SOUND3CNT_H
- .set REG_NR31, REG_BASE + OFFSET_REG_NR31
- .set REG_NR32, REG_BASE + OFFSET_REG_NR32
- .set REG_SOUND3CNT_X, REG_BASE + OFFSET_REG_SOUND3CNT_X
- .set REG_NR33, REG_BASE + OFFSET_REG_NR33
- .set REG_NR34, REG_BASE + OFFSET_REG_NR34
- .set REG_SOUND4CNT, REG_BASE + OFFSET_REG_SOUND4CNT
- .set REG_SOUND4CNT_L, REG_BASE + OFFSET_REG_SOUND4CNT_L
- .set REG_NR41, REG_BASE + OFFSET_REG_NR41
- .set REG_NR42, REG_BASE + OFFSET_REG_NR42
- .set REG_SOUND4CNT_H, REG_BASE + OFFSET_REG_SOUND4CNT_H
- .set REG_NR43, REG_BASE + OFFSET_REG_NR43
- .set REG_NR44, REG_BASE + OFFSET_REG_NR44
- .set REG_SOUNDCNT, REG_BASE + OFFSET_REG_SOUNDCNT
- .set REG_SOUNDCNT_L, REG_BASE + OFFSET_REG_SOUNDCNT_L
- .set REG_NR50, REG_BASE + OFFSET_REG_NR50
- .set REG_NR51, REG_BASE + OFFSET_REG_NR51
- .set REG_SOUNDCNT_H, REG_BASE + OFFSET_REG_SOUNDCNT_H
- .set REG_SOUNDCNT_X, REG_BASE + OFFSET_REG_SOUNDCNT_X
- .set REG_NR52, REG_BASE + OFFSET_REG_NR52
- .set REG_SOUNDBIAS, REG_BASE + OFFSET_REG_SOUNDBIAS
- .set REG_WAVE_RAM, REG_BASE + OFFSET_REG_WAVE_RAM
- .set REG_WAVE_RAM0, REG_BASE + OFFSET_REG_WAVE_RAM0
- .set REG_WAVE_RAM0_L, REG_BASE + OFFSET_REG_WAVE_RAM0_L
- .set REG_WAVE_RAM0_H, REG_BASE + OFFSET_REG_WAVE_RAM0_H
- .set REG_WAVE_RAM1, REG_BASE + OFFSET_REG_WAVE_RAM1
- .set REG_WAVE_RAM1_L, REG_BASE + OFFSET_REG_WAVE_RAM1_L
- .set REG_WAVE_RAM1_H, REG_BASE + OFFSET_REG_WAVE_RAM1_H
- .set REG_WAVE_RAM2, REG_BASE + OFFSET_REG_WAVE_RAM2
- .set REG_WAVE_RAM2_L, REG_BASE + OFFSET_REG_WAVE_RAM2_L
- .set REG_WAVE_RAM2_H, REG_BASE + OFFSET_REG_WAVE_RAM2_H
- .set REG_WAVE_RAM3, REG_BASE + OFFSET_REG_WAVE_RAM3
- .set REG_WAVE_RAM3_L, REG_BASE + OFFSET_REG_WAVE_RAM3_L
- .set REG_WAVE_RAM3_H, REG_BASE + OFFSET_REG_WAVE_RAM3_H
- .set REG_FIFO, REG_BASE + OFFSET_REG_FIFO
- .set REG_FIFO_A, REG_BASE + OFFSET_REG_FIFO_A
- .set REG_FIFO_A_L, REG_BASE + OFFSET_REG_FIFO_A_L
- .set REG_FIFO_A_H, REG_BASE + OFFSET_REG_FIFO_A_H
- .set REG_FIFO_B, REG_BASE + OFFSET_REG_FIFO_B
- .set REG_FIFO_B_L, REG_BASE + OFFSET_REG_FIFO_B_L
- .set REG_FIFO_B_H, REG_BASE + OFFSET_REG_FIFO_B_H
-
- .set REG_DMA0, REG_BASE + OFFSET_REG_DMA0
- .set REG_DMA0SAD, REG_BASE + OFFSET_REG_DMA0SAD
- .set REG_DMA0SAD_L, REG_BASE + OFFSET_REG_DMA0SAD_L
- .set REG_DMA0SAD_H, REG_BASE + OFFSET_REG_DMA0SAD_H
- .set REG_DMA0DAD, REG_BASE + OFFSET_REG_DMA0DAD
- .set REG_DMA0DAD_L, REG_BASE + OFFSET_REG_DMA0DAD_L
- .set REG_DMA0DAD_H, REG_BASE + OFFSET_REG_DMA0DAD_H
- .set REG_DMA0CNT, REG_BASE + OFFSET_REG_DMA0CNT
- .set REG_DMA0CNT_L, REG_BASE + OFFSET_REG_DMA0CNT_L
- .set REG_DMA0CNT_H, REG_BASE + OFFSET_REG_DMA0CNT_H
- .set REG_DMA1, REG_BASE + OFFSET_REG_DMA1
- .set REG_DMA1SAD, REG_BASE + OFFSET_REG_DMA1SAD
- .set REG_DMA1SAD_L, REG_BASE + OFFSET_REG_DMA1SAD_L
- .set REG_DMA1SAD_H, REG_BASE + OFFSET_REG_DMA1SAD_H
- .set REG_DMA1DAD, REG_BASE + OFFSET_REG_DMA1DAD
- .set REG_DMA1DAD_L, REG_BASE + OFFSET_REG_DMA1DAD_L
- .set REG_DMA1DAD_H, REG_BASE + OFFSET_REG_DMA1DAD_H
- .set REG_DMA1CNT, REG_BASE + OFFSET_REG_DMA1CNT
- .set REG_DMA1CNT_L, REG_BASE + OFFSET_REG_DMA1CNT_L
- .set REG_DMA1CNT_H, REG_BASE + OFFSET_REG_DMA1CNT_H
- .set REG_DMA2, REG_BASE + OFFSET_REG_DMA2
- .set REG_DMA2SAD, REG_BASE + OFFSET_REG_DMA2SAD
- .set REG_DMA2SAD_L, REG_BASE + OFFSET_REG_DMA2SAD_L
- .set REG_DMA2SAD_H, REG_BASE + OFFSET_REG_DMA2SAD_H
- .set REG_DMA2DAD, REG_BASE + OFFSET_REG_DMA2DAD
- .set REG_DMA2DAD_L, REG_BASE + OFFSET_REG_DMA2DAD_L
- .set REG_DMA2DAD_H, REG_BASE + OFFSET_REG_DMA2DAD_H
- .set REG_DMA2CNT, REG_BASE + OFFSET_REG_DMA2CNT
- .set REG_DMA2CNT_L, REG_BASE + OFFSET_REG_DMA2CNT_L
- .set REG_DMA2CNT_H, REG_BASE + OFFSET_REG_DMA2CNT_H
- .set REG_DMA3, REG_BASE + OFFSET_REG_DMA3
- .set REG_DMA3SAD, REG_BASE + OFFSET_REG_DMA3SAD
- .set REG_DMA3SAD_L, REG_BASE + OFFSET_REG_DMA3SAD_L
- .set REG_DMA3SAD_H, REG_BASE + OFFSET_REG_DMA3SAD_H
- .set REG_DMA3DAD, REG_BASE + OFFSET_REG_DMA3DAD
- .set REG_DMA3DAD_L, REG_BASE + OFFSET_REG_DMA3DAD_L
- .set REG_DMA3DAD_H, REG_BASE + OFFSET_REG_DMA3DAD_H
- .set REG_DMA3CNT, REG_BASE + OFFSET_REG_DMA3CNT
- .set REG_DMA3CNT_L, REG_BASE + OFFSET_REG_DMA3CNT_L
- .set REG_DMA3CNT_H, REG_BASE + OFFSET_REG_DMA3CNT_H
-
- .set REG_TM0CNT, REG_BASE + OFFSET_REG_TM0CNT
- .set REG_TM0CNT_L, REG_BASE + OFFSET_REG_TM0CNT_L
- .set REG_TM0CNT_H, REG_BASE + OFFSET_REG_TM0CNT_H
- .set REG_TM1CNT, REG_BASE + OFFSET_REG_TM1CNT
- .set REG_TM1CNT_L, REG_BASE + OFFSET_REG_TM1CNT_L
- .set REG_TM1CNT_H, REG_BASE + OFFSET_REG_TM1CNT_H
- .set REG_TM2CNT, REG_BASE + OFFSET_REG_TM2CNT
- .set REG_TM2CNT_L, REG_BASE + OFFSET_REG_TM2CNT_L
- .set REG_TM2CNT_H, REG_BASE + OFFSET_REG_TM2CNT_H
- .set REG_TM3CNT, REG_BASE + OFFSET_REG_TM3CNT
- .set REG_TM3CNT_L, REG_BASE + OFFSET_REG_TM3CNT_L
- .set REG_TM3CNT_H, REG_BASE + OFFSET_REG_TM3CNT_H
-
- .set REG_SIOCNT, REG_BASE + OFFSET_REG_SIOCNT
- .set REG_SIODATA8, REG_BASE + OFFSET_REG_SIODATA8
- .set REG_SIODATA32, REG_BASE + OFFSET_REG_SIODATA32
- .set REG_SIOMLT_SEND, REG_BASE + OFFSET_REG_SIOMLT_SEND
- .set REG_SIOMLT_RECV, REG_BASE + OFFSET_REG_SIOMLT_RECV
- .set REG_SIOMULTI0, REG_BASE + OFFSET_REG_SIOMULTI0
- .set REG_SIOMULTI1, REG_BASE + OFFSET_REG_SIOMULTI1
- .set REG_SIOMULTI2, REG_BASE + OFFSET_REG_SIOMULTI2
- .set REG_SIOMULTI3, REG_BASE + OFFSET_REG_SIOMULTI3
-
- .set REG_KEYINPUT, REG_BASE + OFFSET_REG_KEYINPUT
- .set REG_KEYCNT, REG_BASE + OFFSET_REG_KEYCNT
-
- .set REG_RCNT, REG_BASE + OFFSET_REG_RCNT
-
- .set REG_JOYCNT, REG_BASE + OFFSET_REG_JOYCNT
- .set REG_JOYSTAT, REG_BASE + OFFSET_REG_JOYSTAT
- .set REG_JOY_RECV, REG_BASE + OFFSET_REG_JOY_RECV
- .set REG_JOY_RECV_L, REG_BASE + OFFSET_REG_JOY_RECV_L
- .set REG_JOY_RECV_H, REG_BASE + OFFSET_REG_JOY_RECV_H
- .set REG_JOY_TRANS, REG_BASE + OFFSET_REG_JOY_TRANS
- .set REG_JOY_TRANS_L, REG_BASE + OFFSET_REG_JOY_TRANS_L
- .set REG_JOY_TRANS_H, REG_BASE + OFFSET_REG_JOY_TRANS_H
-
- .set REG_IME, REG_BASE + OFFSET_REG_IME
- .set REG_IE, REG_BASE + OFFSET_REG_IE
- .set REG_IF, REG_BASE + OFFSET_REG_IF
-
- .set REG_WAITCNT, REG_BASE + OFFSET_REG_WAITCNT
-
-@ DMA register constants
-
- .set DMA_DEST_INC, 0x0000
- .set DMA_DEST_DEC, 0x0020
- .set DMA_DEST_FIXED, 0x0040
- .set DMA_DEST_RELOAD, 0x0060
- .set DMA_SRC_INC, 0x0000
- .set DMA_SRC_DEC, 0x0080
- .set DMA_SRC_FIXED, 0x0100
- .set DMA_REPEAT, 0x0200
- .set DMA_16BIT, 0x0000
- .set DMA_32BIT, 0x0400
- .set DMA_DREQ_ON, 0x0800
- .set DMA_START_NOW, 0x0000
- .set DMA_START_VBLANK, 0x1000
- .set DMA_START_HBLANK, 0x2000
- .set DMA_START_SPECIAL, 0x3000
- .set DMA_INTR_ENABLE, 0x4000
- .set DMA_ENABLE, 0x8000
-
-@ OAM attribute constants
-
- .set OAM_OBJ_NORMAL, 0x00000000
- .set OAM_OBJ_BLEND, 0x00000400
- .set OAM_OBJ_WINDOW, 0x00000800
-
- .set OAM_AFFINE_NONE, 0x00000000
- .set OAM_AFFINE_NORMAL_SIZE, 0x00000100
- .set OAM_OBJ_DISABLED, 0x00000200
- .set OAM_AFFINE_DOUBLE_SIZE, 0x00000300
-
- .set OAM_MOSAIC_OFF, 0x00000000
- .set OAM_MOSAIC_ON, 0x00001000
-
- .set OAM_4BPP, 0x00000000
- .set OAM_8BPP, 0x00002000
-
- .set OAM_H_FLIP, 0x10000000
- .set OAM_V_FLIP, 0x20000000
-
- .set OAM_SQUARE, 0x00000000
- .set OAM_H_RECTANGLE, 0x00004000
- .set OAM_V_RECTANGLE, 0x00008000
- .set OAM_SIZE_0, 0x00000000
- .set OAM_SIZE_1, 0x40000000
- .set OAM_SIZE_2, 0x80000000
- .set OAM_SIZE_3, 0xc0000000
-
- .set OAM_SIZE_8x8, OAM_SIZE_0 | OAM_SQUARE
- .set OAM_SIZE_16x16, OAM_SIZE_1 | OAM_SQUARE
- .set OAM_SIZE_32x32, OAM_SIZE_2 | OAM_SQUARE
- .set OAM_SIZE_64x64, OAM_SIZE_3 | OAM_SQUARE
-
- .set OAM_SIZE_16x8, OAM_SIZE_0 | OAM_H_RECTANGLE
- .set OAM_SIZE_32x8, OAM_SIZE_1 | OAM_H_RECTANGLE
- .set OAM_SIZE_32x16, OAM_SIZE_2 | OAM_H_RECTANGLE
- .set OAM_SIZE_64x32, OAM_SIZE_3 | OAM_H_RECTANGLE
-
- .set OAM_SIZE_8x16, OAM_SIZE_0 | OAM_V_RECTANGLE
- .set OAM_SIZE_8x32, OAM_SIZE_1 | OAM_V_RECTANGLE
- .set OAM_SIZE_16x32, OAM_SIZE_2 | OAM_V_RECTANGLE
- .set OAM_SIZE_32x64, OAM_SIZE_3 | OAM_V_RECTANGLE
diff --git a/berry_fix/payload/graphics/debug_digits.png b/berry_fix/payload/graphics/debug_digits.png
deleted file mode 100644
index edf0d36c96..0000000000
Binary files a/berry_fix/payload/graphics/debug_digits.png and /dev/null differ
diff --git a/berry_fix/payload/graphics/msg_box.png b/berry_fix/payload/graphics/msg_box.png
deleted file mode 100644
index 00d1bbe37e..0000000000
Binary files a/berry_fix/payload/graphics/msg_box.png and /dev/null differ
diff --git a/berry_fix/payload/graphics/msg_box.tilemap b/berry_fix/payload/graphics/msg_box.tilemap
deleted file mode 100644
index 5b82401bad..0000000000
Binary files a/berry_fix/payload/graphics/msg_box.tilemap and /dev/null differ
diff --git a/berry_fix/payload/include/constants/game_stat.h b/berry_fix/payload/include/constants/game_stat.h
deleted file mode 100644
index 47d703d853..0000000000
--- a/berry_fix/payload/include/constants/game_stat.h
+++ /dev/null
@@ -1,56 +0,0 @@
-#ifndef GUARD_CONSTANTS_GAME_STAT_H
-#define GUARD_CONSTANTS_GAME_STAT_H
-
-#define GAME_STAT_SAVED_GAME 0
-#define GAME_STAT_FIRST_HOF_PLAY_TIME 1
-#define GAME_STAT_STARTED_TRENDS 2
-#define GAME_STAT_PLANTED_BERRIES 3
-#define GAME_STAT_TRADED_BIKES 4
-#define GAME_STAT_STEPS 5
-#define GAME_STAT_GOT_INTERVIEWED 6
-#define GAME_STAT_TOTAL_BATTLES 7
-#define GAME_STAT_WILD_BATTLES 8
-#define GAME_STAT_TRAINER_BATTLES 9
-#define GAME_STAT_ENTERED_HOF 10
-#define GAME_STAT_POKEMON_CAPTURES 11
-#define GAME_STAT_FISHING_CAPTURES 12
-#define GAME_STAT_HATCHED_EGGS 13
-#define GAME_STAT_EVOLVED_POKEMON 14
-#define GAME_STAT_USED_POKECENTER 15
-#define GAME_STAT_RESTED_AT_HOME 16
-#define GAME_STAT_ENTERED_SAFARI_ZONE 17
-#define GAME_STAT_USED_CUT 18
-#define GAME_STAT_USED_ROCK_SMASH 19
-#define GAME_STAT_MOVED_SECRET_BASE 20
-#define GAME_STAT_POKEMON_TRADES 21
-#define GAME_STAT_UNKNOWN_22 22
-#define GAME_STAT_LINK_BATTLE_WINS 23
-#define GAME_STAT_LINK_BATTLE_LOSSES 24
-#define GAME_STAT_LINK_BATTLE_DRAWS 25
-#define GAME_STAT_USED_SPLASH 26
-#define GAME_STAT_USED_STRUGGLE 27
-#define GAME_STAT_SLOT_JACKPOTS 28
-#define GAME_STAT_CONSECUTIVE_ROULETTE_WINS 29
-#define GAME_STAT_ENTERED_BATTLE_TOWER 30
-#define GAME_STAT_UNKNOWN_31 31
-#define GAME_STAT_BATTLE_TOWER_BEST_STREAK 32
-#define GAME_STAT_POKEBLOCKS 33
-#define GAME_STAT_POKEBLOCKS_WITH_FRIENDS 34
-#define GAME_STAT_WON_LINK_CONTEST 35
-#define GAME_STAT_ENTERED_CONTEST 36
-#define GAME_STAT_WON_CONTEST 37
-#define GAME_STAT_SHOPPED 38
-#define GAME_STAT_USED_ITEMFINDER 39
-#define GAME_STAT_GOT_RAINED_ON 40
-#define GAME_STAT_CHECKED_POKEDEX 41
-#define GAME_STAT_RECEIVED_RIBBONS 42
-#define GAME_STAT_JUMPED_DOWN_LEDGES 43
-#define GAME_STAT_WATCHED_TV 44
-#define GAME_STAT_CHECKED_CLOCK 45
-#define GAME_STAT_WON_POKEMON_LOTTERY 46
-#define GAME_STAT_USED_DAYCARE 47
-#define GAME_STAT_RODE_CABLE_CAR 48
-#define GAME_STAT_ENTERED_HOT_SPRINGS 49
-#define NUM_GAME_STATS 50
-
-#endif // GUARD_CONSTANTS_GAME_STAT_H
diff --git a/berry_fix/payload/include/constants/vars.h b/berry_fix/payload/include/constants/vars.h
deleted file mode 100644
index 4b40c1d8c3..0000000000
--- a/berry_fix/payload/include/constants/vars.h
+++ /dev/null
@@ -1,196 +0,0 @@
-#ifndef GUARD_CONSTANTS_VARS_H
-#define GUARD_CONSTANTS_VARS_H
-
-#define VAR_0x3F20 0x3F20
-
-#define VARS_START 0x4000
-
-// temporary vars
-// The first 0x10 vars are are temporary--they are cleared every time a map is loaded.
-#define VAR_TEMP_0 0x4000
-#define VAR_TEMP_1 0x4001
-#define VAR_TEMP_2 0x4002
-#define VAR_TEMP_3 0x4003
-#define VAR_TEMP_4 0x4004
-#define VAR_TEMP_5 0x4005
-#define VAR_TEMP_6 0x4006
-#define VAR_TEMP_7 0x4007
-#define VAR_TEMP_8 0x4008
-#define VAR_TEMP_9 0x4009
-#define VAR_TEMP_A 0x400A
-#define VAR_TEMP_B 0x400B
-#define VAR_TEMP_C 0x400C
-#define VAR_TEMP_D 0x400D
-#define VAR_TEMP_E 0x400E
-#define VAR_TEMP_F 0x400F
-
-// object gfx id vars
-// These 0x10 vars are used to dynamically control a event object's sprite.
-// For example, the rival's sprite id is dynamically set based on the player's gender.
-// See VarGetEventObjectGraphicsId().
-#define VAR_OBJ_GFX_ID_0 0x4010
-#define VAR_OBJ_GFX_ID_1 0x4011
-#define VAR_OBJ_GFX_ID_2 0x4012
-#define VAR_OBJ_GFX_ID_3 0x4013
-#define VAR_OBJ_GFX_ID_4 0x4014
-#define VAR_OBJ_GFX_ID_5 0x4015
-#define VAR_OBJ_GFX_ID_6 0x4016
-#define VAR_OBJ_GFX_ID_7 0x4017
-#define VAR_OBJ_GFX_ID_8 0x4018
-#define VAR_OBJ_GFX_ID_9 0x4019
-#define VAR_OBJ_GFX_ID_A 0x401A
-#define VAR_OBJ_GFX_ID_B 0x401B
-#define VAR_OBJ_GFX_ID_C 0x401C
-#define VAR_OBJ_GFX_ID_D 0x401D
-#define VAR_OBJ_GFX_ID_E 0x401E
-#define VAR_OBJ_GFX_ID_F 0x401F
-
-// general purpose vars
-#define VAR_RECYCLE_GOODS 0x4020
-#define VAR_REPEL_STEP_COUNT 0x4021
-#define VAR_ICE_STEP_COUNT 0x4022
-#define VAR_STARTER_MON 0x4023 // 0=Treecko, 1=Torchic, 2=Mudkip
-#define VAR_MIRAGE_RND_H 0x4024
-#define VAR_MIRAGE_RND_L 0x4025
-#define VAR_SECRET_BASE_MAP 0x4026
-#define VAR_CYCLING_ROAD_RECORD_COLLISIONS 0x4027
-#define VAR_CYCLING_ROAD_RECORD_TIME_L 0x4028
-#define VAR_CYCLING_ROAD_RECORD_TIME_H 0x4029
-#define VAR_HAPPINESS_STEP_COUNTER 0x402A
-#define VAR_POISON_STEP_COUNTER 0x402B
-#define VAR_RESET_RTC_ENABLE 0x402C
-#define VAR_ENIGMA_BERRY_AVAILABLE 0x402D
-
-#define VAR_DAYS 0x4040
-#define VAR_FANCLUB_UNKNOWN_1 0x4041 // TODO: document these two fanclub vars
-#define VAR_FANCLUB_UNKNOWN_2 0x4042
-#define VAR_DEPT_STORE_FLOOR 0x4043
-#define VAR_TRICK_HOUSE_ROOMS_COMPLETED 0x4044
-#define VAR_LOTTERY_PRIZE 0x4045
-#define VAR_NATIONAL_DEX 0x4046
-#define VAR_SHROOMISH_SIZE_RECORD 0x4047
-#define VAR_ASH_GATHER_COUNT 0x4048
-#define VAR_BIRCH_STATE 0x4049
-#define VAR_CRUISE_STEP_COUNT 0x404A
-#define VAR_LOTTERY_RND_L 0x404B
-#define VAR_LOTTERY_RND_H 0x404C
-
-#define VAR_BARBOACH_SIZE_RECORD 0x404F
-#define VAR_LITTLEROOT_STATE 0x4050
-#define VAR_ROUTE102_ACCESSIBLE 0x4051
-
-#define VAR_LAVARIDGE_RIVAL_STATE 0x4053
-#define VAR_CURRENT_SECRET_BASE 0x4054
-
-#define VAR_PETALBURG_STATE 0x4057
-#define VAR_SLATEPORT_STATE 0x4058
-
-#define VAR_RUSTBORO_STATE 0x405A
-
-#define VAR_SOOTOPOLIS_STATE 0x405E
-
-#define VAR_ROUTE101_STATE 0x4060
-
-#define VAR_ROUTE103_STATE 0x4062
-
-#define VAR_ROUTE110_STATE 0x4069
-
-#define VAR_ROUTE116_STATE 0x406F
-
-#define VAR_ROUTE118_STATE 0x4071
-#define VAR_ROUTE119_STATE 0x4072
-
-#define VAR_ROUTE121_STATE 0x4074
-#define VAR_ROUTE128_STATE 0x407B
-
-#define VAR_LITTLEROOT_HOUSES_STATE 0x4082 // TODO: needs more investigation
-
-#define VAR_BIRCH_LAB_STATE 0x4084
-#define VAR_PETALBURG_GYM_STATE 0x4085
-#define VAR_LINK_CONTEST_ROOM_STATE 0x4086
-#define VAR_CABLE_CLUB_STATE 0x4087
-#define VAR_CONTEST_LOCATION 0x4088
-#define VAR_MAP_SCENE_SIX_ISLAND_POKEMON_CENTER_1F 0x4089 // TODO: related to decorations
-#define VAR_CONTEST_PRIZE_PICKUP 0x408A
-
-#define VAR_LITTLEROOT_HOUSES_STATE_2 0x408C // TODO: needs more investigation
-#define VAR_LITTLEROOT_RIVAL_STATE 0x408D
-#define VAR_BOARD_BRINEY_BOAT_ROUTE104_STATE 0x408E
-#define VAR_DEVON_CORP_3F_STATE 0x408F
-#define VAR_BRINEY_HOUSE_STATE 0x4090
-
-#define VAR_LITTLEROOT_INTRO_STATE 0x4092
-#define VAR_MAUVILLE_GYM_STATE 0x4093
-#define VAR_LILYCOVE_MUSEUM_2F_STATE 0x4094
-#define VAR_LILYCOVE_FAN_CLUB_STATE 0x4095
-#define VAR_BRINEY_LOCATION 0x4096
-#define VAR_0x4097 0x4097 // TODO: related to creating new secret base
-#define VAR_PETALBURG_WOODS_STATE 0x4098
-#define VAR_LILYCOVE_CONTEST_LOBBY_STATE 0x4099
-#define VAR_RUSTURF_TUNNEL_STATE 0x409a
-#define VAR_CAVE_OF_ORIGIN_B4F_STATE 0x409B
-#define VAR_ELITE_4_STATE 0x409C
-
-#define VAR_SLATEPORT_HARBOR_STATE 0x40A0
-
-#define VAR_SEAFLOOR_CAVERN_STATE 0x40A2
-#define VAR_CABLE_CAR_STATION_STATE 0x40A3
-#define VAR_SAFARI_ZONE_STATE 0x40A4
-#define VAR_TRICK_HOUSE_ENTRANCE_STATE 0x40A5
-#define VAR_TRICK_HOUSE_ENTRANCE_STATE_2 0x40A6
-#define VAR_TRICK_HOUSE_ENTRANCE_STATE_3 0x40A7
-
-#define VAR_CYCLING_CHALLENGE_STATE 0x40A9
-#define VAR_SLATEPORT_MUSEUM_1F_STATE 0x40AA
-#define VAR_TRICK_HOUSE_PUZZLE_1_STATE 0x40AB
-#define VAR_TRICK_HOUSE_PUZZLE_2_STATE 0x40AC
-#define VAR_TRICK_HOUSE_PUZZLE_3_STATE 0x40AD
-#define VAR_TRICK_HOUSE_PUZZLE_4_STATE 0x40AE
-#define VAR_TRICK_HOUSE_PUZZLE_5_STATE 0x40AF
-#define VAR_TRICK_HOUSE_PUZZLE_6_STATE 0x40B0
-#define VAR_TRICK_HOUSE_PUZZLE_7_STATE 0x40B1
-#define VAR_TRICK_HOUSE_PUZZLE_8_STATE 0x40B2
-#define VAR_WEATHER_INSTITUTE_STATE 0x40B3
-#define VAR_PORTHOLE_STATE 0x40B4
-#define VAR_TRICK_HOUSE_STATE 0x40B5 // TODO: needs some further investigation
-#define VAR_TRICK_HOUSE_PUZZLE_7_STATE_2 0x40B6
-#define VAR_SLATEPORT_FAN_CLUB_STATE 0x40B7
-
-#define VAR_MT_PYRE_STATE 0x40B9
-#define VAR_NEW_MAUVILLE_STATE 0x40BA
-
-#define VAR_BRAVO_TRAINER_BATTLE_TOWER_ON 0x40BC
-#define VAR_JAGGED_PASS_VOLCANIC_ASH_WEATHER 0x40BD
-#define VAR_GLASS_WORKSHOP_STATE 0x40BE
-#define VAR_METEOR_FALLS_STATE 0x40BF
-#define VAR_GAME_CORNER_STATE 0x40C0
-#define VAR_TRICK_HOUSE_PRIZE_PICKUP 0x40C1
-#define VAR_PACIFIDLOG_TM_RECEIVED_DAY 0x40C2
-#define VAR_VICTORY_ROAD_1F_STATE 0x40C3
-#define VAR_FOSSIL_RESURRECTION_STATE 0x40C4
-#define VAR_WHICH_FOSSIL_REVIVED 0x40C5
-#define VAR_STEVENS_HOUSE_STATE 0x40C6
-#define VAR_OLDALE_STATE 0x40C7
-
-// special vars
-// They are commonly used as parameters to commands, or return values from commands.
-#define VAR_SPECIAL_0 0x8000
-#define VAR_SPECIAL_1 0x8001
-#define VAR_SPECIAL_2 0x8002
-#define VAR_SPECIAL_3 0x8003
-#define VAR_SPECIAL_4 0x8004
-#define VAR_SPECIAL_5 0x8005
-#define VAR_SPECIAL_6 0x8006
-#define VAR_SPECIAL_7 0x8007
-#define VAR_SPECIAL_8 0x8008
-#define VAR_SPECIAL_9 0x8009
-#define VAR_SPECIAL_A 0x800A
-#define VAR_SPECIAL_B 0x800B
-#define FACING 0x800C
-#define RESULT 0x800D
-#define ITEM_ID 0x800E
-#define LAST_TALKED 0x800F
-#define CONTEST_RANK 0x8010
-#define CONTEST_CATEGORY 0x8011
-
-#endif // GUARD_CONSTANTS_VARS_H
diff --git a/berry_fix/payload/include/flash.h b/berry_fix/payload/include/flash.h
deleted file mode 100644
index 7fc35896d0..0000000000
--- a/berry_fix/payload/include/flash.h
+++ /dev/null
@@ -1,55 +0,0 @@
-#ifndef GUARD_FLASH_H
-#define GUARD_FLASH_H
-
-#include "gba/gba.h"
-
-enum
-{
- SECTOR_DAMAGED,
- SECTOR_OK,
- SECTOR_CHECK, // unused
-};
-
-enum MsgBoxUpdateMessage
-{
- MSGBOX_WILL_NOW_UPDATE = 0,
- MSGBOX_HAS_BEEN_UPDATED,
- MSGBOX_UNABLE_TO_UPDATE,
- MSGBOX_NO_NEED_TO_UPDATE,
- MSGBOX_UPDATING
-};
-
-struct SaveSector
-{
- u8 data[0xFF4];
- u16 id;
- u16 checksum;
- u32 signature;
- u32 counter;
-}; // size is 0x1000
-
-// headless save section?
-struct UnkSaveSection
-{
- u8 data[0xFF4];
- u32 signature;
-}; // size is 0xFF8
-
-#define eSaveSection ((struct SaveSector *)0x2020000)
-
-#define NUM_SECTORS_PER_SAVE_SLOT 14 // Number of sectors occupied by a save slot
-#define FILE_SIGNATURE 0x08012025
-
-#define SAVE_STATUS_EMPTY 0
-#define SAVE_STATUS_OK 1
-#define SAVE_STATUS_NO_FLASH 4
-#define SAVE_STATUS_ERROR 0xFF
-
-bool32 flash_maincb_ident_is_valid(void);
-bool8 flash_maincb_read_save(u32);
-void msg_load_gfx(void);
-void msg_display(enum MsgBoxUpdateMessage);
-bool32 flash_maincb_check_need_reset_pacifidlog_tm(void);
-bool32 flash_maincb_reset_pacifidlog_tm(void);
-
-#endif //GUARD_FLASH_H
diff --git a/berry_fix/payload/include/gba/defines.h b/berry_fix/payload/include/gba/defines.h
deleted file mode 100644
index 4037af5846..0000000000
--- a/berry_fix/payload/include/gba/defines.h
+++ /dev/null
@@ -1,87 +0,0 @@
-#ifndef GUARD_GBA_DEFINES_H
-#define GUARD_GBA_DEFINES_H
-
-#include
-
-#define TRUE 1
-#define FALSE 0
-
-#define BSS_DATA __attribute__((section(".bss")))
-#define IWRAM_DATA __attribute__((section("iwram_data")))
-#define EWRAM_DATA __attribute__((section("ewram_data")))
-#define UNUSED __attribute__((unused))
-#define NAKED __attribute__((naked))
-
-#define ALIGNED(n) __attribute__((aligned(n)))
-
-#define SOUND_INFO_PTR (*(struct SoundInfo **)0x3007FF0)
-#define INTR_CHECK (*(u16 *)0x3007FF8)
-#define INTR_VECTOR (*(void **)0x3007FFC)
-
-#define EWRAM_START 0x02000000
-#define EWRAM_END (EWRAM_START + 0x40000)
-#define IWRAM_START 0x03000000
-#define IWRAM_END (IWRAM_START + 0x8000)
-
-#define PLTT 0x5000000
-#define PLTT_SIZE 0x400
-
-#define BG_PLTT PLTT
-#define BG_PLTT_SIZE 0x200
-
-#define OBJ_PLTT (PLTT + 0x200)
-#define OBJ_PLTT_SIZE 0x200
-
-#define VRAM 0x6000000
-#define VRAM_SIZE 0x18000
-
-#define BG_VRAM VRAM
-#define BG_VRAM_SIZE 0x10000
-#define BG_CHAR_SIZE 0x4000
-#define BG_SCREEN_SIZE 0x800
-#define BG_CHAR_ADDR(n) (void *)(BG_VRAM + (0x4000 * (n)))
-#define BG_SCREEN_ADDR(n) (void *)(BG_VRAM + (0x800 * (n)))
-#define BG_TILE_ADDR(n) (void *)(BG_VRAM + (0x80 * (n)))
-
-#define BG_TILE_H_FLIP(n) (0x400 + (n))
-#define BG_TILE_V_FLIP(n) (0x800 + (n))
-
-// text-mode BG
-#define OBJ_VRAM0 (void *)(VRAM + 0x10000)
-#define OBJ_VRAM0_SIZE 0x8000
-
-// bitmap-mode BG
-#define OBJ_VRAM1 (void *)(VRAM + 0x14000)
-#define OBJ_VRAM1_SIZE 0x4000
-
-#define OAM 0x7000000
-#define OAM_SIZE 0x400
-
-#define ROM_HEADER_SIZE 0xC0
-
-#define DISPLAY_WIDTH 240
-#define DISPLAY_HEIGHT 160
-
-#define TILE_SIZE_4BPP 32
-#define TILE_SIZE_8BPP 64
-
-#define TILE_OFFSET_4BPP(n) ((n) * TILE_SIZE_4BPP)
-#define TILE_OFFSET_8BPP(n) ((n) * TILE_SIZE_8BPP)
-
-#define TOTAL_OBJ_TILE_COUNT 1024
-
-#define RGB(r, g, b) ((r) | ((g) << 5) | ((b) << 10))
-#define RGB2(r, g, b) (((b) << 10) | ((g) << 5) | (r))
-#define _RGB(r, g, b) ((((b) & 0x1F) << 10) + (((g) & 0x1F) << 5) + ((r) & 0x1F))
-
-#define RGB_BLACK RGB(0, 0, 0)
-#define RGB_WHITE RGB(31, 31, 31)
-#define RGB_RED RGB(31, 0, 0)
-#define RGB_GREEN RGB(0, 31, 0)
-#define RGB_BLUE RGB(0, 0, 31)
-#define RGB_YELLOW RGB(31, 31, 0)
-#define RGB_MAGENTA RGB(31, 0, 31)
-#define RGB_CYAN RGB(0, 31, 31)
-#define RGB_WHITEALPHA (RGB_WHITE | 0x8000)
-
-#endif // GUARD_GBA_DEFINES_H
diff --git a/berry_fix/payload/include/gba/flash_internal.h b/berry_fix/payload/include/gba/flash_internal.h
deleted file mode 100644
index 6fbec31f1b..0000000000
--- a/berry_fix/payload/include/gba/flash_internal.h
+++ /dev/null
@@ -1,85 +0,0 @@
-#ifndef GUARD_GBA_FLASH_INTERNAL_H
-#define GUARD_GBA_FLASH_INTERNAL_H
-
-#include "gba/gba.h"
-
-#define FLASH_BASE ((u8 *)0xE000000)
-
-#define FLASH_WRITE(addr, data) ((*(vu8 *)(FLASH_BASE + (addr))) = (data))
-
-#define FLASH_ROM_SIZE_1M 131072 // 1 megabit ROM
-
-#define SECTORS_PER_BANK 16
-
-struct FlashSector
-{
- u32 size;
- u8 shift;
- u16 count;
- u16 top;
-};
-
-struct FlashType {
- u32 romSize;
- struct FlashSector sector;
- u16 wait[2]; // game pak bus read/write wait
-
- // TODO: add support for anonymous unions/structs if possible
- union {
- struct {
- u8 makerId;
- u8 deviceId;
- } separate;
- u16 joined;
- } ids;
-};
-
-struct FlashSetupInfo
-{
- u16 (*programFlashByte)(u16, u32, u8);
- u16 (*programFlashSector)(u16, void *);
- u16 (*eraseFlashChip)(void);
- u16 (*eraseFlashSector)(u16);
- u16 (*WaitForFlashWrite)(u8, u8 *, u8);
- const u16 *maxTime;
- struct FlashType type;
-};
-
-extern u16 gFlashNumRemainingBytes;
-
-extern u16 (*ProgramFlashByte)(u16, u32, u8);
-extern u16 (*ProgramFlashSector)(u16, void *);
-extern u16 (*EraseFlashChip)(void);
-extern u16 (*EraseFlashSector)(u16);
-extern u16 (*WaitForFlashWrite)(u8, u8 *, u8);
-extern const u16 *gFlashMaxTime;
-extern const struct FlashType *gFlash;
-
-extern u8 (*PollFlashStatus)(u8 *);
-extern u8 gFlashTimeoutFlag;
-
-extern const struct FlashSetupInfo MX29L010;
-extern const struct FlashSetupInfo LE26FV10N1TS;
-extern const struct FlashSetupInfo DefaultFlash;
-
-void SwitchFlashBank(u8 bankNum);
-u16 ReadFlashId(void);
-void StartFlashTimer(u8 phase);
-void SetReadFlash1(u16 *dest);
-void StopFlashTimer(void);
-u16 SetFlashTimerIntr(u8 timerNum, void (**intrFunc)(void));
-u32 ProgramFlashSectorAndVerify(u16 sectorNum, u8 *src);
-void ReadFlash(u16 sectorNum, u32 offset, void *dest, u32 size);
-u32 ProgramFlashSectorAndVerifyNBytes(u16 sectorNum, void *dataSrc, u32 n);
-
-u16 WaitForFlashWrite_Common(u8 phase, u8 *addr, u8 lastData);
-
-u16 EraseFlashChip_MX(void);
-u16 EraseFlashSector_MX(u16 sectorNum);
-u16 ProgramFlashByte_MX(u16 sectorNum, u32 offset, u8 data);
-u16 ProgramFlashSector_MX(u16 sectorNum, void *src);
-
-// agb_flash_1m
-u32 IdentifyFlash(void);
-
-#endif // GUARD_GBA_FLASH_INTERNAL_H
diff --git a/berry_fix/payload/include/gba/gba.h b/berry_fix/payload/include/gba/gba.h
deleted file mode 100644
index 349344031f..0000000000
--- a/berry_fix/payload/include/gba/gba.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#ifndef GUARD_GBA_GBA_H
-#define GUARD_GBA_GBA_H
-
-#include "gba/defines.h"
-#include "gba/io_reg.h"
-#include "gba/types.h"
-#include "gba/multiboot.h"
-#include "gba/syscall.h"
-#include "gba/macro.h"
-#include "gba/isagbprint.h"
-
-#endif // GUARD_GBA_GBA_H
diff --git a/berry_fix/payload/include/gba/io_reg.h b/berry_fix/payload/include/gba/io_reg.h
deleted file mode 100644
index df79b084d3..0000000000
--- a/berry_fix/payload/include/gba/io_reg.h
+++ /dev/null
@@ -1,770 +0,0 @@
-#ifndef GUARD_GBA_IO_REG_H
-#define GUARD_GBA_IO_REG_H
-
-#define REG_BASE 0x4000000 // I/O register base address
-
-// I/O register offsets
-
-#define REG_OFFSET_DISPCNT 0x0
-#define REG_OFFSET_DISPSTAT 0x4
-#define REG_OFFSET_VCOUNT 0x6
-#define REG_OFFSET_BG0CNT 0x8
-#define REG_OFFSET_BG1CNT 0xa
-#define REG_OFFSET_BG2CNT 0xc
-#define REG_OFFSET_BG3CNT 0xe
-#define REG_OFFSET_BG0HOFS 0x10
-#define REG_OFFSET_BG0VOFS 0x12
-#define REG_OFFSET_BG1HOFS 0x14
-#define REG_OFFSET_BG1VOFS 0x16
-#define REG_OFFSET_BG2HOFS 0x18
-#define REG_OFFSET_BG2VOFS 0x1a
-#define REG_OFFSET_BG3HOFS 0x1c
-#define REG_OFFSET_BG3VOFS 0x1e
-#define REG_OFFSET_BG2PA 0x20
-#define REG_OFFSET_BG2PB 0x22
-#define REG_OFFSET_BG2PC 0x24
-#define REG_OFFSET_BG2PD 0x26
-#define REG_OFFSET_BG2X 0x28
-#define REG_OFFSET_BG2X_L 0x28
-#define REG_OFFSET_BG2X_H 0x2a
-#define REG_OFFSET_BG2Y 0x2c
-#define REG_OFFSET_BG2Y_L 0x2c
-#define REG_OFFSET_BG2Y_H 0x2e
-#define REG_OFFSET_BG3PA 0x30
-#define REG_OFFSET_BG3PB 0x32
-#define REG_OFFSET_BG3PC 0x34
-#define REG_OFFSET_BG3PD 0x36
-#define REG_OFFSET_BG3X 0x38
-#define REG_OFFSET_BG3X_L 0x38
-#define REG_OFFSET_BG3X_H 0x3a
-#define REG_OFFSET_BG3Y 0x3c
-#define REG_OFFSET_BG3Y_L 0x3c
-#define REG_OFFSET_BG3Y_H 0x3e
-#define REG_OFFSET_WIN0H 0x40
-#define REG_OFFSET_WIN1H 0x42
-#define REG_OFFSET_WIN0V 0x44
-#define REG_OFFSET_WIN1V 0x46
-#define REG_OFFSET_WININ 0x48
-#define REG_OFFSET_WINOUT 0x4a
-#define REG_OFFSET_MOSAIC 0x4c
-#define REG_OFFSET_BLDCNT 0x50
-#define REG_OFFSET_BLDALPHA 0x52
-#define REG_OFFSET_BLDY 0x54
-
-#define REG_OFFSET_SOUND1CNT_L 0x60
-#define REG_OFFSET_NR10 0x60
-#define REG_OFFSET_SOUND1CNT_H 0x62
-#define REG_OFFSET_NR11 0x62
-#define REG_OFFSET_NR12 0x63
-#define REG_OFFSET_SOUND1CNT_X 0x64
-#define REG_OFFSET_NR13 0x64
-#define REG_OFFSET_NR14 0x65
-#define REG_OFFSET_SOUND2CNT_L 0x68
-#define REG_OFFSET_NR21 0x68
-#define REG_OFFSET_NR22 0x69
-#define REG_OFFSET_SOUND2CNT_H 0x6c
-#define REG_OFFSET_NR23 0x6c
-#define REG_OFFSET_NR24 0x6d
-#define REG_OFFSET_SOUND3CNT_L 0x70
-#define REG_OFFSET_NR30 0x70
-#define REG_OFFSET_SOUND3CNT_H 0x72
-#define REG_OFFSET_NR31 0x72
-#define REG_OFFSET_NR32 0x73
-#define REG_OFFSET_SOUND3CNT_X 0x74
-#define REG_OFFSET_NR33 0x74
-#define REG_OFFSET_NR34 0x75
-#define REG_OFFSET_SOUND4CNT_L 0x78
-#define REG_OFFSET_NR41 0x78
-#define REG_OFFSET_NR42 0x79
-#define REG_OFFSET_SOUND4CNT_H 0x7c
-#define REG_OFFSET_NR43 0x7c
-#define REG_OFFSET_NR44 0x7d
-#define REG_OFFSET_SOUNDCNT_L 0x80
-#define REG_OFFSET_NR50 0x80
-#define REG_OFFSET_NR51 0x81
-#define REG_OFFSET_SOUNDCNT_H 0x82
-#define REG_OFFSET_SOUNDCNT_X 0x84
-#define REG_OFFSET_NR52 0x84
-#define REG_OFFSET_SOUNDBIAS 0x88
-#define REG_OFFSET_SOUNDBIAS_L 0x88
-#define REG_OFFSET_SOUNDBIAS_H 0x89
-#define REG_OFFSET_WAVE_RAM0 0x90
-#define REG_OFFSET_WAVE_RAM1 0x94
-#define REG_OFFSET_WAVE_RAM2 0x98
-#define REG_OFFSET_WAVE_RAM3 0x9c
-#define REG_OFFSET_FIFO_A 0xa0
-#define REG_OFFSET_FIFO_B 0xa4
-
-#define REG_OFFSET_DMA0 0xb0
-#define REG_OFFSET_DMA0SAD 0xb0
-#define REG_OFFSET_DMA0SAD_L 0xb0
-#define REG_OFFSET_DMA0SAD_H 0xb2
-#define REG_OFFSET_DMA0DAD 0xb4
-#define REG_OFFSET_DMA0DAD_L 0xb4
-#define REG_OFFSET_DMA0DAD_H 0xb6
-#define REG_OFFSET_DMA0CNT 0xb8
-#define REG_OFFSET_DMA0CNT_L 0xb8
-#define REG_OFFSET_DMA0CNT_H 0xba
-#define REG_OFFSET_DMA1 0xbc
-#define REG_OFFSET_DMA1SAD 0xbc
-#define REG_OFFSET_DMA1SAD_L 0xbc
-#define REG_OFFSET_DMA1SAD_H 0xbe
-#define REG_OFFSET_DMA1DAD 0xc0
-#define REG_OFFSET_DMA1DAD_L 0xc0
-#define REG_OFFSET_DMA1DAD_H 0xc2
-#define REG_OFFSET_DMA1CNT 0xc4
-#define REG_OFFSET_DMA1CNT_L 0xc4
-#define REG_OFFSET_DMA1CNT_H 0xc6
-#define REG_OFFSET_DMA2 0xc8
-#define REG_OFFSET_DMA2SAD 0xc8
-#define REG_OFFSET_DMA2SAD_L 0xc8
-#define REG_OFFSET_DMA2SAD_H 0xca
-#define REG_OFFSET_DMA2DAD 0xcc
-#define REG_OFFSET_DMA2DAD_L 0xcc
-#define REG_OFFSET_DMA2DAD_H 0xce
-#define REG_OFFSET_DMA2CNT 0xd0
-#define REG_OFFSET_DMA2CNT_L 0xd0
-#define REG_OFFSET_DMA2CNT_H 0xd2
-#define REG_OFFSET_DMA3 0xd4
-#define REG_OFFSET_DMA3SAD 0xd4
-#define REG_OFFSET_DMA3SAD_L 0xd4
-#define REG_OFFSET_DMA3SAD_H 0xd6
-#define REG_OFFSET_DMA3DAD 0xd8
-#define REG_OFFSET_DMA3DAD_L 0xd8
-#define REG_OFFSET_DMA3DAD_H 0xda
-#define REG_OFFSET_DMA3CNT 0xdc
-#define REG_OFFSET_DMA3CNT_L 0xdc
-#define REG_OFFSET_DMA3CNT_H 0xde
-
-#define REG_OFFSET_TMCNT 0x100
-#define REG_OFFSET_TMCNT_L 0x100
-#define REG_OFFSET_TMCNT_H 0x102
-#define REG_OFFSET_TM0CNT 0x100
-#define REG_OFFSET_TM0CNT_L 0x100
-#define REG_OFFSET_TM0CNT_H 0x102
-#define REG_OFFSET_TM1CNT 0x104
-#define REG_OFFSET_TM1CNT_L 0x104
-#define REG_OFFSET_TM1CNT_H 0x106
-#define REG_OFFSET_TM2CNT 0x108
-#define REG_OFFSET_TM2CNT_L 0x108
-#define REG_OFFSET_TM2CNT_H 0x10a
-#define REG_OFFSET_TM3CNT 0x10c
-#define REG_OFFSET_TM3CNT_L 0x10c
-#define REG_OFFSET_TM3CNT_H 0x10e
-
-#define REG_OFFSET_SIOCNT 0x128
-#define REG_OFFSET_SIODATA8 0x12a
-#define REG_OFFSET_SIODATA32 0x120
-#define REG_OFFSET_SIOMLT_SEND 0x12a
-#define REG_OFFSET_SIOMLT_RECV 0x120
-#define REG_OFFSET_SIOMULTI0 0x120
-#define REG_OFFSET_SIOMULTI1 0x122
-#define REG_OFFSET_SIOMULTI2 0x124
-#define REG_OFFSET_SIOMULTI3 0x126
-
-#define REG_OFFSET_KEYINPUT 0x130
-#define REG_OFFSET_KEYCNT 0x132
-
-#define REG_OFFSET_RCNT 0x134
-
-#define REG_OFFSET_JOYCNT 0x140
-#define REG_OFFSET_JOYSTAT 0x158
-#define REG_OFFSET_JOY_RECV 0x150
-#define REG_OFFSET_JOY_RECV_L 0x150
-#define REG_OFFSET_JOY_RECV_H 0x152
-#define REG_OFFSET_JOY_TRANS 0x154
-#define REG_OFFSET_JOY_TRANS_L 0x154
-#define REG_OFFSET_JOY_TRANS_H 0x156
-
-#define REG_OFFSET_IME 0x208
-#define REG_OFFSET_IE 0x200
-#define REG_OFFSET_IF 0x202
-
-#define REG_OFFSET_WAITCNT 0x204
-
-// I/O register addresses
-
-#define REG_ADDR_DISPCNT (REG_BASE + REG_OFFSET_DISPCNT)
-#define REG_ADDR_DISPSTAT (REG_BASE + REG_OFFSET_DISPSTAT)
-#define REG_ADDR_VCOUNT (REG_BASE + REG_OFFSET_VCOUNT)
-#define REG_ADDR_BG0CNT (REG_BASE + REG_OFFSET_BG0CNT)
-#define REG_ADDR_BG1CNT (REG_BASE + REG_OFFSET_BG1CNT)
-#define REG_ADDR_BG2CNT (REG_BASE + REG_OFFSET_BG2CNT)
-#define REG_ADDR_BG3CNT (REG_BASE + REG_OFFSET_BG3CNT)
-#define REG_ADDR_BG0HOFS (REG_BASE + REG_OFFSET_BG0HOFS)
-#define REG_ADDR_BG0VOFS (REG_BASE + REG_OFFSET_BG0VOFS)
-#define REG_ADDR_BG1HOFS (REG_BASE + REG_OFFSET_BG1HOFS)
-#define REG_ADDR_BG1VOFS (REG_BASE + REG_OFFSET_BG1VOFS)
-#define REG_ADDR_BG2HOFS (REG_BASE + REG_OFFSET_BG2HOFS)
-#define REG_ADDR_BG2VOFS (REG_BASE + REG_OFFSET_BG2VOFS)
-#define REG_ADDR_BG3HOFS (REG_BASE + REG_OFFSET_BG3HOFS)
-#define REG_ADDR_BG3VOFS (REG_BASE + REG_OFFSET_BG3VOFS)
-#define REG_ADDR_BG2PA (REG_BASE + REG_OFFSET_BG2PA)
-#define REG_ADDR_BG2PB (REG_BASE + REG_OFFSET_BG2PB)
-#define REG_ADDR_BG2PC (REG_BASE + REG_OFFSET_BG2PC)
-#define REG_ADDR_BG2PD (REG_BASE + REG_OFFSET_BG2PD)
-#define REG_ADDR_BG2X (REG_BASE + REG_OFFSET_BG2X)
-#define REG_ADDR_BG2X_L (REG_BASE + REG_OFFSET_BG2X_L)
-#define REG_ADDR_BG2X_H (REG_BASE + REG_OFFSET_BG2X_H)
-#define REG_ADDR_BG2Y (REG_BASE + REG_OFFSET_BG2Y)
-#define REG_ADDR_BG2Y_L (REG_BASE + REG_OFFSET_BG2Y_L)
-#define REG_ADDR_BG2Y_H (REG_BASE + REG_OFFSET_BG2Y_H)
-#define REG_ADDR_BG3PA (REG_BASE + REG_OFFSET_BG3PA)
-#define REG_ADDR_BG3PB (REG_BASE + REG_OFFSET_BG3PB)
-#define REG_ADDR_BG3PC (REG_BASE + REG_OFFSET_BG3PC)
-#define REG_ADDR_BG3PD (REG_BASE + REG_OFFSET_BG3PD)
-#define REG_ADDR_BG3X (REG_BASE + REG_OFFSET_BG3X)
-#define REG_ADDR_BG3X_L (REG_BASE + REG_OFFSET_BG3X_L)
-#define REG_ADDR_BG3X_H (REG_BASE + REG_OFFSET_BG3X_H)
-#define REG_ADDR_BG3Y (REG_BASE + REG_OFFSET_BG3Y)
-#define REG_ADDR_BG3Y_L (REG_BASE + REG_OFFSET_BG3Y_L)
-#define REG_ADDR_BG3Y_H (REG_BASE + REG_OFFSET_BG3Y_H)
-#define REG_ADDR_WIN0H (REG_BASE + REG_OFFSET_WIN0H)
-#define REG_ADDR_WIN1H (REG_BASE + REG_OFFSET_WIN1H)
-#define REG_ADDR_WIN0V (REG_BASE + REG_OFFSET_WIN0V)
-#define REG_ADDR_WIN1V (REG_BASE + REG_OFFSET_WIN1V)
-#define REG_ADDR_WININ (REG_BASE + REG_OFFSET_WININ)
-#define REG_ADDR_WINOUT (REG_BASE + REG_OFFSET_WINOUT)
-#define REG_ADDR_MOSAIC (REG_BASE + REG_OFFSET_MOSAIC)
-#define REG_ADDR_BLDCNT (REG_BASE + REG_OFFSET_BLDCNT)
-#define REG_ADDR_BLDALPHA (REG_BASE + REG_OFFSET_BLDALPHA)
-#define REG_ADDR_BLDY (REG_BASE + REG_OFFSET_BLDY)
-
-#define REG_ADDR_SOUND1CNT_L (REG_BASE + REG_OFFSET_SOUND1CNT_L)
-#define REG_ADDR_NR10 (REG_BASE + REG_OFFSET_NR10)
-#define REG_ADDR_SOUND1CNT_H (REG_BASE + REG_OFFSET_SOUND1CNT_H)
-#define REG_ADDR_NR11 (REG_BASE + REG_OFFSET_NR11)
-#define REG_ADDR_NR12 (REG_BASE + REG_OFFSET_NR12)
-#define REG_ADDR_SOUND1CNT_X (REG_BASE + REG_OFFSET_SOUND1CNT_X)
-#define REG_ADDR_NR13 (REG_BASE + REG_OFFSET_NR13)
-#define REG_ADDR_NR14 (REG_BASE + REG_OFFSET_NR14)
-#define REG_ADDR_SOUND2CNT_L (REG_BASE + REG_OFFSET_SOUND2CNT_L)
-#define REG_ADDR_NR21 (REG_BASE + REG_OFFSET_NR21)
-#define REG_ADDR_NR22 (REG_BASE + REG_OFFSET_NR22)
-#define REG_ADDR_SOUND2CNT_H (REG_BASE + REG_OFFSET_SOUND2CNT_H)
-#define REG_ADDR_NR23 (REG_BASE + REG_OFFSET_NR23)
-#define REG_ADDR_NR24 (REG_BASE + REG_OFFSET_NR24)
-#define REG_ADDR_SOUND3CNT_L (REG_BASE + REG_OFFSET_SOUND3CNT_L)
-#define REG_ADDR_NR30 (REG_BASE + REG_OFFSET_NR30)
-#define REG_ADDR_SOUND3CNT_H (REG_BASE + REG_OFFSET_SOUND3CNT_H)
-#define REG_ADDR_NR31 (REG_BASE + REG_OFFSET_NR31)
-#define REG_ADDR_NR32 (REG_BASE + REG_OFFSET_NR32)
-#define REG_ADDR_SOUND3CNT_X (REG_BASE + REG_OFFSET_SOUND3CNT_X)
-#define REG_ADDR_NR33 (REG_BASE + REG_OFFSET_NR33)
-#define REG_ADDR_NR34 (REG_BASE + REG_OFFSET_NR34)
-#define REG_ADDR_SOUND4CNT_L (REG_BASE + REG_OFFSET_SOUND4CNT_L)
-#define REG_ADDR_NR41 (REG_BASE + REG_OFFSET_NR41)
-#define REG_ADDR_NR42 (REG_BASE + REG_OFFSET_NR42)
-#define REG_ADDR_SOUND4CNT_H (REG_BASE + REG_OFFSET_SOUND4CNT_H)
-#define REG_ADDR_NR43 (REG_BASE + REG_OFFSET_NR43)
-#define REG_ADDR_NR44 (REG_BASE + REG_OFFSET_NR44)
-#define REG_ADDR_SOUNDCNT_L (REG_BASE + REG_OFFSET_SOUNDCNT_L)
-#define REG_ADDR_NR50 (REG_BASE + REG_OFFSET_NR50)
-#define REG_ADDR_NR51 (REG_BASE + REG_OFFSET_NR51)
-#define REG_ADDR_SOUNDCNT_H (REG_BASE + REG_OFFSET_SOUNDCNT_H)
-#define REG_ADDR_SOUNDCNT_X (REG_BASE + REG_OFFSET_SOUNDCNT_X)
-#define REG_ADDR_NR52 (REG_BASE + REG_OFFSET_NR52)
-#define REG_ADDR_SOUNDBIAS (REG_BASE + REG_OFFSET_SOUNDBIAS)
-#define REG_ADDR_SOUNDBIAS_L (REG_BASE + REG_OFFSET_SOUNDBIAS_L)
-#define REG_ADDR_SOUNDBIAS_H (REG_BASE + REG_OFFSET_SOUNDBIAS_H)
-#define REG_ADDR_WAVE_RAM0 (REG_BASE + REG_OFFSET_WAVE_RAM0)
-#define REG_ADDR_WAVE_RAM1 (REG_BASE + REG_OFFSET_WAVE_RAM1)
-#define REG_ADDR_WAVE_RAM2 (REG_BASE + REG_OFFSET_WAVE_RAM2)
-#define REG_ADDR_WAVE_RAM3 (REG_BASE + REG_OFFSET_WAVE_RAM3)
-#define REG_ADDR_FIFO_A (REG_BASE + REG_OFFSET_FIFO_A)
-#define REG_ADDR_FIFO_B (REG_BASE + REG_OFFSET_FIFO_B)
-
-#define REG_ADDR_DMA0 (REG_BASE + REG_OFFSET_DMA0)
-#define REG_ADDR_DMA0SAD (REG_BASE + REG_OFFSET_DMA0SAD)
-#define REG_ADDR_DMA0DAD (REG_BASE + REG_OFFSET_DMA0DAD)
-#define REG_ADDR_DMA0CNT (REG_BASE + REG_OFFSET_DMA0CNT)
-#define REG_ADDR_DMA0CNT_L (REG_BASE + REG_OFFSET_DMA0CNT_L)
-#define REG_ADDR_DMA0CNT_H (REG_BASE + REG_OFFSET_DMA0CNT_H)
-#define REG_ADDR_DMA1 (REG_BASE + REG_OFFSET_DMA1)
-#define REG_ADDR_DMA1SAD (REG_BASE + REG_OFFSET_DMA1SAD)
-#define REG_ADDR_DMA1DAD (REG_BASE + REG_OFFSET_DMA1DAD)
-#define REG_ADDR_DMA1CNT (REG_BASE + REG_OFFSET_DMA1CNT)
-#define REG_ADDR_DMA1CNT_L (REG_BASE + REG_OFFSET_DMA1CNT_L)
-#define REG_ADDR_DMA1CNT_H (REG_BASE + REG_OFFSET_DMA1CNT_H)
-#define REG_ADDR_DMA2 (REG_BASE + REG_OFFSET_DMA2)
-#define REG_ADDR_DMA2SAD (REG_BASE + REG_OFFSET_DMA2SAD)
-#define REG_ADDR_DMA2DAD (REG_BASE + REG_OFFSET_DMA2DAD)
-#define REG_ADDR_DMA2CNT (REG_BASE + REG_OFFSET_DMA2CNT)
-#define REG_ADDR_DMA2CNT_L (REG_BASE + REG_OFFSET_DMA2CNT_L)
-#define REG_ADDR_DMA2CNT_H (REG_BASE + REG_OFFSET_DMA2CNT_H)
-#define REG_ADDR_DMA3 (REG_BASE + REG_OFFSET_DMA3)
-#define REG_ADDR_DMA3SAD (REG_BASE + REG_OFFSET_DMA3SAD)
-#define REG_ADDR_DMA3DAD (REG_BASE + REG_OFFSET_DMA3DAD)
-#define REG_ADDR_DMA3CNT (REG_BASE + REG_OFFSET_DMA3CNT)
-#define REG_ADDR_DMA3CNT_L (REG_BASE + REG_OFFSET_DMA3CNT_L)
-#define REG_ADDR_DMA3CNT_H (REG_BASE + REG_OFFSET_DMA3CNT_H)
-
-#define REG_ADDR_TMCNT (REG_BASE + REG_OFFSET_TMCNT)
-#define REG_ADDR_TMCNT_L (REG_BASE + REG_OFFSET_TMCNT_L)
-#define REG_ADDR_TMCNT_H (REG_BASE + REG_OFFSET_TMCNT_H)
-#define REG_ADDR_TM0CNT (REG_BASE + REG_OFFSET_TM0CNT)
-#define REG_ADDR_TM0CNT_L (REG_BASE + REG_OFFSET_TM0CNT_L)
-#define REG_ADDR_TM0CNT_H (REG_BASE + REG_OFFSET_TM0CNT_H)
-#define REG_ADDR_TM1CNT (REG_BASE + REG_OFFSET_TM1CNT)
-#define REG_ADDR_TM1CNT_L (REG_BASE + REG_OFFSET_TM1CNT_L)
-#define REG_ADDR_TM1CNT_H (REG_BASE + REG_OFFSET_TM1CNT_H)
-#define REG_ADDR_TM2CNT (REG_BASE + REG_OFFSET_TM2CNT)
-#define REG_ADDR_TM2CNT_L (REG_BASE + REG_OFFSET_TM2CNT_L)
-#define REG_ADDR_TM2CNT_H (REG_BASE + REG_OFFSET_TM2CNT_H)
-#define REG_ADDR_TM3CNT (REG_BASE + REG_OFFSET_TM3CNT)
-#define REG_ADDR_TM3CNT_L (REG_BASE + REG_OFFSET_TM3CNT_L)
-#define REG_ADDR_TM3CNT_H (REG_BASE + REG_OFFSET_TM3CNT_H)
-
-#define REG_ADDR_SIOCNT (REG_BASE + REG_OFFSET_SIOCNT)
-#define REG_ADDR_SIODATA8 (REG_BASE + REG_OFFSET_SIODATA8)
-#define REG_ADDR_SIODATA32 (REG_BASE + REG_OFFSET_SIODATA32)
-#define REG_ADDR_SIOMLT_SEND (REG_BASE + REG_OFFSET_SIOMLT_SEND)
-#define REG_ADDR_SIOMLT_RECV (REG_BASE + REG_OFFSET_SIOMLT_RECV)
-#define REG_ADDR_SIOMULTI0 (REG_BASE + REG_OFFSET_SIOMULTI0)
-#define REG_ADDR_SIOMULTI1 (REG_BASE + REG_OFFSET_SIOMULTI1)
-#define REG_ADDR_SIOMULTI2 (REG_BASE + REG_OFFSET_SIOMULTI2)
-#define REG_ADDR_SIOMULTI3 (REG_BASE + REG_OFFSET_SIOMULTI3)
-
-#define REG_ADDR_KEYINPUT (REG_BASE + REG_OFFSET_KEYINPUT)
-#define REG_ADDR_KEYCNT (REG_BASE + REG_OFFSET_KEYCNT)
-
-#define REG_ADDR_RCNT (REG_BASE + REG_OFFSET_RCNT)
-
-#define REG_ADDR_JOYCNT (REG_BASE + REG_OFFSET_JOYCNT)
-#define REG_ADDR_JOYSTAT (REG_BASE + REG_OFFSET_JOYSTAT)
-#define REG_ADDR_JOY_RECV (REG_BASE + REG_OFFSET_JOY_RECV)
-#define REG_ADDR_JOY_RECV_L (REG_BASE + REG_OFFSET_JOY_RECV_L)
-#define REG_ADDR_JOY_RECV_H (REG_BASE + REG_OFFSET_JOY_RECV_H)
-#define REG_ADDR_JOY_TRANS (REG_BASE + REG_OFFSET_JOY_TRANS)
-#define REG_ADDR_JOY_TRANS_L (REG_BASE + REG_OFFSET_JOY_TRANS_L)
-#define REG_ADDR_JOY_TRANS_H (REG_BASE + REG_OFFSET_JOY_TRANS_H)
-
-#define REG_ADDR_IME (REG_BASE + REG_OFFSET_IME)
-#define REG_ADDR_IE (REG_BASE + REG_OFFSET_IE)
-#define REG_ADDR_IF (REG_BASE + REG_OFFSET_IF)
-
-#define REG_ADDR_WAITCNT (REG_BASE + REG_OFFSET_WAITCNT)
-
-// I/O registers
-
-#define REG_DISPCNT (*(vu16 *)REG_ADDR_DISPCNT)
-#define REG_DISPSTAT (*(vu16 *)REG_ADDR_DISPSTAT)
-#define REG_VCOUNT (*(vu16 *)REG_ADDR_VCOUNT)
-#define REG_BG0CNT (*(vu16 *)REG_ADDR_BG0CNT)
-#define REG_BG1CNT (*(vu16 *)REG_ADDR_BG1CNT)
-#define REG_BG2CNT (*(vu16 *)REG_ADDR_BG2CNT)
-#define REG_BG3CNT (*(vu16 *)REG_ADDR_BG3CNT)
-#define REG_BG0HOFS (*(vu16 *)REG_ADDR_BG0HOFS)
-#define REG_BG0VOFS (*(vu16 *)REG_ADDR_BG0VOFS)
-#define REG_BG1HOFS (*(vu16 *)REG_ADDR_BG1HOFS)
-#define REG_BG1VOFS (*(vu16 *)REG_ADDR_BG1VOFS)
-#define REG_BG2HOFS (*(vu16 *)REG_ADDR_BG2HOFS)
-#define REG_BG2VOFS (*(vu16 *)REG_ADDR_BG2VOFS)
-#define REG_BG3HOFS (*(vu16 *)REG_ADDR_BG3HOFS)
-#define REG_BG3VOFS (*(vu16 *)REG_ADDR_BG3VOFS)
-#define REG_BG2PA (*(vu16 *)REG_ADDR_BG2PA)
-#define REG_BG2PB (*(vu16 *)REG_ADDR_BG2PB)
-#define REG_BG2PC (*(vu16 *)REG_ADDR_BG2PC)
-#define REG_BG2PD (*(vu16 *)REG_ADDR_BG2PD)
-#define REG_BG2X (*(vu32 *)REG_ADDR_BG2X)
-#define REG_BG2X_L (*(vu16 *)REG_ADDR_BG2X_L)
-#define REG_BG2X_H (*(vu16 *)REG_ADDR_BG2X_H)
-#define REG_BG2Y (*(vu32 *)REG_ADDR_BG2Y)
-#define REG_BG2Y_L (*(vu16 *)REG_ADDR_BG2Y_L)
-#define REG_BG2Y_H (*(vu16 *)REG_ADDR_BG2Y_H)
-#define REG_BG3PA (*(vu16 *)REG_ADDR_BG3PA)
-#define REG_BG3PB (*(vu16 *)REG_ADDR_BG3PB)
-#define REG_BG3PC (*(vu16 *)REG_ADDR_BG3PC)
-#define REG_BG3PD (*(vu16 *)REG_ADDR_BG3PD)
-#define REG_BG3X (*(vu32 *)REG_ADDR_BG3X)
-#define REG_BG3X_L (*(vu16 *)REG_ADDR_BG3X_L)
-#define REG_BG3X_H (*(vu16 *)REG_ADDR_BG3X_H)
-#define REG_BG3Y (*(vu32 *)REG_ADDR_BG3Y)
-#define REG_BG3Y_L (*(vu16 *)REG_ADDR_BG3Y_L)
-#define REG_BG3Y_H (*(vu16 *)REG_ADDR_BG3Y_H)
-#define REG_WIN0H (*(vu16 *)REG_ADDR_WIN0H)
-#define REG_WIN1H (*(vu16 *)REG_ADDR_WIN1H)
-#define REG_WIN0V (*(vu16 *)REG_ADDR_WIN0V)
-#define REG_WIN1V (*(vu16 *)REG_ADDR_WIN1V)
-#define REG_WININ (*(vu16 *)REG_ADDR_WININ)
-#define REG_WINOUT (*(vu16 *)REG_ADDR_WINOUT)
-#define REG_MOSAIC (*(vu16 *)REG_ADDR_MOSAIC)
-#define REG_BLDCNT (*(vu16 *)REG_ADDR_BLDCNT)
-#define REG_BLDALPHA (*(vu16 *)REG_ADDR_BLDALPHA)
-#define REG_BLDY (*(vu16 *)REG_ADDR_BLDY)
-
-#define REG_SOUND1CNT_L (*(vu16 *)REG_ADDR_SOUND1CNT_L)
-#define REG_NR10 (*(vu8 *)REG_ADDR_NR10)
-#define REG_SOUND1CNT_H (*(vu16 *)REG_ADDR_SOUND1CNT_H)
-#define REG_NR11 (*(vu8 *)REG_ADDR_NR11)
-#define REG_NR12 (*(vu8 *)REG_ADDR_NR12)
-#define REG_SOUND1CNT_X (*(vu16 *)REG_ADDR_SOUND1CNT_X)
-#define REG_NR13 (*(vu8 *)REG_ADDR_NR13)
-#define REG_NR14 (*(vu8 *)REG_ADDR_NR14)
-#define REG_SOUND2CNT_L (*(vu16 *)REG_ADDR_SOUND2CNT_L)
-#define REG_NR21 (*(vu8 *)REG_ADDR_NR21)
-#define REG_NR22 (*(vu8 *)REG_ADDR_NR22)
-#define REG_SOUND2CNT_H (*(vu16 *)REG_ADDR_SOUND2CNT_H)
-#define REG_NR23 (*(vu8 *)REG_ADDR_NR23)
-#define REG_NR24 (*(vu8 *)REG_ADDR_NR24)
-#define REG_SOUND3CNT_L (*(vu16 *)REG_ADDR_SOUND3CNT_L)
-#define REG_NR30 (*(vu8 *)REG_ADDR_NR30)
-#define REG_SOUND3CNT_H (*(vu16 *)REG_ADDR_SOUND3CNT_H)
-#define REG_NR31 (*(vu8 *)REG_ADDR_NR31)
-#define REG_NR32 (*(vu8 *)REG_ADDR_NR32)
-#define REG_SOUND3CNT_X (*(vu16 *)REG_ADDR_SOUND3CNT_X)
-#define REG_NR33 (*(vu8 *)REG_ADDR_NR33)
-#define REG_NR34 (*(vu8 *)REG_ADDR_NR34)
-#define REG_SOUND4CNT_L (*(vu16 *)REG_ADDR_SOUND4CNT_L)
-#define REG_NR41 (*(vu8 *)REG_ADDR_NR41)
-#define REG_NR42 (*(vu8 *)REG_ADDR_NR42)
-#define REG_SOUND4CNT_H (*(vu16 *)REG_ADDR_SOUND4CNT_H)
-#define REG_NR43 (*(vu8 *)REG_ADDR_NR43)
-#define REG_NR44 (*(vu8 *)REG_ADDR_NR44)
-#define REG_SOUNDCNT_L (*(vu16 *)REG_ADDR_SOUNDCNT_L)
-#define REG_NR50 (*(vu8 *)REG_ADDR_NR50)
-#define REG_NR51 (*(vu8 *)REG_ADDR_NR51)
-#define REG_SOUNDCNT_H (*(vu16 *)REG_ADDR_SOUNDCNT_H)
-#define REG_SOUNDCNT_X (*(vu16 *)REG_ADDR_SOUNDCNT_X)
-#define REG_NR52 (*(vu8 *)REG_ADDR_NR52)
-#define REG_SOUNDBIAS (*(vu16 *)REG_ADDR_SOUNDBIAS)
-#define REG_SOUNDBIAS_L (*(vu8 *)REG_ADDR_SOUNDBIAS_L)
-#define REG_SOUNDBIAS_H (*(vu8 *)REG_ADDR_SOUNDBIAS_H)
-#define REG_WAVE_RAM0 (*(vu32 *)REG_ADDR_WAVE_RAM0)
-#define REG_WAVE_RAM1 (*(vu32 *)REG_ADDR_WAVE_RAM1)
-#define REG_WAVE_RAM2 (*(vu32 *)REG_ADDR_WAVE_RAM2)
-#define REG_WAVE_RAM3 (*(vu32 *)REG_ADDR_WAVE_RAM3)
-#define REG_FIFO_A (*(vu32 *)REG_ADDR_FIFO_A)
-#define REG_FIFO_B (*(vu32 *)REG_ADDR_FIFO_B)
-
-#define REG_DMA0SAD (*(vu32 *)REG_ADDR_DMA0SAD)
-#define REG_DMA0DAD (*(vu32 *)REG_ADDR_DMA0DAD)
-#define REG_DMA0CNT (*(vu32 *)REG_ADDR_DMA0CNT)
-#define REG_DMA0CNT_L (*(vu16 *)REG_ADDR_DMA0CNT_L)
-#define REG_DMA0CNT_H (*(vu16 *)REG_ADDR_DMA0CNT_H)
-
-#define REG_DMA1SAD (*(vu32 *)REG_ADDR_DMA1SAD)
-#define REG_DMA1DAD (*(vu32 *)REG_ADDR_DMA1DAD)
-#define REG_DMA1CNT (*(vu32 *)REG_ADDR_DMA1CNT)
-#define REG_DMA1CNT_L (*(vu16 *)REG_ADDR_DMA1CNT_L)
-#define REG_DMA1CNT_H (*(vu16 *)REG_ADDR_DMA1CNT_H)
-
-#define REG_DMA2SAD (*(vu32 *)REG_ADDR_DMA2SAD)
-#define REG_DMA2DAD (*(vu32 *)REG_ADDR_DMA2DAD)
-#define REG_DMA2CNT (*(vu32 *)REG_ADDR_DMA2CNT)
-#define REG_DMA2CNT_L (*(vu16 *)REG_ADDR_DMA2CNT_L)
-#define REG_DMA2CNT_H (*(vu16 *)REG_ADDR_DMA2CNT_H)
-
-#define REG_DMA3SAD (*(vu32 *)REG_ADDR_DMA3SAD)
-#define REG_DMA3DAD (*(vu32 *)REG_ADDR_DMA3DAD)
-#define REG_DMA3CNT (*(vu32 *)REG_ADDR_DMA3CNT)
-#define REG_DMA3CNT_L (*(vu16 *)REG_ADDR_DMA3CNT_L)
-#define REG_DMA3CNT_H (*(vu16 *)REG_ADDR_DMA3CNT_H)
-
-#define REG_TMCNT(n) (*(vu16 *)(REG_ADDR_TMCNT + ((n) * 4)))
-#define REG_TMCNT_L(n) (*(vu16 *)(REG_ADDR_TMCNT_L + ((n) * 4)))
-#define REG_TMCNT_H(n) (*(vu16 *)(REG_ADDR_TMCNT_H + ((n) * 4)))
-#define REG_TM0CNT (*(vu32 *)REG_ADDR_TM0CNT)
-#define REG_TM0CNT_L (*(vu16 *)REG_ADDR_TM0CNT_L)
-#define REG_TM0CNT_H (*(vu16 *)REG_ADDR_TM0CNT_H)
-#define REG_TM1CNT (*(vu32 *)REG_ADDR_TM1CNT)
-#define REG_TM1CNT_L (*(vu16 *)REG_ADDR_TM1CNT_L)
-#define REG_TM1CNT_H (*(vu16 *)REG_ADDR_TM1CNT_H)
-#define REG_TM2CNT (*(vu32 *)REG_ADDR_TM2CNT)
-#define REG_TM2CNT_L (*(vu16 *)REG_ADDR_TM2CNT_L)
-#define REG_TM2CNT_H (*(vu16 *)REG_ADDR_TM2CNT_H)
-#define REG_TM3CNT (*(vu32 *)REG_ADDR_TM3CNT)
-#define REG_TM3CNT_L (*(vu16 *)REG_ADDR_TM3CNT_L)
-#define REG_TM3CNT_H (*(vu16 *)REG_ADDR_TM3CNT_H)
-
-#define REG_SIOCNT (*(vu16 *)REG_ADDR_SIOCNT)
-#define REG_SIODATA8 (*(vu16 *)REG_ADDR_SIODATA8)
-#define REG_SIODATA32 (*(vu32 *)REG_ADDR_SIODATA32)
-#define REG_SIOMLT_SEND (*(vu16 *)REG_ADDR_SIOMLT_SEND)
-#define REG_SIOMLT_RECV (*(vu64 *)REG_ADDR_SIOMLT_RECV)
-#define REG_SIOMULTI0 (*(vu16 *)REG_ADDR_SIOMULTI0)
-#define REG_SIOMULTI1 (*(vu16 *)REG_ADDR_SIOMULTI1)
-#define REG_SIOMULTI2 (*(vu16 *)REG_ADDR_SIOMULTI2)
-#define REG_SIOMULTI3 (*(vu16 *)REG_ADDR_SIOMULTI3)
-
-#define REG_KEYINPUT (*(vu16 *)REG_ADDR_KEYINPUT)
-#define REG_KEYCNT (*(vu16 *)REG_ADDR_KEYCNT)
-
-#define REG_RCNT (*(vu16 *)REG_ADDR_RCNT)
-
-#define REG_IME (*(vu16 *)REG_ADDR_IME)
-#define REG_IE (*(vu16 *)REG_ADDR_IE)
-#define REG_IF (*(vu16 *)REG_ADDR_IF)
-
-#define REG_WAITCNT (*(vu16 *)REG_ADDR_WAITCNT)
-
-// I/O register fields
-
-// DISPCNT
-#define DISPCNT_MODE_0 0x0000 // BG0: text, BG1: text, BG2: text, BG3: text
-#define DISPCNT_MODE_1 0x0001 // BG0: text, BG1: text, BG2: affine, BG3: off
-#define DISPCNT_MODE_2 0x0002 // BG0: off, BG1: off, BG2: affine, BG3: affine
-#define DISPCNT_MODE_3 0x0003 // Bitmap mode, 240x160, BGR555 color
-#define DISPCNT_MODE_4 0x0004 // Bitmap mode, 240x160, 256 color palette
-#define DISPCNT_MODE_5 0x0005 // Bitmap mode, 160x128, BGR555 color
-#define DISPCNT_HBLANK_INTERVAL 0x0020 // Allow access to OAM during H-Blank
-#define DISPCNT_OBJ_1D_MAP 0x0040
-#define DISPCNT_FORCED_BLANK 0x0080
-#define DISPCNT_BG0_ON 0x0100
-#define DISPCNT_BG1_ON 0x0200
-#define DISPCNT_BG2_ON 0x0400
-#define DISPCNT_BG3_ON 0x0800
-#define DISPCNT_BG_ALL_ON 0x0F00
-#define DISPCNT_OBJ_ON 0x1000
-#define DISPCNT_WIN0_ON 0x2000
-#define DISPCNT_WIN1_ON 0x4000
-#define DISPCNT_OBJWIN_ON 0x8000
-
-// DISPSTAT
-#define DISPSTAT_VBLANK 0x0001 // in V-Blank
-#define DISPSTAT_HBLANK 0x0002 // in H-Blank
-#define DISPSTAT_VCOUNT 0x0004 // V-Count match
-#define DISPSTAT_VBLANK_INTR 0x0008 // V-Blank interrupt enabled
-#define DISPSTAT_HBLANK_INTR 0x0010 // H-Blank interrupt enabled
-#define DISPSTAT_VCOUNT_INTR 0x0020 // V-Count interrupt enabled
-
-// BGCNT
-#define BGCNT_PRIORITY(n) (n) // Values 0 - 3. Lower priority BGs will be drawn on top of higher priority BGs.
-#define BGCNT_CHARBASE(n) ((n) << 2) // Values 0 - 3. Base block for tile pixel data.
-#define BGCNT_MOSAIC 0x0040
-#define BGCNT_16COLOR 0x0000 // 4 bits per pixel
-#define BGCNT_256COLOR 0x0080 // 8 bits per pixel
-#define BGCNT_SCREENBASE(n) ((n) << 8) // Values 0 - 31. Base block for tile map.
-#define BGCNT_WRAP 0x2000 // Only affects affine BGs. Text BGs wrap by default.
-#define BGCNT_TXT256x256 0x0000 // Internal screen size size of text mode BG in pixels.
-#define BGCNT_TXT512x256 0x4000
-#define BGCNT_TXT256x512 0x8000
-#define BGCNT_TXT512x512 0xC000
-#define BGCNT_AFF128x128 0x0000 // Internal screen size size of affine mode BG in pixels.
-#define BGCNT_AFF256x256 0x4000
-#define BGCNT_AFF512x512 0x8000
-#define BGCNT_AFF1024x1024 0xC000
-
-// WININ/OUT
-#define WININ_WIN0_BG0 (1 << 0)
-#define WININ_WIN0_BG1 (1 << 1)
-#define WININ_WIN0_BG2 (1 << 2)
-#define WININ_WIN0_BG3 (1 << 3)
-#define WININ_WIN0_BG_ALL (WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3)
-#define WININ_WIN0_OBJ (1 << 4)
-#define WININ_WIN0_CLR (1 << 5)
-#define WININ_WIN1_BG0 (1 << 8)
-#define WININ_WIN1_BG1 (1 << 9)
-#define WININ_WIN1_BG2 (1 << 10)
-#define WININ_WIN1_BG3 (1 << 11)
-#define WININ_WIN1_BG_ALL (WININ_WIN1_BG0 | WININ_WIN1_BG1 | WININ_WIN1_BG2 | WININ_WIN1_BG3)
-#define WININ_WIN1_OBJ (1 << 12)
-#define WININ_WIN1_CLR (1 << 13)
-
-#define WINOUT_WIN01_BG0 (1 << 0)
-#define WINOUT_WIN01_BG1 (1 << 1)
-#define WINOUT_WIN01_BG2 (1 << 2)
-#define WINOUT_WIN01_BG3 (1 << 3)
-#define WINOUT_WIN01_BG_ALL (WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3)
-#define WINOUT_WIN01_OBJ (1 << 4)
-#define WINOUT_WIN01_CLR (1 << 5)
-#define WINOUT_WINOBJ_BG0 (1 << 8)
-#define WINOUT_WINOBJ_BG1 (1 << 9)
-#define WINOUT_WINOBJ_BG2 (1 << 10)
-#define WINOUT_WINOBJ_BG3 (1 << 11)
-#define WINOUT_WINOBJ_BG_ALL (WINOUT_WINOBJ_BG0 | WINOUT_WINOBJ_BG1 | WINOUT_WINOBJ_BG2 | WINOUT_WINOBJ_BG3)
-#define WINOUT_WINOBJ_OBJ (1 << 12)
-#define WINOUT_WINOBJ_CLR (1 << 13)
-
-#define WIN_RANGE(a, b) (((a) << 8) | (b))
-#define WIN_RANGE2(a, b) ((b) | ((a) << 8))
-
-// BLDCNT
-// Bits 0-5 select layers for the 1st target
-#define BLDCNT_TGT1_BG0 (1 << 0)
-#define BLDCNT_TGT1_BG1 (1 << 1)
-#define BLDCNT_TGT1_BG2 (1 << 2)
-#define BLDCNT_TGT1_BG3 (1 << 3)
-#define BLDCNT_TGT1_OBJ (1 << 4)
-#define BLDCNT_TGT1_BD (1 << 5)
-#define BLDCNT_TGT1_ALL (BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD)
-// Bits 6-7 select the special effect
-#define BLDCNT_EFFECT_NONE (0 << 6) // no special effect
-#define BLDCNT_EFFECT_BLEND (1 << 6) // 1st+2nd targets mixed (controlled by BLDALPHA)
-#define BLDCNT_EFFECT_LIGHTEN (2 << 6) // 1st target becomes whiter (controlled by BLDY)
-#define BLDCNT_EFFECT_DARKEN (3 << 6) // 1st target becomes blacker (controlled by BLDY)
-// Bits 8-13 select layers for the 2nd target
-#define BLDCNT_TGT2_BG0 (1 << 8)
-#define BLDCNT_TGT2_BG1 (1 << 9)
-#define BLDCNT_TGT2_BG2 (1 << 10)
-#define BLDCNT_TGT2_BG3 (1 << 11)
-#define BLDCNT_TGT2_OBJ (1 << 12)
-#define BLDCNT_TGT2_BD (1 << 13)
-#define BLDCNT_TGT2_ALL (BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD)
-
-// BLDALPHA
-#define BLDALPHA_BLEND(target1, target2) (((target2) << 8) | (target1))
-
-// SOUNDCNT_H
-#define SOUND_CGB_MIX_QUARTER 0x0000
-#define SOUND_CGB_MIX_HALF 0x0001
-#define SOUND_CGB_MIX_FULL 0x0002
-#define SOUND_A_MIX_HALF 0x0000
-#define SOUND_A_MIX_FULL 0x0004
-#define SOUND_B_MIX_HALF 0x0000
-#define SOUND_B_MIX_FULL 0x0008
-#define SOUND_ALL_MIX_FULL 0x000E
-#define SOUND_A_RIGHT_OUTPUT 0x0100
-#define SOUND_A_LEFT_OUTPUT 0x0200
-#define SOUND_A_TIMER_0 0x0000
-#define SOUND_A_TIMER_1 0x0400
-#define SOUND_A_FIFO_RESET 0x0800
-#define SOUND_B_RIGHT_OUTPUT 0x1000
-#define SOUND_B_LEFT_OUTPUT 0x2000
-#define SOUND_B_TIMER_0 0x0000
-#define SOUND_B_TIMER_1 0x4000
-#define SOUND_B_FIFO_RESET 0x8000
-
-// SOUNDCNT_X
-#define SOUND_1_ON 0x0001
-#define SOUND_2_ON 0x0002
-#define SOUND_3_ON 0x0004
-#define SOUND_4_ON 0x0008
-#define SOUND_MASTER_ENABLE 0x0080
-
-// DMA
-#define DMA_DEST_INC 0x0000
-#define DMA_DEST_DEC 0x0020
-#define DMA_DEST_FIXED 0x0040
-#define DMA_DEST_RELOAD 0x0060
-#define DMA_SRC_INC 0x0000
-#define DMA_SRC_DEC 0x0080
-#define DMA_SRC_FIXED 0x0100
-#define DMA_REPEAT 0x0200
-#define DMA_16BIT 0x0000
-#define DMA_32BIT 0x0400
-#define DMA_DREQ_ON 0x0800
-#define DMA_START_NOW 0x0000
-#define DMA_START_VBLANK 0x1000
-#define DMA_START_HBLANK 0x2000
-#define DMA_START_SPECIAL 0x3000
-#define DMA_START_MASK 0x3000
-#define DMA_INTR_ENABLE 0x4000
-#define DMA_ENABLE 0x8000
-
-// timer
-#define TIMER_1CLK 0x00
-#define TIMER_64CLK 0x01
-#define TIMER_256CLK 0x02
-#define TIMER_1024CLK 0x03
-#define TIMER_INTR_ENABLE 0x40
-#define TIMER_ENABLE 0x80
-
-// serial
-#define SIO_ID 0x0030 // Communication ID
-
-#define SIO_8BIT_MODE 0x0000 // Normal 8-bit communication mode
-#define SIO_32BIT_MODE 0x1000 // Normal 32-bit communication mode
-#define SIO_MULTI_MODE 0x2000 // Multi-player communication mode
-#define SIO_UART_MODE 0x3000 // UART communication mode
-
-#define SIO_9600_BPS 0x0000 // baud rate 9600 bps
-#define SIO_38400_BPS 0x0001 // 38400 bps
-#define SIO_57600_BPS 0x0002 // 57600 bps
-#define SIO_115200_BPS 0x0003 // 115200 bps
-
-#define SIO_MULTI_SI 0x0004 // Multi-player communication SI terminal
-#define SIO_MULTI_SD 0x0008 // SD terminal
-#define SIO_MULTI_BUSY 0x0080
-
-#define SIO_ERROR 0x0040 // Detect error
-#define SIO_START 0x0080 // Start transfer
-#define SIO_ENABLE 0x0080 // Enable SIO
-
-#define SIO_INTR_ENABLE 0x4000
-
-#define SIO_MULTI_SI_SHIFT 2
-#define SIO_MULTI_SI_MASK 0x1
-#define SIO_MULTI_DI_SHIFT 3
-#define SIO_MULTI_DI_MASK 0x1
-
-// keys
-#define A_BUTTON 0x0001
-#define B_BUTTON 0x0002
-#define SELECT_BUTTON 0x0004
-#define START_BUTTON 0x0008
-#define DPAD_RIGHT 0x0010
-#define DPAD_LEFT 0x0020
-#define DPAD_UP 0x0040
-#define DPAD_DOWN 0x0080
-#define R_BUTTON 0x0100
-#define L_BUTTON 0x0200
-#define KEYS_MASK 0x03FF
-#define KEY_INTR_ENABLE 0x0400
-#define KEY_OR_INTR 0x0000
-#define KEY_AND_INTR 0x8000
-#define DPAD_ANY ((DPAD_RIGHT | DPAD_LEFT | DPAD_UP | DPAD_DOWN))
-#define JOY_EXCL_DPAD 0x030F
-
-// interrupt flags
-#define INTR_FLAG_VBLANK (1 << 0)
-#define INTR_FLAG_HBLANK (1 << 1)
-#define INTR_FLAG_VCOUNT (1 << 2)
-#define INTR_FLAG_TIMER0 (1 << 3)
-#define INTR_FLAG_TIMER1 (1 << 4)
-#define INTR_FLAG_TIMER2 (1 << 5)
-#define INTR_FLAG_TIMER3 (1 << 6)
-#define INTR_FLAG_SERIAL (1 << 7)
-#define INTR_FLAG_DMA0 (1 << 8)
-#define INTR_FLAG_DMA1 (1 << 9)
-#define INTR_FLAG_DMA2 (1 << 10)
-#define INTR_FLAG_DMA3 (1 << 11)
-#define INTR_FLAG_KEYPAD (1 << 12)
-#define INTR_FLAG_GAMEPAK (1 << 13)
-
-// WAITCNT
-#define WAITCNT_SRAM_4 (0 << 0)
-#define WAITCNT_SRAM_3 (1 << 0)
-#define WAITCNT_SRAM_2 (2 << 0)
-#define WAITCNT_SRAM_8 (3 << 0)
-#define WAITCNT_SRAM_MASK (3 << 0)
-
-#define WAITCNT_WS0_N_4 (0 << 2)
-#define WAITCNT_WS0_N_3 (1 << 2)
-#define WAITCNT_WS0_N_2 (2 << 2)
-#define WAITCNT_WS0_N_8 (3 << 2)
-#define WAITCNT_WS0_N_MASK (3 << 2)
-
-#define WAITCNT_WS0_S_2 (0 << 4)
-#define WAITCNT_WS0_S_1 (1 << 4)
-
-#define WAITCNT_WS1_N_4 (0 << 5)
-#define WAITCNT_WS1_N_3 (1 << 5)
-#define WAITCNT_WS1_N_2 (2 << 5)
-#define WAITCNT_WS1_N_8 (3 << 5)
-#define WAITCNT_WS1_N_MASK (3 << 5)
-
-#define WAITCNT_WS1_S_4 (0 << 7)
-#define WAITCNT_WS1_S_1 (1 << 7)
-
-#define WAITCNT_WS2_N_4 (0 << 8)
-#define WAITCNT_WS2_N_3 (1 << 8)
-#define WAITCNT_WS2_N_2 (2 << 8)
-#define WAITCNT_WS2_N_8 (3 << 8)
-#define WAITCNT_WS2_N_MASK (3 << 8)
-
-#define WAITCNT_WS2_S_8 (0 << 10)
-#define WAITCNT_WS2_S_1 (1 << 10)
-
-#define WAITCNT_PHI_OUT_NONE (0 << 11)
-#define WAITCNT_PHI_OUT_4MHZ (1 << 11)
-#define WAITCNT_PHI_OUT_8MHZ (2 << 11)
-#define WAITCNT_PHI_OUT_16MHZ (3 << 11)
-#define WAITCNT_PHI_OUT_MASK (3 << 11)
-
-#define WAITCNT_PREFETCH_ENABLE (1 << 14)
-
-#define WAITCNT_AGB (0 << 15)
-#define WAITCNT_CGB (1 << 15)
-
-#endif // GUARD_GBA_IO_REG_H
diff --git a/berry_fix/payload/include/gba/isagbprint.h b/berry_fix/payload/include/gba/isagbprint.h
deleted file mode 100644
index c5eb456c3f..0000000000
--- a/berry_fix/payload/include/gba/isagbprint.h
+++ /dev/null
@@ -1,50 +0,0 @@
-#ifndef GUARD_GBA_ISAGBPRINT_H
-#define GUARD_GBA_ISAGBPRINT_H
-
-#ifdef NDEBUG
-#define AGBPrintInit()
-#define AGBPutc(cChr)
-#define AGBPrint(pBuf)
-#define AGBPrintf(pBuf, ...)
-#define AGBPrintFlush1Block()
-#define AGBPrintFlush()
-#define AGBAssert(pFile, nLine, pExpression, nStopProgram)
-#else
-void AGBPrintInit(void);
-void AGBPutc(const char cChr);
-void AGBPrint(const char *pBuf);
-void AGBPrintf(const char *pBuf, ...);
-void AGBPrintFlush1Block(void);
-void AGBPrintFlush(void);
-void AGBAssert(const char *pFile, int nLine, const char *pExpression, int nStopProgram);
-#endif
-
-#undef AGB_ASSERT
-#ifdef NDEBUG
-#define AGB_ASSERT(exp)
-#else
-#define AGB_ASSERT(exp) (exp) ? ((void*)0) : AGBAssert(__FILE__, __LINE__, #exp, 1);
-#endif
-
-#undef AGB_WARNING
-#ifdef NDEBUG
-#define AGB_WARNING(exp)
-#else
-#define AGB_WARNING(exp) (exp) ? ((void*)0) : AGBAssert(__FILE__, __LINE__, #exp, 0);
-#endif
-
-// for matching purposes
-
-#ifdef NDEBUG
-#define AGB_ASSERT_EX(exp, file, line)
-#else
-#define AGB_ASSERT_EX(exp, file, line) (exp) ? ((void*)0) : AGBAssert(file, line, #exp, 1);
-#endif
-
-#ifdef NDEBUG
-#define AGB_WARNING_EX(exp, file, line)
-#else
-#define AGB_WARNING_EX(exp, file, line) (exp) ? ((void*)0) : AGBAssert(file, line, #exp, 0);
-#endif
-
-#endif // GUARD_GBA_ISAGBPRINT_H
diff --git a/berry_fix/payload/include/gba/m4a_internal.h b/berry_fix/payload/include/gba/m4a_internal.h
deleted file mode 100644
index 1aca675854..0000000000
--- a/berry_fix/payload/include/gba/m4a_internal.h
+++ /dev/null
@@ -1,467 +0,0 @@
-#ifndef GUARD_GBA_M4A_INTERNAL_H
-#define GUARD_GBA_M4A_INTERNAL_H
-
-#include "gba/gba.h"
-
-// ASCII encoding of 'Smsh' in reverse
-// This is presumably short for SMASH, the developer of MKS4AGB.
-#define ID_NUMBER 0x68736D53
-
-#define C_V 0x40 // center value for PAN, BEND, and TUNE
-
-#define SOUND_MODE_REVERB_VAL 0x0000007F
-#define SOUND_MODE_REVERB_SET 0x00000080
-#define SOUND_MODE_MAXCHN 0x00000F00
-#define SOUND_MODE_MAXCHN_SHIFT 8
-#define SOUND_MODE_MASVOL 0x0000F000
-#define SOUND_MODE_MASVOL_SHIFT 12
-#define SOUND_MODE_FREQ_05734 0x00010000
-#define SOUND_MODE_FREQ_07884 0x00020000
-#define SOUND_MODE_FREQ_10512 0x00030000
-#define SOUND_MODE_FREQ_13379 0x00040000
-#define SOUND_MODE_FREQ_15768 0x00050000
-#define SOUND_MODE_FREQ_18157 0x00060000
-#define SOUND_MODE_FREQ_21024 0x00070000
-#define SOUND_MODE_FREQ_26758 0x00080000
-#define SOUND_MODE_FREQ_31536 0x00090000
-#define SOUND_MODE_FREQ_36314 0x000A0000
-#define SOUND_MODE_FREQ_40137 0x000B0000
-#define SOUND_MODE_FREQ_42048 0x000C0000
-#define SOUND_MODE_FREQ 0x000F0000
-#define SOUND_MODE_FREQ_SHIFT 16
-#define SOUND_MODE_DA_BIT_9 0x00800000
-#define SOUND_MODE_DA_BIT_8 0x00900000
-#define SOUND_MODE_DA_BIT_7 0x00A00000
-#define SOUND_MODE_DA_BIT_6 0x00B00000
-#define SOUND_MODE_DA_BIT 0x00B00000
-#define SOUND_MODE_DA_BIT_SHIFT 20
-
-struct WaveData
-{
- u16 type;
- u16 status;
- u32 freq;
- u32 loopStart;
- u32 size; // number of samples
- s8 data[1]; // samples
-};
-
-#define TONEDATA_TYPE_CGB 0x07
-#define TONEDATA_TYPE_FIX 0x08
-#define TONEDATA_TYPE_SPL 0x40 // key split
-#define TONEDATA_TYPE_RHY 0x80 // rhythm
-
-#define TONEDATA_P_S_PAN 0xc0
-#define TONEDATA_P_S_PAM TONEDATA_P_S_PAN
-
-struct ToneData
-{
- u8 type;
- u8 key;
- u8 length; // sound length (compatible sound)
- u8 pan_sweep; // pan or sweep (compatible sound ch. 1)
- struct WaveData *wav;
- u8 attack;
- u8 decay;
- u8 sustain;
- u8 release;
-};
-
-struct CgbChannel
-{
- u8 sf;
- u8 ty;
- u8 rightVolume;
- u8 leftVolume;
- u8 at;
- u8 de;
- u8 su;
- u8 re;
- u8 ky;
- u8 ev;
- u8 eg;
- u8 ec;
- u8 echoVolume;
- u8 echoLength;
- u8 d1;
- u8 d2;
- u8 gt;
- u8 mk;
- u8 ve;
- u8 pr;
- u8 rp;
- u8 d3[3];
- u8 d5;
- u8 sg;
- u8 n4;
- u8 pan;
- u8 panMask;
- u8 mo;
- u8 le;
- u8 sw;
- u32 fr;
- u32 wp;
- u32 cp;
- u32 tp;
- u32 pp;
- u32 np;
- u8 d4[8];
-};
-
-struct MusicPlayerTrack;
-
-struct SoundChannel
-{
- u8 status;
- u8 type;
- u8 rightVolume;
- u8 leftVolume;
- u8 attack;
- u8 decay;
- u8 sustain;
- u8 release;
- u8 ky;
- u8 ev;
- u8 er;
- u8 el;
- u8 echoVolume;
- u8 echoLength;
- u8 d1;
- u8 d2;
- u8 gt;
- u8 mk;
- u8 ve;
- u8 pr;
- u8 rp;
- u8 d3[3];
- u32 ct;
- u32 fw;
- u32 freq;
- struct WaveData *wav;
- u32 cp;
- struct MusicPlayerTrack *track;
- u32 pp;
- u32 np;
- u32 d4;
- u16 xpi;
- u16 xpc;
-};
-
-#define MAX_DIRECTSOUND_CHANNELS 12
-
-#define PCM_DMA_BUF_SIZE 1584 // size of Direct Sound buffer
-
-struct SoundInfo
-{
- // This field is normally equal to ID_NUMBER but it is set to other
- // values during sensitive operations for locking purposes.
- // This field should be volatile but isn't. This could potentially cause
- // race conditions.
- u32 ident;
-
- vu8 pcmDmaCounter;
-
- // Direct Sound
- u8 reverb;
- u8 maxChans;
- u8 masterVolume;
- u8 freq;
-
- u8 mode;
- u8 c15;
- u8 pcmDmaPeriod; // number of V-blanks per PCM DMA
- u8 maxLines;
- u8 gap[3];
- s32 pcmSamplesPerVBlank;
- s32 pcmFreq;
- s32 divFreq;
- struct CgbChannel *cgbChans;
- u32 func;
- u32 intp;
- void (*CgbSound)(void);
- void (*CgbOscOff)(u8);
- u32 (*MidiKeyToCgbFreq)(u8, u8, u8);
- u32 MPlayJumpTable;
- u32 plynote;
- u32 ExtVolPit;
- u8 gap2[16];
- struct SoundChannel chans[MAX_DIRECTSOUND_CHANNELS];
- s8 pcmBuffer[PCM_DMA_BUF_SIZE * 2];
-};
-
-struct SongHeader
-{
- u8 trackCount;
- u8 blockCount;
- u8 priority;
- u8 reverb;
- struct ToneData *tone;
- u8 *part[1];
-};
-
-struct PokemonCrySong
-{
- u8 trackCount;
- u8 blockCount;
- u8 priority;
- u8 reverb;
- struct ToneData *tone;
- u8 *part[2];
- u8 gap;
- u8 part0; // 0x11
- u8 tuneValue; // 0x12
- u8 gotoCmd; // 0x13
- u32 gotoTarget; // 0x14
- u8 part1; // 0x18
- u8 tuneValue2; // 0x19
- u8 cont[2]; // 0x1A
- u8 volCmd; // 0x1C
- u8 volumeValue; // 0x1D
- u8 unkCmd0D[2]; // 0x1E
- u32 unkCmd0DParam; // 0x20
- u8 xreleCmd[2]; // 0x24
- u8 releaseValue; // 0x26
- u8 panCmd;
- u8 panValue; // 0x28
- u8 tieCmd; // 0x29
- u8 tieKeyValue; // 0x2A
- u8 tieVelocityValue; // 0x2B
- u8 unkCmd0C[2]; // 0x2C
- u16 unkCmd0CParam; // 0x2E
- u8 end[2]; // 0x30
-};
-
-#define MPT_FLG_VOLSET 0x01
-#define MPT_FLG_VOLCHG 0x03
-#define MPT_FLG_PITSET 0x04
-#define MPT_FLG_PITCHG 0x0C
-#define MPT_FLG_START 0x40
-#define MPT_FLG_EXIST 0x80
-
-struct MusicPlayerTrack
-{
- u8 flags;
- u8 wait;
- u8 patternLevel;
- u8 repN;
- u8 gateTime;
- u8 key;
- u8 velocity;
- u8 runningStatus;
- u8 keyM;
- u8 pitM;
- s8 keyShift;
- s8 keyShiftX;
- s8 tune;
- u8 pitX;
- s8 bend;
- u8 bendRange;
- u8 volMR;
- u8 volML;
- u8 vol;
- u8 volX;
- s8 pan;
- s8 panX;
- s8 modM;
- u8 mod;
- u8 modT;
- u8 lfoSpeed;
- u8 lfoSpeedC;
- u8 lfoDelay;
- u8 lfoDelayC;
- u8 priority;
- u8 echoVolume;
- u8 echoLength;
- struct SoundChannel *chan;
- struct ToneData tone;
- u8 gap[10];
- u16 unk_3A;
- u32 unk_3C;
- u8 *cmdPtr;
- u8 *patternStack[3];
-};
-
-#define MUSICPLAYER_STATUS_TRACK 0x0000ffff
-#define MUSICPLAYER_STATUS_PAUSE 0x80000000
-
-#define MAX_MUSICPLAYER_TRACKS 16
-
-#define TEMPORARY_FADE 0x0001
-#define FADE_IN 0x0002
-#define FADE_VOL_MAX 64
-#define FADE_VOL_SHIFT 2
-
-struct MusicPlayerInfo
-{
- struct SongHeader *songHeader;
- u32 status;
- u8 trackCount;
- u8 priority;
- u8 cmd;
- u8 unk_B;
- u32 clock;
- u8 gap[8];
- u8 *memAccArea;
- u16 tempoD;
- u16 tempoU;
- u16 tempoI;
- u16 tempoC;
- u16 fadeOI;
- u16 fadeOC;
- u16 fadeOV;
- struct MusicPlayerTrack *tracks;
- struct ToneData *tone;
- u32 ident;
- u32 func;
- u32 intp;
-};
-
-struct MusicPlayer
-{
- struct MusicPlayerInfo *info;
- struct MusicPlayerTrack *track;
- u8 unk_8;
- u16 unk_A;
-};
-
-struct Song
-{
- struct SongHeader *header;
- u16 ms;
- u16 me;
-};
-
-extern const struct MusicPlayer gMPlayTable[];
-extern const struct Song gSongTable[];
-
-
-
-extern u8 gMPlayMemAccArea[];
-
-//u8 gPokemonCrySong[52];
-//u8 gPokemonCrySongs[52 * MAX_POKEMON_CRIES];
-
-#define MAX_POKEMON_CRIES 2
-
-extern struct PokemonCrySong gPokemonCrySong;
-extern struct PokemonCrySong gPokemonCrySongs[];
-
-extern struct MusicPlayerInfo gPokemonCryMusicPlayers[];
-extern struct MusicPlayerTrack gPokemonCryTracks[];
-
-extern char SoundMainRAM[];
-
-extern void *gMPlayJumpTable[];
-
-typedef void (*XcmdFunc)(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-extern const XcmdFunc gXcmdTable[];
-
-extern struct CgbChannel gCgbChans[];
-
-extern const u8 gScaleTable[];
-extern const u32 gFreqTable[];
-extern const u16 gPcmSamplesPerVBlankTable[];
-
-extern const u8 gCgbScaleTable[];
-extern const s16 gCgbFreqTable[];
-extern const u8 gNoiseTable[];
-
-extern const struct PokemonCrySong gPokemonCrySongTemplate;
-
-extern const struct ToneData voicegroup000;
-
-extern char gNumMusicPlayers[];
-extern char gMaxLines[];
-
-#define NUM_MUSIC_PLAYERS ((u16)gNumMusicPlayers)
-#define MAX_LINES ((u32)gMaxLines)
-
-u32 umul3232H32(u32 multiplier, u32 multiplicand);
-void SoundMain(void);
-void SoundMainBTM(void);
-void TrackStop(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
-void MPlayMain(void);
-void RealClearChain(void *x);
-
-void MPlayContinue(struct MusicPlayerInfo *mplayInfo);
-void MPlayStart(struct MusicPlayerInfo *mplayInfo, struct SongHeader *songHeader);
-void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo);
-void FadeOutBody(struct MusicPlayerInfo *mplayInfo);
-void TrkVolPitSet(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track);
-void MPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed);
-void ClearChain(void *x);
-void Clear64byte(void *addr);
-void SoundInit(struct SoundInfo *soundInfo);
-void MPlayExtender(struct CgbChannel *cgbChans);
-void m4aSoundMode(u32 mode);
-void MPlayOpen(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track, u8 a3);
-void CgbSound(void);
-void CgbOscOff(u8);
-u32 MidiKeyToCgbFreq(u8, u8, u8);
-void DummyFunc(void);
-void MPlayJumpTableCopy(void **mplayJumpTable);
-void SampleFreqSet(u32 freq);
-void m4aSoundVSyncOn(void);
-void m4aSoundVSyncOff(void);
-
-void m4aMPlayTempoControl(struct MusicPlayerInfo *mplayInfo, u16 tempo);
-void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 volume);
-void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s16 pitch);
-void m4aMPlayPanpotControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s8 pan);
-void ClearModM(struct MusicPlayerTrack *track);
-void m4aMPlayModDepthSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 modDepth);
-void m4aMPlayLFOSpeedSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 lfoSpeed);
-
-struct MusicPlayerInfo *SetPokemonCryTone(struct ToneData *tone);
-void SetPokemonCryVolume(u8 val);
-void SetPokemonCryPanpot(s8 val);
-void SetPokemonCryPitch(s16 val);
-void SetPokemonCryLength(u16 val);
-void SetPokemonCryRelease(u8 val);
-void SetPokemonCryProgress(u32 val);
-bool32 IsPokemonCryPlaying(struct MusicPlayerInfo *mplayInfo);
-void SetPokemonCryChorus(s8 val);
-void SetPokemonCryStereo(u32 val);
-void SetPokemonCryPriority(u8 val);
-
-// sound command handler functions
-void ply_fine(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_goto(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_patt(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_pend(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_rept(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_memacc(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_prio(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_tempo(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_keysh(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_voice(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_vol(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_pan(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_bend(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_bendr(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_lfos(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_lfodl(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_mod(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_modt(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_tune(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_port(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_xcmd(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_endtie(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_note(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-
-// extended sound command handler functions
-void ply_xxx(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_xwave(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_xtype(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_xatta(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_xdeca(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_xsust(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_xrele(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_xiecv(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_xiecl(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_xleng(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_xswee(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_xcmd_0C(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-void ply_xcmd_0D(struct MusicPlayerInfo *, struct MusicPlayerTrack *);
-
-#endif // GUARD_GBA_M4A_INTERNAL_H
diff --git a/berry_fix/payload/include/gba/macro.h b/berry_fix/payload/include/gba/macro.h
deleted file mode 100644
index 6f9c55f2ed..0000000000
--- a/berry_fix/payload/include/gba/macro.h
+++ /dev/null
@@ -1,247 +0,0 @@
-#ifndef GUARD_GBA_MACRO_H
-#define GUARD_GBA_MACRO_H
-
-#define CPU_FILL(value, dest, size, bit) \
-{ \
- vu##bit tmp = (vu##bit)(value); \
- CpuSet((void *)&tmp, \
- dest, \
- CPU_SET_##bit##BIT | CPU_SET_SRC_FIXED | ((size)/(bit/8) & 0x1FFFFF)); \
-}
-
-#define CpuFill16(value, dest, size) CPU_FILL(value, dest, size, 16)
-#define CpuFill32(value, dest, size) CPU_FILL(value, dest, size, 32)
-
-#define CPU_COPY(src, dest, size, bit) CpuSet(src, dest, CPU_SET_##bit##BIT | ((size)/(bit/8) & 0x1FFFFF))
-
-#define CpuCopy16(src, dest, size) CPU_COPY(src, dest, size, 16)
-#define CpuCopy32(src, dest, size) CPU_COPY(src, dest, size, 32)
-
-#define CpuFastFill(value, dest, size) \
-{ \
- vu32 tmp = (vu32)(value); \
- CpuFastSet((void *)&tmp, \
- dest, \
- CPU_FAST_SET_SRC_FIXED | ((size)/(32/8) & 0x1FFFFF)); \
-}
-
-#define CpuFastFill16(value, dest, size) CpuFastFill(((value) << 16) | (value), (dest), (size))
-
-#define CpuFastFill8(value, dest, size) CpuFastFill(((value) << 24) | ((value) << 16) | ((value) << 8) | (value), (dest), (size))
-
-#define CpuFastCopy(src, dest, size) CpuFastSet(src, dest, ((size)/(32/8) & 0x1FFFFF))
-
-#define DmaSet(dmaNum, src, dest, control) \
-{ \
- vu32 *dmaRegs = (vu32 *)REG_ADDR_DMA##dmaNum; \
- dmaRegs[0] = (vu32)(src); \
- dmaRegs[1] = (vu32)(dest); \
- dmaRegs[2] = (vu32)(control); \
- dmaRegs[2]; \
-}
-
-#define DMA_FILL(dmaNum, value, dest, size, bit) \
-{ \
- vu##bit tmp = (vu##bit)(value); \
- DmaSet(dmaNum, \
- &tmp, \
- dest, \
- (DMA_ENABLE | DMA_START_NOW | DMA_##bit##BIT | DMA_SRC_FIXED | DMA_DEST_INC) << 16 \
- | ((size)/(bit/8))); \
-}
-
-#define DmaFill16(dmaNum, value, dest, size) DMA_FILL(dmaNum, value, dest, size, 16)
-#define DmaFill32(dmaNum, value, dest, size) DMA_FILL(dmaNum, value, dest, size, 32)
-
-// Note that the DMA clear macros cause the DMA control value to be calculated
-// at runtime rather than compile time. The size is divided by the DMA transfer
-// unit size (2 or 4 bytes) and then combined with the DMA control flags using a
-// bitwise OR operation.
-
-#define DMA_CLEAR(dmaNum, dest, size, bit) \
-{ \
- vu##bit *_dest = (vu##bit *)(dest); \
- u32 _size = size; \
- DmaFill##bit(dmaNum, 0, _dest, _size); \
-}
-
-#define DmaClear16(dmaNum, dest, size) DMA_CLEAR(dmaNum, dest, size, 16)
-#define DmaClear32(dmaNum, dest, size) DMA_CLEAR(dmaNum, dest, size, 32)
-
-#define DMA_COPY(dmaNum, src, dest, size, bit) \
- DmaSet(dmaNum, \
- src, \
- dest, \
- (DMA_ENABLE | DMA_START_NOW | DMA_##bit##BIT | DMA_SRC_INC | DMA_DEST_INC) << 16 \
- | ((size)/(bit/8)))
-
-#define DmaCopy16(dmaNum, src, dest, size) DMA_COPY(dmaNum, src, dest, size, 16)
-#define DmaCopy32(dmaNum, src, dest, size) DMA_COPY(dmaNum, src, dest, size, 32)
-
-#define DmaCopyLarge(dmaNum, src, dest, size, block, bit) \
-{ \
- const void *_src = src; \
- void *_dest = (void *)dest; \
- u32 _size = size; \
- while (1) \
- { \
- DmaCopy##bit(dmaNum, _src, _dest, (block)); \
- _src += (block); \
- _dest += (block); \
- _size -= (block); \
- if (_size <= (block)) \
- { \
- DmaCopy##bit(dmaNum, _src, _dest, _size); \
- break; \
- } \
- } \
-}
-
-#define DmaCopyLarge16(dmaNum, src, dest, size, block) DmaCopyLarge(dmaNum, src, dest, size, block, 16)
-
-#define DmaCopyLarge32(dmaNum, src, dest, size, block) DmaCopyLarge(dmaNum, src, dest, size, block, 32)
-
-#define DmaFillLarge(dmaNum, value, dest, size, block, bit) \
-{ \
- void *_dest = (void *)dest; \
- u32 _size = size; \
- while (1) \
- { \
- DmaFill##bit(dmaNum, value, _dest, (block)); \
- _dest += (block); \
- _size -= (block); \
- if (_size <= (block)) \
- { \
- DmaFill##bit(dmaNum, value, _dest, _size); \
- break; \
- } \
- } \
-}
-
-#define DmaFillLarge16(dmaNum, value, dest, size, block) DmaFillLarge(dmaNum, value, dest, size, block, 16)
-
-#define DmaFillLarge32(dmaNum, value, dest, size, block) DmaFillLarge(dmaNum, value, dest, size, block, 32)
-
-#define DmaClearLarge(dmaNum, dest, size, block, bit) \
-{ \
- void *_dest = (void *)dest; \
- u32 _size = size; \
- while (1) \
- { \
- DmaFill##bit(dmaNum, 0, _dest, (block)); \
- _dest += (block); \
- _size -= (block); \
- if (_size <= (block)) \
- { \
- DmaFill##bit(dmaNum, 0, _dest, _size); \
- break; \
- } \
- } \
-}
-
-#define DmaClearLarge16(dmaNum, dest, size, block) DmaClearLarge(dmaNum, dest, size, block, 16)
-
-#define DmaClearLarge32(dmaNum, dest, size, block) DmaClearLarge(dmaNum, dest, size, block, 32)
-
-#define DmaCopyDefvars(dmaNum, src, dest, size, bit) \
-{ \
- const void *_src = src; \
- void *_dest = (void *)(dest); \
- u32 _size = size; \
- DmaCopy##bit(dmaNum, _src, _dest, _size); \
-}
-
-#define DmaCopy16Defvars(dmaNum, src, dest, size) DmaCopyDefvars(dmaNum, src, dest, size, 16)
-#define DmaCopy32Defvars(dmaNum, src, dest, size) DmaCopyDefvars(dmaNum, src, dest, size, 32)
-
-#define DmaFillDefvars(dmaNum, value, dest, size, bit) \
-{ \
- void *_dest = (void *)dest; \
- u32 _size = size; \
- DmaFill##bit(dmaNum, value, _dest, _size); \
-}
-
-#define DmaFill16Defvars(dmaNum, value, dest, size) DmaFillDefvars(dmaNum, value, dest, size, 16)
-#define DmaFill32Defvars(dmaNum, value, dest, size) DmaFillDefvars(dmaNum, value, dest, size, 32)
-
-#define DmaClearDefvars(dmaNum, dest, size, bit) \
-{ \
- void *_dest = (void *)dest; \
- u32 _size = size; \
- DmaClear##bit(dmaNum, _dest, _size); \
-}
-
-#define DmaClear16Defvars(dmaNum, dest, size) DmaClearDefvars(dmaNum, dest, size, 16)
-#define DmaClear32Defvars(dmaNum, dest, size) DmaClearDefvars(dmaNum, dest, size, 32)
-
-#define DmaStop(dmaNum) \
-{ \
- vu16 *dmaRegs = (vu16 *)REG_ADDR_DMA##dmaNum; \
- dmaRegs[5] &= ~(DMA_START_MASK | DMA_DREQ_ON | DMA_REPEAT); \
- dmaRegs[5] &= ~DMA_ENABLE; \
- dmaRegs[5]; \
-}
-
-#define IntrEnable(flags) \
-{ \
- u16 imeTemp; \
- \
- imeTemp = REG_IME; \
- REG_IME = 0; \
- REG_IE |= flags; \
- REG_IME = imeTemp; \
-} \
-// from pokeemerald
-// Maximum amount of data we will transfer in one operation
-#define MAX_DMA_BLOCK_SIZE 0x1000
-
-#define MAX_DMA_REQUESTS 128
-
-#define DMA_REQUEST_COPY32 1
-#define DMA_REQUEST_FILL32 2
-#define DMA_REQUEST_COPY16 3
-#define DMA_REQUEST_FILL16 4
-
-#define Dma3CopyLarge_(src, dest, size, bit) \
-{ \
- const void *_src = src; \
- void *_dest = (void *)dest; \
- u32 _size = size; \
- while (1) \
- { \
- if (_size <= MAX_DMA_BLOCK_SIZE) \
- { \
- DmaCopy##bit(3, _src, _dest, _size); \
- break; \
- } \
- DmaCopy##bit(3, _src, _dest, MAX_DMA_BLOCK_SIZE); \
- _src += MAX_DMA_BLOCK_SIZE; \
- _dest += MAX_DMA_BLOCK_SIZE; \
- _size -= MAX_DMA_BLOCK_SIZE; \
- } \
-}
-
-#define Dma3CopyLarge16_(src, dest, size) Dma3CopyLarge_(src, dest, size, 16)
-#define Dma3CopyLarge32_(src, dest, size) Dma3CopyLarge_(src, dest, size, 32)
-
-#define Dma3FillLarge_(value, dest, size, bit) \
-{ \
- void *_dest = (void *)dest; \
- u32 _size = size; \
- while (1) \
- { \
- if (_size <= MAX_DMA_BLOCK_SIZE) \
- { \
- DmaFill##bit(3, value, _dest, _size); \
- break; \
- } \
- DmaFill##bit(3, value, _dest, MAX_DMA_BLOCK_SIZE); \
- _dest += MAX_DMA_BLOCK_SIZE; \
- _size -= MAX_DMA_BLOCK_SIZE; \
- } \
-}
-
-#define Dma3FillLarge16_(value, dest, size) Dma3FillLarge_(value, dest, size, 16)
-#define Dma3FillLarge32_(value, dest, size) Dma3FillLarge_(value, dest, size, 32)
-
-#endif // GUARD_GBA_MACRO_H
diff --git a/berry_fix/payload/include/gba/multiboot.h b/berry_fix/payload/include/gba/multiboot.h
deleted file mode 100644
index 14b6594b29..0000000000
--- a/berry_fix/payload/include/gba/multiboot.h
+++ /dev/null
@@ -1,55 +0,0 @@
-#ifndef GUARD_GBA_MULTIBOOT_H
-#define GUARD_GBA_MULTIBOOT_H
-
-#define MULTIBOOT_NCHILD 3 // Maximum number of slaves
-#define MULTIBOOT_HEADER_SIZE 0xc0 // Header size
-#define MULTIBOOT_SEND_SIZE_MIN 0x100 // Minimum transmission size
-#define MULTIBOOT_SEND_SIZE_MAX 0x40000 // Maximum transmission size
-
-struct MultiBootParam
-{
- u32 system_work[5]; // 00
- u8 handshake_data; // 14
- u8 padding; // 15
- u16 handshake_timeout; // 16
- u8 probe_count; // 18
- u8 client_data[MULTIBOOT_NCHILD]; // 19
- u8 palette_data; // 1c
- u8 response_bit; // 1d
- u8 client_bit; // 1e
- u8 reserved1; // 1f
- const u8 *boot_srcp; // 20
- const u8 *boot_endp; // 24
- const u8 *masterp;
- u8 *reserved2[MULTIBOOT_NCHILD];
- u32 system_work2[4];
- u8 sendflag;
- u8 probe_target_bit;
- u8 check_wait;
- u8 server_type;
-};
-
-#define MULTIBOOT_ERROR_04 0x04
-#define MULTIBOOT_ERROR_08 0x08
-#define MULTIBOOT_ERROR_0c 0x0c
-#define MULTIBOOT_ERROR_40 0x40
-#define MULTIBOOT_ERROR_44 0x44
-#define MULTIBOOT_ERROR_48 0x48
-#define MULTIBOOT_ERROR_4c 0x4c
-#define MULTIBOOT_ERROR_80 0x80
-#define MULTIBOOT_ERROR_84 0x84
-#define MULTIBOOT_ERROR_88 0x88
-#define MULTIBOOT_ERROR_8c 0x8c
-#define MULTIBOOT_ERROR_NO_PROBE_TARGET 0x50
-#define MULTIBOOT_ERROR_NO_DLREADY 0x60
-#define MULTIBOOT_ERROR_BOOT_FAILURE 0x70
-#define MULTIBOOT_ERROR_HANDSHAKE_FAILURE 0x71
-
-#define MULTIBOOT_CONNECTION_CHECK_WAIT 15
-
-#define MULTIBOOT_SERVER_TYPE_NORMAL 0
-#define MULTIBOOT_SERVER_TYPE_QUICK 1
-
-#define MULTIBOOT_HANDSHAKE_TIMEOUT 400
-
-#endif // GUARD_GBA_MULTIBOOT_H
diff --git a/berry_fix/payload/include/gba/syscall.h b/berry_fix/payload/include/gba/syscall.h
deleted file mode 100644
index eb1bd4e20f..0000000000
--- a/berry_fix/payload/include/gba/syscall.h
+++ /dev/null
@@ -1,57 +0,0 @@
-#ifndef GUARD_GBA_SYSCALL_H
-#define GUARD_GBA_SYSCALL_H
-
-#include "gba/types.h"
-
-#define RESET_EWRAM 0x01
-#define RESET_IWRAM 0x02
-#define RESET_PALETTE 0x04
-#define RESET_VRAM 0x08
-#define RESET_OAM 0x10
-#define RESET_SIO_REGS 0x20
-#define RESET_SOUND_REGS 0x40
-#define RESET_REGS 0x80
-#define RESET_ALL 0xFF
-
-void SoftReset(u32 resetFlags);
-
-void RegisterRamReset(u32 resetFlags);
-
-void VBlankIntrWait(void);
-
-u16 Sqrt(u32 num);
-
-u16 ArcTan2(s16 x, s16 y);
-
-#define CPU_SET_SRC_FIXED 0x01000000
-#define CPU_SET_16BIT 0x00000000
-#define CPU_SET_32BIT 0x04000000
-
-void CpuSet(const void *src, void *dest, u32 control);
-
-#define CPU_FAST_SET_SRC_FIXED 0x01000000
-
-void CpuFastSet(const void *src, void *dest, u32 control);
-
-void BgAffineSet(struct BgAffineSrcData *src, struct BgAffineDstData *dest, s32 count);
-
-void ObjAffineSet(struct ObjAffineSrcData *src, void *dest, s32 count, s32 offset);
-
-void LZ77UnCompWram(const void *src, void *dest);
-
-void LZ77UnCompVram(const void *src, void *dest);
-
-void RLUnCompWram(const void *src, void *dest);
-
-void RLUnCompVram(const void *src, void *dest);
-
-int MultiBoot(struct MultiBootParam *mp);
-
-void SoundBiasReset(void);
-
-void SoundBiasSet(void);
-
-u32 Div(u32 divisor, u32 dividend);
-u32 Mod(u32 divisor, u32 dividend);
-
-#endif // GUARD_GBA_SYSCALL_H
diff --git a/berry_fix/payload/include/gba/types.h b/berry_fix/payload/include/gba/types.h
deleted file mode 100644
index e919abc22a..0000000000
--- a/berry_fix/payload/include/gba/types.h
+++ /dev/null
@@ -1,146 +0,0 @@
-#ifndef GUARD_GBA_TYPES_H
-#define GUARD_GBA_TYPES_H
-
-#include
-
-typedef uint8_t u8;
-typedef uint16_t u16;
-typedef uint32_t u32;
-typedef uint64_t u64;
-typedef int8_t s8;
-typedef int16_t s16;
-typedef int32_t s32;
-typedef int64_t s64;
-
-typedef volatile u8 vu8;
-typedef volatile u16 vu16;
-typedef volatile u32 vu32;
-typedef volatile u64 vu64;
-typedef volatile s8 vs8;
-typedef volatile s16 vs16;
-typedef volatile s32 vs32;
-typedef volatile s64 vs64;
-
-typedef float f32;
-typedef double f64;
-
-typedef u8 bool8;
-typedef u16 bool16;
-typedef u32 bool32;
-
-struct BgCnt
-{
- u16 priority:2;
- u16 charBaseBlock:2;
- u16 dummy:2;
- u16 mosaic:1;
- u16 palettes:1;
- u16 screenBaseBlock:5;
- u16 areaOverflowMode:1;
- u16 screenSize:2;
-};
-typedef volatile struct BgCnt vBgCnt;
-
-struct PlttData
-{
- u16 r:5; // red
- u16 g:5; // green
- u16 b:5; // blue
- u16 unused_15:1;
-};
-
-struct OamData
-{
- /*0x00*/ u32 y:8;
- /*0x01*/ u32 affineMode:2; // 0x1, 0x2 -> 0x4
- u32 objMode:2; // 0x4, 0x8 -> 0xC
- u32 mosaic:1; // 0x10
- u32 bpp:1; // 0x20
- u32 shape:2; // 0x40, 0x80 -> 0xC0
-
- /*0x02*/ u32 x:9;
- u32 matrixNum:5; // bits 3/4 are h-flip/v-flip if not in affine mode
- u32 size:2;
-
- /*0x04*/ u16 tileNum:10; // 0x3FF
- u16 priority:2; // 0x400, 0x800 -> 0xC00
- u16 paletteNum:4;
- /*0x06*/ u16 affineParam;
-};
-
-#define ST_OAM_OBJ_NORMAL 0
-#define ST_OAM_OBJ_BLEND 1
-#define ST_OAM_OBJ_WINDOW 2
-
-#define ST_OAM_AFFINE_OFF 0
-#define ST_OAM_AFFINE_NORMAL 1
-#define ST_OAM_AFFINE_ERASE 2
-#define ST_OAM_AFFINE_DOUBLE 3
-
-#define ST_OAM_AFFINE_ON_MASK 1
-#define ST_OAM_AFFINE_DOUBLE_MASK 2
-
-#define ST_OAM_4BPP 0
-#define ST_OAM_8BPP 1
-
-#define ST_OAM_SQUARE 0
-#define ST_OAM_H_RECTANGLE 1
-#define ST_OAM_V_RECTANGLE 2
-
-struct BgAffineSrcData
-{
- s32 texX;
- s32 texY;
- s16 scrX;
- s16 scrY;
- s16 sx;
- s16 sy;
- u16 alpha;
-};
-
-struct BgAffineDstData
-{
- s16 pa;
- s16 pb;
- s16 pc;
- s16 pd;
- s32 dx;
- s32 dy;
-};
-
-struct ObjAffineSrcData
-{
- s16 xScale;
- s16 yScale;
- u16 rotation;
-};
-
-// Multi-player SIO Control Structure
-struct SioMultiCnt
-{
- u16 baudRate:2; // baud rate
- u16 si:1; // SI terminal
- u16 sd:1; // SD terminal
- u16 id:2; // ID
- u16 error:1; // error flag
- u16 enable:1; // SIO enable
- u16 unused_11_8:4;
- u16 mode:2; // communication mode (should equal 2)
- u16 intrEnable:1; // IRQ enable
- u16 unused_15:1;
- u16 data; // data
-};
-
-#define ST_SIO_MULTI_MODE 2 // Multi-player communication mode
-
-// baud rate
-#define ST_SIO_9600_BPS 0 // 9600 bps
-#define ST_SIO_38400_BPS 1 // 38400 bps
-#define ST_SIO_57600_BPS 2 // 57600 bps
-#define ST_SIO_115200_BPS 3 // 115200 bps
-
-typedef void (*MainCallback)(void);
-typedef void (*IntrCallback)(void);
-typedef void (*IntrFunc)(void);
-
-#endif // GUARD_GBA_TYPES_H
diff --git a/berry_fix/payload/include/global.berry.h b/berry_fix/payload/include/global.berry.h
deleted file mode 100644
index 8f185c8f9d..0000000000
--- a/berry_fix/payload/include/global.berry.h
+++ /dev/null
@@ -1,62 +0,0 @@
-#ifndef GUARD_GLOBAL_BERRY_H
-#define GUARD_GLOBAL_BERRY_H
-
-struct Berry
-{
- /*0x00*/ u8 name[7];
- /*0x07*/ u8 firmness;
- /*0x08*/ u16 size;
- /*0x0A*/ u8 maxYield;
- /*0x0B*/ u8 minYield;
- /*0x0C*/ const u8 *description1;
- /*0x10*/ const u8 *description2;
- /*0x14*/ u8 stageDuration;
- /*0x15*/ u8 spicy;
- /*0x16*/ u8 dry;
- /*0x17*/ u8 sweet;
- /*0x18*/ u8 bitter;
- /*0x19*/ u8 sour;
- /*0x1A*/ u8 smoothness;
-};
-
-struct EnigmaBerry
-{
- /*0x000*/ struct Berry berry;
- /*0x01B*/ u8 pic[(6 * 6) * TILE_SIZE_4BPP];
- /*0x49C*/ u16 palette[16];
- /*0x4BC*/ u8 description1[45];
- /*0x4E9*/ u8 description2[45];
- /*0x516*/ u8 itemEffect[18];
- /*0x528*/ u8 holdEffect;
- /*0x529*/ u8 holdEffectParam;
- /*0x52C*/ u32 checksum;
-};
-
-struct BattleEnigmaBerry
-{
- /*0x00*/ u8 name[7];
- /*0x07*/ u8 holdEffect;
- /*0x08*/ u8 itemEffect[18];
- /*0x1A*/ u8 holdEffectParam;
-};
-
-struct BerryTree
-{
- /*0x00*/ u8 berry;
- /*0x01*/ u8 stage:7;
- /*
- A berry sparkle is a state that a berry tree
- can be in after growing within the player's
- viewport.
- */
- /*0x01*/ bool8 growthSparkle:1;
- /*0x02*/ u16 minutesUntilNextStage;
- /*0x04*/ u8 berryYield;
- /*0x05*/ u8 regrowthCount:4;
- /*0x05*/ u8 watered1:1;
- /*0x05*/ u8 watered2:1;
- /*0x05*/ u8 watered3:1;
- /*0x05*/ u8 watered4:1;
-};
-
-#endif // GUARD_GLOBAL_BERRY_H
diff --git a/berry_fix/payload/include/global.fieldmap.h b/berry_fix/payload/include/global.fieldmap.h
deleted file mode 100644
index e7150b429f..0000000000
--- a/berry_fix/payload/include/global.fieldmap.h
+++ /dev/null
@@ -1,310 +0,0 @@
-#ifndef GUARD_GLOBAL_FIELDMAP_H
-#define GUARD_GLOBAL_FIELDMAP_H
-
-enum
-{
- CONNECTION_SOUTH = 1,
- CONNECTION_NORTH,
- CONNECTION_WEST,
- CONNECTION_EAST,
- CONNECTION_DIVE,
- CONNECTION_EMERGE
-};
-
-typedef void (*TilesetCB)(void);
-
-struct Tileset
-{
- /*0x00*/ bool8 isCompressed;
- /*0x01*/ bool8 isSecondary;
- /*0x04*/ void *tiles;
- /*0x08*/ void *palettes;
- /*0x0c*/ void *metatiles;
- /*0x10*/ void *metatileAttributes;
- /*0x14*/ TilesetCB callback;
-};
-
-struct MapLayout
-{
- /*0x00*/ s32 width;
- /*0x04*/ s32 height;
- /*0x08*/ u16 *border;
- /*0x0c*/ u16 *map;
- /*0x10*/ struct Tileset *primaryTileset;
- /*0x14*/ struct Tileset *secondaryTileset;
-};
-
-struct BackupMapLayout
-{
- s32 width;
- s32 height;
- u16 *map;
-};
-
-struct EventObjectTemplate
-{
- /*0x00*/ u8 localId;
- /*0x01*/ u8 graphicsId;
- /*0x02*/ u8 unk2;
- /*0x04*/ s16 x;
- /*0x06*/ s16 y;
- /*0x08*/ u8 elevation;
- /*0x09*/ u8 movementType;
- /*0x0A*/ u8 movementRangeX:4;
- u8 movementRangeY:4;
- /*0x0C*/ u16 trainerType;
- /*0x0E*/ u16 trainerRange_berryTreeId;
- /*0x10*/ u8 *script;
- /*0x14*/ u16 flagId;
-};
-
-struct WarpEvent
-{
- s16 x, y;
- u8 elevation;
- u8 warpId;
- u8 mapNum;
- u8 mapGroup;
-};
-
-struct CoordEvent
-{
- s16 x, y;
- u8 elevation;
- u16 trigger;
- u16 index;
- u8 filler_A[0x2];
- u8 *script;
-};
-
-struct BgEvent
-{
- u16 x, y;
- u8 elevation;
- u8 kind; // The "kind" field determines how to access bgUnion union below.
- union {
- u8 *script;
- struct {
- u16 item;
- u16 hiddenItemId;
- } hiddenItem;
- u32 secretBaseId;
- } bgUnion;
-};
-
-struct MapEvents
-{
- u8 eventObjectCount;
- u8 warpCount;
- u8 coordEventCount;
- u8 bgEventCount;
-
- struct EventObjectTemplate *eventObjects;
- struct WarpEvent *warps;
- struct CoordEvent *coordEvents;
- struct BgEvent *bgEvents;
-};
-
-struct MapConnection
-{
- /*0x00*/ u8 direction;
- /*0x01*/ u32 offset;
- /*0x05*/ u8 mapGroup;
- /*0x06*/ u8 mapNum;
-};
-
-struct MapConnections
-{
- s32 count;
- struct MapConnection *connections;
-};
-
-struct MapHeader
-{
- /* 0x00 */ struct MapLayout *mapLayout;
- /* 0x04 */ struct MapEvents *events;
- /* 0x08 */ u8 *mapScripts;
- /* 0x0C */ struct MapConnections *connections;
- /* 0x10 */ u16 music;
- /* 0x12 */ u16 mapLayoutId;
- /* 0x14 */ u8 regionMapSectionId;
- /* 0x15 */ u8 cave;
- /* 0x16 */ u8 weather;
- /* 0x17 */ u8 mapType;
- /* 0x18 */ u8 filler_18;
- /* 0x19 */ u8 escapeRope;
- /* 0x1A */ u8 flags;
- /* 0x1B */ u8 battleType;
-};
-
-struct EventObject
-{
- /*0x00*/ u32 active:1;
- u32 singleMovementActive:1;
- u32 triggerGroundEffectsOnMove:1;
- u32 triggerGroundEffectsOnStop:1;
- u32 disableCoveringGroundEffects:1; // disables ground effects that cover parts of the object's sprite
- u32 landingJump:1;
- u32 heldMovementActive:1;
- u32 heldMovementFinished:1;
- /*0x01*/ u32 frozen:1;
- u32 facingDirectionLocked:1;
- u32 disableAnim:1; // used to disable forced movement sliding animations (like on ice)
- u32 enableAnim:1;
- u32 inanimate:1;
- u32 invisible:1;
- u32 offScreen:1;
- u32 trackedByCamera:1; // only set for the player object
- /*0x02*/ u32 isPlayer:1;
- u32 hasReflection:1;
- u32 inShortGrass:1;
- u32 inShallowFlowingWater:1;
- u32 inSandPile:1;
- u32 inHotSprings:1;
- u32 hasShadow:1;
- u32 spriteAnimPausedBackup:1;
- /*0x03*/ u32 spriteAffineAnimPausedBackup:1;
- u32 disableJumpLandingGroundEffect:1;
- u32 fixedPriority:1;
- /*0x04*/ u8 spriteId;
- /*0x05*/ u8 graphicsId;
- /*0x06*/ u8 movementType;
- /*0x07*/ u8 trainerType;
- /*0x08*/ u8 localId;
- /*0x09*/ u8 mapNum;
- /*0x0A*/ u8 mapGroup;
- /*0x0B*/ u8 currentElevation:4;
- u8 previousElevation:4;
- /*0x0C*/ struct Coords16 initialCoords;
- /*0x10*/ struct Coords16 currentCoords;
- /*0x14*/ struct Coords16 previousCoords;
- /*0x18*/ u8 facingDirection:4;
- /*0x18*/ u8 movementDirection:4;
- /*0x19*/ union __attribute__((packed)) {
- u8 as_byte;
- struct __attribute__((packed)) {
- u16 x:4;
- u16 y:4;
- } as_nybbles;
- } range;
- /*0x1A*/ u8 fieldEffectSpriteId;
- /*0x1B*/ u8 warpArrowSpriteId;
- /*0x1C*/ u8 movementActionId;
- /*0x1D*/ u8 trainerRange_berryTreeId;
- /*0x1E*/ u8 currentMetatileBehavior;
- /*0x1F*/ u8 previousMetatileBehavior;
- /*0x20*/ u8 previousMovementDirection;
- /*0x21*/ u8 directionSequenceIndex;
- /*0x22*/ u8 playerCopyableMovement; // used as an index to gCopyPlayerMovementFuncs for the "copy player" movement types
- /*size = 0x24*/
-};
-
-struct EventObjectGraphicsInfo
-{
- /*0x00*/ u16 tileTag;
- /*0x02*/ u16 paletteTag;
- /*0x04*/ u16 bridgeReflectionPaletteTag;
- /*0x06*/ u16 size;
- /*0x08*/ s16 width;
- /*0x0A*/ s16 height;
- /*0x0C*/ u8 paletteSlot:4;
- u8 shadowSize:2;
- u8 inanimate:1;
- u8 disableReflectionPaletteLoad:1;
- /*0x0D*/ u8 tracks;
- /*0x10*/ const struct OamData *oam;
- /*0x14*/ const struct SubspriteTable *subspriteTables;
- /*0x18*/ const union AnimCmd *const *anims;
- /*0x1C*/ const struct SpriteFrameImage *images;
- /*0x20*/ const union AffineAnimCmd *const *affineAnims;
-};
-
-#define PLAYER_AVATAR_FLAG_ON_FOOT (1 << 0)
-#define PLAYER_AVATAR_FLAG_MACH_BIKE (1 << 1)
-#define PLAYER_AVATAR_FLAG_ACRO_BIKE (1 << 2)
-#define PLAYER_AVATAR_FLAG_SURFING (1 << 3)
-#define PLAYER_AVATAR_FLAG_UNDERWATER (1 << 4)
-#define PLAYER_AVATAR_FLAG_CONTROLLABLE (1 << 5)
-#define PLAYER_AVATAR_FLAG_FORCED_MOVE (1 << 6)
-#define PLAYER_AVATAR_FLAG_DASH (1 << 7)
-
-enum
-{
- ACRO_BIKE_NORMAL,
- ACRO_BIKE_TURNING,
- ACRO_BIKE_WHEELIE_STANDING,
- ACRO_BIKE_BUNNY_HOP,
- ACRO_BIKE_WHEELIE_MOVING,
- ACRO_BIKE_STATE5,
- ACRO_BIKE_STATE6,
-};
-
-enum
-{
- DIR_NONE,
- DIR_SOUTH,
- DIR_NORTH,
- DIR_WEST,
- DIR_EAST,
- DIR_SOUTHWEST,
- DIR_SOUTHEAST,
- DIR_NORTHWEST,
- DIR_NORTHEAST,
-};
-
-enum
-{
- COLLISION_LEDGE_JUMP = 6
-};
-
-// player running states
-enum
-{
- NOT_MOVING,
- TURN_DIRECTION, // not the same as turning! turns your avatar without moving. also known as a turn frame in some circles
- MOVING,
-};
-
-// player tile transition states
-enum
-{
- T_NOT_MOVING,
- T_TILE_TRANSITION,
- T_TILE_CENTER, // player is on a frame in which they are centered on a tile during which the player either stops or keeps their momentum and keeps going, changing direction if necessary.
-};
-
-struct PlayerAvatar /* 0x202E858 */
-{
- /*0x00*/ u8 flags;
- /*0x01*/ u8 unk1; // used to be named bike, but its definitely not that. seems to be some transition flags
- /*0x02*/ u8 runningState; // this is a static running state. 00 is not moving, 01 is turn direction, 02 is moving.
- /*0x03*/ u8 tileTransitionState; // this is a transition running state: 00 is not moving, 01 is transition between tiles, 02 means you are on the frame in which you have centered on a tile but are about to keep moving, even if changing directions. 2 is also used for a ledge hop, since you are transitioning.
- /*0x04*/ u8 spriteId;
- /*0x05*/ u8 eventObjectId;
- /*0x06*/ bool8 preventStep;
- /*0x07*/ u8 gender;
- /*0x08*/ u8 acroBikeState; // 00 is normal, 01 is turning, 02 is standing wheelie, 03 is hopping wheelie
- /*0x09*/ u8 newDirBackup; // during bike movement, the new direction as opposed to player's direction is backed up here.
- /*0x0A*/ u8 bikeFrameCounter; // on the mach bike, when this value is 1, the bike is moving but not accelerating yet for 1 tile. on the acro bike, this acts as a timer for acro bike.
- /*0x0B*/ u8 bikeSpeed;
- // acro bike only
- /*0x0C*/ u32 directionHistory; // up/down/left/right history is stored in each nybble, but using the field directions and not the io inputs.
- /*0x10*/ u32 abStartSelectHistory; // same as above but for A + B + start + select only
- // these two are timer history arrays which [0] is the active timer for acro bike. every element is backed up to the next element upon update.
- /*0x14*/ u8 dirTimerHistory[8];
- /*0x1C*/ u8 abStartSelectTimerHistory[8];
-};
-
-struct Camera
-{
- bool8 active:1;
- s32 x;
- s32 y;
-};
-
-extern struct EventObject gMapObjects[];
-extern u8 gSelectedEventObject;
-extern struct MapHeader gMapHeader;
-extern struct PlayerAvatar gPlayerAvatar;
-
-#endif // GUARD_GLOBAL_FIELDMAP_H
diff --git a/berry_fix/payload/include/global.h b/berry_fix/payload/include/global.h
deleted file mode 100644
index 4bea138d67..0000000000
--- a/berry_fix/payload/include/global.h
+++ /dev/null
@@ -1,876 +0,0 @@
-#ifndef GUARD_GLOBAL_H
-#define GUARD_GLOBAL_H
-
-#include "gba/gba.h"
-
-// global.h from pokemon ruby
-
-// IDE support
-#if defined(__APPLE__) || defined(__CYGWIN__) || defined(__INTELLISENSE__)
-// We define these when using certain IDEs to fool preproc
-#define _(x) (x)
-#define __(x) (x)
-#define INCBIN(...) {0}
-#define INCBIN_U8 INCBIN
-#define INCBIN_U16 INCBIN
-#define INCBIN_U32 INCBIN
-#define INCBIN_S8 INCBIN
-#define INCBIN_S16 INCBIN
-#define INCBIN_S32 INCBIN
-#endif // IDE support
-
-// Prevent cross-jump optimization.
-#define BLOCK_CROSS_JUMP asm("");
-
-// to help in decompiling
-#define asm_comment(x) asm volatile("@ -- " x " -- ")
-
-#define asm_unified(x) asm(".syntax unified\n" x "\n.syntax divided\n")
-
-#define ARRAY_COUNT(array) (sizeof(array) / sizeof((array)[0]))
-
-
-#define POKEMON_SLOTS_NUMBER 412
-#define POKEMON_NAME_LENGTH 10
-#define OT_NAME_LENGTH 7
-
-#define min(a, b) ((a) < (b) ? (a) : (b))
-#define max(a, b) ((a) >= (b) ? (a) : (b))
-
-// why does GF hate 2d arrays
-#define MULTI_DIM_ARR(x, dim, y) ((x) * dim + (y))
-
-// dim access enums
-enum
-{
- B_8 = 1,
- B_16 = 2,
- B_32 = 4
-};
-
-// There are many quirks in the source code which have overarching behavioral differences from
-// a number of other files. For example, diploma.c seems to declare rodata before each use while
-// other files declare out of order and must be at the beginning. There are also a number of
-// macros which differ from one file to the next due to the method of obtaining the result, such
-// as these below. Because of this, there is a theory (Two Team Theory) that states that these
-// programming projects had more than 1 "programming team" which utilized different macros for
-// each of the files that were worked on.
-#define T1_READ_8(ptr) ((ptr)[0])
-#define T1_READ_16(ptr) ((ptr)[0] | ((ptr)[1] << 8))
-#define T1_READ_32(ptr) ((ptr)[0] | ((ptr)[1] << 8) | ((ptr)[2] << 16) | ((ptr)[3] << 24))
-#define T1_READ_PTR(ptr) (u8*) T1_READ_32(ptr)
-
-// T2_READ_8 is a duplicate to remain consistent with each group.
-#define T2_READ_8(ptr) ((ptr)[0])
-#define T2_READ_16(ptr) ((ptr)[0] + ((ptr)[1] << 8))
-#define T2_READ_32(ptr) ((ptr)[0] + ((ptr)[1] << 8) + ((ptr)[2] << 16) + ((ptr)[3] << 24))
-#define T2_READ_PTR(ptr) (void*) T2_READ_32(ptr)
-
-// Credits to Made (dolphin emoji)
-#define S16TOPOSFLOAT(val) \
-({ \
- s16 v = (val); \
- float f = (float)v; \
- if(v < 0) f += 65536.0f; \
- f; \
-})
-
-enum
-{
- VERSION_SAPPHIRE = 1,
- VERSION_RUBY = 2,
- VERSION_EMERALD = 3,
-};
-
-enum LanguageId
-{
- LANGUAGE_JAPANESE = 1,
- LANGUAGE_ENGLISH = 2,
- LANGUAGE_GERMAN = 5,
-};
-
-// capacities of various saveblock objects
-#define DAYCARE_MON_COUNT 2
-#define POKEBLOCKS_COUNT 40
-#define PARTY_SIZE 6
-#define EVENT_OBJECTS_COUNT 16
-#define BERRY_TREES_COUNT 128
-#define FLAGS_COUNT 288
-#define VARS_COUNT 256
-#define MAIL_COUNT 16
-#define SECRET_BASES_COUNT 20
-#define TV_SHOWS_COUNT 25
-#define POKE_NEWS_COUNT 16
-#define PC_ITEMS_COUNT 50
-#define BAG_ITEMS_COUNT 20
-#define BAG_KEYITEMS_COUNT 20
-#define BAG_POKEBALLS_COUNT 16
-#define BAG_TMHM_COUNT 64
-#define BAG_BERRIES_COUNT 46
-
-enum
-{
- MALE,
- FEMALE
-};
-
-enum
-{
- OPTIONS_BUTTON_MODE_NORMAL,
- OPTIONS_BUTTON_MODE_LR,
- OPTIONS_BUTTON_MODE_L_EQUALS_A
-};
-
-enum
-{
- OPTIONS_TEXT_SPEED_SLOW,
- OPTIONS_TEXT_SPEED_MID,
- OPTIONS_TEXT_SPEED_FAST
-};
-
-enum
-{
- OPTIONS_SOUND_MONO,
- OPTIONS_SOUND_STEREO
-};
-
-enum
-{
- OPTIONS_BATTLE_STYLE_SHIFT,
- OPTIONS_BATTLE_STYLE_SET
-};
-
-enum
-{
- BAG_ITEMS = 1,
- BAG_POKEBALLS,
- BAG_TMsHMs,
- BAG_BERRIES,
- BAG_KEYITEMS
-};
-
-struct Coords16
-{
- s16 x;
- s16 y;
-};
-
-struct UCoords16
-{
- u16 x;
- u16 y;
-};
-
-struct SecretBaseRecord
-{
- /*0x1A08*/ u8 secretBaseId;
- /*0x1A09*/ u8 sbr_field_1_0:4;
- /*0x1A09*/ u8 gender:1;
- /*0x1A09*/ u8 sbr_field_1_5:1;
- /*0x1A09*/ u8 sbr_field_1_6:2;
- /*0x1A0A*/ u8 playerName[OT_NAME_LENGTH];
- /*0x1A11*/ u8 trainerId[4]; // byte 0 is used for determining trainer class
- /*0x1A16*/ u16 sbr_field_e;
- /*0x1A18*/ u8 sbr_field_10;
- /*0x1A19*/ u8 sbr_field_11;
- /*0x1A1A*/ u8 decorations[16];
- /*0x1A2A*/ u8 decorationPos[16];
- /*0x1A3C*/ u32 partyPersonality[6];
- /*0x1A54*/ u16 partyMoves[6 * 4];
- /*0x1A84*/ u16 partySpecies[6];
- /*0x1A90*/ u16 partyHeldItems[6];
- /*0x1A9C*/ u8 partyLevels[6];
- /*0x1AA2*/ u8 partyEVs[6];
-};
-
-#include "constants/game_stat.h"
-#include "global.fieldmap.h"
-#include "global.berry.h"
-#include "pokemon.h"
-
-struct WarpData
-{
- s8 mapGroup;
- s8 mapNum;
- s8 warpId;
- s16 x, y;
-};
-
-struct ItemSlot
-{
- u16 itemId;
- u16 quantity;
-};
-
-struct Pokeblock
-{
- u8 color;
- u8 spicy;
- u8 dry;
- u8 sweet;
- u8 bitter;
- u8 sour;
- u8 feel;
-};
-
-struct Roamer
-{
- /*0x00*/ u32 ivs;
- /*0x04*/ u32 personality;
- /*0x08*/ u16 species;
- /*0x0A*/ u16 hp;
- /*0x0C*/ u8 level;
- /*0x0D*/ u8 status;
- /*0x0E*/ u8 cool;
- /*0x0F*/ u8 beauty;
- /*0x10*/ u8 cute;
- /*0x11*/ u8 smart;
- /*0x12*/ u8 tough;
- /*0x13*/ bool8 active;
- /*0x14*/ u8 filler[0x8];
-};
-
-struct RamScriptData
-{
- u8 magic;
- u8 mapGroup;
- u8 mapNum;
- u8 objectId;
- u8 script[995];
-};
-
-struct RamScript
-{
- u32 checksum;
- struct RamScriptData data;
-};
-
-struct EasyChatPair
-{
- u16 unk0_0:7;
- u16 unk0_7:7;
- u16 unk1_6:1;
- u16 unk2;
- u16 words[2];
-}; /*size = 0x8*/
-
-struct TVShowCommon
-{
- /*0x00*/ u8 kind;
- /*0x01*/ bool8 active;
- /*0x02*/ u8 pad02[20];
- /*0x16*/ u16 var16[3];
- /*0x1C*/ u8 srcTrainerId3Lo;
- /*0x1D*/ u8 srcTrainerId3Hi;
- /*0x1E*/ u8 srcTrainerId2Lo;
- /*0x1F*/ u8 srcTrainerId2Hi;
- /*0x20*/ u8 srcTrainerIdLo;
- /*0x21*/ u8 srcTrainerIdHi;
- /*0x22*/ u8 trainerIdLo;
- /*0x23*/ u8 trainerIdHi;
-};
-
-struct TVShowFanClubLetter
-{
- /*0x00*/ u8 kind;
- /*0x01*/ bool8 active;
- /*0x02*/ u16 species;
- /*0x04*/ u16 pad04[6];
- /*0x10*/ u8 playerName[8];
- /*0x18*/ u8 language;
-};
-
-struct TVShowRecentHappenings
-{
- /*0x00*/ u8 kind;
- /*0x01*/ bool8 active;
- /*0x02*/ u16 var02;
- /*0x04*/ u16 var04[6];
- /*0x10*/ u8 playerName[8];
- /*0x18*/ u8 language;
- /*0x19*/ u8 pad19[10];
-};
-
-struct TVShowFanclubOpinions
-{
- /*0x00*/ u8 kind;
- /*0x01*/ bool8 active;
- /*0x02*/ u16 var02;
- /*0x04*/ u8 var04A:4;
- /*0x04*/ u8 var04B:4;
- /*0x05*/ u8 playerName[8];
- /*0x0D*/ u8 language;
- /*0x0E*/ u8 var0E;
- /*0x0F*/ u8 var0F;
- /*0x10*/ u8 var10[8];
- /*0x18*/ u16 var18[2];
- /*0x1C*/ u16 var1C[4];
-};
-
-struct TVShowUnknownType04
-{
- /*0x00*/ u8 kind;
- /*0x01*/ bool8 active;
- /*0x02*/ u8 pad02[4];
- /*0x06*/ u16 var06;
-};
-
-struct TVShowNameRaterShow
-{
- /*0x00*/ u8 kind;
- /*0x01*/ bool8 active;
- /*0x02*/ u16 species;
- /*0x04*/ u8 pokemonName[11];
- /*0x0F*/ u8 trainerName[11];
- /*0x1A*/ u8 random;
- /*0x1B*/ u8 random2;
- /*0x1C*/ u16 var1C;
- /*0x1E*/ u8 language;
- /*0x1F*/ u8 pokemonNameLanguage;
-};
-
-struct TVShowBravoTrainerPokemonProfiles
-{
- /*0x00*/ u8 kind;
- /*0x01*/ bool8 active;
- /*0x02*/ u16 species;
- /*0x04*/ u16 var04[2];
- /*0x08*/ u8 pokemonNickname[11];
- /*0x13*/ u8 contestCategory:3;
- /*0x13*/ u8 contestRank:2;
- /*0x13*/ u8 contestResult:2;
- /*0x13*/ u8 var13_7:1;
- /*0x14*/ u16 var14;
- /*0x16*/ u8 playerName[8];
- /*0x1E*/ u8 language;
- /*0x1F*/ u8 var1f;
-};
-
-struct TVShowBravoTrainerBattleTowerSpotlight
-{
- /*0x00*/ u8 kind;
- /*0x01*/ bool8 active;
- /*0x02*/ u8 trainerName[8];
- /*0x0A*/ u16 species;
- /*0x0C*/ u8 enemyTrainerName[8];
- /*0x14*/ u16 defeatedSpecies;
- /*0x16*/ u16 var16;
- /*0x18*/ u16 var18[1];
- /*0x1A*/ u8 btLevel;
- /*0x1B*/ u8 var1b;
- /*0x1C*/ u8 var1c;
- /*0x1D*/ u8 language;
-};
-
-struct TVShowPokemonToday
-{
- /*0x00*/ u8 kind;
- /*0x01*/ bool8 active;
- /*0x02*/ u8 language;
- /*0x03*/ u8 language2;
- /*0x04*/ u8 nickname[11];
- /*0x0F*/ u8 ball;
- /*0x10*/ u16 species;
- /*0x12*/ u8 var12;
- /*0x13*/ u8 playerName[8];
-};
-
-struct TVShowSmartShopper
-{
- /*0x00*/ u8 kind;
- /*0x01*/ bool8 active;
- /*0x02*/ u8 priceReduced;
- /*0x03*/ u8 language;
- /*0x04*/ u8 pad04[2];
- /*0x06*/ u16 itemIds[3];
- /*0x0C*/ u16 itemAmounts[3];
- /*0x12*/ u8 shopLocation;
- /*0x13*/ u8 playerName[8];
-};
-
-struct TVShowPokemonTodayFailed
-{
- /*0x00*/ u8 kind;
- /*0x01*/ bool8 active;
- /*0x02*/ u8 language;
- /*0x03*/ u8 pad03[9];
- /*0x0c*/ u16 species;
- /*0x0e*/ u16 species2;
- /*0x10*/ u8 var10;
- /*0x11*/ u8 var11;
- /*0x12*/ u8 var12;
- /*0x13*/ u8 playerName[8];
-};
-
-struct TVShowPokemonAngler
-{
- /*0x00*/ u8 kind;
- /*0x01*/ bool8 active;
- /*0x02*/ u8 var02;
- /*0x03*/ u8 var03;
- /*0x04*/ u16 var04;
- /*0x06*/ u8 language;
- u8 pad07[12];
- /*0x13*/ u8 playerName[8];
-};
-
-struct TVShowWorldOfMasters
-{
- /*0x00*/ u8 kind;
- /*0x01*/ bool8 active;
- /*0x02*/ u16 var02;
- /*0x04*/ u16 var04;
- /*0x06*/ u16 var06;
- /*0x08*/ u16 var08;
- /*0x0a*/ u8 var0a;
- /*0x0b*/ u8 language;
- u8 pad0c[7];
- /*0x13*/ u8 playerName[8];
-};
-
-struct TVShowMassOutbreak
-{
- /*0x00*/ u8 kind;
- /*0x01*/ bool8 active;
- /*0x02*/ u8 var02;
- /*0x03*/ u8 var03;
- /*0x04*/ u16 moves[4];
- /*0x0C*/ u16 species;
- /*0x0E*/ u16 var0E;
- /*0x10*/ u8 locationMapNum;
- /*0x11*/ u8 locationMapGroup;
- /*0x12*/ u8 var12;
- /*0x13*/ u8 probability;
- /*0x14*/ u8 level;
- /*0x15*/ u8 var15;
- /*0x16*/ u16 daysLeft;
- /*0x18*/ u8 language;
- u8 pad19[11];
-};
-
-typedef union TVShow
-{
- struct TVShowCommon common;
- struct TVShowFanClubLetter fanclubLetter;
- struct TVShowRecentHappenings recentHappenings;
- struct TVShowFanclubOpinions fanclubOpinions;
- struct TVShowUnknownType04 unkShow04;
- struct TVShowNameRaterShow nameRaterShow;
- struct TVShowBravoTrainerPokemonProfiles bravoTrainer;
- struct TVShowBravoTrainerBattleTowerSpotlight bravoTrainerTower;
- struct TVShowPokemonToday pokemonToday;
- struct TVShowSmartShopper smartshopperShow;
- struct TVShowPokemonTodayFailed pokemonTodayFailed;
- struct TVShowPokemonAngler pokemonAngler;
- struct TVShowWorldOfMasters worldOfMasters;
- struct TVShowMassOutbreak massOutbreak;
-} TVShow;
-
-struct MailStruct
-{
- /*0x00*/ u16 words[9];
- /*0x12*/ u8 playerName[8];
- /*0x1A*/ u8 trainerId[4];
- /*0x1E*/ u16 species;
- /*0x20*/ u16 itemId;
-};
-
-
-// Mauville Pokemon Center men
-
-struct MauvilleManCommon
-{
- u8 id;
-};
-
-struct MauvilleManBard
-{
- /*0x00*/ u8 id;
- /*0x02*/ u16 songLyrics[6];
- /*0x0E*/ u16 temporaryLyrics[6];
- /*0x1A*/ u8 playerName[8];
- /*0x22*/ u8 filler_2DB6[0x3];
- /*0x25*/ u8 playerTrainerId[4];
- /*0x29*/ bool8 hasChangedSong;
-}; /*size = 0x2C*/
-
-struct MauvilleManHipster
-{
- u8 id;
- bool8 alreadySpoken;
-};
-
-struct MauvilleManTrader
-{
- u8 id;
- u8 unk1[4];
- u8 unk5[4][11];
- bool8 alreadyTraded;
-};
-
-struct MauvilleManStoryteller
-{
- u8 id;
- bool8 alreadyRecorded;
- u8 filler2[2];
- u8 gameStatIDs[4];
- u8 trainerNames[4][7];
- u8 statValues[4][4];
-};
-
-struct MauvilleManGiddy
-{
- /*0x00*/ u8 id;
- /*0x01*/ u8 taleCounter;
- /*0x02*/ u8 questionNum;
- /*0x04*/ u16 randomWords[10];
- /*0x18*/ u8 questionList[12];
-}; /*size = 0x2C*/
-
-
-union MauvilleMan
-{
- struct MauvilleManCommon common;
- struct MauvilleManBard bard;
- struct MauvilleManHipster hipster;
- struct MauvilleManTrader trader;
- struct MauvilleManStoryteller storyteller;
- struct MauvilleManGiddy giddy;
- u8 filler[0x40]; // needed to pad out the struct
-};
-
-struct PokeNews
-{
- u8 kind;
- u8 state;
- u16 days;
-};
-
-struct GabbyAndTyData
-{
- /*2b10*/ u16 mon1;
- /*2b12*/ u16 mon2;
- /*2b14*/ u16 lastMove;
- /*2b16*/ u16 quote;
- /*2b18*/ u8 mapnum;
- /*2b19*/ u8 battleNum;
- /*2b1a*/ u8 valA_0:1;
- /*2b1a*/ u8 valA_1:1;
- /*2b1a*/ u8 valA_2:1;
- /*2b1a*/ u8 valA_3:1;
- /*2b1a*/ u8 valA_4:1;
- /*2b1a*/ u8 valA_5:3;
- /*2b1b*/ u8 valB_0:1;
- /*2b1b*/ u8 valB_1:1;
- /*2b1b*/ u8 valB_2:1;
- /*2b1b*/ u8 valB_3:1;
- /*2b1b*/ u8 valB_4:1;
- /*2b1b*/ u8 valB_5:3;
-};
-
-struct DayCareMail
-{
- /*0x00*/ struct MailStruct message;
- /*0x24*/ u8 names[19];
-};
-
-struct DayCareStepCountersEtc {
- u32 steps[DAYCARE_MON_COUNT];
- u16 pendingEggPersonality;
- u8 eggCycleStepsRemaining;
-};
-
-struct RecordMixingDayCareMail
-{
- struct DayCareMail mail[DAYCARE_MON_COUNT];
- u32 numDaycareMons;
- u16 itemsHeld[DAYCARE_MON_COUNT]; // marks whether or not each daycare mon is currently holding an item.
-};
-
-struct DayCareMisc
-{
- struct DayCareMail mail[DAYCARE_MON_COUNT];
- struct DayCareStepCountersEtc countersEtc;
-};
-
-struct DayCare {
- struct BoxPokemon mons[DAYCARE_MON_COUNT];
- struct DayCareMisc misc;
-};
-
-struct LinkBattleRecord
-{
- u8 name[8];
- u16 trainerId;
- u16 wins;
- u16 losses;
- u16 draws;
-};
-
-struct RecordMixingGiftData
-{
- u8 unk0;
- u8 quantity;
- u16 itemId;
- u8 filler4[8];
-};
-
-struct RecordMixingGift
-{
- int checksum;
- struct RecordMixingGiftData data;
-};
-
-struct ContestWinner
-{
- /*0x00*/ u32 personality; // personality
- /*0x04*/ u32 otId; // otId
- /*0x08*/ u16 species; // species
- /*0x0A*/ u8 contestCategory;
- /*0x0B*/ u8 nickname[11];
- /*0x16*/ u8 trainerName[8];
-};
-
-// there should be enough flags for all 412 slots
-// each slot takes up 8 flags
-// if the value is not divisible by 8, we need to account for the reminder as well
-#define DEX_FLAGS_NO ((POKEMON_SLOTS_NUMBER / 8) + ((POKEMON_SLOTS_NUMBER % 8) ? 1 : 0))
-
-struct SaveBlock1 /* 0x02025734 */
-{
- /*0x00*/ struct Coords16 pos;
- /*0x04*/ struct WarpData location;
- /*0x0C*/ struct WarpData warp1;
- /*0x14*/ struct WarpData warp2;
- /*0x1C*/ struct WarpData lastHealLocation;
- /*0x24*/ struct WarpData warp4;
- /*0x2C*/ u16 savedMusic;
- /*0x2E*/ u8 weather;
- /*0x2F*/ u8 weatherCycleStage;
- /*0x30*/ u8 flashLevel; // flash level on current map, 0 being normal and 4 being the darkest
- /*0x32*/ u16 mapLayoutId;
- /*0x34*/ u16 mapView[0x100];
- /*0x234*/ u8 playerPartyCount;
- /*0x238*/ struct Pokemon playerParty[6];
- /*0x490*/ u32 money;
- /*0x494*/ u16 coins;
- /*0x496*/ u16 registeredItem; // registered for use with SELECT button
- /*0x498*/ struct ItemSlot pcItems[PC_ITEMS_COUNT];
- /*0x560*/ struct ItemSlot bagPocket_Items[BAG_ITEMS_COUNT];
- /*0x5B0*/ struct ItemSlot bagPocket_KeyItems[BAG_KEYITEMS_COUNT];
- /*0x600*/ struct ItemSlot bagPocket_PokeBalls[BAG_POKEBALLS_COUNT];
- /*0x640*/ struct ItemSlot bagPocket_TMHM[BAG_TMHM_COUNT];
- /*0x740*/ struct ItemSlot bagPocket_Berries[BAG_BERRIES_COUNT];
- /*0x7F8*/ struct Pokeblock pokeblocks[POKEBLOCKS_COUNT];
- /*0x938*/ u8 dexSeen2[DEX_FLAGS_NO];
- /*0x96C*/ u16 berryBlenderRecords[3];
- /*0x972*/ u8 filler_972[0x6];
- /*0x978*/ u16 trainerRematchStepCounter;
- /*0x97A*/ u8 trainerRematches[100];
- /*0x9E0*/ struct EventObject eventObjects[EVENT_OBJECTS_COUNT];
- /*0xC20*/ struct EventObjectTemplate eventObjectTemplates[64];
- /*0x1220*/ u8 flags[FLAGS_COUNT];
- /*0x1340*/ u16 vars[VARS_COUNT];
- /*0x1540*/ u32 gameStats[NUM_GAME_STATS];
- /*0x1608*/ struct BerryTree berryTrees[BERRY_TREES_COUNT];
- /*0x1A08*/ struct SecretBaseRecord secretBases[SECRET_BASES_COUNT];
- /*0x2688*/ u8 playerRoomDecor[12];
- /*0x2694*/ u8 playerRoomDecorPos[12];
- /*0x26A0*/ u8 decorDesk[10];
- /*0x26AA*/ u8 decorChair[10];
- /*0x26B4*/ u8 decorPlant[10];
- /*0x26BE*/ u8 decorOrnament[30];
- /*0x26DC*/ u8 decorMat[30];
- /*0x26FA*/ u8 decorPoster[10];
- /*0x2704*/ u8 decorDoll[40];
- /*0x272C*/ u8 decorCushion[10];
- /*0x2736*/ u8 padding_2736[2];
- /*0x2738*/ TVShow tvShows[TV_SHOWS_COUNT];
- /*0x2ABC*/ struct PokeNews pokeNews[POKE_NEWS_COUNT];
- /*0x2AFC*/ u16 outbreakPokemonSpecies;
- /*0x2AFE*/ u8 outbreakLocationMapNum;
- /*0x2AFF*/ u8 outbreakLocationMapGroup;
- /*0x2B00*/ u8 outbreakPokemonLevel;
- /*0x2B01*/ u8 outbreakUnk1;
- /*0x2B02*/ u16 outbreakUnk2;
- /*0x2B04*/ u16 outbreakPokemonMoves[4];
- /*0x2B0C*/ u8 outbreakUnk4;
- /*0x2B0D*/ u8 outbreakPokemonProbability;
- /*0x2B0E*/ u16 outbreakUnk5;
- /*0x2B10*/ struct GabbyAndTyData gabbyAndTyData;
- /*0x2B1C*/ struct {
- /*0x2B1C*/ u16 unk2B1C[6];
- /*0x2B28*/ u16 unk2B28[6];
- /*0x2B34*/ u16 unk2B34[6];
- /*0x2B40*/ u16 unk2B40[6];
- } easyChats;
- /*0x2B4C*/ struct MailStruct mail[MAIL_COUNT];
- /*0x2D8C*/ u8 unk2D8C[4]; // What is this? Apparently it's supposed to be 64 bytes in size.
- /*0x2D90*/ u8 filler_2D90[0x4];
- /*0x2D94*/ union MauvilleMan mauvilleMan;
- /*0x2DD4*/ struct EasyChatPair easyChatPairs[5]; //Dewford trend [0] and some other stuff
- /*0x2DFC*/ struct ContestWinner contestWinners[8];
- /*0x2EFC*/ struct ContestWinner museumPortraits[5];
- /*0x2F9C*/ struct DayCare daycare;
- /*0x30B8*/ struct LinkBattleRecord linkBattleRecords[5];
- struct {
- /*0x3108*/ u8 unknown1[8];
- /*0x3110*/ u8 giftRibbons[11];
- /*0x311B*/ u8 unknown2[8];
- /*0x3123*/ u32 currentPokeCoupons;
- /*0x3127*/ u32 totalEarnedPokeCoupons;
- /*0x312B*/ u8 unknown3[6];
- /*0x3131*/ u8 receivedWishmakerJirachi;
- /*0x3132*/ u8 unknown4[18];
- } __attribute__((packed)) externalReservedData;
- /*0x3144*/ struct Roamer roamer;
- /*0x3160*/ struct EnigmaBerry enigmaBerry;
- /*0x3690*/ struct RamScript ramScript;
- /*0x3A7C*/ struct RecordMixingGift recordMixingGift;
- /*0x3A8C*/ u8 dexSeen3[DEX_FLAGS_NO];
-};
-
-extern struct SaveBlock1 gSaveBlock1;
-
-struct Time
-{
- /*0x00*/ s16 days;
- /*0x02*/ s8 hours;
- /*0x03*/ s8 minutes;
- /*0x04*/ s8 seconds;
-};
-
-struct Pokedex
-{
- /*0x00*/ u8 order;
- /*0x01*/ u8 unknown1;
- /*0x02*/ u8 nationalMagic; // must equal 0xDA in order to have National mode
- /*0x03*/ u8 unknown2;
- /*0x04*/ u32 unownPersonality; // set when you first see Unown
- /*0x08*/ u32 spindaPersonality; // set when you first see Spinda
- /*0x0C*/ u32 unknown3;
- /*0x10*/ u8 owned[DEX_FLAGS_NO];
- /*0x44*/ u8 seen[DEX_FLAGS_NO];
-};
-
-struct BattleTowerTrainer
-{
- /*0x00*/ u8 trainerClass;
- /*0x01*/ u8 name[8];
- /*0x09*/ u8 teamFlags;
- u8 filler0A[2];
- /*0x0C*/ u16 greeting[6];
-};
-
-struct BattleTowerRecord // record mixing
-{
- /*0x00*/ u8 battleTowerLevelType; // 0 = level 50, 1 = level 100
- /*0x01*/ u8 trainerClass;
- /*0x02*/ u16 winStreak;
- /*0x04*/ u8 name[8];
- /*0x0C*/ u8 trainerId[4];
- /*0x10*/ u16 greeting[6];
- /*0x1C*/ struct BattleTowerPokemon party[3];
- /*0xA0*/ u32 checksum;
-};
-
-struct BattleTowerEReaderTrainer
-{
- /*0x00*/ u8 unk0;
- /*0x01*/ u8 trainerClass;
- /*0x02*/ u16 winStreak;
- /*0x04*/ u8 name[8];
- /*0x0C*/ u8 trainerId[4];
- /*0x10*/ u16 greeting[6];
- /*0x1C*/ u16 farewellPlayerLost[6];
- /*0x28*/ u16 farewellPlayerWon[6];
- /*0x34*/ struct BattleTowerPokemon party[3];
- /*0xB8*/ u32 checksum;
-};
-
-struct BattleTowerData
-{
- /*0x0000, 0x00A8*/ struct BattleTowerRecord playerRecord;
- /*0x00A4, 0x014C*/ struct BattleTowerRecord records[5]; // from record mixing
- /*0x03D8, 0x0480*/ u16 firstMonSpecies; // species of the first pokemon in the player's battle tower party
- /*0x03DA, 0x0482*/ u16 defeatedBySpecies; // species of the pokemon that defated the player
- /*0x03DC, 0x0484*/ u8 defeatedByTrainerName[8];
- /*0x03E4, 0x048C*/ u8 firstMonNickname[POKEMON_NAME_LENGTH]; // nickname of the first pokemon in the player's battle tower party
- /*0x03F0, 0x0498*/ struct BattleTowerEReaderTrainer ereaderTrainer;
- /*0x04AC, 0x0554*/ u8 battleTowerLevelType:1; // 0 = level 50; 1 = level 100
- /*0x04AC, 0x0554*/ u8 unk_554:1;
- /*0x04AD, 0x0555*/ u8 battleOutcome;
- /*0x04AE, 0x0556*/ u8 var_4AE[2];
- /*0x04B0, 0x0558*/ u16 curChallengeBattleNum[2]; // 1-based index of battle in the current challenge. (challenges consist of 7 battles)
- /*0x04B4, 0x055C*/ u16 curStreakChallengesNum[2]; // 1-based index of the current challenge in the current streak.
- /*0x04B8, 0x0560*/ u16 recordWinStreaks[2];
- /*0x04BC, 0x0564*/ u8 battleTowerTrainerId; // index for gBattleTowerTrainers table
- /*0x04BD, 0x0565*/ u8 selectedPartyMons[0x3]; // indices of the 3 selected player party mons.
- /*0x04C0, 0x0568*/ u16 prizeItem;
- /*0x04C2, 0x056A*/ u8 battledTrainerIds[6];
- /*0x04C8, 0x0570*/ u16 totalBattleTowerWins;
- /*0x04CA, 0x0572*/ u16 bestBattleTowerWinStreak;
- /*0x04CC, 0x0574*/ u16 currentWinStreaks[2];
- /*0x04D0, 0x0578*/ u8 lastStreakLevelType; // 0 = level 50, 1 = level 100. level type of the last streak. Used by tv to report the level mode.
- /*0x04D1, 0x0579*/ u8 filler_4D1[0x317];
-};
-
-struct SaveBlock2 /* 0x02024EA4 */
-{
- /*0x00*/ u8 playerName[8];
- /*0x08*/ u8 playerGender; // MALE, FEMALE
- /*0x09*/ u8 specialSaveWarp;
- /*0x0A*/ u8 playerTrainerId[4];
- /*0x0E*/ u16 playTimeHours;
- /*0x10*/ u8 playTimeMinutes;
- /*0x11*/ u8 playTimeSeconds;
- /*0x12*/ u8 playTimeVBlanks;
- /*0x13*/ u8 optionsButtonMode; // OPTIONS_BUTTON_MODE_[NORMAL/LR/L_EQUALS_A]
- /*0x14*/ u16 optionsTextSpeed:3; // OPTIONS_TEXT_SPEED_[SLOW/MID/FAST]
- u16 optionsWindowFrameType:5; // Specifies one of the 20 decorative borders for text boxes
- u16 optionsSound:1; // OPTIONS_SOUND_[MONO/STEREO]
- u16 optionsBattleStyle:1; // OPTIONS_BATTLE_STYLE_[SHIFT/SET]
- u16 optionsBattleSceneOff:1; // whether battle animations are disabled
- u16 regionMapZoom:1; // whether the map is zoomed in
- /*0x18*/ struct Pokedex pokedex;
- /*0x90*/ u8 filler_90[0x8];
- /*0x98*/ struct Time localTimeOffset;
- /*0xA0*/ struct Time lastBerryTreeUpdate;
- /*0xA8*/ struct BattleTowerData battleTower;
-};
-
-struct MapPosition
-{
- s16 x;
- s16 y;
- s8 height;
-};
-
-struct UnkStruct_8054FF8
-{
- u8 a;
- u8 b;
- u8 c;
- u8 d;
- struct MapPosition sub;
- u16 field_C;
-};
-
-// wasnt defined so I had to define it
-struct HallOfFame
-{
- u8 filler[0x1F00];
-};
-
-extern struct SaveBlock2 gSaveBlock2;
-
-#define RomHeaderGameTitle ((const char *)0x080000A0)
-#define RomHeaderGameCode ((const char *)0x080000AC)
-#define RomHeaderMakerCode ((const char *)0x080000B0)
-#define RomHeaderMagic ((const u8 *) 0x080000B2)
-#define RomHeaderSoftwareVersion ((const u8 *) 0x080000BC)
-
-#define LocalTimeOffset ((struct Time *)0x02028098)
-#define LastBerryTreeUpdate ((struct Time *)0x020280A0)
-
-#endif //GUARD_GLOBAL_H
diff --git a/berry_fix/payload/include/main.h b/berry_fix/payload/include/main.h
deleted file mode 100644
index cb58d59826..0000000000
--- a/berry_fix/payload/include/main.h
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef GUARD_MAIN_H
-#define GUARD_MAIN_H
-
-#include "gba/gba.h"
-
-enum RomHeaderValidationResult
-{
- SAPPHIRE_UPDATABLE = 2,
- RUBY_UPDATABLE,
- SAPPHIRE_NONEED,
- RUBY_NONEED,
- INVALID
-};
-
-enum MainCallbackState
-{
- MAINCB_INIT = 0,
- MAINCB_CHECK_RTC,
- MAINCB_CHECK_FLASH,
- MAINCB_READ_SAVE,
- MAINCB_CHECK_TIME,
- MAINCB_FIX_DATE,
- MAINCB_NO_NEED_TO_FIX,
- MAINCB_YEAR_MAKES_NO_SENSE,
- MAINCB_FINISHED,
- MAINCB_CHECK_PACIFIDLOG_TM,
- MAINCB_FIX_PACIFIDLOG_TM,
- MAINCB_ERROR
-};
-
-extern IntrFunc gIntrTable[];
-extern u16 gHeldKeys;
-extern u16 gNewKeys;
-extern u8 gIntrVector[];
-extern u32 gUpdateSuccessful;
-extern u32 gUnknown_3001194;
-extern u32 gUnknown_30011A0[];
-extern u32 gMainCallbackState;
-extern u32 gGameVersion;
-
-extern u8 gSharedMem[0x8000];
-
-extern const IntrFunc gIntrFuncPointers[];
-
-#endif //GUARD_MAIN_H
diff --git a/berry_fix/payload/include/pokemon.h b/berry_fix/payload/include/pokemon.h
deleted file mode 100644
index d3a14ffff9..0000000000
--- a/berry_fix/payload/include/pokemon.h
+++ /dev/null
@@ -1,154 +0,0 @@
-#ifndef GUARD_POKEMON_H
-#define GUARD_POKEMON_H
-
-struct PokemonSubstruct0
-{
- u16 species;
- u16 heldItem;
- u32 experience;
- u8 ppBonuses;
- u8 friendship;
-};
-
-struct PokemonSubstruct1
-{
- u16 moves[4];
- u8 pp[4];
-};
-
-struct PokemonSubstruct2
-{
- u8 hpEV;
- u8 attackEV;
- u8 defenseEV;
- u8 speedEV;
- u8 spAttackEV;
- u8 spDefenseEV;
- u8 cool;
- u8 beauty;
- u8 cute;
- u8 smart;
- u8 tough;
- u8 sheen;
-};
-
-struct PokemonSubstruct3
-{
- /*0x00*/ u8 pokerus;
- /*0x01*/ u8 metLocation;
-
- /*0x02*/ u16 metLevel:7;
- /*0x02*/ u16 metGame:4;
- /*0x03*/ u16 pokeball:4;
- /*0x03*/ u16 otGender:1;
-
- /*0x04*/ u32 hpIV:5;
- /*0x04*/ u32 attackIV:5;
- /*0x05*/ u32 defenseIV:5;
- /*0x05*/ u32 speedIV:5;
- /*0x05*/ u32 spAttackIV:5;
- /*0x06*/ u32 spDefenseIV:5;
- /*0x07*/ u32 isEgg:1;
- /*0x07*/ u32 altAbility:1;
-
- /*0x08*/ u32 coolRibbon:3;
- /*0x08*/ u32 beautyRibbon:3;
- /*0x08*/ u32 cuteRibbon:3;
- /*0x09*/ u32 smartRibbon:3;
- /*0x09*/ u32 toughRibbon:3;
- /*0x09*/ u32 championRibbon:1;
- /*0x0A*/ u32 winningRibbon:1;
- /*0x0A*/ u32 victoryRibbon:1;
- /*0x0A*/ u32 artistRibbon:1;
- /*0x0A*/ u32 effortRibbon:1;
- /*0x0A*/ u32 giftRibbon1:1;
- /*0x0A*/ u32 giftRibbon2:1;
- /*0x0A*/ u32 giftRibbon3:1;
- /*0x0A*/ u32 giftRibbon4:1;
- /*0x0B*/ u32 giftRibbon5:1;
- /*0x0B*/ u32 giftRibbon6:1;
- /*0x0B*/ u32 giftRibbon7:1;
- /*0x0B*/ u32 fatefulEncounter:5; // unused in Ruby/Sapphire, but the high bit must be set for Mew/Deoxys to obey in FR/LG/Emerald
-};
-
-union PokemonSubstruct
-{
- struct PokemonSubstruct0 type0;
- struct PokemonSubstruct1 type1;
- struct PokemonSubstruct2 type2;
- struct PokemonSubstruct3 type3;
- u16 raw[6];
-};
-
-struct BoxPokemon
-{
- /*0x00*/ u32 personality;
- /*0x04*/ u32 otId;
- /*0x08*/ u8 nickname[POKEMON_NAME_LENGTH];
- /*0x12*/ u8 language;
- /*0x13*/ u8 isBadEgg:1;
- u8 hasSpecies:1;
- u8 isEgg:1;
- /*0x14*/ u8 otName[OT_NAME_LENGTH];
- /*0x1B*/ u8 markings;
- /*0x1C*/ u16 checksum;
- /*0x1E*/ u16 unknown;
-
- union
- {
- u32 raw[12];
- union PokemonSubstruct substructs[4];
- } secure;
-}; /*size = 0x50*/
-
-struct Pokemon
-{
- /*0x00*/ struct BoxPokemon box;
- /*0x50*/ u32 status;
- /*0x54*/ u8 level;
- /*0x55*/ u8 mail;
- /*0x56*/ u16 hp;
- /*0x58*/ u16 maxHP;
- /*0x5A*/ u16 attack;
- /*0x5C*/ u16 defense;
- /*0x5E*/ u16 speed;
- /*0x60*/ u16 spAttack;
- /*0x62*/ u16 spDefense;
-};
-
-struct BattleTowerPokemon
-{
- /*0x00*/u16 species;
- /*0x02*/u16 heldItem;
- /*0x04*/u16 moves[4];
- /*0x0C*/u8 level;
- /*0x0D*/u8 ppBonuses;
- /*0x0E*/u8 hpEV;
- /*0x0F*/u8 attackEV;
- /*0x10*/u8 defenseEV;
- /*0x11*/u8 speedEV;
- /*0x12*/u8 spAttackEV;
- /*0x13*/u8 spDefenseEV;
- /*0x14*/u32 otId;
- /*0x18*/u32 hpIV:5;
- /*0x18*/u32 attackIV:5;
- /*0x19*/u32 defenseIV:5;
- /*0x19*/u32 speedIV:5;
- /*0x1A*/u32 spAttackIV:5;
- /*0x1A*/u32 spDefenseIV:5;
- /*0x1B*/u32 gap:1;
- /*0x1B*/u32 altAbility:1;
- /*0x1C*/u32 personality;
- /*0x20*/u8 nickname[POKEMON_NAME_LENGTH + 1];
- /*0x2B*/u8 friendship;
-};
-
-struct PokemonStorage
-{
- /*0x0000*/ u8 currentBox;
- /*0x0004*/ struct BoxPokemon boxes[14][30];
- /*0x8344*/ u8 boxNames[14][9];
- /*0x83c2*/ u8 wallpaper[14];
-};
-
-#endif // GUARD_POKEMON_H
diff --git a/berry_fix/payload/include/rtc.h b/berry_fix/payload/include/rtc.h
deleted file mode 100644
index 35654d866b..0000000000
--- a/berry_fix/payload/include/rtc.h
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef GUARD_RTC_H
-#define GUARD_RTC_H
-
-#include "gba/gba.h"
-#include "siirtc.h"
-#include "global.h"
-
-extern struct Time gTimeSinceBerryUpdate;
-extern struct Time gRtcUTCTime;
-
-bool32 rtc_maincb_is_rtc_working(void);
-bool32 rtc_maincb_is_time_since_last_berry_update_positive(u8 *);
-void rtc_maincb_fix_date(void);
-
-#endif //GUARD_RTC_H
diff --git a/berry_fix/payload/include/siirtc.h b/berry_fix/payload/include/siirtc.h
deleted file mode 100644
index de4fd634df..0000000000
--- a/berry_fix/payload/include/siirtc.h
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef GUARD_RTC_H
-#define GUARD_RTC_H
-
-#include "gba/gba.h"
-
-#define SIIRTCINFO_INTFE 0x01 // frequency interrupt enable
-#define SIIRTCINFO_INTME 0x02 // per-minute interrupt enable
-#define SIIRTCINFO_INTAE 0x04 // alarm interrupt enable
-#define SIIRTCINFO_24HOUR 0x40 // 0: 12-hour mode, 1: 24-hour mode
-#define SIIRTCINFO_POWER 0x80 // power on or power failure occurred
-
-enum
-{
- MONTH_JAN = 1,
- MONTH_FEB,
- MONTH_MAR,
- MONTH_APR,
- MONTH_MAY,
- MONTH_JUN,
- MONTH_JUL,
- MONTH_AUG,
- MONTH_SEP,
- MONTH_OCT,
- MONTH_NOV,
- MONTH_DEC
-};
-
-struct SiiRtcInfo
-{
- u8 year;
- u8 month;
- u8 day;
- u8 dayOfWeek;
- u8 hour;
- u8 minute;
- u8 second;
- u8 status;
- u8 alarmHour;
- u8 alarmMinute;
-};
-
-void SiiRtcUnprotect(void);
-void SiiRtcProtect(void);
-u8 SiiRtcProbe(void);
-bool8 SiiRtcReset(void);
-bool8 SiiRtcGetStatus(struct SiiRtcInfo *rtc);
-bool8 SiiRtcSetStatus(struct SiiRtcInfo *rtc);
-bool8 SiiRtcGetDateTime(struct SiiRtcInfo *rtc);
-bool8 SiiRtcSetDateTime(struct SiiRtcInfo *rtc);
-bool8 SiiRtcGetTime(struct SiiRtcInfo *rtc);
-bool8 SiiRtcSetTime(struct SiiRtcInfo *rtc);
-bool8 SiiRtcSetAlarm(struct SiiRtcInfo *rtc);
-
-#endif // GUARD_RTC_H
diff --git a/berry_fix/payload/ld_script.sed b/berry_fix/payload/ld_script.sed
deleted file mode 100644
index b91542b6f8..0000000000
--- a/berry_fix/payload/ld_script.sed
+++ /dev/null
@@ -1,14 +0,0 @@
-// {
- r sym_ewram.ld
- d
-}
-
-// {
- r sym_bss.ld
- d
-}
-
-// {
- r sym_common.ld
- d
-}
diff --git a/berry_fix/payload/ld_script.txt b/berry_fix/payload/ld_script.txt
deleted file mode 100644
index d0a0af9edb..0000000000
--- a/berry_fix/payload/ld_script.txt
+++ /dev/null
@@ -1,107 +0,0 @@
-ENTRY(Init)
-
-SECTIONS {
- . = 0x2010000;
-
- .text :
- ALIGN(4)
- {
- asm/crt0.o(.text);
- src/main.o(.text);
- src/rtc.o(.text);
- src/flash.o(.text);
- } =0
-
- lib_text :
- ALIGN(4)
- {
- src/agb_flash.o(.text);
- src/agb_flash_1m.o(.text);
- src/agb_flash_mx.o(.text);
- asm/libagbsyscall.o(.text);
- src/siirtc.o(.text);
- *libgcc.a:_call_via_rX.o(.text);
- *libgcc.a:_modsi3.o(.text);
- *libgcc.a:_umodsi3.o(.text);
- *libgcc.a:_dvmd_tls.o(.text);
- } =0
-
- .rodata :
- ALIGN(4)
- {
- src/main.o(.rodata);
- src/rtc.o(.rodata);
- src/flash.o(.rodata);
- } =0
-
- lib_rodata :
- ALIGN(4)
- {
- src/agb_flash.o(.rodata);
- src/agb_flash_1m.o(.rodata);
- src/agb_flash_mx.o(.rodata);
- src/agb_flash_le.o(.rodata);
- src/siirtc.o(.rodata);
- }
-
- . = 0x2020000;
-
- ewram (NOLOAD) :
- ALIGN(4)
- {
-
- }
-
- . = 0x3001000;
-
- iwram (NOLOAD) :
- ALIGN(4)
- {
-
- . = 0x40;
-
- end = .;
- }
-
- . = 0x8000000;
-
- RS_Rom (NOLOAD) :
- ALIGN(4)
- {
- _start = .;
- . += 4;
- RomHeaderNintendoLogo = .;
- . += 156;
- RS_RomHeader = .;
- RomHeaderGameTitle = .;
- . += 12;
- RomHeaderGameCode = .;
- . += 4;
- RomHeaderMakerCode = .;
- . += 2;
- RomHeaderMagic = .;
- . += 1;
- RomHeaderMainUnitCode = .;
- . += 1;
- RomHeaderDeviceType = .;
- . += 1;
- RomHeaderReserved1 = .;
- . += 7;
- RomHeaderSoftwareVersion = .;
- . += 1;
- RomHeaderChecksum = .;
- . += 1;
- RomHeaderReserved2 = .;
- . += 6;
- GPIOPortData = .;
- . += 2;
- GPIOPortDirection = .;
- . += 2;
- GPIOPortReadEnable = .;
- } =0
-
- /DISCARD/ :
- {
- *(*);
- }
-}
diff --git a/berry_fix/payload/rom.sha1 b/berry_fix/payload/rom.sha1
deleted file mode 100644
index 92eee7e879..0000000000
--- a/berry_fix/payload/rom.sha1
+++ /dev/null
@@ -1 +0,0 @@
-866991e2b5a8de02d12f53abe0ee9af03a2b6e01 payload.gba
diff --git a/berry_fix/payload/src/agb_flash.c b/berry_fix/payload/src/agb_flash.c
deleted file mode 100644
index 2c2c96e6e9..0000000000
--- a/berry_fix/payload/src/agb_flash.c
+++ /dev/null
@@ -1,296 +0,0 @@
-#include "gba/gba.h"
-#include "gba/flash_internal.h"
-
-static u8 sTimerNum;
-static u16 sTimerCount;
-static vu16 *sTimerReg;
-static u16 sSavedIme;
-
-u8 gFlashTimeoutFlag;
-u8 (*PollFlashStatus)(u8 *);
-const struct FlashType *gFlash;
-u16 gFlashNumRemainingBytes;
-const u16 *gFlashMaxTime;
-
-u16 (*ProgramFlashByte)(u16, u32, u8);
-u16 (*ProgramFlashSector)(u16, void *);
-u16 (*EraseFlashChip)(void);
-u16 (*EraseFlashSector)(u16);
-u16 (*WaitForFlashWrite)(u8, u8 *, u8);
-
-void SetReadFlash1(u16 *dest);
-
-void SwitchFlashBank(u8 bankNum)
-{
- FLASH_WRITE(0x5555, 0xAA);
- FLASH_WRITE(0x2AAA, 0x55);
- FLASH_WRITE(0x5555, 0xB0);
- FLASH_WRITE(0x0000, bankNum);
-}
-
-#define DELAY() \
-do { \
- vu16 i; \
- for (i = 20000; i != 0; i--) \
- ; \
-} while (0)
-
-u16 ReadFlashId(void)
-{
- u16 flashId;
- u16 readFlash1Buffer[0x20];
- u8 (*readFlash1)(u8 *);
-
- SetReadFlash1(readFlash1Buffer);
- readFlash1 = (u8 (*)(u8 *))((s32)readFlash1Buffer + 1);
-
- // Enter ID mode.
- FLASH_WRITE(0x5555, 0xAA);
- FLASH_WRITE(0x2AAA, 0x55);
- FLASH_WRITE(0x5555, 0x90);
- DELAY();
-
- flashId = readFlash1(FLASH_BASE + 1) << 8;
- flashId |= readFlash1(FLASH_BASE);
-
- // Leave ID mode.
- FLASH_WRITE(0x5555, 0xAA);
- FLASH_WRITE(0x2AAA, 0x55);
- FLASH_WRITE(0x5555, 0xF0);
- FLASH_WRITE(0x5555, 0xF0);
- DELAY();
-
- return flashId;
-}
-
-void FlashTimerIntr(void)
-{
- if (sTimerCount != 0 && --sTimerCount == 0)
- gFlashTimeoutFlag = 1;
-}
-
-u16 SetFlashTimerIntr(u8 timerNum, void (**intrFunc)(void))
-{
- if (timerNum >= 4)
- return 1;
-
- sTimerNum = timerNum;
- sTimerReg = ®_TMCNT(sTimerNum);
- *intrFunc = FlashTimerIntr;
- return 0;
-}
-
-void StartFlashTimer(u8 phase)
-{
- const u16 *maxTime = &gFlashMaxTime[phase * 3];
- sSavedIme = REG_IME;
- REG_IME = 0;
- sTimerReg[1] = 0;
- REG_IE |= (INTR_FLAG_TIMER0 << sTimerNum);
- gFlashTimeoutFlag = 0;
- sTimerCount = *maxTime++;
- *sTimerReg++ = *maxTime++;
- *sTimerReg-- = *maxTime++;
- REG_IF = (INTR_FLAG_TIMER0 << sTimerNum);
- REG_IME = 1;
-}
-
-void StopFlashTimer(void)
-{
- REG_IME = 0;
- *sTimerReg++ = 0;
- *sTimerReg-- = 0;
- REG_IE &= ~(INTR_FLAG_TIMER0 << sTimerNum);
- REG_IME = sSavedIme;
-}
-
-u8 ReadFlash1(u8 *addr)
-{
- return *addr;
-}
-
-void SetReadFlash1(u16 *dest)
-{
- u16 *src;
- u16 i;
-
- PollFlashStatus = (u8 (*)(u8 *))((s32)dest + 1);
-
- src = (u16 *)ReadFlash1;
- src = (u16 *)((s32)src ^ 1);
-
- i = ((s32)SetReadFlash1 - (s32)ReadFlash1) >> 1;
-
- while (i != 0)
- {
- *dest++ = *src++;
- i--;
- }
-}
-
-void ReadFlash_Core(u8 *src, u8 *dest, u32 size)
-{
- while (size-- != 0)
- {
- *dest++ = *src++;
- }
-}
-
-void ReadFlash(u16 sectorNum, u32 offset, void *dest, u32 size)
-{
- u8 *src;
- u16 i;
- u16 readFlash_Core_Buffer[0x40];
- u16 *funcSrc;
- u16 *funcDest;
- void (*readFlash_Core)(u8 *, u8 *, u32);
-
- REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8;
-
- if (gFlash->romSize == FLASH_ROM_SIZE_1M)
- {
- SwitchFlashBank(sectorNum / SECTORS_PER_BANK);
- sectorNum %= SECTORS_PER_BANK;
- }
-
- funcSrc = (u16 *)ReadFlash_Core;
- funcSrc = (u16 *)((s32)funcSrc ^ 1);
- funcDest = readFlash_Core_Buffer;
-
- i = ((s32)ReadFlash - (s32)ReadFlash_Core) >> 1;
-
- while (i != 0)
- {
- *funcDest++ = *funcSrc++;
- i--;
- }
-
- readFlash_Core = (void (*)(u8 *, u8 *, u32))((s32)readFlash_Core_Buffer + 1);
-
- src = FLASH_BASE + (sectorNum << gFlash->sector.shift) + offset;
-
- readFlash_Core(src, dest, size);
-}
-
-u32 VerifyFlashSector_Core(u8 *src, u8 *tgt, u32 size)
-{
- while (size-- != 0)
- {
- if (*tgt++ != *src++)
- return (u32)(tgt - 1);
- }
-
- return 0;
-}
-
-u32 VerifyFlashSector(u16 sectorNum, u8 *src)
-{
- u16 i;
- u16 verifyFlashSector_Core_Buffer[0x80];
- u16 *funcSrc;
- u16 *funcDest;
- u8 *tgt;
- u16 size;
- u32 (*verifyFlashSector_Core)(u8 *, u8 *, u32);
-
- REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8;
-
- if (gFlash->romSize == FLASH_ROM_SIZE_1M)
- {
- SwitchFlashBank(sectorNum / SECTORS_PER_BANK);
- sectorNum %= SECTORS_PER_BANK;
- }
-
- funcSrc = (u16 *)VerifyFlashSector_Core;
- funcSrc = (u16 *)((s32)funcSrc ^ 1);
- funcDest = verifyFlashSector_Core_Buffer;
-
- i = ((s32)VerifyFlashSector - (s32)VerifyFlashSector_Core) >> 1;
-
- while (i != 0)
- {
- *funcDest++ = *funcSrc++;
- i--;
- }
-
- verifyFlashSector_Core = (u32 (*)(u8 *, u8 *, u32))((s32)verifyFlashSector_Core_Buffer + 1);
-
- tgt = FLASH_BASE + (sectorNum << gFlash->sector.shift);
- size = gFlash->sector.size;
-
- return verifyFlashSector_Core(src, tgt, size);
-}
-
-u32 VerifyFlashSectorNBytes(u16 sectorNum, u8 *src, u32 n)
-{
- u16 i;
- u16 verifyFlashSector_Core_Buffer[0x80];
- u16 *funcSrc;
- u16 *funcDest;
- u8 *tgt;
- u32 (*verifyFlashSector_Core)(u8 *, u8 *, u32);
-
- if (gFlash->romSize == FLASH_ROM_SIZE_1M)
- {
- SwitchFlashBank(sectorNum / SECTORS_PER_BANK);
- sectorNum %= SECTORS_PER_BANK;
- }
-
- REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8;
-
- funcSrc = (u16 *)VerifyFlashSector_Core;
- funcSrc = (u16 *)((s32)funcSrc ^ 1);
- funcDest = verifyFlashSector_Core_Buffer;
-
- i = ((s32)VerifyFlashSector - (s32)VerifyFlashSector_Core) >> 1;
-
- while (i != 0)
- {
- *funcDest++ = *funcSrc++;
- i--;
- }
-
- verifyFlashSector_Core = (u32 (*)(u8 *, u8 *, u32))((s32)verifyFlashSector_Core_Buffer + 1);
-
- tgt = FLASH_BASE + (sectorNum << gFlash->sector.shift);
-
- return verifyFlashSector_Core(src, tgt, n);
-}
-
-u32 ProgramFlashSectorAndVerify(u16 sectorNum, u8 *src)
-{
- u8 i;
- u32 result;
-
- for (i = 0; i < 3; i++)
- {
- result = ProgramFlashSector(sectorNum, src);
- if (result != 0)
- continue;
-
- result = VerifyFlashSector(sectorNum, src);
- if (result == 0)
- break;
- }
-
- return result;
-}
-
-u32 ProgramFlashSectorAndVerifyNBytes(u16 sectorNum, void *src, u32 n)
-{
- u8 i;
- u32 result;
-
- for (i = 0; i < 3; i++)
- {
- result = ProgramFlashSector(sectorNum, src);
- if (result != 0)
- continue;
-
- result = VerifyFlashSectorNBytes(sectorNum, src, n);
- if (result == 0)
- break;
- }
-
- return result;
-}
diff --git a/berry_fix/payload/src/agb_flash_1m.c b/berry_fix/payload/src/agb_flash_1m.c
deleted file mode 100644
index 7f8bdeb5f0..0000000000
--- a/berry_fix/payload/src/agb_flash_1m.c
+++ /dev/null
@@ -1,86 +0,0 @@
-#include "gba/gba.h"
-#include "gba/flash_internal.h"
-
-static const char AgbLibFlashVersion[] = "FLASH1M_V103";
-
-const struct FlashSetupInfo * const sSetupInfos[] =
-{
- &MX29L010,
- &LE26FV10N1TS,
- &DefaultFlash
-};
-
-u32 IdentifyFlash(void)
-{
- u16 result;
- u16 flashId;
- const struct FlashSetupInfo * const *setupInfo;
-
- REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8;
-
- flashId = ReadFlashId();
-
- setupInfo = sSetupInfos;
- result = 1;
-
- for (;;)
- {
- if ((*setupInfo)->type.ids.separate.makerId == 0)
- break;
-
- if (flashId == (*setupInfo)->type.ids.joined)
- {
- result = 0;
- break;
- }
-
- setupInfo++;
- }
-
- ProgramFlashByte = (*setupInfo)->programFlashByte;
- ProgramFlashSector = (*setupInfo)->programFlashSector;
- EraseFlashChip = (*setupInfo)->eraseFlashChip;
- EraseFlashSector = (*setupInfo)->eraseFlashSector;
- WaitForFlashWrite = (*setupInfo)->WaitForFlashWrite;
- gFlashMaxTime = (*setupInfo)->maxTime;
- gFlash = &(*setupInfo)->type;
-
- return result;
-}
-
-u16 WaitForFlashWrite_Common(u8 phase, u8 *addr, u8 lastData)
-{
- u16 result = 0;
- u8 status;
-
- StartFlashTimer(phase);
-
- while ((status = PollFlashStatus(addr)) != lastData)
- {
- if (status & 0x20)
- {
- // The write operation exceeded the flash chip's time limit.
-
- if (PollFlashStatus(addr) == lastData)
- break;
-
- FLASH_WRITE(0x5555, 0xF0);
- result = phase | 0xA000u;
- break;
- }
-
- if (gFlashTimeoutFlag)
- {
- if (PollFlashStatus(addr) == lastData)
- break;
-
- FLASH_WRITE(0x5555, 0xF0);
- result = phase | 0xC000u;
- break;
- }
- }
-
- StopFlashTimer();
-
- return result;
-}
diff --git a/berry_fix/payload/src/agb_flash_le.c b/berry_fix/payload/src/agb_flash_le.c
deleted file mode 100644
index 39d956e277..0000000000
--- a/berry_fix/payload/src/agb_flash_le.c
+++ /dev/null
@@ -1,31 +0,0 @@
-#include "gba/gba.h"
-#include "gba/flash_internal.h"
-
-const u16 leMaxTime[] =
-{
- 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK,
- 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK,
- 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK,
- 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK,
-};
-
-const struct FlashSetupInfo LE26FV10N1TS =
-{
- ProgramFlashByte_MX,
- ProgramFlashSector_MX,
- EraseFlashChip_MX,
- EraseFlashSector_MX,
- WaitForFlashWrite_Common,
- leMaxTime,
- {
- 131072, // ROM size
- {
- 4096, // sector size
- 12, // bit shift to multiply by sector size (4096 == 1 << 12)
- 32, // number of sectors
- 0 // appears to be unused
- },
- { 3, 1 }, // wait state setup data
- { { 0x62, 0x13 } } // ID
- }
-};
diff --git a/berry_fix/payload/src/agb_flash_mx.c b/berry_fix/payload/src/agb_flash_mx.c
deleted file mode 100644
index 68eb00cd8d..0000000000
--- a/berry_fix/payload/src/agb_flash_mx.c
+++ /dev/null
@@ -1,193 +0,0 @@
-#include "gba/gba.h"
-#include "gba/flash_internal.h"
-
-const u16 mxMaxTime[] =
-{
- 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK,
- 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK,
- 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK,
- 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK,
-};
-
-const struct FlashSetupInfo MX29L010 =
-{
- ProgramFlashByte_MX,
- ProgramFlashSector_MX,
- EraseFlashChip_MX,
- EraseFlashSector_MX,
- WaitForFlashWrite_Common,
- mxMaxTime,
- {
- 131072, // ROM size
- {
- 4096, // sector size
- 12, // bit shift to multiply by sector size (4096 == 1 << 12)
- 32, // number of sectors
- 0 // appears to be unused
- },
- { 3, 1 }, // wait state setup data
- { { 0xC2, 0x09 } } // ID
- }
-};
-
-const struct FlashSetupInfo DefaultFlash =
-{
- ProgramFlashByte_MX,
- ProgramFlashSector_MX,
- EraseFlashChip_MX,
- EraseFlashSector_MX,
- WaitForFlashWrite_Common,
- mxMaxTime,
- {
- 131072, // ROM size
- {
- 4096, // sector size
- 12, // bit shift to multiply by sector size (4096 == 1 << 12)
- 32, // number of sectors
- 0 // appears to be unused
- },
- { 3, 1 }, // wait state setup data
- { { 0x00, 0x00 } } // ID of 0
- }
-};
-
-u16 EraseFlashChip_MX(void)
-{
- u16 result;
- u16 readFlash1Buffer[0x20];
-
- REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0];
-
- FLASH_WRITE(0x5555, 0xAA);
- FLASH_WRITE(0x2AAA, 0x55);
- FLASH_WRITE(0x5555, 0x80);
- FLASH_WRITE(0x5555, 0xAA);
- FLASH_WRITE(0x2AAA, 0x55);
- FLASH_WRITE(0x5555, 0x10);
-
- SetReadFlash1(readFlash1Buffer);
-
- result = WaitForFlashWrite(3, FLASH_BASE, 0xFF);
-
- REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8;
-
- return result;
-}
-
-u16 EraseFlashSector_MX(u16 sectorNum)
-{
- u16 numTries;
- u16 result;
- u8 *addr;
- u16 readFlash1Buffer[0x20];
-
- if (sectorNum >= gFlash->sector.count)
- return 0x80FF;
-
- SwitchFlashBank(sectorNum / SECTORS_PER_BANK);
- sectorNum %= SECTORS_PER_BANK;
-
- numTries = 0;
-
-try_erase:
- REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0];
-
- addr = FLASH_BASE + (sectorNum << gFlash->sector.shift);
-
- FLASH_WRITE(0x5555, 0xAA);
- FLASH_WRITE(0x2AAA, 0x55);
- FLASH_WRITE(0x5555, 0x80);
- FLASH_WRITE(0x5555, 0xAA);
- FLASH_WRITE(0x2AAA, 0x55);
- *addr = 0x30;
-
- SetReadFlash1(readFlash1Buffer);
-
- result = WaitForFlashWrite(2, addr, 0xFF);
-
- if (!(result & 0xA000) || numTries > 3)
- goto done;
-
- numTries++;
-
- goto try_erase;
-
-done:
- REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8;
-
- return result;
-}
-
-u16 ProgramFlashByte_MX(u16 sectorNum, u32 offset, u8 data)
-{
- u8 *addr;
- u16 readFlash1Buffer[0x20];
-
- if (offset >= gFlash->sector.size)
- return 0x8000;
-
- SwitchFlashBank(sectorNum / SECTORS_PER_BANK);
- sectorNum %= SECTORS_PER_BANK;
-
- addr = FLASH_BASE + (sectorNum << gFlash->sector.shift) + offset;
-
- SetReadFlash1(readFlash1Buffer);
-
- REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0];
-
- FLASH_WRITE(0x5555, 0xAA);
- FLASH_WRITE(0x2AAA, 0x55);
- FLASH_WRITE(0x5555, 0xA0);
- *addr = data;
-
- return WaitForFlashWrite(1, addr, data);
-}
-
-static u16 ProgramByte(u8 *src, u8 *dest)
-{
- FLASH_WRITE(0x5555, 0xAA);
- FLASH_WRITE(0x2AAA, 0x55);
- FLASH_WRITE(0x5555, 0xA0);
- *dest = *src;
-
- return WaitForFlashWrite(1, dest, *src);
-}
-
-u16 ProgramFlashSector_MX(u16 sectorNum, void *src)
-{
- u16 result;
- u8 *dest;
- u16 readFlash1Buffer[0x20];
-
- if (sectorNum >= gFlash->sector.count)
- return 0x80FF;
-
- result = EraseFlashSector_MX(sectorNum);
-
- if (result != 0)
- return result;
-
- SwitchFlashBank(sectorNum / SECTORS_PER_BANK);
- sectorNum %= SECTORS_PER_BANK;
-
- SetReadFlash1(readFlash1Buffer);
-
- REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0];
-
- gFlashNumRemainingBytes = gFlash->sector.size;
- dest = FLASH_BASE + (sectorNum << gFlash->sector.shift);
-
- while (gFlashNumRemainingBytes > 0)
- {
- result = ProgramByte(src, dest);
-
- if (result != 0)
- break;
-
- gFlashNumRemainingBytes--;
- src++;
- dest++;
- }
-
- return result;
-}
diff --git a/berry_fix/payload/src/flash.c b/berry_fix/payload/src/flash.c
deleted file mode 100644
index 1f09d0b8f7..0000000000
--- a/berry_fix/payload/src/flash.c
+++ /dev/null
@@ -1,752 +0,0 @@
-#include "gba/gba.h"
-#include "gba/flash_internal.h"
-#include "constants/vars.h"
-#include "global.h"
-#include "main.h"
-#include "flash.h"
-#include "rtc.h"
-
-struct SaveBlockChunk
-{
- u8 * data;
- u16 size;
-};
-
-u8 WriteSaveBlockChunks(u16 a0, const struct SaveBlockChunk * a1);
-u8 WriteSingleChunk(u16 a0, const struct SaveBlockChunk * a1);
-u8 TryWriteSector(u8, u8 *);
-u8 EraseCurrentChunk(u16 a0, const struct SaveBlockChunk * a1);
-u8 TryReadAllSaveSectorsCurrentSlot(u16 a0, const struct SaveBlockChunk * a1);
-u8 ReadAllSaveSectorsCurrentSlot(u16 a0, const struct SaveBlockChunk * a1);
-u8 GetSaveValidStatus(const struct SaveBlockChunk * a1);
-u32 DoReadFlashWholeSection(u8 a0, struct SaveSector * a1);
-u16 CalculateChecksum(const void *, u16);
-
-u16 gFirstSaveSector;
-u32 gPrevSaveCounter;
-u16 gLastKnownGoodSector;
-u32 gDamagedSaveSectors;
-u32 gSaveCounter;
-struct SaveSector * gFastSaveSection;
-u16 gCurSaveChunk;
-bool32 gFlashIdentIsValid;
-
-EWRAM_DATA struct SaveBlock2 gSaveBlock2 = {};
-EWRAM_DATA struct SaveBlock1 gSaveBlock1 = {};
-EWRAM_DATA struct PokemonStorage gPokemonStorage = {};
-
-// Each 4 KiB flash sector contains 3968 bytes of actual data followed by a 128 byte footer
-#define SECTOR_DATA_SIZE 3968
-#define SECTOR_FOOTER_SIZE 128
-
-#define SAVEBLOCK_CHUNK(structure, chunkNum) \
-{ \
- (u8 *)&structure + chunkNum * SECTOR_DATA_SIZE, \
- min(sizeof(structure) - chunkNum * SECTOR_DATA_SIZE, SECTOR_DATA_SIZE) \
-} \
-
-static const struct SaveBlockChunk sSaveBlockChunks[] =
-{
- SAVEBLOCK_CHUNK(gSaveBlock2, 0),
-
- SAVEBLOCK_CHUNK(gSaveBlock1, 0),
- SAVEBLOCK_CHUNK(gSaveBlock1, 1),
- SAVEBLOCK_CHUNK(gSaveBlock1, 2),
- SAVEBLOCK_CHUNK(gSaveBlock1, 3),
-
- SAVEBLOCK_CHUNK(gPokemonStorage, 0),
- SAVEBLOCK_CHUNK(gPokemonStorage, 1),
- SAVEBLOCK_CHUNK(gPokemonStorage, 2),
- SAVEBLOCK_CHUNK(gPokemonStorage, 3),
- SAVEBLOCK_CHUNK(gPokemonStorage, 4),
- SAVEBLOCK_CHUNK(gPokemonStorage, 5),
- SAVEBLOCK_CHUNK(gPokemonStorage, 6),
- SAVEBLOCK_CHUNK(gPokemonStorage, 7),
- SAVEBLOCK_CHUNK(gPokemonStorage, 8),
-};
-
-const u16 gInfoMessagesPal[] = INCBIN_U16("graphics/msg_box.gbapal");
-const u8 gInfoMessagesTilemap[] = INCBIN_U8("graphics/msg_box.tilemap.lz");
-const u8 gInfoMessagesGfx[] = INCBIN_U8("graphics/msg_box.4bpp.lz");
-
-bool32 flash_maincb_ident_is_valid(void)
-{
- gFlashIdentIsValid = TRUE;
- if (!IdentifyFlash())
- {
- SetFlashTimerIntr(0, &((IntrFunc *)gIntrFuncPointers)[9]);
- return TRUE;
- }
- gFlashIdentIsValid = FALSE;
- return FALSE;
-}
-
-void Call_ReadFlash(u16 sectorNum, ptrdiff_t offset, void * dest, size_t size)
-{
- ReadFlash(sectorNum, offset, dest, size);
-}
-
-u8 Call_WriteSaveBlockChunks(u16 a0, const struct SaveBlockChunk * a1)
-{
- return WriteSaveBlockChunks(a0, a1);
-}
-
-u8 Call_TryReadAllSaveSectorsCurrentSlot(u16 a0, const struct SaveBlockChunk * a1)
-{
- return TryReadAllSaveSectorsCurrentSlot(a0, a1);
-}
-
-u32 * GetDamagedSaveSectorsPtr(void)
-{
- return &gDamagedSaveSectors;
-}
-
-s32 flash_write_save_block_chunks(u8 a0)
-{
- u8 i;
-
- switch (a0)
- {
- case 0:
- default:
- Call_WriteSaveBlockChunks(0xFFFF, sSaveBlockChunks);
- break;
- case 1:
- for (i = 0; i < 5; i++)
- {
- Call_WriteSaveBlockChunks(i, sSaveBlockChunks);
- }
- break;
- case 2:
- Call_WriteSaveBlockChunks(0, sSaveBlockChunks);
- break;
- }
-
- return 0;
-}
-
-u8 flash_write_save_block_chunks_check_damage(u8 a0)
-{
- flash_write_save_block_chunks(a0);
- if (*GetDamagedSaveSectorsPtr() == 0)
- return 1;
- return 0xFF;
-}
-
-u8 flash_maincb_read_save(u32 unused)
-{
- return Call_TryReadAllSaveSectorsCurrentSlot(0xFFFF, sSaveBlockChunks);
-}
-
-void msg_load_gfx(void)
-{
- REG_DISPCNT = 0;
- REG_BG0HOFS = 0;
- REG_BG0VOFS = 0;
- REG_BLDCNT = 0;
- LZ77UnCompVram(gInfoMessagesGfx, (void *)BG_VRAM);
- LZ77UnCompVram(gInfoMessagesTilemap, (void *)BG_SCREEN_ADDR(28));
- CpuCopy16(gInfoMessagesPal, (void *)BG_PLTT, 0x200);
- REG_BG0CNT = BGCNT_SCREENBASE(28) | BGCNT_TXT512x512;
- REG_DISPCNT = DISPCNT_BG0_ON;
-}
-
-void msg_display(enum MsgBoxUpdateMessage a0)
-{
- switch (a0)
- {
- case MSGBOX_WILL_NOW_UPDATE:
- REG_BG0HOFS = 0;
- REG_BG0VOFS = 0;
- break;
- case MSGBOX_HAS_BEEN_UPDATED:
- REG_BG0HOFS = 0x100;
- REG_BG0VOFS = 0;
- break;
- case MSGBOX_UNABLE_TO_UPDATE:
- REG_BG0HOFS = 0x100;
- REG_BG0VOFS = 0xB0;
- break;
- case MSGBOX_NO_NEED_TO_UPDATE:
- REG_BG0HOFS = 0;
- REG_BG0VOFS = 0xB0;
- break;
- case MSGBOX_UPDATING:
- REG_BG0HOFS = 0;
- REG_BG0VOFS = 0x160;
- break;
- }
-}
-
-void Save_EraseAllData(void)
-{
- u16 i;
- for (i = 0; i < 32; i++)
- EraseFlashSector(i);
-}
-
-void Save_ResetSaveCounters(void)
-{
- gSaveCounter = 0;
- gFirstSaveSector = 0;
- gDamagedSaveSectors = 0;
-}
-
-bool32 SetSectorDamagedStatus(u8 op, u8 sectorNum)
-{
- bool32 retVal = FALSE;
-
- switch (op)
- {
- case SECTOR_DAMAGED:
- gDamagedSaveSectors |= (1 << sectorNum);
- break;
- case SECTOR_OK:
- gDamagedSaveSectors &= ~(1 << sectorNum);
- break;
- case SECTOR_CHECK: // unused
- if (gDamagedSaveSectors & (1 << sectorNum))
- retVal = TRUE;
- break;
- }
-
- return retVal;
-}
-
-u8 WriteSaveBlockChunks(u16 chunkId, const struct SaveBlockChunk *chunks)
-{
- u32 retVal;
- u16 i;
-
- gFastSaveSection = eSaveSection;
-
- if (chunkId != 0xFFFF) // write single chunk
- {
- retVal = WriteSingleChunk(chunkId, chunks);
- }
- else // write all chunks
- {
- gLastKnownGoodSector = gFirstSaveSector;
- gPrevSaveCounter = gSaveCounter;
- gFirstSaveSector++;
- gFirstSaveSector %= NUM_SECTORS_PER_SAVE_SLOT;
- gSaveCounter++;
- retVal = SAVE_STATUS_OK;
-
- for (i = 0; i < NUM_SECTORS_PER_SAVE_SLOT; i++)
- WriteSingleChunk(i, chunks);
-
- // Check for any bad sectors
- if (gDamagedSaveSectors != 0) // skip the damaged sector.
- {
- retVal = SAVE_STATUS_ERROR;
- gFirstSaveSector = gLastKnownGoodSector;
- gSaveCounter = gPrevSaveCounter;
- }
- }
-
- return retVal;
-}
-
-u8 WriteSingleChunk(u16 chunkId, const struct SaveBlockChunk * chunks)
-{
- u16 i;
- u16 sectorNum;
- u8 *chunkData;
- u16 chunkSize;
-
- // select sector number
- sectorNum = chunkId + gFirstSaveSector;
- sectorNum %= NUM_SECTORS_PER_SAVE_SLOT;
- // select save slot
- sectorNum += NUM_SECTORS_PER_SAVE_SLOT * (gSaveCounter % 2);
-
- chunkData = chunks[chunkId].data;
- chunkSize = chunks[chunkId].size;
-
- // clear save section.
- for (i = 0; i < sizeof(struct SaveSector); i++)
- ((u8 *)gFastSaveSection)[i] = 0;
-
- gFastSaveSection->id = chunkId;
- gFastSaveSection->signature = FILE_SIGNATURE;
- gFastSaveSection->counter = gSaveCounter;
- for (i = 0; i < chunkSize; i++)
- gFastSaveSection->data[i] = chunkData[i];
- gFastSaveSection->checksum = CalculateChecksum(chunkData, chunkSize);
-
- return TryWriteSector(sectorNum, gFastSaveSection->data);
-}
-
-u8 HandleWriteSectorNBytes(u8 sectorNum, u8 *data, u16 size)
-{
- u16 i;
- struct SaveSector *section = eSaveSection;
-
- for (i = 0; i < sizeof(struct SaveSector); i++)
- ((char *)section)[i] = 0;
-
- section->signature = FILE_SIGNATURE;
- for (i = 0; i < size; i++)
- section->data[i] = data[i];
- section->id = CalculateChecksum(data, size); // though this appears to be incorrect, it might be some sector checksum instead of a whole save checksum and only appears to be relevent to HOF data, if used.
-
- return TryWriteSector(sectorNum, section->data);
-}
-
-u8 TryWriteSector(u8 sectorNum, u8 *data)
-{
- if (ProgramFlashSectorAndVerify(sectorNum, data) != 0) // is damaged?
- {
- SetSectorDamagedStatus(SECTOR_DAMAGED, sectorNum); // set damaged sector bits.
- return SAVE_STATUS_ERROR;
- }
- else
- {
- SetSectorDamagedStatus(SECTOR_OK, sectorNum); // unset damaged sector bits. it's safe now.
- return SAVE_STATUS_OK;
- }
-}
-
-u32 RestoreSaveBackupVarsAndIncrement(const struct SaveBlockChunk *chunk) // chunk is unused
-{
- gFastSaveSection = eSaveSection;
- gLastKnownGoodSector = gFirstSaveSector;
- gPrevSaveCounter = gSaveCounter;
- gFirstSaveSector++;
- gFirstSaveSector %= NUM_SECTORS_PER_SAVE_SLOT;
- gSaveCounter++;
- gCurSaveChunk = 0;
- gDamagedSaveSectors = 0;
- return 0;
-}
-
-u32 RestoreSaveBackupVars(const struct SaveBlockChunk *chunk)
-{
- gFastSaveSection = eSaveSection;
- gLastKnownGoodSector = gFirstSaveSector;
- gPrevSaveCounter = gSaveCounter;
- gCurSaveChunk = 0;
- gDamagedSaveSectors = 0;
- return 0;
-}
-
-u8 WriteSingleChunkAndIncrement(u16 a1, const struct SaveBlockChunk * chunk)
-{
- u8 retVal;
-
- if (gCurSaveChunk < a1 - 1)
- {
- retVal = SAVE_STATUS_OK;
- WriteSingleChunk(gCurSaveChunk, chunk);
- gCurSaveChunk++;
- if (gDamagedSaveSectors)
- {
- retVal = SAVE_STATUS_ERROR;
- gFirstSaveSector = gLastKnownGoodSector;
- gSaveCounter = gPrevSaveCounter;
- }
- }
- else
- {
- retVal = SAVE_STATUS_ERROR;
- }
-
- return retVal;
-}
-
-u8 ErasePreviousChunk(u16 a1, const struct SaveBlockChunk *chunk)
-{
- u8 retVal = SAVE_STATUS_OK;
-
- EraseCurrentChunk(a1 - 1, chunk);
-
- if (gDamagedSaveSectors)
- {
- retVal = SAVE_STATUS_ERROR;
- gFirstSaveSector = gLastKnownGoodSector;
- gSaveCounter = gPrevSaveCounter;
- }
- return retVal;
-}
-
-u8 EraseCurrentChunk(u16 chunkId, const struct SaveBlockChunk *chunks)
-{
- u16 i;
- u16 sector;
- u8 *data;
- u16 size;
- u8 status;
-
- // select sector number
- sector = chunkId + gFirstSaveSector;
- sector %= NUM_SECTORS_PER_SAVE_SLOT;
- // select save slot
- sector += NUM_SECTORS_PER_SAVE_SLOT * (gSaveCounter % 2);
-
- data = chunks[chunkId].data;
- size = chunks[chunkId].size;
-
- // clear temp save section.
- for (i = 0; i < sizeof(struct SaveSector); i++)
- ((char *)gFastSaveSection)[i] = 0;
-
- gFastSaveSection->id = chunkId;
- gFastSaveSection->signature = FILE_SIGNATURE;
- gFastSaveSection->counter = gSaveCounter;
-
- // set temp section's data.
- for (i = 0; i < size; i++)
- gFastSaveSection->data[i] = data[i];
-
- // calculate checksum.
- gFastSaveSection->checksum = CalculateChecksum(data, size);
-
- EraseFlashSector(sector);
-
- status = SAVE_STATUS_OK;
-
- for (i = 0; i < sizeof(struct UnkSaveSection); i++)
- {
- if (ProgramFlashByte(sector, i, gFastSaveSection->data[i]))
- {
- status = SAVE_STATUS_ERROR;
- break;
- }
- }
-
- if (status == SAVE_STATUS_ERROR)
- {
- SetSectorDamagedStatus(SECTOR_DAMAGED, sector);
- return SAVE_STATUS_ERROR;
- }
- else
- {
- status = SAVE_STATUS_OK;
-
- for (i = 0; i < 7; i++)
- {
- if (ProgramFlashByte(sector, 0xFF9 + i, ((u8 *)gFastSaveSection)[0xFF9 + i]))
- {
- status = SAVE_STATUS_ERROR;
- break;
- }
- }
-
- if (status == SAVE_STATUS_ERROR)
- {
- SetSectorDamagedStatus(SECTOR_DAMAGED, sector);
- return SAVE_STATUS_ERROR;
- }
- else
- {
- SetSectorDamagedStatus(SECTOR_OK, sector);
- return SAVE_STATUS_OK;
- }
- }
-}
-
-u8 WriteSomeFlashByteToPrevSector(u16 a1, const struct SaveBlockChunk *chunk)
-{
- u16 sector;
-
- // select sector number
- sector = a1 + gFirstSaveSector - 1;
- sector %= NUM_SECTORS_PER_SAVE_SLOT;
- // select save slot
- sector += NUM_SECTORS_PER_SAVE_SLOT * (gSaveCounter % 2);
-
- if (ProgramFlashByte(sector, sizeof(struct UnkSaveSection), ((u8 *)gFastSaveSection)[sizeof(struct UnkSaveSection)]))
- {
- // sector is damaged, so enable the bit in gDamagedSaveSectors and restore the last written sector and save counter.
- SetSectorDamagedStatus(SECTOR_DAMAGED, sector);
- gFirstSaveSector = gLastKnownGoodSector;
- gSaveCounter = gPrevSaveCounter;
- return SAVE_STATUS_ERROR;
- }
- else
- {
- SetSectorDamagedStatus(SECTOR_OK, sector);
- return SAVE_STATUS_OK;
- }
-}
-
-u8 WriteSomeFlashByte0x25ToPrevSector(u16 a1, const struct SaveBlockChunk *chunk)
-{
- u16 sector;
-
- sector = a1 + gFirstSaveSector - 1;
- sector %= NUM_SECTORS_PER_SAVE_SLOT;
- sector += NUM_SECTORS_PER_SAVE_SLOT * (gSaveCounter % 2);
-
- if (ProgramFlashByte(sector, sizeof(struct UnkSaveSection), 0x25))
- {
- // sector is damaged, so enable the bit in gDamagedSaveSectors and restore the last written sector and save counter.
- SetSectorDamagedStatus(SECTOR_DAMAGED, sector);
- gFirstSaveSector = gLastKnownGoodSector;
- gSaveCounter = gPrevSaveCounter;
- return SAVE_STATUS_ERROR;
- }
- else
- {
- SetSectorDamagedStatus(SECTOR_OK, sector);
- return SAVE_STATUS_OK;
- }
-}
-
-u8 TryReadAllSaveSectorsCurrentSlot(u16 a1, const struct SaveBlockChunk *chunk)
-{
- u8 retVal;
- gFastSaveSection = eSaveSection;
- if (a1 != 0xFFFF)
- {
- retVal = SAVE_STATUS_ERROR;
- }
- else
- {
- retVal = GetSaveValidStatus(chunk);
- ReadAllSaveSectorsCurrentSlot(0xFFFF, chunk);
- }
-
- return retVal;
-}
-
-u8 ReadAllSaveSectorsCurrentSlot(u16 a1, const struct SaveBlockChunk *chunks)
-{
- u16 i;
- u16 checksum;
- u16 sector = NUM_SECTORS_PER_SAVE_SLOT * (gSaveCounter % 2);
- u16 id;
-
- for (i = 0; i < NUM_SECTORS_PER_SAVE_SLOT; i++)
- {
- DoReadFlashWholeSection(i + sector, gFastSaveSection);
- id = gFastSaveSection->id;
- if (id == 0)
- gFirstSaveSector = i;
- checksum = CalculateChecksum(gFastSaveSection->data, chunks[id].size);
- if (gFastSaveSection->signature == FILE_SIGNATURE
- && gFastSaveSection->checksum == checksum)
- {
- u16 j;
- for (j = 0; j < chunks[id].size; j++)
- chunks[id].data[j] = gFastSaveSection->data[j];
- }
- }
-
- return 1;
-}
-
-u8 GetSaveValidStatus(const struct SaveBlockChunk *chunks)
-{
- u16 sector;
- bool8 signatureValid;
- u16 checksum;
- u32 slot1saveCounter = 0;
- u32 slot2saveCounter = 0;
- u8 slot1Status;
- u8 slot2Status;
- u32 validSectors;
- const u32 ALL_SECTORS = (1 << NUM_SECTORS_PER_SAVE_SLOT) - 1; // bitmask of all saveblock sectors
-
- // check save slot 1.
- validSectors = 0;
- signatureValid = FALSE;
- for (sector = 0; sector < NUM_SECTORS_PER_SAVE_SLOT; sector++)
- {
- DoReadFlashWholeSection(sector, gFastSaveSection);
- if (gFastSaveSection->signature == FILE_SIGNATURE)
- {
- signatureValid = TRUE;
- checksum = CalculateChecksum(gFastSaveSection->data, chunks[gFastSaveSection->id].size);
- if (gFastSaveSection->checksum == checksum)
- {
- slot1saveCounter = gFastSaveSection->counter;
- validSectors |= 1 << gFastSaveSection->id;
- }
- }
- }
-
- if (signatureValid)
- {
- if (validSectors == ALL_SECTORS)
- slot1Status = SAVE_STATUS_OK;
- else
- slot1Status = SAVE_STATUS_ERROR;
- }
- else
- {
- slot1Status = SAVE_STATUS_EMPTY;
- }
-
- // check save slot 2.
- validSectors = 0;
- signatureValid = FALSE;
- for (sector = 0; sector < NUM_SECTORS_PER_SAVE_SLOT; sector++)
- {
- DoReadFlashWholeSection(NUM_SECTORS_PER_SAVE_SLOT + sector, gFastSaveSection);
- if (gFastSaveSection->signature == FILE_SIGNATURE)
- {
- signatureValid = TRUE;
- checksum = CalculateChecksum(gFastSaveSection->data, chunks[gFastSaveSection->id].size);
- if (gFastSaveSection->checksum == checksum)
- {
- slot2saveCounter = gFastSaveSection->counter;
- validSectors |= 1 << gFastSaveSection->id;
- }
- }
- }
-
- if (signatureValid)
- {
- if (validSectors == ALL_SECTORS)
- slot2Status = SAVE_STATUS_OK;
- else
- slot2Status = SAVE_STATUS_ERROR;
- }
- else
- {
- slot2Status = SAVE_STATUS_EMPTY;
- }
-
- if (slot1Status == SAVE_STATUS_OK && slot2Status == SAVE_STATUS_OK)
- {
- // Choose counter of the most recent save file
- if ((slot1saveCounter == -1 && slot2saveCounter == 0) || (slot1saveCounter == 0 && slot2saveCounter == -1))
- {
- if ((unsigned)(slot1saveCounter + 1) < (unsigned)(slot2saveCounter + 1))
- gSaveCounter = slot2saveCounter;
- else
- gSaveCounter = slot1saveCounter;
- }
- else
- {
- if (slot1saveCounter < slot2saveCounter)
- gSaveCounter = slot2saveCounter;
- else
- gSaveCounter = slot1saveCounter;
- }
- return SAVE_STATUS_OK;
- }
-
- if (slot1Status == SAVE_STATUS_OK)
- {
- gSaveCounter = slot1saveCounter;
- if (slot2Status == SAVE_STATUS_ERROR)
- return SAVE_STATUS_ERROR;
- else
- return SAVE_STATUS_OK;
- }
-
- if (slot2Status == SAVE_STATUS_OK)
- {
- gSaveCounter = slot2saveCounter;
- if (slot1Status == SAVE_STATUS_ERROR)
- return SAVE_STATUS_ERROR;
- else
- return SAVE_STATUS_OK;
- }
-
- if (slot1Status == SAVE_STATUS_EMPTY && slot2Status == SAVE_STATUS_EMPTY)
- {
- gSaveCounter = 0;
- gFirstSaveSector = 0;
- return SAVE_STATUS_EMPTY;
- }
-
- gSaveCounter = 0;
- gFirstSaveSector = 0;
- return 2;
-}
-
-u8 ReadSomeUnknownSectorAndVerify(u8 sector, u8 *data, u16 size)
-{
- u16 i;
- struct SaveSector *section = eSaveSection;
-
- DoReadFlashWholeSection(sector, section);
- if (section->signature == FILE_SIGNATURE)
- {
- u16 checksum = CalculateChecksum(section->data, size);
- if (section->id == checksum)
- {
- for (i = 0; i < size; i++)
- data[i] = section->data[i];
- return SAVE_STATUS_OK;
- }
- else
- {
- return 2;
- }
- }
- else
- {
- return SAVE_STATUS_EMPTY;
- }
-}
-
-u32 DoReadFlashWholeSection(u8 sector, struct SaveSector *section)
-{
- ReadFlash(sector, 0, section->data, sizeof(struct SaveSector));
- return 1;
-}
-
-u16 CalculateChecksum(const void *data, u16 size)
-{
- u16 i;
- u32 checksum = 0;
-
- for (i = 0; i < (size / 4); i++)
- {
- checksum += *((u32 *)data);
- data += sizeof(u32);
- }
-
- return ((checksum >> 16) + checksum);
-}
-
-void nullsub_0201182C()
-{
-}
-
-void nullsub_02011830()
-{
-}
-
-void nullsub_02011834()
-{
-}
-
-u16 * get_var_addr(u16 a0)
-{
- if (a0 < VARS_START)
- return NULL;
- if (a0 < VAR_SPECIAL_0)
- return &gSaveBlock1.vars[a0 - VARS_START];
- return NULL;
-}
-
-bool32 flash_maincb_check_need_reset_pacifidlog_tm(void)
-{
- u8 sp0;
- u16 * data = get_var_addr(VAR_PACIFIDLOG_TM_RECEIVED_DAY);
- rtc_maincb_is_time_since_last_berry_update_positive(&sp0);
- if (*data <= gRtcUTCTime.days)
- return TRUE;
- else
- return FALSE;
-}
-
-bool32 flash_maincb_reset_pacifidlog_tm(void)
-{
- u8 sp0;
- if (flash_maincb_check_need_reset_pacifidlog_tm() == TRUE)
- return TRUE;
- rtc_maincb_is_time_since_last_berry_update_positive(&sp0);
- if (gRtcUTCTime.days < 0)
- return FALSE;
- *get_var_addr(VAR_PACIFIDLOG_TM_RECEIVED_DAY) = 1;
- if (flash_write_save_block_chunks_check_damage(0) != TRUE)
- return FALSE;
- return TRUE;
-}
diff --git a/berry_fix/payload/src/main.c b/berry_fix/payload/src/main.c
deleted file mode 100644
index 325d3830eb..0000000000
--- a/berry_fix/payload/src/main.c
+++ /dev/null
@@ -1,289 +0,0 @@
-#include "gba/gba.h"
-#include "global.h"
-#include "main.h"
-#include "rtc.h"
-#include "flash.h"
-
-static s32 gInitialWaitTimer;
-IntrFunc gIntrTable[16];
-u16 gHeldKeys;
-u16 gNewKeys;
-u8 gIntrVector[0x100];
-u32 gUpdateSuccessful;
-u32 gUnknown_3001194;
-u32 gUnknown_30011A0[0x19];
-u32 gMainCallbackState;
-u32 gGameVersion;
-
-EWRAM_DATA u8 gSharedMem[0x8000] = {};
-
-void IntrMain(void);
-void ReadKeys(void);
-void dummy_intr_0(void);
-void dummy_intr_1(void);
-void main_callback(u32 *, void *, void *);
-
-
-const char gBerryFixGameCode[] = "AGBJ";
-const IntrFunc gIntrFuncPointers[] = {
- dummy_intr_0,
- dummy_intr_1,
- dummy_intr_0,
- dummy_intr_0,
- dummy_intr_0,
- dummy_intr_0,
- dummy_intr_0,
- dummy_intr_0,
- dummy_intr_0,
- dummy_intr_0,
- NULL,
- NULL,
- NULL
-};
-const char gVersionData[][2] = {
- {'J', 1},
- {'E', 2},
- {'D', 1},
- {'F', 1},
- {'I', 1},
- {'S', 1}
-};
-const char gRubyTitleAndCode[] = "POKEMON RUBYAXV";
-const char gSapphireTitleAndCode[] = "POKEMON SAPPAXP";
-const u16 sDebugPals[20] = {
- RGB(00, 00, 00),
- RGB(31, 00, 00),
- RGB(00, 31, 00),
- RGB(00, 00, 31)
-};
-const u16 sDebugDigitsGfx[] = INCBIN_U16("graphics/debug_digits.4bpp");
-
-void AgbMain(void)
-{
- RegisterRamReset(0x1E);
- DmaCopy32(3, gIntrFuncPointers, gIntrTable, sizeof gIntrFuncPointers);
- DmaCopy32(3, IntrMain, gIntrVector, sizeof(gIntrVector));
- INTR_VECTOR = gIntrVector;
- REG_IE = INTR_FLAG_VBLANK;
- if (*RomHeaderMagic == 0x96 && *(u32 *)RomHeaderGameCode == *(u32 *)gBerryFixGameCode)
- REG_IE |= INTR_FLAG_GAMEPAK;
- REG_DISPSTAT = DISPSTAT_VBLANK_INTR;
- REG_IME = INTR_FLAG_VBLANK;
- msg_load_gfx();
- gMainCallbackState = MAINCB_INIT;
- gUnknown_3001194 = 0;
- for (;;)
- {
- VBlankIntrWait();
- ReadKeys();
- main_callback(&gMainCallbackState, gUnknown_30011A0, gSharedMem);
- }
-}
-
-void dummy_intr_1(void)
-{}
-
-void dummy_intr_0(void)
-{}
-
-void ReadKeys(void)
-{
- u16 keyInput = REG_KEYINPUT ^ KEYS_MASK;
- gNewKeys = keyInput & ~gHeldKeys;
- gHeldKeys = keyInput;
-}
-
-void fill_palette(const u8 * src, u16 * dest, u8 value)
-{
- s32 i;
- for (i = 0; src[i] != 0; i++)
- dest[i] = src[i] | value << 12;
-}
-
-bool32 berry_fix_memcmp(const char * src1, const char * src2, size_t size)
-{
- s32 i;
- for (i = 0; i < size; i++)
- {
- if (src1[i] != src2[i])
- return FALSE;
- }
- return TRUE;
-}
-
-s32 validate_rom_header_internal(void)
-{
- char languageCode = *(RomHeaderGameCode + 3);
- s32 softwareVersion = *RomHeaderSoftwareVersion;
- s32 shouldUpdate = -1;
- s32 i;
- for (i = 0; i < ARRAY_COUNT(gVersionData); i++)
- {
- if (languageCode == gVersionData[i][0])
- {
- if (softwareVersion >= gVersionData[i][1])
- {
- shouldUpdate = 0;
- }
- else
- {
- shouldUpdate = 1;
- }
- break;
- }
- }
- if (shouldUpdate != -1)
- {
- if (berry_fix_memcmp(RomHeaderGameTitle, gRubyTitleAndCode, 15) == TRUE)
- {
- if (shouldUpdate == 0)
- return RUBY_NONEED;
- else
- {
- gGameVersion = VERSION_RUBY;
- return RUBY_UPDATABLE;
- }
- }
- else if (berry_fix_memcmp(RomHeaderGameTitle, gSapphireTitleAndCode, 15) == TRUE)
- {
- if (shouldUpdate == 0)
- return SAPPHIRE_NONEED;
- else
- {
- gGameVersion = VERSION_SAPPHIRE;
- return SAPPHIRE_UPDATABLE;
- }
- }
- }
- return INVALID;
-}
-
-s32 validate_rom_header(void)
-{
- if (*RomHeaderMakerCode == '0' && *(RomHeaderMakerCode + 1) == '1' && *RomHeaderMagic == 0x96)
- return validate_rom_header_internal();
- else
- return INVALID;
-}
-
-void main_callback(u32 * state, void * unused1, void * unused2)
-{
- u8 year;
- switch (*state)
- {
- case MAINCB_INIT:
- msg_display(MSGBOX_WILL_NOW_UPDATE);
- if (++gInitialWaitTimer >= 180)
- {
- gInitialWaitTimer = 0;
- gUpdateSuccessful = 0;
- switch (validate_rom_header())
- {
- case SAPPHIRE_UPDATABLE:
- case RUBY_UPDATABLE: // Should Update Ruby
- ++(*state); // MAINCB_CHECK_RTC
- break;
- case INVALID: // Invalid header
- *state = MAINCB_ERROR;
- break;
- case SAPPHIRE_NONEED: // Should not update Sapphire
- case RUBY_NONEED: // Should not update Ruby
- *state = MAINCB_NO_NEED_TO_FIX;
- break;
- }
- }
- break;
- case MAINCB_CHECK_RTC:
- if (!rtc_maincb_is_rtc_working())
- *state = MAINCB_ERROR;
- else
- ++(*state); // MAINCB_CHECK_FLASH
- break;
- case MAINCB_CHECK_FLASH:
- if (flash_maincb_ident_is_valid() == TRUE)
- ++(*state); // MAINCB_READ_SAVE
- else
- *state = MAINCB_ERROR;
- break;
- case MAINCB_READ_SAVE:
- if (flash_maincb_read_save(0) == SAVE_STATUS_OK)
- ++(*state); // MAINCB_CHECK_TIME
- else
- *state = MAINCB_ERROR;
- break;
- case MAINCB_CHECK_TIME:
- if (rtc_maincb_is_time_since_last_berry_update_positive(&year) == TRUE)
- {
- if (year == 0)
- ++(*state); // MAINCB_FIX_DATE
- else
- *state = MAINCB_CHECK_PACIFIDLOG_TM;
- }
- else
- {
- if (year != 1)
- *state = MAINCB_YEAR_MAKES_NO_SENSE;
- else
- ++(*state); // MAINCB_FIX_DATE
- }
- break;
- case MAINCB_FIX_DATE:
- rtc_maincb_fix_date();
- gUpdateSuccessful |= 1;
- *state = MAINCB_CHECK_PACIFIDLOG_TM;
- break;
- case MAINCB_CHECK_PACIFIDLOG_TM:
- if (flash_maincb_check_need_reset_pacifidlog_tm() == TRUE)
- *state = MAINCB_FINISHED;
- else
- *state = MAINCB_FIX_PACIFIDLOG_TM;
- break;
- case MAINCB_FIX_PACIFIDLOG_TM:
- msg_display(MSGBOX_UPDATING);
- if (flash_maincb_reset_pacifidlog_tm() == TRUE)
- {
- gUpdateSuccessful |= 1;
- *state = MAINCB_FINISHED;
- }
- else
- *state = MAINCB_ERROR;
- break;
- case MAINCB_FINISHED:
- if (gUpdateSuccessful == 0)
- *state = MAINCB_NO_NEED_TO_FIX;
- else
- msg_display(MSGBOX_HAS_BEEN_UPDATED);
- break;
- case MAINCB_NO_NEED_TO_FIX:
- msg_display(MSGBOX_NO_NEED_TO_UPDATE);
- break;
- case MAINCB_YEAR_MAKES_NO_SENSE:
- msg_display(MSGBOX_UNABLE_TO_UPDATE);
- break;
- case MAINCB_ERROR:
- msg_display(MSGBOX_UNABLE_TO_UPDATE);
- break;
- }
-}
-
-void DBG_LoadDigitsPal(void)
-{
- const u16 * src;
- s32 i;
- register vu16 * dest asm("r3") = (vu16 *)BG_PLTT + 1;
- DmaFill16(3, RGB(31, 31, 31), (vu16 *)BG_PLTT, BG_PLTT_SIZE);
- src = sDebugPals;
- for (i = 0; i < 4; i++)
- {
- *dest = *src;
- dest += 16;
- src++;
- }
-}
-
-void DBG_LoadDigits(void)
-{
- DmaFill16(3, 0x1111, (void *)VRAM + 0x8420, 0x1800);
- DmaCopy32(3, sDebugDigitsGfx, (void *)VRAM + 0x8600, 0x200);
- DBG_LoadDigitsPal();
-}
diff --git a/berry_fix/payload/src/rtc.c b/berry_fix/payload/src/rtc.c
deleted file mode 100644
index e73f522aad..0000000000
--- a/berry_fix/payload/src/rtc.c
+++ /dev/null
@@ -1,346 +0,0 @@
-#include "gba/gba.h"
-#include "siirtc.h"
-#include "global.h"
-#include "main.h"
-
-struct Time gTimeSinceBerryUpdate;
-struct Time gRtcUTCTime;
-
-static u16 sRtcProbeStatus;
-static struct SiiRtcInfo sRtcInfoBuffer;
-static u8 sRtcProbeCode;
-static u16 sImeBak;
-static struct SiiRtcInfo sRtcInfoWork;
-
-const struct SiiRtcInfo sDefaultRTC = {
- .year = 0, // 2000
- .month = 1, // January
- .day = 1, // 01
- .dayOfWeek = 0,
- .hour = 0,
- .minute = 0,
- .second = 0,
- .status = 0,
- .alarmHour = 0,
- .alarmMinute = 0
-};
-const s32 sDaysPerMonth[] = {
- 31,
- 28,
- 31,
- 30,
- 31,
- 30,
- 31,
- 31,
- 30,
- 31,
- 30,
- 31
-};
-
-void rtc_get_status_and_datetime(struct SiiRtcInfo *);
-u16 rtc_validate_datetime(struct SiiRtcInfo *);
-
-
-void rtc_intr_disable(void)
-{
- sImeBak = REG_IME;
- REG_IME = 0;
-}
-
-void rtc_intr_enable(void)
-{
- REG_IME = sImeBak;
-}
-
-s32 bcd_to_hex(u8 a0)
-{
- if (a0 >= 0xa0 || (a0 & 0xF) >= 10)
- return 0xFF;
- return ((a0 >> 4) & 0xF) * 10 + (a0 & 0xF);
-}
-
-bool8 is_leap_year(u8 year)
-{
- if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
- return TRUE;
- return FALSE;
-}
-
-u16 rtc_count_days_parameterized(u8 year, u8 month, u8 day)
-{
- u16 numDays = 0;
- s32 i;
- for (i = year - 1; i > 0; i--)
- {
- numDays += 365;
- if (is_leap_year(i) == TRUE)
- numDays++;
- }
- for (i = 0; i < month - 1; i++)
- numDays += sDaysPerMonth[i];
- if (month > MONTH_FEB && is_leap_year(year) == TRUE)
- numDays++;
- numDays += day;
- return numDays;
-}
-
-u16 rtc_count_days_from_info(struct SiiRtcInfo *info)
-{
- return rtc_count_days_parameterized(bcd_to_hex(info->year), bcd_to_hex(info->month), bcd_to_hex(info->day));
-}
-
-static void rtc_probe_status(void)
-{
- sRtcProbeStatus = 0;
- rtc_intr_disable();
- SiiRtcUnprotect();
- sRtcProbeCode = SiiRtcProbe();
- rtc_intr_enable();
- if ((sRtcProbeCode & 0xF) != 1)
- sRtcProbeStatus = 1;
- else
- {
- if (sRtcProbeCode & 0xF0)
- sRtcProbeStatus = 2;
- else
- sRtcProbeStatus = 0;
- rtc_get_status_and_datetime(&sRtcInfoBuffer);
- sRtcProbeStatus = rtc_validate_datetime(&sRtcInfoBuffer);
- }
-}
-
-u16 rtc_get_probe_status(void)
-{
- return sRtcProbeStatus;
-}
-
-void sub_020106EC(struct SiiRtcInfo * info)
-{
- if (sRtcProbeStatus & 0xFF0)
- *info = sDefaultRTC;
- else
- rtc_get_status_and_datetime(info);
-}
-
-void rtc_get_datetime(struct SiiRtcInfo * info)
-{
- rtc_intr_disable();
- SiiRtcGetDateTime(info);
- rtc_intr_enable();
-}
-
-void rtc_get_status(struct SiiRtcInfo * info)
-{
- rtc_intr_disable();
- SiiRtcGetStatus(info);
- rtc_intr_enable();
-}
-
-void rtc_get_status_and_datetime(struct SiiRtcInfo * info)
-{
- rtc_get_status(info);
- rtc_get_datetime(info);
-}
-
-u16 rtc_validate_datetime(struct SiiRtcInfo * info)
-{
- s32 year, month, day;
- u16 r4 = (info->status & SIIRTCINFO_POWER) ? 0x20 : 0;
- if (!(info->status & SIIRTCINFO_24HOUR))
- r4 |= 0x10;
- year = bcd_to_hex(info->year);
- if (year == 0xFF)
- r4 |= 0x40;
- month = bcd_to_hex(info->month);
- if (month == 0xFF || month == 0 || month > 12)
- r4 |= 0x80;
- day = bcd_to_hex(info->day);
- if (day == 0xFF)
- r4 |= 0x100;
- if (month == MONTH_FEB)
- {
- if (day > is_leap_year(year) + sDaysPerMonth[1])
- r4 |= 0x100;
- }
- else
- {
- if (day > sDaysPerMonth[month - 1])
- r4 |= 0x100;
- }
- day = bcd_to_hex(info->hour);
- if (day > 24)
- r4 |= 0x200;
- day = bcd_to_hex(info->minute);
- if (day > 60)
- r4 |= 0x400;
- day = bcd_to_hex(info->second);
- if (day > 60)
- r4 |= 0x800;
- return r4;
-}
-
-void rtc_reset(void)
-{
- rtc_intr_disable();
- SiiRtcReset();
- rtc_intr_enable();
-}
-
-void rtc_sub_time_from_datetime(struct SiiRtcInfo * datetime, struct Time * dest, struct Time * timediff)
-{
- u16 r4 = rtc_count_days_from_info(datetime);
- dest->seconds = bcd_to_hex(datetime->second) - timediff->seconds;
- dest->minutes = bcd_to_hex(datetime->minute) - timediff->minutes;
- dest->hours = bcd_to_hex(datetime->hour) - timediff->hours;
- dest->days = r4 - timediff->days;
- if (dest->seconds < 0)
- {
- dest->seconds += 60;
- dest->minutes--;
- }
- if (dest->minutes < 0)
- {
- dest->minutes += 60;
- dest->hours--;
- }
- if (dest->hours < 0)
- {
- dest->hours += 24;
- dest->days--;
- }
-}
-
-void rtc_sub_time_from_time(struct Time * dest, struct Time * diff, struct Time * src)
-{
- dest->seconds = src->seconds - diff->seconds;
- dest->minutes = src->minutes - diff->minutes;
- dest->hours = src->hours - diff->hours;
- dest->days = src->days - diff->days;
- if (dest->seconds < 0)
- {
- dest->seconds += 60;
- dest->minutes--;
- }
- if (dest->minutes < 0)
- {
- dest->minutes += 60;
- dest->hours--;
- }
- if (dest->hours < 0)
- {
- dest->hours += 24;
- dest->days--;
- }
-}
-
-bool32 rtc_maincb_is_rtc_working(void)
-{
- rtc_probe_status();
- if (rtc_get_probe_status() & 0xFF0)
- return FALSE;
- return TRUE;
-}
-
-void rtc_set_datetime(struct SiiRtcInfo * info)
-{
- vu16 imeBak = REG_IME;
- REG_IME = 0;
- SiiRtcSetDateTime(info);
- REG_IME = imeBak;
-}
-
-bool32 rtc_maincb_is_time_since_last_berry_update_positive(u8 * a0)
-{
- rtc_get_status_and_datetime(&sRtcInfoWork);
- *a0 = bcd_to_hex(sRtcInfoWork.year);
- rtc_sub_time_from_datetime(&sRtcInfoWork, &gRtcUTCTime, LocalTimeOffset);
- rtc_sub_time_from_time(&gTimeSinceBerryUpdate, LastBerryTreeUpdate, &gRtcUTCTime);
- if (gTimeSinceBerryUpdate.days * 1440 + gTimeSinceBerryUpdate.hours * 60 + gTimeSinceBerryUpdate.minutes >= 0)
- return TRUE;
- return FALSE;
-}
-
-u32 hex_to_bcd(u8 a0)
-{
- u32 r4;
- if (a0 > 99)
- return 0xFF;
- r4 = Div(a0, 10) << 4;
- r4 |= Mod(a0, 10);
- return r4;
-}
-
-void sii_rtc_inc(u8 * a0)
-{
- *a0 = hex_to_bcd(bcd_to_hex(*a0) + 1);
-}
-
-void sii_rtc_inc_month(struct SiiRtcInfo * a0)
-{
- sii_rtc_inc(&a0->month);
- if (bcd_to_hex(a0->month) > 12)
- {
- sii_rtc_inc(&a0->year);
- a0->month = MONTH_JAN;
- }
-}
-
-void sii_rtc_inc_day(struct SiiRtcInfo * a0)
-{
- sii_rtc_inc(&a0->day);
- if (bcd_to_hex(a0->day) > sDaysPerMonth[bcd_to_hex(a0->month) - 1])
- {
- if (!is_leap_year(bcd_to_hex(a0->year)) || bcd_to_hex(a0->month) != MONTH_FEB || bcd_to_hex(a0->day) != 29)
- {
- a0->day = 1;
- sii_rtc_inc_month(a0);
- }
- }
-}
-
-bool32 rtc_is_past_feb_28_2000(struct SiiRtcInfo * a0)
-{
- if (bcd_to_hex(a0->year) == 0)
- {
- if (bcd_to_hex(a0->month) == MONTH_JAN)
- return FALSE;
- if (bcd_to_hex(a0->month) > MONTH_FEB)
- return TRUE;
- if (bcd_to_hex(a0->day) == 29)
- return TRUE;
- return FALSE;
- }
- if (bcd_to_hex(a0->year) == 1)
- return TRUE;
- return FALSE;
-}
-
-void rtc_maincb_fix_date(void)
-{
- rtc_get_status_and_datetime(&sRtcInfoWork);
- if (bcd_to_hex(sRtcInfoWork.year) == 0 || bcd_to_hex(sRtcInfoWork.year) == 1)
- {
- if (bcd_to_hex(sRtcInfoWork.year) == 1)
- {
- sRtcInfoWork.year = 2;
- sRtcInfoWork.month = MONTH_JAN;
- sRtcInfoWork.day = 2;
- rtc_set_datetime(&sRtcInfoWork);
- }
- else
- {
- if (rtc_is_past_feb_28_2000(&sRtcInfoWork) == TRUE)
- {
- sii_rtc_inc_day(&sRtcInfoWork);
- sii_rtc_inc(&sRtcInfoWork.year);
- }
- else
- {
- sii_rtc_inc(&sRtcInfoWork.year);
- }
- rtc_set_datetime(&sRtcInfoWork);
- }
- }
-}
diff --git a/berry_fix/payload/src/siirtc.c b/berry_fix/payload/src/siirtc.c
deleted file mode 100644
index 965a068f13..0000000000
--- a/berry_fix/payload/src/siirtc.c
+++ /dev/null
@@ -1,432 +0,0 @@
-// Ruby/Sapphire/Emerald cartridges contain a Seiko Instruments Inc. (SII)
-// S-3511A real-time clock (RTC). This library ("SIIRTC_V001") is for
-// communicating with the RTC.
-
-#include "gba/gba.h"
-#include "siirtc.h"
-
-#define STATUS_INTFE 0x02 // frequency interrupt enable
-#define STATUS_INTME 0x08 // per-minute interrupt enable
-#define STATUS_INTAE 0x20 // alarm interrupt enable
-#define STATUS_24HOUR 0x40 // 0: 12-hour mode, 1: 24-hour mode
-#define STATUS_POWER 0x80 // power on or power failure occurred
-
-#define TEST_MODE 0x80 // flag in the "second" byte
-
-#define ALARM_AM 0x00
-#define ALARM_PM 0x80
-
-#define OFFSET_YEAR offsetof(struct SiiRtcInfo, year)
-#define OFFSET_MONTH offsetof(struct SiiRtcInfo, month)
-#define OFFSET_DAY offsetof(struct SiiRtcInfo, day)
-#define OFFSET_DAY_OF_WEEK offsetof(struct SiiRtcInfo, dayOfWeek)
-#define OFFSET_HOUR offsetof(struct SiiRtcInfo, hour)
-#define OFFSET_MINUTE offsetof(struct SiiRtcInfo, minute)
-#define OFFSET_SECOND offsetof(struct SiiRtcInfo, second)
-#define OFFSET_STATUS offsetof(struct SiiRtcInfo, status)
-#define OFFSET_ALARM_HOUR offsetof(struct SiiRtcInfo, alarmHour)
-#define OFFSET_ALARM_MINUTE offsetof(struct SiiRtcInfo, alarmMinute)
-
-#define INFO_BUF(info, index) (*((u8 *)(info) + (index)))
-
-#define DATETIME_BUF(info, index) INFO_BUF(info, OFFSET_YEAR + index)
-#define DATETIME_BUF_LEN (OFFSET_SECOND - OFFSET_YEAR + 1)
-
-#define TIME_BUF(info, index) INFO_BUF(info, OFFSET_HOUR + index)
-#define TIME_BUF_LEN (OFFSET_SECOND - OFFSET_HOUR + 1)
-
-#define WR 0 // command for writing data
-#define RD 1 // command for reading data
-
-#define CMD(n) (0x60 | (n << 1))
-
-#define CMD_RESET CMD(0)
-#define CMD_STATUS CMD(1)
-#define CMD_DATETIME CMD(2)
-#define CMD_TIME CMD(3)
-#define CMD_ALARM CMD(4)
-
-#define GPIO_PORT_DATA (*(vu16 *)0x80000C4)
-#define GPIO_PORT_DIRECTION (*(vu16 *)0x80000C6)
-#define GPIO_PORT_READ_ENABLE (*(vu16 *)0x80000C8)
-
-extern vu16 GPIOPortDirection;
-
-static u16 sDummy; // unused variable
-static bool8 sLocked;
-
-static int WriteCommand(u8 value);
-static int WriteData(u8 value);
-static u8 ReadData();
-static void EnableGpioPortRead();
-static void DisableGpioPortRead();
-
-static const char AgbLibRtcVersion[] = "SIIRTC_V001";
-
-void SiiRtcUnprotect()
-{
- EnableGpioPortRead();
- sLocked = FALSE;
-}
-
-void SiiRtcProtect()
-{
- DisableGpioPortRead();
- sLocked = TRUE;
-}
-
-u8 SiiRtcProbe()
-{
- u8 errorCode;
- struct SiiRtcInfo rtc;
-
- if (!SiiRtcGetStatus(&rtc))
- return 0;
-
- errorCode = 0;
-
- if ((rtc.status & (SIIRTCINFO_POWER | SIIRTCINFO_24HOUR)) == SIIRTCINFO_POWER
- || (rtc.status & (SIIRTCINFO_POWER | SIIRTCINFO_24HOUR)) == 0)
- {
- // The RTC is in 12-hour mode. Reset it and switch to 24-hour mode.
-
- // Note that the conditions are redundant and equivalent to simply
- // "(rtc.status & SIIRTCINFO_24HOUR) == 0". It's possible that this
- // was also intended to handle resetting the clock after power failure
- // but a mistake was made.
-
- if (!SiiRtcReset())
- return 0;
-
- errorCode++;
- }
-
- SiiRtcGetTime(&rtc);
-
- if (rtc.second & TEST_MODE)
- {
- // The RTC is in test mode. Reset it to leave test mode.
-
- if (!SiiRtcReset())
- return (errorCode << 4) & 0xF0;
-
- errorCode++;
- }
-
- return (errorCode << 4) | 1;
-}
-
-bool8 SiiRtcReset()
-{
- u8 result;
- struct SiiRtcInfo rtc;
-
- if (sLocked == TRUE)
- return FALSE;
-
- sLocked = TRUE;
-
- GPIO_PORT_DATA = 1;
- GPIO_PORT_DATA = 5;
-
- GPIO_PORT_DIRECTION = 7;
-
- WriteCommand(CMD_RESET | WR);
-
- GPIO_PORT_DATA = 1;
- GPIO_PORT_DATA = 1;
-
- sLocked = FALSE;
-
- rtc.status = SIIRTCINFO_24HOUR;
-
- result = SiiRtcSetStatus(&rtc);
-
- return result;
-}
-
-bool8 SiiRtcGetStatus(struct SiiRtcInfo *rtc)
-{
- u8 statusData;
-
- if (sLocked == TRUE)
- return FALSE;
-
- sLocked = TRUE;
-
- GPIO_PORT_DATA = 1;
- GPIO_PORT_DATA = 5;
-
- GPIO_PORT_DIRECTION = 7;
-
- WriteCommand(CMD_STATUS | RD);
-
- GPIO_PORT_DIRECTION = 5;
-
- statusData = ReadData();
-
- rtc->status = (statusData & (STATUS_POWER | STATUS_24HOUR))
- | ((statusData & STATUS_INTAE) >> 3)
- | ((statusData & STATUS_INTME) >> 2)
- | ((statusData & STATUS_INTFE) >> 1);
-
- GPIO_PORT_DATA = 1;
- GPIO_PORT_DATA = 1;
-
- sLocked = FALSE;
-
- return TRUE;
-}
-
-bool8 SiiRtcSetStatus(struct SiiRtcInfo *rtc)
-{
- u8 statusData;
-
- if (sLocked == TRUE)
- return FALSE;
-
- sLocked = TRUE;
-
- GPIO_PORT_DATA = 1;
- GPIO_PORT_DATA = 5;
-
- statusData = STATUS_24HOUR
- | ((rtc->status & SIIRTCINFO_INTAE) << 3)
- | ((rtc->status & SIIRTCINFO_INTME) << 2)
- | ((rtc->status & SIIRTCINFO_INTFE) << 1);
-
- GPIO_PORT_DIRECTION = 7;
-
- WriteCommand(CMD_STATUS | WR);
-
- WriteData(statusData);
-
- GPIO_PORT_DATA = 1;
- GPIO_PORT_DATA = 1;
-
- sLocked = FALSE;
-
- return TRUE;
-}
-
-bool8 SiiRtcGetDateTime(struct SiiRtcInfo *rtc)
-{
- u8 i;
-
- if (sLocked == TRUE)
- return FALSE;
-
- sLocked = TRUE;
-
- GPIO_PORT_DATA = 1;
- GPIO_PORT_DATA = 5;
-
- GPIO_PORT_DIRECTION = 7;
-
- WriteCommand(CMD_DATETIME | RD);
-
- GPIO_PORT_DIRECTION = 5;
-
- for (i = 0; i < DATETIME_BUF_LEN; i++)
- DATETIME_BUF(rtc, i) = ReadData();
-
- INFO_BUF(rtc, OFFSET_HOUR) &= 0x7F;
-
- GPIO_PORT_DATA = 1;
- GPIO_PORT_DATA = 1;
-
- sLocked = FALSE;
-
- return TRUE;
-}
-
-bool8 SiiRtcSetDateTime(struct SiiRtcInfo *rtc)
-{
- u8 i;
-
- if (sLocked == TRUE)
- return FALSE;
-
- sLocked = TRUE;
-
- GPIO_PORT_DATA = 1;
- GPIO_PORT_DATA = 5;
-
- GPIO_PORT_DIRECTION = 7;
-
- WriteCommand(CMD_DATETIME | WR);
-
- for (i = 0; i < DATETIME_BUF_LEN; i++)
- WriteData(DATETIME_BUF(rtc, i));
-
- GPIO_PORT_DATA = 1;
- GPIO_PORT_DATA = 1;
-
- sLocked = FALSE;
-
- return TRUE;
-}
-
-bool8 SiiRtcGetTime(struct SiiRtcInfo *rtc)
-{
- u8 i;
-
- if (sLocked == TRUE)
- return FALSE;
-
- sLocked = TRUE;
-
- GPIO_PORT_DATA = 1;
- GPIO_PORT_DATA = 5;
-
- GPIO_PORT_DIRECTION = 7;
-
- WriteCommand(CMD_TIME | RD);
-
- GPIO_PORT_DIRECTION = 5;
-
- for (i = 0; i < TIME_BUF_LEN; i++)
- TIME_BUF(rtc, i) = ReadData();
-
- INFO_BUF(rtc, OFFSET_HOUR) &= 0x7F;
-
- GPIO_PORT_DATA = 1;
- GPIO_PORT_DATA = 1;
-
- sLocked = FALSE;
-
- return TRUE;
-}
-
-bool8 SiiRtcSetTime(struct SiiRtcInfo *rtc)
-{
- u8 i;
-
- if (sLocked == TRUE)
- return FALSE;
-
- sLocked = TRUE;
-
- GPIO_PORT_DATA = 1;
- GPIO_PORT_DATA = 5;
-
- GPIO_PORT_DIRECTION = 7;
-
- WriteCommand(CMD_TIME | WR);
-
- for (i = 0; i < TIME_BUF_LEN; i++)
- WriteData(TIME_BUF(rtc, i));
-
- GPIO_PORT_DATA = 1;
- GPIO_PORT_DATA = 1;
-
- sLocked = FALSE;
-
- return TRUE;
-}
-
-bool8 SiiRtcSetAlarm(struct SiiRtcInfo *rtc)
-{
- u8 i;
- u8 alarmData[2];
-
- if (sLocked == TRUE)
- return FALSE;
-
- sLocked = TRUE;
-
- // Decode BCD.
- alarmData[0] = (rtc->alarmHour & 0xF) + 10 * ((rtc->alarmHour >> 4) & 0xF);
-
- // The AM/PM flag must be set correctly even in 24-hour mode.
-
- if (alarmData[0] < 12)
- alarmData[0] = rtc->alarmHour | ALARM_AM;
- else
- alarmData[0] = rtc->alarmHour | ALARM_PM;
-
- alarmData[1] = rtc->alarmMinute;
-
- GPIO_PORT_DATA = 1;
- GPIO_PORT_DATA = 5;
-
- GPIOPortDirection = 7; // Why is this the only instance that uses a symbol?
-
- WriteCommand(CMD_ALARM | WR);
-
- for (i = 0; i < 2; i++)
- WriteData(alarmData[i]);
-
- GPIO_PORT_DATA = 1;
- GPIO_PORT_DATA = 1;
-
- sLocked = FALSE;
-
- return TRUE;
-}
-
-static int WriteCommand(u8 value)
-{
- u8 i;
- u8 temp;
-
- for (i = 0; i < 8; i++)
- {
- temp = ((value >> (7 - i)) & 1);
- GPIO_PORT_DATA = (temp << 1) | 4;
- GPIO_PORT_DATA = (temp << 1) | 4;
- GPIO_PORT_DATA = (temp << 1) | 4;
- GPIO_PORT_DATA = (temp << 1) | 5;
- }
-
- // control reaches end of non-void function
-}
-
-static int WriteData(u8 value)
-{
- u8 i;
- u8 temp;
-
- for (i = 0; i < 8; i++)
- {
- temp = ((value >> i) & 1);
- GPIO_PORT_DATA = (temp << 1) | 4;
- GPIO_PORT_DATA = (temp << 1) | 4;
- GPIO_PORT_DATA = (temp << 1) | 4;
- GPIO_PORT_DATA = (temp << 1) | 5;
- }
-
- // control reaches end of non-void function
-}
-
-static u8 ReadData()
-{
- u8 i;
- u8 temp;
- u8 value;
-
- for (i = 0; i < 8; i++)
- {
- GPIO_PORT_DATA = 4;
- GPIO_PORT_DATA = 4;
- GPIO_PORT_DATA = 4;
- GPIO_PORT_DATA = 4;
- GPIO_PORT_DATA = 4;
- GPIO_PORT_DATA = 5;
-
- temp = ((GPIO_PORT_DATA & 2) >> 1);
- value = (value >> 1) | (temp << 7); // UB: accessing uninitialized var
- }
-
- return value;
-}
-
-static void EnableGpioPortRead()
-{
- GPIO_PORT_READ_ENABLE = 1;
-}
-
-static void DisableGpioPortRead()
-{
- GPIO_PORT_READ_ENABLE = 0;
-}
diff --git a/berry_fix/payload/sym_bss.txt b/berry_fix/payload/sym_bss.txt
deleted file mode 100644
index 3b1c62ae96..0000000000
--- a/berry_fix/payload/sym_bss.txt
+++ /dev/null
@@ -1,5 +0,0 @@
- .include "src/main.o"
- .include "src/rtc.o"
- .include "src/flash.o"
- .include "src/agb_flash.o"
- .include "src/siirtc.o"
diff --git a/berry_fix/payload/sym_common.txt b/berry_fix/payload/sym_common.txt
deleted file mode 100644
index 28b47f52e3..0000000000
--- a/berry_fix/payload/sym_common.txt
+++ /dev/null
@@ -1,29 +0,0 @@
- .include "main.o"
- .include "rtc.o"
-
- .align 4
-gFirstSaveSector: @ 0x03001220
- .space 0x4
-
-gPrevSaveCounter: @ 0x03001224
- .space 0x4
-
-gLastKnownGoodSector: @ 0x03001228
- .space 0x4
-
-gDamagedSaveSectors: @ 0x0300122C
- .space 0x4
-
-gSaveCounter: @ 0x03001230
- .space 0x4
-
-gFastSaveSection: @ 0x03001234
- .space 0x4
-
-gCurSaveChunk:
- .space 0x4
-
-gFlashIdentIsValid: @ 0x0300123C
- .space 0x4
-
- .include "agb_flash.o"
diff --git a/berry_fix/payload/sym_ewram.txt b/berry_fix/payload/sym_ewram.txt
deleted file mode 100644
index 2c61f5e7e5..0000000000
--- a/berry_fix/payload/sym_ewram.txt
+++ /dev/null
@@ -1,3 +0,0 @@
- .include "src/main.o"
- .include "src/rtc.o"
- .include "src/flash.o"
diff --git a/berry_fix/rom.sha1 b/berry_fix/rom.sha1
deleted file mode 100644
index 145b083b2c..0000000000
--- a/berry_fix/rom.sha1
+++ /dev/null
@@ -1 +0,0 @@
-2eb0a94a913bebfb4cb59ceb57f3f965da55ef6d berry_fix.gba
diff --git a/charmap.txt b/charmap.txt
index b1b415ad65..980a3e5dd8 100644
--- a/charmap.txt
+++ b/charmap.txt
@@ -84,6 +84,7 @@ SUPER_RE = A0
'“' = B1
'”' = B2
'‘' = B3
+'’' = B4
'\'' = B4
'♂' = B5
'♀' = B6
diff --git a/common_syms/overworld.txt b/common_syms/overworld.txt
index e136f54449..dcada0bbef 100644
--- a/common_syms/overworld.txt
+++ b/common_syms/overworld.txt
@@ -1,6 +1,6 @@
-gBGTilemapBuffers1
-gBGTilemapBuffers2
-gBGTilemapBuffers3
+gOverworldTilemapBuffer_Bg2
+gOverworldTilemapBuffer_Bg1
+gOverworldTilemapBuffer_Bg3
gHeldKeyCodeToSend
gFieldCallback
gFieldCallback2
diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s
index 38080f4848..ef2e1d5d53 100644
--- a/data/battle_anim_scripts.s
+++ b/data/battle_anim_scripts.s
@@ -828,6 +828,7 @@ gBattleAnims_General::
.4byte General_GulpMissile @ B_ANIM_GULP_MISSILE
.4byte General_StrongWinds @ B_ANIM_STRONG_WINDS
.4byte General_PrimalReversion @ B_ANIM_PRIMAL_REVERSION
+ .4byte General_AquaRingHeal @ B_ANIM_AQUA_RING_HEAL
.align 2
gBattleAnims_Special::
@@ -1708,10 +1709,12 @@ Move_HEART_SWAP:
end
Move_AQUA_RING:
+General_AquaRingHeal:
loadspritegfx ANIM_TAG_BLUE_STAR
loadspritegfx ANIM_TAG_SMALL_BUBBLES
loadspritegfx ANIM_TAG_ICE_CRYSTALS
loadspritegfx ANIM_TAG_GUARD_RING
+ createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_GUARD_RING, 0, 14, 14, RGB_BLUE
monbg ANIM_ATK_PARTNER
setalpha 12, 8
createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 23, 1
@@ -1752,9 +1755,6 @@ Move_AQUA_RING:
waitforvisualfinish
clearmonbg ANIM_ATK_PARTNER
blendoff
- delay 1
- call HealingEffect
- waitforvisualfinish
end
Move_MAGNET_RISE:
@@ -6134,17 +6134,22 @@ Move_STRUGGLE_BUG:
loadspritegfx ANIM_TAG_IMPACT
monbg ANIM_TARGET
setalpha 12, 8
- launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x2 0x0 0x9 0x0a1f
+ createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_ATK, 2, 0, 9, 0x0a1f
waitforvisualfinish
- launchtask AnimTask_FlailMovement 0x2 0x1 0x0
- launchtemplate gMovementWavesSpriteTemplate 0x2 0x3 0x0 0x0 0x2
- launchtemplate gMovementWavesSpriteTemplate 0x2 0x3 0x0 0x1 0x2
+ createvisualtask AnimTask_FlailMovement, 2, 0
+ createsprite gMovementWavesSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 2
+ createsprite gMovementWavesSpriteTemplate, ANIM_ATTACKER, 2, 0, 1, 2
loopsewithpan SE_M_HEADBUTT, SOUND_PAN_ATTACKER, 0x8, 0x2
waitforvisualfinish
- launchtemplate gRandomPosHitSplatSpriteTemplate 0x83 0x2 0x1 0x3
- launchtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg 0x2 0x5 0x0 0x1 0x1e 0x1 0x0
+ createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 1
+ createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, FALSE, 1, 0x1e, 1, 0
+ createvisualtask AnimTask_ShakeTargetPartnerBasedOnMovePowerOrDmg, 2, FALSE, 1, 0x1e, 1, 0
playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET
- launchtask AnimTask_BlendBattleAnimPal 0xa 0x5 ANIM_PAL_ATK 0x2 0x9 0x0 0x0a1f
+ createvisualtask AnimTask_BlendBattleAnimPal, 10, ANIM_PAL_ATK, 2, 9, 0, 0x0a1f
+ delay 5
+ createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 1
+ delay 5
+ createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, ANIM_TARGET, 1
waitforvisualfinish
clearmonbg ANIM_TARGET
blendoff
@@ -14582,7 +14587,7 @@ Move_TAKE_DOWN:
setalpha 12, 8
createvisualtask AnimTask_WindUpLunge, 5, ANIM_ATTACKER, -24, 8, 23, 10, 40, 10
delay 35
- createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 1, RGB_BLACK, 10, 0, 0
+ createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 1, RGB_BLACK, 10, RGB_BLACK, 0
createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, -10, 0, ANIM_TARGET, 0
playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET
delay 1
@@ -14602,7 +14607,7 @@ Move_TAKE_DOWN:
Move_DOUBLE_EDGE:
loadspritegfx ANIM_TAG_IMPACT
playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER
- createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 2, 4, 2, RGB_WHITE, 10, 0, 0
+ createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 2, 4, 2, RGB_WHITE, 10, RGB_BLACK, 0
waitforvisualfinish
delay 10
playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER
@@ -14789,7 +14794,7 @@ Move_MEGA_PUNCH:
createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 0
createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 22, 1
createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 2, 0, 0, RGB_WHITE
- createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 1, RGB_BLACK, 8, 0, 0
+ createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 1, RGB_BLACK, 8, RGB_BLACK, 0
playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET
waitforvisualfinish
clearmonbg ANIM_TARGET
@@ -14815,7 +14820,7 @@ Move_MEGA_KICK:
createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 0
createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 22, 1
createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 2, 0, 0, RGB_WHITE
- createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 1, RGB_BLACK, 8, 0, 0
+ createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 1, RGB_BLACK, 8, RGB_BLACK, 0
waitforvisualfinish
clearmonbg ANIM_TARGET
blendoff
@@ -15067,7 +15072,7 @@ Move_REVERSAL:
loadspritegfx ANIM_TAG_HANDS_AND_FEET
loadspritegfx ANIM_TAG_IMPACT
playsewithpan SE_M_DETECT, SOUND_PAN_ATTACKER
- createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 3, RGB_WHITE, 8, 0, 0
+ createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 3, RGB_WHITE, 8, RGB_BLACK, 0
waitforvisualfinish
delay 30
createvisualtask AnimTask_BlendColorCycle, 2, 31, 3, 2, 0, 10, RGB_WHITE
@@ -15084,7 +15089,7 @@ Move_REVERSAL:
createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 6, 4
delay 8
playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET
- createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 1, RGB_WHITE, 8, 0, 0
+ createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 1, RGB_WHITE, 8, RGB_BLACK, 0
createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0, 0, 10, 1, 0
createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1
createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 5, FALSE, 1, 8, 1, 0
@@ -15266,13 +15271,13 @@ FuryCutterRight:
createsprite gCuttingSliceSpriteTemplate, ANIM_ATTACKER, 2, 40, -32, 1
goto FuryCutterContinue
FuryCutterMedium:
- createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 1, RGB(9, 8, 10), 4, 0, 0
+ createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 1, RGB(9, 8, 10), 4, RGB_BLACK, 0
goto FuryCutterContinue2
FuryCutterStrong:
- createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 3, RGB(9, 8, 10), 4, 0, 0
+ createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 3, RGB(9, 8, 10), 4, RGB_BLACK, 0
goto FuryCutterContinue2
FuryCutterStrongest:
- createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 3, RGB(9, 8, 10), 4, 0, 0
+ createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 3, RGB(9, 8, 10), 4, RGB_BLACK, 0
goto FuryCutterContinue2
Move_SELF_DESTRUCT:
@@ -15443,7 +15448,7 @@ RisingWaterHitEffect:
Move_EXPLOSION:
loadspritegfx ANIM_TAG_EXPLOSION
- createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 8, 9, RGB(26, 8, 8), 8, 0, 8
+ createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 8, 9, RGB(26, 8, 8), 8, RGB_BLACK, 8
createvisualtask AnimTask_ShakeMon2, 5, 4, 8, 0, 40, 1
createvisualtask AnimTask_ShakeMon2, 5, 5, 8, 0, 40, 1
createvisualtask AnimTask_ShakeMon2, 5, 6, 8, 0, 40, 1
@@ -15690,7 +15695,7 @@ Move_GUILLOTINE:
delay 46
createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 4, 0, 8, 1
createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 0
- createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 1, RGB_BLACK, 8, 0, 0
+ createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 1, RGB_BLACK, 8, RGB_BLACK, 0
playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET
waitforvisualfinish
clearmonbg ANIM_DEF_PARTNER
@@ -16421,9 +16426,9 @@ Move_EARTHQUAKE:
createvisualtask AnimTask_HorizontalShake, 5, MAX_BATTLERS_COUNT, 10, 50
playsewithpan SE_M_EARTHQUAKE, 0
delay 10
- createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 3, 1, RGB_BLACK, 14, 0x7FFF, 14
+ createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 3, 1, RGB_BLACK, 14, RGB_WHITE, 14
delay 16
- createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 3, 1, RGB_BLACK, 14, 0x7FFF, 14
+ createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 3, 1, RGB_BLACK, 14, RGB_WHITE, 14
end
Move_FISSURE:
@@ -16434,11 +16439,11 @@ Move_FISSURE:
delay 8
call FissureDirtPlumeFar
delay 15
- createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 3, 1, RGB_BLACK, 14, 0x7FFF, 14
+ createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 3, 1, RGB_BLACK, 14, RGB_WHITE, 14
delay 15
call FissureDirtPlumeClose
delay 15
- createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 3, 1, RGB_BLACK, 14, 0x7FFF, 14
+ createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 3, 1, RGB_BLACK, 14, RGB_WHITE, 14
delay 15
call FissureDirtPlumeFar
delay 50
@@ -16666,7 +16671,7 @@ SkullBashAttack:
playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER
waitforvisualfinish
playse SE_BANG
- createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 3, 1, RGB_BLACK, 14, 0x7FFF, 14
+ createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 3, 1, RGB_BLACK, 14, RGB_WHITE, 14
createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 2, 0, 40, 1
createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 10, 0, 40, 1
createsprite gFlashingHitSplatSpriteTemplate, ANIM_TARGET, 4, 0, 0, ANIM_TARGET, 0
@@ -16845,7 +16850,7 @@ Move_SUPER_FANG:
createsprite gSuperFangSpriteTemplate, ANIM_TARGET, 2
playsewithpan SE_M_BITE, SOUND_PAN_TARGET
delay 8
- createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 3, 1, RGB(31, 2, 2), 14, 0x7FFF, 14
+ createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 3, 1, RGB(31, 2, 2), 14, RGB_WHITE, 14
createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 7, 12, 1
waitforvisualfinish
blendoff
@@ -17160,9 +17165,9 @@ MagnitudeIntense:
createvisualtask AnimTask_HorizontalShake, 5, MAX_BATTLERS_COUNT, 0, 50
loopsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET, 8, 10
delay 10
- createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 3, 1, RGB_BLACK, 14, 0x7FFF, 14
+ createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 3, 1, RGB_BLACK, 14, RGB_WHITE, 14
delay 16
- createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 3, 1, RGB_BLACK, 14, 0x7FFF, 14
+ createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 3, 1, RGB_BLACK, 14, RGB_WHITE, 14
goto MagnitudeEnd
Move_RAPID_SPIN:
@@ -17771,7 +17776,7 @@ Move_MIST_BALL:
waitforvisualfinish
playsewithpan SE_M_SAND_ATTACK, SOUND_PAN_TARGET
createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 10, 0
- createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, 1, 1, 1, RGB(23, 16, 31), 16, 0x7FFF, 16
+ createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, 1, 1, 1, RGB(23, 16, 31), 16, RGB_WHITE, 16
delay 0
playsewithpan SE_M_HAZE, 0
createvisualtask AnimTask_LoadMistTiles, 5
@@ -18039,7 +18044,7 @@ Move_ODOR_SLEUTH:
waitforvisualfinish
clearmonbg ANIM_TARGET
delay 1
- createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 3, 1, RGB_WHITEALPHA, 16, -1, 0
+ createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 3, 1, RGB_WHITEALPHA, 16, RGB_WHITEALPHA, 0
playsewithpan SE_M_LEER, SOUND_PAN_ATTACKER
end
@@ -18167,7 +18172,7 @@ Move_AERIAL_ACE:
playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER
delay 5
createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 10, 1
- createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 1, RGB_BLACK, 10, 0, 0
+ createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 1, RGB_BLACK, 10, RGB_BLACK, 0
playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET
waitforvisualfinish
clearmonbg ANIM_TARGET
@@ -18177,7 +18182,7 @@ Move_AERIAL_ACE:
Move_IRON_DEFENSE:
loopsewithpan SE_SHINY, SOUND_PAN_ATTACKER, 28, 2
createvisualtask AnimTask_MetallicShine, 5, 0, 0, 0
- createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 8, 2, RGB_WHITEALPHA, 14, -1, 0
+ createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 8, 2, RGB_WHITEALPHA, 14, RGB_WHITEALPHA, 0
waitforvisualfinish
end
@@ -19469,7 +19474,7 @@ Move_SIGNAL_BEAM:
call SignalBeamOrbs
call SignalBeamOrbs
createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 25, 1
- createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 4, 8, 5, RGB_RED, 8, 961, 8
+ createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 4, 8, 5, RGB_RED, 8, RGB(1, 30, 0), 8
call SignalBeamOrbs
call SignalBeamOrbs
call SignalBeamOrbs
@@ -19864,7 +19869,7 @@ Move_BONE_CLUB:
delay 12
createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1
createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 5, 5, 1
- createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 7, 5, 1, RGB_BLACK, 10, 0, 0
+ createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 7, 5, 1, RGB_BLACK, 10, RGB_BLACK, 0
playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET
waitforvisualfinish
clearmonbg ANIM_DEF_PARTNER
@@ -19928,7 +19933,7 @@ MegahornContinue:
createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -16, 4, 1, 4
waitforvisualfinish
createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, -4, 1, 12, 1
- createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 7, 5, 1, RGB_WHITE, 10, 0, 0
+ createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 7, 5, 1, RGB_WHITE, 10, RGB_BLACK, 0
delay 10
createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 11
delay 3
@@ -20070,7 +20075,7 @@ Move_CRABHAMMER:
createsprite gWaterHitSplatSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, ANIM_TARGET, 0
playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET
delay 1
- createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 1, RGB(13, 21, 31), 10, 0, 0
+ createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 1, RGB(13, 21, 31), 10, RGB_BLACK, 0
createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -24, 0, 0, 4
waitforvisualfinish
delay 8
@@ -20273,7 +20278,7 @@ Move_CROSS_CHOP:
createsprite gCrossChopHandSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1
delay 40
playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET
- createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 1, RGB_WHITE, 10, 0, 10
+ createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 1, RGB_WHITE, 10, RGB_BLACK, 10
createsprite gCrossImpactSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 20
createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 7, 0, 9, 1
waitforvisualfinish
@@ -22295,7 +22300,7 @@ Move_BLAZE_KICK:
createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 0
createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 14, 1
createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 2, 0, 0, RGB_WHITE
- createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 1, RGB_BLACK, 8, 0, 0
+ createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 3, 1, RGB_BLACK, 8, RGB_BLACK, 0
call FireSpreadEffect
waitforvisualfinish
clearmonbg ANIM_TARGET
@@ -23370,7 +23375,7 @@ Move_KNOCK_OFF:
playsewithpan SE_M_VITAL_THROW, SOUND_PAN_TARGET
createsprite gKnockOffStrikeSpriteTemplate, ANIM_TARGET, 2, -16, -16
delay 8
- createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 5, 1, RGB_WHITE, 10, 0, 0
+ createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 5, 1, RGB_WHITE, 10, RGB_BLACK, 0
createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 2
playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET
createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -12, 10, 0, 3
@@ -23681,7 +23686,7 @@ Move_WEATHER_BALL:
waitforvisualfinish
delay 15
playsewithpan SE_M_DETECT, 0
- createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 5, 1, RGB_WHITE, 10, 0, 0
+ createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 5, 1, RGB_WHITE, 10, RGB_BLACK, 0
waitforvisualfinish
createvisualtask AnimTask_GetWeather, 2
delay 1
diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s
index 24a3d16eda..1196355683 100644
--- a/data/battle_scripts_1.s
+++ b/data/battle_scripts_1.s
@@ -235,7 +235,7 @@ gBattleScriptsForMoveEffects::
.4byte BattleScript_EffectDragonDance @ EFFECT_DRAGON_DANCE
.4byte BattleScript_EffectCamouflage @ EFFECT_CAMOUFLAGE
.4byte BattleScript_EffectHit @ EFFECT_PLEDGE
- .4byte BattleScript_EffectHit @ EFFECT_FLING
+ .4byte BattleScript_EffectFling @ EFFECT_FLING
.4byte BattleScript_EffectNaturalGift @ EFFECT_NATURAL_GIFT
.4byte BattleScript_EffectWakeUpSlap @ EFFECT_WAKE_UP_SLAP
.4byte BattleScript_EffectHit @ EFFECT_WRING_OUT
@@ -307,8 +307,8 @@ gBattleScriptsForMoveEffects::
.4byte BattleScript_EffectGrowth @ EFFECT_GROWTH
.4byte BattleScript_EffectCloseCombat @ EFFECT_CLOSE_COMBAT
.4byte BattleScript_EffectLastResort @ EFFECT_LAST_RESORT
- .4byte BattleScript_EffectRecoil33WithStatus @ EFFECT_RECOIL_33_STATUS
- .4byte BattleScript_EffectFlinchWithStatus @ EFFECT_FLINCH_STATUS
+ .4byte BattleScript_EffectRecoil33Status @ EFFECT_RECOIL_33_STATUS
+ .4byte BattleScript_EffectFlinchStatus @ EFFECT_FLINCH_STATUS
.4byte BattleScript_EffectRecoil50 @ EFFECT_RECOIL_50
.4byte BattleScript_EffectShellSmash @ EFFECT_SHELL_SMASH
.4byte BattleScript_EffectShiftGear @ EFFECT_SHIFT_GEAR
@@ -403,6 +403,151 @@ gBattleScriptsForMoveEffects::
.4byte BattleScript_EffectOctolock @ EFFECT_OCTOLOCK
.4byte BattleScript_EffectClangorousSoul @ EFFECT_CLANGOROUS_SOUL
.4byte BattleScript_EffectHit @ EFFECT_BOLT_BEAK
+ .4byte BattleScript_EffectSkyDrop @ EFFECT_SKY_DROP
+
+BattleScript_EffectSkyDrop:
+ jumpifstatus2 BS_ATTACKER, STATUS2_MULTIPLETURNS, BattleScript_SkyDropTurn2
+ attackcanceler
+ ppreduce
+ accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE
+ attackstring
+ jumpifsubstituteblocks BattleScript_ButItFailed
+ jumpiftargetally BattleScript_ButItFailed
+ jumpifunder200 BS_TARGET, BattleScript_SkyDropWork
+ pause B_WAIT_TIME_SHORT
+ printstring STRINGID_TARGETTOOHEAVY
+ waitmessage B_WAIT_TIME_LONG
+ goto BattleScript_MoveEnd
+
+BattleScript_SkyDropWork:
+ setskydrop
+ setbyte sTWOTURN_STRINGID, B_MSG_TURN1_SKY_DROP
+ setsemiinvulnerablebit
+ call BattleScriptFirstChargingTurnAfterAttackString
+ goto BattleScript_MoveEnd
+BattleScript_SkyDropTurn2:
+ attackcanceler
+ setmoveeffect MOVE_EFFECT_CHARGING
+ setbyte sB_ANIM_TURN, 0x1
+ clearstatusfromeffect BS_ATTACKER
+ orword gHitMarker, HITMARKER_NO_PPDEDUCT
+ argumenttomoveeffect
+ clearsemiinvulnerablebit
+ attackstring
+ clearskydrop BattleScript_SkyDropChangedTarget
+ jumpiftype BS_TARGET, TYPE_FLYING, BattleScript_SkyDropFlyingType
+ goto BattleScript_HitFromCritCalc
+BattleScript_SkyDropFlyingType:
+ makevisible BS_TARGET
+ printstring STRINGID_ITDOESNTAFFECT
+ waitmessage B_WAIT_TIME_LONG
+ makevisible BS_ATTACKER
+ jumpifstatus2 BS_TARGET, STATUS2_CONFUSION, BattleScript_SkyDropFlyingAlreadyConfused
+ jumpifstatus2 BS_TARGET, STATUS2_LOCK_CONFUSE, BattleScript_SkyDropFlyingConfuseLock
+ goto BattleScript_MoveEnd
+BattleScript_SkyDropChangedTarget:
+ pause B_WAIT_TIME_SHORT
+ orhalfword gMoveResultFlags, MOVE_RESULT_FAILED
+ resultmessage
+ waitmessage B_WAIT_TIME_LONG
+ makevisible BS_ATTACKER
+ goto BattleScript_MoveEnd
+
+BattleScript_SkyDropFlyingConfuseLock:
+ setmoveeffect MOVE_EFFECT_CONFUSION
+ seteffectprimary
+BattleScript_SkyDropFlyingAlreadyConfused:
+ setmoveeffect MOVE_EFFECT_THRASH
+ clearstatusfromeffect BS_TARGET
+ jumpifstatus2 BS_TARGET, STATUS2_CONFUSION, BattleScript_MoveEnd
+ setbyte BS_ATTACKER, BS_TARGET
+ goto BattleScript_ThrashConfuses
+
+BattleScript_EffectFling:
+ jumpifcantfling BS_ATTACKER, BattleScript_ButItFailedAtkStringPpReduce
+ jumpifstatus3 BS_ATTACKER, STATUS3_EMBARGO, BattleScript_ButItFailedAtkStringPpReduce
+ jumpifword CMP_COMMON_BITS, gFieldStatuses, STATUS_FIELD_MAGIC_ROOM, BattleScript_ButItFailedAtkStringPpReduce
+ setlastuseditem BS_ATTACKER
+ removeitem BS_ATTACKER
+ attackcanceler
+ accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE
+ attackstring
+ pause B_WAIT_TIME_SHORT
+ printstring STRINGID_PKMNFLUNG
+ waitmessage B_WAIT_TIME_SHORT
+ ppreduce
+ critcalc
+ damagecalc
+ adjustdamage
+ attackanimation
+ waitanimation
+ effectivenesssound
+ hitanimation BS_TARGET
+ waitstate
+ healthbarupdate BS_TARGET
+ datahpupdate BS_TARGET
+ critmessage
+ waitmessage B_WAIT_TIME_MED
+ resultmessage
+ waitmessage B_WAIT_TIME_MED
+ jumpiflastuseditemberry BattleScript_EffectFlingConsumeBerry
+ jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_FLAME_ORB, BattleScript_FlingFlameOrb
+ jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_FLINCH, BattleScript_FlingFlinch
+ jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_LIGHT_BALL, BattleScript_FlingLightBall
+ jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_MENTAL_HERB, BattleScript_FlingMentalHerb
+ jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_POISON_POWER, BattleScript_FlingPoisonBarb
+ jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_TOXIC_ORB, BattleScript_FlingToxicOrb
+ jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_RESTORE_STATS, BattleScript_FlingWhiteHerb
+BattleScript_EffectFlingConsumeBerry:
+ savebattleritem BS_TARGET
+ battleritemtolastuseditem BS_TARGET
+ setbyte sBERRY_OVERRIDE, TRUE @ override the requirements for eating berries
+ orword gHitMarker, HITMARKER_NO_ANIMATIONS
+ consumeberry BS_TARGET
+ bicword gHitMarker, HITMARKER_NO_ANIMATIONS
+ setbyte sBERRY_OVERRIDE, FALSE
+ restorebattleritem BS_TARGET
+BattleScript_FlingEnd:
+ tryfaintmon BS_TARGET
+ goto BattleScript_MoveEnd
+
+BattleScript_FlingFlameOrb:
+ setmoveeffect MOVE_EFFECT_BURN
+ seteffectprimary
+ goto BattleScript_FlingEnd
+BattleScript_FlingFlinch:
+ setmoveeffect MOVE_EFFECT_FLINCH
+ seteffectprimary
+ goto BattleScript_FlingEnd
+BattleScript_FlingLightBall:
+ setmoveeffect MOVE_EFFECT_PARALYSIS
+ seteffectprimary
+ goto BattleScript_FlingEnd
+BattleScript_FlingMentalHerb:
+ curecertainstatuses BS_TARGET
+ savetarget
+ copybyte gBattlerAttacker, gBattlerTarget
+ playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT, NULL
+ printfromtable gMentalHerbCureStringIds
+ waitmessage B_WAIT_TIME_LONG
+ updatestatusicon BS_ATTACKER
+ restoretarget
+ goto BattleScript_FlingEnd
+BattleScript_FlingPoisonBarb:
+ setmoveeffect MOVE_EFFECT_POISON
+ seteffectprimary
+ goto BattleScript_FlingEnd
+BattleScript_FlingToxicOrb:
+ setmoveeffect MOVE_EFFECT_TOXIC
+ seteffectprimary
+ goto BattleScript_FlingEnd
+BattleScript_FlingWhiteHerb:
+ tryresetnegativestatstages BS_TARGET
+ swapattackerwithtarget
+ printstring STRINGID_PKMNSTATUSNORMAL
+ waitmessage B_WAIT_TIME_MED
+ swapattackerwithtarget
+ goto BattleScript_FlingEnd
BattleScript_EffectShellSideArm:
shellsidearmcheck
@@ -1089,20 +1234,20 @@ BattleScript_VCreateStatAnim:
playstatchangeanimation BS_ATTACKER, BIT_DEF | BIT_SPDEF | BIT_SPEED, STAT_CHANGE_NEGATIVE | STAT_CHANGE_CANT_PREVENT
setstatchanger STAT_DEF, 1, TRUE
statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, BattleScript_VCreateTrySpDef
- jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_VCreateTrySpDef
- printfromtable gStatUpStringIds
+ jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VCreateTrySpDef
+ printfromtable gStatDownStringIds
waitmessage B_WAIT_TIME_LONG
BattleScript_VCreateTrySpDef:
setstatchanger STAT_SPDEF, 1, TRUE
statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, BattleScript_VCreateTrySpeed
- jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_VCreateTrySpeed
- printfromtable gStatUpStringIds
+ jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VCreateTrySpeed
+ printfromtable gStatDownStringIds
waitmessage B_WAIT_TIME_LONG
BattleScript_VCreateTrySpeed:
setstatchanger STAT_SPEED, 1, TRUE
statbuffchange MOVE_EFFECT_AFFECTS_USER | STAT_BUFF_NOT_PROTECT_AFFECTED | MOVE_EFFECT_CERTAIN, BattleScript_VCreateStatLossRet
- jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_VCreateStatLossRet
- printfromtable gStatUpStringIds
+ jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_VCreateStatLossRet
+ printfromtable gStatDownStringIds
waitmessage B_WAIT_TIME_LONG
BattleScript_VCreateStatLossRet:
return
@@ -1192,7 +1337,7 @@ BattleScript_EffectAromaticMistWorks:
setstatchanger STAT_SPDEF, 1, FALSE
statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_EffectAromaticMistEnd
jumpifbyte CMP_NOT_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_AromaticMistAnim
- pause 16
+ pause B_WAIT_TIME_SHORTEST
printstring STRINGID_TARGETSTATWONTGOHIGHER
waitmessage B_WAIT_TIME_LONG
goto BattleScript_EffectAromaticMistEnd
@@ -1473,7 +1618,7 @@ BattleScript_EffectPsychoShift:
BattleScript_EffectPsychoShiftCanWork:
jumpifstatus BS_TARGET, STATUS1_ANY, BattleScript_ButItFailed
jumpifsafeguard BattleScript_SafeguardProtected
- trypsychoshift BattleScript_MoveEnd
+ trypsychoshift BattleScript_ButItFailed
attackanimation
waitanimation
copybyte gEffectBattler, gBattlerTarget
@@ -1674,6 +1819,7 @@ BattleScript_EffectHitSwitchTarget:
resultmessage
waitmessage B_WAIT_TIME_LONG
tryfaintmon BS_TARGET
+ moveendcase MOVEEND_MAGICIAN @ possibly others?
jumpifability BS_TARGET, ABILITY_SUCTION_CUPS, BattleScript_AbilityPreventsPhasingOut
jumpifstatus3 BS_TARGET, STATUS3_ROOTED, BattleScript_PrintMonIsRooted
tryhitswitchtarget BattleScript_EffectHitSwitchTargetMoveEnd
@@ -3241,7 +3387,7 @@ BattleScript_EffectFlinchHit::
setmoveeffect MOVE_EFFECT_FLINCH
goto BattleScript_EffectHit
-BattleScript_EffectFlinchWithStatus:
+BattleScript_EffectFlinchStatus:
setmoveeffect MOVE_EFFECT_FLINCH
attackcanceler
accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE
@@ -3400,6 +3546,7 @@ BattleScriptFirstChargingTurn::
printstring STRINGID_EMPTYSTRING3
ppreduce
attackstring
+BattleScriptFirstChargingTurnAfterAttackString:
pause B_WAIT_TIME_LONG
copybyte cMULTISTRING_CHOOSER, sTWOTURN_STRINGID
printfromtable gFirstTurnOfTwoStringIds
@@ -3674,9 +3821,6 @@ BattleScript_EffectParalyze:
jumpifleafguardprotected BS_TARGET, BattleScript_LeafGuardProtects
jumpifshieldsdown BS_TARGET, BattleScript_LeafGuardProtects
jumpifsubstituteblocks BattleScript_ButItFailed
-.if B_GLARE_GHOST >= GEN_4
- jumpifmove MOVE_GLARE, BattleScript_BattleScript_EffectParalyzeNoTypeCalc
-.endif
typecalc
BattleScript_BattleScript_EffectParalyzeNoTypeCalc:
jumpifmovehadnoeffect BattleScript_ButItFailed
@@ -5285,8 +5429,19 @@ BattleScript_EffectRolePlay::
trycopyability BattleScript_ButItFailed
attackanimation
waitanimation
+.if B_ABILITY_POP_UP == TRUE
+ setbyte sFIXED_ABILITY_POPUP, TRUE
+ showabilitypopup BS_ATTACKER
+ pause 60
+ sethword sABILITY_OVERWRITE, 0
+ updateabilitypopup BS_ATTACKER
+ pause 20
+ destroyabilitypopup
+ pause 40
+.endif
printstring STRINGID_PKMNCOPIEDFOE
waitmessage B_WAIT_TIME_LONG
+ switchinabilities BS_ATTACKER
goto BattleScript_MoveEnd
BattleScript_EffectWish::
@@ -5510,7 +5665,7 @@ BattleScript_EffectRecoil33::
setmoveeffect MOVE_EFFECT_RECOIL_33 | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN
goto BattleScript_EffectHit
-BattleScript_EffectRecoil33WithStatus:
+BattleScript_EffectRecoil33Status:
setmoveeffect MOVE_EFFECT_RECOIL_33_STATUS | MOVE_EFFECT_AFFECTS_USER | MOVE_EFFECT_CERTAIN
goto BattleScript_EffectHit
@@ -5930,6 +6085,7 @@ BattleScript_PayDayMoneyAndPickUpItems::
end2
BattleScript_LocalBattleLost::
+ jumpifbattletype BATTLE_TYPE_INGAME_PARTNER, BattleScript_LocalBattleLostPrintWhiteOut
jumpifbattletype BATTLE_TYPE_DOME, BattleScript_CheckDomeDrew
jumpifbattletype BATTLE_TYPE_FRONTIER, BattleScript_LocalBattleLostPrintTrainersWinText
jumpifbattletype BATTLE_TYPE_TRAINER_HILL, BattleScript_LocalBattleLostPrintTrainersWinText
@@ -6964,7 +7120,7 @@ BattleScript_TurnHeal:
end2
BattleScript_AquaRingHeal::
- playanimation BS_ATTACKER, B_ANIM_INGRAIN_HEAL
+ playanimation BS_ATTACKER, B_ANIM_AQUA_RING_HEAL
printstring STRINGID_AQUARINGHEAL
goto BattleScript_TurnHeal
@@ -7075,7 +7231,7 @@ BattleScript_EnduredMsg::
BattleScript_SturdiedMsg::
copybyte gBattlerAbility, gBattlerTarget
- pause 16
+ pause B_WAIT_TIME_SHORTEST
call BattleScript_AbilityPopUp
printstring STRINGID_ENDUREDSTURDY
waitmessage B_WAIT_TIME_LONG
@@ -7516,7 +7672,10 @@ BattleScript_YawnMakesAsleep::
waitmessage B_WAIT_TIME_LONG
updatestatusicon BS_EFFECT_BATTLER
waitstate
+ jumpifstatus3 BS_EFFECT_BATTLER, STATUS3_SKY_DROPPED, BattleScript_YawnEnd
makevisible BS_EFFECT_BATTLER
+ skydropyawn
+BattleScript_YawnEnd:
end2
BattleScript_EmbargoEndTurn::
@@ -8224,6 +8383,7 @@ BattleScript_MimicryActivatesEnd3::
end3
BattleScript_ProteanActivates::
+ pause B_WAIT_TIME_SHORTEST
call BattleScript_AbilityPopUp
printstring STRINGID_PKMNCHANGEDTYPE
waitmessage B_WAIT_TIME_LONG
@@ -8319,7 +8479,7 @@ BattleScript_WeakArmorActivates::
statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_WeakArmorActivatesSpeed
jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_DECREASE, BattleScript_WeakArmorDefAnim
jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_WeakArmorActivatesSpeed
- pause 16
+ pause B_WAIT_TIME_SHORTEST
printfromtable gStatDownStringIds
waitmessage B_WAIT_TIME_LONG
goto BattleScript_WeakArmorActivatesSpeed
@@ -8333,7 +8493,7 @@ BattleScript_WeakArmorActivatesSpeed:
statbuffchange STAT_BUFF_ALLOW_PTR, BattleScript_WeakArmorActivatesEnd
jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_WeakArmorSpeedAnim
jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_ROSE_EMPTY, BattleScript_WeakArmorActivatesEnd
- pause 16
+ pause B_WAIT_TIME_SHORTEST
printstring STRINGID_TARGETSTATWONTGOHIGHER
waitmessage B_WAIT_TIME_LONG
goto BattleScript_WeakArmorActivatesEnd
@@ -9261,3 +9421,8 @@ BattleScript_NeutralizingGasExitsLoop:
jumpifbytenotequal gBattlerTarget, sByteFour, BattleScript_NeutralizingGasExitsLoop @ SOMEHOW, comparing to gBattlersCount is problematic.
restoretarget
return
+
+BattleScript_MagicianActivates::
+ call BattleScript_AbilityPopUp
+ call BattleScript_ItemSteal
+ return
diff --git a/data/ereader_link_data.s b/data/ereader_link_data.s
deleted file mode 100644
index d3269ebfe0..0000000000
--- a/data/ereader_link_data.s
+++ /dev/null
@@ -1,6 +0,0 @@
- .section .rodata
-
- .align 2
-gEReaderLinkData_Start::
- .incbin "data/ereader_link_data.bin"
-gEReaderLinkData_End::
diff --git a/data/event_scripts.s b/data/event_scripts.s
index 0a29496236..7c3a2b23f9 100644
--- a/data/event_scripts.s
+++ b/data/event_scripts.s
@@ -60,7 +60,6 @@
.section script_data, "aw", %progbits
-@ 81DB67C
.include "data/script_cmd_table.inc"
gSpecialVars::
diff --git a/data/map_events.s b/data/map_events.s
index dcbb9cfb17..cfa5799d37 100644
--- a/data/map_events.s
+++ b/data/map_events.s
@@ -1,3 +1,4 @@
+#include "constants/global.h"
#include "constants/event_bg.h"
#include "constants/event_object_movement.h"
#include "constants/event_objects.h"
diff --git a/data/maps.s b/data/maps.s
index beb28ddec8..9d9ac2101c 100644
--- a/data/maps.s
+++ b/data/maps.s
@@ -1,3 +1,4 @@
+#include "constants/global.h"
#include "constants/layouts.h"
#include "constants/map_types.h"
#include "constants/maps.h"
diff --git a/data/maps/AncientTomb/scripts.inc b/data/maps/AncientTomb/scripts.inc
index d28ac7bc35..dd22359558 100644
--- a/data/maps/AncientTomb/scripts.inc
+++ b/data/maps/AncientTomb/scripts.inc
@@ -61,7 +61,7 @@ AncientTomb_EventScript_Registeel::
playmoncry SPECIES_REGISTEEL, CRY_MODE_ENCOUNTER
delay 40
waitmoncry
- setwildbattle SPECIES_REGISTEEL, 40, ITEM_NONE
+ setwildbattle SPECIES_REGISTEEL, 40
setflag FLAG_SYS_CTRL_OBJ_DELETE
special StartRegiBattle
waitstate
diff --git a/data/maps/AquaHideout_B1F/scripts.inc b/data/maps/AquaHideout_B1F/scripts.inc
index 4f2eb836f5..f644f6ae56 100644
--- a/data/maps/AquaHideout_B1F/scripts.inc
+++ b/data/maps/AquaHideout_B1F/scripts.inc
@@ -29,7 +29,7 @@ AquaHideout_B1F_EventScript_ShowElectrode2::
AquaHideout_B1F_EventScript_Electrode1::
lock
faceplayer
- setwildbattle SPECIES_ELECTRODE, 30, ITEM_NONE
+ setwildbattle SPECIES_ELECTRODE, 30
waitse
playmoncry SPECIES_ELECTRODE, CRY_MODE_ENCOUNTER
delay 40
@@ -53,7 +53,7 @@ AquaHideout_B1F_EventScript_DefeatedElectrode1::
AquaHideout_B1F_EventScript_Electrode2::
lock
faceplayer
- setwildbattle SPECIES_ELECTRODE, 30, ITEM_NONE
+ setwildbattle SPECIES_ELECTRODE, 30
waitse
playmoncry SPECIES_ELECTRODE, CRY_MODE_ENCOUNTER
delay 40
diff --git a/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc b/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc
index fb91ee752a..320e12d996 100644
--- a/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc
+++ b/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc
@@ -31,7 +31,7 @@ BattleFrontier_BattlePikeLobby_EventScript_QuitWithoutSaving::
lockall
msgbox BattleFrontier_BattlePikeLobby_Text_FailedToSaveBeforeQuitting, MSGBOX_DEFAULT
closemessage
- pike_set PIKE_DATA_WIN_STREAK 0
+ pike_set PIKE_DATA_WIN_STREAK, 0
pike_set PIKE_DATA_WIN_STREAK_ACTIVE, FALSE
frontier_set FRONTIER_DATA_CHALLENGE_STATUS, 0
setvar VAR_TEMP_0, 255
diff --git a/data/maps/BattleFrontier_BattlePikeRoomNormal/scripts.inc b/data/maps/BattleFrontier_BattlePikeRoomNormal/scripts.inc
index 9d060214de..45f042e4f8 100644
--- a/data/maps/BattleFrontier_BattlePikeRoomNormal/scripts.inc
+++ b/data/maps/BattleFrontier_BattlePikeRoomNormal/scripts.inc
@@ -193,7 +193,7 @@ BattleFrontier_BattlePikeRoomNormal_EventScript_DefeatedLucy::
waitmovement 0
pike_get PIKE_DATA_WIN_STREAK
addvar VAR_RESULT, 1
- pike_set PIKE_DATA_WIN_STREAK VAR_RESULT
+ pike_set PIKE_DATA_WIN_STREAK, VAR_RESULT
call BattleFrontier_BattlePikeRoom_EventScript_WarpToFinalRoom
waitstate
end
diff --git a/data/maps/BattleFrontier_OutsideEast/scripts.inc b/data/maps/BattleFrontier_OutsideEast/scripts.inc
index f343734806..e8eec6f160 100644
--- a/data/maps/BattleFrontier_OutsideEast/scripts.inc
+++ b/data/maps/BattleFrontier_OutsideEast/scripts.inc
@@ -129,7 +129,7 @@ BattleFrontier_OutsideEast_EventScript_WaterSudowoodo::
delay 40
waitmoncry
setvar VAR_LAST_TALKED, LOCALID_SUDOWOODO
- setwildbattle SPECIES_SUDOWOODO, 40, ITEM_NONE
+ setwildbattle SPECIES_SUDOWOODO, 40
setflag FLAG_SYS_CTRL_OBJ_DELETE
dowildbattle
clearflag FLAG_SYS_CTRL_OBJ_DELETE
diff --git a/data/maps/BirthIsland_Exterior/scripts.inc b/data/maps/BirthIsland_Exterior/scripts.inc
index 57d54d6fdc..68d3124d95 100644
--- a/data/maps/BirthIsland_Exterior/scripts.inc
+++ b/data/maps/BirthIsland_Exterior/scripts.inc
@@ -82,10 +82,7 @@ BirthIsland_Exterior_EventScript_Deoxys::
delay 40
waitmoncry
setvar VAR_LAST_TALKED, LOCALID_DEOXYS
- setvar VAR_0x8004, SPECIES_DEOXYS
- setvar VAR_0x8005, 30 @ level
- setvar VAR_0x8006, ITEM_NONE
- special CreateEventLegalEnemyMon
+ seteventmon SPECIES_DEOXYS, 30
setflag FLAG_SYS_CTRL_OBJ_DELETE
special BattleSetup_StartLegendaryBattle
waitstate
diff --git a/data/maps/DesertRuins/scripts.inc b/data/maps/DesertRuins/scripts.inc
index 2aaa61ebb9..21473e87a3 100644
--- a/data/maps/DesertRuins/scripts.inc
+++ b/data/maps/DesertRuins/scripts.inc
@@ -61,7 +61,7 @@ DesertRuins_EventScript_Regirock::
playmoncry SPECIES_REGIROCK, CRY_MODE_ENCOUNTER
delay 40
waitmoncry
- setwildbattle SPECIES_REGIROCK, 40, ITEM_NONE
+ setwildbattle SPECIES_REGIROCK, 40
setflag FLAG_SYS_CTRL_OBJ_DELETE
special StartRegiBattle
waitstate
diff --git a/data/maps/FarawayIsland_Interior/scripts.inc b/data/maps/FarawayIsland_Interior/scripts.inc
index 983b4709a2..d3d519ed15 100644
--- a/data/maps/FarawayIsland_Interior/scripts.inc
+++ b/data/maps/FarawayIsland_Interior/scripts.inc
@@ -129,10 +129,7 @@ FarawayIsland_Interior_EventScript_Mew::
special DestroyMewEmergingGrassSprite
delay 40
waitmoncry
- setvar VAR_0x8004, SPECIES_MEW
- setvar VAR_0x8005, 30 @ level
- setvar VAR_0x8006, ITEM_NONE
- special CreateEventLegalEnemyMon
+ seteventmon SPECIES_MEW, 30
setflag FLAG_SYS_CTRL_OBJ_DELETE
special BattleSetup_StartLegendaryBattle
waitstate
diff --git a/data/maps/IslandCave/scripts.inc b/data/maps/IslandCave/scripts.inc
index 8f8236a5c0..d15802aaa8 100644
--- a/data/maps/IslandCave/scripts.inc
+++ b/data/maps/IslandCave/scripts.inc
@@ -94,7 +94,7 @@ IslandCave_EventScript_Regice::
playmoncry SPECIES_REGICE, CRY_MODE_ENCOUNTER
delay 40
waitmoncry
- setwildbattle SPECIES_REGICE, 40, ITEM_NONE
+ setwildbattle SPECIES_REGICE, 40
setflag FLAG_SYS_CTRL_OBJ_DELETE
special StartRegiBattle
waitstate
diff --git a/data/maps/LavaridgeTown_Gym_1F/scripts.inc b/data/maps/LavaridgeTown_Gym_1F/scripts.inc
index 6628360c15..530d6e9598 100644
--- a/data/maps/LavaridgeTown_Gym_1F/scripts.inc
+++ b/data/maps/LavaridgeTown_Gym_1F/scripts.inc
@@ -19,7 +19,7 @@ LavaridgeTown_Gym_1F_EventScript_SetTrainerTempVars::
setvar VAR_TEMP_D, 0
setvar VAR_TEMP_E, 0
setvar VAR_TEMP_F, 0
- goto_if_defeated TRAINER_COLE LavaridgeTown_Gym_1F_EventScript_SetGeraldTempVar
+ goto_if_defeated TRAINER_COLE, LavaridgeTown_Gym_1F_EventScript_SetGeraldTempVar
setvar VAR_TEMP_B, 1
LavaridgeTown_Gym_1F_EventScript_SetGeraldTempVar::
goto_if_defeated TRAINER_GERALD, LavaridgeTown_Gym_1F_EventScript_SetAxleTempVar
@@ -105,7 +105,7 @@ LavaridgeTown_Gym_1F_EventScript_FlanneryRematch::
LavaridgeTown_Gym_1F_EventScript_Cole::
trainerbattle TRAINER_BATTLE_CONTINUE_SCRIPT, TRAINER_COLE, LOCALID_COLE, LavaridgeTown_Gym_1F_Text_ColeIntro, LavaridgeTown_Gym_1F_Text_ColeDefeat, LavaridgeTown_Gym_EventScript_CheckTrainerScript
- msgbox LavaridgeTown_Gym_1F_Text_ColePostBattle MSGBOX_AUTOCLOSE
+ msgbox LavaridgeTown_Gym_1F_Text_ColePostBattle, MSGBOX_AUTOCLOSE
end
LavaridgeTown_Gym_EventScript_CheckTrainerScript::
diff --git a/data/maps/LittlerootTown_BrendansHouse_2F/scripts.inc b/data/maps/LittlerootTown_BrendansHouse_2F/scripts.inc
index 9931726833..cd4d155192 100644
--- a/data/maps/LittlerootTown_BrendansHouse_2F/scripts.inc
+++ b/data/maps/LittlerootTown_BrendansHouse_2F/scripts.inc
@@ -22,7 +22,7 @@ LittlerootTown_BrendansHouse_2F_EventScript_TryUpdateBrendanPos::
checkplayergender
goto_if_eq VAR_RESULT, MALE, LittlerootTown_BrendansHouse_2F_EventScript_Ret
@ Odd that the MaysHouse equivalent was used below instead
- goto_if_ge VAR_DEX_UPGRADE_JOHTO_STARTER_STATE, 2 LittlerootTown_MaysHouse_2F_EventScript_Ret
+ goto_if_ge VAR_DEX_UPGRADE_JOHTO_STARTER_STATE, 2, LittlerootTown_MaysHouse_2F_EventScript_Ret
setobjectxyperm LOCALID_RIVAL, 0, 2
setobjectmovementtype LOCALID_RIVAL, MOVEMENT_TYPE_FACE_UP
return
@@ -243,7 +243,7 @@ LittlerootTown_BrendansHouse_2F_EventScript_PC::
end
LittlerootTown_BrendansHouse_2F_EventScript_CheckPlayersPC::
- setvar VAR_0x8004, 1
+ setvar VAR_0x8004, PC_LOCATION_BRENDANS_HOUSE
special DoPCTurnOnEffect
playse SE_PC_ON
msgbox gText_PlayerHouseBootPC, MSGBOX_DEFAULT
@@ -253,7 +253,7 @@ LittlerootTown_BrendansHouse_2F_EventScript_CheckPlayersPC::
end
LittlerootTown_BrendansHouse_2F_EventScript_TurnOffPlayerPC::
- setvar VAR_0x8004, 1
+ setvar VAR_0x8004, PC_LOCATION_BRENDANS_HOUSE
playse SE_PC_OFF
special DoPCTurnOffEffect
releaseall
diff --git a/data/maps/LittlerootTown_MaysHouse_2F/scripts.inc b/data/maps/LittlerootTown_MaysHouse_2F/scripts.inc
index 7403f3fcf6..ef8e83bf7e 100644
--- a/data/maps/LittlerootTown_MaysHouse_2F/scripts.inc
+++ b/data/maps/LittlerootTown_MaysHouse_2F/scripts.inc
@@ -294,7 +294,7 @@ LittlerootTown_MaysHouse_2F_EventScript_CheckRivalsPC::
end
LittlerootTown_MaysHouse_2F_EventScript_CheckPlayersPC::
- setvar VAR_0x8004, 2
+ setvar VAR_0x8004, PC_LOCATION_MAYS_HOUSE
special DoPCTurnOnEffect
playse SE_PC_ON
msgbox gText_PlayerHouseBootPC, MSGBOX_DEFAULT
@@ -304,7 +304,7 @@ LittlerootTown_MaysHouse_2F_EventScript_CheckPlayersPC::
end
LittlerootTown_MaysHouse_2F_EventScript_TurnOffPlayerPC::
- setvar VAR_0x8004, 2
+ setvar VAR_0x8004, PC_LOCATION_MAYS_HOUSE
playse SE_PC_OFF
special DoPCTurnOffEffect
releaseall
diff --git a/data/maps/LittlerootTown_ProfessorBirchsLab/scripts.inc b/data/maps/LittlerootTown_ProfessorBirchsLab/scripts.inc
index 7c7f47d2ee..acf80f0e40 100644
--- a/data/maps/LittlerootTown_ProfessorBirchsLab/scripts.inc
+++ b/data/maps/LittlerootTown_ProfessorBirchsLab/scripts.inc
@@ -340,9 +340,9 @@ LittlerootTown_ProfessorBirchsLab_EventScript_TakeYourTime::
LittlerootTown_ProfessorBirchsLab_EventScript_GiveCyndaquil::
bufferspeciesname STR_VAR_1, SPECIES_CYNDAQUIL
setvar VAR_TEMP_1, SPECIES_CYNDAQUIL
- givemon SPECIES_CYNDAQUIL, 5, ITEM_NONE
- goto_if_eq VAR_RESULT, 0, LittlerootTown_ProfessorBirchsLab_EventScript_SendCyndaquilToParty
- goto_if_eq VAR_RESULT, 1, LittlerootTown_ProfessorBirchsLab_EventScript_SendCyndaquilToPC
+ givemon SPECIES_CYNDAQUIL, 5
+ goto_if_eq VAR_RESULT, MON_GIVEN_TO_PARTY, LittlerootTown_ProfessorBirchsLab_EventScript_SendCyndaquilToParty
+ goto_if_eq VAR_RESULT, MON_GIVEN_TO_PC, LittlerootTown_ProfessorBirchsLab_EventScript_SendCyndaquilToPC
hidemonpic
goto Common_EventScript_NoMoreRoomForPokemon
end
@@ -381,9 +381,9 @@ LittlerootTown_ProfessorBirchsLab_EventScript_ReceivedCyndaquil::
LittlerootTown_ProfessorBirchsLab_EventScript_GiveTotodile::
bufferspeciesname STR_VAR_1, SPECIES_TOTODILE
setvar VAR_TEMP_1, SPECIES_TOTODILE
- givemon SPECIES_TOTODILE, 5, ITEM_NONE
- goto_if_eq VAR_RESULT, 0, LittlerootTown_ProfessorBirchsLab_EventScript_SendTotodileToParty
- goto_if_eq VAR_RESULT, 1, LittlerootTown_ProfessorBirchsLab_EventScript_SendTotodileToPC
+ givemon SPECIES_TOTODILE, 5
+ goto_if_eq VAR_RESULT, MON_GIVEN_TO_PARTY, LittlerootTown_ProfessorBirchsLab_EventScript_SendTotodileToParty
+ goto_if_eq VAR_RESULT, MON_GIVEN_TO_PC, LittlerootTown_ProfessorBirchsLab_EventScript_SendTotodileToPC
hidemonpic
goto Common_EventScript_NoMoreRoomForPokemon
end
@@ -422,9 +422,9 @@ LittlerootTown_ProfessorBirchsLab_EventScript_ReceivedTotodile::
LittlerootTown_ProfessorBirchsLab_EventScript_GiveChikorita::
bufferspeciesname STR_VAR_1, SPECIES_CHIKORITA
setvar VAR_TEMP_1, SPECIES_CHIKORITA
- givemon SPECIES_CHIKORITA, 5, ITEM_NONE
- goto_if_eq VAR_RESULT, 0, LittlerootTown_ProfessorBirchsLab_EventScript_SendChikoritaToParty
- goto_if_eq VAR_RESULT, 1, LittlerootTown_ProfessorBirchsLab_EventScript_SendChikoritaToPC
+ givemon SPECIES_CHIKORITA, 5
+ goto_if_eq VAR_RESULT, MON_GIVEN_TO_PARTY, LittlerootTown_ProfessorBirchsLab_EventScript_SendChikoritaToParty
+ goto_if_eq VAR_RESULT, MON_GIVEN_TO_PC, LittlerootTown_ProfessorBirchsLab_EventScript_SendChikoritaToPC
hidemonpic
goto Common_EventScript_NoMoreRoomForPokemon
end
diff --git a/data/maps/MarineCave_End/scripts.inc b/data/maps/MarineCave_End/scripts.inc
index 1d988a4448..a7ff583695 100644
--- a/data/maps/MarineCave_End/scripts.inc
+++ b/data/maps/MarineCave_End/scripts.inc
@@ -35,7 +35,7 @@ MarineCave_End_EventScript_Kyogre::
delay 40
waitmoncry
setvar VAR_LAST_TALKED, LOCALID_KYOGRE
- setwildbattle SPECIES_KYOGRE, 70, ITEM_NONE
+ setwildbattle SPECIES_KYOGRE, 70
setflag FLAG_SYS_CTRL_OBJ_DELETE
special BattleSetup_StartLegendaryBattle
waitstate
diff --git a/data/maps/MossdeepCity_StevensHouse/scripts.inc b/data/maps/MossdeepCity_StevensHouse/scripts.inc
index aac12ec2af..0470e977a6 100644
--- a/data/maps/MossdeepCity_StevensHouse/scripts.inc
+++ b/data/maps/MossdeepCity_StevensHouse/scripts.inc
@@ -86,9 +86,9 @@ MossdeepCity_StevensHouse_EventScript_LeaveBeldum::
MossdeepCity_StevensHouse_EventScript_GiveBeldum::
setvar VAR_TEMP_1, SPECIES_BELDUM
- givemon SPECIES_BELDUM, 5, ITEM_NONE
- goto_if_eq VAR_RESULT, 0, MossdeepCity_StevensHouse_EventScript_SendBeldumParty
- goto_if_eq VAR_RESULT, 1, MossdeepCity_StevensHouse_EventScript_SendBeldumPC
+ givemon SPECIES_BELDUM, 5
+ goto_if_eq VAR_RESULT, MON_GIVEN_TO_PARTY, MossdeepCity_StevensHouse_EventScript_SendBeldumParty
+ goto_if_eq VAR_RESULT, MON_GIVEN_TO_PC, MossdeepCity_StevensHouse_EventScript_SendBeldumPC
goto Common_EventScript_NoMoreRoomForPokemon
end
diff --git a/data/maps/MtPyre_3F/scripts.inc b/data/maps/MtPyre_3F/scripts.inc
index ff15f99393..3c79e807a4 100644
--- a/data/maps/MtPyre_3F/scripts.inc
+++ b/data/maps/MtPyre_3F/scripts.inc
@@ -7,7 +7,7 @@ MtPyre_3F_EventScript_William::
end
MtPyre_3F_EventScript_Kayla::
- trainerbattle_single TRAINER_KAYLA, MtPyre_3F_Text_KaylaIntro MtPyre_3F_Text_KaylaDefeat
+ trainerbattle_single TRAINER_KAYLA, MtPyre_3F_Text_KaylaIntro, MtPyre_3F_Text_KaylaDefeat
msgbox MtPyre_3F_Text_KaylaPostBattle, MSGBOX_AUTOCLOSE
end
diff --git a/data/maps/NavelRock_Bottom/scripts.inc b/data/maps/NavelRock_Bottom/scripts.inc
index f6687a36f5..90cc229895 100644
--- a/data/maps/NavelRock_Bottom/scripts.inc
+++ b/data/maps/NavelRock_Bottom/scripts.inc
@@ -53,10 +53,7 @@ NavelRock_Bottom_EventScript_Lugia::
playmoncry SPECIES_LUGIA, CRY_MODE_ENCOUNTER
waitmoncry
delay 20
- setvar VAR_0x8004, SPECIES_LUGIA
- setvar VAR_0x8005, 70 @ level
- setvar VAR_0x8006, ITEM_NONE
- special CreateEventLegalEnemyMon
+ seteventmon SPECIES_LUGIA, 70
setflag FLAG_SYS_CTRL_OBJ_DELETE
special BattleSetup_StartLegendaryBattle
waitstate
diff --git a/data/maps/NavelRock_Top/scripts.inc b/data/maps/NavelRock_Top/scripts.inc
index 2805f56771..10969367a1 100644
--- a/data/maps/NavelRock_Top/scripts.inc
+++ b/data/maps/NavelRock_Top/scripts.inc
@@ -57,10 +57,7 @@ NavelRock_Top_EventScript_HoOh::
applymovement LOCALID_HO_OH, NavelRock_Top_Movement_HoOhApproach
waitmovement 0
special RemoveCameraObject
- setvar VAR_0x8004, SPECIES_HO_OH
- setvar VAR_0x8005, 70 @ level
- setvar VAR_0x8006, ITEM_NONE
- special CreateEventLegalEnemyMon
+ seteventmon SPECIES_HO_OH, 70
setflag FLAG_SYS_CTRL_OBJ_DELETE
special BattleSetup_StartLegendaryBattle
waitstate
diff --git a/data/maps/NewMauville_Inside/scripts.inc b/data/maps/NewMauville_Inside/scripts.inc
index 51748380ad..244eea436f 100644
--- a/data/maps/NewMauville_Inside/scripts.inc
+++ b/data/maps/NewMauville_Inside/scripts.inc
@@ -176,7 +176,7 @@ NewMauville_Inside_EventScript_GeneratorOff::
NewMauville_Inside_EventScript_Voltorb1::
lock
faceplayer
- setwildbattle SPECIES_VOLTORB, 25, ITEM_NONE
+ setwildbattle SPECIES_VOLTORB, 25
waitse
playmoncry SPECIES_VOLTORB, CRY_MODE_ENCOUNTER
delay 40
@@ -200,7 +200,7 @@ NewMauville_Inside_EventScript_DefeatedVoltorb1::
NewMauville_Inside_EventScript_Voltorb2::
lock
faceplayer
- setwildbattle SPECIES_VOLTORB, 25, ITEM_NONE
+ setwildbattle SPECIES_VOLTORB, 25
waitse
playmoncry SPECIES_VOLTORB, CRY_MODE_ENCOUNTER
delay 40
@@ -224,7 +224,7 @@ NewMauville_Inside_EventScript_DefeatedVoltorb2::
NewMauville_Inside_EventScript_Voltorb3::
lock
faceplayer
- setwildbattle SPECIES_VOLTORB, 25, ITEM_NONE
+ setwildbattle SPECIES_VOLTORB, 25
waitse
playmoncry SPECIES_VOLTORB, CRY_MODE_ENCOUNTER
delay 40
diff --git a/data/maps/Route119_WeatherInstitute_2F/scripts.inc b/data/maps/Route119_WeatherInstitute_2F/scripts.inc
index 0b2227e8ba..2060cb03c9 100644
--- a/data/maps/Route119_WeatherInstitute_2F/scripts.inc
+++ b/data/maps/Route119_WeatherInstitute_2F/scripts.inc
@@ -90,8 +90,8 @@ Route119_WeatherInstitute_2F_EventScript_ReceiveCastform::
msgbox Route119_WeatherInstitute_2F_Text_ThanksPleaseTakePokemon, MSGBOX_DEFAULT
setvar VAR_TEMP_1, SPECIES_CASTFORM
givemon SPECIES_CASTFORM, 25, ITEM_MYSTIC_WATER
- goto_if_eq VAR_RESULT, 0, Route119_WeatherInstitute_2F_EventScript_ReceiveCastformParty
- goto_if_eq VAR_RESULT, 1, Route119_WeatherInstitute_2F_EventScript_ReceiveCastformPC
+ goto_if_eq VAR_RESULT, MON_GIVEN_TO_PARTY, Route119_WeatherInstitute_2F_EventScript_ReceiveCastformParty
+ goto_if_eq VAR_RESULT, MON_GIVEN_TO_PC, Route119_WeatherInstitute_2F_EventScript_ReceiveCastformPC
goto Common_EventScript_NoMoreRoomForPokemon
end
diff --git a/data/maps/Route120/scripts.inc b/data/maps/Route120/scripts.inc
index baf721a5ca..a0bfbc60c3 100644
--- a/data/maps/Route120/scripts.inc
+++ b/data/maps/Route120/scripts.inc
@@ -193,7 +193,7 @@ Route120_EventScript_StevenBattleKecleon::
playmoncry SPECIES_KECLEON, CRY_MODE_ENCOUNTER
delay 40
waitmoncry
- setwildbattle SPECIES_KECLEON, 30, ITEM_NONE
+ setwildbattle SPECIES_KECLEON, 30
setvar VAR_0x8009, 0
setflag FLAG_SYS_CTRL_OBJ_DELETE
dowildbattle
diff --git a/data/maps/RustboroCity_DevonCorp_2F/scripts.inc b/data/maps/RustboroCity_DevonCorp_2F/scripts.inc
index 987828a295..747070645c 100644
--- a/data/maps/RustboroCity_DevonCorp_2F/scripts.inc
+++ b/data/maps/RustboroCity_DevonCorp_2F/scripts.inc
@@ -145,9 +145,9 @@ RustboroCity_DevonCorp_2F_EventScript_AnorithReady::
RustboroCity_DevonCorp_2F_EventScript_ReceiveLileep::
setvar VAR_TEMP_1, SPECIES_LILEEP
- givemon SPECIES_LILEEP, 20, ITEM_NONE
- goto_if_eq VAR_RESULT, 0, RustboroCity_DevonCorp_2F_EventScript_ReceiveLileepParty
- goto_if_eq VAR_RESULT, 1, RustboroCity_DevonCorp_2F_EventScript_ReceiveLileepPC
+ givemon SPECIES_LILEEP, 20
+ goto_if_eq VAR_RESULT, MON_GIVEN_TO_PARTY, RustboroCity_DevonCorp_2F_EventScript_ReceiveLileepParty
+ goto_if_eq VAR_RESULT, MON_GIVEN_TO_PC, RustboroCity_DevonCorp_2F_EventScript_ReceiveLileepPC
goto Common_EventScript_NoMoreRoomForPokemon
end
@@ -190,9 +190,9 @@ RustboroCity_DevonCorp_2F_EventScript_FinishReceivingLileep::
RustboroCity_DevonCorp_2F_EventScript_ReceiveAnorith::
setvar VAR_TEMP_1, SPECIES_ANORITH
- givemon SPECIES_ANORITH, 20, ITEM_NONE
- goto_if_eq VAR_RESULT, 0, RustboroCity_DevonCorp_2F_EventScript_ReceiveAnorithParty
- goto_if_eq VAR_RESULT, 1, RustboroCity_DevonCorp_2F_EventScript_ReceiveAnorithPC
+ givemon SPECIES_ANORITH, 20
+ goto_if_eq VAR_RESULT, MON_GIVEN_TO_PARTY, RustboroCity_DevonCorp_2F_EventScript_ReceiveAnorithParty
+ goto_if_eq VAR_RESULT, MON_GIVEN_TO_PC, RustboroCity_DevonCorp_2F_EventScript_ReceiveAnorithPC
goto Common_EventScript_NoMoreRoomForPokemon
end
diff --git a/data/maps/SecretBase_BlueCave1/map.json b/data/maps/SecretBase_BlueCave1/map.json
index 3fb6157cca..066cfb3857 100644
--- a/data/maps/SecretBase_BlueCave1/map.json
+++ b/data/maps/SecretBase_BlueCave1/map.json
@@ -26,7 +26,7 @@
"trainer_type": "TRAINER_TYPE_NONE",
"trainer_sight_or_berry_tree_id": "0",
"script": "SecretBase_EventScript_RecordMixTrainer",
- "flag": "FLAG_DECORATION_0"
+ "flag": "FLAG_HIDE_SECRET_BASE_TRAINER"
},
{
"graphics_id": "OBJ_EVENT_GFX_VAR_0",
diff --git a/data/maps/SecretBase_BlueCave2/map.json b/data/maps/SecretBase_BlueCave2/map.json
index ca15e39f18..b74fa5afb6 100644
--- a/data/maps/SecretBase_BlueCave2/map.json
+++ b/data/maps/SecretBase_BlueCave2/map.json
@@ -26,7 +26,7 @@
"trainer_type": "TRAINER_TYPE_NONE",
"trainer_sight_or_berry_tree_id": "0",
"script": "SecretBase_EventScript_RecordMixTrainer",
- "flag": "FLAG_DECORATION_0"
+ "flag": "FLAG_HIDE_SECRET_BASE_TRAINER"
},
{
"graphics_id": "OBJ_EVENT_GFX_VAR_0",
diff --git a/data/maps/SecretBase_BlueCave3/map.json b/data/maps/SecretBase_BlueCave3/map.json
index 356b4894d4..dd67e2d546 100644
--- a/data/maps/SecretBase_BlueCave3/map.json
+++ b/data/maps/SecretBase_BlueCave3/map.json
@@ -26,7 +26,7 @@
"trainer_type": "TRAINER_TYPE_NONE",
"trainer_sight_or_berry_tree_id": "0",
"script": "SecretBase_EventScript_RecordMixTrainer",
- "flag": "FLAG_DECORATION_0"
+ "flag": "FLAG_HIDE_SECRET_BASE_TRAINER"
},
{
"graphics_id": "OBJ_EVENT_GFX_VAR_0",
diff --git a/data/maps/SecretBase_BlueCave4/map.json b/data/maps/SecretBase_BlueCave4/map.json
index 078bada8e6..3c97371f53 100644
--- a/data/maps/SecretBase_BlueCave4/map.json
+++ b/data/maps/SecretBase_BlueCave4/map.json
@@ -26,7 +26,7 @@
"trainer_type": "TRAINER_TYPE_NONE",
"trainer_sight_or_berry_tree_id": "0",
"script": "SecretBase_EventScript_RecordMixTrainer",
- "flag": "FLAG_DECORATION_0"
+ "flag": "FLAG_HIDE_SECRET_BASE_TRAINER"
},
{
"graphics_id": "OBJ_EVENT_GFX_VAR_0",
diff --git a/data/maps/SecretBase_BrownCave1/map.json b/data/maps/SecretBase_BrownCave1/map.json
index 6f2dc92f24..062eac9f4b 100644
--- a/data/maps/SecretBase_BrownCave1/map.json
+++ b/data/maps/SecretBase_BrownCave1/map.json
@@ -26,7 +26,7 @@
"trainer_type": "TRAINER_TYPE_NONE",
"trainer_sight_or_berry_tree_id": "0",
"script": "SecretBase_EventScript_RecordMixTrainer",
- "flag": "FLAG_DECORATION_0"
+ "flag": "FLAG_HIDE_SECRET_BASE_TRAINER"
},
{
"graphics_id": "OBJ_EVENT_GFX_VAR_0",
diff --git a/data/maps/SecretBase_BrownCave2/map.json b/data/maps/SecretBase_BrownCave2/map.json
index 11559c12fb..eb04f2a8de 100644
--- a/data/maps/SecretBase_BrownCave2/map.json
+++ b/data/maps/SecretBase_BrownCave2/map.json
@@ -26,7 +26,7 @@
"trainer_type": "TRAINER_TYPE_NONE",
"trainer_sight_or_berry_tree_id": "0",
"script": "SecretBase_EventScript_RecordMixTrainer",
- "flag": "FLAG_DECORATION_0"
+ "flag": "FLAG_HIDE_SECRET_BASE_TRAINER"
},
{
"graphics_id": "OBJ_EVENT_GFX_VAR_0",
diff --git a/data/maps/SecretBase_BrownCave3/map.json b/data/maps/SecretBase_BrownCave3/map.json
index c2dbb7fc45..1d00ee139a 100644
--- a/data/maps/SecretBase_BrownCave3/map.json
+++ b/data/maps/SecretBase_BrownCave3/map.json
@@ -26,7 +26,7 @@
"trainer_type": "TRAINER_TYPE_NONE",
"trainer_sight_or_berry_tree_id": "0",
"script": "SecretBase_EventScript_RecordMixTrainer",
- "flag": "FLAG_DECORATION_0"
+ "flag": "FLAG_HIDE_SECRET_BASE_TRAINER"
},
{
"graphics_id": "OBJ_EVENT_GFX_VAR_0",
diff --git a/data/maps/SecretBase_BrownCave4/map.json b/data/maps/SecretBase_BrownCave4/map.json
index e7147ae85d..f1fb82eb4f 100644
--- a/data/maps/SecretBase_BrownCave4/map.json
+++ b/data/maps/SecretBase_BrownCave4/map.json
@@ -26,7 +26,7 @@
"trainer_type": "TRAINER_TYPE_NONE",
"trainer_sight_or_berry_tree_id": "0",
"script": "SecretBase_EventScript_RecordMixTrainer",
- "flag": "FLAG_DECORATION_0"
+ "flag": "FLAG_HIDE_SECRET_BASE_TRAINER"
},
{
"graphics_id": "OBJ_EVENT_GFX_VAR_0",
diff --git a/data/maps/SecretBase_RedCave1/map.json b/data/maps/SecretBase_RedCave1/map.json
index fd264fc6cf..e83458a87a 100644
--- a/data/maps/SecretBase_RedCave1/map.json
+++ b/data/maps/SecretBase_RedCave1/map.json
@@ -26,7 +26,7 @@
"trainer_type": "TRAINER_TYPE_NONE",
"trainer_sight_or_berry_tree_id": "0",
"script": "SecretBase_EventScript_RecordMixTrainer",
- "flag": "FLAG_DECORATION_0"
+ "flag": "FLAG_HIDE_SECRET_BASE_TRAINER"
},
{
"graphics_id": "OBJ_EVENT_GFX_VAR_0",
diff --git a/data/maps/SecretBase_RedCave2/map.json b/data/maps/SecretBase_RedCave2/map.json
index b60b3bbff2..9a0ac210f4 100644
--- a/data/maps/SecretBase_RedCave2/map.json
+++ b/data/maps/SecretBase_RedCave2/map.json
@@ -26,7 +26,7 @@
"trainer_type": "TRAINER_TYPE_NONE",
"trainer_sight_or_berry_tree_id": "0",
"script": "SecretBase_EventScript_RecordMixTrainer",
- "flag": "FLAG_DECORATION_0"
+ "flag": "FLAG_HIDE_SECRET_BASE_TRAINER"
},
{
"graphics_id": "OBJ_EVENT_GFX_VAR_0",
diff --git a/data/maps/SecretBase_RedCave3/map.json b/data/maps/SecretBase_RedCave3/map.json
index 079837a621..ce405a40ab 100644
--- a/data/maps/SecretBase_RedCave3/map.json
+++ b/data/maps/SecretBase_RedCave3/map.json
@@ -26,7 +26,7 @@
"trainer_type": "TRAINER_TYPE_NONE",
"trainer_sight_or_berry_tree_id": "0",
"script": "SecretBase_EventScript_RecordMixTrainer",
- "flag": "FLAG_DECORATION_0"
+ "flag": "FLAG_HIDE_SECRET_BASE_TRAINER"
},
{
"graphics_id": "OBJ_EVENT_GFX_VAR_0",
diff --git a/data/maps/SecretBase_RedCave4/map.json b/data/maps/SecretBase_RedCave4/map.json
index 10fbbfeb0d..2b1ad8c2c9 100644
--- a/data/maps/SecretBase_RedCave4/map.json
+++ b/data/maps/SecretBase_RedCave4/map.json
@@ -26,7 +26,7 @@
"trainer_type": "TRAINER_TYPE_NONE",
"trainer_sight_or_berry_tree_id": "0",
"script": "SecretBase_EventScript_RecordMixTrainer",
- "flag": "FLAG_DECORATION_0"
+ "flag": "FLAG_HIDE_SECRET_BASE_TRAINER"
},
{
"graphics_id": "OBJ_EVENT_GFX_VAR_0",
diff --git a/data/maps/SecretBase_Shrub1/map.json b/data/maps/SecretBase_Shrub1/map.json
index e0d1015cbb..a028cbe62a 100644
--- a/data/maps/SecretBase_Shrub1/map.json
+++ b/data/maps/SecretBase_Shrub1/map.json
@@ -26,7 +26,7 @@
"trainer_type": "TRAINER_TYPE_NONE",
"trainer_sight_or_berry_tree_id": "0",
"script": "SecretBase_EventScript_RecordMixTrainer",
- "flag": "FLAG_DECORATION_0"
+ "flag": "FLAG_HIDE_SECRET_BASE_TRAINER"
},
{
"graphics_id": "OBJ_EVENT_GFX_VAR_0",
diff --git a/data/maps/SecretBase_Shrub2/map.json b/data/maps/SecretBase_Shrub2/map.json
index 879b7464e9..60977e70d4 100644
--- a/data/maps/SecretBase_Shrub2/map.json
+++ b/data/maps/SecretBase_Shrub2/map.json
@@ -26,7 +26,7 @@
"trainer_type": "TRAINER_TYPE_NONE",
"trainer_sight_or_berry_tree_id": "0",
"script": "SecretBase_EventScript_RecordMixTrainer",
- "flag": "FLAG_DECORATION_0"
+ "flag": "FLAG_HIDE_SECRET_BASE_TRAINER"
},
{
"graphics_id": "OBJ_EVENT_GFX_VAR_0",
diff --git a/data/maps/SecretBase_Shrub3/map.json b/data/maps/SecretBase_Shrub3/map.json
index 6751a74147..a513b0bd2b 100644
--- a/data/maps/SecretBase_Shrub3/map.json
+++ b/data/maps/SecretBase_Shrub3/map.json
@@ -26,7 +26,7 @@
"trainer_type": "TRAINER_TYPE_NONE",
"trainer_sight_or_berry_tree_id": "0",
"script": "SecretBase_EventScript_RecordMixTrainer",
- "flag": "FLAG_DECORATION_0"
+ "flag": "FLAG_HIDE_SECRET_BASE_TRAINER"
},
{
"graphics_id": "OBJ_EVENT_GFX_VAR_0",
diff --git a/data/maps/SecretBase_Shrub4/map.json b/data/maps/SecretBase_Shrub4/map.json
index c193b8348e..6aded553b8 100644
--- a/data/maps/SecretBase_Shrub4/map.json
+++ b/data/maps/SecretBase_Shrub4/map.json
@@ -26,7 +26,7 @@
"trainer_type": "TRAINER_TYPE_NONE",
"trainer_sight_or_berry_tree_id": "0",
"script": "SecretBase_EventScript_RecordMixTrainer",
- "flag": "FLAG_DECORATION_0"
+ "flag": "FLAG_HIDE_SECRET_BASE_TRAINER"
},
{
"graphics_id": "OBJ_EVENT_GFX_VAR_0",
diff --git a/data/maps/SecretBase_Tree1/map.json b/data/maps/SecretBase_Tree1/map.json
index cd0cad5f08..cd6a0b33af 100644
--- a/data/maps/SecretBase_Tree1/map.json
+++ b/data/maps/SecretBase_Tree1/map.json
@@ -26,7 +26,7 @@
"trainer_type": "TRAINER_TYPE_NONE",
"trainer_sight_or_berry_tree_id": "0",
"script": "SecretBase_EventScript_RecordMixTrainer",
- "flag": "FLAG_DECORATION_0"
+ "flag": "FLAG_HIDE_SECRET_BASE_TRAINER"
},
{
"graphics_id": "OBJ_EVENT_GFX_VAR_0",
diff --git a/data/maps/SecretBase_Tree2/map.json b/data/maps/SecretBase_Tree2/map.json
index 1ac393a158..3aad151ffe 100644
--- a/data/maps/SecretBase_Tree2/map.json
+++ b/data/maps/SecretBase_Tree2/map.json
@@ -26,7 +26,7 @@
"trainer_type": "TRAINER_TYPE_NONE",
"trainer_sight_or_berry_tree_id": "0",
"script": "SecretBase_EventScript_RecordMixTrainer",
- "flag": "FLAG_DECORATION_0"
+ "flag": "FLAG_HIDE_SECRET_BASE_TRAINER"
},
{
"graphics_id": "OBJ_EVENT_GFX_VAR_0",
diff --git a/data/maps/SecretBase_Tree3/map.json b/data/maps/SecretBase_Tree3/map.json
index b7eec22440..498852c024 100644
--- a/data/maps/SecretBase_Tree3/map.json
+++ b/data/maps/SecretBase_Tree3/map.json
@@ -26,7 +26,7 @@
"trainer_type": "TRAINER_TYPE_NONE",
"trainer_sight_or_berry_tree_id": "0",
"script": "SecretBase_EventScript_RecordMixTrainer",
- "flag": "FLAG_DECORATION_0"
+ "flag": "FLAG_HIDE_SECRET_BASE_TRAINER"
},
{
"graphics_id": "OBJ_EVENT_GFX_VAR_0",
diff --git a/data/maps/SecretBase_Tree4/map.json b/data/maps/SecretBase_Tree4/map.json
index 0e068ec94d..b24d1d8a99 100644
--- a/data/maps/SecretBase_Tree4/map.json
+++ b/data/maps/SecretBase_Tree4/map.json
@@ -26,7 +26,7 @@
"trainer_type": "TRAINER_TYPE_NONE",
"trainer_sight_or_berry_tree_id": "0",
"script": "SecretBase_EventScript_RecordMixTrainer",
- "flag": "FLAG_DECORATION_0"
+ "flag": "FLAG_HIDE_SECRET_BASE_TRAINER"
},
{
"graphics_id": "OBJ_EVENT_GFX_VAR_0",
diff --git a/data/maps/SecretBase_YellowCave1/map.json b/data/maps/SecretBase_YellowCave1/map.json
index 1d873bfe29..54916fda32 100644
--- a/data/maps/SecretBase_YellowCave1/map.json
+++ b/data/maps/SecretBase_YellowCave1/map.json
@@ -26,7 +26,7 @@
"trainer_type": "TRAINER_TYPE_NONE",
"trainer_sight_or_berry_tree_id": "0",
"script": "SecretBase_EventScript_RecordMixTrainer",
- "flag": "FLAG_DECORATION_0"
+ "flag": "FLAG_HIDE_SECRET_BASE_TRAINER"
},
{
"graphics_id": "OBJ_EVENT_GFX_VAR_0",
diff --git a/data/maps/SecretBase_YellowCave2/map.json b/data/maps/SecretBase_YellowCave2/map.json
index af2e957bc6..f9d9a572be 100644
--- a/data/maps/SecretBase_YellowCave2/map.json
+++ b/data/maps/SecretBase_YellowCave2/map.json
@@ -26,7 +26,7 @@
"trainer_type": "TRAINER_TYPE_NONE",
"trainer_sight_or_berry_tree_id": "0",
"script": "SecretBase_EventScript_RecordMixTrainer",
- "flag": "FLAG_DECORATION_0"
+ "flag": "FLAG_HIDE_SECRET_BASE_TRAINER"
},
{
"graphics_id": "OBJ_EVENT_GFX_VAR_0",
diff --git a/data/maps/SecretBase_YellowCave3/map.json b/data/maps/SecretBase_YellowCave3/map.json
index d78aa28628..fdcc94c18b 100644
--- a/data/maps/SecretBase_YellowCave3/map.json
+++ b/data/maps/SecretBase_YellowCave3/map.json
@@ -26,7 +26,7 @@
"trainer_type": "TRAINER_TYPE_NONE",
"trainer_sight_or_berry_tree_id": "0",
"script": "SecretBase_EventScript_RecordMixTrainer",
- "flag": "FLAG_DECORATION_0"
+ "flag": "FLAG_HIDE_SECRET_BASE_TRAINER"
},
{
"graphics_id": "OBJ_EVENT_GFX_VAR_0",
diff --git a/data/maps/SecretBase_YellowCave4/map.json b/data/maps/SecretBase_YellowCave4/map.json
index 0ca4bc4d32..246974eaad 100644
--- a/data/maps/SecretBase_YellowCave4/map.json
+++ b/data/maps/SecretBase_YellowCave4/map.json
@@ -26,7 +26,7 @@
"trainer_type": "TRAINER_TYPE_NONE",
"trainer_sight_or_berry_tree_id": "0",
"script": "SecretBase_EventScript_RecordMixTrainer",
- "flag": "FLAG_DECORATION_0"
+ "flag": "FLAG_HIDE_SECRET_BASE_TRAINER"
},
{
"graphics_id": "OBJ_EVENT_GFX_VAR_0",
diff --git a/data/maps/SkyPillar_Top/scripts.inc b/data/maps/SkyPillar_Top/scripts.inc
index 5c71bbe4bf..7b65d9e257 100644
--- a/data/maps/SkyPillar_Top/scripts.inc
+++ b/data/maps/SkyPillar_Top/scripts.inc
@@ -48,7 +48,7 @@ SkyPillar_Top_EventScript_Rayquaza::
playmoncry SPECIES_RAYQUAZA, CRY_MODE_ENCOUNTER
delay 40
waitmoncry
- setwildbattle SPECIES_RAYQUAZA, 70, ITEM_NONE
+ setwildbattle SPECIES_RAYQUAZA, 70
setflag FLAG_SYS_CTRL_OBJ_DELETE
special BattleSetup_StartLegendaryBattle
waitstate
diff --git a/data/maps/SouthernIsland_Interior/scripts.inc b/data/maps/SouthernIsland_Interior/scripts.inc
index c46cefefc6..8486739d93 100644
--- a/data/maps/SouthernIsland_Interior/scripts.inc
+++ b/data/maps/SouthernIsland_Interior/scripts.inc
@@ -47,7 +47,7 @@ SouthernIsland_Interior_EventScript_SetMayGfx::
SouthernIsland_Interior_EventScript_TryLatiEncounter::
lockall
- setvar VAR_0x8008, 12
+ setvar VAR_0x8008, 12 @ Player's Y coordinate. Not read
goto SouthernIsland_Interior_EventScript_Lati
end
@@ -105,17 +105,11 @@ SouthernIsland_Interior_EventScript_Sign::
end
SouthernIsland_Interior_EventScript_SetLatiosBattleVars::
- setvar VAR_0x8004, SPECIES_LATIOS
- setvar VAR_0x8005, 50 @ level
- setvar VAR_0x8006, ITEM_SOUL_DEW
- special CreateEventLegalEnemyMon
+ seteventmon SPECIES_LATIOS, 50, ITEM_SOUL_DEW
return
SouthernIsland_Interior_EventScript_SetLatiasBattleVars::
- setvar VAR_0x8004, SPECIES_LATIAS
- setvar VAR_0x8005, 50 @ level
- setvar VAR_0x8006, ITEM_SOUL_DEW
- special CreateEventLegalEnemyMon
+ seteventmon SPECIES_LATIAS, 50, ITEM_SOUL_DEW
return
SouthernIsland_Interior_Movement_CameraPanUp:
diff --git a/data/maps/TerraCave_End/scripts.inc b/data/maps/TerraCave_End/scripts.inc
index 5f0051becf..8b2732d45e 100644
--- a/data/maps/TerraCave_End/scripts.inc
+++ b/data/maps/TerraCave_End/scripts.inc
@@ -35,7 +35,7 @@ TerraCave_End_EventScript_Groudon::
delay 40
waitmoncry
setvar VAR_LAST_TALKED, LOCALID_GROUDON
- setwildbattle SPECIES_GROUDON, 70, ITEM_NONE
+ setwildbattle SPECIES_GROUDON, 70
setflag FLAG_SYS_CTRL_OBJ_DELETE
special BattleSetup_StartLegendaryBattle
waitstate
diff --git a/data/mb_berry_fix.gba b/data/mb_berry_fix.gba
new file mode 100755
index 0000000000..0afff07f5d
Binary files /dev/null and b/data/mb_berry_fix.gba differ
diff --git a/data/pokemon_colosseum.mb b/data/mb_colosseum.gba
similarity index 100%
rename from data/pokemon_colosseum.mb
rename to data/mb_colosseum.gba
diff --git a/data/ereader_link_data.bin b/data/mb_ereader.gba
similarity index 100%
rename from data/ereader_link_data.bin
rename to data/mb_ereader.gba
diff --git a/data/multiboot_berry_glitch_fix.s b/data/multiboot_berry_glitch_fix.s
index 7d65c0d4de..d0d54d5502 100644
--- a/data/multiboot_berry_glitch_fix.s
+++ b/data/multiboot_berry_glitch_fix.s
@@ -1,5 +1,5 @@
.section .rodata
gMultiBootProgram_BerryGlitchFix_Start::
- .incbin "berry_fix/berry_fix.gba"
+ .incbin "data/mb_berry_fix.gba"
gMultiBootProgram_BerryGlitchFix_End::
diff --git a/data/multiboot_ereader.s b/data/multiboot_ereader.s
new file mode 100644
index 0000000000..ab97f72799
--- /dev/null
+++ b/data/multiboot_ereader.s
@@ -0,0 +1,6 @@
+ .section .rodata
+
+ .align 2
+gMultiBootProgram_EReader_Start::
+ .incbin "data/mb_ereader.gba"
+gMultiBootProgram_EReader_End::
diff --git a/data/multiboot_pokemon_colosseum.s b/data/multiboot_pokemon_colosseum.s
index 179f8a0671..a5f894908a 100644
--- a/data/multiboot_pokemon_colosseum.s
+++ b/data/multiboot_pokemon_colosseum.s
@@ -1,5 +1,5 @@
.section .rodata
gMultiBootProgram_PokemonColosseum_Start::
- .incbin "data/pokemon_colosseum.mb"
+ .incbin "data/mb_colosseum.gba"
gMultiBootProgram_PokemonColosseum_End::
diff --git a/data/mystery_gift.s b/data/mystery_gift.s
index df0cbd4ac0..86202b95f7 100644
--- a/data/mystery_gift.s
+++ b/data/mystery_gift.s
@@ -8,6 +8,7 @@
#include "constants/songs.h"
#include "constants/species.h"
#include "constants/vars.h"
+#include "constants/wild_encounter.h"
.include "asm/macros.inc"
.include "asm/macros/event.inc"
.include "constants/constants.inc"
diff --git a/data/script_cmd_table.inc b/data/script_cmd_table.inc
index 48ec7918a4..51b7f966e4 100644
--- a/data/script_cmd_table.inc
+++ b/data/script_cmd_table.inc
@@ -80,16 +80,16 @@ gScriptCmdTable::
.4byte ScrCmd_checkdecor @ 0x4d
.4byte ScrCmd_checkdecorspace @ 0x4e
.4byte ScrCmd_applymovement @ 0x4f
- .4byte ScrCmd_applymovement_at @ 0x50
+ .4byte ScrCmd_applymovementat @ 0x50
.4byte ScrCmd_waitmovement @ 0x51
- .4byte ScrCmd_waitmovement_at @ 0x52
+ .4byte ScrCmd_waitmovementat @ 0x52
.4byte ScrCmd_removeobject @ 0x53
- .4byte ScrCmd_removeobject_at @ 0x54
+ .4byte ScrCmd_removeobjectat @ 0x54
.4byte ScrCmd_addobject @ 0x55
- .4byte ScrCmd_addobject_at @ 0x56
+ .4byte ScrCmd_addobjectat @ 0x56
.4byte ScrCmd_setobjectxy @ 0x57
- .4byte ScrCmd_showobject_at @ 0x58
- .4byte ScrCmd_hideobject_at @ 0x59
+ .4byte ScrCmd_showobjectat @ 0x58
+ .4byte ScrCmd_hideobjectat @ 0x59
.4byte ScrCmd_faceplayer @ 0x5a
.4byte ScrCmd_turnobject @ 0x5b
.4byte ScrCmd_trainerbattle @ 0x5c
diff --git a/data/scripts/gift_altering_cave.inc b/data/scripts/gift_altering_cave.inc
index f86432ce28..65ff87068a 100644
--- a/data/scripts/gift_altering_cave.inc
+++ b/data/scripts/gift_altering_cave.inc
@@ -1,7 +1,7 @@
MysteryGiftScript_AlteringCave::
setvaddress MysteryGiftScript_AlteringCave
addvar VAR_ALTERING_CAVE_WILD_SET, 1
- vgoto_if_ne VAR_ALTERING_CAVE_WILD_SET, 10, MysteryGiftScript_AlteringCave_
+ vgoto_if_ne VAR_ALTERING_CAVE_WILD_SET, (NUM_ALTERING_CAVE_TABLES + 1), MysteryGiftScript_AlteringCave_
setvar VAR_ALTERING_CAVE_WILD_SET, 0
MysteryGiftScript_AlteringCave_:
lock
diff --git a/data/scripts/kecleon.inc b/data/scripts/kecleon.inc
index f51dc2fbd2..6345519026 100644
--- a/data/scripts/kecleon.inc
+++ b/data/scripts/kecleon.inc
@@ -71,7 +71,7 @@ EventScript_BattleKecleon::
playmoncry SPECIES_KECLEON, CRY_MODE_ENCOUNTER
delay 40
waitmoncry
- setwildbattle SPECIES_KECLEON, 30, ITEM_NONE
+ setwildbattle SPECIES_KECLEON, 30
setflag FLAG_SYS_CTRL_OBJ_DELETE
dowildbattle
clearflag FLAG_SYS_CTRL_OBJ_DELETE
diff --git a/data/scripts/pc.inc b/data/scripts/pc.inc
index 43c0bca0d7..1993aaf63f 100644
--- a/data/scripts/pc.inc
+++ b/data/scripts/pc.inc
@@ -1,6 +1,6 @@
EventScript_PC::
lockall
- setvar VAR_0x8004, 0
+ setvar VAR_0x8004, PC_LOCATION_OTHER
special DoPCTurnOnEffect
playse SE_PC_ON
msgbox Text_BootUpPC, MSGBOX_DEFAULT
@@ -51,7 +51,7 @@ EventScript_AccessLanettesPC::
return
EventScript_TurnOffPC::
- setvar VAR_0x8004, 0
+ setvar VAR_0x8004, PC_LOCATION_OTHER
playse SE_PC_OFF
special DoPCTurnOffEffect
releaseall
diff --git a/data/scripts/secret_base.inc b/data/scripts/secret_base.inc
index d21bb9aab5..918a9d6301 100644
--- a/data/scripts/secret_base.inc
+++ b/data/scripts/secret_base.inc
@@ -133,7 +133,7 @@ SecretBase_EventScript_InitSecretBase::
closemessage
playse SE_EXIT
setvar VAR_INIT_SECRET_BASE, 0
- setflag FLAG_DECORATION_0
+ setflag FLAG_HIDE_SECRET_BASE_TRAINER
special SetPlayerSecretBase
special EnterSecretBase
setvar VAR_0x8004, 0
@@ -172,14 +172,14 @@ SecretBase_EventScript_Enter::
playse SE_EXIT
special IsCurSecretBaseOwnedByAnotherPlayer
goto_if_eq VAR_RESULT, FALSE, SecretBase_EventScript_EnterPlayersBase
- clearflag FLAG_DECORATION_0
+ clearflag FLAG_HIDE_SECRET_BASE_TRAINER
special EnterSecretBase
setvar VAR_SECRET_BASE_INITIALIZED, 0
waitstate
end
SecretBase_EventScript_EnterPlayersBase::
- setflag FLAG_DECORATION_0
+ setflag FLAG_HIDE_SECRET_BASE_TRAINER
special EnterSecretBase
setvar VAR_SECRET_BASE_INITIALIZED, 0
waitstate
diff --git a/data/tilesets/secondary/battle_frontier_outside_east/anim/flag/0.png b/data/tilesets/secondary/battle_frontier_outside_east/anim/flag/0.png
index b5621be76e..1de3fe7c3d 100644
Binary files a/data/tilesets/secondary/battle_frontier_outside_east/anim/flag/0.png and b/data/tilesets/secondary/battle_frontier_outside_east/anim/flag/0.png differ
diff --git a/data/tilesets/secondary/battle_frontier_outside_east/anim/flag/1.png b/data/tilesets/secondary/battle_frontier_outside_east/anim/flag/1.png
index 56a46ce92a..b9f80f08df 100644
Binary files a/data/tilesets/secondary/battle_frontier_outside_east/anim/flag/1.png and b/data/tilesets/secondary/battle_frontier_outside_east/anim/flag/1.png differ
diff --git a/data/tilesets/secondary/battle_frontier_outside_east/anim/flag/2.png b/data/tilesets/secondary/battle_frontier_outside_east/anim/flag/2.png
index e51f5b5312..a03c965a87 100644
Binary files a/data/tilesets/secondary/battle_frontier_outside_east/anim/flag/2.png and b/data/tilesets/secondary/battle_frontier_outside_east/anim/flag/2.png differ
diff --git a/data/tilesets/secondary/battle_frontier_outside_east/anim/flag/3.png b/data/tilesets/secondary/battle_frontier_outside_east/anim/flag/3.png
index 3ec6ff703c..5bdf19a359 100644
Binary files a/data/tilesets/secondary/battle_frontier_outside_east/anim/flag/3.png and b/data/tilesets/secondary/battle_frontier_outside_east/anim/flag/3.png differ
diff --git a/data/tilesets/secondary/battle_frontier_outside_west/anim/flag/0.png b/data/tilesets/secondary/battle_frontier_outside_west/anim/flag/0.png
index b5621be76e..1de3fe7c3d 100644
Binary files a/data/tilesets/secondary/battle_frontier_outside_west/anim/flag/0.png and b/data/tilesets/secondary/battle_frontier_outside_west/anim/flag/0.png differ
diff --git a/data/tilesets/secondary/battle_frontier_outside_west/anim/flag/1.png b/data/tilesets/secondary/battle_frontier_outside_west/anim/flag/1.png
index 56a46ce92a..b9f80f08df 100644
Binary files a/data/tilesets/secondary/battle_frontier_outside_west/anim/flag/1.png and b/data/tilesets/secondary/battle_frontier_outside_west/anim/flag/1.png differ
diff --git a/data/tilesets/secondary/battle_frontier_outside_west/anim/flag/2.png b/data/tilesets/secondary/battle_frontier_outside_west/anim/flag/2.png
index e51f5b5312..a03c965a87 100644
Binary files a/data/tilesets/secondary/battle_frontier_outside_west/anim/flag/2.png and b/data/tilesets/secondary/battle_frontier_outside_west/anim/flag/2.png differ
diff --git a/data/tilesets/secondary/battle_frontier_outside_west/anim/flag/3.png b/data/tilesets/secondary/battle_frontier_outside_west/anim/flag/3.png
index 3ec6ff703c..5bdf19a359 100644
Binary files a/data/tilesets/secondary/battle_frontier_outside_west/anim/flag/3.png and b/data/tilesets/secondary/battle_frontier_outside_west/anim/flag/3.png differ
diff --git a/data/tilesets/secondary/ever_grande/anim/flowers/0.png b/data/tilesets/secondary/ever_grande/anim/flowers/0.png
index 6493e2e821..ae91986451 100644
Binary files a/data/tilesets/secondary/ever_grande/anim/flowers/0.png and b/data/tilesets/secondary/ever_grande/anim/flowers/0.png differ
diff --git a/data/tilesets/secondary/ever_grande/anim/flowers/1.png b/data/tilesets/secondary/ever_grande/anim/flowers/1.png
index 6493e2e821..ae91986451 100644
Binary files a/data/tilesets/secondary/ever_grande/anim/flowers/1.png and b/data/tilesets/secondary/ever_grande/anim/flowers/1.png differ
diff --git a/data/tilesets/secondary/ever_grande/anim/flowers/2.png b/data/tilesets/secondary/ever_grande/anim/flowers/2.png
index 0b1f568cbf..05b9796370 100644
Binary files a/data/tilesets/secondary/ever_grande/anim/flowers/2.png and b/data/tilesets/secondary/ever_grande/anim/flowers/2.png differ
diff --git a/data/tilesets/secondary/ever_grande/anim/flowers/3.png b/data/tilesets/secondary/ever_grande/anim/flowers/3.png
index edc7220b8f..a4cea04e63 100644
Binary files a/data/tilesets/secondary/ever_grande/anim/flowers/3.png and b/data/tilesets/secondary/ever_grande/anim/flowers/3.png differ
diff --git a/data/tilesets/secondary/ever_grande/anim/flowers/4.png b/data/tilesets/secondary/ever_grande/anim/flowers/4.png
index 6493e2e821..ae91986451 100644
Binary files a/data/tilesets/secondary/ever_grande/anim/flowers/4.png and b/data/tilesets/secondary/ever_grande/anim/flowers/4.png differ
diff --git a/data/tilesets/secondary/ever_grande/anim/flowers/5.png b/data/tilesets/secondary/ever_grande/anim/flowers/5.png
index 6493e2e821..ae91986451 100644
Binary files a/data/tilesets/secondary/ever_grande/anim/flowers/5.png and b/data/tilesets/secondary/ever_grande/anim/flowers/5.png differ
diff --git a/data/tilesets/secondary/ever_grande/anim/flowers/6.png b/data/tilesets/secondary/ever_grande/anim/flowers/6.png
index 4d43dfd0a9..c45b6188cf 100644
Binary files a/data/tilesets/secondary/ever_grande/anim/flowers/6.png and b/data/tilesets/secondary/ever_grande/anim/flowers/6.png differ
diff --git a/data/tilesets/secondary/ever_grande/anim/flowers/7.png b/data/tilesets/secondary/ever_grande/anim/flowers/7.png
index 4d43dfd0a9..c45b6188cf 100644
Binary files a/data/tilesets/secondary/ever_grande/anim/flowers/7.png and b/data/tilesets/secondary/ever_grande/anim/flowers/7.png differ
diff --git a/gflib/bg.c b/gflib/bg.c
index c3a4be1d46..6e97be2073 100644
--- a/gflib/bg.c
+++ b/gflib/bg.c
@@ -776,75 +776,75 @@ void SetBgAffine(u8 bg, s32 srcCenterX, s32 srcCenterY, s16 dispCenterX, s16 dis
SetBgAffineInternal(bg, srcCenterX, srcCenterY, dispCenterX, dispCenterY, scaleX, scaleY, rotationAngle);
}
-u8 Unused_AdjustBgMosaic(u8 a1, u8 a2)
+u8 Unused_AdjustBgMosaic(u8 val, u8 mode)
{
- u16 result = GetGpuReg(REG_OFFSET_MOSAIC);
- s16 test1 = result & 0xF;
- s16 test2 = (result >> 4) & 0xF;
+ u16 mosaic = GetGpuReg(REG_OFFSET_MOSAIC);
+ s16 bgH = mosaic & 0xF;
+ s16 bgV = (mosaic >> 4) & 0xF;
- result &= 0xFF00;
+ mosaic &= 0xFF00; // clear background mosaic sizes
- switch (a2)
+ switch (mode)
{
- case 0:
+ case BG_MOSAIC_SET_HV:
default:
- test1 = a1 & 0xF;
- test2 = a1 >> 0x4;
+ bgH = val & 0xF;
+ bgV = val >> 0x4;
break;
- case 1:
- test1 = a1 & 0xF;
+ case BG_MOSAIC_SET_H:
+ bgH = val & 0xF;
break;
- case 2:
- if ((test1 + a1) > 0xF)
+ case BG_MOSAIC_ADD_H:
+ if ((bgH + val) > 0xF)
{
- test1 = 0xF;
+ bgH = 0xF;
}
else
{
- test1 += a1;
+ bgH += val;
}
break;
- case 3:
- if ((test1 - a1) < 0)
+ case BG_MOSAIC_SUB_H:
+ if ((bgH - val) < 0)
{
- test1 = 0x0;
+ bgH = 0x0;
}
else
{
- test1 -= a1;
+ bgH -= val;
}
break;
- case 4:
- test2 = a1 & 0xF;
+ case BG_MOSAIC_SET_V:
+ bgV = val & 0xF;
break;
- case 5:
- if ((test2 + a1) > 0xF)
+ case BG_MOSAIC_ADD_V:
+ if ((bgV + val) > 0xF)
{
- test2 = 0xF;
+ bgV = 0xF;
}
else
{
- test2 += a1;
+ bgV += val;
}
break;
- case 6:
- if ((test2 - a1) < 0)
+ case BG_MOSAIC_SUB_V:
+ if ((bgV - val) < 0)
{
- test2 = 0x0;
+ bgV = 0x0;
}
else
{
- test2 -= a1;
+ bgV -= val;
}
break;
}
- result |= ((test2 << 0x4) & 0xF0);
- result |= (test1 & 0xF);
+ mosaic |= ((bgV << 0x4) & 0xF0);
+ mosaic |= (bgH & 0xF);
- SetGpuReg(REG_OFFSET_MOSAIC, result);
+ SetGpuReg(REG_OFFSET_MOSAIC, mosaic);
- return result;
+ return mosaic;
}
void SetBgTilemapBuffer(u8 bg, void *tilemap)
@@ -1053,7 +1053,7 @@ void WriteSequenceToBgTilemapBuffer(u8 bg, u16 firstTileNum, u8 x, u8 y, u8 widt
for (x16 = x; x16 < (x + width); x16++)
{
CopyTileMapEntry(&firstTileNum, &((u16*)sGpuBgConfigs2[bg].tilemap)[(u16)GetTileMapIndexFromCoords(x16, y16, attribute, mode, mode2)], paletteSlot, 0, 0);
- firstTileNum = (firstTileNum & (METATILE_COLLISION_MASK | METATILE_ELEVATION_MASK)) + ((firstTileNum + tileNumDelta) & METATILE_ID_MASK);
+ firstTileNum = (firstTileNum & (MAPGRID_COLLISION_MASK | MAPGRID_ELEVATION_MASK)) + ((firstTileNum + tileNumDelta) & MAPGRID_METATILE_ID_MASK);
}
}
break;
@@ -1064,7 +1064,7 @@ void WriteSequenceToBgTilemapBuffer(u8 bg, u16 firstTileNum, u8 x, u8 y, u8 widt
for (x16 = x; x16 < (x + width); x16++)
{
((u8*)sGpuBgConfigs2[bg].tilemap)[(y16 * mode3) + x16] = firstTileNum;
- firstTileNum = (firstTileNum & (METATILE_COLLISION_MASK | METATILE_ELEVATION_MASK)) + ((firstTileNum + tileNumDelta) & METATILE_ID_MASK);
+ firstTileNum = (firstTileNum & (MAPGRID_COLLISION_MASK | MAPGRID_ELEVATION_MASK)) + ((firstTileNum + tileNumDelta) & MAPGRID_METATILE_ID_MASK);
}
}
break;
diff --git a/gflib/bg.h b/gflib/bg.h
index 3a0bf3bf90..d8b5a54043 100644
--- a/gflib/bg.h
+++ b/gflib/bg.h
@@ -28,6 +28,17 @@ enum {
BG_COORD_SUB,
};
+// Modes for Unused_AdjustBgMosaic
+enum {
+ BG_MOSAIC_SET_HV,
+ BG_MOSAIC_SET_H,
+ BG_MOSAIC_ADD_H,
+ BG_MOSAIC_SUB_H,
+ BG_MOSAIC_SET_V,
+ BG_MOSAIC_ADD_V,
+ BG_MOSAIC_SUB_V,
+};
+
struct BgTemplate
{
u16 bg:2; // 0x1, 0x2 -> 0x3
diff --git a/graphics/misc/bag.pal b/graphics/bag/bag.pal
similarity index 100%
rename from graphics/misc/bag.pal
rename to graphics/bag/bag.pal
diff --git a/graphics/misc/bag_female.png b/graphics/bag/bag_female.png
similarity index 100%
rename from graphics/misc/bag_female.png
rename to graphics/bag/bag_female.png
diff --git a/graphics/misc/bag_male.png b/graphics/bag/bag_male.png
similarity index 100%
rename from graphics/misc/bag_male.png
rename to graphics/bag/bag_male.png
diff --git a/graphics/interface/bag_pyramid.pal b/graphics/bag/bag_pyramid.pal
similarity index 100%
rename from graphics/interface/bag_pyramid.pal
rename to graphics/bag/bag_pyramid.pal
diff --git a/graphics/interface/bag_pyramid.png b/graphics/bag/bag_pyramid.png
similarity index 100%
rename from graphics/interface/bag_pyramid.png
rename to graphics/bag/bag_pyramid.png
diff --git a/graphics/interface/berry_tag.bin b/graphics/bag/berry_tag.bin
similarity index 100%
rename from graphics/interface/berry_tag.bin
rename to graphics/bag/berry_tag.bin
diff --git a/graphics/interface/berry_tag_screen.pal b/graphics/bag/berry_tag_screen.pal
similarity index 100%
rename from graphics/interface/berry_tag_screen.pal
rename to graphics/bag/berry_tag_screen.pal
diff --git a/graphics/interface/berry_tag_title.bin b/graphics/bag/berry_tag_title.bin
similarity index 100%
rename from graphics/interface/berry_tag_title.bin
rename to graphics/bag/berry_tag_title.bin
diff --git a/graphics/interface/check_berry.pal b/graphics/bag/check_berry.pal
similarity index 100%
rename from graphics/interface/check_berry.pal
rename to graphics/bag/check_berry.pal
diff --git a/graphics/interface/check_berry.png b/graphics/bag/check_berry.png
similarity index 100%
rename from graphics/interface/check_berry.png
rename to graphics/bag/check_berry.png
diff --git a/graphics/interface/check_berry_circle.png b/graphics/bag/check_berry_circle.png
similarity index 100%
rename from graphics/interface/check_berry_circle.png
rename to graphics/bag/check_berry_circle.png
diff --git a/graphics/interface/hm.png b/graphics/bag/hm.png
similarity index 100%
rename from graphics/interface/hm.png
rename to graphics/bag/hm.png
diff --git a/graphics/interface/bag_screen_tilemap.bin b/graphics/bag/menu.bin
similarity index 100%
rename from graphics/interface/bag_screen_tilemap.bin
rename to graphics/bag/menu.bin
diff --git a/graphics/interface/bag_screen.png b/graphics/bag/menu.png
similarity index 100%
rename from graphics/interface/bag_screen.png
rename to graphics/bag/menu.png
diff --git a/graphics/interface/bag_screen_female.pal b/graphics/bag/menu_female.pal
similarity index 100%
rename from graphics/interface/bag_screen_female.pal
rename to graphics/bag/menu_female.pal
diff --git a/graphics/interface/bag_screen_male.pal b/graphics/bag/menu_male.pal
similarity index 100%
rename from graphics/interface/bag_screen_male.pal
rename to graphics/bag/menu_male.pal
diff --git a/graphics/interface/bag_pyramid_tilemap.bin b/graphics/bag/menu_pyramid.bin
similarity index 100%
rename from graphics/interface/bag_pyramid_tilemap.bin
rename to graphics/bag/menu_pyramid.bin
diff --git a/graphics/interface/bag_pyramid_interface.pal b/graphics/bag/menu_pyramid.pal
similarity index 100%
rename from graphics/interface/bag_pyramid_interface.pal
rename to graphics/bag/menu_pyramid.pal
diff --git a/graphics/interface/bag_spinner.png b/graphics/bag/rotating_ball.png
similarity index 100%
rename from graphics/interface/bag_spinner.png
rename to graphics/bag/rotating_ball.png
diff --git a/graphics/interface/select_button.png b/graphics/bag/select_button.png
similarity index 100%
rename from graphics/interface/select_button.png
rename to graphics/bag/select_button.png
diff --git a/graphics/interface/ball/beast.png b/graphics/balls/beast.png
similarity index 100%
rename from graphics/interface/ball/beast.png
rename to graphics/balls/beast.png
diff --git a/graphics/interface/ball/cherish.png b/graphics/balls/cherish.png
similarity index 100%
rename from graphics/interface/ball/cherish.png
rename to graphics/balls/cherish.png
diff --git a/graphics/interface/ball/dive.png b/graphics/balls/dive.png
similarity index 100%
rename from graphics/interface/ball/dive.png
rename to graphics/balls/dive.png
diff --git a/graphics/interface/ball/dream.png b/graphics/balls/dream.png
similarity index 100%
rename from graphics/interface/ball/dream.png
rename to graphics/balls/dream.png
diff --git a/graphics/interface/ball/dusk.png b/graphics/balls/dusk.png
similarity index 100%
rename from graphics/interface/ball/dusk.png
rename to graphics/balls/dusk.png
diff --git a/graphics/interface/ball/fast.png b/graphics/balls/fast.png
similarity index 100%
rename from graphics/interface/ball/fast.png
rename to graphics/balls/fast.png
diff --git a/graphics/interface/ball/friend.png b/graphics/balls/friend.png
similarity index 100%
rename from graphics/interface/ball/friend.png
rename to graphics/balls/friend.png
diff --git a/graphics/interface/ball/great.png b/graphics/balls/great.png
similarity index 100%
rename from graphics/interface/ball/great.png
rename to graphics/balls/great.png
diff --git a/graphics/interface/ball/heal.png b/graphics/balls/heal.png
similarity index 100%
rename from graphics/interface/ball/heal.png
rename to graphics/balls/heal.png
diff --git a/graphics/interface/ball/heavy.png b/graphics/balls/heavy.png
similarity index 100%
rename from graphics/interface/ball/heavy.png
rename to graphics/balls/heavy.png
diff --git a/graphics/interface/ball/level.png b/graphics/balls/level.png
similarity index 100%
rename from graphics/interface/ball/level.png
rename to graphics/balls/level.png
diff --git a/graphics/interface/ball/love.png b/graphics/balls/love.png
similarity index 100%
rename from graphics/interface/ball/love.png
rename to graphics/balls/love.png
diff --git a/graphics/interface/ball/lure.png b/graphics/balls/lure.png
similarity index 100%
rename from graphics/interface/ball/lure.png
rename to graphics/balls/lure.png
diff --git a/graphics/interface/ball/luxury.png b/graphics/balls/luxury.png
similarity index 100%
rename from graphics/interface/ball/luxury.png
rename to graphics/balls/luxury.png
diff --git a/graphics/interface/ball/master.png b/graphics/balls/master.png
similarity index 100%
rename from graphics/interface/ball/master.png
rename to graphics/balls/master.png
diff --git a/graphics/interface/ball/moon.png b/graphics/balls/moon.png
similarity index 100%
rename from graphics/interface/ball/moon.png
rename to graphics/balls/moon.png
diff --git a/graphics/interface/ball/nest.png b/graphics/balls/nest.png
similarity index 100%
rename from graphics/interface/ball/nest.png
rename to graphics/balls/nest.png
diff --git a/graphics/interface/ball/net.png b/graphics/balls/net.png
similarity index 100%
rename from graphics/interface/ball/net.png
rename to graphics/balls/net.png
diff --git a/graphics/interface/ball_open.png b/graphics/balls/open.png
similarity index 100%
rename from graphics/interface/ball_open.png
rename to graphics/balls/open.png
diff --git a/graphics/interface/ball/park.png b/graphics/balls/park.png
similarity index 100%
rename from graphics/interface/ball/park.png
rename to graphics/balls/park.png
diff --git a/graphics/interface/ball/poke.png b/graphics/balls/poke.png
similarity index 100%
rename from graphics/interface/ball/poke.png
rename to graphics/balls/poke.png
diff --git a/graphics/interface/ball/premier.png b/graphics/balls/premier.png
similarity index 100%
rename from graphics/interface/ball/premier.png
rename to graphics/balls/premier.png
diff --git a/graphics/interface/ball/quick.png b/graphics/balls/quick.png
similarity index 100%
rename from graphics/interface/ball/quick.png
rename to graphics/balls/quick.png
diff --git a/graphics/interface/ball/repeat.png b/graphics/balls/repeat.png
similarity index 100%
rename from graphics/interface/ball/repeat.png
rename to graphics/balls/repeat.png
diff --git a/graphics/interface/ball/safari.png b/graphics/balls/safari.png
similarity index 100%
rename from graphics/interface/ball/safari.png
rename to graphics/balls/safari.png
diff --git a/graphics/interface/ball/sport.png b/graphics/balls/sport.png
similarity index 100%
rename from graphics/interface/ball/sport.png
rename to graphics/balls/sport.png
diff --git a/graphics/interface/ball/timer.png b/graphics/balls/timer.png
similarity index 100%
rename from graphics/interface/ball/timer.png
rename to graphics/balls/timer.png
diff --git a/graphics/interface/ball/ultra.png b/graphics/balls/ultra.png
similarity index 100%
rename from graphics/interface/ball/ultra.png
rename to graphics/balls/ultra.png
diff --git a/graphics/interface/ball/particles2.png b/graphics/battle_anims/sprites/particles2.png
similarity index 100%
rename from graphics/interface/ball/particles2.png
rename to graphics/battle_anims/sprites/particles2.png
diff --git a/graphics/battle_frontier/tourney_line_mask_map.bin b/graphics/battle_frontier/tourney_tree.bin
similarity index 100%
rename from graphics/battle_frontier/tourney_line_mask_map.bin
rename to graphics/battle_frontier/tourney_tree.bin
diff --git a/graphics/battle_frontier/tourney_bg.png b/graphics/battle_frontier/tourney_tree.png
similarity index 100%
rename from graphics/battle_frontier/tourney_bg.png
rename to graphics/battle_frontier/tourney_tree.png
diff --git a/graphics/battle_interface/ability_pop_up.png b/graphics/battle_interface/ability_pop_up.png
index 4b549b1b53..92971a7a51 100644
Binary files a/graphics/battle_interface/ability_pop_up.png and b/graphics/battle_interface/ability_pop_up.png differ
diff --git a/graphics/interface/hpbar_anim.png b/graphics/battle_interface/hpbar_anim_unused.png
similarity index 100%
rename from graphics/interface/hpbar_anim.png
rename to graphics/battle_interface/hpbar_anim_unused.png
diff --git a/graphics/interface/party_menu_hpbar.png b/graphics/battle_interface/hpbar_unused.png
similarity index 100%
rename from graphics/interface/party_menu_hpbar.png
rename to graphics/battle_interface/hpbar_unused.png
diff --git a/graphics/interface/numbers1.png b/graphics/battle_interface/numbers1.png
similarity index 100%
rename from graphics/interface/numbers1.png
rename to graphics/battle_interface/numbers1.png
diff --git a/graphics/interface/numbers2.png b/graphics/battle_interface/numbers2.png
similarity index 100%
rename from graphics/interface/numbers2.png
rename to graphics/battle_interface/numbers2.png
diff --git a/graphics/battle_frontier/text_pp.pal b/graphics/battle_interface/text_pp.pal
similarity index 100%
rename from graphics/battle_frontier/text_pp.pal
rename to graphics/battle_interface/text_pp.pal
diff --git a/graphics/berry_crush/crusher.bin b/graphics/berry_crush/text_windows.bin
similarity index 100%
rename from graphics/berry_crush/crusher.bin
rename to graphics/berry_crush/text_windows.bin
diff --git a/graphics/unused/intro_birch_beauty.png b/graphics/birch_speech/unused_beauty.png
similarity index 100%
rename from graphics/unused/intro_birch_beauty.png
rename to graphics/birch_speech/unused_beauty.png
diff --git a/graphics/misc/cave_transition_black.pal b/graphics/cave_transition/black.pal
similarity index 100%
rename from graphics/misc/cave_transition_black.pal
rename to graphics/cave_transition/black.pal
diff --git a/graphics/misc/cave_transition_enter.pal b/graphics/cave_transition/enter.pal
similarity index 100%
rename from graphics/misc/cave_transition_enter.pal
rename to graphics/cave_transition/enter.pal
diff --git a/graphics/misc/cave_transition_exit.pal b/graphics/cave_transition/exit.pal
similarity index 100%
rename from graphics/misc/cave_transition_exit.pal
rename to graphics/cave_transition/exit.pal
diff --git a/graphics/misc/cave_transition_map.bin b/graphics/cave_transition/tilemap.bin
similarity index 100%
rename from graphics/misc/cave_transition_map.bin
rename to graphics/cave_transition/tilemap.bin
diff --git a/graphics/misc/cave_transition.png b/graphics/cave_transition/tiles.png
similarity index 100%
rename from graphics/misc/cave_transition.png
rename to graphics/cave_transition/tiles.png
diff --git a/graphics/misc/cave_transition_white.pal b/graphics/cave_transition/white.pal
similarity index 100%
rename from graphics/misc/cave_transition_white.pal
rename to graphics/cave_transition/white.pal
diff --git a/graphics/contest/unused_tilemap_2.bin b/graphics/contest/japanese/audience.bin
similarity index 100%
rename from graphics/contest/unused_tilemap_2.bin
rename to graphics/contest/japanese/audience.bin
diff --git a/graphics/contest/japanese/tilemap_1.bin b/graphics/contest/japanese/bg.bin
similarity index 100%
rename from graphics/contest/japanese/tilemap_1.bin
rename to graphics/contest/japanese/bg.bin
diff --git a/graphics/contest/unused_tilemap_1.bin b/graphics/contest/japanese/interface.bin
similarity index 100%
rename from graphics/contest/unused_tilemap_1.bin
rename to graphics/contest/japanese/interface.bin
diff --git a/graphics/contest/japanese/tilemap_2.bin b/graphics/contest/japanese/windows.bin
similarity index 100%
rename from graphics/contest/japanese/tilemap_2.bin
rename to graphics/contest/japanese/windows.bin
diff --git a/graphics/misc/decoration_putting_away_cursor.png b/graphics/decorations/put_away_cursor.png
similarity index 100%
rename from graphics/misc/decoration_putting_away_cursor.png
rename to graphics/decorations/put_away_cursor.png
diff --git a/graphics/misc/diploma_hoenn.pal b/graphics/diploma/hoenn.pal
similarity index 100%
rename from graphics/misc/diploma_hoenn.pal
rename to graphics/diploma/hoenn.pal
diff --git a/graphics/misc/diploma_national.pal b/graphics/diploma/national.pal
similarity index 100%
rename from graphics/misc/diploma_national.pal
rename to graphics/diploma/national.pal
diff --git a/graphics/misc/diploma_map.bin b/graphics/diploma/tilemap.bin
similarity index 100%
rename from graphics/misc/diploma_map.bin
rename to graphics/diploma/tilemap.bin
diff --git a/graphics/misc/diploma.png b/graphics/diploma/tiles.png
similarity index 100%
rename from graphics/misc/diploma.png
rename to graphics/diploma/tiles.png
diff --git a/graphics/misc/deoxys1.pal b/graphics/field_effects/palettes/deoxys_rock_1.pal
similarity index 100%
rename from graphics/misc/deoxys1.pal
rename to graphics/field_effects/palettes/deoxys_rock_1.pal
diff --git a/graphics/misc/deoxys10.pal b/graphics/field_effects/palettes/deoxys_rock_10.pal
similarity index 100%
rename from graphics/misc/deoxys10.pal
rename to graphics/field_effects/palettes/deoxys_rock_10.pal
diff --git a/graphics/misc/deoxys11.pal b/graphics/field_effects/palettes/deoxys_rock_11.pal
similarity index 100%
rename from graphics/misc/deoxys11.pal
rename to graphics/field_effects/palettes/deoxys_rock_11.pal
diff --git a/graphics/misc/deoxys2.pal b/graphics/field_effects/palettes/deoxys_rock_2.pal
similarity index 100%
rename from graphics/misc/deoxys2.pal
rename to graphics/field_effects/palettes/deoxys_rock_2.pal
diff --git a/graphics/misc/deoxys3.pal b/graphics/field_effects/palettes/deoxys_rock_3.pal
similarity index 100%
rename from graphics/misc/deoxys3.pal
rename to graphics/field_effects/palettes/deoxys_rock_3.pal
diff --git a/graphics/misc/deoxys4.pal b/graphics/field_effects/palettes/deoxys_rock_4.pal
similarity index 100%
rename from graphics/misc/deoxys4.pal
rename to graphics/field_effects/palettes/deoxys_rock_4.pal
diff --git a/graphics/misc/deoxys5.pal b/graphics/field_effects/palettes/deoxys_rock_5.pal
similarity index 100%
rename from graphics/misc/deoxys5.pal
rename to graphics/field_effects/palettes/deoxys_rock_5.pal
diff --git a/graphics/misc/deoxys6.pal b/graphics/field_effects/palettes/deoxys_rock_6.pal
similarity index 100%
rename from graphics/misc/deoxys6.pal
rename to graphics/field_effects/palettes/deoxys_rock_6.pal
diff --git a/graphics/misc/deoxys7.pal b/graphics/field_effects/palettes/deoxys_rock_7.pal
similarity index 100%
rename from graphics/misc/deoxys7.pal
rename to graphics/field_effects/palettes/deoxys_rock_7.pal
diff --git a/graphics/misc/deoxys8.pal b/graphics/field_effects/palettes/deoxys_rock_8.pal
similarity index 100%
rename from graphics/misc/deoxys8.pal
rename to graphics/field_effects/palettes/deoxys_rock_8.pal
diff --git a/graphics/misc/deoxys9.pal b/graphics/field_effects/palettes/deoxys_rock_9.pal
similarity index 100%
rename from graphics/misc/deoxys9.pal
rename to graphics/field_effects/palettes/deoxys_rock_9.pal
diff --git a/graphics/field_effects/pics/deoxys_rock_fragment_bottom_left.png b/graphics/field_effects/pics/deoxys_rock_fragment_bottom_left.png
new file mode 100644
index 0000000000..bc4f27a40d
Binary files /dev/null and b/graphics/field_effects/pics/deoxys_rock_fragment_bottom_left.png differ
diff --git a/graphics/field_effects/pics/deoxys_rock_fragment_bottom_right.png b/graphics/field_effects/pics/deoxys_rock_fragment_bottom_right.png
new file mode 100644
index 0000000000..48cd43d973
Binary files /dev/null and b/graphics/field_effects/pics/deoxys_rock_fragment_bottom_right.png differ
diff --git a/graphics/field_effects/pics/deoxys_rock_fragment_top_left.png b/graphics/field_effects/pics/deoxys_rock_fragment_top_left.png
new file mode 100644
index 0000000000..f0eb9c0cb9
Binary files /dev/null and b/graphics/field_effects/pics/deoxys_rock_fragment_top_left.png differ
diff --git a/graphics/field_effects/pics/deoxys_rock_fragment_top_right.png b/graphics/field_effects/pics/deoxys_rock_fragment_top_right.png
new file mode 100644
index 0000000000..1fac486c90
Binary files /dev/null and b/graphics/field_effects/pics/deoxys_rock_fragment_top_right.png differ
diff --git a/graphics/field_effects/pics/emotion_exclamation.png b/graphics/field_effects/pics/emotion_exclamation.png
new file mode 100644
index 0000000000..798b830923
Binary files /dev/null and b/graphics/field_effects/pics/emotion_exclamation.png differ
diff --git a/graphics/field_effects/pics/emotion_heart.png b/graphics/field_effects/pics/emotion_heart.png
new file mode 100644
index 0000000000..783a1e3bd6
Binary files /dev/null and b/graphics/field_effects/pics/emotion_heart.png differ
diff --git a/graphics/field_effects/pics/emotion_question.png b/graphics/field_effects/pics/emotion_question.png
new file mode 100644
index 0000000000..4907f14b7f
Binary files /dev/null and b/graphics/field_effects/pics/emotion_question.png differ
diff --git a/graphics/misc/field_move_streaks_map.bin b/graphics/field_effects/pics/field_move_streaks.bin
similarity index 100%
rename from graphics/misc/field_move_streaks_map.bin
rename to graphics/field_effects/pics/field_move_streaks.bin
diff --git a/graphics/misc/field_move_streaks.png b/graphics/field_effects/pics/field_move_streaks.png
similarity index 100%
rename from graphics/misc/field_move_streaks.png
rename to graphics/field_effects/pics/field_move_streaks.png
diff --git a/graphics/misc/darkness_field_move_streaks_map.bin b/graphics/field_effects/pics/field_move_streaks_indoors.bin
similarity index 100%
rename from graphics/misc/darkness_field_move_streaks_map.bin
rename to graphics/field_effects/pics/field_move_streaks_indoors.bin
diff --git a/graphics/misc/darkness_field_move_streaks.png b/graphics/field_effects/pics/field_move_streaks_indoors.png
similarity index 100%
rename from graphics/misc/darkness_field_move_streaks.png
rename to graphics/field_effects/pics/field_move_streaks_indoors.png
diff --git a/graphics/field_effects/pics/hof_monitor_big.png b/graphics/field_effects/pics/hof_monitor_big.png
new file mode 100644
index 0000000000..c70046ad71
Binary files /dev/null and b/graphics/field_effects/pics/hof_monitor_big.png differ
diff --git a/graphics/field_effects/pics/hof_monitor_small.png b/graphics/field_effects/pics/hof_monitor_small.png
new file mode 100644
index 0000000000..368bbfce42
Binary files /dev/null and b/graphics/field_effects/pics/hof_monitor_small.png differ
diff --git a/graphics/field_effects/pics/pokeball_glow.png b/graphics/field_effects/pics/pokeball_glow.png
new file mode 100644
index 0000000000..6e074afc3f
Binary files /dev/null and b/graphics/field_effects/pics/pokeball_glow.png differ
diff --git a/graphics/misc/pokecenter_monitor/0.png b/graphics/field_effects/pics/pokecenter_monitor/0.png
similarity index 100%
rename from graphics/misc/pokecenter_monitor/0.png
rename to graphics/field_effects/pics/pokecenter_monitor/0.png
diff --git a/graphics/misc/pokecenter_monitor/1.png b/graphics/field_effects/pics/pokecenter_monitor/1.png
similarity index 100%
rename from graphics/misc/pokecenter_monitor/1.png
rename to graphics/field_effects/pics/pokecenter_monitor/1.png
diff --git a/graphics/misc/spotlight.png b/graphics/field_effects/pics/spotlight.png
similarity index 100%
rename from graphics/misc/spotlight.png
rename to graphics/field_effects/pics/spotlight.png
diff --git a/graphics/frontier_pass/unused.bin b/graphics/frontier_pass/card_ball_filled.bin
similarity index 100%
rename from graphics/frontier_pass/unused.bin
rename to graphics/frontier_pass/card_ball_filled.bin
diff --git a/graphics/misc/main_menu_bg.pal b/graphics/interface/main_menu_bg.pal
similarity index 100%
rename from graphics/misc/main_menu_bg.pal
rename to graphics/interface/main_menu_bg.pal
diff --git a/graphics/misc/main_menu_text.pal b/graphics/interface/main_menu_text.pal
similarity index 100%
rename from graphics/misc/main_menu_text.pal
rename to graphics/interface/main_menu_text.pal
diff --git a/graphics/misc/mon_markings.png b/graphics/interface/mon_markings.png
similarity index 100%
rename from graphics/misc/mon_markings.png
rename to graphics/interface/mon_markings.png
diff --git a/graphics/misc/mon_markings_menu.png b/graphics/interface/mon_markings_menu.png
similarity index 100%
rename from graphics/misc/mon_markings_menu.png
rename to graphics/interface/mon_markings_menu.png
diff --git a/graphics/misc/option_menu_equals_sign.png b/graphics/interface/option_menu_equals_sign.png
similarity index 100%
rename from graphics/misc/option_menu_equals_sign.png
rename to graphics/interface/option_menu_equals_sign.png
diff --git a/graphics/misc/option_menu_text.pal b/graphics/interface/option_menu_text.pal
similarity index 100%
rename from graphics/misc/option_menu_text.pal
rename to graphics/interface/option_menu_text.pal
diff --git a/graphics/interface/bag_swap.png b/graphics/interface/swap_line.png
similarity index 100%
rename from graphics/interface/bag_swap.png
rename to graphics/interface/swap_line.png
diff --git a/graphics/minigame_countdown/321start.png b/graphics/link/321start.png
similarity index 100%
rename from graphics/minigame_countdown/321start.png
rename to graphics/link/321start.png
diff --git a/graphics/minigame_countdown/321start_static.png b/graphics/link/321start_static.png
similarity index 100%
rename from graphics/minigame_countdown/321start_static.png
rename to graphics/link/321start_static.png
diff --git a/graphics/interface/comm_error_bg.png b/graphics/link/comm_error_bg.png
similarity index 100%
rename from graphics/interface/comm_error_bg.png
rename to graphics/link/comm_error_bg.png
diff --git a/graphics/interface/link_test_digits.png b/graphics/link/test_digits.png
similarity index 100%
rename from graphics/interface/link_test_digits.png
rename to graphics/link/test_digits.png
diff --git a/graphics/interface/wireless_link_display.bin b/graphics/link/wireless_display.bin
similarity index 100%
rename from graphics/interface/wireless_link_display.bin
rename to graphics/link/wireless_display.bin
diff --git a/graphics/interface/wireless_link_display.png b/graphics/link/wireless_display.png
similarity index 100%
rename from graphics/interface/wireless_link_display.png
rename to graphics/link/wireless_display.png
diff --git a/graphics/interface/wireless_link_icon.png b/graphics/link/wireless_icon.png
similarity index 100%
rename from graphics/interface/wireless_link_icon.png
rename to graphics/link/wireless_icon.png
diff --git a/graphics/interface/wireless_info_screen.bin b/graphics/link/wireless_info_screen.bin
similarity index 100%
rename from graphics/interface/wireless_info_screen.bin
rename to graphics/link/wireless_info_screen.bin
diff --git a/graphics/interface/wireless_info_screen.pal b/graphics/link/wireless_info_screen.pal
similarity index 100%
rename from graphics/interface/wireless_info_screen.pal
rename to graphics/link/wireless_info_screen.pal
diff --git a/graphics/interface/wireless_info_screen.png b/graphics/link/wireless_info_screen.png
similarity index 100%
rename from graphics/interface/wireless_info_screen.png
rename to graphics/link/wireless_info_screen.png
diff --git a/graphics/interface/map_popup/brick.png b/graphics/map_popup/brick.png
similarity index 100%
rename from graphics/interface/map_popup/brick.png
rename to graphics/map_popup/brick.png
diff --git a/graphics/interface/map_popup/brick_outline.png b/graphics/map_popup/brick_outline.png
similarity index 100%
rename from graphics/interface/map_popup/brick_outline.png
rename to graphics/map_popup/brick_outline.png
diff --git a/graphics/interface/map_popup/marble.png b/graphics/map_popup/marble.png
similarity index 100%
rename from graphics/interface/map_popup/marble.png
rename to graphics/map_popup/marble.png
diff --git a/graphics/interface/map_popup/marble_outline.png b/graphics/map_popup/marble_outline.png
similarity index 100%
rename from graphics/interface/map_popup/marble_outline.png
rename to graphics/map_popup/marble_outline.png
diff --git a/graphics/interface/map_popup/stone.png b/graphics/map_popup/stone.png
similarity index 100%
rename from graphics/interface/map_popup/stone.png
rename to graphics/map_popup/stone.png
diff --git a/graphics/interface/map_popup/stone2.png b/graphics/map_popup/stone2.png
similarity index 100%
rename from graphics/interface/map_popup/stone2.png
rename to graphics/map_popup/stone2.png
diff --git a/graphics/interface/map_popup/stone2_outline.png b/graphics/map_popup/stone2_outline.png
similarity index 100%
rename from graphics/interface/map_popup/stone2_outline.png
rename to graphics/map_popup/stone2_outline.png
diff --git a/graphics/interface/map_popup/stone_outline.png b/graphics/map_popup/stone_outline.png
similarity index 100%
rename from graphics/interface/map_popup/stone_outline.png
rename to graphics/map_popup/stone_outline.png
diff --git a/graphics/interface/map_popup/underwater.pal b/graphics/map_popup/underwater.pal
similarity index 100%
rename from graphics/interface/map_popup/underwater.pal
rename to graphics/map_popup/underwater.pal
diff --git a/graphics/interface/map_popup/underwater.png b/graphics/map_popup/underwater.png
similarity index 100%
rename from graphics/interface/map_popup/underwater.png
rename to graphics/map_popup/underwater.png
diff --git a/graphics/interface/map_popup/underwater_outline.png b/graphics/map_popup/underwater_outline.png
similarity index 100%
rename from graphics/interface/map_popup/underwater_outline.png
rename to graphics/map_popup/underwater_outline.png
diff --git a/graphics/interface/map_popup/wood.png b/graphics/map_popup/wood.png
similarity index 100%
rename from graphics/interface/map_popup/wood.png
rename to graphics/map_popup/wood.png
diff --git a/graphics/interface/map_popup/wood_outline.png b/graphics/map_popup/wood_outline.png
similarity index 100%
rename from graphics/interface/map_popup/wood_outline.png
rename to graphics/map_popup/wood_outline.png
diff --git a/graphics/misc/deoxys_rock_fragment_bottom_left.png b/graphics/misc/deoxys_rock_fragment_bottom_left.png
deleted file mode 100644
index 3f5b8d5c39..0000000000
Binary files a/graphics/misc/deoxys_rock_fragment_bottom_left.png and /dev/null differ
diff --git a/graphics/misc/deoxys_rock_fragment_bottom_right.png b/graphics/misc/deoxys_rock_fragment_bottom_right.png
deleted file mode 100644
index 7684451e49..0000000000
Binary files a/graphics/misc/deoxys_rock_fragment_bottom_right.png and /dev/null differ
diff --git a/graphics/misc/deoxys_rock_fragment_top_left.png b/graphics/misc/deoxys_rock_fragment_top_left.png
deleted file mode 100644
index d601cb6e54..0000000000
Binary files a/graphics/misc/deoxys_rock_fragment_top_left.png and /dev/null differ
diff --git a/graphics/misc/deoxys_rock_fragment_top_right.png b/graphics/misc/deoxys_rock_fragment_top_right.png
deleted file mode 100644
index 01f10cd07b..0000000000
Binary files a/graphics/misc/deoxys_rock_fragment_top_right.png and /dev/null differ
diff --git a/graphics/misc/emotion_exclamation.png b/graphics/misc/emotion_exclamation.png
deleted file mode 100644
index 595566d2fe..0000000000
Binary files a/graphics/misc/emotion_exclamation.png and /dev/null differ
diff --git a/graphics/misc/emotion_heart.png b/graphics/misc/emotion_heart.png
deleted file mode 100644
index 9995984b4c..0000000000
Binary files a/graphics/misc/emotion_heart.png and /dev/null differ
diff --git a/graphics/misc/emotion_question.png b/graphics/misc/emotion_question.png
deleted file mode 100644
index 7376fd058e..0000000000
Binary files a/graphics/misc/emotion_question.png and /dev/null differ
diff --git a/graphics/misc/hof_monitor_big.png b/graphics/misc/hof_monitor_big.png
deleted file mode 100644
index 510e6a232d..0000000000
Binary files a/graphics/misc/hof_monitor_big.png and /dev/null differ
diff --git a/graphics/misc/hof_monitor_small.png b/graphics/misc/hof_monitor_small.png
deleted file mode 100644
index dcff330952..0000000000
Binary files a/graphics/misc/hof_monitor_small.png and /dev/null differ
diff --git a/graphics/misc/pokeball_glow.png b/graphics/misc/pokeball_glow.png
deleted file mode 100644
index 1c1133b769..0000000000
Binary files a/graphics/misc/pokeball_glow.png and /dev/null differ
diff --git a/graphics/interface/party_menu_bg.bin b/graphics/party_menu/bg.bin
similarity index 100%
rename from graphics/interface/party_menu_bg.bin
rename to graphics/party_menu/bg.bin
diff --git a/graphics/interface/party_menu_bg.pal b/graphics/party_menu/bg.pal
similarity index 100%
rename from graphics/interface/party_menu_bg.pal
rename to graphics/party_menu/bg.pal
diff --git a/graphics/interface/party_menu_bg.png b/graphics/party_menu/bg.png
similarity index 100%
rename from graphics/interface/party_menu_bg.png
rename to graphics/party_menu/bg.png
diff --git a/graphics/interface/party_menu_cancel_button.bin b/graphics/party_menu/cancel_button.bin
similarity index 100%
rename from graphics/interface/party_menu_cancel_button.bin
rename to graphics/party_menu/cancel_button.bin
diff --git a/graphics/interface/party_menu_confirm_button.bin b/graphics/party_menu/confirm_button.bin
similarity index 100%
rename from graphics/interface/party_menu_confirm_button.bin
rename to graphics/party_menu/confirm_button.bin
diff --git a/graphics/interface/hold_icons.png b/graphics/party_menu/hold_icons.png
similarity index 100%
rename from graphics/interface/hold_icons.png
rename to graphics/party_menu/hold_icons.png
diff --git a/graphics/interface/party_menu_pokeball.png b/graphics/party_menu/pokeball.png
similarity index 100%
rename from graphics/interface/party_menu_pokeball.png
rename to graphics/party_menu/pokeball.png
diff --git a/graphics/interface/party_menu_pokeball_small.png b/graphics/party_menu/pokeball_small.png
similarity index 100%
rename from graphics/interface/party_menu_pokeball_small.png
rename to graphics/party_menu/pokeball_small.png
diff --git a/graphics/party_menu/slot_main.bin b/graphics/party_menu/slot_main.bin
new file mode 100755
index 0000000000..2f3e729f6d
--- /dev/null
+++ b/graphics/party_menu/slot_main.bin
@@ -0,0 +1 @@
+ !!!!!!!!" !!!!!!!!" !!!!!!!!"(;<::::::=.////////0
\ No newline at end of file
diff --git a/graphics/party_menu/slot_main_no_hp.bin b/graphics/party_menu/slot_main_no_hp.bin
new file mode 100755
index 0000000000..653ad1a64b
--- /dev/null
+++ b/graphics/party_menu/slot_main_no_hp.bin
@@ -0,0 +1 @@
+ !!!!!!!!" !!!!!!!!" !!!!!!!!"())))))))*.////////0
\ No newline at end of file
diff --git a/graphics/party_menu/slot_wide.bin b/graphics/party_menu/slot_wide.bin
new file mode 100755
index 0000000000..c88b73bf78
--- /dev/null
+++ b/graphics/party_menu/slot_wide.bin
@@ -0,0 +1 @@
++,,,,,,,,,,,,,,,,-1!!!!!!!!453333336788888888888888889
\ No newline at end of file
diff --git a/graphics/party_menu/slot_wide_empty.bin b/graphics/party_menu/slot_wide_empty.bin
new file mode 100755
index 0000000000..3592178b3f
Binary files /dev/null and b/graphics/party_menu/slot_wide_empty.bin differ
diff --git a/graphics/party_menu/slot_wide_no_hp.bin b/graphics/party_menu/slot_wide_no_hp.bin
new file mode 100755
index 0000000000..8f662da0ae
--- /dev/null
+++ b/graphics/party_menu/slot_wide_no_hp.bin
@@ -0,0 +1 @@
++,,,,,,,,,,,,,,,,-1!!!!!!!!!!!!!!!!2788888888888888889
\ No newline at end of file
diff --git a/graphics/interface/pokeblock_device.png b/graphics/pokeblock/device.png
similarity index 100%
rename from graphics/interface/pokeblock_device.png
rename to graphics/pokeblock/device.png
diff --git a/graphics/interface/pokeblock_feeding_bg_map.bin b/graphics/pokeblock/feeding_bg.bin
similarity index 100%
rename from graphics/interface/pokeblock_feeding_bg_map.bin
rename to graphics/pokeblock/feeding_bg.bin
diff --git a/graphics/interface/pokeblock.bin b/graphics/pokeblock/menu.bin
similarity index 100%
rename from graphics/interface/pokeblock.bin
rename to graphics/pokeblock/menu.bin
diff --git a/graphics/interface/pokeblock_case_frame.pal b/graphics/pokeblock/menu.pal
similarity index 100%
rename from graphics/interface/pokeblock_case_frame.pal
rename to graphics/pokeblock/menu.pal
diff --git a/graphics/interface/pokeblock_case_frame.png b/graphics/pokeblock/menu.png
similarity index 100%
rename from graphics/interface/pokeblock_case_frame.png
rename to graphics/pokeblock/menu.png
diff --git a/graphics/interface/region_map.bin b/graphics/pokedex/region_map.bin
similarity index 100%
rename from graphics/interface/region_map.bin
rename to graphics/pokedex/region_map.bin
diff --git a/graphics/interface/region_map.pal b/graphics/pokedex/region_map.pal
similarity index 100%
rename from graphics/interface/region_map.pal
rename to graphics/pokedex/region_map.pal
diff --git a/graphics/interface/region_map.png b/graphics/pokedex/region_map.png
similarity index 100%
rename from graphics/interface/region_map.png
rename to graphics/pokedex/region_map.png
diff --git a/graphics/interface/region_map_affine.bin b/graphics/pokedex/region_map_affine.bin
similarity index 100%
rename from graphics/interface/region_map_affine.bin
rename to graphics/pokedex/region_map_affine.bin
diff --git a/graphics/interface/region_map_affine.png b/graphics/pokedex/region_map_affine.png
similarity index 100%
rename from graphics/interface/region_map_affine.png
rename to graphics/pokedex/region_map_affine.png
diff --git a/graphics/pokemon_storage/close_box_button.bin b/graphics/pokemon_storage/close_box_button.bin
new file mode 100755
index 0000000000..8b130a4818
--- /dev/null
+++ b/graphics/pokemon_storage/close_box_button.bin
@@ -0,0 +1 @@
+LMNOpqrst\]^_uvwxyz{|}
\ No newline at end of file
diff --git a/graphics/pokemon_storage/party_slot_empty.bin b/graphics/pokemon_storage/party_slot_empty.bin
new file mode 100755
index 0000000000..991c232f73
--- /dev/null
+++ b/graphics/pokemon_storage/party_slot_empty.bin
@@ -0,0 +1 @@
+CDDESTTUcdde
\ No newline at end of file
diff --git a/graphics/pokemon_storage/party_slot_filled.bin b/graphics/pokemon_storage/party_slot_filled.bin
new file mode 100755
index 0000000000..c0b93bf145
--- /dev/null
+++ b/graphics/pokemon_storage/party_slot_filled.bin
@@ -0,0 +1 @@
+@AABPQQR`aab
\ No newline at end of file
diff --git a/graphics/pokemon_storage/pkmn_data.bin b/graphics/pokemon_storage/pkmn_data.bin
new file mode 100755
index 0000000000..3336797aac
--- /dev/null
+++ b/graphics/pokemon_storage/pkmn_data.bin
@@ -0,0 +1 @@
+!!!!!!!!!!!!!!!!
\ No newline at end of file
diff --git a/graphics/pokemon_storage/unknown.pal b/graphics/pokemon_storage/text_windows.pal
similarity index 100%
rename from graphics/pokemon_storage/unknown.pal
rename to graphics/pokemon_storage/text_windows.pal
diff --git a/graphics/misc/rotating_gate_1.png b/graphics/rotating_gates/l1.png
similarity index 100%
rename from graphics/misc/rotating_gate_1.png
rename to graphics/rotating_gates/l1.png
diff --git a/graphics/misc/rotating_gate_2.png b/graphics/rotating_gates/l2.png
similarity index 100%
rename from graphics/misc/rotating_gate_2.png
rename to graphics/rotating_gates/l2.png
diff --git a/graphics/misc/rotating_gate_3.png b/graphics/rotating_gates/l3.png
similarity index 100%
rename from graphics/misc/rotating_gate_3.png
rename to graphics/rotating_gates/l3.png
diff --git a/graphics/misc/rotating_gate_4.png b/graphics/rotating_gates/l4.png
similarity index 100%
rename from graphics/misc/rotating_gate_4.png
rename to graphics/rotating_gates/l4.png
diff --git a/graphics/misc/rotating_gate_5.png b/graphics/rotating_gates/t1.png
similarity index 100%
rename from graphics/misc/rotating_gate_5.png
rename to graphics/rotating_gates/t1.png
diff --git a/graphics/misc/rotating_gate_6.png b/graphics/rotating_gates/t2.png
similarity index 100%
rename from graphics/misc/rotating_gate_6.png
rename to graphics/rotating_gates/t2.png
diff --git a/graphics/misc/rotating_gate_7.png b/graphics/rotating_gates/t3.png
similarity index 100%
rename from graphics/misc/rotating_gate_7.png
rename to graphics/rotating_gates/t3.png
diff --git a/graphics/misc/rotating_gate_8.png b/graphics/rotating_gates/t4.png
similarity index 100%
rename from graphics/misc/rotating_gate_8.png
rename to graphics/rotating_gates/t4.png
diff --git a/graphics/interface/mart_frame.bin b/graphics/shop/menu.bin
similarity index 100%
rename from graphics/interface/mart_frame.bin
rename to graphics/shop/menu.bin
diff --git a/graphics/interface/mart_frame.png b/graphics/shop/menu.png
similarity index 100%
rename from graphics/interface/mart_frame.png
rename to graphics/shop/menu.png
diff --git a/graphics/interface/money.png b/graphics/shop/money.png
similarity index 100%
rename from graphics/interface/money.png
rename to graphics/shop/money.png
diff --git a/graphics/slot_machine/85A8524.bin b/graphics/slot_machine/85A8524.bin
deleted file mode 100644
index 0325642780..0000000000
Binary files a/graphics/slot_machine/85A8524.bin and /dev/null differ
diff --git a/graphics/misc/birch_bag_map.bin b/graphics/starter_choose/birch_bag.bin
similarity index 100%
rename from graphics/misc/birch_bag_map.bin
rename to graphics/starter_choose/birch_bag.bin
diff --git a/graphics/misc/birch_bag.png b/graphics/starter_choose/birch_bag.png
similarity index 100%
rename from graphics/misc/birch_bag.png
rename to graphics/starter_choose/birch_bag.png
diff --git a/graphics/misc/birch_grass_map.bin b/graphics/starter_choose/birch_grass.bin
similarity index 100%
rename from graphics/misc/birch_grass_map.bin
rename to graphics/starter_choose/birch_grass.bin
diff --git a/graphics/misc/birch_grass.png b/graphics/starter_choose/birch_grass.png
similarity index 100%
rename from graphics/misc/birch_grass.png
rename to graphics/starter_choose/birch_grass.png
diff --git a/graphics/misc/pokeball_selection.png b/graphics/starter_choose/pokeball_selection.png
similarity index 100%
rename from graphics/misc/pokeball_selection.png
rename to graphics/starter_choose/pokeball_selection.png
diff --git a/graphics/misc/starter_circle.png b/graphics/starter_choose/starter_circle.png
similarity index 100%
rename from graphics/misc/starter_circle.png
rename to graphics/starter_choose/starter_circle.png
diff --git a/graphics/interface/summary_a_button.png b/graphics/summary_screen/a_button.png
similarity index 100%
rename from graphics/interface/summary_a_button.png
rename to graphics/summary_screen/a_button.png
diff --git a/graphics/interface/summary_b_button.png b/graphics/summary_screen/b_button.png
similarity index 100%
rename from graphics/interface/summary_b_button.png
rename to graphics/summary_screen/b_button.png
diff --git a/graphics/interface/powacc_tilemap.bin b/graphics/summary_screen/effect_battle.bin
similarity index 100%
rename from graphics/interface/powacc_tilemap.bin
rename to graphics/summary_screen/effect_battle.bin
diff --git a/graphics/interface/summary.bin b/graphics/summary_screen/effect_cancel.bin
similarity index 100%
rename from graphics/interface/summary.bin
rename to graphics/summary_screen/effect_cancel.bin
diff --git a/graphics/interface/appealjam_tilemap.bin b/graphics/summary_screen/effect_contest.bin
similarity index 100%
rename from graphics/interface/appealjam_tilemap.bin
rename to graphics/summary_screen/effect_contest.bin
diff --git a/graphics/interface/summary_markings.pal b/graphics/summary_screen/markings.pal
similarity index 100%
rename from graphics/interface/summary_markings.pal
rename to graphics/summary_screen/markings.pal
diff --git a/graphics/interface/summary_frames.png b/graphics/summary_screen/move_select.png
similarity index 100%
rename from graphics/interface/summary_frames.png
rename to graphics/summary_screen/move_select.png
diff --git a/graphics/interface/summary_page_battle_moves.bin b/graphics/summary_screen/page_battle_moves.bin
similarity index 100%
rename from graphics/interface/summary_page_battle_moves.bin
rename to graphics/summary_screen/page_battle_moves.bin
diff --git a/graphics/interface/summary_page_contest_moves.bin b/graphics/summary_screen/page_contest_moves.bin
similarity index 100%
rename from graphics/interface/summary_page_contest_moves.bin
rename to graphics/summary_screen/page_contest_moves.bin
diff --git a/graphics/interface/summary_page_info.bin b/graphics/summary_screen/page_info.bin
similarity index 100%
rename from graphics/interface/summary_page_info.bin
rename to graphics/summary_screen/page_info.bin
diff --git a/graphics/interface/summary_page_info_copy.bin b/graphics/summary_screen/page_info_egg.bin
similarity index 100%
rename from graphics/interface/summary_page_info_copy.bin
rename to graphics/summary_screen/page_info_egg.bin
diff --git a/graphics/interface/summary_page_skills.bin b/graphics/summary_screen/page_skills.bin
similarity index 100%
rename from graphics/interface/summary_page_skills.bin
rename to graphics/summary_screen/page_skills.bin
diff --git a/graphics/interface/status_tilemap.bin b/graphics/summary_screen/status_tilemap.bin
similarity index 100%
rename from graphics/interface/status_tilemap.bin
rename to graphics/summary_screen/status_tilemap.bin
diff --git a/graphics/interface/summary_screen.pal b/graphics/summary_screen/tiles.pal
similarity index 100%
rename from graphics/interface/summary_screen.pal
rename to graphics/summary_screen/tiles.pal
diff --git a/graphics/interface/summary_screen.png b/graphics/summary_screen/tiles.png
similarity index 100%
rename from graphics/interface/summary_screen.png
rename to graphics/summary_screen/tiles.png
diff --git a/graphics/title_screen/title_screen1.bin b/graphics/title_screen/clouds.bin
similarity index 100%
rename from graphics/title_screen/title_screen1.bin
rename to graphics/title_screen/clouds.bin
diff --git a/graphics/title_screen/title_screen2.bin b/graphics/title_screen/pokemon_logo.bin
similarity index 100%
rename from graphics/title_screen/title_screen2.bin
rename to graphics/title_screen/pokemon_logo.bin
diff --git a/graphics/title_screen/unk_853EF78.pal b/graphics/title_screen/unused.pal
similarity index 100%
rename from graphics/title_screen/unk_853EF78.pal
rename to graphics/title_screen/unused.pal
diff --git a/graphics/link/gba.png b/graphics/trade/gba.png
similarity index 100%
rename from graphics/link/gba.png
rename to graphics/trade/gba.png
diff --git a/graphics/link/gba_pal2.pal b/graphics/trade/gba_pal2.pal
similarity index 100%
rename from graphics/link/gba_pal2.pal
rename to graphics/trade/gba_pal2.pal
diff --git a/graphics/misc/trainer_hill_ereader.pal b/graphics/trainer_hill/ereader.pal
similarity index 100%
rename from graphics/misc/trainer_hill_ereader.pal
rename to graphics/trainer_hill/ereader.pal
diff --git a/graphics_file_rules.mk b/graphics_file_rules.mk
index 6f3ff611df..db9a5b1fe6 100644
--- a/graphics_file_rules.mk
+++ b/graphics_file_rules.mk
@@ -19,6 +19,8 @@ WALLPAPERGFXDIR := graphics/pokemon_storage/wallpapers
OBJEVENTGFXDIR := graphics/object_events
MISCGFXDIR := graphics/misc
JPCONTESTGFXDIR := graphics/contest/japanese
+POKEDEXGFXDIR := graphics/pokedex
+STARTERGFXDIR := graphics/starter_choose
types := normal fight flying poison ground rock bug ghost steel mystery fire water grass electric psychic ice dragon dark fairy
contest_types := cool beauty cute smart tough
@@ -337,9 +339,9 @@ $(UNUSEDGFXDIR)/obi2.4bpp: $(UNUSEDGFXDIR)/old_bulbasaur2.4bpp \
$(UNUSEDGFXDIR)/old_battle_interface_3.4bpp
@cat $^ >$@
-$(INTERFACEGFXDIR)/battle_bar.4bpp: $(INTERFACEGFXDIR)/hpbar_anim.4bpp \
- $(INTERFACEGFXDIR)/numbers1.4bpp \
- $(INTERFACEGFXDIR)/numbers2.4bpp
+$(BATINTGFXDIR)/battle_bar.4bpp: $(BATINTGFXDIR)/hpbar_anim_unused.4bpp \
+ $(BATINTGFXDIR)/numbers1.4bpp \
+ $(BATINTGFXDIR)/numbers2.4bpp
@cat $^ >$@
$(UNUSEDGFXDIR)/redyellowgreen_frame.bin: $(UNUSEDGFXDIR)/red_frame.bin \
@@ -395,7 +397,7 @@ $(MASKSGFXDIR)/unused_level_up.4bpp: %.4bpp: %.png
$(BATTRANSGFXDIR)/vs_frame.4bpp: %.4bpp: %.png
$(GFX) $< $@ -num_tiles 16
-$(INTERFACEGFXDIR)/party_menu_bg.4bpp: %.4bpp: %.png
+graphics/party_menu/bg.4bpp: %.4bpp: %.png
$(GFX) $< $@ -num_tiles 62
$(TYPESGFXDIR)/move_types.4bpp: $(types:%=$(TYPESGFXDIR)/%.4bpp) $(contest_types:%=$(TYPESGFXDIR)/contest_%.4bpp)
@@ -406,7 +408,7 @@ $(TYPESGFXDIR)/move_types.gbapal: $(TYPESGFXDIR)/move_types_1.gbapal \
$(TYPESGFXDIR)/move_types_3.gbapal
@cat $^ >$@
-$(INTERFACEGFXDIR)/bag_screen.4bpp: %.4bpp: %.png
+graphics/bag/menu.4bpp: %.4bpp: %.png
$(GFX) $< $@ -num_tiles 53
$(RAYQUAZAGFXDIR)/scene_2/rayquaza.8bpp: %.8bpp: %.png
@@ -467,7 +469,7 @@ $(SLOTMACHINEGFXDIR)/reel_time_gfx.4bpp: $(SLOTMACHINEGFXDIR)/reel_time_pikachu.
$(SLOTMACHINEGFXDIR)/reel_time_machine.4bpp
@cat $^ >$@
-$(UNUSEDGFXDIR)/intro_birch_beauty.4bpp: %.4bpp: %.png
+graphics/birch_speech/unused_beauty.4bpp: %.4bpp: %.png
$(GFX) $< $@ -num_tiles 822
@@ -667,11 +669,11 @@ $(PKNAVGFXDIR)/device_outline.4bpp: %.4bpp: %.png
$(PKNAVGFXDIR)/match_call/ui.4bpp: %.4bpp: %.png
$(GFX) $< $@ -num_tiles 13
-$(INTERFACEGFXDIR)/region_map.8bpp: %.8bpp: %.png
+$(POKEDEXGFXDIR)/region_map.8bpp: %.8bpp: %.png
$(GFX) $< $@ -num_tiles 232
-$(INTERFACEGFXDIR)/region_map_affine.8bpp: %.8bpp: %.png
+$(POKEDEXGFXDIR)/region_map_affine.8bpp: %.8bpp: %.png
$(GFX) $< $@ -num_tiles 233
-$(MISCGFXDIR)/birch_help.4bpp: $(MISCGFXDIR)/birch_bag.4bpp $(MISCGFXDIR)/birch_grass.4bpp
+$(STARTERGFXDIR)/birch_help.4bpp: $(STARTERGFXDIR)/birch_bag.4bpp $(STARTERGFXDIR)/birch_grass.4bpp
@cat $^ >$@
diff --git a/include/battle.h b/include/battle.h
index d0064032eb..364ee25996 100644
--- a/include/battle.h
+++ b/include/battle.h
@@ -48,7 +48,7 @@
struct ResourceFlags
{
- u32 flags[4];
+ u32 flags[MAX_BATTLERS_COUNT];
};
#define RESOURCE_FLAG_FLASH_FIRE 0x1
@@ -294,6 +294,7 @@ struct BattleHistory
u8 moveHistoryIndex[MAX_BATTLERS_COUNT];
u16 trainerItems[MAX_BATTLERS_COUNT];
u8 itemsNo;
+ u16 heldItems[MAX_BATTLERS_COUNT];
};
struct BattleScriptsStack
@@ -604,6 +605,8 @@ struct BattleStruct
u8 blunderPolicy:1; // should blunder policy activate
u8 ballSpriteIds[2]; // item gfx, window gfx
u8 stickyWebUser;
+ u8 appearedInBattle; // Bitfield to track which Pokemon appeared in battle. Used for Burmy's form change
+ u8 skyDropTargets[MAX_BATTLERS_COUNT]; // For Sky Drop, to account for if multiple Pokemon use Sky Drop in a double battle.
};
#define F_DYNAMIC_TYPE_1 (1 << 6)
@@ -782,8 +785,8 @@ struct MonSpritesGfx
{
void* firstDecompressed; // ptr to the decompressed sprite of the first pokemon
union {
- void* ptr[MAX_BATTLERS_COUNT];
- u8* byte[MAX_BATTLERS_COUNT];
+ void* ptr[MAX_BATTLERS_COUNT];
+ u8* byte[MAX_BATTLERS_COUNT];
} sprites;
struct SpriteTemplate templates[MAX_BATTLERS_COUNT];
struct SpriteFrameImage frameImages[MAX_BATTLERS_COUNT][4];
diff --git a/include/battle_anim.h b/include/battle_anim.h
index dc9815ef45..7c9fc04953 100644
--- a/include/battle_anim.h
+++ b/include/battle_anim.h
@@ -492,5 +492,6 @@ void AnimOverheatFlame(struct Sprite *sprite);
// battle_anim_new.c
void CoreEnforcerLoadBeamTarget(struct Sprite* sprite);
+void SpriteCB_RandomCentredHits(struct Sprite* sprite);
#endif // GUARD_BATTLE_ANIM_H
diff --git a/include/battle_main.h b/include/battle_main.h
index ed35566d8f..62d8411a64 100644
--- a/include/battle_main.h
+++ b/include/battle_main.h
@@ -23,7 +23,12 @@ struct MultiPartnerMenuPokemon
};
#define TYPE_NAME_LENGTH 6
+
+#if B_EXPANDED_ABILITY_NAMES
+#define ABILITY_NAME_LENGTH 16
+#else
#define ABILITY_NAME_LENGTH 12
+#endif
// defines for the 'DoBounceEffect' function
#define BOUNCE_MON 0x0
@@ -68,6 +73,7 @@ void RunBattleScriptCommands(void);
bool8 TryRunFromBattle(u8 battlerId);
void SpecialStatusesClear(void);
void SetTypeBeforeUsingMove(u16 move, u8 battlerAtk);
+bool32 IsWildMonSmart(void);
extern struct MultiPartnerMenuPokemon gMultiPartnerParty[MULTI_PARTY_SIZE];
diff --git a/include/battle_message.h b/include/battle_message.h
index 5c10f9e04a..09ee27c081 100644
--- a/include/battle_message.h
+++ b/include/battle_message.h
@@ -1,7 +1,13 @@
#ifndef GUARD_BATTLE_MESSAGE_H
#define GUARD_BATTLE_MESSAGE_H
-#define TEXT_BUFF_ARRAY_COUNT 16
+#include "constants/battle_config.h"
+
+#if B_EXPANDED_ABILITY_NAMES == TRUE
+ #define TEXT_BUFF_ARRAY_COUNT 17
+#else
+ #define TEXT_BUFF_ARRAY_COUNT 16
+#endif
// for 0xFD
#define B_TXT_BUFF1 0x0
diff --git a/include/battle_pyramid.h b/include/battle_pyramid.h
index c4a72095f0..62320358b6 100644
--- a/include/battle_pyramid.h
+++ b/include/battle_pyramid.h
@@ -14,7 +14,7 @@ void SoftResetInBattlePyramid(void);
void CopyPyramidTrainerSpeechBefore(u16 trainerId);
void CopyPyramidTrainerWinSpeech(u16 trainerId);
void CopyPyramidTrainerLoseSpeech(u16 trainerId);
-u8 GetBattlePyramindTrainerEncounterMusicId(u16 trainerId);
+u8 GetTrainerEncounterMusicIdInBattlePyramid(u16 trainerId);
void GenerateBattlePyramidFloorLayout(u16 *mapArg, bool8 setPlayerPosition);
void LoadBattlePyramidObjectEventTemplates(void);
void LoadBattlePyramidFloorObjectEventScripts(void);
diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h
index dfa81e7676..f8468a4f4a 100644
--- a/include/battle_script_commands.h
+++ b/include/battle_script_commands.h
@@ -1,7 +1,6 @@
#ifndef GUARD_BATTLE_SCRIPT_COMMANDS_H
#define GUARD_BATTLE_SCRIPT_COMMANDS_H
-#include "constants/pokemon.h"
#include "constants/battle_script_commands.h"
// Arguments for 'flags' in HandleBattleWindow
diff --git a/include/battle_scripts.h b/include/battle_scripts.h
index 415eaa6bb4..6f8b0d4243 100644
--- a/include/battle_scripts.h
+++ b/include/battle_scripts.h
@@ -415,5 +415,6 @@ extern const u8 BattleScript_AttackerFormChangeMoveEffect[];
extern const u8 BattleScript_BothCanNoLongerEscape[];
extern const u8 BattleScript_OctolockEndTurn[];
extern const u8 BattleScript_NeutralizingGasExits[];
+extern const u8 BattleScript_MagicianActivates[];
#endif // GUARD_BATTLE_SCRIPTS_H
diff --git a/include/battle_util.h b/include/battle_util.h
index 4d216cf81b..1c5216c73b 100644
--- a/include/battle_util.h
+++ b/include/battle_util.h
@@ -25,6 +25,10 @@
#define ABILITYEFFECT_TRACE2 13
#define ABILITYEFFECT_MOVE_END_OTHER 14
#define ABILITYEFFECT_NEUTRALIZINGGAS 15
+#define ABILITYEFFECT_FIELD_SPORT 16 // Only used if B_SPORT_TURNS < GEN_6
+// Special cases
+#define ABILITYEFFECT_MUD_SPORT 252 // Only used if B_SPORT_TURNS < GEN_6
+#define ABILITYEFFECT_WATER_SPORT 253 // Only used if B_SPORT_TURNS < GEN_6
#define ABILITYEFFECT_SWITCH_IN_TERRAIN 254
#define ABILITYEFFECT_SWITCH_IN_WEATHER 255
diff --git a/include/bike.h b/include/bike.h
index afe773d42e..00f11aefe3 100644
--- a/include/bike.h
+++ b/include/bike.h
@@ -17,11 +17,11 @@ struct BikeHistoryInputInfo
// Player speeds
enum
{
- BIKE_SPEED_STANDING,
- BIKE_SPEED_NORMAL,
- BIKE_SPEED_FAST,
- BIKE_SPEED_FASTER,
- BIKE_SPEED_FASTEST,
+ PLAYER_SPEED_STANDING,
+ PLAYER_SPEED_NORMAL,
+ PLAYER_SPEED_FAST,
+ PLAYER_SPEED_FASTER,
+ PLAYER_SPEED_FASTEST,
};
// mach bike transitions enum
diff --git a/include/constants/battle.h b/include/constants/battle.h
index 78fda92381..3eaa79a402 100644
--- a/include/constants/battle.h
+++ b/include/constants/battle.h
@@ -170,10 +170,13 @@
#define STATUS3_AQUA_RING (1 << 28)
#define STATUS3_LASER_FOCUS (1 << 29)
#define STATUS3_POWER_TRICK (1 << 30)
+#define STATUS3_SKY_DROPPED (1 << 31) // Target of Sky Drop
#define STATUS3_SEMI_INVULNERABLE (STATUS3_UNDERGROUND | STATUS3_ON_AIR | STATUS3_UNDERWATER | STATUS3_PHANTOM_FORCE)
#define STATUS4_ELECTRIFIED (1 << 0)
#define STATUS4_PLASMA_FISTS (1 << 1)
+#define STATUS4_MUD_SPORT (1 << 2) // Only used if B_SPORT_TURNS < GEN_6
+#define STATUS4_WATER_SPORT (1 << 3) // Only used if B_SPORT_TURNS < GEN_6
#define HITMARKER_WAKE_UP_CLEAR (1 << 4) // Cleared when waking up. Never set or checked.
#define HITMARKER_SKIP_DMG_TRACK (1 << 5)
@@ -359,7 +362,9 @@
#define MOVE_EFFECT_RECOIL_HP_25 0x46
#define MOVE_EFFECT_RELIC_SONG 0x47
#define MOVE_EFFECT_TRAP_BOTH 0x48
-#define NUM_MOVE_EFFECTS 0x49
+#define MOVE_EFFECT_SKY_DROP 0x49
+
+#define NUM_MOVE_EFFECTS 0x50
#define MOVE_EFFECT_AFFECTS_USER 0x4000
#define MOVE_EFFECT_CERTAIN 0x8000
@@ -391,9 +396,10 @@
#define BATTLE_TERRAIN_COUNT 22
-#define B_WAIT_TIME_LONG 64
-#define B_WAIT_TIME_MED 48
-#define B_WAIT_TIME_SHORT 32
+#define B_WAIT_TIME_LONG 64
+#define B_WAIT_TIME_MED 48
+#define B_WAIT_TIME_SHORT 32
+#define B_WAIT_TIME_SHORTEST 16
#define CHERRIM_OVERCAST 0
#define CHERRIM_SUNSHINE 1
diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h
index bdcd765ea0..d9b9ee5a22 100644
--- a/include/constants/battle_anim.h
+++ b/include/constants/battle_anim.h
@@ -531,6 +531,7 @@
#define B_ANIM_GULP_MISSILE 29
#define B_ANIM_STRONG_WINDS 30
#define B_ANIM_PRIMAL_REVERSION 31
+#define B_ANIM_AQUA_RING_HEAL 32
// special animations table (gBattleAnims_Special)
#define B_ANIM_LVL_UP 0
diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h
index 8f8d30b568..a3ef7cc94b 100644
--- a/include/constants/battle_config.h
+++ b/include/constants/battle_config.h
@@ -5,53 +5,59 @@
// Species with peculiar battle effects.
#ifndef POKEMON_EXPANSION
- #define SPECIES_DIALGA 0
- #define SPECIES_PALKIA 0
- #define SPECIES_GIRATINA 0
- #define SPECIES_CHERRIM 0
- #define SPECIES_ARCEUS 0
- #define SPECIES_SILVALLY 0
- #define SPECIES_GENESECT 0
- #define SPECIES_AEGISLASH 0
- #define SPECIES_AEGISLASH_BLADE 10000
- #define SPECIES_MIMIKYU 0
- #define SPECIES_MIMIKYU_BUSTED 10001
- #define SPECIES_DARMANITAN 0
- #define SPECIES_DARMANITAN_ZEN_MODE 10002
- #define SPECIES_MINIOR_CORE_RED 0
- #define SPECIES_MINIOR 10003
- #define SPECIES_MINIOR_CORE_BLUE 0
- #define SPECIES_MINIOR_METEOR_BLUE 10004
- #define SPECIES_MINIOR_CORE_GREEN 0
- #define SPECIES_MINIOR_METEOR_GREEN 10005
- #define SPECIES_MINIOR_CORE_INDIGO 0
- #define SPECIES_MINIOR_METEOR_INDIGO 10006
- #define SPECIES_MINIOR_CORE_ORANGE 0
- #define SPECIES_MINIOR_METEOR_ORANGE 10007
- #define SPECIES_MINIOR_CORE_VIOLET 0
- #define SPECIES_MINIOR_METEOR_VIOLET 10008
- #define SPECIES_MINIOR_CORE_YELLOW 0
- #define SPECIES_MINIOR_METEOR_YELLOW 10009
- #define SPECIES_WISHIWASHI 0
- #define SPECIES_WISHIWASHI_SCHOOL 10010
- #define SPECIES_ZYGARDE 0 // 50%
- #define SPECIES_ZYGARDE_10 10011 // 10 %
- #define SPECIES_ZYGARDE_COMPLETE 10012 // 100 %
- #define SPECIES_BURMY 0
- #define SPECIES_BURMY_SANDY_CLOAK 10013
- #define SPECIES_BURMY_TRASH_CLOAK 10014
- #define SPECIES_CRAMORANT 0
- #define SPECIES_CRAMORANT_GORGING 10015
- #define SPECIES_CRAMORANT_GULPING 10016
- #define SPECIES_GRENINJA_BATTLE_BOND 0
- #define SPECIES_GRENINJA_ASH 10017
- #define SPECIES_HOOPA 0
- #define SPECIES_HOOPA_UNBOUND 10018
- #define SPECIES_MELOETTA 0
- #define SPECIES_MELOETTA_PIROUETTE 10019
- #define SPECIES_MORPEKO 0
- #define SPECIES_MORPEKO_HANGRY 10020
- #define SPECIES_SIRFETCHD 10021
+ #define SPECIES_DIALGA 0
+ #define SPECIES_PALKIA 0
+ #define SPECIES_GIRATINA 0
+ #define SPECIES_CHERRIM 0
+ #define SPECIES_ARCEUS 0
+ #define SPECIES_SILVALLY 0
+ #define SPECIES_GENESECT 0
+ #define SPECIES_AEGISLASH 0
+ #define SPECIES_AEGISLASH_BLADE 10000
+ #define SPECIES_MIMIKYU 0
+ #define SPECIES_MIMIKYU_BUSTED 10001
+ #define SPECIES_DARMANITAN 0
+ #define SPECIES_DARMANITAN_ZEN_MODE 10002
+ #define SPECIES_MINIOR_CORE_RED 0
+ #define SPECIES_MINIOR 10003
+ #define SPECIES_MINIOR_CORE_BLUE 0
+ #define SPECIES_MINIOR_METEOR_BLUE 10004
+ #define SPECIES_MINIOR_CORE_GREEN 0
+ #define SPECIES_MINIOR_METEOR_GREEN 10005
+ #define SPECIES_MINIOR_CORE_INDIGO 0
+ #define SPECIES_MINIOR_METEOR_INDIGO 10006
+ #define SPECIES_MINIOR_CORE_ORANGE 0
+ #define SPECIES_MINIOR_METEOR_ORANGE 10007
+ #define SPECIES_MINIOR_CORE_VIOLET 0
+ #define SPECIES_MINIOR_METEOR_VIOLET 10008
+ #define SPECIES_MINIOR_CORE_YELLOW 0
+ #define SPECIES_MINIOR_METEOR_YELLOW 10009
+ #define SPECIES_WISHIWASHI 0
+ #define SPECIES_WISHIWASHI_SCHOOL 10010
+ #define SPECIES_ZYGARDE 0 // 50%
+ #define SPECIES_ZYGARDE_10 10011 // 10 %
+ #define SPECIES_ZYGARDE_COMPLETE 10012 // 100 %
+ #define SPECIES_BURMY 0
+ #define SPECIES_BURMY_SANDY_CLOAK 10013
+ #define SPECIES_BURMY_TRASH_CLOAK 10014
+ #define SPECIES_CRAMORANT 0
+ #define SPECIES_CRAMORANT_GORGING 10015
+ #define SPECIES_CRAMORANT_GULPING 10016
+ #define SPECIES_GRENINJA_BATTLE_BOND 0
+ #define SPECIES_GRENINJA_ASH 10017
+ #define SPECIES_HOOPA 0
+ #define SPECIES_HOOPA_UNBOUND 10018
+ #define SPECIES_MELOETTA 0
+ #define SPECIES_MELOETTA_PIROUETTE 10019
+ #define SPECIES_MORPEKO 0
+ #define SPECIES_MORPEKO_HANGRY 10020
+ #define SPECIES_SIRFETCHD 10021
+ #define SPECIES_DARMANITAN_GALARIAN 0
+ #define SPECIES_DARMANITAN_ZEN_MODE_GALARIAN 10022
+ #define SPECIES_HEATMOR 0
+ #define SPECIES_DURANT 0
+ #define SPECIES_CARBINK 0
+ #define SPECIES_MAREANIE 0
#endif
// Items with peculiar battle effects.
@@ -92,9 +98,6 @@
#define GEN_8 5
#endif
-// Mega Evolution settings
-#define B_MEGA_EVO_TURN_ORDER GEN_7 // In Gen7, a Pokémon's Speed after Mega Evolution is used to determine turn order, not its Speed before.
-
// Calculation settings
#define B_CRIT_CHANCE GEN_7 // Chances of a critical hit landing. See CalcCritChanceStage.
#define B_CRIT_MULTIPLIER GEN_7 // In Gen6+, critical hits multiply damage by 1.5 instead of 2.
@@ -118,7 +121,8 @@
#define B_PAYBACK_SWITCH_BOOST GEN_7 // In Gen5+, if the opponent switches out, Payback's damage will no longer be doubled.
#define B_HIDDEN_POWER_DMG GEN_7 // In Gen6+, Hidden Power's base power was set to always be 60. Before, it was determined by the mon's IVs.
#define B_ROUGH_SKIN_DMG GEN_7 // In Gen4+, Rough Skin contact damage is 1/8th of max HP instead of 1/16th. This will also affect Iron Barbs.
-#define B_KNOCK_OFF_DMG GEN_8 // In Gen6+, Knock Off deals 50% more damage when knocking off an item
+#define B_KNOCK_OFF_DMG GEN_8 // In Gen6+, Knock Off deals 50% more damage when knocking off an item.
+#define B_SPORT_DMG_REDUCTION GEN_7 // In Gen5+, Water/Mud Sport reduce Fire/Electric Damage by 67% instead of 50%.
// Type settings
#define B_GHOSTS_ESCAPE GEN_7 // In Gen6+, abilities like Shadow Tag or moves like Mean Look fail on Ghost-type Pokémon. They can also escape any Wild Battle.
@@ -128,13 +132,16 @@
#define B_PRANKSTER_DARK_TYPES GEN_7 // In Gen7+, Prankster-elevated status moves do not affect Dark type Pokémon.
#define B_SHEER_COLD_IMMUNITY GEN_7 // In Gen7+, Ice-types are immune to Sheer Cold
-// Turn count settings
+// Turn settings
#define B_BINDING_TURNS GEN_7 // In Gen5+, binding moves last for 4-5 turns instead of 2-5 turns. (With Grip Claw, 7 and 5 turns respectively.)
#define B_UPROAR_TURNS GEN_7 // In Gen5+, Uproar lasts for 3 turns instead of 2-5 turns.
#define B_DISABLE_TURNS GEN_7 // Disable's turns. See Cmd_disablelastusedattack.
#define B_TAILWIND_TURNS GEN_7 // In Gen5+, Tailwind lasts 4 turns instead of 3.
#define B_SLEEP_TURNS GEN_7 // In Gen5+, sleep lasts for 1-3 turns instead of 2-5 turns.
#define B_TAUNT_TURNS GEN_7 // In Gen5+, Taunt lasts 3 turns if the user acts before the target, or 4 turns if the target acted before the user. In Gen3, taunt lasts 2 turns and in Gen 4, 3-5 turns.
+#define B_SPORT_TURNS GEN_7 // In Gen6+, Water/Mud Sport last 5 turns, even if the user switches out.
+#define B_MEGA_EVO_TURN_ORDER GEN_7 // In Gen7, a Pokémon's Speed after Mega Evolution is used to determine turn order, not its Speed before.
+#define B_RECALC_TURN_AFTER_ACTIONS GEN_8 // In Gen8, switching/using a move affects the current turn's order of actions.
// Move data settings
#define B_UPDATED_MOVE_DATA GEN_8 // Updates move data in gBattleMoves, including Power, Accuracy, PP, stat changes, targets, chances of secondary effects, etc.
@@ -143,6 +150,8 @@
#define B_KINGS_SHIELD_LOWER_ATK GEN_7 // In Gen7+, it lowers Atk by 1 stage instead of 2 of oponents that hit it.
#define B_SPEED_BUFFING_RAPID_SPIN GEN_8 // In Gen8, Rapid Spin raises the user's Speed by 1 stage.
#define B_RECOIL_IF_MISS_DMG GEN_7 // In Gen5+, Jump Kick and High Jump Kick will always do half of the user's max HP when missing.
+#define B_KLUTZ_FLING_INTERACTION GEN_7 // In Gen5+, Pokémon with the Klutz ability can't use Fling.
+#define B_UPDATED_CONVERSION GEN_7 // In Gen6+, Conversion changes the user's type to match their first move's. Before, it would choose a move at random.
// Move accuracy settings
#define B_TOXIC_NEVER_MISS GEN_7 // In Gen6+, if Toxic is used by a Poison-type Pokémon, it will never miss.
@@ -163,6 +172,7 @@
#define B_RAMPAGE_CANCELLING GEN_7 // In Gen5+, a failed Thrash, etc, will cancel except on its last turn.
// Ability settings
+#define B_EXPANDED_ABILITY_NAMES TRUE // If TRUE, ability names are increased from 12 characters to 16 characters.
#define B_ABILITY_WEATHER GEN_7 // In Gen6+, ability-induced weather lasts 5 turns. Before, it lasted until the battle ended or until it was changed by a move or a different weather-affecting ability.
#define B_GALE_WINGS GEN_7 // In Gen7+ requires full HP to trigger.
#define B_STANCE_CHANGE_FAIL GEN_7 // In Gen7+, Stance Change fails if the Pokémon is unable to use a move because of confusion, paralysis, etc. In Gen6, it doesn't.
@@ -198,11 +208,13 @@
// Eg: Replace with FLAG_UNUSED_0x264 so you can use that flag to toggle the feature.
#define B_FLAG_INVERSE_BATTLE 0 // If this flag is set, the battle's type effectiveness are inversed. For example, fire is super effective against water.
#define B_FLAG_FORCE_DOUBLE_WILD 0 // If this flag is set, all land and surfing wild battles will be double battles.
+#define B_SMART_WILD_AI_FLAG 0 // If not 0, you can set this flag in a script to enable smart wild pokemon
// Var Settings
// To use the following features in scripting, replace the 0s with the var ID you're assigning it to.
// Eg: Replace with VAR_UNUSED_0x40F7 so you can use VAR_TERRAIN for that feature.
#define VAR_TERRAIN 0 // If this var has a value, assigning a STATUS_FIELD_xx_TERRAIN to it before battle causes the battle to start with that terrain active
+#define B_VAR_WILD_AI_FLAGS 0 // If not 0, you can use this var to add to default wild AI flags. NOT usable with flags above (1 << 15)
// Terrain settings
#define B_TERRAIN_BG_CHANGE TRUE // If set to TRUE, terrain moves permanently change the default battle background until the effect fades.
@@ -216,6 +228,7 @@
// Interface settings
#define B_ABILITY_POP_UP TRUE // In Gen5+, the Pokémon abilities are displayed in a pop-up, when they activate in battle.
#define B_FAST_INTRO TRUE // If set to TRUE, battle intro texts print at the same time as animation of a Pokémon, as opposing to waiting for the animation to end.
+#define B_FAST_HP_DRAIN TRUE // If set to TRUE, HP bars will move faster to accomodate higher max HP amounts.
#define B_SHOW_TARGETS TRUE // If set to TRUE, all available targets, for moves hitting 2 or 3 Pokémon, will be shown before selecting a move.
#define B_SHOW_SPLIT_ICON TRUE // If set to TRUE, it will show an icon in the summary showing the move's category split.
#define B_HIDE_HEALTHBOX_IN_ANIMS TRUE // If set to TRUE, hides healthboxes during move animations.
@@ -227,8 +240,10 @@
#define B_LAST_USED_BALL TRUE // If TRUE, the "last used ball" feature from Gen 7 will be implemented
#define B_LAST_USED_BALL_BUTTON R_BUTTON // If last used ball is implemented, this button (or button combo) will trigger throwing the last used ball.
-// Other
+// Other settings
#define B_DOUBLE_WILD_CHANCE 0 // % chance of encountering two Pokémon in a Wild Encounter.
+#define B_MULTI_BATTLE_WHITEOUT GEN_8 // In Gen4+, multi battles end when the Player and also their Partner don't have any more Pokémon to fight.
+#define B_WILD_NATURAL_ENEMIES TRUE // If set to TRUE, certain wild mon species will attack other species when partnered in double wild battles (eg. Zangoose vs Seviper)
// Animation Settings
#define B_NEW_SWORD_PARTICLE FALSE // If set to TRUE, it updates Swords Dance's particle.
diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h
index 6b2e4b0902..4131dc4dac 100644
--- a/include/constants/battle_move_effects.h
+++ b/include/constants/battle_move_effects.h
@@ -386,7 +386,8 @@
#define EFFECT_OCTOLOCK 380
#define EFFECT_CLANGOROUS_SOUL 381
#define EFFECT_BOLT_BEAK 382
+#define EFFECT_SKY_DROP 383
-#define NUM_BATTLE_MOVE_EFFECTS 383
+#define NUM_BATTLE_MOVE_EFFECTS 384
#endif // GUARD_CONSTANTS_BATTLE_MOVE_EFFECTS_H
diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h
index 4de6271614..594de9ef74 100644
--- a/include/constants/battle_script_commands.h
+++ b/include/constants/battle_script_commands.h
@@ -87,144 +87,157 @@
#define CMP_NO_COMMON_BITS 5
// Cmd_various
-#define VARIOUS_CANCEL_MULTI_TURN_MOVES 0
-#define VARIOUS_SET_MAGIC_COAT_TARGET 1
-#define VARIOUS_IS_RUNNING_IMPOSSIBLE 2
-#define VARIOUS_GET_MOVE_TARGET 3
-#define VARIOUS_GET_BATTLER_FAINTED 4
-#define VARIOUS_RESET_INTIMIDATE_TRACE_BITS 5
-#define VARIOUS_UPDATE_CHOICE_MOVE_ON_LVL_UP 6
-#define VARIOUS_RESET_PLAYER_FAINTED 7
-#define VARIOUS_PALACE_FLAVOR_TEXT 8
-#define VARIOUS_ARENA_JUDGMENT_WINDOW 9
-#define VARIOUS_ARENA_OPPONENT_MON_LOST 10
-#define VARIOUS_ARENA_PLAYER_MON_LOST 11
-#define VARIOUS_ARENA_BOTH_MONS_LOST 12
-#define VARIOUS_EMIT_YESNOBOX 13
-#define VARIOUS_DRAW_ARENA_REF_TEXT_BOX 14
-#define VARIOUS_ERASE_ARENA_REF_TEXT_BOX 15
-#define VARIOUS_ARENA_JUDGMENT_STRING 16
-#define VARIOUS_ARENA_WAIT_STRING 17
-#define VARIOUS_WAIT_CRY 18
-#define VARIOUS_RETURN_OPPONENT_MON1 19
-#define VARIOUS_RETURN_OPPONENT_MON2 20
-#define VARIOUS_VOLUME_DOWN 21
-#define VARIOUS_VOLUME_UP 22
-#define VARIOUS_SET_ALREADY_STATUS_MOVE_ATTEMPT 23
-#define VARIOUS_PALACE_TRY_ESCAPE_STATUS 24
-#define VARIOUS_SET_TELEPORT_OUTCOME 25
-#define VARIOUS_PLAY_TRAINER_DEFEATED_MUSIC 26
-#define VARIOUS_STAT_TEXT_BUFFER 27
-#define VARIOUS_SWITCHIN_ABILITIES 28
-#define VARIOUS_SAVE_TARGET 29
-#define VARIOUS_RESTORE_TARGET 30
-#define VARIOUS_INSTANT_HP_DROP 31
-#define VARIOUS_CLEAR_STATUS 32
-#define VARIOUS_RESTORE_PP 33
-#define VARIOUS_TRY_ACTIVATE_MOXIE 34
-#define VARIOUS_TRY_ACTIVATE_FELL_STINGER 35
-#define VARIOUS_PLAY_MOVE_ANIMATION 36
-#define VARIOUS_SET_LUCKY_CHANT 37
-#define VARIOUS_SUCKER_PUNCH_CHECK 38
-#define VARIOUS_SET_SIMPLE_BEAM 39
-#define VARIOUS_TRY_ENTRAINMENT 40
-#define VARIOUS_SET_LAST_USED_ABILITY 41
-#define VARIOUS_TRY_HEAL_PULSE 42
-#define VARIOUS_TRY_QUASH 43
-#define VARIOUS_INVERT_STAT_STAGES 44
-#define VARIOUS_SET_TERRAIN 45
-#define VARIOUS_TRY_ME_FIRST 46
-#define VARIOUS_JUMP_IF_BATTLE_END 47
-#define VARIOUS_TRY_ELECTRIFY 48
-#define VARIOUS_TRY_REFLECT_TYPE 49
-#define VARIOUS_TRY_SOAK 50
-#define VARIOUS_HANDLE_MEGA_EVO 51
-#define VARIOUS_TRY_LAST_RESORT 52
-#define VARIOUS_ARGUMENT_STATUS_EFFECT 53
-#define VARIOUS_TRY_HIT_SWITCH_TARGET 54
-#define VARIOUS_TRY_AUTOTOMIZE 55
-#define VARIOUS_TRY_COPYCAT 56
-#define VARIOUS_ABILITY_POPUP 57
-#define VARIOUS_DEFOG 58
-#define VARIOUS_JUMP_IF_TARGET_ALLY 59
-#define VARIOUS_TRY_SYNCHRONOISE 60
-#define VARIOUS_PSYCHO_SHIFT 61
-#define VARIOUS_CURE_STATUS 62
-#define VARIOUS_POWER_TRICK 63
-#define VARIOUS_AFTER_YOU 64
-#define VARIOUS_BESTOW 65
-#define VARIOUS_ARGUMENT_TO_MOVE_EFFECT 66
-#define VARIOUS_JUMP_IF_NOT_GROUNDED 67
-#define VARIOUS_HANDLE_TRAINER_SLIDE_MSG 68
-#define VARIOUS_TRY_TRAINER_SLIDE_MSG_FIRST_OFF 69
-#define VARIOUS_TRY_TRAINER_SLIDE_MSG_LAST_ON 70
-#define VARIOUS_SET_AURORA_VEIL 71
-#define VARIOUS_TRY_THIRD_TYPE 72
-#define VARIOUS_ACUPRESSURE 73
-#define VARIOUS_SET_POWDER 74
-#define VARIOUS_SPECTRAL_THIEF 75
-#define VARIOUS_GRAVITY_ON_AIRBORNE_MONS 76
-#define VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS 77
-#define VARIOUS_JUMP_IF_ROAR_FAILS 78
-#define VARIOUS_TRY_INSTRUCT 79
-#define VARIOUS_JUMP_IF_NOT_BERRY 80
-#define VARIOUS_TRACE_ABILITY 81
-#define VARIOUS_UPDATE_NICK 82
-#define VARIOUS_TRY_ILLUSION_OFF 83
-#define VARIOUS_SET_SPRITEIGNORE0HP 84
-#define VARIOUS_HANDLE_FORM_CHANGE 85
-#define VARIOUS_GET_STAT_VALUE 86
-#define VARIOUS_JUMP_IF_FULL_HP 87
-#define VARIOUS_LOSE_TYPE 88
-#define VARIOUS_TRY_ACTIVATE_SOULHEART 89
-#define VARIOUS_TRY_ACTIVATE_RECEIVER 90
-#define VARIOUS_TRY_ACTIVATE_BEAST_BOOST 91
-#define VARIOUS_TRY_FRISK 92
-#define VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED 93
-#define VARIOUS_TRY_FAIRY_LOCK 94
-#define VARIOUS_JUMP_IF_NO_ALLY 95
-#define VARIOUS_POISON_TYPE_IMMUNITY 96
-#define VARIOUS_JUMP_IF_NO_HOLD_EFFECT 97
-#define VARIOUS_INFATUATE_WITH_BATTLER 98
-#define VARIOUS_SET_LAST_USED_ITEM 99
-#define VARIOUS_PARALYZE_TYPE_IMMUNITY 100
-#define VARIOUS_JUMP_IF_ABSENT 101
-#define VARIOUS_DESTROY_ABILITY_POPUP 102
-#define VARIOUS_TOTEM_BOOST 103
-#define VARIOUS_TRY_ACTIVATE_GRIM_NEIGH 104
-#define VARIOUS_MOVEEND_ITEM_EFFECTS 105
-#define VARIOUS_TERRAIN_SEED 106
-#define VARIOUS_MAKE_INVISIBLE 107
-#define VARIOUS_ROOM_SERVICE 108
-#define VARIOUS_JUMP_IF_TERRAIN_AFFECTED 109
-#define VARIOUS_EERIE_SPELL_PP_REDUCE 110
-#define VARIOUS_JUMP_IF_TEAM_HEALTHY 111
-#define VARIOUS_TRY_HEAL_QUARTER_HP 112
-#define VARIOUS_REMOVE_TERRAIN 113
-#define VARIOUS_JUMP_IF_PRANKSTER_BLOCKED 114
-#define VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER 115
-#define VARIOUS_GET_ROTOTILLER_TARGETS 116
-#define VARIOUS_JUMP_IF_NOT_ROTOTILLER_AFFECTED 117
-#define VARIOUS_TRY_ACTIVATE_BATTLE_BOND 118
-#define VARIOUS_CONSUME_BERRY 119
-#define VARIOUS_JUMP_IF_CANT_REVERT_TO_PRIMAL 120
-#define VARIOUS_HANDLE_PRIMAL_REVERSION 121
-#define VARIOUS_APPLY_PLASMA_FISTS 122
-#define VARIOUS_JUMP_IF_SPECIES 123
-#define VARIOUS_UPDATE_ABILITY_POPUP 124
-#define VARIOUS_JUMP_IF_WEATHER_AFFECTED 125
-#define VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED 126
-#define VARIOUS_SET_ATTACKER_STICKY_WEB_USER 127
-#define VARIOUS_TRY_TO_APPLY_MIMICRY 128
-#define VARIOUS_PHOTON_GEYSER_CHECK 129
-#define VARIOUS_SHELL_SIDE_ARM_CHECK 130
-#define VARIOUS_TRY_NO_RETREAT 131
-#define VARIOUS_TRY_TAR_SHOT 132
-#define VARIOUS_CAN_TAR_SHOT_WORK 133
-#define VARIOUS_CHECK_POLTERGEIST 134
-#define VARIOUS_SET_OCTOLOCK 135
-#define VARIOUS_CUT_1_3_HP_RAISE_STATS 136
-#define VARIOUS_TRY_END_NEUTRALIZING_GAS 137
+#define VARIOUS_CANCEL_MULTI_TURN_MOVES 0
+#define VARIOUS_SET_MAGIC_COAT_TARGET 1
+#define VARIOUS_IS_RUNNING_IMPOSSIBLE 2
+#define VARIOUS_GET_MOVE_TARGET 3
+#define VARIOUS_GET_BATTLER_FAINTED 4
+#define VARIOUS_RESET_INTIMIDATE_TRACE_BITS 5
+#define VARIOUS_UPDATE_CHOICE_MOVE_ON_LVL_UP 6
+#define VARIOUS_RESET_PLAYER_FAINTED 7
+#define VARIOUS_PALACE_FLAVOR_TEXT 8
+#define VARIOUS_ARENA_JUDGMENT_WINDOW 9
+#define VARIOUS_ARENA_OPPONENT_MON_LOST 10
+#define VARIOUS_ARENA_PLAYER_MON_LOST 11
+#define VARIOUS_ARENA_BOTH_MONS_LOST 12
+#define VARIOUS_EMIT_YESNOBOX 13
+#define VARIOUS_DRAW_ARENA_REF_TEXT_BOX 14
+#define VARIOUS_ERASE_ARENA_REF_TEXT_BOX 15
+#define VARIOUS_ARENA_JUDGMENT_STRING 16
+#define VARIOUS_ARENA_WAIT_STRING 17
+#define VARIOUS_WAIT_CRY 18
+#define VARIOUS_RETURN_OPPONENT_MON1 19
+#define VARIOUS_RETURN_OPPONENT_MON2 20
+#define VARIOUS_VOLUME_DOWN 21
+#define VARIOUS_VOLUME_UP 22
+#define VARIOUS_SET_ALREADY_STATUS_MOVE_ATTEMPT 23
+#define VARIOUS_PALACE_TRY_ESCAPE_STATUS 24
+#define VARIOUS_SET_TELEPORT_OUTCOME 25
+#define VARIOUS_PLAY_TRAINER_DEFEATED_MUSIC 26
+#define VARIOUS_STAT_TEXT_BUFFER 27
+#define VARIOUS_SWITCHIN_ABILITIES 28
+#define VARIOUS_SAVE_TARGET 29
+#define VARIOUS_RESTORE_TARGET 30
+#define VARIOUS_INSTANT_HP_DROP 31
+#define VARIOUS_CLEAR_STATUS 32
+#define VARIOUS_RESTORE_PP 33
+#define VARIOUS_TRY_ACTIVATE_MOXIE 34
+#define VARIOUS_TRY_ACTIVATE_FELL_STINGER 35
+#define VARIOUS_PLAY_MOVE_ANIMATION 36
+#define VARIOUS_SET_LUCKY_CHANT 37
+#define VARIOUS_SUCKER_PUNCH_CHECK 38
+#define VARIOUS_SET_SIMPLE_BEAM 39
+#define VARIOUS_TRY_ENTRAINMENT 40
+#define VARIOUS_SET_LAST_USED_ABILITY 41
+#define VARIOUS_TRY_HEAL_PULSE 42
+#define VARIOUS_TRY_QUASH 43
+#define VARIOUS_INVERT_STAT_STAGES 44
+#define VARIOUS_SET_TERRAIN 45
+#define VARIOUS_TRY_ME_FIRST 46
+#define VARIOUS_JUMP_IF_BATTLE_END 47
+#define VARIOUS_TRY_ELECTRIFY 48
+#define VARIOUS_TRY_REFLECT_TYPE 49
+#define VARIOUS_TRY_SOAK 50
+#define VARIOUS_HANDLE_MEGA_EVO 51
+#define VARIOUS_TRY_LAST_RESORT 52
+#define VARIOUS_ARGUMENT_STATUS_EFFECT 53
+#define VARIOUS_TRY_HIT_SWITCH_TARGET 54
+#define VARIOUS_TRY_AUTOTOMIZE 55
+#define VARIOUS_TRY_COPYCAT 56
+#define VARIOUS_ABILITY_POPUP 57
+#define VARIOUS_DEFOG 58
+#define VARIOUS_JUMP_IF_TARGET_ALLY 59
+#define VARIOUS_TRY_SYNCHRONOISE 60
+#define VARIOUS_PSYCHO_SHIFT 61
+#define VARIOUS_CURE_STATUS 62
+#define VARIOUS_POWER_TRICK 63
+#define VARIOUS_AFTER_YOU 64
+#define VARIOUS_BESTOW 65
+#define VARIOUS_ARGUMENT_TO_MOVE_EFFECT 66
+#define VARIOUS_JUMP_IF_NOT_GROUNDED 67
+#define VARIOUS_HANDLE_TRAINER_SLIDE_MSG 68
+#define VARIOUS_TRY_TRAINER_SLIDE_MSG_FIRST_OFF 69
+#define VARIOUS_TRY_TRAINER_SLIDE_MSG_LAST_ON 70
+#define VARIOUS_SET_AURORA_VEIL 71
+#define VARIOUS_TRY_THIRD_TYPE 72
+#define VARIOUS_ACUPRESSURE 73
+#define VARIOUS_SET_POWDER 74
+#define VARIOUS_SPECTRAL_THIEF 75
+#define VARIOUS_GRAVITY_ON_AIRBORNE_MONS 76
+#define VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS 77
+#define VARIOUS_JUMP_IF_ROAR_FAILS 78
+#define VARIOUS_TRY_INSTRUCT 79
+#define VARIOUS_JUMP_IF_NOT_BERRY 80
+#define VARIOUS_TRACE_ABILITY 81
+#define VARIOUS_UPDATE_NICK 82
+#define VARIOUS_TRY_ILLUSION_OFF 83
+#define VARIOUS_SET_SPRITEIGNORE0HP 84
+#define VARIOUS_HANDLE_FORM_CHANGE 85
+#define VARIOUS_GET_STAT_VALUE 86
+#define VARIOUS_JUMP_IF_FULL_HP 87
+#define VARIOUS_LOSE_TYPE 88
+#define VARIOUS_TRY_ACTIVATE_SOULHEART 89
+#define VARIOUS_TRY_ACTIVATE_RECEIVER 90
+#define VARIOUS_TRY_ACTIVATE_BEAST_BOOST 91
+#define VARIOUS_TRY_FRISK 92
+#define VARIOUS_JUMP_IF_SHIELDS_DOWN_PROTECTED 93
+#define VARIOUS_TRY_FAIRY_LOCK 94
+#define VARIOUS_JUMP_IF_NO_ALLY 95
+#define VARIOUS_POISON_TYPE_IMMUNITY 96
+#define VARIOUS_JUMP_IF_NO_HOLD_EFFECT 97
+#define VARIOUS_INFATUATE_WITH_BATTLER 98
+#define VARIOUS_SET_LAST_USED_ITEM 99
+#define VARIOUS_PARALYZE_TYPE_IMMUNITY 100
+#define VARIOUS_JUMP_IF_ABSENT 101
+#define VARIOUS_DESTROY_ABILITY_POPUP 102
+#define VARIOUS_TOTEM_BOOST 103
+#define VARIOUS_TRY_ACTIVATE_GRIM_NEIGH 104
+#define VARIOUS_MOVEEND_ITEM_EFFECTS 105
+#define VARIOUS_TERRAIN_SEED 106
+#define VARIOUS_MAKE_INVISIBLE 107
+#define VARIOUS_ROOM_SERVICE 108
+#define VARIOUS_JUMP_IF_TERRAIN_AFFECTED 109
+#define VARIOUS_EERIE_SPELL_PP_REDUCE 110
+#define VARIOUS_JUMP_IF_TEAM_HEALTHY 111
+#define VARIOUS_TRY_HEAL_QUARTER_HP 112
+#define VARIOUS_REMOVE_TERRAIN 113
+#define VARIOUS_JUMP_IF_PRANKSTER_BLOCKED 114
+#define VARIOUS_TRY_TO_CLEAR_PRIMAL_WEATHER 115
+#define VARIOUS_GET_ROTOTILLER_TARGETS 116
+#define VARIOUS_JUMP_IF_NOT_ROTOTILLER_AFFECTED 117
+#define VARIOUS_TRY_ACTIVATE_BATTLE_BOND 118
+#define VARIOUS_CONSUME_BERRY 119
+#define VARIOUS_JUMP_IF_CANT_REVERT_TO_PRIMAL 120
+#define VARIOUS_HANDLE_PRIMAL_REVERSION 121
+#define VARIOUS_APPLY_PLASMA_FISTS 122
+#define VARIOUS_JUMP_IF_SPECIES 123
+#define VARIOUS_UPDATE_ABILITY_POPUP 124
+#define VARIOUS_JUMP_IF_WEATHER_AFFECTED 125
+#define VARIOUS_JUMP_IF_LEAF_GUARD_PROTECTED 126
+#define VARIOUS_SET_ATTACKER_STICKY_WEB_USER 127
+#define VARIOUS_TRY_TO_APPLY_MIMICRY 128
+#define VARIOUS_PHOTON_GEYSER_CHECK 129
+#define VARIOUS_SHELL_SIDE_ARM_CHECK 130
+#define VARIOUS_TRY_NO_RETREAT 131
+#define VARIOUS_TRY_TAR_SHOT 132
+#define VARIOUS_CAN_TAR_SHOT_WORK 133
+#define VARIOUS_CHECK_POLTERGEIST 134
+#define VARIOUS_SET_OCTOLOCK 135
+#define VARIOUS_CUT_1_3_HP_RAISE_STATS 136
+#define VARIOUS_TRY_END_NEUTRALIZING_GAS 137
+#define VARIOUS_JUMP_IF_UNDER_200 138
+#define VARIOUS_SET_SKY_DROP 139
+#define VARIOUS_CLEAR_SKY_DROP 140
+#define VARIOUS_SKY_DROP_YAWN 141
+#define VARIOUS_JUMP_IF_CANT_FLING 142
+#define VARIOUS_JUMP_IF_HOLD_EFFECT 143
+#define VARIOUS_CURE_CERTAIN_STATUSES 144
+#define VARIOUS_TRY_RESET_NEGATIVE_STAT_STAGES 145
+#define VARIOUS_JUMP_IF_LAST_USED_ITEM_BERRY 146
+#define VARIOUS_JUMP_IF_LAST_USED_ITEM_HOLD_EFFECT 147
+#define VARIOUS_SAVE_BATTLER_ITEM 148
+#define VARIOUS_RESTORE_BATTLER_ITEM 149
+#define VARIOUS_BATTLER_ITEM_TO_LAST_USED_ITEM 150
// Cmd_manipulatedamage
#define DMG_CHANGE_SIGN 0
@@ -282,18 +295,20 @@
#define MOVEEND_ITEM_EFFECTS_ALL 15
#define MOVEEND_KINGSROCK 16 // These item effects will occur each strike of a multi-hit move
#define MOVEEND_SUBSTITUTE 17
-#define MOVEEND_UPDATE_LAST_MOVES 18
-#define MOVEEND_MIRROR_MOVE 19
-#define MOVEEND_NEXT_TARGET 20 // Everything up until here is handled for each strike of a multi-hit move
-#define MOVEEND_EJECT_BUTTON 21
-#define MOVEEND_RED_CARD 22
-#define MOVEEND_EJECT_PACK 23
-#define MOVEEND_LIFEORB_SHELLBELL 24 // Includes shell bell, throat spray, etc
-#define MOVEEND_PICKPOCKET 25
-#define MOVEEND_DANCER 26
-#define MOVEEND_EMERGENCY_EXIT 27
-#define MOVEEND_CLEAR_BITS 28
-#define MOVEEND_COUNT 29
+#define MOVEEND_SKY_DROP_CONFUSE 18
+#define MOVEEND_UPDATE_LAST_MOVES 19
+#define MOVEEND_MIRROR_MOVE 20
+#define MOVEEND_NEXT_TARGET 21 // Everything up until here is handled for each strike of a multi-hit move
+#define MOVEEND_MAGICIAN 22 // Occurs after final multi-hit strike, and after other items/abilities would activate
+#define MOVEEND_EJECT_BUTTON 23
+#define MOVEEND_RED_CARD 24
+#define MOVEEND_EJECT_PACK 25
+#define MOVEEND_LIFEORB_SHELLBELL 26 // Includes shell bell, throat spray, etc
+#define MOVEEND_PICKPOCKET 27
+#define MOVEEND_DANCER 28
+#define MOVEEND_EMERGENCY_EXIT 29
+#define MOVEEND_CLEAR_BITS 30
+#define MOVEEND_COUNT 31
// switch cases
#define B_SWITCH_NORMAL 0
diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h
index 7846fa5218..83e931c2ca 100644
--- a/include/constants/battle_string_ids.h
+++ b/include/constants/battle_string_ids.h
@@ -592,25 +592,27 @@
#define STRINGID_STRONGWINDSDISSIPATED 588
#define STRINGID_MYSTERIOUSAIRCURRENTBLOWSON 589
#define STRINGID_ATTACKWEAKENEDBSTRONGWINDS 590
-#define STRINGID_STUFFCHEEKSCANTSELECT 592
-#define STRINGID_PKMNREVERTEDTOPRIMAL 593
-#define STRINGID_BUTPOKEMONCANTUSETHEMOVE 594
-#define STRINGID_BUTHOOPACANTUSEIT 595
-#define STRINGID_BROKETHROUGHPROTECTION 596
-#define STRINGID_ABILITYALLOWSONLYMOVE 597
-#define STRINGID_SWAPPEDABILITIES 598
-#define STRINGID_PASTELVEILPROTECTED 599
-#define STRINGID_PASTELVEILENTERS 600
-#define STRINGID_BATTLERTYPECHANGEDTO 601
-#define STRINGID_BOTHCANNOLONGERESCAPE 602
-#define STRINGID_CANTESCAPEDUETOUSEDMOVE 603
-#define STRINGID_PKMNBECAMEWEAKERTOFIRE 604
-#define STRINGID_ABOUTTOUSEPOLTERGEIST 605
-#define STRINGID_CANTESCAPEBECAUSEOFCURRENTMOVE 606
-#define STRINGID_NEUTRALIZINGGASENTERS 607
-#define STRINGID_NEUTRALIZINGGASOVER 608
+#define STRINGID_STUFFCHEEKSCANTSELECT 591
+#define STRINGID_PKMNREVERTEDTOPRIMAL 592
+#define STRINGID_BUTPOKEMONCANTUSETHEMOVE 593
+#define STRINGID_BUTHOOPACANTUSEIT 594
+#define STRINGID_BROKETHROUGHPROTECTION 595
+#define STRINGID_ABILITYALLOWSONLYMOVE 596
+#define STRINGID_SWAPPEDABILITIES 597
+#define STRINGID_PASTELVEILPROTECTED 598
+#define STRINGID_PASTELVEILENTERS 599
+#define STRINGID_BATTLERTYPECHANGEDTO 600
+#define STRINGID_BOTHCANNOLONGERESCAPE 601
+#define STRINGID_CANTESCAPEDUETOUSEDMOVE 602
+#define STRINGID_PKMNBECAMEWEAKERTOFIRE 603
+#define STRINGID_ABOUTTOUSEPOLTERGEIST 604
+#define STRINGID_CANTESCAPEBECAUSEOFCURRENTMOVE 605
+#define STRINGID_NEUTRALIZINGGASENTERS 606
+#define STRINGID_NEUTRALIZINGGASOVER 607
+#define STRINGID_TARGETTOOHEAVY 608
+#define STRINGID_PKMNTOOKTARGETHIGH 609
-#define BATTLESTRINGS_COUNT 609
+#define BATTLESTRINGS_COUNT 610
// The below IDs are all indexes into battle message tables,
// used to determine which of a set of messages to print.
@@ -661,6 +663,7 @@
#define B_MSG_TURN1_PHANTOM_FORCE 8
#define B_MSG_TURN1_GEOMANCY 9
#define B_MSG_TURN1_FREEZE_SHOCK 10
+#define B_MSG_TURN1_SKY_DROP 11
// gMoveWeatherChangeStringIds
#define B_MSG_STARTED_RAIN 0
diff --git a/include/constants/flags.h b/include/constants/flags.h
index 793fe11354..eacb2426db 100644
--- a/include/constants/flags.h
+++ b/include/constants/flags.h
@@ -190,7 +190,7 @@
#define FLAG_RECEIVED_TM40 0xAA
#define FLAG_RECEIVED_TM04 0xAB
#define FLAG_RECEIVED_TM03 0xAC
-#define FLAG_DECORATION_0 0xAD
+#define FLAG_HIDE_SECRET_BASE_TRAINER 0xAD
#define FLAG_DECORATION_1 0xAE
#define FLAG_DECORATION_2 0xAF
#define FLAG_DECORATION_3 0xB0
diff --git a/include/constants/global.h b/include/constants/global.h
index ef7861e9ed..096094220d 100644
--- a/include/constants/global.h
+++ b/include/constants/global.h
@@ -29,11 +29,20 @@
#define GAME_VERSION (VERSION_EMERALD)
#define GAME_LANGUAGE (LANGUAGE_ENGLISH)
+// party sizes
+#define PARTY_SIZE 6
+#define MULTI_PARTY_SIZE (PARTY_SIZE / 2)
+#define FRONTIER_PARTY_SIZE 3
+#define FRONTIER_DOUBLES_PARTY_SIZE 4
+#define FRONTIER_MULTI_PARTY_SIZE 2
+#define MAX_FRONTIER_PARTY_SIZE FRONTIER_DOUBLES_PARTY_SIZE
+#define UNION_ROOM_PARTY_SIZE 2
+
// capacities of various saveblock objects
#define DAYCARE_MON_COUNT 2
#define POKEBLOCKS_COUNT 40
#define OBJECT_EVENTS_COUNT 16
-#define MAIL_COUNT 16
+#define MAIL_COUNT (10 + PARTY_SIZE)
#define SECRET_BASES_COUNT 20
#define TV_SHOWS_COUNT 25
#define POKE_NEWS_COUNT 16
@@ -70,7 +79,6 @@
#define TRAINER_ID_LENGTH 4
#define MAX_MON_MOVES 4
-#define NUM_STATS 6
#define CONTESTANT_COUNT 4
#define CONTEST_CATEGORY_COOL 0
@@ -80,15 +88,6 @@
#define CONTEST_CATEGORY_TOUGH 4
#define CONTEST_CATEGORIES_COUNT 5
-// party sizes
-#define PARTY_SIZE 6
-#define MULTI_PARTY_SIZE (PARTY_SIZE / 2)
-#define FRONTIER_PARTY_SIZE 3
-#define FRONTIER_DOUBLES_PARTY_SIZE 4
-#define FRONTIER_MULTI_PARTY_SIZE 2
-#define MAX_FRONTIER_PARTY_SIZE FRONTIER_DOUBLES_PARTY_SIZE
-#define UNION_ROOM_PARTY_SIZE 2
-
// string lengths
#define ITEM_NAME_LENGTH 14
#define POKEMON_NAME_LENGTH 10
@@ -139,4 +138,13 @@
#define DIR_NORTHWEST 7
#define DIR_NORTHEAST 8
+#define CONNECTION_INVALID -1
+#define CONNECTION_NONE 0
+#define CONNECTION_SOUTH 1
+#define CONNECTION_NORTH 2
+#define CONNECTION_WEST 3
+#define CONNECTION_EAST 4
+#define CONNECTION_DIVE 5
+#define CONNECTION_EMERGE 6
+
#endif // GUARD_CONSTANTS_GLOBAL_H
diff --git a/include/constants/hold_effects.h b/include/constants/hold_effects.h
index d15e50d5ff..e0361795d7 100644
--- a/include/constants/hold_effects.h
+++ b/include/constants/hold_effects.h
@@ -100,7 +100,7 @@
#define HOLD_EFFECT_ADAMANT_ORB 94
#define HOLD_EFFECT_LUSTROUS_ORB 95
#define HOLD_EFFECT_GRISEOUS_ORB 96
-#define HOLD_EFFECT_GRACIDEA 97
+#define HOLD_EFFECT_ENIGMA_BERRY 97
#define HOLD_EFFECT_RESIST_BERRY 98
#define HOLD_EFFECT_POWER_ITEM 99
#define HOLD_EFFECT_RESTORE_PCT_HP 100
diff --git a/include/constants/maps.h b/include/constants/maps.h
index 6524f8c14a..2ad4ea8df5 100644
--- a/include/constants/maps.h
+++ b/include/constants/maps.h
@@ -9,12 +9,6 @@
#define MAP_GROUP(map) (MAP_##map >> 8)
#define MAP_NUM(map) (MAP_##map & 0xFF)
-// These groups are used by pokedex_area_screen.c to find wild
-// pokemon locations.
-#define MAP_GROUP_OVERWORLD_MONS MAP_GROUP(PETALBURG_CITY)
-#define MAP_GROUP_SPECIAL_MONS_1 MAP_GROUP(METEOR_FALLS_1F_1R)
-#define MAP_GROUP_SPECIAL_MONS_2 MAP_GROUP(SAFARI_ZONE_NORTHWEST)
-
// IDs for dynamic warps. Both are used in the dest_warp_id field for warp events, but they
// are never read in practice. A dest_map of MAP_NONE is used to indicate that a
// dynamic warp should be used, at which point the warp id is ignored. It can be passed to
diff --git a/include/constants/metatile_behaviors.h b/include/constants/metatile_behaviors.h
index 5f37713f30..86f35ce50d 100755
--- a/include/constants/metatile_behaviors.h
+++ b/include/constants/metatile_behaviors.h
@@ -9,7 +9,7 @@
#define MB_UNUSED_05 0x05
#define MB_DEEP_SAND 0x06
#define MB_SHORT_GRASS 0x07
-#define MB_UNUSED_CAVE 0x08
+#define MB_CAVE 0x08
#define MB_LONG_GRASS_SOUTH_EDGE 0x09
#define MB_NO_RUNNING 0x0A
#define MB_INDOOR_ENCOUNTER 0x0B
@@ -179,8 +179,8 @@
#define MB_UNUSED_AF 0xAF
#define MB_SECRET_BASE_PC 0xB0
#define MB_SECRET_BASE_REGISTER_PC 0xB1
-#define MB_SECRET_BASE_UNUSED 0xB2
-#define MB_BLOCK_DECORATION 0xB3
+#define MB_SECRET_BASE_SCENERY 0xB2
+#define MB_SECRET_BASE_TRAINER_SPOT 0xB3
#define MB_SECRET_BASE_DECORATION 0xB4
#define MB_HOLDS_SMALL_DECORATION 0xB5
#define MB_UNUSED_B6 0xB6
@@ -241,6 +241,9 @@
#define MB_UNUSED_ED 0xED
#define MB_UNUSED_EE 0xEE
#define MB_UNUSED_EF 0xEF
+
+#define NUM_METATILE_BEHAVIORS 0xF0
+
#define MB_INVALID 0xFF
#endif // GUARD_METATILE_BEHAVIORS_H
diff --git a/include/constants/pokedex.h b/include/constants/pokedex.h
new file mode 100644
index 0000000000..7b29cee244
--- /dev/null
+++ b/include/constants/pokedex.h
@@ -0,0 +1,1139 @@
+#ifndef GUARD_CONSTANTS_POKEDEX_H
+#define GUARD_CONSTANTS_POKEDEX_H
+
+// National Pokedex order
+enum {
+ NATIONAL_DEX_NONE,
+ // Kanto
+ NATIONAL_DEX_BULBASAUR,
+ NATIONAL_DEX_IVYSAUR,
+ NATIONAL_DEX_VENUSAUR,
+ NATIONAL_DEX_CHARMANDER,
+ NATIONAL_DEX_CHARMELEON,
+ NATIONAL_DEX_CHARIZARD,
+ NATIONAL_DEX_SQUIRTLE,
+ NATIONAL_DEX_WARTORTLE,
+ NATIONAL_DEX_BLASTOISE,
+ NATIONAL_DEX_CATERPIE,
+ NATIONAL_DEX_METAPOD,
+ NATIONAL_DEX_BUTTERFREE,
+ NATIONAL_DEX_WEEDLE,
+ NATIONAL_DEX_KAKUNA,
+ NATIONAL_DEX_BEEDRILL,
+ NATIONAL_DEX_PIDGEY,
+ NATIONAL_DEX_PIDGEOTTO,
+ NATIONAL_DEX_PIDGEOT,
+ NATIONAL_DEX_RATTATA,
+ NATIONAL_DEX_RATICATE,
+ NATIONAL_DEX_SPEAROW,
+ NATIONAL_DEX_FEAROW,
+ NATIONAL_DEX_EKANS,
+ NATIONAL_DEX_ARBOK,
+ NATIONAL_DEX_PIKACHU,
+ NATIONAL_DEX_RAICHU,
+ NATIONAL_DEX_SANDSHREW,
+ NATIONAL_DEX_SANDSLASH,
+ NATIONAL_DEX_NIDORAN_F,
+ NATIONAL_DEX_NIDORINA,
+ NATIONAL_DEX_NIDOQUEEN,
+ NATIONAL_DEX_NIDORAN_M,
+ NATIONAL_DEX_NIDORINO,
+ NATIONAL_DEX_NIDOKING,
+ NATIONAL_DEX_CLEFAIRY,
+ NATIONAL_DEX_CLEFABLE,
+ NATIONAL_DEX_VULPIX,
+ NATIONAL_DEX_NINETALES,
+ NATIONAL_DEX_JIGGLYPUFF,
+ NATIONAL_DEX_WIGGLYTUFF,
+ NATIONAL_DEX_ZUBAT,
+ NATIONAL_DEX_GOLBAT,
+ NATIONAL_DEX_ODDISH,
+ NATIONAL_DEX_GLOOM,
+ NATIONAL_DEX_VILEPLUME,
+ NATIONAL_DEX_PARAS,
+ NATIONAL_DEX_PARASECT,
+ NATIONAL_DEX_VENONAT,
+ NATIONAL_DEX_VENOMOTH,
+ NATIONAL_DEX_DIGLETT,
+ NATIONAL_DEX_DUGTRIO,
+ NATIONAL_DEX_MEOWTH,
+ NATIONAL_DEX_PERSIAN,
+ NATIONAL_DEX_PSYDUCK,
+ NATIONAL_DEX_GOLDUCK,
+ NATIONAL_DEX_MANKEY,
+ NATIONAL_DEX_PRIMEAPE,
+ NATIONAL_DEX_GROWLITHE,
+ NATIONAL_DEX_ARCANINE,
+ NATIONAL_DEX_POLIWAG,
+ NATIONAL_DEX_POLIWHIRL,
+ NATIONAL_DEX_POLIWRATH,
+ NATIONAL_DEX_ABRA,
+ NATIONAL_DEX_KADABRA,
+ NATIONAL_DEX_ALAKAZAM,
+ NATIONAL_DEX_MACHOP,
+ NATIONAL_DEX_MACHOKE,
+ NATIONAL_DEX_MACHAMP,
+ NATIONAL_DEX_BELLSPROUT,
+ NATIONAL_DEX_WEEPINBELL,
+ NATIONAL_DEX_VICTREEBEL,
+ NATIONAL_DEX_TENTACOOL,
+ NATIONAL_DEX_TENTACRUEL,
+ NATIONAL_DEX_GEODUDE,
+ NATIONAL_DEX_GRAVELER,
+ NATIONAL_DEX_GOLEM,
+ NATIONAL_DEX_PONYTA,
+ NATIONAL_DEX_RAPIDASH,
+ NATIONAL_DEX_SLOWPOKE,
+ NATIONAL_DEX_SLOWBRO,
+ NATIONAL_DEX_MAGNEMITE,
+ NATIONAL_DEX_MAGNETON,
+ NATIONAL_DEX_FARFETCHD,
+ NATIONAL_DEX_DODUO,
+ NATIONAL_DEX_DODRIO,
+ NATIONAL_DEX_SEEL,
+ NATIONAL_DEX_DEWGONG,
+ NATIONAL_DEX_GRIMER,
+ NATIONAL_DEX_MUK,
+ NATIONAL_DEX_SHELLDER,
+ NATIONAL_DEX_CLOYSTER,
+ NATIONAL_DEX_GASTLY,
+ NATIONAL_DEX_HAUNTER,
+ NATIONAL_DEX_GENGAR,
+ NATIONAL_DEX_ONIX,
+ NATIONAL_DEX_DROWZEE,
+ NATIONAL_DEX_HYPNO,
+ NATIONAL_DEX_KRABBY,
+ NATIONAL_DEX_KINGLER,
+ NATIONAL_DEX_VOLTORB,
+ NATIONAL_DEX_ELECTRODE,
+ NATIONAL_DEX_EXEGGCUTE,
+ NATIONAL_DEX_EXEGGUTOR,
+ NATIONAL_DEX_CUBONE,
+ NATIONAL_DEX_MAROWAK,
+ NATIONAL_DEX_HITMONLEE,
+ NATIONAL_DEX_HITMONCHAN,
+ NATIONAL_DEX_LICKITUNG,
+ NATIONAL_DEX_KOFFING,
+ NATIONAL_DEX_WEEZING,
+ NATIONAL_DEX_RHYHORN,
+ NATIONAL_DEX_RHYDON,
+ NATIONAL_DEX_CHANSEY,
+ NATIONAL_DEX_TANGELA,
+ NATIONAL_DEX_KANGASKHAN,
+ NATIONAL_DEX_HORSEA,
+ NATIONAL_DEX_SEADRA,
+ NATIONAL_DEX_GOLDEEN,
+ NATIONAL_DEX_SEAKING,
+ NATIONAL_DEX_STARYU,
+ NATIONAL_DEX_STARMIE,
+ NATIONAL_DEX_MR_MIME,
+ NATIONAL_DEX_SCYTHER,
+ NATIONAL_DEX_JYNX,
+ NATIONAL_DEX_ELECTABUZZ,
+ NATIONAL_DEX_MAGMAR,
+ NATIONAL_DEX_PINSIR,
+ NATIONAL_DEX_TAUROS,
+ NATIONAL_DEX_MAGIKARP,
+ NATIONAL_DEX_GYARADOS,
+ NATIONAL_DEX_LAPRAS,
+ NATIONAL_DEX_DITTO,
+ NATIONAL_DEX_EEVEE,
+ NATIONAL_DEX_VAPOREON,
+ NATIONAL_DEX_JOLTEON,
+ NATIONAL_DEX_FLAREON,
+ NATIONAL_DEX_PORYGON,
+ NATIONAL_DEX_OMANYTE,
+ NATIONAL_DEX_OMASTAR,
+ NATIONAL_DEX_KABUTO,
+ NATIONAL_DEX_KABUTOPS,
+ NATIONAL_DEX_AERODACTYL,
+ NATIONAL_DEX_SNORLAX,
+ NATIONAL_DEX_ARTICUNO,
+ NATIONAL_DEX_ZAPDOS,
+ NATIONAL_DEX_MOLTRES,
+ NATIONAL_DEX_DRATINI,
+ NATIONAL_DEX_DRAGONAIR,
+ NATIONAL_DEX_DRAGONITE,
+ NATIONAL_DEX_MEWTWO,
+ NATIONAL_DEX_MEW,
+ // Johto
+ NATIONAL_DEX_CHIKORITA,
+ NATIONAL_DEX_BAYLEEF,
+ NATIONAL_DEX_MEGANIUM,
+ NATIONAL_DEX_CYNDAQUIL,
+ NATIONAL_DEX_QUILAVA,
+ NATIONAL_DEX_TYPHLOSION,
+ NATIONAL_DEX_TOTODILE,
+ NATIONAL_DEX_CROCONAW,
+ NATIONAL_DEX_FERALIGATR,
+ NATIONAL_DEX_SENTRET,
+ NATIONAL_DEX_FURRET,
+ NATIONAL_DEX_HOOTHOOT,
+ NATIONAL_DEX_NOCTOWL,
+ NATIONAL_DEX_LEDYBA,
+ NATIONAL_DEX_LEDIAN,
+ NATIONAL_DEX_SPINARAK,
+ NATIONAL_DEX_ARIADOS,
+ NATIONAL_DEX_CROBAT,
+ NATIONAL_DEX_CHINCHOU,
+ NATIONAL_DEX_LANTURN,
+ NATIONAL_DEX_PICHU,
+ NATIONAL_DEX_CLEFFA,
+ NATIONAL_DEX_IGGLYBUFF,
+ NATIONAL_DEX_TOGEPI,
+ NATIONAL_DEX_TOGETIC,
+ NATIONAL_DEX_NATU,
+ NATIONAL_DEX_XATU,
+ NATIONAL_DEX_MAREEP,
+ NATIONAL_DEX_FLAAFFY,
+ NATIONAL_DEX_AMPHAROS,
+ NATIONAL_DEX_BELLOSSOM,
+ NATIONAL_DEX_MARILL,
+ NATIONAL_DEX_AZUMARILL,
+ NATIONAL_DEX_SUDOWOODO,
+ NATIONAL_DEX_POLITOED,
+ NATIONAL_DEX_HOPPIP,
+ NATIONAL_DEX_SKIPLOOM,
+ NATIONAL_DEX_JUMPLUFF,
+ NATIONAL_DEX_AIPOM,
+ NATIONAL_DEX_SUNKERN,
+ NATIONAL_DEX_SUNFLORA,
+ NATIONAL_DEX_YANMA,
+ NATIONAL_DEX_WOOPER,
+ NATIONAL_DEX_QUAGSIRE,
+ NATIONAL_DEX_ESPEON,
+ NATIONAL_DEX_UMBREON,
+ NATIONAL_DEX_MURKROW,
+ NATIONAL_DEX_SLOWKING,
+ NATIONAL_DEX_MISDREAVUS,
+ NATIONAL_DEX_UNOWN,
+ NATIONAL_DEX_WOBBUFFET,
+ NATIONAL_DEX_GIRAFARIG,
+ NATIONAL_DEX_PINECO,
+ NATIONAL_DEX_FORRETRESS,
+ NATIONAL_DEX_DUNSPARCE,
+ NATIONAL_DEX_GLIGAR,
+ NATIONAL_DEX_STEELIX,
+ NATIONAL_DEX_SNUBBULL,
+ NATIONAL_DEX_GRANBULL,
+ NATIONAL_DEX_QWILFISH,
+ NATIONAL_DEX_SCIZOR,
+ NATIONAL_DEX_SHUCKLE,
+ NATIONAL_DEX_HERACROSS,
+ NATIONAL_DEX_SNEASEL,
+ NATIONAL_DEX_TEDDIURSA,
+ NATIONAL_DEX_URSARING,
+ NATIONAL_DEX_SLUGMA,
+ NATIONAL_DEX_MAGCARGO,
+ NATIONAL_DEX_SWINUB,
+ NATIONAL_DEX_PILOSWINE,
+ NATIONAL_DEX_CORSOLA,
+ NATIONAL_DEX_REMORAID,
+ NATIONAL_DEX_OCTILLERY,
+ NATIONAL_DEX_DELIBIRD,
+ NATIONAL_DEX_MANTINE,
+ NATIONAL_DEX_SKARMORY,
+ NATIONAL_DEX_HOUNDOUR,
+ NATIONAL_DEX_HOUNDOOM,
+ NATIONAL_DEX_KINGDRA,
+ NATIONAL_DEX_PHANPY,
+ NATIONAL_DEX_DONPHAN,
+ NATIONAL_DEX_PORYGON2,
+ NATIONAL_DEX_STANTLER,
+ NATIONAL_DEX_SMEARGLE,
+ NATIONAL_DEX_TYROGUE,
+ NATIONAL_DEX_HITMONTOP,
+ NATIONAL_DEX_SMOOCHUM,
+ NATIONAL_DEX_ELEKID,
+ NATIONAL_DEX_MAGBY,
+ NATIONAL_DEX_MILTANK,
+ NATIONAL_DEX_BLISSEY,
+ NATIONAL_DEX_RAIKOU,
+ NATIONAL_DEX_ENTEI,
+ NATIONAL_DEX_SUICUNE,
+ NATIONAL_DEX_LARVITAR,
+ NATIONAL_DEX_PUPITAR,
+ NATIONAL_DEX_TYRANITAR,
+ NATIONAL_DEX_LUGIA,
+ NATIONAL_DEX_HO_OH,
+ NATIONAL_DEX_CELEBI,
+ // Hoenn
+ NATIONAL_DEX_TREECKO,
+ NATIONAL_DEX_GROVYLE,
+ NATIONAL_DEX_SCEPTILE,
+ NATIONAL_DEX_TORCHIC,
+ NATIONAL_DEX_COMBUSKEN,
+ NATIONAL_DEX_BLAZIKEN,
+ NATIONAL_DEX_MUDKIP,
+ NATIONAL_DEX_MARSHTOMP,
+ NATIONAL_DEX_SWAMPERT,
+ NATIONAL_DEX_POOCHYENA,
+ NATIONAL_DEX_MIGHTYENA,
+ NATIONAL_DEX_ZIGZAGOON,
+ NATIONAL_DEX_LINOONE,
+ NATIONAL_DEX_WURMPLE,
+ NATIONAL_DEX_SILCOON,
+ NATIONAL_DEX_BEAUTIFLY,
+ NATIONAL_DEX_CASCOON,
+ NATIONAL_DEX_DUSTOX,
+ NATIONAL_DEX_LOTAD,
+ NATIONAL_DEX_LOMBRE,
+ NATIONAL_DEX_LUDICOLO,
+ NATIONAL_DEX_SEEDOT,
+ NATIONAL_DEX_NUZLEAF,
+ NATIONAL_DEX_SHIFTRY,
+ NATIONAL_DEX_TAILLOW,
+ NATIONAL_DEX_SWELLOW,
+ NATIONAL_DEX_WINGULL,
+ NATIONAL_DEX_PELIPPER,
+ NATIONAL_DEX_RALTS,
+ NATIONAL_DEX_KIRLIA,
+ NATIONAL_DEX_GARDEVOIR,
+ NATIONAL_DEX_SURSKIT,
+ NATIONAL_DEX_MASQUERAIN,
+ NATIONAL_DEX_SHROOMISH,
+ NATIONAL_DEX_BRELOOM,
+ NATIONAL_DEX_SLAKOTH,
+ NATIONAL_DEX_VIGOROTH,
+ NATIONAL_DEX_SLAKING,
+ NATIONAL_DEX_NINCADA,
+ NATIONAL_DEX_NINJASK,
+ NATIONAL_DEX_SHEDINJA,
+ NATIONAL_DEX_WHISMUR,
+ NATIONAL_DEX_LOUDRED,
+ NATIONAL_DEX_EXPLOUD,
+ NATIONAL_DEX_MAKUHITA,
+ NATIONAL_DEX_HARIYAMA,
+ NATIONAL_DEX_AZURILL,
+ NATIONAL_DEX_NOSEPASS,
+ NATIONAL_DEX_SKITTY,
+ NATIONAL_DEX_DELCATTY,
+ NATIONAL_DEX_SABLEYE,
+ NATIONAL_DEX_MAWILE,
+ NATIONAL_DEX_ARON,
+ NATIONAL_DEX_LAIRON,
+ NATIONAL_DEX_AGGRON,
+ NATIONAL_DEX_MEDITITE,
+ NATIONAL_DEX_MEDICHAM,
+ NATIONAL_DEX_ELECTRIKE,
+ NATIONAL_DEX_MANECTRIC,
+ NATIONAL_DEX_PLUSLE,
+ NATIONAL_DEX_MINUN,
+ NATIONAL_DEX_VOLBEAT,
+ NATIONAL_DEX_ILLUMISE,
+ NATIONAL_DEX_ROSELIA,
+ NATIONAL_DEX_GULPIN,
+ NATIONAL_DEX_SWALOT,
+ NATIONAL_DEX_CARVANHA,
+ NATIONAL_DEX_SHARPEDO,
+ NATIONAL_DEX_WAILMER,
+ NATIONAL_DEX_WAILORD,
+ NATIONAL_DEX_NUMEL,
+ NATIONAL_DEX_CAMERUPT,
+ NATIONAL_DEX_TORKOAL,
+ NATIONAL_DEX_SPOINK,
+ NATIONAL_DEX_GRUMPIG,
+ NATIONAL_DEX_SPINDA,
+ NATIONAL_DEX_TRAPINCH,
+ NATIONAL_DEX_VIBRAVA,
+ NATIONAL_DEX_FLYGON,
+ NATIONAL_DEX_CACNEA,
+ NATIONAL_DEX_CACTURNE,
+ NATIONAL_DEX_SWABLU,
+ NATIONAL_DEX_ALTARIA,
+ NATIONAL_DEX_ZANGOOSE,
+ NATIONAL_DEX_SEVIPER,
+ NATIONAL_DEX_LUNATONE,
+ NATIONAL_DEX_SOLROCK,
+ NATIONAL_DEX_BARBOACH,
+ NATIONAL_DEX_WHISCASH,
+ NATIONAL_DEX_CORPHISH,
+ NATIONAL_DEX_CRAWDAUNT,
+ NATIONAL_DEX_BALTOY,
+ NATIONAL_DEX_CLAYDOL,
+ NATIONAL_DEX_LILEEP,
+ NATIONAL_DEX_CRADILY,
+ NATIONAL_DEX_ANORITH,
+ NATIONAL_DEX_ARMALDO,
+ NATIONAL_DEX_FEEBAS,
+ NATIONAL_DEX_MILOTIC,
+ NATIONAL_DEX_CASTFORM,
+ NATIONAL_DEX_KECLEON,
+ NATIONAL_DEX_SHUPPET,
+ NATIONAL_DEX_BANETTE,
+ NATIONAL_DEX_DUSKULL,
+ NATIONAL_DEX_DUSCLOPS,
+ NATIONAL_DEX_TROPIUS,
+ NATIONAL_DEX_CHIMECHO,
+ NATIONAL_DEX_ABSOL,
+ NATIONAL_DEX_WYNAUT,
+ NATIONAL_DEX_SNORUNT,
+ NATIONAL_DEX_GLALIE,
+ NATIONAL_DEX_SPHEAL,
+ NATIONAL_DEX_SEALEO,
+ NATIONAL_DEX_WALREIN,
+ NATIONAL_DEX_CLAMPERL,
+ NATIONAL_DEX_HUNTAIL,
+ NATIONAL_DEX_GOREBYSS,
+ NATIONAL_DEX_RELICANTH,
+ NATIONAL_DEX_LUVDISC,
+ NATIONAL_DEX_BAGON,
+ NATIONAL_DEX_SHELGON,
+ NATIONAL_DEX_SALAMENCE,
+ NATIONAL_DEX_BELDUM,
+ NATIONAL_DEX_METANG,
+ NATIONAL_DEX_METAGROSS,
+ NATIONAL_DEX_REGIROCK,
+ NATIONAL_DEX_REGICE,
+ NATIONAL_DEX_REGISTEEL,
+ NATIONAL_DEX_LATIAS,
+ NATIONAL_DEX_LATIOS,
+ NATIONAL_DEX_KYOGRE,
+ NATIONAL_DEX_GROUDON,
+ NATIONAL_DEX_RAYQUAZA,
+ NATIONAL_DEX_JIRACHI,
+ NATIONAL_DEX_DEOXYS,
+ // Sinnoh
+ NATIONAL_DEX_TURTWIG,
+ NATIONAL_DEX_GROTLE,
+ NATIONAL_DEX_TORTERRA,
+ NATIONAL_DEX_CHIMCHAR,
+ NATIONAL_DEX_MONFERNO,
+ NATIONAL_DEX_INFERNAPE,
+ NATIONAL_DEX_PIPLUP,
+ NATIONAL_DEX_PRINPLUP,
+ NATIONAL_DEX_EMPOLEON,
+ NATIONAL_DEX_STARLY,
+ NATIONAL_DEX_STARAVIA,
+ NATIONAL_DEX_STARAPTOR,
+ NATIONAL_DEX_BIDOOF,
+ NATIONAL_DEX_BIBAREL,
+ NATIONAL_DEX_KRICKETOT,
+ NATIONAL_DEX_KRICKETUNE,
+ NATIONAL_DEX_SHINX,
+ NATIONAL_DEX_LUXIO,
+ NATIONAL_DEX_LUXRAY,
+ NATIONAL_DEX_BUDEW,
+ NATIONAL_DEX_ROSERADE,
+ NATIONAL_DEX_CRANIDOS,
+ NATIONAL_DEX_RAMPARDOS,
+ NATIONAL_DEX_SHIELDON,
+ NATIONAL_DEX_BASTIODON,
+ NATIONAL_DEX_BURMY,
+ NATIONAL_DEX_WORMADAM,
+ NATIONAL_DEX_MOTHIM,
+ NATIONAL_DEX_COMBEE,
+ NATIONAL_DEX_VESPIQUEN,
+ NATIONAL_DEX_PACHIRISU,
+ NATIONAL_DEX_BUIZEL,
+ NATIONAL_DEX_FLOATZEL,
+ NATIONAL_DEX_CHERUBI,
+ NATIONAL_DEX_CHERRIM,
+ NATIONAL_DEX_SHELLOS,
+ NATIONAL_DEX_GASTRODON,
+ NATIONAL_DEX_AMBIPOM,
+ NATIONAL_DEX_DRIFLOON,
+ NATIONAL_DEX_DRIFBLIM,
+ NATIONAL_DEX_BUNEARY,
+ NATIONAL_DEX_LOPUNNY,
+ NATIONAL_DEX_MISMAGIUS,
+ NATIONAL_DEX_HONCHKROW,
+ NATIONAL_DEX_GLAMEOW,
+ NATIONAL_DEX_PURUGLY,
+ NATIONAL_DEX_CHINGLING,
+ NATIONAL_DEX_STUNKY,
+ NATIONAL_DEX_SKUNTANK,
+ NATIONAL_DEX_BRONZOR,
+ NATIONAL_DEX_BRONZONG,
+ NATIONAL_DEX_BONSLY,
+ NATIONAL_DEX_MIME_JR,
+ NATIONAL_DEX_HAPPINY,
+ NATIONAL_DEX_CHATOT,
+ NATIONAL_DEX_SPIRITOMB,
+ NATIONAL_DEX_GIBLE,
+ NATIONAL_DEX_GABITE,
+ NATIONAL_DEX_GARCHOMP,
+ NATIONAL_DEX_MUNCHLAX,
+ NATIONAL_DEX_RIOLU,
+ NATIONAL_DEX_LUCARIO,
+ NATIONAL_DEX_HIPPOPOTAS,
+ NATIONAL_DEX_HIPPOWDON,
+ NATIONAL_DEX_SKORUPI,
+ NATIONAL_DEX_DRAPION,
+ NATIONAL_DEX_CROAGUNK,
+ NATIONAL_DEX_TOXICROAK,
+ NATIONAL_DEX_CARNIVINE,
+ NATIONAL_DEX_FINNEON,
+ NATIONAL_DEX_LUMINEON,
+ NATIONAL_DEX_MANTYKE,
+ NATIONAL_DEX_SNOVER,
+ NATIONAL_DEX_ABOMASNOW,
+ NATIONAL_DEX_WEAVILE,
+ NATIONAL_DEX_MAGNEZONE,
+ NATIONAL_DEX_LICKILICKY,
+ NATIONAL_DEX_RHYPERIOR,
+ NATIONAL_DEX_TANGROWTH,
+ NATIONAL_DEX_ELECTIVIRE,
+ NATIONAL_DEX_MAGMORTAR,
+ NATIONAL_DEX_TOGEKISS,
+ NATIONAL_DEX_YANMEGA,
+ NATIONAL_DEX_LEAFEON,
+ NATIONAL_DEX_GLACEON,
+ NATIONAL_DEX_GLISCOR,
+ NATIONAL_DEX_MAMOSWINE,
+ NATIONAL_DEX_PORYGON_Z,
+ NATIONAL_DEX_GALLADE,
+ NATIONAL_DEX_PROBOPASS,
+ NATIONAL_DEX_DUSKNOIR,
+ NATIONAL_DEX_FROSLASS,
+ NATIONAL_DEX_ROTOM,
+ NATIONAL_DEX_UXIE,
+ NATIONAL_DEX_MESPRIT,
+ NATIONAL_DEX_AZELF,
+ NATIONAL_DEX_DIALGA,
+ NATIONAL_DEX_PALKIA,
+ NATIONAL_DEX_HEATRAN,
+ NATIONAL_DEX_REGIGIGAS,
+ NATIONAL_DEX_GIRATINA,
+ NATIONAL_DEX_CRESSELIA,
+ NATIONAL_DEX_PHIONE,
+ NATIONAL_DEX_MANAPHY,
+ NATIONAL_DEX_DARKRAI,
+ NATIONAL_DEX_SHAYMIN,
+ NATIONAL_DEX_ARCEUS,
+ // Unova
+ NATIONAL_DEX_VICTINI,
+ NATIONAL_DEX_SNIVY,
+ NATIONAL_DEX_SERVINE,
+ NATIONAL_DEX_SERPERIOR,
+ NATIONAL_DEX_TEPIG,
+ NATIONAL_DEX_PIGNITE,
+ NATIONAL_DEX_EMBOAR,
+ NATIONAL_DEX_OSHAWOTT,
+ NATIONAL_DEX_DEWOTT,
+ NATIONAL_DEX_SAMUROTT,
+ NATIONAL_DEX_PATRAT,
+ NATIONAL_DEX_WATCHOG,
+ NATIONAL_DEX_LILLIPUP,
+ NATIONAL_DEX_HERDIER,
+ NATIONAL_DEX_STOUTLAND,
+ NATIONAL_DEX_PURRLOIN,
+ NATIONAL_DEX_LIEPARD,
+ NATIONAL_DEX_PANSAGE,
+ NATIONAL_DEX_SIMISAGE,
+ NATIONAL_DEX_PANSEAR,
+ NATIONAL_DEX_SIMISEAR,
+ NATIONAL_DEX_PANPOUR,
+ NATIONAL_DEX_SIMIPOUR,
+ NATIONAL_DEX_MUNNA,
+ NATIONAL_DEX_MUSHARNA,
+ NATIONAL_DEX_PIDOVE,
+ NATIONAL_DEX_TRANQUILL,
+ NATIONAL_DEX_UNFEZANT,
+ NATIONAL_DEX_BLITZLE,
+ NATIONAL_DEX_ZEBSTRIKA,
+ NATIONAL_DEX_ROGGENROLA,
+ NATIONAL_DEX_BOLDORE,
+ NATIONAL_DEX_GIGALITH,
+ NATIONAL_DEX_WOOBAT,
+ NATIONAL_DEX_SWOOBAT,
+ NATIONAL_DEX_DRILBUR,
+ NATIONAL_DEX_EXCADRILL,
+ NATIONAL_DEX_AUDINO,
+ NATIONAL_DEX_TIMBURR,
+ NATIONAL_DEX_GURDURR,
+ NATIONAL_DEX_CONKELDURR,
+ NATIONAL_DEX_TYMPOLE,
+ NATIONAL_DEX_PALPITOAD,
+ NATIONAL_DEX_SEISMITOAD,
+ NATIONAL_DEX_THROH,
+ NATIONAL_DEX_SAWK,
+ NATIONAL_DEX_SEWADDLE,
+ NATIONAL_DEX_SWADLOON,
+ NATIONAL_DEX_LEAVANNY,
+ NATIONAL_DEX_VENIPEDE,
+ NATIONAL_DEX_WHIRLIPEDE,
+ NATIONAL_DEX_SCOLIPEDE,
+ NATIONAL_DEX_COTTONEE,
+ NATIONAL_DEX_WHIMSICOTT,
+ NATIONAL_DEX_PETILIL,
+ NATIONAL_DEX_LILLIGANT,
+ NATIONAL_DEX_BASCULIN,
+ NATIONAL_DEX_SANDILE,
+ NATIONAL_DEX_KROKOROK,
+ NATIONAL_DEX_KROOKODILE,
+ NATIONAL_DEX_DARUMAKA,
+ NATIONAL_DEX_DARMANITAN,
+ NATIONAL_DEX_MARACTUS,
+ NATIONAL_DEX_DWEBBLE,
+ NATIONAL_DEX_CRUSTLE,
+ NATIONAL_DEX_SCRAGGY,
+ NATIONAL_DEX_SCRAFTY,
+ NATIONAL_DEX_SIGILYPH,
+ NATIONAL_DEX_YAMASK,
+ NATIONAL_DEX_COFAGRIGUS,
+ NATIONAL_DEX_TIRTOUGA,
+ NATIONAL_DEX_CARRACOSTA,
+ NATIONAL_DEX_ARCHEN,
+ NATIONAL_DEX_ARCHEOPS,
+ NATIONAL_DEX_TRUBBISH,
+ NATIONAL_DEX_GARBODOR,
+ NATIONAL_DEX_ZORUA,
+ NATIONAL_DEX_ZOROARK,
+ NATIONAL_DEX_MINCCINO,
+ NATIONAL_DEX_CINCCINO,
+ NATIONAL_DEX_GOTHITA,
+ NATIONAL_DEX_GOTHORITA,
+ NATIONAL_DEX_GOTHITELLE,
+ NATIONAL_DEX_SOLOSIS,
+ NATIONAL_DEX_DUOSION,
+ NATIONAL_DEX_REUNICLUS,
+ NATIONAL_DEX_DUCKLETT,
+ NATIONAL_DEX_SWANNA,
+ NATIONAL_DEX_VANILLITE,
+ NATIONAL_DEX_VANILLISH,
+ NATIONAL_DEX_VANILLUXE,
+ NATIONAL_DEX_DEERLING,
+ NATIONAL_DEX_SAWSBUCK,
+ NATIONAL_DEX_EMOLGA,
+ NATIONAL_DEX_KARRABLAST,
+ NATIONAL_DEX_ESCAVALIER,
+ NATIONAL_DEX_FOONGUS,
+ NATIONAL_DEX_AMOONGUSS,
+ NATIONAL_DEX_FRILLISH,
+ NATIONAL_DEX_JELLICENT,
+ NATIONAL_DEX_ALOMOMOLA,
+ NATIONAL_DEX_JOLTIK,
+ NATIONAL_DEX_GALVANTULA,
+ NATIONAL_DEX_FERROSEED,
+ NATIONAL_DEX_FERROTHORN,
+ NATIONAL_DEX_KLINK,
+ NATIONAL_DEX_KLANG,
+ NATIONAL_DEX_KLINKLANG,
+ NATIONAL_DEX_TYNAMO,
+ NATIONAL_DEX_EELEKTRIK,
+ NATIONAL_DEX_EELEKTROSS,
+ NATIONAL_DEX_ELGYEM,
+ NATIONAL_DEX_BEHEEYEM,
+ NATIONAL_DEX_LITWICK,
+ NATIONAL_DEX_LAMPENT,
+ NATIONAL_DEX_CHANDELURE,
+ NATIONAL_DEX_AXEW,
+ NATIONAL_DEX_FRAXURE,
+ NATIONAL_DEX_HAXORUS,
+ NATIONAL_DEX_CUBCHOO,
+ NATIONAL_DEX_BEARTIC,
+ NATIONAL_DEX_CRYOGONAL,
+ NATIONAL_DEX_SHELMET,
+ NATIONAL_DEX_ACCELGOR,
+ NATIONAL_DEX_STUNFISK,
+ NATIONAL_DEX_MIENFOO,
+ NATIONAL_DEX_MIENSHAO,
+ NATIONAL_DEX_DRUDDIGON,
+ NATIONAL_DEX_GOLETT,
+ NATIONAL_DEX_GOLURK,
+ NATIONAL_DEX_PAWNIARD,
+ NATIONAL_DEX_BISHARP,
+ NATIONAL_DEX_BOUFFALANT,
+ NATIONAL_DEX_RUFFLET,
+ NATIONAL_DEX_BRAVIARY,
+ NATIONAL_DEX_VULLABY,
+ NATIONAL_DEX_MANDIBUZZ,
+ NATIONAL_DEX_HEATMOR,
+ NATIONAL_DEX_DURANT,
+ NATIONAL_DEX_DEINO,
+ NATIONAL_DEX_ZWEILOUS,
+ NATIONAL_DEX_HYDREIGON,
+ NATIONAL_DEX_LARVESTA,
+ NATIONAL_DEX_VOLCARONA,
+ NATIONAL_DEX_COBALION,
+ NATIONAL_DEX_TERRAKION,
+ NATIONAL_DEX_VIRIZION,
+ NATIONAL_DEX_TORNADUS,
+ NATIONAL_DEX_THUNDURUS,
+ NATIONAL_DEX_RESHIRAM,
+ NATIONAL_DEX_ZEKROM,
+ NATIONAL_DEX_LANDORUS,
+ NATIONAL_DEX_KYUREM,
+ NATIONAL_DEX_KELDEO,
+ NATIONAL_DEX_MELOETTA,
+ NATIONAL_DEX_GENESECT,
+ // Kalos
+ NATIONAL_DEX_CHESPIN,
+ NATIONAL_DEX_QUILLADIN,
+ NATIONAL_DEX_CHESNAUGHT,
+ NATIONAL_DEX_FENNEKIN,
+ NATIONAL_DEX_BRAIXEN,
+ NATIONAL_DEX_DELPHOX,
+ NATIONAL_DEX_FROAKIE,
+ NATIONAL_DEX_FROGADIER,
+ NATIONAL_DEX_GRENINJA,
+ NATIONAL_DEX_BUNNELBY,
+ NATIONAL_DEX_DIGGERSBY,
+ NATIONAL_DEX_FLETCHLING,
+ NATIONAL_DEX_FLETCHINDER,
+ NATIONAL_DEX_TALONFLAME,
+ NATIONAL_DEX_SCATTERBUG,
+ NATIONAL_DEX_SPEWPA,
+ NATIONAL_DEX_VIVILLON,
+ NATIONAL_DEX_LITLEO,
+ NATIONAL_DEX_PYROAR,
+ NATIONAL_DEX_FLABEBE,
+ NATIONAL_DEX_FLOETTE,
+ NATIONAL_DEX_FLORGES,
+ NATIONAL_DEX_SKIDDO,
+ NATIONAL_DEX_GOGOAT,
+ NATIONAL_DEX_PANCHAM,
+ NATIONAL_DEX_PANGORO,
+ NATIONAL_DEX_FURFROU,
+ NATIONAL_DEX_ESPURR,
+ NATIONAL_DEX_MEOWSTIC,
+ NATIONAL_DEX_HONEDGE,
+ NATIONAL_DEX_DOUBLADE,
+ NATIONAL_DEX_AEGISLASH,
+ NATIONAL_DEX_SPRITZEE,
+ NATIONAL_DEX_AROMATISSE,
+ NATIONAL_DEX_SWIRLIX,
+ NATIONAL_DEX_SLURPUFF,
+ NATIONAL_DEX_INKAY,
+ NATIONAL_DEX_MALAMAR,
+ NATIONAL_DEX_BINACLE,
+ NATIONAL_DEX_BARBARACLE,
+ NATIONAL_DEX_SKRELP,
+ NATIONAL_DEX_DRAGALGE,
+ NATIONAL_DEX_CLAUNCHER,
+ NATIONAL_DEX_CLAWITZER,
+ NATIONAL_DEX_HELIOPTILE,
+ NATIONAL_DEX_HELIOLISK,
+ NATIONAL_DEX_TYRUNT,
+ NATIONAL_DEX_TYRANTRUM,
+ NATIONAL_DEX_AMAURA,
+ NATIONAL_DEX_AURORUS,
+ NATIONAL_DEX_SYLVEON,
+ NATIONAL_DEX_HAWLUCHA,
+ NATIONAL_DEX_DEDENNE,
+ NATIONAL_DEX_CARBINK,
+ NATIONAL_DEX_GOOMY,
+ NATIONAL_DEX_SLIGGOO,
+ NATIONAL_DEX_GOODRA,
+ NATIONAL_DEX_KLEFKI,
+ NATIONAL_DEX_PHANTUMP,
+ NATIONAL_DEX_TREVENANT,
+ NATIONAL_DEX_PUMPKABOO,
+ NATIONAL_DEX_GOURGEIST,
+ NATIONAL_DEX_BERGMITE,
+ NATIONAL_DEX_AVALUGG,
+ NATIONAL_DEX_NOIBAT,
+ NATIONAL_DEX_NOIVERN,
+ NATIONAL_DEX_XERNEAS,
+ NATIONAL_DEX_YVELTAL,
+ NATIONAL_DEX_ZYGARDE,
+ NATIONAL_DEX_DIANCIE,
+ NATIONAL_DEX_HOOPA,
+ NATIONAL_DEX_VOLCANION,
+ // Alola
+ NATIONAL_DEX_ROWLET,
+ NATIONAL_DEX_DARTRIX,
+ NATIONAL_DEX_DECIDUEYE,
+ NATIONAL_DEX_LITTEN,
+ NATIONAL_DEX_TORRACAT,
+ NATIONAL_DEX_INCINEROAR,
+ NATIONAL_DEX_POPPLIO,
+ NATIONAL_DEX_BRIONNE,
+ NATIONAL_DEX_PRIMARINA,
+ NATIONAL_DEX_PIKIPEK,
+ NATIONAL_DEX_TRUMBEAK,
+ NATIONAL_DEX_TOUCANNON,
+ NATIONAL_DEX_YUNGOOS,
+ NATIONAL_DEX_GUMSHOOS,
+ NATIONAL_DEX_GRUBBIN,
+ NATIONAL_DEX_CHARJABUG,
+ NATIONAL_DEX_VIKAVOLT,
+ NATIONAL_DEX_CRABRAWLER,
+ NATIONAL_DEX_CRABOMINABLE,
+ NATIONAL_DEX_ORICORIO,
+ NATIONAL_DEX_CUTIEFLY,
+ NATIONAL_DEX_RIBOMBEE,
+ NATIONAL_DEX_ROCKRUFF,
+ NATIONAL_DEX_LYCANROC,
+ NATIONAL_DEX_WISHIWASHI,
+ NATIONAL_DEX_MAREANIE,
+ NATIONAL_DEX_TOXAPEX,
+ NATIONAL_DEX_MUDBRAY,
+ NATIONAL_DEX_MUDSDALE,
+ NATIONAL_DEX_DEWPIDER,
+ NATIONAL_DEX_ARAQUANID,
+ NATIONAL_DEX_FOMANTIS,
+ NATIONAL_DEX_LURANTIS,
+ NATIONAL_DEX_MORELULL,
+ NATIONAL_DEX_SHIINOTIC,
+ NATIONAL_DEX_SALANDIT,
+ NATIONAL_DEX_SALAZZLE,
+ NATIONAL_DEX_STUFFUL,
+ NATIONAL_DEX_BEWEAR,
+ NATIONAL_DEX_BOUNSWEET,
+ NATIONAL_DEX_STEENEE,
+ NATIONAL_DEX_TSAREENA,
+ NATIONAL_DEX_COMFEY,
+ NATIONAL_DEX_ORANGURU,
+ NATIONAL_DEX_PASSIMIAN,
+ NATIONAL_DEX_WIMPOD,
+ NATIONAL_DEX_GOLISOPOD,
+ NATIONAL_DEX_SANDYGAST,
+ NATIONAL_DEX_PALOSSAND,
+ NATIONAL_DEX_PYUKUMUKU,
+ NATIONAL_DEX_TYPE_NULL,
+ NATIONAL_DEX_SILVALLY,
+ NATIONAL_DEX_MINIOR,
+ NATIONAL_DEX_KOMALA,
+ NATIONAL_DEX_TURTONATOR,
+ NATIONAL_DEX_TOGEDEMARU,
+ NATIONAL_DEX_MIMIKYU,
+ NATIONAL_DEX_BRUXISH,
+ NATIONAL_DEX_DRAMPA,
+ NATIONAL_DEX_DHELMISE,
+ NATIONAL_DEX_JANGMO_O,
+ NATIONAL_DEX_HAKAMO_O,
+ NATIONAL_DEX_KOMMO_O,
+ NATIONAL_DEX_TAPU_KOKO,
+ NATIONAL_DEX_TAPU_LELE,
+ NATIONAL_DEX_TAPU_BULU,
+ NATIONAL_DEX_TAPU_FINI,
+ NATIONAL_DEX_COSMOG,
+ NATIONAL_DEX_COSMOEM,
+ NATIONAL_DEX_SOLGALEO,
+ NATIONAL_DEX_LUNALA,
+ NATIONAL_DEX_NIHILEGO,
+ NATIONAL_DEX_BUZZWOLE,
+ NATIONAL_DEX_PHEROMOSA,
+ NATIONAL_DEX_XURKITREE,
+ NATIONAL_DEX_CELESTEELA,
+ NATIONAL_DEX_KARTANA,
+ NATIONAL_DEX_GUZZLORD,
+ NATIONAL_DEX_NECROZMA,
+ NATIONAL_DEX_MAGEARNA,
+ NATIONAL_DEX_MARSHADOW,
+ NATIONAL_DEX_POIPOLE,
+ NATIONAL_DEX_NAGANADEL,
+ NATIONAL_DEX_STAKATAKA,
+ NATIONAL_DEX_BLACEPHALON,
+ NATIONAL_DEX_ZERAORA,
+ // Unknown
+ NATIONAL_DEX_MELTAN,
+ NATIONAL_DEX_MELMETAL,
+ // Galar
+ NATIONAL_DEX_GROOKEY,
+ NATIONAL_DEX_THWACKEY,
+ NATIONAL_DEX_RILLABOOM,
+ NATIONAL_DEX_SCORBUNNY,
+ NATIONAL_DEX_RABOOT,
+ NATIONAL_DEX_CINDERACE,
+ NATIONAL_DEX_SOBBLE,
+ NATIONAL_DEX_DRIZZILE,
+ NATIONAL_DEX_INTELEON,
+ NATIONAL_DEX_SKWOVET,
+ NATIONAL_DEX_GREEDENT,
+ NATIONAL_DEX_ROOKIDEE,
+ NATIONAL_DEX_CORVISQUIRE,
+ NATIONAL_DEX_CORVIKNIGHT,
+ NATIONAL_DEX_BLIPBUG,
+ NATIONAL_DEX_DOTTLER,
+ NATIONAL_DEX_ORBEETLE,
+ NATIONAL_DEX_NICKIT,
+ NATIONAL_DEX_THIEVUL,
+ NATIONAL_DEX_GOSSIFLEUR,
+ NATIONAL_DEX_ELDEGOSS,
+ NATIONAL_DEX_WOOLOO,
+ NATIONAL_DEX_DUBWOOL,
+ NATIONAL_DEX_CHEWTLE,
+ NATIONAL_DEX_DREDNAW,
+ NATIONAL_DEX_YAMPER,
+ NATIONAL_DEX_BOLTUND,
+ NATIONAL_DEX_ROLYCOLY,
+ NATIONAL_DEX_CARKOL,
+ NATIONAL_DEX_COALOSSAL,
+ NATIONAL_DEX_APPLIN,
+ NATIONAL_DEX_FLAPPLE,
+ NATIONAL_DEX_APPLETUN,
+ NATIONAL_DEX_SILICOBRA,
+ NATIONAL_DEX_SANDACONDA,
+ NATIONAL_DEX_CRAMORANT,
+ NATIONAL_DEX_ARROKUDA,
+ NATIONAL_DEX_BARRASKEWDA,
+ NATIONAL_DEX_TOXEL,
+ NATIONAL_DEX_TOXTRICITY,
+ NATIONAL_DEX_SIZZLIPEDE,
+ NATIONAL_DEX_CENTISKORCH,
+ NATIONAL_DEX_CLOBBOPUS,
+ NATIONAL_DEX_GRAPPLOCT,
+ NATIONAL_DEX_SINISTEA,
+ NATIONAL_DEX_POLTEAGEIST,
+ NATIONAL_DEX_HATENNA,
+ NATIONAL_DEX_HATTREM,
+ NATIONAL_DEX_HATTERENE,
+ NATIONAL_DEX_IMPIDIMP,
+ NATIONAL_DEX_MORGREM,
+ NATIONAL_DEX_GRIMMSNARL,
+ NATIONAL_DEX_OBSTAGOON,
+ NATIONAL_DEX_PERRSERKER,
+ NATIONAL_DEX_CURSOLA,
+ NATIONAL_DEX_SIRFETCHD,
+ NATIONAL_DEX_MR_RIME,
+ NATIONAL_DEX_RUNERIGUS,
+ NATIONAL_DEX_MILCERY,
+ NATIONAL_DEX_ALCREMIE,
+ NATIONAL_DEX_FALINKS,
+ NATIONAL_DEX_PINCURCHIN,
+ NATIONAL_DEX_SNOM,
+ NATIONAL_DEX_FROSMOTH,
+ NATIONAL_DEX_STONJOURNER,
+ NATIONAL_DEX_EISCUE,
+ NATIONAL_DEX_INDEEDEE,
+ NATIONAL_DEX_MORPEKO,
+ NATIONAL_DEX_CUFANT,
+ NATIONAL_DEX_COPPERAJAH,
+ NATIONAL_DEX_DRACOZOLT,
+ NATIONAL_DEX_ARCTOZOLT,
+ NATIONAL_DEX_DRACOVISH,
+ NATIONAL_DEX_ARCTOVISH,
+ NATIONAL_DEX_DURALUDON,
+ NATIONAL_DEX_DREEPY,
+ NATIONAL_DEX_DRAKLOAK,
+ NATIONAL_DEX_DRAGAPULT,
+ NATIONAL_DEX_ZACIAN,
+ NATIONAL_DEX_ZAMAZENTA,
+ NATIONAL_DEX_ETERNATUS,
+ NATIONAL_DEX_KUBFU,
+ NATIONAL_DEX_URSHIFU,
+ NATIONAL_DEX_ZARUDE,
+ NATIONAL_DEX_REGIELEKI,
+ NATIONAL_DEX_REGIDRAGO,
+ NATIONAL_DEX_GLASTRIER,
+ NATIONAL_DEX_SPECTRIER,
+ NATIONAL_DEX_CALYREX,
+};
+
+#define KANTO_DEX_COUNT NATIONAL_DEX_MEW
+#define JOHTO_DEX_COUNT NATIONAL_DEX_CELEBI
+#define NATIONAL_DEX_COUNT NATIONAL_DEX_CALYREX
+#define POKEMON_SLOTS_NUMBER (NATIONAL_DEX_COUNT + 1)
+
+// Hoenn Pokedex order
+enum {
+ HOENN_DEX_NONE,
+ HOENN_DEX_TREECKO,
+ HOENN_DEX_GROVYLE,
+ HOENN_DEX_SCEPTILE,
+ HOENN_DEX_TORCHIC,
+ HOENN_DEX_COMBUSKEN,
+ HOENN_DEX_BLAZIKEN,
+ HOENN_DEX_MUDKIP,
+ HOENN_DEX_MARSHTOMP,
+ HOENN_DEX_SWAMPERT,
+ HOENN_DEX_POOCHYENA,
+ HOENN_DEX_MIGHTYENA,
+ HOENN_DEX_ZIGZAGOON,
+ HOENN_DEX_LINOONE,
+ HOENN_DEX_WURMPLE,
+ HOENN_DEX_SILCOON,
+ HOENN_DEX_BEAUTIFLY,
+ HOENN_DEX_CASCOON,
+ HOENN_DEX_DUSTOX,
+ HOENN_DEX_LOTAD,
+ HOENN_DEX_LOMBRE,
+ HOENN_DEX_LUDICOLO,
+ HOENN_DEX_SEEDOT,
+ HOENN_DEX_NUZLEAF,
+ HOENN_DEX_SHIFTRY,
+ HOENN_DEX_TAILLOW,
+ HOENN_DEX_SWELLOW,
+ HOENN_DEX_WINGULL,
+ HOENN_DEX_PELIPPER,
+ HOENN_DEX_RALTS,
+ HOENN_DEX_KIRLIA,
+ HOENN_DEX_GARDEVOIR,
+ HOENN_DEX_GALLADE,
+ HOENN_DEX_SURSKIT,
+ HOENN_DEX_MASQUERAIN,
+ HOENN_DEX_SHROOMISH,
+ HOENN_DEX_BRELOOM,
+ HOENN_DEX_SLAKOTH,
+ HOENN_DEX_VIGOROTH,
+ HOENN_DEX_SLAKING,
+ HOENN_DEX_ABRA,
+ HOENN_DEX_KADABRA,
+ HOENN_DEX_ALAKAZAM,
+ HOENN_DEX_NINCADA,
+ HOENN_DEX_NINJASK,
+ HOENN_DEX_SHEDINJA,
+ HOENN_DEX_WHISMUR,
+ HOENN_DEX_LOUDRED,
+ HOENN_DEX_EXPLOUD,
+ HOENN_DEX_MAKUHITA,
+ HOENN_DEX_HARIYAMA,
+ HOENN_DEX_GOLDEEN,
+ HOENN_DEX_SEAKING,
+ HOENN_DEX_MAGIKARP,
+ HOENN_DEX_GYARADOS,
+ HOENN_DEX_AZURILL,
+ HOENN_DEX_MARILL,
+ HOENN_DEX_AZUMARILL,
+ HOENN_DEX_GEODUDE,
+ HOENN_DEX_GRAVELER,
+ HOENN_DEX_GOLEM,
+ HOENN_DEX_NOSEPASS,
+ HOENN_DEX_PROBOPASS,
+ HOENN_DEX_SKITTY,
+ HOENN_DEX_DELCATTY,
+ HOENN_DEX_ZUBAT,
+ HOENN_DEX_GOLBAT,
+ HOENN_DEX_CROBAT,
+ HOENN_DEX_TENTACOOL,
+ HOENN_DEX_TENTACRUEL,
+ HOENN_DEX_SABLEYE,
+ HOENN_DEX_MAWILE,
+ HOENN_DEX_ARON,
+ HOENN_DEX_LAIRON,
+ HOENN_DEX_AGGRON,
+ HOENN_DEX_MACHOP,
+ HOENN_DEX_MACHOKE,
+ HOENN_DEX_MACHAMP,
+ HOENN_DEX_MEDITITE,
+ HOENN_DEX_MEDICHAM,
+ HOENN_DEX_ELECTRIKE,
+ HOENN_DEX_MANECTRIC,
+ HOENN_DEX_PLUSLE,
+ HOENN_DEX_MINUN,
+ HOENN_DEX_MAGNEMITE,
+ HOENN_DEX_MAGNETON,
+ HOENN_DEX_MAGNEZONE,
+ HOENN_DEX_VOLTORB,
+ HOENN_DEX_ELECTRODE,
+ HOENN_DEX_VOLBEAT,
+ HOENN_DEX_ILLUMISE,
+ HOENN_DEX_ODDISH,
+ HOENN_DEX_GLOOM,
+ HOENN_DEX_VILEPLUME,
+ HOENN_DEX_BELLOSSOM,
+ HOENN_DEX_DODUO,
+ HOENN_DEX_DODRIO,
+ HOENN_DEX_BUDEW,
+ HOENN_DEX_ROSELIA,
+ HOENN_DEX_ROSERADE,
+ HOENN_DEX_GULPIN,
+ HOENN_DEX_SWALOT,
+ HOENN_DEX_CARVANHA,
+ HOENN_DEX_SHARPEDO,
+ HOENN_DEX_WAILMER,
+ HOENN_DEX_WAILORD,
+ HOENN_DEX_NUMEL,
+ HOENN_DEX_CAMERUPT,
+ HOENN_DEX_SLUGMA,
+ HOENN_DEX_MAGCARGO,
+ HOENN_DEX_TORKOAL,
+ HOENN_DEX_GRIMER,
+ HOENN_DEX_MUK,
+ HOENN_DEX_KOFFING,
+ HOENN_DEX_WEEZING,
+ HOENN_DEX_SPOINK,
+ HOENN_DEX_GRUMPIG,
+ HOENN_DEX_SANDSHREW,
+ HOENN_DEX_SANDSLASH,
+ HOENN_DEX_SPINDA,
+ HOENN_DEX_SKARMORY,
+ HOENN_DEX_TRAPINCH,
+ HOENN_DEX_VIBRAVA,
+ HOENN_DEX_FLYGON,
+ HOENN_DEX_CACNEA,
+ HOENN_DEX_CACTURNE,
+ HOENN_DEX_SWABLU,
+ HOENN_DEX_ALTARIA,
+ HOENN_DEX_ZANGOOSE,
+ HOENN_DEX_SEVIPER,
+ HOENN_DEX_LUNATONE,
+ HOENN_DEX_SOLROCK,
+ HOENN_DEX_BARBOACH,
+ HOENN_DEX_WHISCASH,
+ HOENN_DEX_CORPHISH,
+ HOENN_DEX_CRAWDAUNT,
+ HOENN_DEX_BALTOY,
+ HOENN_DEX_CLAYDOL,
+ HOENN_DEX_LILEEP,
+ HOENN_DEX_CRADILY,
+ HOENN_DEX_ANORITH,
+ HOENN_DEX_ARMALDO,
+ HOENN_DEX_IGGLYBUFF,
+ HOENN_DEX_JIGGLYPUFF,
+ HOENN_DEX_WIGGLYTUFF,
+ HOENN_DEX_FEEBAS,
+ HOENN_DEX_MILOTIC,
+ HOENN_DEX_CASTFORM,
+ HOENN_DEX_STARYU,
+ HOENN_DEX_STARMIE,
+ HOENN_DEX_KECLEON,
+ HOENN_DEX_SHUPPET,
+ HOENN_DEX_BANETTE,
+ HOENN_DEX_DUSKULL,
+ HOENN_DEX_DUSCLOPS,
+ HOENN_DEX_DUSKNOIR,
+ HOENN_DEX_TROPIUS,
+ HOENN_DEX_CHINGLING,
+ HOENN_DEX_CHIMECHO,
+ HOENN_DEX_ABSOL,
+ HOENN_DEX_VULPIX,
+ HOENN_DEX_NINETALES,
+ HOENN_DEX_PICHU,
+ HOENN_DEX_PIKACHU,
+ HOENN_DEX_RAICHU,
+ HOENN_DEX_PSYDUCK,
+ HOENN_DEX_GOLDUCK,
+ HOENN_DEX_WYNAUT,
+ HOENN_DEX_WOBBUFFET,
+ HOENN_DEX_NATU,
+ HOENN_DEX_XATU,
+ HOENN_DEX_GIRAFARIG,
+ HOENN_DEX_PHANPY,
+ HOENN_DEX_DONPHAN,
+ HOENN_DEX_PINSIR,
+ HOENN_DEX_HERACROSS,
+ HOENN_DEX_RHYHORN,
+ HOENN_DEX_RHYDON,
+ HOENN_DEX_RHYPERIOR,
+ HOENN_DEX_SNORUNT,
+ HOENN_DEX_GLALIE,
+ HOENN_DEX_FROSLASS,
+ HOENN_DEX_SPHEAL,
+ HOENN_DEX_SEALEO,
+ HOENN_DEX_WALREIN,
+ HOENN_DEX_CLAMPERL,
+ HOENN_DEX_HUNTAIL,
+ HOENN_DEX_GOREBYSS,
+ HOENN_DEX_RELICANTH,
+ HOENN_DEX_CORSOLA,
+ HOENN_DEX_CHINCHOU,
+ HOENN_DEX_LANTURN,
+ HOENN_DEX_LUVDISC,
+ HOENN_DEX_HORSEA,
+ HOENN_DEX_SEADRA,
+ HOENN_DEX_KINGDRA,
+ HOENN_DEX_BAGON,
+ HOENN_DEX_SHELGON,
+ HOENN_DEX_SALAMENCE,
+ HOENN_DEX_BELDUM,
+ HOENN_DEX_METANG,
+ HOENN_DEX_METAGROSS,
+ HOENN_DEX_REGIROCK,
+ HOENN_DEX_REGICE,
+ HOENN_DEX_REGISTEEL,
+ HOENN_DEX_LATIAS,
+ HOENN_DEX_LATIOS,
+ HOENN_DEX_KYOGRE,
+ HOENN_DEX_GROUDON,
+ HOENN_DEX_RAYQUAZA,
+ HOENN_DEX_JIRACHI,
+ HOENN_DEX_DEOXYS,
+};
+
+#define HOENN_DEX_COUNT (HOENN_DEX_DEOXYS + 1)
+
+#endif // GUARD_CONSTANTS_POKEDEX_H
\ No newline at end of file
diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h
index a5197a1f2a..08f664caa1 100644
--- a/include/constants/pokemon.h
+++ b/include/constants/pokemon.h
@@ -79,11 +79,13 @@
#define STAT_SPEED 3
#define STAT_SPATK 4
#define STAT_SPDEF 5
+#define NUM_STATS 6
+
#define STAT_ACC 6 // Only in battles.
#define STAT_EVASION 7 // Only in battles.
-#define NUM_NATURE_STATS NUM_STATS - 1 // excludes HP
-#define NUM_BATTLE_STATS NUM_STATS + 2 // includes Accuracy and Evasion
+#define NUM_NATURE_STATS (NUM_STATS - 1) // excludes HP
+#define NUM_BATTLE_STATS (NUM_STATS + 2) // includes Accuracy and Evasion
#define MIN_STAT_STAGE 0
#define DEFAULT_STAT_STAGE 6
@@ -379,6 +381,8 @@
#define EVO_LEVEL_DARK_TYPE_MON_IN_PARTY 30 // Pokémon reaches the specified level with a Dark Type Pokémon in party
#define EVO_TRADE_SPECIFIC_MON 31 // Pokémon is traded for a specified Pokémon
#define EVO_SPECIFIC_MAP 32 // Pokémon levels up on specified map
+#define EVO_LEVEL_NATURE_AMPED 33 // Pokémon reaches the specified level, it has a Hardy, Brave, Adamant, Naughty, Docile, Impish, Lax, Hasty, Jolly, Naive, Rash, Sassy, or Quirky nature.
+#define EVO_LEVEL_NATURE_LOW_KEY 34 // Pokémon reaches the specified level, it has a Lonely, Bold, Relaxed, Timid, Serious, Modest, Mild, Quiet, Bashful, Calm, Gentle, or Careful nature.
#define EVOS_PER_MON 10
diff --git a/include/constants/species.h b/include/constants/species.h
index 5a410aa5b0..b3ba54c466 100644
--- a/include/constants/species.h
+++ b/include/constants/species.h
@@ -1344,1136 +1344,10 @@
#define SPECIES_EGG SPECIES_CALYREX_SHADOW_RIDER + 1
#define NUM_SPECIES SPECIES_EGG
-// National Dex Index Defines
-
-#define NATIONAL_DEX_NONE 0
-#define NATIONAL_DEX_BULBASAUR 1
-#define NATIONAL_DEX_IVYSAUR 2
-#define NATIONAL_DEX_VENUSAUR 3
-#define NATIONAL_DEX_CHARMANDER 4
-#define NATIONAL_DEX_CHARMELEON 5
-#define NATIONAL_DEX_CHARIZARD 6
-#define NATIONAL_DEX_SQUIRTLE 7
-#define NATIONAL_DEX_WARTORTLE 8
-#define NATIONAL_DEX_BLASTOISE 9
-#define NATIONAL_DEX_CATERPIE 10
-#define NATIONAL_DEX_METAPOD 11
-#define NATIONAL_DEX_BUTTERFREE 12
-#define NATIONAL_DEX_WEEDLE 13
-#define NATIONAL_DEX_KAKUNA 14
-#define NATIONAL_DEX_BEEDRILL 15
-#define NATIONAL_DEX_PIDGEY 16
-#define NATIONAL_DEX_PIDGEOTTO 17
-#define NATIONAL_DEX_PIDGEOT 18
-#define NATIONAL_DEX_RATTATA 19
-#define NATIONAL_DEX_RATICATE 20
-#define NATIONAL_DEX_SPEAROW 21
-#define NATIONAL_DEX_FEAROW 22
-#define NATIONAL_DEX_EKANS 23
-#define NATIONAL_DEX_ARBOK 24
-#define NATIONAL_DEX_PIKACHU 25
-#define NATIONAL_DEX_RAICHU 26
-#define NATIONAL_DEX_SANDSHREW 27
-#define NATIONAL_DEX_SANDSLASH 28
-#define NATIONAL_DEX_NIDORAN_F 29
-#define NATIONAL_DEX_NIDORINA 30
-#define NATIONAL_DEX_NIDOQUEEN 31
-#define NATIONAL_DEX_NIDORAN_M 32
-#define NATIONAL_DEX_NIDORINO 33
-#define NATIONAL_DEX_NIDOKING 34
-#define NATIONAL_DEX_CLEFAIRY 35
-#define NATIONAL_DEX_CLEFABLE 36
-#define NATIONAL_DEX_VULPIX 37
-#define NATIONAL_DEX_NINETALES 38
-#define NATIONAL_DEX_JIGGLYPUFF 39
-#define NATIONAL_DEX_WIGGLYTUFF 40
-#define NATIONAL_DEX_ZUBAT 41
-#define NATIONAL_DEX_GOLBAT 42
-#define NATIONAL_DEX_ODDISH 43
-#define NATIONAL_DEX_GLOOM 44
-#define NATIONAL_DEX_VILEPLUME 45
-#define NATIONAL_DEX_PARAS 46
-#define NATIONAL_DEX_PARASECT 47
-#define NATIONAL_DEX_VENONAT 48
-#define NATIONAL_DEX_VENOMOTH 49
-#define NATIONAL_DEX_DIGLETT 50
-#define NATIONAL_DEX_DUGTRIO 51
-#define NATIONAL_DEX_MEOWTH 52
-#define NATIONAL_DEX_PERSIAN 53
-#define NATIONAL_DEX_PSYDUCK 54
-#define NATIONAL_DEX_GOLDUCK 55
-#define NATIONAL_DEX_MANKEY 56
-#define NATIONAL_DEX_PRIMEAPE 57
-#define NATIONAL_DEX_GROWLITHE 58
-#define NATIONAL_DEX_ARCANINE 59
-#define NATIONAL_DEX_POLIWAG 60
-#define NATIONAL_DEX_POLIWHIRL 61
-#define NATIONAL_DEX_POLIWRATH 62
-#define NATIONAL_DEX_ABRA 63
-#define NATIONAL_DEX_KADABRA 64
-#define NATIONAL_DEX_ALAKAZAM 65
-#define NATIONAL_DEX_MACHOP 66
-#define NATIONAL_DEX_MACHOKE 67
-#define NATIONAL_DEX_MACHAMP 68
-#define NATIONAL_DEX_BELLSPROUT 69
-#define NATIONAL_DEX_WEEPINBELL 70
-#define NATIONAL_DEX_VICTREEBEL 71
-#define NATIONAL_DEX_TENTACOOL 72
-#define NATIONAL_DEX_TENTACRUEL 73
-#define NATIONAL_DEX_GEODUDE 74
-#define NATIONAL_DEX_GRAVELER 75
-#define NATIONAL_DEX_GOLEM 76
-#define NATIONAL_DEX_PONYTA 77
-#define NATIONAL_DEX_RAPIDASH 78
-#define NATIONAL_DEX_SLOWPOKE 79
-#define NATIONAL_DEX_SLOWBRO 80
-#define NATIONAL_DEX_MAGNEMITE 81
-#define NATIONAL_DEX_MAGNETON 82
-#define NATIONAL_DEX_FARFETCHD 83
-#define NATIONAL_DEX_DODUO 84
-#define NATIONAL_DEX_DODRIO 85
-#define NATIONAL_DEX_SEEL 86
-#define NATIONAL_DEX_DEWGONG 87
-#define NATIONAL_DEX_GRIMER 88
-#define NATIONAL_DEX_MUK 89
-#define NATIONAL_DEX_SHELLDER 90
-#define NATIONAL_DEX_CLOYSTER 91
-#define NATIONAL_DEX_GASTLY 92
-#define NATIONAL_DEX_HAUNTER 93
-#define NATIONAL_DEX_GENGAR 94
-#define NATIONAL_DEX_ONIX 95
-#define NATIONAL_DEX_DROWZEE 96
-#define NATIONAL_DEX_HYPNO 97
-#define NATIONAL_DEX_KRABBY 98
-#define NATIONAL_DEX_KINGLER 99
-#define NATIONAL_DEX_VOLTORB 100
-#define NATIONAL_DEX_ELECTRODE 101
-#define NATIONAL_DEX_EXEGGCUTE 102
-#define NATIONAL_DEX_EXEGGUTOR 103
-#define NATIONAL_DEX_CUBONE 104
-#define NATIONAL_DEX_MAROWAK 105
-#define NATIONAL_DEX_HITMONLEE 106
-#define NATIONAL_DEX_HITMONCHAN 107
-#define NATIONAL_DEX_LICKITUNG 108
-#define NATIONAL_DEX_KOFFING 109
-#define NATIONAL_DEX_WEEZING 110
-#define NATIONAL_DEX_RHYHORN 111
-#define NATIONAL_DEX_RHYDON 112
-#define NATIONAL_DEX_CHANSEY 113
-#define NATIONAL_DEX_TANGELA 114
-#define NATIONAL_DEX_KANGASKHAN 115
-#define NATIONAL_DEX_HORSEA 116
-#define NATIONAL_DEX_SEADRA 117
-#define NATIONAL_DEX_GOLDEEN 118
-#define NATIONAL_DEX_SEAKING 119
-#define NATIONAL_DEX_STARYU 120
-#define NATIONAL_DEX_STARMIE 121
-#define NATIONAL_DEX_MR_MIME 122
-#define NATIONAL_DEX_SCYTHER 123
-#define NATIONAL_DEX_JYNX 124
-#define NATIONAL_DEX_ELECTABUZZ 125
-#define NATIONAL_DEX_MAGMAR 126
-#define NATIONAL_DEX_PINSIR 127
-#define NATIONAL_DEX_TAUROS 128
-#define NATIONAL_DEX_MAGIKARP 129
-#define NATIONAL_DEX_GYARADOS 130
-#define NATIONAL_DEX_LAPRAS 131
-#define NATIONAL_DEX_DITTO 132
-#define NATIONAL_DEX_EEVEE 133
-#define NATIONAL_DEX_VAPOREON 134
-#define NATIONAL_DEX_JOLTEON 135
-#define NATIONAL_DEX_FLAREON 136
-#define NATIONAL_DEX_PORYGON 137
-#define NATIONAL_DEX_OMANYTE 138
-#define NATIONAL_DEX_OMASTAR 139
-#define NATIONAL_DEX_KABUTO 140
-#define NATIONAL_DEX_KABUTOPS 141
-#define NATIONAL_DEX_AERODACTYL 142
-#define NATIONAL_DEX_SNORLAX 143
-#define NATIONAL_DEX_ARTICUNO 144
-#define NATIONAL_DEX_ZAPDOS 145
-#define NATIONAL_DEX_MOLTRES 146
-#define NATIONAL_DEX_DRATINI 147
-#define NATIONAL_DEX_DRAGONAIR 148
-#define NATIONAL_DEX_DRAGONITE 149
-#define NATIONAL_DEX_MEWTWO 150
-#define NATIONAL_DEX_MEW 151
-
-#define KANTO_DEX_COUNT NATIONAL_DEX_MEW
-
-#define NATIONAL_DEX_CHIKORITA 152
-#define NATIONAL_DEX_BAYLEEF 153
-#define NATIONAL_DEX_MEGANIUM 154
-#define NATIONAL_DEX_CYNDAQUIL 155
-#define NATIONAL_DEX_QUILAVA 156
-#define NATIONAL_DEX_TYPHLOSION 157
-#define NATIONAL_DEX_TOTODILE 158
-#define NATIONAL_DEX_CROCONAW 159
-#define NATIONAL_DEX_FERALIGATR 160
-#define NATIONAL_DEX_SENTRET 161
-#define NATIONAL_DEX_FURRET 162
-#define NATIONAL_DEX_HOOTHOOT 163
-#define NATIONAL_DEX_NOCTOWL 164
-#define NATIONAL_DEX_LEDYBA 165
-#define NATIONAL_DEX_LEDIAN 166
-#define NATIONAL_DEX_SPINARAK 167
-#define NATIONAL_DEX_ARIADOS 168
-#define NATIONAL_DEX_CROBAT 169
-#define NATIONAL_DEX_CHINCHOU 170
-#define NATIONAL_DEX_LANTURN 171
-#define NATIONAL_DEX_PICHU 172
-#define NATIONAL_DEX_CLEFFA 173
-#define NATIONAL_DEX_IGGLYBUFF 174
-#define NATIONAL_DEX_TOGEPI 175
-#define NATIONAL_DEX_TOGETIC 176
-#define NATIONAL_DEX_NATU 177
-#define NATIONAL_DEX_XATU 178
-#define NATIONAL_DEX_MAREEP 179
-#define NATIONAL_DEX_FLAAFFY 180
-#define NATIONAL_DEX_AMPHAROS 181
-#define NATIONAL_DEX_BELLOSSOM 182
-#define NATIONAL_DEX_MARILL 183
-#define NATIONAL_DEX_AZUMARILL 184
-#define NATIONAL_DEX_SUDOWOODO 185
-#define NATIONAL_DEX_POLITOED 186
-#define NATIONAL_DEX_HOPPIP 187
-#define NATIONAL_DEX_SKIPLOOM 188
-#define NATIONAL_DEX_JUMPLUFF 189
-#define NATIONAL_DEX_AIPOM 190
-#define NATIONAL_DEX_SUNKERN 191
-#define NATIONAL_DEX_SUNFLORA 192
-#define NATIONAL_DEX_YANMA 193
-#define NATIONAL_DEX_WOOPER 194
-#define NATIONAL_DEX_QUAGSIRE 195
-#define NATIONAL_DEX_ESPEON 196
-#define NATIONAL_DEX_UMBREON 197
-#define NATIONAL_DEX_MURKROW 198
-#define NATIONAL_DEX_SLOWKING 199
-#define NATIONAL_DEX_MISDREAVUS 200
-#define NATIONAL_DEX_UNOWN 201
-#define NATIONAL_DEX_WOBBUFFET 202
-#define NATIONAL_DEX_GIRAFARIG 203
-#define NATIONAL_DEX_PINECO 204
-#define NATIONAL_DEX_FORRETRESS 205
-#define NATIONAL_DEX_DUNSPARCE 206
-#define NATIONAL_DEX_GLIGAR 207
-#define NATIONAL_DEX_STEELIX 208
-#define NATIONAL_DEX_SNUBBULL 209
-#define NATIONAL_DEX_GRANBULL 210
-#define NATIONAL_DEX_QWILFISH 211
-#define NATIONAL_DEX_SCIZOR 212
-#define NATIONAL_DEX_SHUCKLE 213
-#define NATIONAL_DEX_HERACROSS 214
-#define NATIONAL_DEX_SNEASEL 215
-#define NATIONAL_DEX_TEDDIURSA 216
-#define NATIONAL_DEX_URSARING 217
-#define NATIONAL_DEX_SLUGMA 218
-#define NATIONAL_DEX_MAGCARGO 219
-#define NATIONAL_DEX_SWINUB 220
-#define NATIONAL_DEX_PILOSWINE 221
-#define NATIONAL_DEX_CORSOLA 222
-#define NATIONAL_DEX_REMORAID 223
-#define NATIONAL_DEX_OCTILLERY 224
-#define NATIONAL_DEX_DELIBIRD 225
-#define NATIONAL_DEX_MANTINE 226
-#define NATIONAL_DEX_SKARMORY 227
-#define NATIONAL_DEX_HOUNDOUR 228
-#define NATIONAL_DEX_HOUNDOOM 229
-#define NATIONAL_DEX_KINGDRA 230
-#define NATIONAL_DEX_PHANPY 231
-#define NATIONAL_DEX_DONPHAN 232
-#define NATIONAL_DEX_PORYGON2 233
-#define NATIONAL_DEX_STANTLER 234
-#define NATIONAL_DEX_SMEARGLE 235
-#define NATIONAL_DEX_TYROGUE 236
-#define NATIONAL_DEX_HITMONTOP 237
-#define NATIONAL_DEX_SMOOCHUM 238
-#define NATIONAL_DEX_ELEKID 239
-#define NATIONAL_DEX_MAGBY 240
-#define NATIONAL_DEX_MILTANK 241
-#define NATIONAL_DEX_BLISSEY 242
-#define NATIONAL_DEX_RAIKOU 243
-#define NATIONAL_DEX_ENTEI 244
-#define NATIONAL_DEX_SUICUNE 245
-#define NATIONAL_DEX_LARVITAR 246
-#define NATIONAL_DEX_PUPITAR 247
-#define NATIONAL_DEX_TYRANITAR 248
-#define NATIONAL_DEX_LUGIA 249
-#define NATIONAL_DEX_HO_OH 250
-#define NATIONAL_DEX_CELEBI 251
-
-#define JOHTO_DEX_COUNT NATIONAL_DEX_CELEBI
-
-#define NATIONAL_DEX_TREECKO 252
-#define NATIONAL_DEX_GROVYLE 253
-#define NATIONAL_DEX_SCEPTILE 254
-#define NATIONAL_DEX_TORCHIC 255
-#define NATIONAL_DEX_COMBUSKEN 256
-#define NATIONAL_DEX_BLAZIKEN 257
-#define NATIONAL_DEX_MUDKIP 258
-#define NATIONAL_DEX_MARSHTOMP 259
-#define NATIONAL_DEX_SWAMPERT 260
-#define NATIONAL_DEX_POOCHYENA 261
-#define NATIONAL_DEX_MIGHTYENA 262
-#define NATIONAL_DEX_ZIGZAGOON 263
-#define NATIONAL_DEX_LINOONE 264
-#define NATIONAL_DEX_WURMPLE 265
-#define NATIONAL_DEX_SILCOON 266
-#define NATIONAL_DEX_BEAUTIFLY 267
-#define NATIONAL_DEX_CASCOON 268
-#define NATIONAL_DEX_DUSTOX 269
-#define NATIONAL_DEX_LOTAD 270
-#define NATIONAL_DEX_LOMBRE 271
-#define NATIONAL_DEX_LUDICOLO 272
-#define NATIONAL_DEX_SEEDOT 273
-#define NATIONAL_DEX_NUZLEAF 274
-#define NATIONAL_DEX_SHIFTRY 275
-#define NATIONAL_DEX_TAILLOW 276
-#define NATIONAL_DEX_SWELLOW 277
-#define NATIONAL_DEX_WINGULL 278
-#define NATIONAL_DEX_PELIPPER 279
-#define NATIONAL_DEX_RALTS 280
-#define NATIONAL_DEX_KIRLIA 281
-#define NATIONAL_DEX_GARDEVOIR 282
-#define NATIONAL_DEX_SURSKIT 283
-#define NATIONAL_DEX_MASQUERAIN 284
-#define NATIONAL_DEX_SHROOMISH 285
-#define NATIONAL_DEX_BRELOOM 286
-#define NATIONAL_DEX_SLAKOTH 287
-#define NATIONAL_DEX_VIGOROTH 288
-#define NATIONAL_DEX_SLAKING 289
-#define NATIONAL_DEX_NINCADA 290
-#define NATIONAL_DEX_NINJASK 291
-#define NATIONAL_DEX_SHEDINJA 292
-#define NATIONAL_DEX_WHISMUR 293
-#define NATIONAL_DEX_LOUDRED 294
-#define NATIONAL_DEX_EXPLOUD 295
-#define NATIONAL_DEX_MAKUHITA 296
-#define NATIONAL_DEX_HARIYAMA 297
-#define NATIONAL_DEX_AZURILL 298
-#define NATIONAL_DEX_NOSEPASS 299
-#define NATIONAL_DEX_SKITTY 300
-#define NATIONAL_DEX_DELCATTY 301
-#define NATIONAL_DEX_SABLEYE 302
-#define NATIONAL_DEX_MAWILE 303
-#define NATIONAL_DEX_ARON 304
-#define NATIONAL_DEX_LAIRON 305
-#define NATIONAL_DEX_AGGRON 306
-#define NATIONAL_DEX_MEDITITE 307
-#define NATIONAL_DEX_MEDICHAM 308
-#define NATIONAL_DEX_ELECTRIKE 309
-#define NATIONAL_DEX_MANECTRIC 310
-#define NATIONAL_DEX_PLUSLE 311
-#define NATIONAL_DEX_MINUN 312
-#define NATIONAL_DEX_VOLBEAT 313
-#define NATIONAL_DEX_ILLUMISE 314
-#define NATIONAL_DEX_ROSELIA 315
-#define NATIONAL_DEX_GULPIN 316
-#define NATIONAL_DEX_SWALOT 317
-#define NATIONAL_DEX_CARVANHA 318
-#define NATIONAL_DEX_SHARPEDO 319
-#define NATIONAL_DEX_WAILMER 320
-#define NATIONAL_DEX_WAILORD 321
-#define NATIONAL_DEX_NUMEL 322
-#define NATIONAL_DEX_CAMERUPT 323
-#define NATIONAL_DEX_TORKOAL 324
-#define NATIONAL_DEX_SPOINK 325
-#define NATIONAL_DEX_GRUMPIG 326
-#define NATIONAL_DEX_SPINDA 327
-#define NATIONAL_DEX_TRAPINCH 328
-#define NATIONAL_DEX_VIBRAVA 329
-#define NATIONAL_DEX_FLYGON 330
-#define NATIONAL_DEX_CACNEA 331
-#define NATIONAL_DEX_CACTURNE 332
-#define NATIONAL_DEX_SWABLU 333
-#define NATIONAL_DEX_ALTARIA 334
-#define NATIONAL_DEX_ZANGOOSE 335
-#define NATIONAL_DEX_SEVIPER 336
-#define NATIONAL_DEX_LUNATONE 337
-#define NATIONAL_DEX_SOLROCK 338
-#define NATIONAL_DEX_BARBOACH 339
-#define NATIONAL_DEX_WHISCASH 340
-#define NATIONAL_DEX_CORPHISH 341
-#define NATIONAL_DEX_CRAWDAUNT 342
-#define NATIONAL_DEX_BALTOY 343
-#define NATIONAL_DEX_CLAYDOL 344
-#define NATIONAL_DEX_LILEEP 345
-#define NATIONAL_DEX_CRADILY 346
-#define NATIONAL_DEX_ANORITH 347
-#define NATIONAL_DEX_ARMALDO 348
-#define NATIONAL_DEX_FEEBAS 349
-#define NATIONAL_DEX_MILOTIC 350
-#define NATIONAL_DEX_CASTFORM 351
-#define NATIONAL_DEX_KECLEON 352
-#define NATIONAL_DEX_SHUPPET 353
-#define NATIONAL_DEX_BANETTE 354
-#define NATIONAL_DEX_DUSKULL 355
-#define NATIONAL_DEX_DUSCLOPS 356
-#define NATIONAL_DEX_TROPIUS 357
-#define NATIONAL_DEX_CHIMECHO 358
-#define NATIONAL_DEX_ABSOL 359
-#define NATIONAL_DEX_WYNAUT 360
-#define NATIONAL_DEX_SNORUNT 361
-#define NATIONAL_DEX_GLALIE 362
-#define NATIONAL_DEX_SPHEAL 363
-#define NATIONAL_DEX_SEALEO 364
-#define NATIONAL_DEX_WALREIN 365
-#define NATIONAL_DEX_CLAMPERL 366
-#define NATIONAL_DEX_HUNTAIL 367
-#define NATIONAL_DEX_GOREBYSS 368
-#define NATIONAL_DEX_RELICANTH 369
-#define NATIONAL_DEX_LUVDISC 370
-#define NATIONAL_DEX_BAGON 371
-#define NATIONAL_DEX_SHELGON 372
-#define NATIONAL_DEX_SALAMENCE 373
-#define NATIONAL_DEX_BELDUM 374
-#define NATIONAL_DEX_METANG 375
-#define NATIONAL_DEX_METAGROSS 376
-#define NATIONAL_DEX_REGIROCK 377
-#define NATIONAL_DEX_REGICE 378
-#define NATIONAL_DEX_REGISTEEL 379
-#define NATIONAL_DEX_LATIAS 380
-#define NATIONAL_DEX_LATIOS 381
-#define NATIONAL_DEX_KYOGRE 382
-#define NATIONAL_DEX_GROUDON 383
-#define NATIONAL_DEX_RAYQUAZA 384
-#define NATIONAL_DEX_JIRACHI 385
-#define NATIONAL_DEX_DEOXYS 386
-#define NATIONAL_DEX_TURTWIG 387
-#define NATIONAL_DEX_GROTLE 388
-#define NATIONAL_DEX_TORTERRA 389
-#define NATIONAL_DEX_CHIMCHAR 390
-#define NATIONAL_DEX_MONFERNO 391
-#define NATIONAL_DEX_INFERNAPE 392
-#define NATIONAL_DEX_PIPLUP 393
-#define NATIONAL_DEX_PRINPLUP 394
-#define NATIONAL_DEX_EMPOLEON 395
-#define NATIONAL_DEX_STARLY 396
-#define NATIONAL_DEX_STARAVIA 397
-#define NATIONAL_DEX_STARAPTOR 398
-#define NATIONAL_DEX_BIDOOF 399
-#define NATIONAL_DEX_BIBAREL 400
-#define NATIONAL_DEX_KRICKETOT 401
-#define NATIONAL_DEX_KRICKETUNE 402
-#define NATIONAL_DEX_SHINX 403
-#define NATIONAL_DEX_LUXIO 404
-#define NATIONAL_DEX_LUXRAY 405
-#define NATIONAL_DEX_BUDEW 406
-#define NATIONAL_DEX_ROSERADE 407
-#define NATIONAL_DEX_CRANIDOS 408
-#define NATIONAL_DEX_RAMPARDOS 409
-#define NATIONAL_DEX_SHIELDON 410
-#define NATIONAL_DEX_BASTIODON 411
-#define NATIONAL_DEX_BURMY 412
-#define NATIONAL_DEX_WORMADAM 413
-#define NATIONAL_DEX_MOTHIM 414
-#define NATIONAL_DEX_COMBEE 415
-#define NATIONAL_DEX_VESPIQUEN 416
-#define NATIONAL_DEX_PACHIRISU 417
-#define NATIONAL_DEX_BUIZEL 418
-#define NATIONAL_DEX_FLOATZEL 419
-#define NATIONAL_DEX_CHERUBI 420
-#define NATIONAL_DEX_CHERRIM 421
-#define NATIONAL_DEX_SHELLOS 422
-#define NATIONAL_DEX_GASTRODON 423
-#define NATIONAL_DEX_AMBIPOM 424
-#define NATIONAL_DEX_DRIFLOON 425
-#define NATIONAL_DEX_DRIFBLIM 426
-#define NATIONAL_DEX_BUNEARY 427
-#define NATIONAL_DEX_LOPUNNY 428
-#define NATIONAL_DEX_MISMAGIUS 429
-#define NATIONAL_DEX_HONCHKROW 430
-#define NATIONAL_DEX_GLAMEOW 431
-#define NATIONAL_DEX_PURUGLY 432
-#define NATIONAL_DEX_CHINGLING 433
-#define NATIONAL_DEX_STUNKY 434
-#define NATIONAL_DEX_SKUNTANK 435
-#define NATIONAL_DEX_BRONZOR 436
-#define NATIONAL_DEX_BRONZONG 437
-#define NATIONAL_DEX_BONSLY 438
-#define NATIONAL_DEX_MIME_JR 439
-#define NATIONAL_DEX_HAPPINY 440
-#define NATIONAL_DEX_CHATOT 441
-#define NATIONAL_DEX_SPIRITOMB 442
-#define NATIONAL_DEX_GIBLE 443
-#define NATIONAL_DEX_GABITE 444
-#define NATIONAL_DEX_GARCHOMP 445
-#define NATIONAL_DEX_MUNCHLAX 446
-#define NATIONAL_DEX_RIOLU 447
-#define NATIONAL_DEX_LUCARIO 448
-#define NATIONAL_DEX_HIPPOPOTAS 449
-#define NATIONAL_DEX_HIPPOWDON 450
-#define NATIONAL_DEX_SKORUPI 451
-#define NATIONAL_DEX_DRAPION 452
-#define NATIONAL_DEX_CROAGUNK 453
-#define NATIONAL_DEX_TOXICROAK 454
-#define NATIONAL_DEX_CARNIVINE 455
-#define NATIONAL_DEX_FINNEON 456
-#define NATIONAL_DEX_LUMINEON 457
-#define NATIONAL_DEX_MANTYKE 458
-#define NATIONAL_DEX_SNOVER 459
-#define NATIONAL_DEX_ABOMASNOW 460
-#define NATIONAL_DEX_WEAVILE 461
-#define NATIONAL_DEX_MAGNEZONE 462
-#define NATIONAL_DEX_LICKILICKY 463
-#define NATIONAL_DEX_RHYPERIOR 464
-#define NATIONAL_DEX_TANGROWTH 465
-#define NATIONAL_DEX_ELECTIVIRE 466
-#define NATIONAL_DEX_MAGMORTAR 467
-#define NATIONAL_DEX_TOGEKISS 468
-#define NATIONAL_DEX_YANMEGA 469
-#define NATIONAL_DEX_LEAFEON 470
-#define NATIONAL_DEX_GLACEON 471
-#define NATIONAL_DEX_GLISCOR 472
-#define NATIONAL_DEX_MAMOSWINE 473
-#define NATIONAL_DEX_PORYGON_Z 474
-#define NATIONAL_DEX_GALLADE 475
-#define NATIONAL_DEX_PROBOPASS 476
-#define NATIONAL_DEX_DUSKNOIR 477
-#define NATIONAL_DEX_FROSLASS 478
-#define NATIONAL_DEX_ROTOM 479
-#define NATIONAL_DEX_UXIE 480
-#define NATIONAL_DEX_MESPRIT 481
-#define NATIONAL_DEX_AZELF 482
-#define NATIONAL_DEX_DIALGA 483
-#define NATIONAL_DEX_PALKIA 484
-#define NATIONAL_DEX_HEATRAN 485
-#define NATIONAL_DEX_REGIGIGAS 486
-#define NATIONAL_DEX_GIRATINA 487
-#define NATIONAL_DEX_CRESSELIA 488
-#define NATIONAL_DEX_PHIONE 489
-#define NATIONAL_DEX_MANAPHY 490
-#define NATIONAL_DEX_DARKRAI 491
-#define NATIONAL_DEX_SHAYMIN 492
-#define NATIONAL_DEX_ARCEUS 493
-#define NATIONAL_DEX_VICTINI 494
-#define NATIONAL_DEX_SNIVY 495
-#define NATIONAL_DEX_SERVINE 496
-#define NATIONAL_DEX_SERPERIOR 497
-#define NATIONAL_DEX_TEPIG 498
-#define NATIONAL_DEX_PIGNITE 499
-#define NATIONAL_DEX_EMBOAR 500
-#define NATIONAL_DEX_OSHAWOTT 501
-#define NATIONAL_DEX_DEWOTT 502
-#define NATIONAL_DEX_SAMUROTT 503
-#define NATIONAL_DEX_PATRAT 504
-#define NATIONAL_DEX_WATCHOG 505
-#define NATIONAL_DEX_LILLIPUP 506
-#define NATIONAL_DEX_HERDIER 507
-#define NATIONAL_DEX_STOUTLAND 508
-#define NATIONAL_DEX_PURRLOIN 509
-#define NATIONAL_DEX_LIEPARD 510
-#define NATIONAL_DEX_PANSAGE 511
-#define NATIONAL_DEX_SIMISAGE 512
-#define NATIONAL_DEX_PANSEAR 513
-#define NATIONAL_DEX_SIMISEAR 514
-#define NATIONAL_DEX_PANPOUR 515
-#define NATIONAL_DEX_SIMIPOUR 516
-#define NATIONAL_DEX_MUNNA 517
-#define NATIONAL_DEX_MUSHARNA 518
-#define NATIONAL_DEX_PIDOVE 519
-#define NATIONAL_DEX_TRANQUILL 520
-#define NATIONAL_DEX_UNFEZANT 521
-#define NATIONAL_DEX_BLITZLE 522
-#define NATIONAL_DEX_ZEBSTRIKA 523
-#define NATIONAL_DEX_ROGGENROLA 524
-#define NATIONAL_DEX_BOLDORE 525
-#define NATIONAL_DEX_GIGALITH 526
-#define NATIONAL_DEX_WOOBAT 527
-#define NATIONAL_DEX_SWOOBAT 528
-#define NATIONAL_DEX_DRILBUR 529
-#define NATIONAL_DEX_EXCADRILL 530
-#define NATIONAL_DEX_AUDINO 531
-#define NATIONAL_DEX_TIMBURR 532
-#define NATIONAL_DEX_GURDURR 533
-#define NATIONAL_DEX_CONKELDURR 534
-#define NATIONAL_DEX_TYMPOLE 535
-#define NATIONAL_DEX_PALPITOAD 536
-#define NATIONAL_DEX_SEISMITOAD 537
-#define NATIONAL_DEX_THROH 538
-#define NATIONAL_DEX_SAWK 539
-#define NATIONAL_DEX_SEWADDLE 540
-#define NATIONAL_DEX_SWADLOON 541
-#define NATIONAL_DEX_LEAVANNY 542
-#define NATIONAL_DEX_VENIPEDE 543
-#define NATIONAL_DEX_WHIRLIPEDE 544
-#define NATIONAL_DEX_SCOLIPEDE 545
-#define NATIONAL_DEX_COTTONEE 546
-#define NATIONAL_DEX_WHIMSICOTT 547
-#define NATIONAL_DEX_PETILIL 548
-#define NATIONAL_DEX_LILLIGANT 549
-#define NATIONAL_DEX_BASCULIN 550
-#define NATIONAL_DEX_SANDILE 551
-#define NATIONAL_DEX_KROKOROK 552
-#define NATIONAL_DEX_KROOKODILE 553
-#define NATIONAL_DEX_DARUMAKA 554
-#define NATIONAL_DEX_DARMANITAN 555
-#define NATIONAL_DEX_MARACTUS 556
-#define NATIONAL_DEX_DWEBBLE 557
-#define NATIONAL_DEX_CRUSTLE 558
-#define NATIONAL_DEX_SCRAGGY 559
-#define NATIONAL_DEX_SCRAFTY 560
-#define NATIONAL_DEX_SIGILYPH 561
-#define NATIONAL_DEX_YAMASK 562
-#define NATIONAL_DEX_COFAGRIGUS 563
-#define NATIONAL_DEX_TIRTOUGA 564
-#define NATIONAL_DEX_CARRACOSTA 565
-#define NATIONAL_DEX_ARCHEN 566
-#define NATIONAL_DEX_ARCHEOPS 567
-#define NATIONAL_DEX_TRUBBISH 568
-#define NATIONAL_DEX_GARBODOR 569
-#define NATIONAL_DEX_ZORUA 570
-#define NATIONAL_DEX_ZOROARK 571
-#define NATIONAL_DEX_MINCCINO 572
-#define NATIONAL_DEX_CINCCINO 573
-#define NATIONAL_DEX_GOTHITA 574
-#define NATIONAL_DEX_GOTHORITA 575
-#define NATIONAL_DEX_GOTHITELLE 576
-#define NATIONAL_DEX_SOLOSIS 577
-#define NATIONAL_DEX_DUOSION 578
-#define NATIONAL_DEX_REUNICLUS 579
-#define NATIONAL_DEX_DUCKLETT 580
-#define NATIONAL_DEX_SWANNA 581
-#define NATIONAL_DEX_VANILLITE 582
-#define NATIONAL_DEX_VANILLISH 583
-#define NATIONAL_DEX_VANILLUXE 584
-#define NATIONAL_DEX_DEERLING 585
-#define NATIONAL_DEX_SAWSBUCK 586
-#define NATIONAL_DEX_EMOLGA 587
-#define NATIONAL_DEX_KARRABLAST 588
-#define NATIONAL_DEX_ESCAVALIER 589
-#define NATIONAL_DEX_FOONGUS 590
-#define NATIONAL_DEX_AMOONGUSS 591
-#define NATIONAL_DEX_FRILLISH 592
-#define NATIONAL_DEX_JELLICENT 593
-#define NATIONAL_DEX_ALOMOMOLA 594
-#define NATIONAL_DEX_JOLTIK 595
-#define NATIONAL_DEX_GALVANTULA 596
-#define NATIONAL_DEX_FERROSEED 597
-#define NATIONAL_DEX_FERROTHORN 598
-#define NATIONAL_DEX_KLINK 599
-#define NATIONAL_DEX_KLANG 600
-#define NATIONAL_DEX_KLINKLANG 601
-#define NATIONAL_DEX_TYNAMO 602
-#define NATIONAL_DEX_EELEKTRIK 603
-#define NATIONAL_DEX_EELEKTROSS 604
-#define NATIONAL_DEX_ELGYEM 605
-#define NATIONAL_DEX_BEHEEYEM 606
-#define NATIONAL_DEX_LITWICK 607
-#define NATIONAL_DEX_LAMPENT 608
-#define NATIONAL_DEX_CHANDELURE 609
-#define NATIONAL_DEX_AXEW 610
-#define NATIONAL_DEX_FRAXURE 611
-#define NATIONAL_DEX_HAXORUS 612
-#define NATIONAL_DEX_CUBCHOO 613
-#define NATIONAL_DEX_BEARTIC 614
-#define NATIONAL_DEX_CRYOGONAL 615
-#define NATIONAL_DEX_SHELMET 616
-#define NATIONAL_DEX_ACCELGOR 617
-#define NATIONAL_DEX_STUNFISK 618
-#define NATIONAL_DEX_MIENFOO 619
-#define NATIONAL_DEX_MIENSHAO 620
-#define NATIONAL_DEX_DRUDDIGON 621
-#define NATIONAL_DEX_GOLETT 622
-#define NATIONAL_DEX_GOLURK 623
-#define NATIONAL_DEX_PAWNIARD 624
-#define NATIONAL_DEX_BISHARP 625
-#define NATIONAL_DEX_BOUFFALANT 626
-#define NATIONAL_DEX_RUFFLET 627
-#define NATIONAL_DEX_BRAVIARY 628
-#define NATIONAL_DEX_VULLABY 629
-#define NATIONAL_DEX_MANDIBUZZ 630
-#define NATIONAL_DEX_HEATMOR 631
-#define NATIONAL_DEX_DURANT 632
-#define NATIONAL_DEX_DEINO 633
-#define NATIONAL_DEX_ZWEILOUS 634
-#define NATIONAL_DEX_HYDREIGON 635
-#define NATIONAL_DEX_LARVESTA 636
-#define NATIONAL_DEX_VOLCARONA 637
-#define NATIONAL_DEX_COBALION 638
-#define NATIONAL_DEX_TERRAKION 639
-#define NATIONAL_DEX_VIRIZION 640
-#define NATIONAL_DEX_TORNADUS 641
-#define NATIONAL_DEX_THUNDURUS 642
-#define NATIONAL_DEX_RESHIRAM 643
-#define NATIONAL_DEX_ZEKROM 644
-#define NATIONAL_DEX_LANDORUS 645
-#define NATIONAL_DEX_KYUREM 646
-#define NATIONAL_DEX_KELDEO 647
-#define NATIONAL_DEX_MELOETTA 648
-#define NATIONAL_DEX_GENESECT 649
-#define NATIONAL_DEX_CHESPIN 650
-#define NATIONAL_DEX_QUILLADIN 651
-#define NATIONAL_DEX_CHESNAUGHT 652
-#define NATIONAL_DEX_FENNEKIN 653
-#define NATIONAL_DEX_BRAIXEN 654
-#define NATIONAL_DEX_DELPHOX 655
-#define NATIONAL_DEX_FROAKIE 656
-#define NATIONAL_DEX_FROGADIER 657
-#define NATIONAL_DEX_GRENINJA 658
-#define NATIONAL_DEX_BUNNELBY 659
-#define NATIONAL_DEX_DIGGERSBY 660
-#define NATIONAL_DEX_FLETCHLING 661
-#define NATIONAL_DEX_FLETCHINDER 662
-#define NATIONAL_DEX_TALONFLAME 663
-#define NATIONAL_DEX_SCATTERBUG 664
-#define NATIONAL_DEX_SPEWPA 665
-#define NATIONAL_DEX_VIVILLON 666
-#define NATIONAL_DEX_LITLEO 667
-#define NATIONAL_DEX_PYROAR 668
-#define NATIONAL_DEX_FLABEBE 669
-#define NATIONAL_DEX_FLOETTE 670
-#define NATIONAL_DEX_FLORGES 671
-#define NATIONAL_DEX_SKIDDO 672
-#define NATIONAL_DEX_GOGOAT 673
-#define NATIONAL_DEX_PANCHAM 674
-#define NATIONAL_DEX_PANGORO 675
-#define NATIONAL_DEX_FURFROU 676
-#define NATIONAL_DEX_ESPURR 677
-#define NATIONAL_DEX_MEOWSTIC 678
-#define NATIONAL_DEX_HONEDGE 679
-#define NATIONAL_DEX_DOUBLADE 680
-#define NATIONAL_DEX_AEGISLASH 681
-#define NATIONAL_DEX_SPRITZEE 682
-#define NATIONAL_DEX_AROMATISSE 683
-#define NATIONAL_DEX_SWIRLIX 684
-#define NATIONAL_DEX_SLURPUFF 685
-#define NATIONAL_DEX_INKAY 686
-#define NATIONAL_DEX_MALAMAR 687
-#define NATIONAL_DEX_BINACLE 688
-#define NATIONAL_DEX_BARBARACLE 689
-#define NATIONAL_DEX_SKRELP 690
-#define NATIONAL_DEX_DRAGALGE 691
-#define NATIONAL_DEX_CLAUNCHER 692
-#define NATIONAL_DEX_CLAWITZER 693
-#define NATIONAL_DEX_HELIOPTILE 694
-#define NATIONAL_DEX_HELIOLISK 695
-#define NATIONAL_DEX_TYRUNT 696
-#define NATIONAL_DEX_TYRANTRUM 697
-#define NATIONAL_DEX_AMAURA 698
-#define NATIONAL_DEX_AURORUS 699
-#define NATIONAL_DEX_SYLVEON 700
-#define NATIONAL_DEX_HAWLUCHA 701
-#define NATIONAL_DEX_DEDENNE 702
-#define NATIONAL_DEX_CARBINK 703
-#define NATIONAL_DEX_GOOMY 704
-#define NATIONAL_DEX_SLIGGOO 705
-#define NATIONAL_DEX_GOODRA 706
-#define NATIONAL_DEX_KLEFKI 707
-#define NATIONAL_DEX_PHANTUMP 708
-#define NATIONAL_DEX_TREVENANT 709
-#define NATIONAL_DEX_PUMPKABOO 710
-#define NATIONAL_DEX_GOURGEIST 711
-#define NATIONAL_DEX_BERGMITE 712
-#define NATIONAL_DEX_AVALUGG 713
-#define NATIONAL_DEX_NOIBAT 714
-#define NATIONAL_DEX_NOIVERN 715
-#define NATIONAL_DEX_XERNEAS 716
-#define NATIONAL_DEX_YVELTAL 717
-#define NATIONAL_DEX_ZYGARDE 718
-#define NATIONAL_DEX_DIANCIE 719
-#define NATIONAL_DEX_HOOPA 720
-#define NATIONAL_DEX_VOLCANION 721
-#define NATIONAL_DEX_ROWLET 722
-#define NATIONAL_DEX_DARTRIX 723
-#define NATIONAL_DEX_DECIDUEYE 724
-#define NATIONAL_DEX_LITTEN 725
-#define NATIONAL_DEX_TORRACAT 726
-#define NATIONAL_DEX_INCINEROAR 727
-#define NATIONAL_DEX_POPPLIO 728
-#define NATIONAL_DEX_BRIONNE 729
-#define NATIONAL_DEX_PRIMARINA 730
-#define NATIONAL_DEX_PIKIPEK 731
-#define NATIONAL_DEX_TRUMBEAK 732
-#define NATIONAL_DEX_TOUCANNON 733
-#define NATIONAL_DEX_YUNGOOS 734
-#define NATIONAL_DEX_GUMSHOOS 735
-#define NATIONAL_DEX_GRUBBIN 736
-#define NATIONAL_DEX_CHARJABUG 737
-#define NATIONAL_DEX_VIKAVOLT 738
-#define NATIONAL_DEX_CRABRAWLER 739
-#define NATIONAL_DEX_CRABOMINABLE 740
-#define NATIONAL_DEX_ORICORIO 741
-#define NATIONAL_DEX_CUTIEFLY 742
-#define NATIONAL_DEX_RIBOMBEE 743
-#define NATIONAL_DEX_ROCKRUFF 744
-#define NATIONAL_DEX_LYCANROC 745
-#define NATIONAL_DEX_WISHIWASHI 746
-#define NATIONAL_DEX_MAREANIE 747
-#define NATIONAL_DEX_TOXAPEX 748
-#define NATIONAL_DEX_MUDBRAY 749
-#define NATIONAL_DEX_MUDSDALE 750
-#define NATIONAL_DEX_DEWPIDER 751
-#define NATIONAL_DEX_ARAQUANID 752
-#define NATIONAL_DEX_FOMANTIS 753
-#define NATIONAL_DEX_LURANTIS 754
-#define NATIONAL_DEX_MORELULL 755
-#define NATIONAL_DEX_SHIINOTIC 756
-#define NATIONAL_DEX_SALANDIT 757
-#define NATIONAL_DEX_SALAZZLE 758
-#define NATIONAL_DEX_STUFFUL 759
-#define NATIONAL_DEX_BEWEAR 760
-#define NATIONAL_DEX_BOUNSWEET 761
-#define NATIONAL_DEX_STEENEE 762
-#define NATIONAL_DEX_TSAREENA 763
-#define NATIONAL_DEX_COMFEY 764
-#define NATIONAL_DEX_ORANGURU 765
-#define NATIONAL_DEX_PASSIMIAN 766
-#define NATIONAL_DEX_WIMPOD 767
-#define NATIONAL_DEX_GOLISOPOD 768
-#define NATIONAL_DEX_SANDYGAST 769
-#define NATIONAL_DEX_PALOSSAND 770
-#define NATIONAL_DEX_PYUKUMUKU 771
-#define NATIONAL_DEX_TYPE_NULL 772
-#define NATIONAL_DEX_SILVALLY 773
-#define NATIONAL_DEX_MINIOR 774
-#define NATIONAL_DEX_KOMALA 775
-#define NATIONAL_DEX_TURTONATOR 776
-#define NATIONAL_DEX_TOGEDEMARU 777
-#define NATIONAL_DEX_MIMIKYU 778
-#define NATIONAL_DEX_BRUXISH 779
-#define NATIONAL_DEX_DRAMPA 780
-#define NATIONAL_DEX_DHELMISE 781
-#define NATIONAL_DEX_JANGMO_O 782
-#define NATIONAL_DEX_HAKAMO_O 783
-#define NATIONAL_DEX_KOMMO_O 784
-#define NATIONAL_DEX_TAPU_KOKO 785
-#define NATIONAL_DEX_TAPU_LELE 786
-#define NATIONAL_DEX_TAPU_BULU 787
-#define NATIONAL_DEX_TAPU_FINI 788
-#define NATIONAL_DEX_COSMOG 789
-#define NATIONAL_DEX_COSMOEM 790
-#define NATIONAL_DEX_SOLGALEO 791
-#define NATIONAL_DEX_LUNALA 792
-#define NATIONAL_DEX_NIHILEGO 793
-#define NATIONAL_DEX_BUZZWOLE 794
-#define NATIONAL_DEX_PHEROMOSA 795
-#define NATIONAL_DEX_XURKITREE 796
-#define NATIONAL_DEX_CELESTEELA 797
-#define NATIONAL_DEX_KARTANA 798
-#define NATIONAL_DEX_GUZZLORD 799
-#define NATIONAL_DEX_NECROZMA 800
-#define NATIONAL_DEX_MAGEARNA 801
-#define NATIONAL_DEX_MARSHADOW 802
-#define NATIONAL_DEX_POIPOLE 803
-#define NATIONAL_DEX_NAGANADEL 804
-#define NATIONAL_DEX_STAKATAKA 805
-#define NATIONAL_DEX_BLACEPHALON 806
-#define NATIONAL_DEX_ZERAORA 807
-#define NATIONAL_DEX_MELTAN 808
-#define NATIONAL_DEX_MELMETAL 809
-#define NATIONAL_DEX_GROOKEY 810
-#define NATIONAL_DEX_THWACKEY 811
-#define NATIONAL_DEX_RILLABOOM 812
-#define NATIONAL_DEX_SCORBUNNY 813
-#define NATIONAL_DEX_RABOOT 814
-#define NATIONAL_DEX_CINDERACE 815
-#define NATIONAL_DEX_SOBBLE 816
-#define NATIONAL_DEX_DRIZZILE 817
-#define NATIONAL_DEX_INTELEON 818
-#define NATIONAL_DEX_SKWOVET 819
-#define NATIONAL_DEX_GREEDENT 820
-#define NATIONAL_DEX_ROOKIDEE 821
-#define NATIONAL_DEX_CORVISQUIRE 822
-#define NATIONAL_DEX_CORVIKNIGHT 823
-#define NATIONAL_DEX_BLIPBUG 824
-#define NATIONAL_DEX_DOTTLER 825
-#define NATIONAL_DEX_ORBEETLE 826
-#define NATIONAL_DEX_NICKIT 827
-#define NATIONAL_DEX_THIEVUL 828
-#define NATIONAL_DEX_GOSSIFLEUR 829
-#define NATIONAL_DEX_ELDEGOSS 830
-#define NATIONAL_DEX_WOOLOO 831
-#define NATIONAL_DEX_DUBWOOL 832
-#define NATIONAL_DEX_CHEWTLE 833
-#define NATIONAL_DEX_DREDNAW 834
-#define NATIONAL_DEX_YAMPER 835
-#define NATIONAL_DEX_BOLTUND 836
-#define NATIONAL_DEX_ROLYCOLY 837
-#define NATIONAL_DEX_CARKOL 838
-#define NATIONAL_DEX_COALOSSAL 839
-#define NATIONAL_DEX_APPLIN 840
-#define NATIONAL_DEX_FLAPPLE 841
-#define NATIONAL_DEX_APPLETUN 842
-#define NATIONAL_DEX_SILICOBRA 843
-#define NATIONAL_DEX_SANDACONDA 844
-#define NATIONAL_DEX_CRAMORANT 845
-#define NATIONAL_DEX_ARROKUDA 846
-#define NATIONAL_DEX_BARRASKEWDA 847
-#define NATIONAL_DEX_TOXEL 848
-#define NATIONAL_DEX_TOXTRICITY 849
-#define NATIONAL_DEX_SIZZLIPEDE 850
-#define NATIONAL_DEX_CENTISKORCH 851
-#define NATIONAL_DEX_CLOBBOPUS 852
-#define NATIONAL_DEX_GRAPPLOCT 853
-#define NATIONAL_DEX_SINISTEA 854
-#define NATIONAL_DEX_POLTEAGEIST 855
-#define NATIONAL_DEX_HATENNA 856
-#define NATIONAL_DEX_HATTREM 857
-#define NATIONAL_DEX_HATTERENE 858
-#define NATIONAL_DEX_IMPIDIMP 859
-#define NATIONAL_DEX_MORGREM 860
-#define NATIONAL_DEX_GRIMMSNARL 861
-#define NATIONAL_DEX_OBSTAGOON 862
-#define NATIONAL_DEX_PERRSERKER 863
-#define NATIONAL_DEX_CURSOLA 864
-#define NATIONAL_DEX_SIRFETCHD 865
-#define NATIONAL_DEX_MR_RIME 866
-#define NATIONAL_DEX_RUNERIGUS 867
-#define NATIONAL_DEX_MILCERY 868
-#define NATIONAL_DEX_ALCREMIE 869
-#define NATIONAL_DEX_FALINKS 870
-#define NATIONAL_DEX_PINCURCHIN 871
-#define NATIONAL_DEX_SNOM 872
-#define NATIONAL_DEX_FROSMOTH 873
-#define NATIONAL_DEX_STONJOURNER 874
-#define NATIONAL_DEX_EISCUE 875
-#define NATIONAL_DEX_INDEEDEE 876
-#define NATIONAL_DEX_MORPEKO 877
-#define NATIONAL_DEX_CUFANT 878
-#define NATIONAL_DEX_COPPERAJAH 879
-#define NATIONAL_DEX_DRACOZOLT 880
-#define NATIONAL_DEX_ARCTOZOLT 881
-#define NATIONAL_DEX_DRACOVISH 882
-#define NATIONAL_DEX_ARCTOVISH 883
-#define NATIONAL_DEX_DURALUDON 884
-#define NATIONAL_DEX_DREEPY 885
-#define NATIONAL_DEX_DRAKLOAK 886
-#define NATIONAL_DEX_DRAGAPULT 887
-#define NATIONAL_DEX_ZACIAN 888
-#define NATIONAL_DEX_ZAMAZENTA 889
-#define NATIONAL_DEX_ETERNATUS 890
-#define NATIONAL_DEX_KUBFU 891
-#define NATIONAL_DEX_URSHIFU 892
-#define NATIONAL_DEX_ZARUDE 893
-#define NATIONAL_DEX_REGIELEKI 894
-#define NATIONAL_DEX_REGIDRAGO 895
-#define NATIONAL_DEX_GLASTRIER 896
-#define NATIONAL_DEX_SPECTRIER 897
-#define NATIONAL_DEX_CALYREX 898
-
-#define NATIONAL_DEX_COUNT NATIONAL_DEX_CALYREX
-#define POKEMON_SLOTS_NUMBER (NATIONAL_DEX_COUNT + 1)
-
-// Hoenn Dex(ORAS) Index Defines
-#define HOENN_DEX_NONE 0
-#define HOENN_DEX_TREECKO 1
-#define HOENN_DEX_GROVYLE 2
-#define HOENN_DEX_SCEPTILE 3
-#define HOENN_DEX_TORCHIC 4
-#define HOENN_DEX_COMBUSKEN 5
-#define HOENN_DEX_BLAZIKEN 6
-#define HOENN_DEX_MUDKIP 7
-#define HOENN_DEX_MARSHTOMP 8
-#define HOENN_DEX_SWAMPERT 9
-#define HOENN_DEX_POOCHYENA 10
-#define HOENN_DEX_MIGHTYENA 11
-#define HOENN_DEX_ZIGZAGOON 12
-#define HOENN_DEX_LINOONE 13
-#define HOENN_DEX_WURMPLE 14
-#define HOENN_DEX_SILCOON 15
-#define HOENN_DEX_BEAUTIFLY 16
-#define HOENN_DEX_CASCOON 17
-#define HOENN_DEX_DUSTOX 18
-#define HOENN_DEX_LOTAD 19
-#define HOENN_DEX_LOMBRE 20
-#define HOENN_DEX_LUDICOLO 21
-#define HOENN_DEX_SEEDOT 22
-#define HOENN_DEX_NUZLEAF 23
-#define HOENN_DEX_SHIFTRY 24
-#define HOENN_DEX_TAILLOW 25
-#define HOENN_DEX_SWELLOW 26
-#define HOENN_DEX_WINGULL 27
-#define HOENN_DEX_PELIPPER 28
-#define HOENN_DEX_RALTS 29
-#define HOENN_DEX_KIRLIA 30
-#define HOENN_DEX_GARDEVOIR 31
-#define HOENN_DEX_GALLADE 32
-#define HOENN_DEX_SURSKIT 33
-#define HOENN_DEX_MASQUERAIN 34
-#define HOENN_DEX_SHROOMISH 35
-#define HOENN_DEX_BRELOOM 36
-#define HOENN_DEX_SLAKOTH 37
-#define HOENN_DEX_VIGOROTH 38
-#define HOENN_DEX_SLAKING 39
-#define HOENN_DEX_ABRA 40
-#define HOENN_DEX_KADABRA 41
-#define HOENN_DEX_ALAKAZAM 42
-#define HOENN_DEX_NINCADA 43
-#define HOENN_DEX_NINJASK 44
-#define HOENN_DEX_SHEDINJA 45
-#define HOENN_DEX_WHISMUR 46
-#define HOENN_DEX_LOUDRED 47
-#define HOENN_DEX_EXPLOUD 48
-#define HOENN_DEX_MAKUHITA 49
-#define HOENN_DEX_HARIYAMA 50
-#define HOENN_DEX_GOLDEEN 51
-#define HOENN_DEX_SEAKING 52
-#define HOENN_DEX_MAGIKARP 53
-#define HOENN_DEX_GYARADOS 54
-#define HOENN_DEX_AZURILL 55
-#define HOENN_DEX_MARILL 56
-#define HOENN_DEX_AZUMARILL 57
-#define HOENN_DEX_GEODUDE 58
-#define HOENN_DEX_GRAVELER 59
-#define HOENN_DEX_GOLEM 60
-#define HOENN_DEX_NOSEPASS 61
-#define HOENN_DEX_PROBOPASS 62
-#define HOENN_DEX_SKITTY 63
-#define HOENN_DEX_DELCATTY 64
-#define HOENN_DEX_ZUBAT 65
-#define HOENN_DEX_GOLBAT 66
-#define HOENN_DEX_CROBAT 67
-#define HOENN_DEX_TENTACOOL 68
-#define HOENN_DEX_TENTACRUEL 69
-#define HOENN_DEX_SABLEYE 70
-#define HOENN_DEX_MAWILE 71
-#define HOENN_DEX_ARON 72
-#define HOENN_DEX_LAIRON 73
-#define HOENN_DEX_AGGRON 74
-#define HOENN_DEX_MACHOP 75
-#define HOENN_DEX_MACHOKE 76
-#define HOENN_DEX_MACHAMP 77
-#define HOENN_DEX_MEDITITE 78
-#define HOENN_DEX_MEDICHAM 79
-#define HOENN_DEX_ELECTRIKE 80
-#define HOENN_DEX_MANECTRIC 81
-#define HOENN_DEX_PLUSLE 82
-#define HOENN_DEX_MINUN 83
-#define HOENN_DEX_MAGNEMITE 84
-#define HOENN_DEX_MAGNETON 85
-#define HOENN_DEX_MAGNEZONE 86
-#define HOENN_DEX_VOLTORB 87
-#define HOENN_DEX_ELECTRODE 88
-#define HOENN_DEX_VOLBEAT 89
-#define HOENN_DEX_ILLUMISE 90
-#define HOENN_DEX_ODDISH 91
-#define HOENN_DEX_GLOOM 92
-#define HOENN_DEX_VILEPLUME 93
-#define HOENN_DEX_BELLOSSOM 94
-#define HOENN_DEX_DODUO 95
-#define HOENN_DEX_DODRIO 96
-#define HOENN_DEX_BUDEW 97
-#define HOENN_DEX_ROSELIA 98
-#define HOENN_DEX_ROSERADE 99
-#define HOENN_DEX_GULPIN 100
-#define HOENN_DEX_SWALOT 101
-#define HOENN_DEX_CARVANHA 102
-#define HOENN_DEX_SHARPEDO 103
-#define HOENN_DEX_WAILMER 104
-#define HOENN_DEX_WAILORD 105
-#define HOENN_DEX_NUMEL 106
-#define HOENN_DEX_CAMERUPT 107
-#define HOENN_DEX_SLUGMA 108
-#define HOENN_DEX_MAGCARGO 109
-#define HOENN_DEX_TORKOAL 110
-#define HOENN_DEX_GRIMER 111
-#define HOENN_DEX_MUK 112
-#define HOENN_DEX_KOFFING 113
-#define HOENN_DEX_WEEZING 114
-#define HOENN_DEX_SPOINK 115
-#define HOENN_DEX_GRUMPIG 116
-#define HOENN_DEX_SANDSHREW 117
-#define HOENN_DEX_SANDSLASH 118
-#define HOENN_DEX_SPINDA 119
-#define HOENN_DEX_SKARMORY 120
-#define HOENN_DEX_TRAPINCH 121
-#define HOENN_DEX_VIBRAVA 122
-#define HOENN_DEX_FLYGON 123
-#define HOENN_DEX_CACNEA 124
-#define HOENN_DEX_CACTURNE 125
-#define HOENN_DEX_SWABLU 126
-#define HOENN_DEX_ALTARIA 127
-#define HOENN_DEX_ZANGOOSE 128
-#define HOENN_DEX_SEVIPER 129
-#define HOENN_DEX_LUNATONE 130
-#define HOENN_DEX_SOLROCK 131
-#define HOENN_DEX_BARBOACH 132
-#define HOENN_DEX_WHISCASH 133
-#define HOENN_DEX_CORPHISH 134
-#define HOENN_DEX_CRAWDAUNT 135
-#define HOENN_DEX_BALTOY 136
-#define HOENN_DEX_CLAYDOL 137
-#define HOENN_DEX_LILEEP 138
-#define HOENN_DEX_CRADILY 139
-#define HOENN_DEX_ANORITH 140
-#define HOENN_DEX_ARMALDO 141
-#define HOENN_DEX_IGGLYBUFF 142
-#define HOENN_DEX_JIGGLYPUFF 143
-#define HOENN_DEX_WIGGLYTUFF 144
-#define HOENN_DEX_FEEBAS 145
-#define HOENN_DEX_MILOTIC 146
-#define HOENN_DEX_CASTFORM 147
-#define HOENN_DEX_STARYU 148
-#define HOENN_DEX_STARMIE 149
-#define HOENN_DEX_KECLEON 150
-#define HOENN_DEX_SHUPPET 151
-#define HOENN_DEX_BANETTE 152
-#define HOENN_DEX_DUSKULL 153
-#define HOENN_DEX_DUSCLOPS 154
-#define HOENN_DEX_DUSKNOIR 155
-#define HOENN_DEX_TROPIUS 156
-#define HOENN_DEX_CHINGLING 157
-#define HOENN_DEX_CHIMECHO 158
-#define HOENN_DEX_ABSOL 159
-#define HOENN_DEX_VULPIX 160
-#define HOENN_DEX_NINETALES 161
-#define HOENN_DEX_PICHU 162
-#define HOENN_DEX_PIKACHU 163
-#define HOENN_DEX_RAICHU 164
-#define HOENN_DEX_PSYDUCK 165
-#define HOENN_DEX_GOLDUCK 166
-#define HOENN_DEX_WYNAUT 167
-#define HOENN_DEX_WOBBUFFET 168
-#define HOENN_DEX_NATU 169
-#define HOENN_DEX_XATU 170
-#define HOENN_DEX_GIRAFARIG 171
-#define HOENN_DEX_PHANPY 172
-#define HOENN_DEX_DONPHAN 173
-#define HOENN_DEX_PINSIR 174
-#define HOENN_DEX_HERACROSS 175
-#define HOENN_DEX_RHYHORN 176
-#define HOENN_DEX_RHYDON 177
-#define HOENN_DEX_RHYPERIOR 178
-#define HOENN_DEX_SNORUNT 179
-#define HOENN_DEX_GLALIE 180
-#define HOENN_DEX_FROSLASS 181
-#define HOENN_DEX_SPHEAL 182
-#define HOENN_DEX_SEALEO 183
-#define HOENN_DEX_WALREIN 184
-#define HOENN_DEX_CLAMPERL 185
-#define HOENN_DEX_HUNTAIL 186
-#define HOENN_DEX_GOREBYSS 187
-#define HOENN_DEX_RELICANTH 188
-#define HOENN_DEX_CORSOLA 189
-#define HOENN_DEX_CHINCHOU 190
-#define HOENN_DEX_LANTURN 191
-#define HOENN_DEX_LUVDISC 192
-#define HOENN_DEX_HORSEA 193
-#define HOENN_DEX_SEADRA 194
-#define HOENN_DEX_KINGDRA 195
-#define HOENN_DEX_BAGON 196
-#define HOENN_DEX_SHELGON 197
-#define HOENN_DEX_SALAMENCE 198
-#define HOENN_DEX_BELDUM 199
-#define HOENN_DEX_METANG 200
-#define HOENN_DEX_METAGROSS 201
-#define HOENN_DEX_REGIROCK 202
-#define HOENN_DEX_REGICE 203
-#define HOENN_DEX_REGISTEEL 204
-#define HOENN_DEX_LATIAS 205
-#define HOENN_DEX_LATIOS 206
-#define HOENN_DEX_KYOGRE 207
-#define HOENN_DEX_GROUDON 208
-#define HOENN_DEX_RAYQUAZA 209
-#define HOENN_DEX_JIRACHI 210
-#define HOENN_DEX_DEOXYS 211
-
-#define HOENN_DEX_COUNT 212
-
-// species flags
-#define F_ULTRA_BEAST (1 << 0)
-#define F_ALOLAN_FORM (1 << 1)
-#define F_GALARIAN_FORM (1 << 2)
+// Species Flags
+#define FLAG_ULTRA_BEAST (1 << 0)
+#define FLAG_ALOLAN_FORM (1 << 1)
+#define FLAG_GALARIAN_FORM (1 << 2)
+#define FLAG_GENDER_DIFFERENCE (1 << 3)
#endif // GUARD_CONSTANTS_SPECIES_H
diff --git a/include/constants/wild_encounter.h b/include/constants/wild_encounter.h
new file mode 100644
index 0000000000..a78cd126f3
--- /dev/null
+++ b/include/constants/wild_encounter.h
@@ -0,0 +1,11 @@
+#ifndef GUARD_CONSTANTS_WILD_ENCOUNTER_H
+#define GUARD_CONSTANTS_WILD_ENCOUNTER_H
+
+#define LAND_WILD_COUNT 12
+#define WATER_WILD_COUNT 5
+#define ROCK_WILD_COUNT 5
+#define FISH_WILD_COUNT 10
+
+#define NUM_ALTERING_CAVE_TABLES 9
+
+#endif // GUARD_CONSTANTS_WILD_ENCOUNTER_H
diff --git a/include/easy_chat.h b/include/easy_chat.h
index 4d2bc7c983..c9ef4428f7 100644
--- a/include/easy_chat.h
+++ b/include/easy_chat.h
@@ -2,7 +2,6 @@
#define GUARD_EASYCHAT_H
#include "main.h"
-#include "constants/easy_chat.h"
struct EasyChatScreenTemplate
{
diff --git a/include/event_object_movement.h b/include/event_object_movement.h
index bd82320271..d31802a67f 100644
--- a/include/event_object_movement.h
+++ b/include/event_object_movement.h
@@ -98,7 +98,7 @@ void ObjectEventClearHeldMovementIfActive(struct ObjectEvent *);
void TrySpawnObjectEvents(s16, s16);
u8 CreateObjectGraphicsSprite(u16, void (*)(struct Sprite *), s16 x, s16 y, u8 subpriority);
u8 TrySpawnObjectEvent(u8, u8, u8);
-u8 SpawnSpecialObjectEventParameterized(u8 graphicsId, u8 movementBehavior, u8 localId, s16 x, s16 y, u8 z);
+u8 SpawnSpecialObjectEventParameterized(u8 graphicsId, u8 movementBehavior, u8 localId, s16 x, s16 y, u8 elevation);
u8 SpawnSpecialObjectEvent(struct ObjectEventTemplate *);
void SetSpritePosToMapCoords(s16, s16, s16 *, s16 *);
void CameraObjectReset1(void);
@@ -128,7 +128,7 @@ u8 GetCollisionAtCoords(struct ObjectEvent *, s16, s16, u32);
void MoveCoords(u8, s16 *, s16 *);
bool8 ObjectEventIsHeldMovementActive(struct ObjectEvent *);
u8 ObjectEventClearHeldMovementIfFinished(struct ObjectEvent *);
-u8 GetObjectEventIdByXYZ(u16 x, u16 y, u8 z);
+u8 GetObjectEventIdByPosition(u16 x, u16 y, u8 elevation);
void SetTrainerMovementType(struct ObjectEvent *objectEvent, u8 movementType);
u8 GetTrainerFacingDirectionMovementType(u8 direction);
const u8 *GetObjectEventScriptPointerByObjectEventId(u8 objectEventId);
@@ -162,17 +162,15 @@ u8 ObjectEventCheckHeldMovementStatus(struct ObjectEvent *objectEvent);
u8 ObjectEventGetHeldMovementActionId(struct ObjectEvent *objectEvent);
void TryOverrideTemplateCoordsForObjectEvent(const struct ObjectEvent *objectEvent, u8 movementType);
void OverrideTemplateCoordsForObjectEvent(const struct ObjectEvent *objectEvent);
-void ShiftStillObjectEventCoords(struct ObjectEvent *pObject);
-void ObjectEventMoveDestCoords(struct ObjectEvent *pObject, u32 unk_19, s16 *pInt, s16 *pInt1);
+void ShiftStillObjectEventCoords(struct ObjectEvent *objEvent);
+void ObjectEventMoveDestCoords(struct ObjectEvent *objEvent, u32 direction, s16 *x, s16 *y);
u8 AddCameraObject(u8 linkedSpriteId);
void UpdateObjectEventsForCameraUpdate(s16 x, s16 y);
u8 GetWalkSlowMovementAction(u32);
u8 GetJumpMovementAction(u32);
-bool8 AreZCoordsCompatible(u8, u8);
-u8 ZCoordToPriority(u8);
-void ObjectEventUpdateZCoord(struct ObjectEvent *pObject);
-void SetObjectSubpriorityByZCoord(u8, struct Sprite *, u8);
-bool8 IsZCoordMismatchAt(u8, s16, s16);
+u8 ElevationToPriority(u8);
+void ObjectEventUpdateElevation(struct ObjectEvent *objEvent);
+void SetObjectSubpriorityByElevation(u8, struct Sprite *, u8);
void UnfreezeObjectEvent(struct ObjectEvent *);
u8 FindLockedObjectEventIndex(struct ObjectEvent *);
void SetAndStartSpriteAnim(struct Sprite *, u8, u8);
@@ -413,7 +411,7 @@ u8 MovementType_Invisible_Step0(struct ObjectEvent *, struct Sprite *);
u8 MovementType_Invisible_Step1(struct ObjectEvent *, struct Sprite *);
u8 MovementType_Invisible_Step2(struct ObjectEvent *, struct Sprite *);
-u8 CreateVirtualObject(u8 graphicsId, u8 virtualObjId, s16 x, s16 y, u8 z, u8 direction);
+u8 CreateVirtualObject(u8 graphicsId, u8 virtualObjId, s16 x, s16 y, u8 elevation, u8 direction);
void TurnVirtualObject(u8 virtualObjId, u8 direction);
void SetVirtualObjectGraphics(u8 virtualObjId, u8 graphicsId);
void SetVirtualObjectInvisibility(u8 virtualObjId, bool32 invisible);
diff --git a/include/field_player_avatar.h b/include/field_player_avatar.h
index 823564f226..d382de08c8 100644
--- a/include/field_player_avatar.h
+++ b/include/field_player_avatar.h
@@ -30,7 +30,7 @@ void PlayerSetAnimId(u8 a, u8 b);
bool8 IsPlayerCollidingWithFarawayIslandMew(u8 direction);
void PlayerOnBikeCollideWithFarawayIslandMew(u8 direction);
u8 CheckForObjectEventCollision(struct ObjectEvent *a, s16 b, s16 c, u8 d, u8 e);
-u8 PlayerGetZCoord(void);
+u8 PlayerGetElevation(void);
void SetPlayerAvatarTransitionFlags(u16 a);
void CancelPlayerForcedMovement(void);
void InitPlayerAvatar(s16 a, s16 b, u8 c, u8 d);
diff --git a/include/fieldmap.h b/include/fieldmap.h
index 28da8da2a3..e7497f7bd4 100644
--- a/include/fieldmap.h
+++ b/include/fieldmap.h
@@ -7,7 +7,7 @@
#define NUM_METATILES_TOTAL 1024
#define NUM_PALS_IN_PRIMARY 6
#define NUM_PALS_TOTAL 13
-#define MAX_MAP_DATA_SIZE 0x2800
+#define MAX_MAP_DATA_SIZE 10240
// Map coordinates are offset by 7 when using the map
// buffer because it needs to load sufficient border
@@ -29,10 +29,10 @@ void GetCameraCoords(u16*, u16*);
bool8 MapGridIsImpassableAt(int, int);
int GetMapBorderIdAt(int x, int y);
bool32 CanCameraMoveInDirection(int direction);
-u16 GetBehaviorByMetatileId(u16 metatileId);
+u16 GetMetatileAttributesById(u16 metatileId);
void GetCameraFocusCoords(u16 *x, u16 *y);
u8 MapGridGetMetatileLayerTypeAt(int x, int y);
-u8 MapGridGetZCoordAt(int x, int y);
+u8 MapGridGetElevationAt(int x, int y);
bool8 CameraMove(int deltaX, int deltaY);
void SaveMapView(void);
void SetCameraFocusCoords(u16 x, u16 y);
diff --git a/include/gba/m4a_internal.h b/include/gba/m4a_internal.h
index eeb79391b5..a057c2da61 100644
--- a/include/gba/m4a_internal.h
+++ b/include/gba/m4a_internal.h
@@ -349,7 +349,7 @@ struct MusicPlayer
{
struct MusicPlayerInfo *info;
struct MusicPlayerTrack *track;
- u8 unk_8;
+ u8 numTracks;
u16 unk_A;
};
diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h
index 33be942c80..974fa3382b 100644
--- a/include/global.fieldmap.h
+++ b/include/global.fieldmap.h
@@ -1,13 +1,30 @@
#ifndef GUARD_GLOBAL_FIELDMAP_H
#define GUARD_GLOBAL_FIELDMAP_H
-#define METATILE_BEHAVIOR_MASK 0x00FF
-#define METATILE_COLLISION_MASK 0x0C00
-#define METATILE_ID_MASK 0x03FF
-#define METATILE_ID_UNDEFINED 0x03FF
-#define METATILE_ELEVATION_SHIFT 12
-#define METATILE_COLLISION_SHIFT 10
-#define METATILE_ELEVATION_MASK 0xF000
+// Masks/shifts for blocks in the map grid
+// Map grid blocks consist of a 10 bit metatile id, a 2 bit collision value, and a 4 bit elevation value
+// This is the data stored in each data/layouts/*/map.bin file
+#define MAPGRID_METATILE_ID_MASK 0x03FF // Bits 1-10
+#define MAPGRID_COLLISION_MASK 0x0C00 // Bits 11-12
+#define MAPGRID_ELEVATION_MASK 0xF000 // Bits 13-16
+#define MAPGRID_COLLISION_SHIFT 10
+#define MAPGRID_ELEVATION_SHIFT 12
+
+// An undefined map grid block has all metatile id bits set and nothing else
+#define MAPGRID_UNDEFINED MAPGRID_METATILE_ID_MASK
+
+// Masks/shifts for metatile attributes
+// Metatile attributes consist of an 8 bit behavior value, 4 unused bits, and a 4 bit layer type value
+// This is the data stored in each data/tilesets/*/*/metatile_attributes.bin file
+#define METATILE_ATTR_BEHAVIOR_MASK 0x00FF // Bits 1-8
+#define METATILE_ATTR_LAYER_MASK 0xF000 // Bits 13-16
+#define METATILE_ATTR_LAYER_SHIFT 12
+
+enum {
+ METATILE_LAYER_TYPE_NORMAL, // Metatile uses middle and top bg layers
+ METATILE_LAYER_TYPE_COVERED, // Metatile uses bottom and middle bg layers
+ METATILE_LAYER_TYPE_SPLIT, // Metatile uses bottom and top bg layers
+};
#define METATILE_ID(tileset, name) (METATILE_##tileset##_##name)
@@ -16,18 +33,6 @@
// for constructing large tiles, such as the Battle Pike's curtain tile.
#define METATILE_ROW_WIDTH 8
-enum
-{
- CONNECTION_INVALID = -1,
- CONNECTION_NONE,
- CONNECTION_SOUTH,
- CONNECTION_NORTH,
- CONNECTION_WEST,
- CONNECTION_EAST,
- CONNECTION_DIVE,
- CONNECTION_EMERGE
-};
-
typedef void (*TilesetCB)(void);
struct Tileset
diff --git a/include/global.h b/include/global.h
index 1175af94e4..a77d2aefab 100644
--- a/include/global.h
+++ b/include/global.h
@@ -9,8 +9,11 @@
#include "constants/flags.h"
#include "constants/vars.h"
#include "constants/species.h"
+#include "constants/pokedex.h"
#include "constants/berry.h"
#include "constants/maps.h"
+#include "constants/pokemon.h"
+#include "constants/easy_chat.h"
#include "constants/expansion_branches.h"
// Prevent cross-jump optimization.
@@ -132,8 +135,11 @@
#define ROUND_BITS_TO_BYTES(numBits) DIV_ROUND_UP(numBits, 8)
-#define DEX_FLAGS_NO ROUND_BITS_TO_BYTES(POKEMON_SLOTS_NUMBER)
+// NUM_DEX_FLAG_BYTES allocates more flags than it needs to, as NUM_SPECIES includes the "old unown"
+// values that don't appear in the Pokedex. NATIONAL_DEX_COUNT does not include these values.
+#define NUM_DEX_FLAG_BYTES ROUND_BITS_TO_BYTES(NUM_SPECIES)
#define NUM_FLAG_BYTES ROUND_BITS_TO_BYTES(FLAGS_COUNT)
+#define NUM_ADDITIONAL_PHRASE_BYTES ROUND_BITS_TO_BYTES(NUM_ADDITIONAL_PHRASES)
struct Coords8
{
@@ -990,7 +996,7 @@ struct SaveBlock1
/*0x2BC8*/ u16 easyChatBattleWon[EASY_CHAT_BATTLE_WORDS_COUNT];
/*0x2BD4*/ u16 easyChatBattleLost[EASY_CHAT_BATTLE_WORDS_COUNT];
/*0x2BE0*/ struct Mail mail[MAIL_COUNT];
- /*0x2E20*/ u8 additionalPhrases[8]; // bitfield for 33 additional phrases in easy chat system
+ /*0x2E20*/ u8 additionalPhrases[NUM_ADDITIONAL_PHRASE_BYTES]; // bitfield for 33 additional phrases in easy chat system
/*0x2E28*/ OldMan oldMan;
/*0x2e64*/ struct DewfordTrend dewfordTrends[SAVED_TRENDS_COUNT];
/*0x2e90*/ struct ContestWinner contestWinners[NUM_CONTEST_WINNERS]; // see CONTEST_WINNER_*
@@ -1002,8 +1008,8 @@ struct SaveBlock1
/*0x31DC*/ struct Roamer roamer;
/*0x31F8*/ struct EnigmaBerry enigmaBerry;
/*0x322C*/ struct MysteryGiftSave mysteryGift;
- /*0x3???*/ u8 dexSeen[DEX_FLAGS_NO];
- /*0x3???*/ u8 dexCaught[DEX_FLAGS_NO];
+ /*0x3???*/ u8 dexSeen[NUM_DEX_FLAG_BYTES];
+ /*0x3???*/ u8 dexCaught[NUM_DEX_FLAG_BYTES];
/*0x3???*/ u32 trainerHillTimes[4];
/*0x3???*/ struct RamScript ramScript;
/*0x3???*/ struct RecordMixingGift recordMixingGift;
@@ -1021,7 +1027,7 @@ struct MapPosition
{
s16 x;
s16 y;
- s8 height;
+ s8 elevation;
};
#endif // GUARD_GLOBAL_H
diff --git a/include/graphics.h b/include/graphics.h
index 15c5bd6759..849248b419 100644
--- a/include/graphics.h
+++ b/include/graphics.h
@@ -5,61 +5,61 @@
extern const u32 gMessageBox_Gfx[];
extern const u16 gMessageBox_Pal[];
-// interface pokeballs
-extern const u32 gInterfaceGfx_PokeBall[];
-extern const u32 gInterfacePal_PokeBall[];
-extern const u32 gInterfaceGfx_GreatBall[];
-extern const u32 gInterfacePal_GreatBall[];
-extern const u32 gInterfaceGfx_UltraBall[];
-extern const u32 gInterfacePal_UltraBall[];
-extern const u32 gInterfaceGfx_MasterBall[];
-extern const u32 gInterfacePal_MasterBall[];
-extern const u32 gInterfaceGfx_PremierBall[];
-extern const u32 gInterfacePal_PremierBall[];
-extern const u32 gInterfaceGfx_HealBall[];
-extern const u32 gInterfacePal_HealBall[];
-extern const u32 gInterfaceGfx_NetBall[];
-extern const u32 gInterfacePal_NetBall[];
-extern const u32 gInterfaceGfx_NestBall[];
-extern const u32 gInterfacePal_NestBall[];
-extern const u32 gInterfaceGfx_DiveBall[];
-extern const u32 gInterfacePal_DiveBall[];
-extern const u32 gInterfaceGfx_DuskBall[];
-extern const u32 gInterfacePal_DuskBall[];
-extern const u32 gInterfaceGfx_TimerBall[];
-extern const u32 gInterfacePal_TimerBall[];
-extern const u32 gInterfaceGfx_QuickBall[];
-extern const u32 gInterfacePal_QuickBall[];
-extern const u32 gInterfaceGfx_RepeatBall[];
-extern const u32 gInterfacePal_RepeatBall[];
-extern const u32 gInterfaceGfx_LuxuryBall[];
-extern const u32 gInterfacePal_LuxuryBall[];
-extern const u32 gInterfaceGfx_LevelBall[];
-extern const u32 gInterfacePal_LevelBall[];
-extern const u32 gInterfaceGfx_LureBall[];
-extern const u32 gInterfacePal_LureBall[];
-extern const u32 gInterfaceGfx_MoonBall[];
-extern const u32 gInterfacePal_MoonBall[];
-extern const u32 gInterfaceGfx_FriendBall[];
-extern const u32 gInterfacePal_FriendBall[];
-extern const u32 gInterfaceGfx_LoveBall[];
-extern const u32 gInterfacePal_LoveBall[];
-extern const u32 gInterfaceGfx_FastBall[];
-extern const u32 gInterfacePal_FastBall[];
-extern const u32 gInterfaceGfx_HeavyBall[];
-extern const u32 gInterfacePal_HeavyBall[];
-extern const u32 gInterfaceGfx_DreamBall[];
-extern const u32 gInterfacePal_DreamBall[];
-extern const u32 gInterfaceGfx_SafariBall[];
-extern const u32 gInterfacePal_SafariBall[];
-extern const u32 gInterfaceGfx_SportBall[];
-extern const u32 gInterfacePal_SportBall[];
-extern const u32 gInterfaceGfx_ParkBall[];
-extern const u32 gInterfacePal_ParkBall[];
-extern const u32 gInterfaceGfx_BeastBall[];
-extern const u32 gInterfacePal_BeastBall[];
-extern const u32 gInterfaceGfx_CherishBall[];
-extern const u32 gInterfacePal_CherishBall[];
+// pokeballs
+extern const u32 gBallGfx_Poke[];
+extern const u32 gBallPal_Poke[];
+extern const u32 gBallGfx_Great[];
+extern const u32 gBallPal_Great[];
+extern const u32 gBallGfx_Ultra[];
+extern const u32 gBallPal_Ultra[];
+extern const u32 gBallGfx_Master[];
+extern const u32 gBallPal_Master[];
+extern const u32 gBallGfx_Premier[];
+extern const u32 gBallPal_Premier[];
+extern const u32 gBallGfx_Heal[];
+extern const u32 gBallPal_Heal[];
+extern const u32 gBallGfx_Net[];
+extern const u32 gBallPal_Net[];
+extern const u32 gBallGfx_Nest[];
+extern const u32 gBallPal_Nest[];
+extern const u32 gBallGfx_Dive[];
+extern const u32 gBallPal_Dive[];
+extern const u32 gBallGfx_Dusk[];
+extern const u32 gBallPal_Dusk[];
+extern const u32 gBallGfx_Timer[];
+extern const u32 gBallPal_Timer[];
+extern const u32 gBallGfx_Quick[];
+extern const u32 gBallPal_Quick[];
+extern const u32 gBallGfx_Repeat[];
+extern const u32 gBallPal_Repeat[];
+extern const u32 gBallGfx_Luxury[];
+extern const u32 gBallPal_Luxury[];
+extern const u32 gBallGfx_Level[];
+extern const u32 gBallPal_Level[];
+extern const u32 gBallGfx_Lure[];
+extern const u32 gBallPal_Lure[];
+extern const u32 gBallGfx_Moon[];
+extern const u32 gBallPal_Moon[];
+extern const u32 gBallGfx_Friend[];
+extern const u32 gBallPal_Friend[];
+extern const u32 gBallGfx_Love[];
+extern const u32 gBallPal_Love[];
+extern const u32 gBallGfx_Fast[];
+extern const u32 gBallPal_Fast[];
+extern const u32 gBallGfx_Heavy[];
+extern const u32 gBallPal_Heavy[];
+extern const u32 gBallGfx_Dream[];
+extern const u32 gBallPal_Dream[];
+extern const u32 gBallGfx_Safari[];
+extern const u32 gBallPal_Safari[];
+extern const u32 gBallGfx_Sport[];
+extern const u32 gBallPal_Sport[];
+extern const u32 gBallGfx_Park[];
+extern const u32 gBallPal_Park[];
+extern const u32 gBallGfx_Beast[];
+extern const u32 gBallPal_Beast[];
+extern const u32 gBallGfx_Cherish[];
+extern const u32 gBallPal_Cherish[];
extern const u32 gOpenPokeballGfx[];
// pokemon gfx
@@ -8614,16 +8614,16 @@ extern const u32 gPokenavRibbonsSummaryBg_Tilemap[];
extern const u32 gSummaryScreen_Gfx[];
extern const u32 gSummaryScreen_Pal[];
extern const u32 gSummaryPage_Info_Tilemap[];
-extern const u32 gSummaryPage_InfoCopy_Tilemap[];
+extern const u32 gSummaryPage_InfoEgg_Tilemap[];
extern const u32 gSummaryPage_Skills_Tilemap[];
extern const u32 gSummaryPage_BattleMoves_Tilemap[];
extern const u32 gSummaryPage_ContestMoves_Tilemap[];
extern const u16 gPPTextPalette[];
-extern const u16 gSummaryScreenWindow_Tilemap[];
extern const u32 gMoveTypes_Pal[];
-extern const u16 gSummaryScreenPowAcc_Tilemap[];
-extern const u16 gSummaryScreenAppealJam_Tilemap[];
+extern const u16 gSummaryScreen_MoveEffect_Battle_Tilemap[];
+extern const u16 gSummaryScreen_MoveEffect_Contest_Tilemap[];
+extern const u16 gSummaryScreen_MoveEffect_Cancel_Tilemap[];
extern const u32 gMoveTypes_Gfx[];
extern const u32 gSummaryMoveSelect_Gfx[];
@@ -8631,10 +8631,10 @@ extern const u32 gSummaryMoveSelect_Pal[];
extern const u32 gStatusGfx_Icons[];
extern const u32 gStatusPal_Icons[];
-extern const u32 gBuyMenuFrame_Gfx[];
-extern const u32 gBuyMenuFrame_Tilemap[];
-extern const u32 gMenuMoneyGfx[];
-extern const u32 gMenuMoneyPal[];
+extern const u32 gShopMenu_Gfx[];
+extern const u32 gShopMenu_Tilemap[];
+extern const u32 gShopMenu_Pal[];
+extern const u32 gShopMenuMoney_Gfx[];
extern const u32 gBattleInterface_BallStatusBarGfx[];
extern const u8 gBattleInterface_BallDisplayGfx[];
@@ -8673,8 +8673,8 @@ extern const u32 gBlankGfxCompressed[];
extern const u16 gBattleInterface_BallStatusBarPal[];
extern const u16 gBattleInterface_BallDisplayPal[];
-extern const u32 gBagSwapLineGfx[];
-extern const u32 gBagSwapLinePal[];
+extern const u32 gSwapLineGfx[];
+extern const u32 gSwapLinePal[];
extern const u32 gBattlePyramidBag_Gfx[];
extern const u32 gBattlePyramidBag_Pal[];
@@ -8700,11 +8700,11 @@ extern const u32 gDomeTourneyInfoCardBg_Tilemap[];
extern const u32 gDomeTourneyTree_Pal[];
extern const u32 gDomeTourneyTreeButtons_Pal[];
extern const u32 gDomeTourneyMatchCardBg_Pal[];
-extern const u32 gDomeTourneyBg_Gfx[];
+extern const u32 gDomeTourneyTree_Gfx[];
extern const u32 gDomeTourneyLine_Gfx[];
extern const u32 gDomeTourneyLineDown_Tilemap[];
extern const u32 gDomeTourneyLineUp_Tilemap[];
-extern const u32 gDomeTourneyLineMask_Tilemap[];
+extern const u32 gDomeTourneyTree_Tilemap[];
extern const u32 gDomeTourneyTreeButtons_Gfx[];
extern const u16 gTilesetAnims_BattleDomePals0_0[];
extern const u16 gTilesetAnims_BattleDomePals0_1[];
@@ -8859,6 +8859,7 @@ extern const u32 gBattleAnimSpriteGfx_Smoke[];
extern const u32 gBattleAnimSpriteGfx_Smoke2[];
extern const u32 gBattleAnimSpriteGfx_Impact[];
extern const u32 gBattleAnimSpriteGfx_Particles[];
+extern const u32 gBattleAnimSpriteGfx_Particles2[];
extern const u32 gBattleAnimSpriteGfx_CircleImpact[];
extern const u32 gBattleAnimSpriteGfx_Scratch[];
extern const u32 gBattleAnimSpriteGfx_Cut[];
@@ -9156,6 +9157,7 @@ extern const u32 gBattleAnimSpritePal_Tongue[];
extern const u32 gBattleAnimSpritePal_Smoke[];
extern const u32 gBattleAnimSpritePal_Smoke[];
extern const u32 gBattleAnimSpritePal_Impact[];
+extern const u32 gBattleAnimSpritePal_Particles2[];
extern const u32 gBattleAnimSpritePal_CircleImpact[];
extern const u32 gBattleAnimSpritePal_Impact[];
extern const u32 gBattleAnimSpritePal_Impact[];
@@ -9918,7 +9920,7 @@ extern const u16 gUsePokeblockCondition_Pal[];
// Berry Crush
extern const u32 gBerryCrush_Crusher_Gfx[];
extern const u16 gBerryCrush_Crusher_Pal[];
-extern const u32 gBerryCrush_Crusher_Tilemap[];
+extern const u32 gBerryCrush_TextWindows_Tilemap[];
// Pokenav
extern const u32 gPokenavMessageBox_Gfx[];
diff --git a/include/item.h b/include/item.h
index ebce8a20bb..0aaa678a16 100644
--- a/include/item.h
+++ b/include/item.h
@@ -15,13 +15,14 @@ struct Item
u8 holdEffectParam;
const u8 *description;
u8 importance;
- u8 unk19;
+ bool8 registrability; // unused
u8 pocket;
u8 type;
ItemUseFunc fieldUseFunc;
u8 battleUsage;
ItemUseFunc battleUseFunc;
u8 secondaryId;
+ u8 flingPower;
};
struct BagPocket
@@ -69,13 +70,13 @@ u8 ItemId_GetHoldEffect(u16 itemId);
u8 ItemId_GetHoldEffectParam(u16 itemId);
const u8 *ItemId_GetDescription(u16 itemId);
u8 ItemId_GetImportance(u16 itemId);
-u8 ItemId_GetUnknownValue(u16 itemId);
+u8 ItemId_GetRegistrability(u16 itemId);
u8 ItemId_GetPocket(u16 itemId);
u8 ItemId_GetType(u16 itemId);
ItemUseFunc ItemId_GetFieldFunc(u16 itemId);
u8 ItemId_GetBattleUsage(u16 itemId);
ItemUseFunc ItemId_GetBattleFunc(u16 itemId);
u8 ItemId_GetSecondaryId(u16 itemId);
-bool32 IsPinchBerryItemEffect(u16 holdEffect);
+u8 ItemId_GetFlingPower(u16 itemId);
#endif // GUARD_ITEM_H
diff --git a/include/item_use.h b/include/item_use.h
index ca3195157e..963d226e19 100644
--- a/include/item_use.h
+++ b/include/item_use.h
@@ -36,6 +36,14 @@ void ItemUseInBattle_EnigmaBerry(u8);
void Task_UseDigEscapeRopeOnField(u8 taskId);
u8 CanUseDigOrEscapeRopeOnCurMap(void);
u8 CheckIfItemIsTMHMOrEvolutionStone(u16 itemId);
-u32 CanThrowBall(void);
+
+enum {
+ BALL_THROW_UNABLE_TWO_MONS,
+ BALL_THROW_UNABLE_NO_ROOM,
+ BALL_THROW_UNABLE_SEMI_INVULNERABLE,
+ BALL_THROW_ABLE,
+};
+
+bool32 CanThrowBall(void);
#endif // GUARD_ITEM_USE_H
diff --git a/include/menu.h b/include/menu.h
index 69000d4089..bf3f56aeab 100644
--- a/include/menu.h
+++ b/include/menu.h
@@ -4,7 +4,6 @@
#include "task.h"
#include "text.h"
#include "window.h"
-#include "constants/pokemon.h"
#define MENU_NOTHING_CHOSEN -2
#define MENU_B_PRESSED -1
diff --git a/include/metatile_behavior.h b/include/metatile_behavior.h
index 5895426cf0..c2d0d23ee3 100644
--- a/include/metatile_behavior.h
+++ b/include/metatile_behavior.h
@@ -57,7 +57,7 @@ bool8 MetatileBehavior_IsSecretBaseTree(u8);
bool8 MetatileBehavior_IsSecretBaseShrub(u8);
bool8 MetatileBehavior_IsSecretBasePC(u8);
bool8 MetatileBehavior_IsRecordMixingSecretBasePC(u8);
-bool8 MetatileBehavior_IsBlockDecoration(u8);
+bool8 MetatileBehavior_IsSecretBaseTrainerSpot(u8);
bool8 MetatileBehavior_IsSecretBaseImpassable(u8);
bool8 MetatileBehavior_IsSecretBaseDecorationBase(u8);
bool8 MetatileBehavior_IsSecretBasePoster(u8);
diff --git a/include/overworld.h b/include/overworld.h
index 04b61f7fd7..b8794ea70f 100644
--- a/include/overworld.h
+++ b/include/overworld.h
@@ -40,20 +40,18 @@ struct LinkPlayerObjectEvent
u8 movementMode;
};
-// Exported RAM declarations
extern struct WarpData gLastUsedWarp;
extern struct LinkPlayerObjectEvent gLinkPlayerObjectEvents[4];
-extern u16 *gBGTilemapBuffers1;
-extern u16 *gBGTilemapBuffers2;
-extern u16 *gBGTilemapBuffers3;
+extern u16 *gOverworldTilemapBuffer_Bg2;
+extern u16 *gOverworldTilemapBuffer_Bg1;
+extern u16 *gOverworldTilemapBuffer_Bg3;
extern u16 gHeldKeyCodeToSend;
extern void (*gFieldCallback)(void);
extern bool8 (*gFieldCallback2)(void);
extern u8 gLocalLinkPlayerId;
extern u8 gFieldLinkPlayerCount;
-// Exported ROM declarations
extern const struct UCoords32 gDirectionToVectors[];
void DoWhiteOut(void);
diff --git a/include/pokeblock.h b/include/pokeblock.h
index 9e01614951..24e6ea8569 100644
--- a/include/pokeblock.h
+++ b/include/pokeblock.h
@@ -1,9 +1,6 @@
#ifndef GUARD_POKEBLOCK_H
#define GUARD_POKEBLOCK_H
-#include "constants/berry.h"
-#include "constants/pokemon.h"
-
#define TAG_POKEBLOCK 14818
enum
diff --git a/include/pokemon.h b/include/pokemon.h
index 4a3d7e7f7e..bae8b8bf37 100644
--- a/include/pokemon.h
+++ b/include/pokemon.h
@@ -1,7 +1,6 @@
#ifndef GUARD_POKEMON_H
#define GUARD_POKEMON_H
-#include "constants/pokemon.h"
#include "sprite.h"
#include "constants/region_map_sections.h"
#include "constants/pokemon_config.h"
@@ -249,10 +248,13 @@ struct BattleMove
u8 argument;
};
+#define SPINDA_SPOT_WIDTH 16
+#define SPINDA_SPOT_HEIGHT 16
+
struct SpindaSpot
{
u8 x, y;
- u16 image[16];
+ u16 image[SPINDA_SPOT_HEIGHT];
};
struct LevelUpMove
diff --git a/include/save.h b/include/save.h
index be7961136e..89fc9ad33e 100644
--- a/include/save.h
+++ b/include/save.h
@@ -52,8 +52,7 @@ enum
{
SAVE_NORMAL,
SAVE_LINK, // Link / Battle Frontier
- //EREADER_SAVE, // deprecated in Emerald
- SAVE_LINK2, // unknown 2nd link save
+ SAVE_EREADER, // deprecated in Emerald
SAVE_HALL_OF_FAME,
SAVE_OVERWRITE_DIFFERENT_FILE,
SAVE_HALL_OF_FAME_ERASE_BEFORE // unused
diff --git a/include/wild_encounter.h b/include/wild_encounter.h
index 2ef2e0c0fb..e853efbadc 100644
--- a/include/wild_encounter.h
+++ b/include/wild_encounter.h
@@ -1,10 +1,7 @@
#ifndef GUARD_WILD_ENCOUNTER_H
#define GUARD_WILD_ENCOUNTER_H
-#define LAND_WILD_COUNT 12
-#define WATER_WILD_COUNT 5
-#define ROCK_WILD_COUNT 5
-#define FISH_WILD_COUNT 10
+#include "constants/wild_encounter.h"
struct WildPokemon
{
diff --git a/ld_script.txt b/ld_script.txt
index dd939e95c5..849ef6ed86 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -1250,10 +1250,10 @@ SECTIONS {
src/libisagbprn.o(.rodata);
} =0
- other_data :
+ multiboot_data :
ALIGN(4)
{
- data/ereader_link_data.o(.rodata);
+ data/multiboot_ereader.o(.rodata);
data/multiboot_berry_glitch_fix.o(.rodata);
data/multiboot_pokemon_colosseum.o(.rodata);
} =0
diff --git a/ld_script_modern.txt b/ld_script_modern.txt
index ba0219674d..b60a22171a 100644
--- a/ld_script_modern.txt
+++ b/ld_script_modern.txt
@@ -27,6 +27,7 @@ SECTIONS {
/* .bss starts at 0x3000000 */
src/*.o(.bss);
gflib/*.o(.bss);
+ data/*.o(.bss);
*libc.a:*.o(.bss*);
*libnosys.a:*.o(.bss*);
@@ -111,10 +112,10 @@ SECTIONS {
src/libisagbprn.o(.rodata);
} =0
- other_data :
+ multiboot_data :
ALIGN(4)
{
- data/ereader_link_data.o(.rodata);
+ data/multiboot_ereader.o(.rodata);
data/multiboot_berry_glitch_fix.o(.rodata);
data/multiboot_pokemon_colosseum.o(.rodata);
} =0
diff --git a/sound/MPlayDef.s b/sound/MPlayDef.s
index f5dd6484d9..95a788e85e 100644
--- a/sound/MPlayDef.s
+++ b/sound/MPlayDef.s
@@ -333,7 +333,7 @@
.equ v066, 66 @
.equ v067, 67 @
.equ v068, 68 @
- .equ v069, 79 @
+ .equ v069, 69 @
.equ v070, 70 @
.equ v071, 71 @
.equ v072, 72 @
diff --git a/sound/music_player_table.inc b/sound/music_player_table.inc
index 6c74a13528..5981a4d037 100644
--- a/sound/music_player_table.inc
+++ b/sound/music_player_table.inc
@@ -1,6 +1,32 @@
+ .equiv TRACK_SIZE, 0x50
+ .equiv NUM_TRACKS_BGM, 10
+ .equiv NUM_TRACKS_SE1, 3
+ .equiv NUM_TRACKS_SE2, 9
+ .equiv NUM_TRACKS_SE3, 1
+
+ .bss
+
+gMPlayTrack_BGM::
+ .space TRACK_SIZE * NUM_TRACKS_BGM
+ .size gMPlayTrack_BGM, .-gMPlayTrack_BGM
+
+gMPlayTrack_SE1::
+ .space TRACK_SIZE * NUM_TRACKS_SE1
+ .size gMPlayTrack_SE1, .-gMPlayTrack_SE1
+
+gMPlayTrack_SE2::
+ .space TRACK_SIZE * NUM_TRACKS_SE2
+ .size gMPlayTrack_SE2, .-gMPlayTrack_SE2
+
+gMPlayTrack_SE3::
+ .space TRACK_SIZE * NUM_TRACKS_SE3
+ .size gMPlayTrack_SE3, .-gMPlayTrack_SE3
+
+ .section .rodata
+
.align 2
gMPlayTable::
- music_player gMPlayInfo_BGM, gMPlayTrack_BGM, 10, 0
- music_player gMPlayInfo_SE1, gMPlayTrack_SE1, 3, 1
- music_player gMPlayInfo_SE2, gMPlayTrack_SE2, 9, 1
- music_player gMPlayInfo_SE3, gMPlayTrack_SE3, 1, 0
+ music_player gMPlayInfo_BGM, gMPlayTrack_BGM, NUM_TRACKS_BGM, 0
+ music_player gMPlayInfo_SE1, gMPlayTrack_SE1, NUM_TRACKS_SE1, 1
+ music_player gMPlayInfo_SE2, gMPlayTrack_SE2, NUM_TRACKS_SE2, 1
+ music_player gMPlayInfo_SE3, gMPlayTrack_SE3, NUM_TRACKS_SE3, 0
diff --git a/src/apprentice.c b/src/apprentice.c
index 447f4f5fdb..cf14585aae 100644
--- a/src/apprentice.c
+++ b/src/apprentice.c
@@ -23,9 +23,7 @@
#include "task.h"
#include "text.h"
#include "constants/battle_frontier.h"
-#include "constants/easy_chat.h"
#include "constants/items.h"
-#include "constants/pokemon.h"
#include "constants/songs.h"
#include "constants/trainers.h"
#include "constants/moves.h"
diff --git a/src/bard_music.c b/src/bard_music.c
index 114f1cf42f..bdc5ac808a 100644
--- a/src/bard_music.c
+++ b/src/bard_music.c
@@ -1,6 +1,5 @@
#include "global.h"
#include "bard_music.h"
-#include "constants/easy_chat.h"
#include "easy_chat.h"
#include "data/bard_music/bard_sounds.h"
diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c
index e6159f7251..f28cb4fe84 100644
--- a/src/battle_ai_main.c
+++ b/src/battle_ai_main.c
@@ -7,6 +7,7 @@
#include "battle_factory.h"
#include "battle_setup.h"
#include "data.h"
+#include "event_data.h"
#include "item.h"
#include "pokemon.h"
#include "random.h"
@@ -40,6 +41,7 @@ enum
static u8 ChooseMoveOrAction_Singles(void);
static u8 ChooseMoveOrAction_Doubles(void);
static void BattleAI_DoAIProcessing(void);
+static bool32 IsPinchBerryItemEffect(u16 holdEffect);
// ewram
EWRAM_DATA const u8 *gAIScriptPtr = NULL; // Still used in contests
@@ -123,6 +125,28 @@ void BattleAI_SetupItems(void)
}
}
+static u32 GetWildAiFlags(void)
+{
+ u8 avgLevel = GetMonData(&gEnemyParty[0], MON_DATA_LEVEL);
+ u32 flags;
+
+ if (IsDoubleBattle())
+ avgLevel = (GetMonData(&gEnemyParty[0], MON_DATA_LEVEL) + GetMonData(&gEnemyParty[1], MON_DATA_LEVEL)) / 2;
+
+ flags |= AI_FLAG_CHECK_BAD_MOVE;
+ if (avgLevel >= 20)
+ flags |= AI_FLAG_CHECK_VIABILITY;
+ if (avgLevel >= 60)
+ flags |= AI_FLAG_PREFER_STRONGEST_MOVE;
+ if (avgLevel >= 80)
+ flags |= AI_FLAG_HP_AWARE;
+
+ if (B_VAR_WILD_AI_FLAGS != 0 && VarGet(B_VAR_WILD_AI_FLAGS) != 0)
+ flags |= VarGet(B_VAR_WILD_AI_FLAGS);
+
+ return flags;
+}
+
void BattleAI_SetupFlags(void)
{
if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
@@ -141,6 +165,10 @@ void BattleAI_SetupFlags(void)
AI_THINKING_STRUCT->aiFlags = gTrainers[gTrainerBattleOpponent_A].aiFlags | gTrainers[gTrainerBattleOpponent_B].aiFlags;
else
AI_THINKING_STRUCT->aiFlags = gTrainers[gTrainerBattleOpponent_A].aiFlags;
+
+ // check smart wild AI
+ if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER)) && IsWildMonSmart())
+ AI_THINKING_STRUCT->aiFlags |= GetWildAiFlags();
if (gBattleTypeFlags & (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_TWO_OPPONENTS) || gTrainers[gTrainerBattleOpponent_A].doubleBattle)
AI_THINKING_STRUCT->aiFlags |= AI_FLAG_DOUBLE_BATTLE; // Act smart in doubles and don't attack your partner.
@@ -1576,11 +1604,13 @@ static s16 AI_CheckBadMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 score)
break;
case EFFECT_MUD_SPORT:
if (gFieldStatuses & STATUS_FIELD_MUDSPORT
+ || gStatuses4[battlerAtk] & STATUS4_MUD_SPORT
|| PartnerHasSameMoveEffectWithoutTarget(AI_DATA->battlerAtkPartner, move, AI_DATA->partnerMove))
score -= 10;
break;
case EFFECT_WATER_SPORT:
if (gFieldStatuses & STATUS_FIELD_WATERSPORT
+ || gStatuses4[battlerAtk] & STATUS4_WATER_SPORT
|| PartnerHasSameMoveEffectWithoutTarget(AI_DATA->battlerAtkPartner, move, AI_DATA->partnerMove))
score -= 10;
break;
@@ -2899,6 +2929,29 @@ static s16 AI_DoubleBattle(u8 battlerAtk, u8 battlerDef, u16 move, s16 score)
return score;
}
+static bool32 IsPinchBerryItemEffect(u16 holdEffect)
+{
+ switch (holdEffect)
+ {
+ case HOLD_EFFECT_ATTACK_UP:
+ case HOLD_EFFECT_DEFENSE_UP:
+ case HOLD_EFFECT_SPEED_UP:
+ case HOLD_EFFECT_SP_ATTACK_UP:
+ case HOLD_EFFECT_SP_DEFENSE_UP:
+ case HOLD_EFFECT_CRITICAL_UP:
+ case HOLD_EFFECT_RANDOM_STAT_UP:
+ #ifdef HOLD_EFFECT_CUSTAP_BERRY
+ case HOLD_EFFECT_CUSTAP_BERRY:
+ #endif
+ #ifdef HOLD_EFFECT_MICLE_BERRY
+ case HOLD_EFFECT_MICLE_BERRY:
+ #endif
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
// AI_FLAG_CHECK_VIABILITY - a weird mix of increasing and decreasing scores
static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score)
{
diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c
index 378f5bf94f..845bc7fd69 100644
--- a/src/battle_ai_switch_items.c
+++ b/src/battle_ai_switch_items.c
@@ -795,7 +795,9 @@ static bool8 ShouldUseItem(void)
u8 validMons = 0;
bool8 shouldUse = FALSE;
- if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT)
+ // If teaming up with player and Pokemon is on the right, or Pokemon is currently held by Sky Drop
+ if ((gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT)
+ || gStatuses3[gActiveBattler] & STATUS3_SKY_DROPPED)
return FALSE;
if (gStatuses3[gActiveBattler] & STATUS3_EMBARGO)
diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c
index 63f5385fd2..fe37f31ec4 100644
--- a/src/battle_ai_util.c
+++ b/src/battle_ai_util.c
@@ -157,7 +157,6 @@ static const s8 sAiAbilityRatings[ABILITIES_COUNT] =
[ABILITY_POISON_HEAL] = 8,
[ABILITY_POISON_POINT] = 4,
[ABILITY_POISON_TOUCH] = 4,
- //[ABILITY_PORTAL_POWER] = 8,
[ABILITY_POWER_CONSTRUCT] = 10,
[ABILITY_POWER_OF_ALCHEMY] = 0,
[ABILITY_PRANKSTER] = 8,
@@ -1023,9 +1022,9 @@ u8 AI_WhoStrikesFirst(u8 battlerAI, u8 battler2)
{
// Priorities are the same(at least comparing to moves the AI is aware of), decide by speed.
if (GetWhoStrikesFirst(battlerAI, battler2, TRUE) == 0)
- return TRUE;
+ return AI_IS_FASTER;
else
- return FALSE;
+ return AI_IS_SLOWER;
}
}
@@ -1506,7 +1505,6 @@ bool32 ShouldSetSandstorm(u8 battler, u16 ability, u16 holdEffect)
if (ability == ABILITY_SAND_VEIL
|| ability == ABILITY_SAND_RUSH
|| ability == ABILITY_SAND_FORCE
- || ability == ABILITY_SAND_FORCE
|| ability == ABILITY_OVERCOAT
|| ability == ABILITY_MAGIC_GUARD
|| holdEffect == HOLD_EFFECT_SAFETY_GOGGLES
diff --git a/src/battle_anim_mon_movement.c b/src/battle_anim_mon_movement.c
index d15cf63425..c5c35ef6fa 100644
--- a/src/battle_anim_mon_movement.c
+++ b/src/battle_anim_mon_movement.c
@@ -992,7 +992,7 @@ static void AnimTask_RotateMonSpriteToSide_Step(u8 taskId)
}
}
-void AnimTask_ShakeTargetBasedOnMovePowerOrDmg(u8 taskId)
+void SetupShakeBattlerBasedOnMovePowerOrDmg(u8 taskId, u8 animBattlerId)
{
if (!gBattleAnimArgs[0])
{
@@ -1023,12 +1023,23 @@ void AnimTask_ShakeTargetBasedOnMovePowerOrDmg(u8 taskId)
gTasks[taskId].data[12] = 0;
gTasks[taskId].data[10] = gBattleAnimArgs[3];
gTasks[taskId].data[11] = gBattleAnimArgs[4];
- gTasks[taskId].data[7] = GetAnimBattlerSpriteId(ANIM_TARGET);
+ gTasks[taskId].data[7] = GetAnimBattlerSpriteId(animBattlerId);
gTasks[taskId].data[8] = gSprites[gTasks[taskId].data[7]].x2;
gTasks[taskId].data[9] = gSprites[gTasks[taskId].data[7]].y2;
gTasks[taskId].data[0] = 0;
gTasks[taskId].data[1] = gBattleAnimArgs[1];
gTasks[taskId].data[2] = gBattleAnimArgs[2];
+}
+
+void AnimTask_ShakeTargetPartnerBasedOnMovePowerOrDmg(u8 taskId)
+{
+ SetupShakeBattlerBasedOnMovePowerOrDmg(taskId, ANIM_DEF_PARTNER);
+ gTasks[taskId].func = AnimTask_ShakeTargetBasedOnMovePowerOrDmg_Step;
+}
+
+void AnimTask_ShakeTargetBasedOnMovePowerOrDmg(u8 taskId)
+{
+ SetupShakeBattlerBasedOnMovePowerOrDmg(taskId, ANIM_TARGET);
gTasks[taskId].func = AnimTask_ShakeTargetBasedOnMovePowerOrDmg_Step;
}
diff --git a/src/battle_anim_new.c b/src/battle_anim_new.c
index 450ab35245..1392fc626d 100644
--- a/src/battle_anim_new.c
+++ b/src/battle_anim_new.c
@@ -33,7 +33,6 @@ static void SpriteCB_MoongeistCharge(struct Sprite *sprite);
static void SpriteCB_MindBlownBall(struct Sprite *sprite);
static void AnimMindBlownBallStep(struct Sprite *sprite);
static void SpriteCB_MindBlownExplosion(struct Sprite* sprite);
-static void SpriteCB_RandomCentredHits(struct Sprite* sprite);
static void SpriteCB_LockingJaw(struct Sprite *sprite);
static void SpriteCB_LockingJawStep(struct Sprite *sprite);
static void SpriteCB_LockingJawFinish(struct Sprite *sprite);
@@ -4585,7 +4584,7 @@ static void SpriteCB_MindBlownExplosion(struct Sprite* sprite)
}
}
-static void SpriteCB_RandomCentredHits(struct Sprite* sprite)
+void SpriteCB_RandomCentredHits(struct Sprite* sprite)
{
if (gBattleAnimArgs[1] == -1)
gBattleAnimArgs[1] = Random() & 3;
diff --git a/src/battle_anim_normal.c b/src/battle_anim_normal.c
index 8bbfc58456..524abccb1f 100644
--- a/src/battle_anim_normal.c
+++ b/src/battle_anim_normal.c
@@ -258,7 +258,7 @@ const struct SpriteTemplate gRandomPosHitSplatSpriteTemplate =
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gAffineAnims_HitSplat,
- .callback = AnimHitSplatRandom,
+ .callback = SpriteCB_RandomCentredHits,
};
const struct SpriteTemplate gMonEdgeHitSplatSpriteTemplate =
diff --git a/src/battle_anim_smokescreen.c b/src/battle_anim_smokescreen.c
index 9844f50077..0819796d27 100644
--- a/src/battle_anim_smokescreen.c
+++ b/src/battle_anim_smokescreen.c
@@ -5,7 +5,6 @@
#include "graphics.h"
#include "sprite.h"
#include "util.h"
-#include "constants/pokemon.h"
#include "constants/battle_palace.h"
static void SmokescreenImpact_Callback(struct Sprite *);
diff --git a/src/battle_anim_throw.c b/src/battle_anim_throw.c
index 607bd8b6d3..572ffae65d 100755
--- a/src/battle_anim_throw.c
+++ b/src/battle_anim_throw.c
@@ -156,9 +156,6 @@ static const struct CaptureStar sCaptureStars[] =
#define TAG_PARTICLES_BEASTBALL 65065
#define TAG_PARTICLES_CHERISHBALL 65056
-static const u32 sNewParticlesGfx[] = INCBIN_U32("graphics/interface/ball/particles2.4bpp.lz");
-static const u32 sNewParticlesPal[] = INCBIN_U32("graphics/interface/ball/particles2.gbapal.lz");
-
static const struct CompressedSpriteSheet sBallParticleSpriteSheets[] =
{
[BALL_POKE] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_POKEBALL},
@@ -166,28 +163,28 @@ static const struct CompressedSpriteSheet sBallParticleSpriteSheets[] =
[BALL_ULTRA] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_ULTRABALL},
[BALL_MASTER] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_MASTERBALL},
[BALL_PREMIER] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_PREMIERBALL},
- [BALL_HEAL] = {sNewParticlesGfx, 0x100, TAG_PARTICLES_HEALBALL},
+ [BALL_HEAL] = {gBattleAnimSpriteGfx_Particles2, 0x100, TAG_PARTICLES_HEALBALL},
[BALL_NET] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_NETBALL},
[BALL_NEST] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_NESTBALL},
[BALL_DIVE] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_DIVEBALL},
- [BALL_DUSK] = {sNewParticlesGfx, 0x100, TAG_PARTICLES_DUSKBALL},
+ [BALL_DUSK] = {gBattleAnimSpriteGfx_Particles2, 0x100, TAG_PARTICLES_DUSKBALL},
[BALL_TIMER] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_TIMERBALL},
- [BALL_QUICK] = {sNewParticlesGfx, 0x100, TAG_PARTICLES_QUICKBALL},
+ [BALL_QUICK] = {gBattleAnimSpriteGfx_Particles2, 0x100, TAG_PARTICLES_QUICKBALL},
[BALL_REPEAT] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_REPEATBALL},
[BALL_LUXURY] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_LUXURYBALL},
- [BALL_LEVEL] = {sNewParticlesGfx, 0x100, TAG_PARTICLES_LEVELBALL},
+ [BALL_LEVEL] = {gBattleAnimSpriteGfx_Particles2, 0x100, TAG_PARTICLES_LEVELBALL},
[BALL_LURE] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_LUREBALL},
- [BALL_MOON] = {sNewParticlesGfx, 0x100, TAG_PARTICLES_MOONBALL},
+ [BALL_MOON] = {gBattleAnimSpriteGfx_Particles2, 0x100, TAG_PARTICLES_MOONBALL},
[BALL_FRIEND] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_FRIENDBALL},
[BALL_LOVE] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_LOVEBALL},
- [BALL_FAST] = {sNewParticlesGfx, 0x100, TAG_PARTICLES_FASTBALL},
- [BALL_HEAVY] = {sNewParticlesGfx, 0x100, TAG_PARTICLES_HEAVYBALL},
+ [BALL_FAST] = {gBattleAnimSpriteGfx_Particles2, 0x100, TAG_PARTICLES_FASTBALL},
+ [BALL_HEAVY] = {gBattleAnimSpriteGfx_Particles2, 0x100, TAG_PARTICLES_HEAVYBALL},
[BALL_DREAM] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_DREAMBALL},
[BALL_SAFARI] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_SAFARIBALL},
[BALL_SPORT] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_SPORTBALL},
[BALL_PARK] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_PARKBALL},
[BALL_BEAST] = {gBattleAnimSpriteGfx_Particles, 0x100, TAG_PARTICLES_BEASTBALL},
- [BALL_CHERISH] = {sNewParticlesGfx, 0x100, TAG_PARTICLES_CHERISHBALL},
+ [BALL_CHERISH] = {gBattleAnimSpriteGfx_Particles2, 0x100, TAG_PARTICLES_CHERISHBALL},
};
static const struct CompressedSpritePalette sBallParticlePalettes[] =
@@ -197,28 +194,28 @@ static const struct CompressedSpritePalette sBallParticlePalettes[] =
[BALL_ULTRA] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_ULTRABALL},
[BALL_MASTER] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_MASTERBALL},
[BALL_PREMIER] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_PREMIERBALL},
- [BALL_HEAL] = {sNewParticlesPal, TAG_PARTICLES_HEALBALL},
+ [BALL_HEAL] = {gBattleAnimSpritePal_Particles2, TAG_PARTICLES_HEALBALL},
[BALL_NET] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_NETBALL},
[BALL_NEST] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_NESTBALL},
[BALL_DIVE] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_DIVEBALL},
- [BALL_DUSK] = {sNewParticlesPal, TAG_PARTICLES_DUSKBALL},
+ [BALL_DUSK] = {gBattleAnimSpritePal_Particles2, TAG_PARTICLES_DUSKBALL},
[BALL_TIMER] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_TIMERBALL},
- [BALL_QUICK] = {sNewParticlesPal, TAG_PARTICLES_QUICKBALL},
+ [BALL_QUICK] = {gBattleAnimSpritePal_Particles2, TAG_PARTICLES_QUICKBALL},
[BALL_REPEAT] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_REPEATBALL},
[BALL_LUXURY] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_LUXURYBALL},
- [BALL_LEVEL] = {sNewParticlesPal, TAG_PARTICLES_LEVELBALL},
+ [BALL_LEVEL] = {gBattleAnimSpritePal_Particles2, TAG_PARTICLES_LEVELBALL},
[BALL_LURE] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_LUREBALL},
- [BALL_MOON] = {sNewParticlesPal, TAG_PARTICLES_MOONBALL},
+ [BALL_MOON] = {gBattleAnimSpritePal_Particles2, TAG_PARTICLES_MOONBALL},
[BALL_FRIEND] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_FRIENDBALL},
[BALL_LOVE] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_LOVEBALL},
- [BALL_FAST] = {sNewParticlesPal, TAG_PARTICLES_FASTBALL},
- [BALL_HEAVY] = {sNewParticlesPal, TAG_PARTICLES_HEAVYBALL},
+ [BALL_FAST] = {gBattleAnimSpritePal_Particles2, TAG_PARTICLES_FASTBALL},
+ [BALL_HEAVY] = {gBattleAnimSpritePal_Particles2, TAG_PARTICLES_HEAVYBALL},
[BALL_DREAM] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_DREAMBALL},
[BALL_SAFARI] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_SAFARIBALL},
[BALL_SPORT] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_SPORTBALL},
[BALL_PARK] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_PARKBALL},
[BALL_BEAST] = {gBattleAnimSpritePal_CircleImpact, TAG_PARTICLES_BEASTBALL},
- [BALL_CHERISH] = {sNewParticlesPal, TAG_PARTICLES_CHERISHBALL},
+ [BALL_CHERISH] = {gBattleAnimSpritePal_Particles2, TAG_PARTICLES_CHERISHBALL},
};
static const union AnimCmd sAnim_RegularBall[] =
diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c
index 1107787960..08566ebd24 100644
--- a/src/battle_controller_opponent.c
+++ b/src/battle_controller_opponent.c
@@ -1563,7 +1563,8 @@ static void OpponentHandleChooseMove(void)
u8 chosenMoveId;
struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleResources->bufferA[gActiveBattler][4]);
- if (gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_SAFARI | BATTLE_TYPE_ROAMER))
+ if (gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_SAFARI | BATTLE_TYPE_ROAMER)
+ || IsWildMonSmart())
{
BattleAI_SetupAIData(0xF);
chosenMoveId = BattleAI_ChooseMoveOrAction();
@@ -1613,7 +1614,42 @@ static void OpponentHandleChooseMove(void)
if (gBattleMoves[move].target & (MOVE_TARGET_USER_OR_SELECTED | MOVE_TARGET_USER))
BtlController_EmitTwoReturnValues(BUFFER_B, 10, (chosenMoveId) | (gActiveBattler << 8));
else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
- BtlController_EmitTwoReturnValues(BUFFER_B, 10, (chosenMoveId) | (GetBattlerAtPosition(Random() & 2) << 8));
+ {
+ #if B_WILD_NATURAL_ENEMIES == TRUE
+ // Don't bother to loop through table if the move can't attack ally
+ if (!(gBattleMoves[move].target & MOVE_TARGET_BOTH))
+ {
+ u16 i, speciesAttacker, speciesTarget, isPartnerEnemy = FALSE;
+ static const u16 naturalEnemies[][2] =
+ {
+ // Attacker Target
+ {SPECIES_ZANGOOSE, SPECIES_SEVIPER},
+ {SPECIES_SEVIPER, SPECIES_ZANGOOSE},
+ {SPECIES_HEATMOR, SPECIES_DURANT},
+ {SPECIES_DURANT, SPECIES_HEATMOR},
+ {SPECIES_SABLEYE, SPECIES_CARBINK},
+ {SPECIES_MAREANIE, SPECIES_CORSOLA},
+ };
+ speciesAttacker = gBattleMons[gActiveBattler].species;
+ speciesTarget = gBattleMons[GetBattlerAtPosition(BATTLE_PARTNER(gActiveBattler))].species;
+
+ for (i = 0; i < ARRAY_COUNT(naturalEnemies); i++)
+ {
+ if (speciesAttacker == naturalEnemies[i][0] && speciesTarget == naturalEnemies[i][1])
+ {
+ isPartnerEnemy = TRUE;
+ break;
+ }
+ }
+ if (isPartnerEnemy)
+ BtlController_EmitTwoReturnValues(BUFFER_B, 10, (chosenMoveId) | (GetBattlerAtPosition(BATTLE_PARTNER(gActiveBattler)) << 8));
+ else
+ BtlController_EmitTwoReturnValues(BUFFER_B, 10, (chosenMoveId) | (GetBattlerAtPosition(Random() & 2) << 8));
+ }
+ else
+ #endif
+ BtlController_EmitTwoReturnValues(BUFFER_B, 10, (chosenMoveId) | (GetBattlerAtPosition(Random() & 2) << 8));
+ }
else
BtlController_EmitTwoReturnValues(BUFFER_B, 10, (chosenMoveId) | (GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) << 8));
diff --git a/src/battle_debug.c b/src/battle_debug.c
index 075ef93072..2ea46321df 100644
--- a/src/battle_debug.c
+++ b/src/battle_debug.c
@@ -792,13 +792,13 @@ static void Task_ShowAiPoints(u8 taskId)
gBattleMons[data->aiBattlerId].otId,
gBattleMons[data->aiBattlerId].personality,
TRUE,
- 39, 130, 15, 0xFFFF);
+ 39, 130, 15, TAG_NONE);
#else
data->aiMonSpriteId = CreateMonPicSprite(gBattleMons[data->aiBattlerId].species,
gBattleMons[data->aiBattlerId].otId,
gBattleMons[data->aiBattlerId].personality,
TRUE,
- 39, 130, 15, 0xFFFF);
+ 39, 130, 15, TAG_NONE);
#endif
data->aiViewState++;
break;
@@ -915,13 +915,13 @@ static void Task_ShowAiKnowledge(u8 taskId)
gBattleMons[data->aiBattlerId].otId,
gBattleMons[data->aiBattlerId].personality,
TRUE,
- 39, 130, 15, 0xFFFF);
+ 39, 130, 15, TAG_NONE);
#else
data->aiMonSpriteId = CreateMonPicSprite(gBattleMons[data->aiBattlerId].species,
gBattleMons[data->aiBattlerId].otId,
gBattleMons[data->aiBattlerId].personality,
TRUE,
- 39, 130, 15, 0xFFFF);
+ 39, 130, 15, TAG_NONE);
#endif
data->aiViewState++;
break;
@@ -1996,7 +1996,7 @@ static const u8 sText_HoldEffectQuickPowder[] = _("Quick Powder");
static const u8 sText_HoldEffectAdamantOrb[] = _("Adamant Orb");
static const u8 sText_HoldEffectLustrousOrb[] = _("Lustrous Orb");
static const u8 sText_HoldEffectGriseousOrb[] = _("Griseous Orb");
-static const u8 sText_HoldEffectGracidea[] = _("Gracidea");
+static const u8 sText_HoldEffectEnigmaBerry[] = _("Enigma Berry");
static const u8 sText_HoldEffectResistBerry[] = _("Resist Berry");
static const u8 sText_HoldEffectPowerItem[] = _("Power Item");
static const u8 sText_HoldEffectRestorePctHp[] = _("Restore Pct Hp");
@@ -2025,11 +2025,13 @@ static const u8 sText_HoldEffectSafetyGoggles[] = _("Safety Goggles");
static const u8 sText_HoldEffectLuminousMoss[] = _("Luminous Moss");
static const u8 sText_HoldEffectSnowball[] = _("Snowball");
static const u8 sText_HoldEffectWeaknessPolicy[] = _("Weakness Policy");
+static const u8 sText_HoldEffectPrimalOrb[] = _("Primal Orb");
static const u8 sText_HoldEffectProtectivePads[] = _("Protective Pads");
static const u8 sText_HoldEffectTerrainExtender[] = _("Terrain Extender");
static const u8 sText_HoldEffectSeeds[] = _("Seeds");
static const u8 sText_HoldEffectAdrenalineOrb[] = _("Adrenaline Orb");
static const u8 sText_HoldEffectMemory[] = _("Memory");
+static const u8 sText_HoldEffectZCrystal[] = _("Z-Crystal");
static const u8 sText_HoldEffectPlate[] = _("Plate");
static const u8 sText_HoldEffectUtilityUmbrella[] = _("Utility Umbrella");
static const u8 sText_HoldEffectEjectPack[] = _("Eject Pack");
@@ -2067,7 +2069,7 @@ static const u8 *const sHoldEffectNames[] =
[HOLD_EFFECT_EXP_SHARE] = sText_HoldEffectExpShare,
[HOLD_EFFECT_QUICK_CLAW] = sText_HoldEffectQuickClaw,
[HOLD_EFFECT_FRIENDSHIP_UP] = sText_HoldEffectFriendshipUp,
- //[HOLD_EFFECT_MENTAL_HERB] = sText_HoldEffectMentalHerb,
+ [HOLD_EFFECT_MENTAL_HERB] = sText_HoldEffectMentalHerb,
[HOLD_EFFECT_CHOICE_BAND] = sText_HoldEffectChoiceBand,
[HOLD_EFFECT_FLINCH] = sText_HoldEffectFlinch,
[HOLD_EFFECT_BUG_POWER] = sText_HoldEffectBugPower,
@@ -2136,16 +2138,17 @@ static const u8 *const sHoldEffectNames[] =
[HOLD_EFFECT_ADAMANT_ORB] = sText_HoldEffectAdamantOrb,
[HOLD_EFFECT_LUSTROUS_ORB] = sText_HoldEffectLustrousOrb,
[HOLD_EFFECT_GRISEOUS_ORB] = sText_HoldEffectGriseousOrb,
- [HOLD_EFFECT_GRACIDEA] = sText_HoldEffectGracidea,
+ [HOLD_EFFECT_ENIGMA_BERRY] = sText_HoldEffectEnigmaBerry,
[HOLD_EFFECT_RESIST_BERRY] = sText_HoldEffectResistBerry,
[HOLD_EFFECT_POWER_ITEM] = sText_HoldEffectPowerItem,
[HOLD_EFFECT_RESTORE_PCT_HP] = sText_HoldEffectRestorePctHp,
- //[HOLD_EFFECT_MICLE_BERRY] = sText_HoldEffectMicleBerry,
- //[HOLD_EFFECT_CUSTAP_BERRY] = sText_HoldEffectCustapBerry,
- //[HOLD_EFFECT_JABOCA_BERRY] = sText_HoldEffectJabocaBerry,
- //[HOLD_EFFECT_ROWAP_BERRY] = sText_HoldEffectRowapBerry,
- //[HOLD_EFFECT_KEE_BERRY] = sText_HoldEffectKeeBerry,
- //[HOLD_EFFECT_MARANGA_BERRY] = sText_HoldEffectMarangaBerry,
+ [HOLD_EFFECT_MICLE_BERRY] = sText_HoldEffectMicleBerry,
+ [HOLD_EFFECT_CUSTAP_BERRY] = sText_HoldEffectCustapBerry,
+ [HOLD_EFFECT_JABOCA_BERRY] = sText_HoldEffectJabocaBerry,
+ [HOLD_EFFECT_ROWAP_BERRY] = sText_HoldEffectRowapBerry,
+ [HOLD_EFFECT_KEE_BERRY] = sText_HoldEffectKeeBerry,
+ [HOLD_EFFECT_MARANGA_BERRY] = sText_HoldEffectMarangaBerry,
+ [HOLD_EFFECT_PLATE] = sText_HoldEffectPlate,
[HOLD_EFFECT_FLOAT_STONE] = sText_HoldEffectFloatStone,
[HOLD_EFFECT_EVIOLITE] = sText_HoldEffectEviolite,
[HOLD_EFFECT_ASSAULT_VEST] = sText_HoldEffectAssaultVest,
@@ -2165,12 +2168,13 @@ static const u8 *const sHoldEffectNames[] =
[HOLD_EFFECT_LUMINOUS_MOSS] = sText_HoldEffectLuminousMoss,
[HOLD_EFFECT_SNOWBALL] = sText_HoldEffectSnowball,
[HOLD_EFFECT_WEAKNESS_POLICY] = sText_HoldEffectWeaknessPolicy,
+ [HOLD_EFFECT_PRIMAL_ORB] = sText_HoldEffectPrimalOrb,
[HOLD_EFFECT_PROTECTIVE_PADS] = sText_HoldEffectProtectivePads,
[HOLD_EFFECT_TERRAIN_EXTENDER] = sText_HoldEffectTerrainExtender,
[HOLD_EFFECT_SEEDS] = sText_HoldEffectSeeds,
[HOLD_EFFECT_ADRENALINE_ORB] = sText_HoldEffectAdrenalineOrb,
[HOLD_EFFECT_MEMORY] = sText_HoldEffectMemory,
- [HOLD_EFFECT_PLATE] = sText_HoldEffectPlate,
+ [HOLD_EFFECT_Z_CRYSTAL] = sText_HoldEffectZCrystal,
[HOLD_EFFECT_UTILITY_UMBRELLA] = sText_HoldEffectUtilityUmbrella,
[HOLD_EFFECT_EJECT_PACK] = sText_HoldEffectEjectPack,
[HOLD_EFFECT_ROOM_SERVICE] = sText_HoldEffectRoomService,
diff --git a/src/battle_dome.c b/src/battle_dome.c
index 6cfa8b1e10..8b4a8a0609 100644
--- a/src/battle_dome.c
+++ b/src/battle_dome.c
@@ -34,7 +34,6 @@
#include "constants/battle_dome.h"
#include "constants/frontier_util.h"
#include "constants/moves.h"
-#include "constants/pokemon.h"
#include "constants/trainers.h"
#include "constants/abilities.h"
#include "constants/songs.h"
@@ -5286,10 +5285,10 @@ static void Task_ShowTourneyTree(u8 taskId)
break;
case 2:
sTilemapBuffer = AllocZeroed(BG_SCREEN_SIZE);
- LZDecompressWram(gDomeTourneyLineMask_Tilemap, sTilemapBuffer);
+ LZDecompressWram(gDomeTourneyTree_Tilemap, sTilemapBuffer);
SetBgTilemapBuffer(1, sTilemapBuffer);
CopyBgTilemapBufferToVram(1);
- DecompressAndLoadBgGfxUsingHeap(1, gDomeTourneyBg_Gfx, 0x2000, 0, 0);
+ DecompressAndLoadBgGfxUsingHeap(1, gDomeTourneyTree_Gfx, 0x2000, 0, 0);
DecompressAndLoadBgGfxUsingHeap(2, gDomeTourneyLine_Gfx, 0x2000, 0, 0);
DecompressAndLoadBgGfxUsingHeap(2, gDomeTourneyLineDown_Tilemap, 0x2000, 0, 1);
DecompressAndLoadBgGfxUsingHeap(3, gDomeTourneyLineUp_Tilemap, 0x2000, 0, 1);
diff --git a/src/battle_factory_screen.c b/src/battle_factory_screen.c
index 693ebb153d..1cbeab822f 100644
--- a/src/battle_factory_screen.c
+++ b/src/battle_factory_screen.c
@@ -2509,7 +2509,7 @@ static void Swap_Task_HandleYesNo(u8 taskId)
}
}
-static void Swap_HandleQuitSwappingResposne(u8 taskId)
+static void Swap_HandleQuitSwappingResponse(u8 taskId)
{
if (gTasks[taskId].tSaidYes == TRUE)
{
@@ -2533,8 +2533,8 @@ static void Swap_AskQuitSwapping(u8 taskId)
Swap_PrintOnInfoWindow(gText_QuitSwapping);
sFactorySwapScreen->monSwapped = FALSE;
gTasks[taskId].tState = STATE_YESNO_SHOW;
- gTasks[taskId].tFollowUpTaskPtrHi = (u32)(Swap_HandleQuitSwappingResposne) >> 16;
- gTasks[taskId].tFollowUpTaskPtrLo = (u32)(Swap_HandleQuitSwappingResposne);
+ gTasks[taskId].tFollowUpTaskPtrHi = (u32)(Swap_HandleQuitSwappingResponse) >> 16;
+ gTasks[taskId].tFollowUpTaskPtrLo = (u32)(Swap_HandleQuitSwappingResponse);
gTasks[taskId].func = Swap_Task_HandleYesNo;
}
}
diff --git a/src/battle_interface.c b/src/battle_interface.c
index f1d2d1d590..6d98d794d3 100644
--- a/src/battle_interface.c
+++ b/src/battle_interface.c
@@ -2438,7 +2438,11 @@ s32 MoveBattleBar(u8 battlerId, u8 healthboxSpriteId, u8 whichBar, u8 unused)
gBattleSpritesDataPtr->battleBars[battlerId].oldValue,
gBattleSpritesDataPtr->battleBars[battlerId].receivedValue,
&gBattleSpritesDataPtr->battleBars[battlerId].currValue,
+ #if B_FAST_HP_DRAIN == TRUE
+ B_HEALTHBAR_PIXELS / 8, max(gBattleSpritesDataPtr->battleBars[battlerId].maxValue / B_HEALTHBAR_PIXELS, 1));
+ #else
B_HEALTHBAR_PIXELS / 8, 1);
+ #endif
}
else // exp bar
{
@@ -2853,15 +2857,15 @@ static const struct SpriteTemplate sSpriteTemplate_AbilityPopUp2 =
static const s16 sAbilityPopUpCoordsDoubles[MAX_BATTLERS_COUNT][2] =
{
{29, 80}, // player left
- {204, 19}, // opponent left
+ {186, 19}, // opponent left
{29, 97}, // player right
- {204, 36}, // opponent right
+ {186, 36}, // opponent right
};
static const s16 sAbilityPopUpCoordsSingles[MAX_BATTLERS_COUNT][2] =
{
- {29, 93}, // player
- {204, 23}, // opponent
+ {29, 97}, // player
+ {186, 57}, // opponent
};
static u8* AddTextPrinterAndCreateWindowOnAbilityPopUp(const u8 *str, u32 x, u32 y, u32 color1, u32 color2, u32 color3, u32 *windowId)
@@ -2872,7 +2876,7 @@ static u8* AddTextPrinterAndCreateWindowOnAbilityPopUp(const u8 *str, u32 x, u32
winTemplate.height = 2;
*windowId = AddWindow(&winTemplate);
- FillWindowPixelBuffer(*windowId, (color1 << 4) | (color1));
+ FillWindowPixelBuffer(*windowId, PIXEL_FILL(color1));
AddTextPrinterParameterized4(*windowId, 0, x, y, 0, 0, color, -1, str);
return (u8*)(GetWindowAttribute(*windowId, WINDOW_TILE_DATA));
@@ -2901,10 +2905,10 @@ static void PrintOnAbilityPopUp(const u8 *str, u8 *spriteTileData1, u8 *spriteTi
{
u32 windowId, i;
u8 *windowTileData;
- u8 text1[MAX_CHARS_PRINTED + 2];
- u8 text2[MAX_CHARS_PRINTED + 2];
+ u8 text1[MAX_CHARS_PRINTED];
+ u8 text2[MAX_CHARS_PRINTED];
- for (i = 0; i < MAX_CHARS_PRINTED + 1; i++)
+ for (i = 0; i < MAX_CHARS_PRINTED; i++)
{
text1[i] = str[i];
if (text1[i] == EOS)
@@ -2916,7 +2920,7 @@ static void PrintOnAbilityPopUp(const u8 *str, u8 *spriteTileData1, u8 *spriteTi
TextIntoAbilityPopUp(spriteTileData1, windowTileData, 8, (y == 0));
RemoveWindow(windowId);
- if (i == MAX_CHARS_PRINTED + 1)
+ if (i == MAX_CHARS_PRINTED)
{
for (i = 0; i < MAX_CHARS_PRINTED; i++)
{
@@ -2927,11 +2931,22 @@ static void PrintOnAbilityPopUp(const u8 *str, u8 *spriteTileData1, u8 *spriteTi
text2[i] = EOS;
windowTileData = AddTextPrinterAndCreateWindowOnAbilityPopUp(text2, x2, y, color1, color2, color3, &windowId);
- TextIntoAbilityPopUp(spriteTileData2, windowTileData, 1, (y == 0));
+ TextIntoAbilityPopUp(spriteTileData2, windowTileData, 3, (y == 0));
RemoveWindow(windowId);
}
}
+static const u8 sText_Space16[]= _(" ");
+static void ClearAbilityName(u8 spriteId1, u8 spriteId2)
+{
+ PrintOnAbilityPopUp(sText_Space16,
+ (void*)(OBJ_VRAM0) + (gSprites[spriteId1].oam.tileNum * 32) + 256,
+ (void*)(OBJ_VRAM0) + (gSprites[spriteId2].oam.tileNum * 32) + 256,
+ 6, 1,
+ 4,
+ 7, 9, 1);
+}
+
static void PrintBattlerOnAbilityPopUp(u8 battlerId, u8 spriteId1, u8 spriteId2)
{
int i;
@@ -2974,7 +2989,7 @@ static void PrintAbilityOnAbilityPopUp(u32 ability, u8 spriteId1, u8 spriteId2)
PrintOnAbilityPopUp(gAbilityNames[ability],
(void*)(OBJ_VRAM0) + (gSprites[spriteId1].oam.tileNum * 32) + 256,
(void*)(OBJ_VRAM0) + (gSprites[spriteId2].oam.tileNum * 32) + 256,
- 7, 1,
+ 6, 1,
4,
7, 9, 1);
}
@@ -3035,6 +3050,20 @@ static const u16 sOverwrittenPixelsTable[][2] =
{PIXEL_COORDS_TO_OFFSET(0, 24), 3},
{PIXEL_COORDS_TO_OFFSET(0, 25), 3},
{PIXEL_COORDS_TO_OFFSET(0, 26), 3},
+
+//Second Row Of Image
+ {PIXEL_COORDS_TO_OFFSET(0, 45), 8},
+ {PIXEL_COORDS_TO_OFFSET(0, 46), 8},
+ {PIXEL_COORDS_TO_OFFSET(0, 47), 8},
+ //{PIXEL_COORDS_TO_OFFSET(0, 48), 8}, // cuts off the top of the 'G' in Neutralizing Gas
+ {PIXEL_COORDS_TO_OFFSET(8, 45), 8},
+ {PIXEL_COORDS_TO_OFFSET(8, 46), 8},
+ {PIXEL_COORDS_TO_OFFSET(8, 47), 8},
+ {PIXEL_COORDS_TO_OFFSET(8, 48), 8},
+ {PIXEL_COORDS_TO_OFFSET(16, 45), 8},
+ {PIXEL_COORDS_TO_OFFSET(16, 46), 8},
+ {PIXEL_COORDS_TO_OFFSET(16, 47), 8},
+ {PIXEL_COORDS_TO_OFFSET(16, 48), 8},
};
static inline void CopyPixels(u8 *dest, const u8 *src, u32 pixelCount)
@@ -3161,6 +3190,7 @@ void UpdateAbilityPopup(u8 battlerId)
u8 spriteId2 = gBattleStruct->abilityPopUpSpriteIds[battlerId][1];
u16 ability = (gBattleScripting.abilityPopupOverwrite != 0) ? gBattleScripting.abilityPopupOverwrite : gBattleMons[battlerId].ability;
+ ClearAbilityName(spriteId1, spriteId2);
PrintAbilityOnAbilityPopUp(ability, spriteId1, spriteId2);
RestoreOverwrittenPixels((void*)(OBJ_VRAM0) + (gSprites[spriteId1].oam.tileNum * 32));
}
@@ -3226,19 +3256,19 @@ static void Task_FreeAbilityPopUpGfx(u8 taskId)
static const struct OamData sOamData_LastUsedBall =
{
- .y = 0,
- .affineMode = 0,
- .objMode = 0,
- .mosaic = 0,
- .bpp = 0,
- .shape = SPRITE_SHAPE(32x32),
- .x = 0,
- .matrixNum = 0,
- .size = SPRITE_SIZE(32x32),
- .tileNum = 0,
- .priority = 1,
- .paletteNum = 0,
- .affineParam = 0,
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = SPRITE_SHAPE(32x32),
+ .x = 0,
+ .matrixNum = 0,
+ .size = SPRITE_SIZE(32x32),
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0,
};
static const struct SpriteTemplate sSpriteTemplate_LastUsedBallWindow =
@@ -3274,19 +3304,23 @@ static const struct SpriteSheet sSpriteSheet_LastUsedBallWindow =
bool32 CanThrowLastUsedBall(void)
{
- #if B_LAST_USED_BALL == FALSE
+#if B_LAST_USED_BALL == FALSE
+ return FALSE;
+#else
+ if (!CanThrowBall())
+ return FALSE;
+ if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
+ return FALSE;
+ if (!CheckBagHasItem(gLastThrownBall, 1))
return FALSE;
- #else
- return (!(CanThrowBall() != 0
- || (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
- || !CheckBagHasItem(gLastThrownBall, 1)));
- #endif
-}
+ return TRUE;
+#endif
+}
void TryAddLastUsedBallItemSprites(void)
{
- #if B_LAST_USED_BALL == TRUE
+#if B_LAST_USED_BALL == TRUE
if (gLastThrownBall == 0
|| (gLastThrownBall != 0 && !CheckBagHasItem(gLastThrownBall, 1)))
{
@@ -3295,10 +3329,8 @@ void TryAddLastUsedBallItemSprites(void)
CompactItemsInBagPocket(&gBagPockets[BALLS_POCKET]);
gLastThrownBall = gBagPockets[BALLS_POCKET].itemSlots[0].itemId;
}
-
- if (CanThrowBall() != 0
- || (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
- || !CheckBagHasItem(gLastThrownBall, 1))
+
+ if (!CanThrowLastUsedBall())
return;
// ball
@@ -3319,11 +3351,11 @@ void TryAddLastUsedBallItemSprites(void)
if (gBattleStruct->ballSpriteIds[1] == MAX_SPRITES)
{
gBattleStruct->ballSpriteIds[1] = CreateSprite(&sSpriteTemplate_LastUsedBallWindow,
- LAST_BALL_WIN_X_0,
- LAST_USED_WIN_Y, 5);
+ LAST_BALL_WIN_X_0,
+ LAST_USED_WIN_Y, 5);
gSprites[gBattleStruct->ballSpriteIds[0]].sHide = FALSE; // restore
}
- #endif
+#endif
}
static void DestroyLastUsedBallWinGfx(struct Sprite *sprite)
@@ -3378,7 +3410,7 @@ static void SpriteCB_LastUsedBall(struct Sprite *sprite)
static void TryHideOrRestoreLastUsedBall(u8 caseId)
{
- #if B_LAST_USED_BALL == TRUE
+#if B_LAST_USED_BALL == TRUE
if (gBattleStruct->ballSpriteIds[0] == MAX_SPRITES)
return;
@@ -3397,23 +3429,22 @@ static void TryHideOrRestoreLastUsedBall(u8 caseId)
gSprites[gBattleStruct->ballSpriteIds[1]].sHide = FALSE; // restore
break;
}
- #endif
+#endif
}
void TryHideLastUsedBall(void)
{
- #if B_LAST_USED_BALL == TRUE
+#if B_LAST_USED_BALL == TRUE
TryHideOrRestoreLastUsedBall(0);
- #endif
+#endif
}
void TryRestoreLastUsedBall(void)
{
- #if B_LAST_USED_BALL == TRUE
+#if B_LAST_USED_BALL == TRUE
if (gBattleStruct->ballSpriteIds[0] != MAX_SPRITES)
TryHideOrRestoreLastUsedBall(1);
else
TryAddLastUsedBallItemSprites();
- #endif
+#endif
}
-
diff --git a/src/battle_main.c b/src/battle_main.c
index 1215bf7b13..f3fcd4f74f 100644
--- a/src/battle_main.c
+++ b/src/battle_main.c
@@ -2917,6 +2917,7 @@ static void BattleStartClearSetData(void)
gBattleStruct->lastTakenMoveFrom[i][2] = 0;
gBattleStruct->lastTakenMoveFrom[i][3] = 0;
gBattleStruct->AI_monToSwitchIntoId[i] = PARTY_SIZE;
+ gBattleStruct->skyDropTargets[i] = 0xFF;
}
gLastUsedMove = 0;
@@ -2982,6 +2983,7 @@ static void BattleStartClearSetData(void)
gBattleStruct->mega.triggerSpriteId = 0xFF;
gBattleStruct->stickyWebUser = 0xFF;
+ gBattleStruct->appearedInBattle = 0;
for (i = 0; i < PARTY_SIZE; i++)
{
@@ -3020,7 +3022,7 @@ void SwitchInClearSetData(void)
gStatuses3[gActiveBattler] &= (STATUS3_LEECHSEED_BATTLER | STATUS3_LEECHSEED | STATUS3_ALWAYS_HITS | STATUS3_PERISH_SONG | STATUS3_ROOTED
| STATUS3_GASTRO_ACID | STATUS3_EMBARGO | STATUS3_TELEKINESIS | STATUS3_MAGNET_RISE | STATUS3_HEAL_BLOCK
| STATUS3_AQUA_RING | STATUS3_POWER_TRICK);
-
+ gStatuses4[gActiveBattler] &= (STATUS4_MUD_SPORT | STATUS4_WATER_SPORT);
for (i = 0; i < gBattlersCount; i++)
{
if (GetBattlerSide(gActiveBattler) != GetBattlerSide(i)
@@ -3038,9 +3040,8 @@ void SwitchInClearSetData(void)
{
gBattleMons[gActiveBattler].status2 = 0;
gStatuses3[gActiveBattler] = 0;
+ gStatuses4[gActiveBattler] = 0;
}
-
- gStatuses4[gActiveBattler] = 0;
for (i = 0; i < gBattlersCount; i++)
{
@@ -3206,6 +3207,45 @@ void FaintClearSetData(void)
UndoFormChange(gBattlerPartyIndexes[gActiveBattler], GET_BATTLER_SIDE(gActiveBattler), FALSE);
if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
UndoMegaEvolution(gBattlerPartyIndexes[gActiveBattler]);
+
+ // If the fainted mon was involved in a Sky Drop
+ if (gBattleStruct->skyDropTargets[gActiveBattler] != 0xFF)
+ {
+ // Get battler id of the other Pokemon involved in this Sky Drop
+ u8 otherSkyDropper = gBattleStruct->skyDropTargets[gActiveBattler];
+
+ // Clear Sky Drop data
+ gBattleStruct->skyDropTargets[gActiveBattler] = 0xFF;
+ gBattleStruct->skyDropTargets[otherSkyDropper] = 0xFF;
+
+ // If the other Pokemon involved in this Sky Drop was the target, not the attacker
+ if (gStatuses3[otherSkyDropper] & STATUS3_SKY_DROPPED)
+ {
+ // Release the target and take them out of the semi-invulnerable state
+ gStatuses3[otherSkyDropper] &= ~(STATUS3_SKY_DROPPED | STATUS3_ON_AIR);
+
+ // Make the target's sprite visible
+ gSprites[gBattlerSpriteIds[otherSkyDropper]].invisible = FALSE;
+
+ // If the target was sky dropped in the middle of using Outrage/Petal Dance/Thrash,
+ // confuse them upon release and print "confused via fatigue" message and animation.
+ if (gBattleMons[otherSkyDropper].status2 & STATUS2_LOCK_CONFUSE)
+ {
+ gBattleMons[otherSkyDropper].status2 &= ~(STATUS2_LOCK_CONFUSE);
+
+ // If the released mon can be confused, do so.
+ // Don't use CanBeConfused here, since it can cause issues in edge cases.
+ if (!(GetBattlerAbility(otherSkyDropper) == ABILITY_OWN_TEMPO
+ || gBattleMons[otherSkyDropper].status2 & STATUS2_CONFUSION
+ || IsBattlerTerrainAffected(otherSkyDropper, STATUS_FIELD_MISTY_TERRAIN)))
+ {
+ gBattleMons[otherSkyDropper].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2);
+ gBattlerAttacker = otherSkyDropper;
+ gBattlescriptCurrInstr = BattleScript_ThrashConfuses - 2;
+ }
+ }
+ }
+ }
}
static void DoBattleIntro(void)
@@ -3622,6 +3662,9 @@ static void TryDoEventsBeforeFirstTurn(void)
*(gBattleStruct->monToSwitchIntoId + i) = PARTY_SIZE;
gChosenActionByBattler[i] = B_ACTION_NONE;
gChosenMoveByBattler[i] = MOVE_NONE;
+ // Record party slots of player's mons that appeared in battle
+ if (!IsBattlerAIControlled(i))
+ gBattleStruct->appearedInBattle |= gBitTable[gBattlerPartyIndexes[i]];
}
TurnValuesCleanUp(FALSE);
SpecialStatusesClear();
@@ -3941,10 +3984,12 @@ static void HandleTurnActionSelectionState(void)
}
break;
case B_ACTION_USE_ITEM:
- if (gBattleTypeFlags & (BATTLE_TYPE_LINK
+ if ((gBattleTypeFlags & (BATTLE_TYPE_LINK
| BATTLE_TYPE_FRONTIER_NO_PYRAMID
| BATTLE_TYPE_EREADER_TRAINER
| BATTLE_TYPE_RECORDED_LINK))
+ // Or if currently held by Sky Drop
+ || gStatuses3[gActiveBattler] & STATUS3_SKY_DROPPED)
{
RecordedBattle_ClearBattlerAction(gActiveBattler, 1);
gSelectionBattleScripts[gActiveBattler] = BattleScript_ActionSelectionItemsCantBeUsed;
@@ -4414,15 +4459,16 @@ s8 GetChosenMovePriority(u32 battlerId)
s8 GetMovePriority(u32 battlerId, u16 move)
{
s8 priority;
+ u16 ability = GetBattlerAbility(battlerId);
priority = gBattleMoves[move].priority;
- if (GetBattlerAbility(battlerId) == ABILITY_GALE_WINGS
+ if (ability == ABILITY_GALE_WINGS
&& gBattleMoves[move].type == TYPE_FLYING
&& (B_GALE_WINGS <= GEN_6 || BATTLER_MAX_HP(battlerId)))
{
priority++;
}
- else if (GetBattlerAbility(battlerId) == ABILITY_PRANKSTER && IS_MOVE_STATUS(move))
+ else if (ability == ABILITY_PRANKSTER && IS_MOVE_STATUS(move))
{
gProtectStructs[battlerId].pranksterElevated = 1;
priority++;
@@ -4431,7 +4477,7 @@ s8 GetMovePriority(u32 battlerId, u16 move)
{
priority++;
}
- else if (GetBattlerAbility(battlerId) == ABILITY_TRIAGE)
+ else if (ability == ABILITY_TRIAGE)
{
switch (gBattleMoves[move].effect)
{
@@ -4461,33 +4507,30 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves)
u32 speedBattler1 = 0, speedBattler2 = 0;
u32 holdEffectBattler1 = 0, holdEffectBattler2 = 0;
s8 priority1 = 0, priority2 = 0;
+ u16 ability1 = GetBattlerAbility(battler1), ability2 = GetBattlerAbility(battler2);
// Battler 1
speedBattler1 = GetBattlerTotalSpeedStat(battler1);
holdEffectBattler1 = GetBattlerHoldEffect(battler1, TRUE);
// Quick Draw
- if (!ignoreChosenMoves && GetBattlerAbility(battler1) == ABILITY_QUICK_DRAW && !IS_MOVE_STATUS(gChosenMoveByBattler[battler1]) && Random() % 100 < 30)
+ if (!ignoreChosenMoves && ability1 == ABILITY_QUICK_DRAW && !IS_MOVE_STATUS(gChosenMoveByBattler[battler1]) && Random() % 100 < 30)
gProtectStructs[battler1].quickDraw = TRUE;
// Quick Claw and Custap Berry
if (!gProtectStructs[battler1].quickDraw
&& ((holdEffectBattler1 == HOLD_EFFECT_QUICK_CLAW && gRandomTurnNumber < (0xFFFF * GetBattlerHoldEffectParam(battler1)) / 100)
- || (!IsAbilityOnOpposingSide(battler1, ABILITY_UNNERVE)
- && holdEffectBattler1 == HOLD_EFFECT_CUSTAP_BERRY
- && HasEnoughHpToEatBerry(battler1, 4, gBattleMons[battler1].item))))
+ || (holdEffectBattler1 == HOLD_EFFECT_CUSTAP_BERRY && HasEnoughHpToEatBerry(battler1, 4, gBattleMons[battler1].item))))
gProtectStructs[battler1].usedCustapBerry = TRUE;
// Battler 2
speedBattler2 = GetBattlerTotalSpeedStat(battler2);
holdEffectBattler2 = GetBattlerHoldEffect(battler2, TRUE);
// Quick Draw
- if (!ignoreChosenMoves && GetBattlerAbility(battler2) == ABILITY_QUICK_DRAW && !IS_MOVE_STATUS(gChosenMoveByBattler[battler2]) && Random() % 100 < 30)
+ if (!ignoreChosenMoves && ability2 == ABILITY_QUICK_DRAW && !IS_MOVE_STATUS(gChosenMoveByBattler[battler2]) && Random() % 100 < 30)
gProtectStructs[battler2].quickDraw = TRUE;
// Quick Claw and Custap Berry
if (!gProtectStructs[battler2].quickDraw
&& ((holdEffectBattler2 == HOLD_EFFECT_QUICK_CLAW && gRandomTurnNumber < (0xFFFF * GetBattlerHoldEffectParam(battler2)) / 100)
- || (!IsAbilityOnOpposingSide(battler2, ABILITY_UNNERVE)
- && holdEffectBattler2 == HOLD_EFFECT_CUSTAP_BERRY
- && HasEnoughHpToEatBerry(battler2, 4, gBattleMons[battler2].item))))
+ || (holdEffectBattler2 == HOLD_EFFECT_CUSTAP_BERRY && HasEnoughHpToEatBerry(battler2, 4, gBattleMons[battler2].item))))
gProtectStructs[battler2].usedCustapBerry = TRUE;
if (!ignoreChosenMoves)
@@ -4516,9 +4559,9 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves)
strikesFirst = 1;
else if (holdEffectBattler2 == HOLD_EFFECT_LAGGING_TAIL && holdEffectBattler1 != HOLD_EFFECT_LAGGING_TAIL)
strikesFirst = 0;
- else if (GetBattlerAbility(battler1) == ABILITY_STALL && GetBattlerAbility(battler2) != ABILITY_STALL)
+ else if (ability1 == ABILITY_STALL && ability2 != ABILITY_STALL)
strikesFirst = 1;
- else if (GetBattlerAbility(battler2) == ABILITY_STALL && GetBattlerAbility(battler1) != ABILITY_STALL)
+ else if (ability2 == ABILITY_STALL && ability1 != ABILITY_STALL)
strikesFirst = 0;
else
{
@@ -4818,6 +4861,7 @@ static void CheckQuickClaw_CustapBerryActivation(void)
}
else if (gProtectStructs[gActiveBattler].quickDraw)
{
+ gBattlerAbility = gActiveBattler;
gProtectStructs[gActiveBattler].quickDraw = FALSE;
gLastUsedAbility = gBattleMons[gActiveBattler].ability;
PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility);
@@ -5357,3 +5401,8 @@ void SetTotemBoost(void)
}
}
}
+
+bool32 IsWildMonSmart(void)
+{
+ return (B_SMART_WILD_AI_FLAG != 0 && FlagGet(B_SMART_WILD_AI_FLAG));
+}
diff --git a/src/battle_message.c b/src/battle_message.c
index a672862a30..8f7798947e 100644
--- a/src/battle_message.c
+++ b/src/battle_message.c
@@ -427,6 +427,8 @@ static const u8 sText_ExclamationMark4[] = _("!");
static const u8 sText_ExclamationMark5[] = _("!");
static const u8 sText_Accuracy[] = _("accuracy");
static const u8 sText_Evasiveness[] = _("evasiveness");
+static const u8 sText_PkmnTookTargetHigh[] = _("{B_ATK_NAME_WITH_PREFIX} took {B_DEF_NAME_WITH_PREFIX}\ninto the air!");
+static const u8 sText_TargetTooHeavy[] = _("But the target\nwas too heavy!");
const u8 * const gStatNamesTable[NUM_BATTLE_STATS] =
{
@@ -507,13 +509,13 @@ static const u8 sText_TwoInGameTrainersDefeated[];
static const u8 sText_Trainer2LoseText[];
// New battle strings.
-static const s8 sText_EnduredViaSturdy[] = _("{B_DEF_NAME_WITH_PREFIX} ENDURED\nthe hit using {B_DEF_ABILITY}!");
+static const s8 sText_EnduredViaSturdy[] = _("{B_DEF_NAME_WITH_PREFIX} Endured\nthe hit using {B_DEF_ABILITY}!");
static const s8 sText_PowerHerbActivation[] = _("{B_ATK_NAME_WITH_PREFIX} became fully charged\ndue to its {B_LAST_ITEM}!");
static const s8 sText_HurtByItem[] = _("{B_ATK_NAME_WITH_PREFIX} was hurt\nby its {B_LAST_ITEM}!");
static const s8 sText_BadlyPoisonedByItem[] = _("{B_EFF_NAME_WITH_PREFIX} was badly \npoisoned by the {B_LAST_ITEM}!");
static const s8 sText_BurnedByItem[] = _("{B_EFF_NAME_WITH_PREFIX} was burned\nby the {B_LAST_ITEM}!");
static const s8 sText_TargetAbilityActivates[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_DEF_ABILITY} activates!");
-static const u8 sText_GravityIntensified[] = _("GRAVITY intensified!");
+static const u8 sText_GravityIntensified[] = _("Gravity intensified!");
static const u8 sText_TargetIdentified[] = _("{B_DEF_NAME_WITH_PREFIX} was \nidentified!");
static const u8 sText_TargetWokeUp[] = _("{B_DEF_NAME_WITH_PREFIX} woke up!");
static const u8 sText_PkmnStoleAndAteItem[] = _("{B_ATK_NAME_WITH_PREFIX} stole and\nate {B_DEF_NAME_WITH_PREFIX}'s {B_LAST_ITEM}!");
@@ -613,9 +615,9 @@ static const u8 sText_TargetStatWontGoHigher[] = _("{B_DEF_NAME_WITH_PREFIX}'s {
static const u8 sText_PkmnMoveBouncedViaAbility[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_CURRENT_MOVE} was\nbounced back by {B_DEF_NAME_WITH_PREFIX}'s\l{B_DEF_ABILITY}!");
static const u8 sText_ImposterTransform[] = _("{B_ATK_NAME_WITH_PREFIX} transformed into\n{B_DEF_NAME_WITH_PREFIX} using {B_LAST_ABILITY}!");
static const u8 sText_NotDoneYet[] = _("This move effect is not done yet!\p");
-static const u8 sText_PkmnBlewAwayToxicSpikes[] = _("{B_ATK_NAME_WITH_PREFIX} blew away\nTOXIC SPIKES!");
-static const u8 sText_PkmnBlewAwayStickyWeb[] = _("{B_ATK_NAME_WITH_PREFIX} blew away\nSTICKY WEB!");
-static const u8 sText_PkmnBlewAwayStealthRock[] = _("{B_ATK_NAME_WITH_PREFIX} blew away\nSTEALTH ROCK!");
+static const u8 sText_PkmnBlewAwayToxicSpikes[] = _("{B_ATK_NAME_WITH_PREFIX} blew away\nToxic Spikes!");
+static const u8 sText_PkmnBlewAwayStickyWeb[] = _("{B_ATK_NAME_WITH_PREFIX} blew away\nSticky Web!");
+static const u8 sText_PkmnBlewAwayStealthRock[] = _("{B_ATK_NAME_WITH_PREFIX} blew away\nStealth Rock!");
static const u8 sText_StickyWebUsed[] = _("A sticky web spreads out on the\nground around {B_DEF_TEAM2} team!");
static const u8 sText_QuashSuccess[] = _("The opposing {B_ATK_NAME_WITH_PREFIX}'s move was postponed!");
static const u8 sText_IonDelugeOn[] = _("A deluge of ions showers\nthe battlefield!");
@@ -678,7 +680,7 @@ static const u8 sText_AirLockActivates[] = _("The effects of weather\ndisappeare
static const u8 sText_PressureActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is exerting its\npressure!");
static const u8 sText_DarkAuraActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is radiating\na dark aura!");
static const u8 sText_FairyAuraActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is radiating\na fairy aura!");
-static const u8 sText_AuraBreakActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} reversed all\nother POKéMON's auras!");
+static const u8 sText_AuraBreakActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} reversed all\nother Pokémon's auras!");
static const u8 sText_ComatoseActivates[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is drowsing!");
static const u8 sText_ScreenCleanerActivates[] = _("All screens on the field were\ncleansed!");
static const u8 sText_FetchedPokeBall[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} found\na {B_LAST_ITEM}!");
@@ -724,7 +726,7 @@ static const u8 sText_SwappedAbilities[] = _("{B_DEF_NAME_WITH_PREFIX} swapped A
static const u8 sText_PastelVeilProtected[] = _("{B_DEF_NAME_WITH_PREFIX} is protected\nby a pastel veil!");
static const u8 sText_PastelVeilEnters[] = _("{B_DEF_NAME_WITH_PREFIX} was cured\nof its poisoning!");
static const u8 sText_BattlerTypeChangedTo[] = _("{B_BUFF1}'s type\nchanged to {B_BUFF2}!");
-static const u8 sText_BothCanNoLongerEscape[] = _("Neither POKéMON can run away!");
+static const u8 sText_BothCanNoLongerEscape[] = _("Neither Pokémon can run away!");
static const u8 sText_CantEscapeDueToUsedMove[] = _("{B_ATK_NAME_WITH_PREFIX} can no longer escape\nbecause it used {B_CURRENT_MOVE}!");
static const u8 sText_PkmnBecameWeakerToFire[] = _("{B_DEF_NAME_WITH_PREFIX} became\nweaker to fire!");
static const u8 sText_PkmnAboutToBeAttackedByItsItem[] = _("{B_DEF_NAME_WITH_PREFIX} is about\nto be attacked by its {B_BUFF1}!");
@@ -1330,6 +1332,8 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] =
[STRINGID_PKMNBECAMEWEAKERTOFIRE - 12] = sText_PkmnBecameWeakerToFire,
[STRINGID_ABOUTTOUSEPOLTERGEIST - 12] = sText_PkmnAboutToBeAttackedByItsItem,
[STRINGID_CANTESCAPEBECAUSEOFCURRENTMOVE - 12] = sText_CantEscapeBecauseOfCurrentMove,
+ [STRINGID_PKMNTOOKTARGETHIGH - 12] = sText_PkmnTookTargetHigh,
+ [STRINGID_TARGETTOOHEAVY - 12] = sText_TargetTooHeavy,
};
const u16 gMentalHerbCureStringIds[] =
@@ -1544,6 +1548,7 @@ const u16 gFirstTurnOfTwoStringIds[] =
[B_MSG_TURN1_PHANTOM_FORCE] = STRINGID_VANISHEDINSTANTLY,
[B_MSG_TURN1_GEOMANCY] = STRINGID_PKNMABSORBINGPOWER,
[B_MSG_TURN1_FREEZE_SHOCK] = STRINGID_CLOAKEDINAFREEZINGLIGHT,
+ [B_MSG_TURN1_SKY_DROP] = STRINGID_PKMNTOOKTARGETHIGH,
};
// Index copied from move's index in sTrappingMoves
diff --git a/src/battle_pike.c b/src/battle_pike.c
index 5d958dec27..2f36dbc29f 100644
--- a/src/battle_pike.c
+++ b/src/battle_pike.c
@@ -18,7 +18,6 @@
#include "constants/frontier_util.h"
#include "constants/abilities.h"
#include "constants/battle_config.h"
-#include "constants/easy_chat.h"
#include "constants/layouts.h"
#include "constants/rgb.h"
#include "constants/trainers.h"
diff --git a/src/battle_pyramid.c b/src/battle_pyramid.c
index 851690baaf..ae1831d9b5 100644
--- a/src/battle_pyramid.c
+++ b/src/battle_pyramid.c
@@ -1239,7 +1239,7 @@ static u8 GetPostBattleDirectionHintTextIndex(int *hintType, u8 minDistanceForEx
{
for (x = 0; x < 32; x++)
{
- if ((map[x] & METATILE_ID_MASK) == METATILE_BattlePyramid_Exit)
+ if ((map[x] & MAPGRID_METATILE_ID_MASK) == METATILE_BattlePyramid_Exit)
{
x += MAP_OFFSET - gObjectEvents[gSelectedObjectEvent].initialCoords.x;
y += MAP_OFFSET - gObjectEvents[gSelectedObjectEvent].initialCoords.y;
@@ -1465,7 +1465,7 @@ void CopyPyramidTrainerLoseSpeech(u16 trainerId)
FrontierSpeechToString(gFacilityTrainers[trainerId].speechLose);
}
-u8 GetBattlePyramindTrainerEncounterMusicId(u16 trainerId)
+u8 GetTrainerEncounterMusicIdInBattlePyramid(u16 trainerId)
{
int i;
@@ -1545,7 +1545,7 @@ void GenerateBattlePyramidFloorLayout(u16 *backupMapData, bool8 setPlayerPositio
{
for (x = 0; x < mapLayout->width; x++)
{
- if ((layoutMap[x] & METATILE_ID_MASK) != METATILE_BattlePyramid_Exit)
+ if ((layoutMap[x] & MAPGRID_METATILE_ID_MASK) != METATILE_BattlePyramid_Exit)
{
map[x] = layoutMap[x];
}
@@ -1556,7 +1556,7 @@ void GenerateBattlePyramidFloorLayout(u16 *backupMapData, bool8 setPlayerPositio
gSaveBlock1Ptr->pos.x = (mapLayout->width * (i % 4)) + x;
gSaveBlock1Ptr->pos.y = (mapLayout->height * (i / 4)) + y;
}
- map[x] = (layoutMap[x] & (METATILE_ELEVATION_MASK | METATILE_COLLISION_MASK)) | METATILE_BattlePyramid_Floor;
+ map[x] = (layoutMap[x] & (MAPGRID_ELEVATION_MASK | MAPGRID_COLLISION_MASK)) | METATILE_BattlePyramid_Floor;
}
else
{
diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c
index f41515ab73..837a0b8c00 100644
--- a/src/battle_script_commands.c
+++ b/src/battle_script_commands.c
@@ -919,13 +919,12 @@ static const struct SpriteTemplate sSpriteTemplate_MonIconOnLvlUpBanner =
static const u16 sProtectSuccessRates[] = {USHRT_MAX, USHRT_MAX / 2, USHRT_MAX / 4, USHRT_MAX / 8};
-#define FORBIDDEN_MIMIC 0x1
-#define FORBIDDEN_METRONOME 0x2
-#define FORBIDDEN_ASSIST 0x4
-#define FORBIDDEN_COPYCAT 0x8
-#define FORBIDDEN_SLEEP_TALK 0x10
-
-#define FORBIDDEN_INSTRUCT_END 0xFFFF
+#define FORBIDDEN_MIMIC (1 << 0)
+#define FORBIDDEN_METRONOME (1 << 1)
+#define FORBIDDEN_ASSIST (1 << 2)
+#define FORBIDDEN_COPYCAT (1 << 3)
+#define FORBIDDEN_SLEEP_TALK (1 << 4)
+#define FORBIDDEN_INSTRUCT (1 << 5)
static const u8 sForbiddenMoves[MOVES_COUNT] =
{
@@ -933,28 +932,29 @@ static const u8 sForbiddenMoves[MOVES_COUNT] =
[MOVE_STRUGGLE] = 0xFF, // Neither Struggle
[MOVE_AFTER_YOU] = FORBIDDEN_METRONOME,
[MOVE_APPLE_ACID] = FORBIDDEN_METRONOME,
- [MOVE_ASSIST] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK,
+ [MOVE_ASSIST] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
[MOVE_ASTRAL_BARRAGE] = FORBIDDEN_METRONOME,
[MOVE_AURA_WHEEL] = FORBIDDEN_METRONOME,
[MOVE_BADDY_BAD] = FORBIDDEN_METRONOME,
[MOVE_BANEFUL_BUNKER] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
- [MOVE_BEAK_BLAST] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK,
- [MOVE_BEHEMOTH_BASH] = FORBIDDEN_METRONOME | FORBIDDEN_COPYCAT,
- [MOVE_BEHEMOTH_BLADE] = FORBIDDEN_METRONOME | FORBIDDEN_COPYCAT,
- [MOVE_BELCH] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK,
+ [MOVE_BEAK_BLAST] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
+ [MOVE_BEHEMOTH_BASH] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
+ [MOVE_BEHEMOTH_BLADE] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
+ [MOVE_BELCH] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
[MOVE_BESTOW] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
- [MOVE_BIDE] = FORBIDDEN_SLEEP_TALK,
+ [MOVE_BIDE] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
+ [MOVE_BLAST_BURN] = FORBIDDEN_INSTRUCT,
[MOVE_BODY_PRESS] = FORBIDDEN_METRONOME,
- [MOVE_BOUNCE] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK,
+ [MOVE_BOUNCE] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
[MOVE_BOUNCY_BUBBLE] = FORBIDDEN_METRONOME,
[MOVE_BRANCH_POKE] = FORBIDDEN_METRONOME,
[MOVE_BREAKING_SWIPE] = FORBIDDEN_METRONOME,
[MOVE_BUZZY_BUZZ] = FORBIDDEN_METRONOME,
- [MOVE_CELEBRATE] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK,
- [MOVE_CHATTER] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_MIMIC | FORBIDDEN_SLEEP_TALK,
+ [MOVE_CELEBRATE] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
+ [MOVE_CHATTER] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_MIMIC | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
[MOVE_CIRCLE_THROW] = FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
[MOVE_CLANGOROUS_SOUL] = FORBIDDEN_METRONOME,
- [MOVE_COPYCAT] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK,
+ [MOVE_COPYCAT] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
[MOVE_COUNTER] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
[MOVE_COVET] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
[MOVE_CRAFTY_SHIELD] = FORBIDDEN_METRONOME,
@@ -962,84 +962,96 @@ static const u8 sForbiddenMoves[MOVES_COUNT] =
[MOVE_DESTINY_BOND] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
[MOVE_DETECT] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
[MOVE_DIAMOND_STORM] = FORBIDDEN_METRONOME,
- [MOVE_DIG] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK,
- [MOVE_DIVE] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK,
+ [MOVE_DIG] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
+ [MOVE_DIVE] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
[MOVE_DOUBLE_IRON_BASH] = FORBIDDEN_METRONOME,
[MOVE_DRAGON_ASCENT] = FORBIDDEN_METRONOME,
[MOVE_DRAGON_ENERGY] = FORBIDDEN_METRONOME,
[MOVE_DRAGON_TAIL] = FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
[MOVE_DRUM_BEATING] = FORBIDDEN_METRONOME,
- [MOVE_DYNAMAX_CANNON] = FORBIDDEN_METRONOME | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK,
+ [MOVE_DYNAMAX_CANNON] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
[MOVE_ENDURE] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
- [MOVE_ETERNABEAM] = FORBIDDEN_METRONOME,
+ [MOVE_ETERNABEAM] = FORBIDDEN_METRONOME | FORBIDDEN_INSTRUCT,
[MOVE_FALSE_SURRENDER] = FORBIDDEN_METRONOME,
[MOVE_FEINT] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
[MOVE_FIERY_WRATH] = FORBIDDEN_METRONOME,
[MOVE_FLEUR_CANNON] = FORBIDDEN_METRONOME,
[MOVE_FLOATY_FALL] = FORBIDDEN_METRONOME,
- [MOVE_FLY] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK,
- [MOVE_FOCUS_PUNCH] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK,
+ [MOVE_FLY] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
+ [MOVE_FOCUS_PUNCH] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
[MOVE_FOLLOW_ME] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
- [MOVE_FREEZE_SHOCK] = FORBIDDEN_METRONOME | FORBIDDEN_SLEEP_TALK,
+ [MOVE_FREEZE_SHOCK] = FORBIDDEN_METRONOME | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
[MOVE_FREEZING_GLARE] = FORBIDDEN_METRONOME,
[MOVE_FREEZY_FROST] = FORBIDDEN_METRONOME,
- [MOVE_GEOMANCY] = FORBIDDEN_SLEEP_TALK,
+ [MOVE_FRENZY_PLANT] = FORBIDDEN_INSTRUCT,
+ [MOVE_GEOMANCY] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
+ [MOVE_GIGA_IMPACT] = FORBIDDEN_INSTRUCT,
[MOVE_GLACIAL_LANCE] = FORBIDDEN_METRONOME,
[MOVE_GLITZY_GLOW] = FORBIDDEN_METRONOME,
[MOVE_GRAV_APPLE] = FORBIDDEN_METRONOME,
[MOVE_HELPING_HAND] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
- [MOVE_HOLD_HANDS] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK,
+ [MOVE_HOLD_HANDS] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
+ [MOVE_HYDRO_CANNON] = FORBIDDEN_INSTRUCT,
+ [MOVE_HYPER_BEAM] = FORBIDDEN_INSTRUCT,
[MOVE_HYPERSPACE_FURY] = FORBIDDEN_METRONOME,
[MOVE_HYPERSPACE_HOLE] = FORBIDDEN_METRONOME,
- [MOVE_ICE_BURN] = FORBIDDEN_METRONOME | FORBIDDEN_SLEEP_TALK,
- [MOVE_INSTRUCT] = FORBIDDEN_METRONOME,
+ [MOVE_ICE_BALL] = FORBIDDEN_INSTRUCT,
+ [MOVE_ICE_BURN] = FORBIDDEN_METRONOME | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
+ [MOVE_INSTRUCT] = FORBIDDEN_METRONOME | FORBIDDEN_INSTRUCT,
[MOVE_JUNGLE_HEALING] = FORBIDDEN_METRONOME,
- [MOVE_KINGS_SHIELD] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
+ [MOVE_KINGS_SHIELD] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_INSTRUCT,
[MOVE_LIFE_DEW] = FORBIDDEN_METRONOME,
[MOVE_LIGHT_OF_RUIN] = FORBIDDEN_METRONOME,
[MOVE_MAT_BLOCK] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
- [MOVE_ME_FIRST] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK,
- [MOVE_METEOR_ASSAULT] = FORBIDDEN_METRONOME,
- [MOVE_METRONOME] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK,
- [MOVE_MIMIC] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_MIMIC | FORBIDDEN_SLEEP_TALK,
+ [MOVE_ME_FIRST] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
+ [MOVE_METEOR_ASSAULT] = FORBIDDEN_METRONOME | FORBIDDEN_INSTRUCT,
+ [MOVE_METEOR_BEAM] = FORBIDDEN_INSTRUCT,
+ [MOVE_METRONOME] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
+ [MOVE_MIMIC] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_MIMIC | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
[MOVE_MIND_BLOWN] = FORBIDDEN_METRONOME,
[MOVE_MIRROR_COAT] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
- [MOVE_MIRROR_MOVE] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK,
+ [MOVE_MIRROR_MOVE] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
[MOVE_MOONGEIST_BEAM] = FORBIDDEN_METRONOME,
- [MOVE_NATURE_POWER] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK,
+ [MOVE_NATURE_POWER] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
[MOVE_NATURES_MADNESS] = FORBIDDEN_METRONOME,
- [MOVE_OBSTRUCT] = FORBIDDEN_METRONOME | FORBIDDEN_COPYCAT,
+ [MOVE_OBSTRUCT] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_INSTRUCT,
[MOVE_ORIGIN_PULSE] = FORBIDDEN_METRONOME,
+ [MOVE_OUTRAGE] = FORBIDDEN_INSTRUCT,
[MOVE_OVERDRIVE] = FORBIDDEN_METRONOME,
- [MOVE_PHANTOM_FORCE] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK,
+ [MOVE_PETAL_DANCE] = FORBIDDEN_INSTRUCT,
+ [MOVE_PHANTOM_FORCE] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
[MOVE_PHOTON_GEYSER] = FORBIDDEN_METRONOME,
[MOVE_PIKA_PAPOW] = FORBIDDEN_METRONOME,
[MOVE_PLASMA_FISTS] = FORBIDDEN_METRONOME,
[MOVE_PRECIPICE_BLADES] = FORBIDDEN_METRONOME,
+ [MOVE_PRISMATIC_LASER] = FORBIDDEN_INSTRUCT,
[MOVE_PROTECT] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
[MOVE_PYRO_BALL] = FORBIDDEN_METRONOME,
[MOVE_QUASH] = FORBIDDEN_METRONOME,
[MOVE_QUICK_GUARD] = FORBIDDEN_METRONOME,
[MOVE_RAGE_POWDER] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
- [MOVE_RAZOR_WIND] = FORBIDDEN_SLEEP_TALK,
+ [MOVE_RAZOR_WIND] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
[MOVE_RELIC_SONG] = FORBIDDEN_METRONOME,
[MOVE_ROAR] = FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
+ [MOVE_ROAR_OF_TIME] = FORBIDDEN_INSTRUCT,
+ [MOVE_ROCK_WRECKER] = FORBIDDEN_INSTRUCT,
+ [MOVE_ROLLOUT] = FORBIDDEN_INSTRUCT,
[MOVE_SAPPY_SEED] = FORBIDDEN_METRONOME,
[MOVE_SECRET_SWORD] = FORBIDDEN_METRONOME,
- [MOVE_SHADOW_FORCE] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK,
- [MOVE_SHELL_TRAP] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK,
+ [MOVE_SHADOW_FORCE] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
+ [MOVE_SHELL_TRAP] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
[MOVE_SIZZLY_SLIDE] = FORBIDDEN_METRONOME,
- [MOVE_SKETCH] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_MIMIC | FORBIDDEN_SLEEP_TALK,
- [MOVE_SKULL_BASH] = FORBIDDEN_SLEEP_TALK,
- [MOVE_SKY_ATTACK] = FORBIDDEN_SLEEP_TALK,
- [MOVE_SKY_DROP] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK,
- [MOVE_SLEEP_TALK] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK,
+ [MOVE_SKETCH] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_MIMIC | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
+ [MOVE_SKULL_BASH] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
+ [MOVE_SKY_ATTACK] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
+ [MOVE_SKY_DROP] = FORBIDDEN_ASSIST | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
+ [MOVE_SLEEP_TALK] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
[MOVE_SNAP_TRAP] = FORBIDDEN_METRONOME,
[MOVE_SNARL] = FORBIDDEN_METRONOME,
- [MOVE_SNATCH] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
+ [MOVE_SNATCH] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_INSTRUCT,
[MOVE_SNORE] = FORBIDDEN_METRONOME,
- [MOVE_SOLAR_BEAM] = FORBIDDEN_SLEEP_TALK,
- [MOVE_SOLAR_BLADE] = FORBIDDEN_SLEEP_TALK,
+ [MOVE_SOLAR_BEAM] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
+ [MOVE_SOLAR_BLADE] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
[MOVE_SPARKLY_SWIRL] = FORBIDDEN_METRONOME,
[MOVE_SPECTRAL_THIEF] = FORBIDDEN_METRONOME,
[MOVE_SPIKY_SHIELD] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
@@ -1056,11 +1068,12 @@ static const u8 sForbiddenMoves[MOVES_COUNT] =
[MOVE_THIEF] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
[MOVE_THOUSAND_ARROWS] = FORBIDDEN_METRONOME,
[MOVE_THOUSAND_WAVES] = FORBIDDEN_METRONOME,
+ [MOVE_THRASH] = FORBIDDEN_INSTRUCT,
[MOVE_THUNDER_CAGE] = FORBIDDEN_METRONOME,
[MOVE_THUNDEROUS_KICK] = FORBIDDEN_METRONOME,
- [MOVE_TRANSFORM] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_MIMIC,
+ [MOVE_TRANSFORM] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT | FORBIDDEN_MIMIC | FORBIDDEN_INSTRUCT,
[MOVE_TRICK] = FORBIDDEN_METRONOME | FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
- [MOVE_UPROAR] = FORBIDDEN_SLEEP_TALK,
+ [MOVE_UPROAR] = FORBIDDEN_SLEEP_TALK | FORBIDDEN_INSTRUCT,
[MOVE_V_CREATE] = FORBIDDEN_METRONOME,
[MOVE_VEEVEE_VOLLEY] = FORBIDDEN_METRONOME,
[MOVE_WHIRLWIND] = FORBIDDEN_ASSIST | FORBIDDEN_COPYCAT,
@@ -1069,43 +1082,6 @@ static const u8 sForbiddenMoves[MOVES_COUNT] =
[MOVE_ZIPPY_ZAP] = FORBIDDEN_METRONOME,
};
-static const u16 sMoveEffectsForbiddenToInstruct[] =
-{
- EFFECT_ASSIST,
- //EFFECT_BEAK_BLAST,
- EFFECT_BELCH,
- EFFECT_BIDE,
- //EFFECT_CELEBRATE,
- //EFFECT_CHATTER,
- EFFECT_COPYCAT,
- //EFFECT_DYNAMAX_CANNON,
- EFFECT_FOCUS_PUNCH,
- EFFECT_GEOMANCY,
- //EFFECT_HOLD_HANDS,
- EFFECT_INSTRUCT,
- EFFECT_ME_FIRST,
- EFFECT_METRONOME,
- EFFECT_MIMIC,
- EFFECT_MIRROR_MOVE,
- EFFECT_NATURE_POWER,
- //EFFECT_OBSTRUCT,
- EFFECT_RAMPAGE,
- EFFECT_RECHARGE,
- EFFECT_RECOIL_25,
- EFFECT_ROLLOUT,
- EFFECT_SEMI_INVULNERABLE,
- //EFFECT_SHELL_TRAP,
- EFFECT_SKETCH,
- //EFFECT_SKY_DROP,
- EFFECT_SKULL_BASH,
- EFFECT_SLEEP_TALK,
- EFFECT_SOLAR_BEAM,
- EFFECT_TRANSFORM,
- EFFECT_TWO_TURNS_ATTACK,
- EFFECT_UPROAR,
- FORBIDDEN_INSTRUCT_END
-};
-
static const u16 sNaturePowerMoves[BATTLE_TERRAIN_COUNT] =
{
#if B_NATURE_POWER_MOVES >= GEN_7
@@ -1377,6 +1353,7 @@ static bool32 TryAegiFormChange(void)
static void Cmd_attackcanceler(void)
{
s32 i, moveType;
+ u16 attackerAbility = GetBattlerAbility(gBattlerAttacker);
GET_MOVE_TYPE(gCurrentMove, moveType);
@@ -1419,7 +1396,7 @@ static void Cmd_attackcanceler(void)
return;
// Check Protean activation.
- if ((GetBattlerAbility(gBattlerAttacker) == ABILITY_PROTEAN || GetBattlerAbility(gBattlerAttacker) == ABILITY_LIBERO)
+ if ((attackerAbility == ABILITY_PROTEAN || attackerAbility == ABILITY_LIBERO)
&& (gBattleMons[gBattlerAttacker].type1 != moveType || gBattleMons[gBattlerAttacker].type2 != moveType ||
(gBattleMons[gBattlerAttacker].type3 != moveType && gBattleMons[gBattlerAttacker].type3 != TYPE_MYSTERY))
&& gCurrentMove != MOVE_STRUGGLE)
@@ -1428,6 +1405,8 @@ static void Cmd_attackcanceler(void)
SET_BATTLER_TYPE(gBattlerAttacker, moveType);
gBattlerAbility = gBattlerAttacker;
BattleScriptPushCursor();
+ PrepareStringBattle(STRINGID_EMPTYSTRING3, gBattlerAttacker);
+ gBattleCommunication[MSG_DISPLAY] = 1;
gBattlescriptCurrInstr = BattleScript_ProteanActivates;
return;
}
@@ -1617,13 +1596,15 @@ static bool32 AccuracyCalcHelper(u16 move)
JumpIfMoveFailed(7, move);
return TRUE;
}
- else if (GetBattlerAbility(gBattlerAttacker) == ABILITY_NO_GUARD)
+ // If the attacker has the ability No Guard and they aren't targeting a Pokemon involved in a Sky Drop with the move Sky Drop, move hits.
+ else if (GetBattlerAbility(gBattlerAttacker) == ABILITY_NO_GUARD && (move != MOVE_SKY_DROP || gBattleStruct->skyDropTargets[gBattlerTarget] == 0xFF))
{
if (!JumpIfMoveFailed(7, move))
RecordAbilityBattle(gBattlerAttacker, ABILITY_NO_GUARD);
return TRUE;
}
- else if (GetBattlerAbility(gBattlerTarget) == ABILITY_NO_GUARD)
+ // If the target has the ability No Guard and they aren't involved in a Sky Drop or the current move isn't Sky Drop, move hits.
+ else if (GetBattlerAbility(gBattlerTarget) == ABILITY_NO_GUARD && (move != MOVE_SKY_DROP || gBattleStruct->skyDropTargets[gBattlerTarget] == 0xFF))
{
if (!JumpIfMoveFailed(7, move))
RecordAbilityBattle(gBattlerTarget, ABILITY_NO_GUARD);
@@ -1631,8 +1612,7 @@ static bool32 AccuracyCalcHelper(u16 move)
}
if ((gStatuses3[gBattlerTarget] & STATUS3_PHANTOM_FORCE)
- || (!(gBattleMoves[move].flags & FLAG_DMG_IN_AIR) && gStatuses3[gBattlerTarget] & STATUS3_ON_AIR)
- || (!(gBattleMoves[move].flags & FLAG_DMG_2X_IN_AIR) && gStatuses3[gBattlerTarget] & STATUS3_ON_AIR)
+ || (!(gBattleMoves[move].flags & (FLAG_DMG_IN_AIR | FLAG_DMG_2X_IN_AIR)) && gStatuses3[gBattlerTarget] & STATUS3_ON_AIR)
|| (!(gBattleMoves[move].flags & FLAG_DMG_UNDERGROUND) && gStatuses3[gBattlerTarget] & STATUS3_UNDERGROUND)
|| (!(gBattleMoves[move].flags & FLAG_DMG_UNDERWATER) && gStatuses3[gBattlerTarget] & STATUS3_UNDERWATER))
{
@@ -2637,6 +2617,7 @@ void SetMoveEffect(bool32 primary, u32 certain)
bool32 statusChanged = FALSE;
bool32 mirrorArmorReflected = (GetBattlerAbility(gBattlerTarget) == ABILITY_MIRROR_ARMOR);
u32 flags = 0;
+ u16 battlerAbility;
switch (gBattleScripting.moveEffect) // Set move effects which happen later on
{
@@ -2659,10 +2640,12 @@ void SetMoveEffect(bool32 primary, u32 certain)
gBattleScripting.battler = gBattlerAttacker;
}
+ battlerAbility = GetBattlerAbility(gEffectBattler);
+
// Just in case this flag is still set
gBattleScripting.moveEffect &= ~MOVE_EFFECT_CERTAIN;
- if (GetBattlerAbility(gEffectBattler) == ABILITY_SHIELD_DUST && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD)
+ if (battlerAbility == ABILITY_SHIELD_DUST && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD)
&& !primary && gBattleScripting.moveEffect <= 9)
INCREMENT_RESET_RETURN
@@ -2687,7 +2670,7 @@ void SetMoveEffect(bool32 primary, u32 certain)
{
case STATUS1_SLEEP:
// check active uproar
- if (GetBattlerAbility(gEffectBattler) != ABILITY_SOUNDPROOF)
+ if (battlerAbility != ABILITY_SOUNDPROOF)
{
for (gActiveBattler = 0;
gActiveBattler < gBattlersCount && !(gBattleMons[gActiveBattler].status2 & STATUS2_UPROAR);
@@ -2706,7 +2689,7 @@ void SetMoveEffect(bool32 primary, u32 certain)
statusChanged = TRUE;
break;
case STATUS1_POISON:
- if (GetBattlerAbility(gEffectBattler) == ABILITY_IMMUNITY
+ if (battlerAbility == ABILITY_IMMUNITY
&& (primary == TRUE || certain == MOVE_EFFECT_CERTAIN))
{
gLastUsedAbility = ABILITY_IMMUNITY;
@@ -2745,11 +2728,11 @@ void SetMoveEffect(bool32 primary, u32 certain)
if (gCurrentMove == MOVE_BURNING_JEALOUSY && !gProtectStructs[gEffectBattler].statRaised)
break;
- if ((GetBattlerAbility(gEffectBattler) == ABILITY_WATER_VEIL || GetBattlerAbility(gEffectBattler) == ABILITY_WATER_BUBBLE)
+ if ((battlerAbility == ABILITY_WATER_VEIL || battlerAbility == ABILITY_WATER_BUBBLE)
&& (primary == TRUE || certain == MOVE_EFFECT_CERTAIN))
{
- gLastUsedAbility = GetBattlerAbility(gEffectBattler);
- RecordAbilityBattle(gEffectBattler, GetBattlerAbility(gEffectBattler));
+ gLastUsedAbility = battlerAbility;
+ RecordAbilityBattle(gEffectBattler, battlerAbility);
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = BattleScript_BRNPrevention;
@@ -2788,7 +2771,7 @@ void SetMoveEffect(bool32 primary, u32 certain)
statusChanged = TRUE;
break;
case STATUS1_PARALYSIS:
- if (GetBattlerAbility(gEffectBattler) == ABILITY_LIMBER)
+ if (battlerAbility == ABILITY_LIMBER)
{
if (primary == TRUE || certain == MOVE_EFFECT_CERTAIN)
{
@@ -2830,7 +2813,7 @@ void SetMoveEffect(bool32 primary, u32 certain)
statusChanged = TRUE;
break;
case STATUS1_TOXIC_POISON:
- if (GetBattlerAbility(gEffectBattler) == ABILITY_IMMUNITY && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN))
+ if (battlerAbility == ABILITY_IMMUNITY && (primary == TRUE || certain == MOVE_EFFECT_CERTAIN))
{
gLastUsedAbility = ABILITY_IMMUNITY;
RecordAbilityBattle(gEffectBattler, ABILITY_IMMUNITY);
@@ -2939,13 +2922,24 @@ void SetMoveEffect(bool32 primary, u32 certain)
else
{
gBattleMons[gEffectBattler].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2); // 2-5 turns
-
- BattleScriptPush(gBattlescriptCurrInstr + 1);
- gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleScripting.moveEffect];
+
+ // If the confusion is activating due to being released from Sky Drop, go to "confused due to fatigue" script.
+ // Otherwise, do normal confusion script.
+ if(gCurrentMove == MOVE_SKY_DROP)
+ {
+ gBattleMons[gEffectBattler].status2 &= ~(STATUS2_LOCK_CONFUSE);
+ gBattlerAttacker = gEffectBattler;
+ gBattlescriptCurrInstr = BattleScript_ThrashConfuses;
+ }
+ else
+ {
+ BattleScriptPush(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleScripting.moveEffect];
+ }
}
break;
case MOVE_EFFECT_FLINCH:
- if (GetBattlerAbility(gEffectBattler) == ABILITY_INNER_FOCUS)
+ if (battlerAbility == ABILITY_INNER_FOCUS)
{
gBattlescriptCurrInstr++;
}
@@ -3205,11 +3199,7 @@ void SetMoveEffect(bool32 primary, u32 certain)
gBattlescriptCurrInstr++;
break;
case MOVE_EFFECT_ALL_STATS_UP:
- if (NoAliveMonsForEitherParty())
- {
- gBattlescriptCurrInstr++;
- }
- else
+ if (!NoAliveMonsForEitherParty())
{
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = BattleScript_AllStatsUp;
@@ -3248,12 +3238,18 @@ void SetMoveEffect(bool32 primary, u32 certain)
}
break;
case MOVE_EFFECT_ATK_DEF_DOWN: // SuperPower
- BattleScriptPush(gBattlescriptCurrInstr + 1);
- gBattlescriptCurrInstr = BattleScript_AtkDefDown;
+ if (!NoAliveMonsForEitherParty())
+ {
+ BattleScriptPush(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = BattleScript_AtkDefDown;
+ }
break;
case MOVE_EFFECT_DEF_SPDEF_DOWN: // Close Combat
- BattleScriptPush(gBattlescriptCurrInstr + 1);
- gBattlescriptCurrInstr = BattleScript_DefSpDefDown;
+ if (!NoAliveMonsForEitherParty())
+ {
+ BattleScriptPush(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = BattleScript_DefSpDefDown;
+ }
break;
case MOVE_EFFECT_RECOIL_25: // Take Down, 25% recoil
gBattleMoveDamage = (gHpDealt) / 4;
@@ -3308,8 +3304,11 @@ void SetMoveEffect(bool32 primary, u32 certain)
}
break;
case MOVE_EFFECT_SP_ATK_TWO_DOWN: // Overheat
- BattleScriptPush(gBattlescriptCurrInstr + 1);
- gBattlescriptCurrInstr = BattleScript_SAtkDown2;
+ if (!NoAliveMonsForEitherParty())
+ {
+ BattleScriptPush(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = BattleScript_SAtkDown2;
+ }
break;
case MOVE_EFFECT_CLEAR_SMOG:
for (i = 0; i < NUM_BATTLE_STATS; i++)
@@ -3369,51 +3368,58 @@ void SetMoveEffect(bool32 primary, u32 certain)
}
break;
case MOVE_EFFECT_SPECTRAL_THIEF:
- gBattleStruct->stolenStats[0] = 0; // Stats to steal.
- gBattleScripting.animArg1 = 0;
- for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++)
+ if (!NoAliveMonsForEitherParty())
{
- if (gBattleMons[gBattlerTarget].statStages[i] > DEFAULT_STAT_STAGE && gBattleMons[gBattlerAttacker].statStages[i] != MAX_STAT_STAGE)
+ gBattleStruct->stolenStats[0] = 0; // Stats to steal.
+ gBattleScripting.animArg1 = 0;
+ for (i = STAT_ATK; i < NUM_BATTLE_STATS; i++)
{
- gBattleStruct->stolenStats[0] |= gBitTable[i];
- // Store by how many stages to raise the stat.
- gBattleStruct->stolenStats[i] = gBattleMons[gBattlerTarget].statStages[i] - DEFAULT_STAT_STAGE;
- while (gBattleMons[gBattlerAttacker].statStages[i] + gBattleStruct->stolenStats[i] > MAX_STAT_STAGE)
- gBattleStruct->stolenStats[i]--;
- gBattleMons[gBattlerTarget].statStages[i] = DEFAULT_STAT_STAGE;
-
- if (gBattleStruct->stolenStats[i] >= 2)
- byTwo++;
-
- if (gBattleScripting.animArg1 == 0)
+ if (gBattleMons[gBattlerTarget].statStages[i] > DEFAULT_STAT_STAGE && gBattleMons[gBattlerAttacker].statStages[i] != MAX_STAT_STAGE)
{
- if (byTwo)
- gBattleScripting.animArg1 = STAT_ANIM_PLUS2 - 1 + i;
+ gBattleStruct->stolenStats[0] |= gBitTable[i];
+ // Store by how many stages to raise the stat.
+ gBattleStruct->stolenStats[i] = gBattleMons[gBattlerTarget].statStages[i] - DEFAULT_STAT_STAGE;
+ while (gBattleMons[gBattlerAttacker].statStages[i] + gBattleStruct->stolenStats[i] > MAX_STAT_STAGE)
+ gBattleStruct->stolenStats[i]--;
+ gBattleMons[gBattlerTarget].statStages[i] = DEFAULT_STAT_STAGE;
+
+ if (gBattleStruct->stolenStats[i] >= 2)
+ byTwo++;
+
+ if (gBattleScripting.animArg1 == 0)
+ {
+ if (byTwo)
+ gBattleScripting.animArg1 = STAT_ANIM_PLUS2 - 1 + i;
+ else
+ gBattleScripting.animArg1 = STAT_ANIM_PLUS1 - 1 + i;
+ }
else
- gBattleScripting.animArg1 = STAT_ANIM_PLUS1 - 1 + i;
- }
- else
- {
- if (byTwo)
- gBattleScripting.animArg1 = STAT_ANIM_MULTIPLE_PLUS2;
- else
- gBattleScripting.animArg1 = STAT_ANIM_MULTIPLE_PLUS1;
+ {
+ if (byTwo)
+ gBattleScripting.animArg1 = STAT_ANIM_MULTIPLE_PLUS2;
+ else
+ gBattleScripting.animArg1 = STAT_ANIM_MULTIPLE_PLUS1;
+ }
}
}
- }
- if (gBattleStruct->stolenStats[0] != 0)
- {
- BattleScriptPush(gBattlescriptCurrInstr + 1);
- gBattlescriptCurrInstr = BattleScript_SpectralThiefSteal;
+ if (gBattleStruct->stolenStats[0] != 0)
+ {
+ BattleScriptPush(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = BattleScript_SpectralThiefSteal;
+ }
}
break;
case MOVE_EFFECT_V_CREATE:
- BattleScriptPush(gBattlescriptCurrInstr + 1);
- gBattlescriptCurrInstr = BattleScript_VCreateStatLoss;
+ if (!NoAliveMonsForEitherParty())
+ {
+ BattleScriptPush(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = BattleScript_VCreateStatLoss;
+ }
break;
case MOVE_EFFECT_CORE_ENFORCER:
- if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget))
+ if (GetBattlerTurnOrderNum(gBattlerAttacker) > GetBattlerTurnOrderNum(gBattlerTarget)
+ && !NoAliveMonsForEitherParty())
{
BattleScriptPush(gBattlescriptCurrInstr + 1);
gBattlescriptCurrInstr = BattleScript_MoveEffectCoreEnforcer;
@@ -3440,7 +3446,7 @@ void SetMoveEffect(bool32 primary, u32 certain)
break;
case MOVE_EFFECT_BUG_BITE:
if (ItemId_GetPocket(gBattleMons[gEffectBattler].item) == POCKET_BERRIES
- && GetBattlerAbility(gEffectBattler) != ABILITY_STICKY_HOLD)
+ && battlerAbility != ABILITY_STICKY_HOLD)
{
// target loses their berry
gLastUsedItem = gBattleMons[gEffectBattler].item;
@@ -3930,7 +3936,8 @@ static void Cmd_getexp(void)
gBattleScripting.getexpState = 5;
gBattleMoveDamage = 0; // used for exp
}
- else if (GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_LEVEL) == MAX_LEVEL)
+ else if ((gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gBattleStruct->expGetterMonId >= 3)
+ || GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_LEVEL) == MAX_LEVEL)
{
*(&gBattleStruct->sentInPokes) >>= 1;
gBattleScripting.getexpState = 5;
@@ -4122,6 +4129,28 @@ static void Cmd_getexp(void)
}
}
+#if B_MULTI_BATTLE_WHITEOUT >= GEN_4
+static bool32 NoAliveMonsForPlayerAndPartner(void)
+{
+ u32 i;
+ u32 HP_count = 0;
+
+ if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && (gPartnerTrainerId == TRAINER_STEVEN_PARTNER || gPartnerTrainerId >= TRAINER_CUSTOM_PARTNER))
+ {
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)
+ && (!(gBattleTypeFlags & BATTLE_TYPE_ARENA) || !(gBattleStruct->arenaLostPlayerMons & gBitTable[i])))
+ {
+ HP_count += GetMonData(&gPlayerParty[i], MON_DATA_HP);
+ }
+ }
+ }
+
+ return (HP_count == 0);
+}
+#endif
+
static bool32 NoAliveMonsForPlayer(void)
{
u32 i;
@@ -4183,8 +4212,21 @@ static void Cmd_checkteamslost(void)
if (gBattleControllerExecFlags)
return;
+#if B_MULTI_BATTLE_WHITEOUT >= GEN_4
+ if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER))
+ {
+ if (NoAliveMonsForPlayerAndPartner())
+ gBattleOutcome |= B_OUTCOME_LOST;
+ }
+ else
+ {
+ if (NoAliveMonsForPlayer())
+ gBattleOutcome |= B_OUTCOME_LOST;
+ }
+#else
if (NoAliveMonsForPlayer())
gBattleOutcome |= B_OUTCOME_LOST;
+#endif
if (NoAliveMonsForOpponent())
gBattleOutcome |= B_OUTCOME_WON;
@@ -4688,7 +4730,7 @@ static void Cmd_playanimation(void)
}
}
-// Same as playanimation, expect it takes a pointer to some animation id, instead of taking the value directly
+// Same as playanimation, except it takes a pointer to some animation id, instead of taking the value directly
static void Cmd_playanimation_var(void)
{
const u16* argumentPtr;
@@ -5150,6 +5192,33 @@ static void Cmd_moveend(void)
}
gBattleScripting.moveendState++;
break;
+ case MOVEEND_SKY_DROP_CONFUSE: // If a Pokemon was released from Sky Drop and was in LOCK_CONFUSE, go to "confused due to fatigue" scripts and clear Sky Drop data.
+ for (i = 0; i < gBattlersCount; i++)
+ {
+ if (gBattleStruct->skyDropTargets[i] == 0xFE)
+ {
+ u8 targetId;
+ // Find the battler id of the Pokemon that was held by Sky Drop
+ for (targetId = 0; targetId < gBattlersCount; targetId++)
+ {
+ if (gBattleStruct->skyDropTargets[targetId] == i)
+ break;
+ }
+
+ // Set gBattlerAttacker to the battler id of the target
+ gBattlerAttacker = targetId;
+
+ // Jump to "confused due to fatigue" script
+ gBattlescriptCurrInstr = BattleScript_ThrashConfuses;
+
+ // Clear skyDropTargets data
+ gBattleStruct->skyDropTargets[i] = 0xFF;
+ gBattleStruct->skyDropTargets[targetId] = 0xFF;
+ return;
+ }
+ }
+ gBattleScripting.moveendState++;
+ break;
case MOVEEND_UPDATE_LAST_MOVES:
if (gMoveResultFlags & (MOVE_RESULT_FAILED | MOVE_RESULT_DOESNT_AFFECT_FOE))
gBattleStruct->lastMoveFailed |= gBitTable[gBattlerAttacker];
@@ -5225,6 +5294,29 @@ static void Cmd_moveend(void)
}
gBattleScripting.moveendState++;
break;
+ case MOVEEND_MAGICIAN:
+ if (GetBattlerAbility(gBattlerAttacker) == ABILITY_MAGICIAN
+ && gCurrentMove != MOVE_FLING && gCurrentMove != MOVE_NATURAL_GIFT
+ && gBattleMons[gBattlerAttacker].item == ITEM_NONE
+ && gBattleMons[gBattlerTarget].item != ITEM_NONE
+ && IsBattlerAlive(gBattlerAttacker)
+ && TARGET_TURN_DAMAGED
+ && CanStealItem(gBattlerAttacker, gBattlerTarget, gBattleMons[gBattlerTarget].item)
+ && !gSpecialStatuses[gBattlerAttacker].gemBoost // In base game, gems are consumed after magician would activate.
+ && !(gWishFutureKnock.knockedOffMons[GetBattlerSide(gBattlerTarget)] & gBitTable[gBattlerPartyIndexes[gBattlerTarget]])
+ && !DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)
+ && !(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
+ && (GetBattlerAbility(gBattlerTarget) != ABILITY_STICKY_HOLD || !IsBattlerAlive(gBattlerTarget)))
+ {
+ StealTargetItem(gBattlerAttacker, gBattlerTarget);
+ gBattleScripting.battler = gBattlerAbility = gBattlerAttacker;
+ gEffectBattler = gBattlerTarget;
+ BattleScriptPushCursor();
+ gBattlescriptCurrInstr = BattleScript_MagicianActivates;
+ effect = TRUE;
+ }
+ gBattleScripting.moveendState++;
+ break;
case MOVEEND_NEXT_TARGET: // For moves hitting two opposing Pokemon.
// Set a flag if move hits either target (for throat spray that can't check damage)
if (!(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE)
@@ -5258,7 +5350,7 @@ static void Cmd_moveend(void)
if (IsBattlerAlive(battlerId))
{
- gBattlerTarget = battlerId;
+ gBattleStruct->moveTarget[gBattlerAttacker] = gBattlerTarget = battlerId; // Fix for moxie spread moves
gBattleScripting.moveendState = 0;
MoveValuesCleanUp();
gBattleScripting.moveEffect = gBattleScripting.savedMoveEffect;
@@ -6187,6 +6279,9 @@ static void Cmd_switchineffects(void)
gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler);
gSpecialStatuses[gActiveBattler].faintedHasReplacement = FALSE;
+ if (!IsBattlerAIControlled(gActiveBattler))
+ gBattleStruct->appearedInBattle |= gBitTable[gBattlerPartyIndexes[gActiveBattler]];
+
// Neutralizing Gas announces itself before hazards
if (gBattleMons[gActiveBattler].ability == ABILITY_NEUTRALIZING_GAS && gSpecialStatuses[gActiveBattler].announceNeutralizingGas == 0)
{
@@ -7705,10 +7800,11 @@ static void Cmd_various(void)
}
return;
case VARIOUS_GRAVITY_ON_AIRBORNE_MONS:
- if (gStatuses3[gActiveBattler] & STATUS3_ON_AIR)
+ // Cancel all multiturn moves of IN_AIR Pokemon except those being targeted by Sky Drop.
+ if (gStatuses3[gActiveBattler] & STATUS3_ON_AIR && !(gStatuses3[gActiveBattler] & STATUS3_SKY_DROPPED))
CancelMultiTurnMoves(gActiveBattler);
- gStatuses3[gActiveBattler] &= ~(STATUS3_MAGNET_RISE | STATUS3_TELEKINESIS | STATUS3_ON_AIR);
+ gStatuses3[gActiveBattler] &= ~(STATUS3_MAGNET_RISE | STATUS3_TELEKINESIS | STATUS3_ON_AIR | STATUS3_SKY_DROPPED);
break;
case VARIOUS_SPECTRAL_THIEF:
// Raise stats
@@ -7967,9 +8063,12 @@ static void Cmd_various(void)
MarkBattlerForControllerExec(gActiveBattler);
break;
case VARIOUS_TRY_ACTIVATE_MOXIE: // and chilling neigh + as one ice rider
- if ((GetBattlerAbility(gActiveBattler) == ABILITY_MOXIE
- || GetBattlerAbility(gActiveBattler) == ABILITY_CHILLING_NEIGH
- || GetBattlerAbility(gActiveBattler) == ABILITY_AS_ONE_ICE_RIDER)
+ {
+ u16 battlerAbility = GetBattlerAbility(gActiveBattler);
+
+ if ((battlerAbility == ABILITY_MOXIE
+ || battlerAbility == ABILITY_CHILLING_NEIGH
+ || battlerAbility == ABILITY_AS_ONE_ICE_RIDER)
&& HasAttackerFaintedTarget()
&& !NoAliveMonsForEitherParty()
&& CompareStat(gBattlerAttacker, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN))
@@ -7978,16 +8077,20 @@ static void Cmd_various(void)
SET_STATCHANGER(STAT_ATK, 1, FALSE);
PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK);
BattleScriptPush(gBattlescriptCurrInstr + 3);
- gLastUsedAbility = GetBattlerAbility(gActiveBattler);
- if (GetBattlerAbility(gActiveBattler) == ABILITY_AS_ONE_ICE_RIDER)
+ gLastUsedAbility = battlerAbility;
+ if (battlerAbility == ABILITY_AS_ONE_ICE_RIDER)
gBattleScripting.abilityPopupOverwrite = gLastUsedAbility = ABILITY_CHILLING_NEIGH;
gBattlescriptCurrInstr = BattleScript_RaiseStatOnFaintingTarget;
return;
}
+ }
break;
case VARIOUS_TRY_ACTIVATE_GRIM_NEIGH: // and as one shadow rider
- if ((GetBattlerAbility(gActiveBattler) == ABILITY_GRIM_NEIGH
- || GetBattlerAbility(gActiveBattler) == ABILITY_AS_ONE_SHADOW_RIDER)
+ {
+ u16 battlerAbility = GetBattlerAbility(gActiveBattler);
+
+ if ((battlerAbility == ABILITY_GRIM_NEIGH
+ || battlerAbility == ABILITY_AS_ONE_SHADOW_RIDER)
&& HasAttackerFaintedTarget()
&& !NoAliveMonsForEitherParty()
&& CompareStat(gBattlerAttacker, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN))
@@ -7996,12 +8099,13 @@ static void Cmd_various(void)
SET_STATCHANGER(STAT_SPATK, 1, FALSE);
PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPATK);
BattleScriptPush(gBattlescriptCurrInstr + 3);
- gLastUsedAbility = GetBattlerAbility(gActiveBattler);
- if (GetBattlerAbility(gActiveBattler) == ABILITY_AS_ONE_SHADOW_RIDER)
+ gLastUsedAbility = battlerAbility;
+ if (battlerAbility == ABILITY_AS_ONE_SHADOW_RIDER)
gBattleScripting.abilityPopupOverwrite = gLastUsedAbility = ABILITY_GRIM_NEIGH;
gBattlescriptCurrInstr = BattleScript_RaiseStatOnFaintingTarget;
return;
}
+ }
break;
case VARIOUS_TRY_ACTIVATE_RECEIVER: // Partner gets fainted's ally ability
gBattlerAbility = BATTLE_PARTNER(gActiveBattler);
@@ -8479,13 +8583,8 @@ static void Cmd_various(void)
}
return;
case VARIOUS_TRY_INSTRUCT:
- for (i = 0; sMoveEffectsForbiddenToInstruct[i] != FORBIDDEN_INSTRUCT_END; i++)
- {
- if (sMoveEffectsForbiddenToInstruct[i] == gBattleMoves[gLastMoves[gBattlerTarget]].effect)
- break;
- }
- if (gLastMoves[gBattlerTarget] == 0 || gLastMoves[gBattlerTarget] == 0xFFFF || sMoveEffectsForbiddenToInstruct[i] != FORBIDDEN_INSTRUCT_END
- || gLastMoves[gBattlerTarget] == MOVE_STRUGGLE || gLastMoves[gBattlerTarget] == MOVE_KINGS_SHIELD)
+ if ((sForbiddenMoves[gLastMoves[gBattlerTarget]] & FORBIDDEN_INSTRUCT)
+ || gLastMoves[gBattlerTarget] == 0xFFFF)
{
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3);
}
@@ -8557,94 +8656,25 @@ static void Cmd_various(void)
gBattlescriptCurrInstr += 4;
return;
case VARIOUS_PSYCHO_SHIFT:
- i = TRUE;
- if (gBattleMons[gBattlerAttacker].status1 & STATUS1_PARALYSIS)
+ {
+ if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_PARALYSIS && !CanBeParalyzed(gBattlerTarget))
+ || (gBattleMons[gBattlerAttacker].status1 & STATUS1_PSN_ANY && !CanBePoisoned(gBattlerAttacker, gBattlerTarget))
+ || (gBattleMons[gBattlerAttacker].status1 & STATUS1_BURN && !CanBeBurned(gBattlerTarget))
+ || (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP && !CanSleep(gBattlerTarget)))
{
- if (GetBattlerAbility(gBattlerTarget) == ABILITY_LIMBER)
- {
- gBattlerAbility = gBattlerTarget;
- BattleScriptPush(T1_READ_PTR(gBattlescriptCurrInstr + 3));
- gBattlescriptCurrInstr = BattleScript_PRLZPrevention;
- i = FALSE;
- }
- else if (IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_ELECTRIC))
- {
- BattleScriptPush(T1_READ_PTR(gBattlescriptCurrInstr + 3));
- gBattlescriptCurrInstr = BattleScript_PRLZPrevention;
- i = FALSE;
- }
- else
- {
- gBattleCommunication[MULTISTRING_CHOOSER] = 3;
- }
+ // fails
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3);
}
- else if (gBattleMons[gBattlerAttacker].status1 & STATUS1_PSN_ANY)
- {
- if (GetBattlerAbility(gBattlerTarget) == ABILITY_IMMUNITY)
- {
- gBattlerAbility = gBattlerTarget;
- BattleScriptPush(T1_READ_PTR(gBattlescriptCurrInstr + 3));
- gBattlescriptCurrInstr = BattleScript_PSNPrevention;
- i = FALSE;
- }
- else if (IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_POISON) || IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_STEEL))
- {
- BattleScriptPush(T1_READ_PTR(gBattlescriptCurrInstr + 3));
- gBattlescriptCurrInstr = BattleScript_PSNPrevention;
- i = FALSE;
- }
- else
- {
- if (gBattleMons[gBattlerAttacker].status1 & STATUS1_POISON)
- gBattleCommunication[MULTISTRING_CHOOSER] = 0;
- else
- gBattleCommunication[MULTISTRING_CHOOSER] = 1;
- }
- }
- else if (gBattleMons[gBattlerAttacker].status1 & STATUS1_BURN)
- {
- if (GetBattlerAbility(gBattlerTarget) == ABILITY_WATER_VEIL
- || GetBattlerAbility(gBattlerTarget) == ABILITY_WATER_BUBBLE)
- {
- gBattlerAbility = gBattlerTarget;
- BattleScriptPush(T1_READ_PTR(gBattlescriptCurrInstr + 3));
- gBattlescriptCurrInstr = BattleScript_BRNPrevention;
- i = FALSE;
- }
- else if (IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_FIRE))
- {
- BattleScriptPush(T1_READ_PTR(gBattlescriptCurrInstr + 3));
- gBattlescriptCurrInstr = BattleScript_BRNPrevention;
- i = FALSE;
- }
- else
- {
- gBattleCommunication[MULTISTRING_CHOOSER] = 2;
- }
- }
- else if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP)
- {
- if (GetBattlerAbility(gBattlerTarget) == ABILITY_INSOMNIA || GetBattlerAbility(gBattlerTarget) == ABILITY_VITAL_SPIRIT)
- {
- gBattlerAbility = gBattlerTarget;
- // BattleScriptPush(T1_READ_PTR(gBattlescriptCurrInstr + 3));
- // gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3);
- i = FALSE;
- }
- else
- {
- gBattleCommunication[MULTISTRING_CHOOSER] = 4;
- }
- }
-
- if (i == TRUE)
+ else
{
+ // Psycho shift works
gBattleMons[gBattlerTarget].status1 = gBattleMons[gBattlerAttacker].status1 & STATUS1_ANY;
gActiveBattler = gBattlerTarget;
BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1);
MarkBattlerForControllerExec(gActiveBattler);
gBattlescriptCurrInstr += 7;
}
+ }
return;
case VARIOUS_CURE_STATUS:
gBattleMons[gActiveBattler].status1 = 0;
@@ -8917,7 +8947,7 @@ static void Cmd_various(void)
MarkBattlerForControllerExec(gActiveBattler);
}
- if (gBattleMons[gActiveBattler].pp[i] == 0)
+ if (gBattleMons[gActiveBattler].pp[i] == 0 && gBattleStruct->skyDropTargets[gActiveBattler] == 0xFF)
CancelMultiTurnMoves(gActiveBattler);
gBattlescriptCurrInstr += 7; // continue
@@ -8984,6 +9014,71 @@ static void Cmd_various(void)
gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; // remove the terrain
TryToRevertMimicry(); // restore the types of Pokémon with Mimicry
break;
+ case VARIOUS_JUMP_IF_UNDER_200:
+ // If the Pokemon is less than 200 kg, or weighing less than 441 lbs, then Sky Drop will work. Otherwise, it will fail.
+ if (GetPokedexHeightWeight(SpeciesToNationalPokedexNum(gBattleMons[gBattlerTarget].species), 1) < 441)
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3);
+ else
+ gBattlescriptCurrInstr += 7;
+ return;
+ case VARIOUS_SET_SKY_DROP:
+ gStatuses3[gBattlerTarget] |= (STATUS3_SKY_DROPPED | STATUS3_ON_AIR);
+ /* skyDropTargets holds the information of who is in a particular instance of Sky Drop.
+ This is needed in the case that multiple Pokemon use Sky Drop in the same turn or if
+ the target of a Sky Drop faints while in the air.*/
+ gBattleStruct->skyDropTargets[gBattlerAttacker] = gBattlerTarget;
+ gBattleStruct->skyDropTargets[gBattlerTarget] = gBattlerAttacker;
+
+ // End any multiturn effects caused by the target except STATUS2_LOCK_CONFUSE
+ gBattleMons[gBattlerTarget].status2 &= ~(STATUS2_MULTIPLETURNS);
+ gBattleMons[gBattlerTarget].status2 &= ~(STATUS2_UPROAR);
+ gBattleMons[gBattlerTarget].status2 &= ~(STATUS2_BIDE);
+ gDisableStructs[gBattlerTarget].rolloutTimer = 0;
+ gDisableStructs[gBattlerTarget].furyCutterCounter = 0;
+
+ // End any Follow Me/Rage Powder effects caused by the target
+ if (gSideTimers[GetBattlerSide(gBattlerTarget)].followmeTimer != 0 && gSideTimers[GetBattlerSide(gBattlerTarget)].followmeTarget == gBattlerTarget)
+ gSideTimers[GetBattlerSide(gBattlerTarget)].followmeTimer = 0;
+
+ break;
+ case VARIOUS_CLEAR_SKY_DROP:
+ // Check to see if the initial target of this Sky Drop fainted before the 2nd turn of Sky Drop.
+ // If so, make the move fail. If not, clear all of the statuses and continue the move.
+ if (gBattleStruct->skyDropTargets[gBattlerAttacker] == 0xFF)
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3);
+ else
+ {
+ gBattleStruct->skyDropTargets[gBattlerAttacker] = 0xFF;
+ gBattleStruct->skyDropTargets[gBattlerTarget] = 0xFF;
+ gStatuses3[gBattlerTarget] &= ~(STATUS3_SKY_DROPPED | STATUS3_ON_AIR);
+ gBattlescriptCurrInstr += 7;
+ }
+
+ // Confuse target if they were in the middle of Petal Dance/Outrage/Thrash when targeted.
+ if (gBattleMons[gBattlerTarget].status2 & STATUS2_LOCK_CONFUSE)
+ gBattleScripting.moveEffect = (MOVE_EFFECT_CONFUSION | MOVE_EFFECT_CERTAIN);
+ return;
+ case VARIOUS_SKY_DROP_YAWN: // If the mon that's sleeping due to Yawn was holding a Pokemon in Sky Drop, release the target and clear Sky Drop data.
+ if (gBattleStruct->skyDropTargets[gEffectBattler] != 0xFF && !(gStatuses3[gEffectBattler] & STATUS3_SKY_DROPPED))
+ {
+ // Set the target of Sky Drop as gEffectBattler
+ gEffectBattler = gBattleStruct->skyDropTargets[gEffectBattler];
+
+ // Clear skyDropTargets data
+ gBattleStruct->skyDropTargets[gBattleStruct->skyDropTargets[gEffectBattler]] = 0xFF;
+ gBattleStruct->skyDropTargets[gEffectBattler] = 0xFF;
+
+ // If the target was in the middle of Outrage/Thrash/etc. when targeted by Sky Drop, confuse them on release and do proper animation
+ if (gBattleMons[gEffectBattler].status2 & STATUS2_LOCK_CONFUSE && CanBeConfused(gEffectBattler))
+ {
+ gBattleMons[gEffectBattler].status2 &= ~(STATUS2_LOCK_CONFUSE);
+ gBattlerAttacker = gEffectBattler;
+ gBattleMons[gBattlerTarget].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2);
+ gBattlescriptCurrInstr = BattleScript_ThrashConfuses;
+ return;
+ }
+ }
+ break;
case VARIOUS_JUMP_IF_PRANKSTER_BLOCKED:
if (BlocksPrankster(gCurrentMove, gBattlerAttacker, gActiveBattler, TRUE))
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3);
@@ -9302,6 +9397,83 @@ static void Cmd_various(void)
gBattlescriptCurrInstr += 7;
return;
}
+ case VARIOUS_JUMP_IF_CANT_FLING:
+ if (!CanFling(gActiveBattler))
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3);
+ else
+ gBattlescriptCurrInstr += 7;
+ return;
+ case VARIOUS_CURE_CERTAIN_STATUSES:
+ // Check infatuation
+ if (gBattleMons[gActiveBattler].status2 & STATUS2_INFATUATION)
+ {
+ gBattleMons[gActiveBattler].status2 &= ~(STATUS2_INFATUATION);
+ gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_INFATUATION; // STRINGID_TARGETGOTOVERINFATUATION
+ StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn);
+ }
+ // Check taunt
+ if (gDisableStructs[gActiveBattler].tauntTimer != 0)
+ {
+ gDisableStructs[gActiveBattler].tauntTimer = gDisableStructs[gActiveBattler].tauntTimer2 = 0;
+ gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_TAUNT;
+ PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_TAUNT);
+ }
+ // Check encore
+ if (gDisableStructs[gActiveBattler].encoreTimer != 0)
+ {
+ gDisableStructs[gActiveBattler].encoredMove = 0;
+ gDisableStructs[gActiveBattler].encoreTimerStartValue = gDisableStructs[gActiveBattler].encoreTimer = 0;
+ gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_ENCORE; // STRINGID_PKMNENCOREENDED
+ }
+ // Check torment
+ if (gBattleMons[gActiveBattler].status2 & STATUS2_TORMENT)
+ {
+ gBattleMons[gActiveBattler].status2 &= ~(STATUS2_TORMENT);
+ gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_TORMENT;
+ }
+ // Check heal block
+ if (gStatuses3[gActiveBattler] & STATUS3_HEAL_BLOCK)
+ {
+ gStatuses3[gActiveBattler] &= ~(STATUS3_HEAL_BLOCK);
+ gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_HEALBLOCK;
+ }
+ // Check disable
+ if (gDisableStructs[gActiveBattler].disableTimer != 0)
+ {
+ gDisableStructs[gActiveBattler].disableTimer = gDisableStructs[gActiveBattler].disableTimerStartValue = 0;
+ gDisableStructs[gActiveBattler].disabledMove = 0;
+ gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_DISABLE;
+ }
+ gBattlescriptCurrInstr += 3;
+ return;
+ case VARIOUS_TRY_RESET_NEGATIVE_STAT_STAGES:
+ gActiveBattler = gBattlerTarget;
+ for (i = 0; i < NUM_BATTLE_STATS; i++)
+ if (gBattleMons[gActiveBattler].statStages[i] < DEFAULT_STAT_STAGE)
+ gBattleMons[gActiveBattler].statStages[i] = DEFAULT_STAT_STAGE;
+ gBattlescriptCurrInstr += 3;
+ return;
+ case VARIOUS_JUMP_IF_LAST_USED_ITEM_BERRY:
+ if (ItemId_GetPocket(gLastUsedItem) == POCKET_BERRIES)
+ gBattlescriptCurrInstr += 7;
+ else
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3);
+ return;
+ case VARIOUS_JUMP_IF_LAST_USED_ITEM_HOLD_EFFECT:
+ if (ItemId_GetHoldEffect(gLastUsedItem) == gBattlescriptCurrInstr[3])
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 4);
+ else
+ gBattlescriptCurrInstr += 8;
+ return;
+ case VARIOUS_SAVE_BATTLER_ITEM:
+ gBattleResources->battleHistory->heldItems[gActiveBattler] = gBattleMons[gActiveBattler].item;
+ break;
+ case VARIOUS_RESTORE_BATTLER_ITEM:
+ gBattleMons[gActiveBattler].item = gBattleResources->battleHistory->heldItems[gActiveBattler];
+ break;
+ case VARIOUS_BATTLER_ITEM_TO_LAST_USED_ITEM:
+ gBattleMons[gActiveBattler].item = gLastUsedItem;
+ break;
} // End of switch (gBattlescriptCurrInstr[2])
gBattlescriptCurrInstr += 3;
@@ -9902,11 +10074,14 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr
bool32 notProtectAffected = FALSE;
u32 index;
bool32 affectsUser = (flags & MOVE_EFFECT_AFFECTS_USER);
+ u16 activeBattlerAbility;
if (affectsUser)
gActiveBattler = gBattlerAttacker;
else
gActiveBattler = gBattlerTarget;
+
+ activeBattlerAbility = GetBattlerAbility(gActiveBattler);
gSpecialStatuses[gActiveBattler].changedStatsBattlerId = gBattlerAttacker;
@@ -9920,7 +10095,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr
notProtectAffected++;
flags &= ~STAT_BUFF_NOT_PROTECT_AFFECTED;
- if (GetBattlerAbility(gActiveBattler) == ABILITY_CONTRARY)
+ if (activeBattlerAbility == ABILITY_CONTRARY)
{
statValue ^= STAT_BUFF_NEGATIVE;
gBattleScripting.statChanger ^= STAT_BUFF_NEGATIVE;
@@ -9930,7 +10105,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr
gBattleScripting.moveEffect = ReverseStatChangeMoveEffect(gBattleScripting.moveEffect);
}
}
- else if (GetBattlerAbility(gActiveBattler) == ABILITY_SIMPLE)
+ else if (activeBattlerAbility == ABILITY_SIMPLE)
{
statValue = (SET_STAT_BUFF_VALUE(GET_STAT_BUFF_VALUE(statValue) * 2)) | ((statValue <= -1) ? STAT_BUFF_NEGATIVE : 0);
}
@@ -9965,9 +10140,9 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr
gBattlescriptCurrInstr = BattleScript_ButItFailed;
return STAT_CHANGE_DIDNT_WORK;
}
- else if ((GetBattlerAbility(gActiveBattler) == ABILITY_CLEAR_BODY
- || GetBattlerAbility(gActiveBattler) == ABILITY_FULL_METAL_BODY
- || GetBattlerAbility(gActiveBattler) == ABILITY_WHITE_SMOKE)
+ else if ((activeBattlerAbility == ABILITY_CLEAR_BODY
+ || activeBattlerAbility == ABILITY_FULL_METAL_BODY
+ || activeBattlerAbility == ABILITY_WHITE_SMOKE)
&& !certain && gCurrentMove != MOVE_CURSE)
{
if (flags == STAT_BUFF_ALLOW_PTR)
@@ -9982,7 +10157,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr
gBattleScripting.battler = gActiveBattler;
gBattlerAbility = gActiveBattler;
gBattlescriptCurrInstr = BattleScript_AbilityNoStatLoss;
- gLastUsedAbility = GetBattlerAbility(gActiveBattler);
+ gLastUsedAbility = activeBattlerAbility;
RecordAbilityBattle(gActiveBattler, gLastUsedAbility);
gSpecialStatuses[gActiveBattler].statLowered = TRUE;
}
@@ -10010,9 +10185,9 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr
return STAT_CHANGE_DIDNT_WORK;
}
else if (!certain
- && ((GetBattlerAbility(gActiveBattler) == ABILITY_KEEN_EYE && statId == STAT_ACC)
- || (GetBattlerAbility(gActiveBattler) == ABILITY_HYPER_CUTTER && statId == STAT_ATK)
- || (GetBattlerAbility(gActiveBattler) == ABILITY_BIG_PECKS && statId == STAT_DEF)))
+ && ((activeBattlerAbility == ABILITY_KEEN_EYE && statId == STAT_ACC)
+ || (activeBattlerAbility == ABILITY_HYPER_CUTTER && statId == STAT_ATK)
+ || (activeBattlerAbility == ABILITY_BIG_PECKS && statId == STAT_DEF)))
{
if (flags == STAT_BUFF_ALLOW_PTR)
{
@@ -10020,12 +10195,12 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr
gBattleScripting.battler = gActiveBattler;
gBattlerAbility = gActiveBattler;
gBattlescriptCurrInstr = BattleScript_AbilityNoSpecificStatLoss;
- gLastUsedAbility = GetBattlerAbility(gActiveBattler);
+ gLastUsedAbility = activeBattlerAbility;
RecordAbilityBattle(gActiveBattler, gLastUsedAbility);
}
return STAT_CHANGE_DIDNT_WORK;
}
- else if (GetBattlerAbility(gActiveBattler) == ABILITY_MIRROR_ARMOR && !affectsUser && gBattlerAttacker != gBattlerTarget && gActiveBattler == gBattlerTarget)
+ else if (activeBattlerAbility == ABILITY_MIRROR_ARMOR && !affectsUser && gBattlerAttacker != gBattlerTarget && gActiveBattler == gBattlerTarget)
{
if (flags == STAT_BUFF_ALLOW_PTR)
{
@@ -10038,7 +10213,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr
}
return STAT_CHANGE_DIDNT_WORK;
}
- else if (GetBattlerAbility(gActiveBattler) == ABILITY_SHIELD_DUST && flags == 0)
+ else if (activeBattlerAbility == ABILITY_SHIELD_DUST && flags == 0)
{
return STAT_CHANGE_DIDNT_WORK;
}
@@ -10462,12 +10637,34 @@ static void Cmd_forcerandomswitch(void)
}
}
-static void Cmd_tryconversiontypechange(void) // randomly changes user's type to one of its moves' type
+static void Cmd_tryconversiontypechange(void)
{
u8 validMoves = 0;
u8 moveChecked;
u8 moveType;
+#if B_UPDATED_CONVERSION >= GEN_6
+ // changes user's type to its first move's type
+ for (moveChecked = 0; moveChecked < MAX_MON_MOVES; moveChecked++)
+ {
+ if (gBattleMons[gBattlerAttacker].moves[moveChecked] != MOVE_NONE)
+ {
+ moveType = gBattleMoves[gBattleMons[gBattlerAttacker].moves[moveChecked]].type;
+ break;
+ }
+ }
+ if (IS_BATTLER_OF_TYPE(gBattlerAttacker, moveType))
+ {
+ gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1);
+ }
+ else
+ {
+ SET_BATTLER_TYPE(gBattlerAttacker, moveType);
+ PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType);
+ gBattlescriptCurrInstr += 5;
+ }
+#else
+ // randomly changes user's type to one of its moves' type
while (validMoves < MAX_MON_MOVES)
{
if (gBattleMons[gBattlerAttacker].moves[validMoves] == 0)
@@ -10523,6 +10720,7 @@ static void Cmd_tryconversiontypechange(void) // randomly changes user's type to
gBattlescriptCurrInstr += 5;
}
+#endif
}
static void Cmd_givepaydaymoney(void)
@@ -10572,6 +10770,7 @@ static void Cmd_tryKO(void)
{
bool32 lands = FALSE;
u32 holdEffect = GetBattlerHoldEffect(gBattlerTarget, TRUE);
+ u16 targetAbility = GetBattlerAbility(gBattlerTarget);
gPotentialItemEffectBattler = gBattlerTarget;
if (holdEffect == HOLD_EFFECT_FOCUS_BAND
@@ -10586,7 +10785,7 @@ static void Cmd_tryKO(void)
RecordItemEffectBattle(gBattlerTarget, holdEffect);
}
- if (GetBattlerAbility(gBattlerTarget) == ABILITY_STURDY)
+ if (targetAbility == ABILITY_STURDY)
{
gMoveResultFlags |= MOVE_RESULT_MISSED;
gLastUsedAbility = ABILITY_STURDY;
@@ -10598,7 +10797,7 @@ static void Cmd_tryKO(void)
if ((((gStatuses3[gBattlerTarget] & STATUS3_ALWAYS_HITS)
&& gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker)
|| GetBattlerAbility(gBattlerAttacker) == ABILITY_NO_GUARD
- || GetBattlerAbility(gBattlerTarget) == ABILITY_NO_GUARD)
+ || targetAbility == ABILITY_NO_GUARD)
&& gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level)
{
lands = TRUE;
@@ -11377,7 +11576,8 @@ static void Cmd_tryspiteppreduce(void)
gBattlescriptCurrInstr += 5;
- if (gBattleMons[gBattlerTarget].pp[i] == 0)
+ // Don't cut off Sky Drop if pp is brought to zero.
+ if (gBattleMons[gBattlerTarget].pp[i] == 0 && gBattleStruct->skyDropTargets[gBattlerTarget] == 0xFF)
CancelMultiTurnMoves(gBattlerTarget);
}
else
@@ -12023,6 +12223,7 @@ static void Cmd_setsemiinvulnerablebit(void)
{
case MOVE_FLY:
case MOVE_BOUNCE:
+ case MOVE_SKY_DROP:
gStatuses3[gBattlerAttacker] |= STATUS3_ON_AIR;
break;
case MOVE_DIG:
@@ -12341,6 +12542,7 @@ static void Cmd_trycopyability(void) // role play
}
else
{
+ gBattleScripting.abilityPopupOverwrite = gBattleMons[gBattlerAttacker].ability;
gBattleMons[gBattlerAttacker].ability = defAbility;
gLastUsedAbility = defAbility;
gBattlescriptCurrInstr += 5;
@@ -12981,23 +13183,41 @@ static void Cmd_settypebasedhalvers(void) // water and mud sport
if (gBattleMoves[gCurrentMove].effect == EFFECT_MUD_SPORT)
{
- if (!(gFieldStatuses & STATUS_FIELD_MUDSPORT))
- {
- gFieldStatuses |= STATUS_FIELD_MUDSPORT;
- gFieldTimers.mudSportTimer = 5;
- gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_ELECTRIC;
- worked = TRUE;
- }
+ #if B_SPORT_TURNS >= GEN_6
+ if (!(gFieldStatuses & STATUS_FIELD_MUDSPORT))
+ {
+ gFieldStatuses |= STATUS_FIELD_MUDSPORT;
+ gFieldTimers.mudSportTimer = 5;
+ gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_ELECTRIC;
+ worked = TRUE;
+ }
+ #else
+ if (!(gStatuses4[gBattlerAttacker] & STATUS4_MUD_SPORT))
+ {
+ gStatuses4[gBattlerAttacker] |= STATUS4_MUD_SPORT;
+ gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_ELECTRIC;
+ worked = TRUE;
+ }
+ #endif
}
else // water sport
{
- if (!(gFieldStatuses & STATUS_FIELD_WATERSPORT))
- {
- gFieldStatuses |= STATUS_FIELD_WATERSPORT;
- gFieldTimers.waterSportTimer = 5;
- gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_FIRE;
- worked = TRUE;
- }
+ #if B_SPORT_TURNS >= GEN_6
+ if (!(gFieldStatuses & STATUS_FIELD_WATERSPORT))
+ {
+ gFieldStatuses |= STATUS_FIELD_WATERSPORT;
+ gFieldTimers.waterSportTimer = 5;
+ gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_FIRE;
+ worked = TRUE;
+ }
+ #else
+ if (!(gStatuses4[gBattlerAttacker] & STATUS4_WATER_SPORT))
+ {
+ gStatuses4[gBattlerAttacker] |= v;
+ gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_FIRE;
+ worked = TRUE;
+ }
+ #endif
}
if (worked)
@@ -13225,7 +13445,7 @@ static void Cmd_handleballthrow(void)
catchRate = gBaseStats[gBattleMons[gBattlerTarget].species].catchRate;
#ifdef POKEMON_EXPANSION
- if (gBaseStats[gBattleMons[gBattlerTarget].species].flags & F_ULTRA_BEAST)
+ if (gBaseStats[gBattleMons[gBattlerTarget].species].flags & FLAG_ULTRA_BEAST)
{
if (gLastUsedItem == ITEM_BEAST_BALL)
ballMultiplier = 50;
diff --git a/src/battle_tower.c b/src/battle_tower.c
index 1db7ce5bf7..de02dc095d 100644
--- a/src/battle_tower.c
+++ b/src/battle_tower.c
@@ -35,7 +35,6 @@
#include "constants/trainers.h"
#include "constants/event_objects.h"
#include "constants/moves.h"
-#include "constants/easy_chat.h"
extern const u8 MossdeepCity_SpaceCenter_2F_EventScript_MaxieTrainer[];
extern const u8 MossdeepCity_SpaceCenter_2F_EventScript_TabithaTrainer[];
@@ -1007,7 +1006,7 @@ static bool8 ChooseSpecialBattleTowerTrainer(void)
validMons = 0;
for (j = 0; j < MAX_FRONTIER_PARTY_SIZE; j++)
{
- if (gSaveBlock2Ptr->frontier.towerRecords[i].party[j].species != 0
+ if (gSaveBlock2Ptr->frontier.towerRecords[i].party[j].species != SPECIES_NONE
&& gSaveBlock2Ptr->frontier.towerRecords[i].party[j].level <= GetFrontierEnemyMonLevel(lvlMode))
validMons++;
}
@@ -1674,7 +1673,7 @@ static void FillTrainerParty(u16 trainerId, u8 firstMonId, u8 monCount)
// Record mixed player.
for (j = 0, i = firstMonId; i < firstMonId + monCount; j++, i++)
{
- if (gSaveBlock2Ptr->frontier.towerRecords[trainerId - TRAINER_RECORD_MIXING_FRIEND].party[j].species != 0
+ if (gSaveBlock2Ptr->frontier.towerRecords[trainerId - TRAINER_RECORD_MIXING_FRIEND].party[j].species != SPECIES_NONE
&& gSaveBlock2Ptr->frontier.towerRecords[trainerId - TRAINER_RECORD_MIXING_FRIEND].party[j].level <= level)
{
CreateBattleTowerMon_HandleLevel(&gEnemyParty[i], &gSaveBlock2Ptr->frontier.towerRecords[trainerId - TRAINER_RECORD_MIXING_FRIEND].party[j], FALSE);
@@ -1716,7 +1715,7 @@ static void FillTrainerParty(u16 trainerId, u8 firstMonId, u8 monCount)
// Ensure this Pokemon's held item isn't a duplicate.
for (j = 0; j < i + firstMonId; j++)
{
- if (GetMonData(&gEnemyParty[j], MON_DATA_HELD_ITEM, NULL) != 0
+ if (GetMonData(&gEnemyParty[j], MON_DATA_HELD_ITEM, NULL) != ITEM_NONE
&& GetMonData(&gEnemyParty[j], MON_DATA_HELD_ITEM, NULL) == gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId])
break;
}
@@ -2289,7 +2288,7 @@ static void GetRecordMixFriendMultiPartnerParty(u16 trainerId)
if (gSaveBlock2Ptr->frontier.towerRecords[trainerId - TRAINER_RECORD_MIXING_FRIEND].party[i].species != species1
&& gSaveBlock2Ptr->frontier.towerRecords[trainerId - TRAINER_RECORD_MIXING_FRIEND].party[i].species != species2
&& gSaveBlock2Ptr->frontier.towerRecords[trainerId - TRAINER_RECORD_MIXING_FRIEND].party[i].level <= GetFrontierEnemyMonLevel(lvlMode)
- && gSaveBlock2Ptr->frontier.towerRecords[trainerId - TRAINER_RECORD_MIXING_FRIEND].party[i].species != 0)
+ && gSaveBlock2Ptr->frontier.towerRecords[trainerId - TRAINER_RECORD_MIXING_FRIEND].party[i].species != SPECIES_NONE)
{
validSpecies[count] = i;
count++;
@@ -2428,7 +2427,7 @@ static void LoadMultiPartnerCandidatesData(void)
if (species1 != gSaveBlock2Ptr->frontier.towerRecords[i].party[j].species
&& species2 != gSaveBlock2Ptr->frontier.towerRecords[i].party[j].species
&& gSaveBlock2Ptr->frontier.towerRecords[i].party[j].level <= GetFrontierEnemyMonLevel(lvlMode)
- && gSaveBlock2Ptr->frontier.towerRecords[i].party[j].species != 0)
+ && gSaveBlock2Ptr->frontier.towerRecords[i].party[j].species != SPECIES_NONE)
{
k++;
}
@@ -3521,7 +3520,7 @@ static void FillTentTrainerParty_(u16 trainerId, u8 firstMonId, u8 monCount)
// Ensure this Pokemon's held item isn't a duplicate.
for (j = 0; j < i + firstMonId; j++)
{
- if (GetMonData(&gEnemyParty[j], MON_DATA_HELD_ITEM, NULL) != 0
+ if (GetMonData(&gEnemyParty[j], MON_DATA_HELD_ITEM, NULL) != ITEM_NONE
&& GetMonData(&gEnemyParty[j], MON_DATA_HELD_ITEM, NULL) == gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId])
break;
}
diff --git a/src/battle_util.c b/src/battle_util.c
index 90bd280acf..e4b70e02bc 100644
--- a/src/battle_util.c
+++ b/src/battle_util.c
@@ -223,6 +223,7 @@ bool32 IsAffectedByFollowMe(u32 battlerAtk, u32 defSide, u32 move)
if (gSideTimers[defSide].followmeTimer == 0
|| gBattleMons[gSideTimers[defSide].followmeTarget].hp == 0
|| gBattleMoves[move].effect == EFFECT_SNIPE_SHOT
+ || gBattleMoves[move].effect == EFFECT_SKY_DROP
|| ability == ABILITY_PROPELLER_TAIL || ability == ABILITY_STALWART)
return FALSE;
@@ -311,7 +312,7 @@ void HandleAction_UseMove(void)
&& gBattleMoves[gCurrentMove].target == MOVE_TARGET_SELECTED
&& GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gSideTimers[side].followmeTarget))
{
- gBattlerTarget = gSideTimers[side].followmeTarget;
+ gBattleStruct->moveTarget[gBattlerAttacker] = gBattlerTarget = gSideTimers[side].followmeTarget; // follow me moxie fix
}
else if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
&& gSideTimers[side].followmeTimer == 0
@@ -384,11 +385,14 @@ void HandleAction_UseMove(void)
}
else
{
+ u16 battlerAbility;
gActiveBattler = gBattlerByTurnOrder[var];
+ battlerAbility = GetBattlerAbility(gActiveBattler);
+
RecordAbilityBattle(gActiveBattler, gBattleMons[gActiveBattler].ability);
- if (GetBattlerAbility(gActiveBattler) == ABILITY_LIGHTNING_ROD)
+ if (battlerAbility == ABILITY_LIGHTNING_ROD)
gSpecialStatuses[gActiveBattler].lightningRodRedirected = TRUE;
- else if (GetBattlerAbility(gActiveBattler) == ABILITY_STORM_DRAIN)
+ else if (battlerAbility == ABILITY_STORM_DRAIN)
gSpecialStatuses[gActiveBattler].stormDrainRedirected = TRUE;
gBattlerTarget = gActiveBattler;
}
@@ -870,6 +874,11 @@ void HandleAction_NothingIsFainted(void)
void HandleAction_ActionFinished(void)
{
+ #if B_RECALC_TURN_AFTER_ACTIONS >= GEN_8
+ u8 i, j;
+ u8 battler1 = 0;
+ u8 battler2 = 0;
+ #endif
*(gBattleStruct->monToSwitchIntoId + gBattlerByTurnOrder[gCurrentTurnActionNumber]) = PARTY_SIZE;
gCurrentTurnActionNumber++;
gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber];
@@ -893,6 +902,31 @@ void HandleAction_ActionFinished(void)
gBattleCommunication[4] = 0;
gBattleScripting.multihitMoveEffect = 0;
gBattleResources->battleScriptsStack->size = 0;
+
+ #if B_RECALC_TURN_AFTER_ACTIONS >= GEN_8
+ // i starts at `gCurrentTurnActionNumber` because we don't want to recalculate turn order for mon that have already
+ // taken action. It's been previously increased, which we want in order to not recalculate the turn of the mon that just finished its action
+ for (i = gCurrentTurnActionNumber; i < gBattlersCount - 1; i++)
+ {
+ for (j = i + 1; j < gBattlersCount; j++)
+ {
+ u8 battler1 = gBattlerByTurnOrder[i];
+ u8 battler2 = gBattlerByTurnOrder[j];
+ // We recalculate order only for action of the same priority. If any action other than switch/move has been taken, they should
+ // have been executed before. The only recalculation needed is for moves/switch. Mega evolution is handled in src/battle_main.c/TryChangeOrder
+ if((gActionsByTurnOrder[i] == B_ACTION_USE_MOVE && gActionsByTurnOrder[j] == B_ACTION_USE_MOVE))
+ {
+ if (GetWhoStrikesFirst(battler1, battler2, FALSE))
+ SwapTurnOrder(i, j);
+ }
+ else if ((gActionsByTurnOrder[i] == B_ACTION_SWITCH && gActionsByTurnOrder[j] == B_ACTION_SWITCH))
+ {
+ if (GetWhoStrikesFirst(battler1, battler2, TRUE)) // If the actions chosen are switching, we recalc order but ignoring the moves
+ SwapTurnOrder(i, j);
+ }
+ }
+ }
+ #endif
}
static const u8 sMovesNotAffectedByStench[] =
@@ -1412,12 +1446,80 @@ void MarkBattlerReceivedLinkData(u8 battlerId)
void CancelMultiTurnMoves(u8 battler)
{
- gBattleMons[battler].status2 &= ~STATUS2_MULTIPLETURNS;
- gBattleMons[battler].status2 &= ~STATUS2_LOCK_CONFUSE;
- gBattleMons[battler].status2 &= ~STATUS2_UPROAR;
- gBattleMons[battler].status2 &= ~STATUS2_BIDE;
+ u8 i;
+ gBattleMons[battler].status2 &= ~(STATUS2_MULTIPLETURNS);
+ gBattleMons[battler].status2 &= ~(STATUS2_LOCK_CONFUSE);
+ gBattleMons[battler].status2 &= ~(STATUS2_UPROAR);
+ gBattleMons[battler].status2 &= ~(STATUS2_BIDE);
- gStatuses3[battler] &= ~STATUS3_SEMI_INVULNERABLE;
+ // Clear battler's semi-invulnerable bits if they are not held by Sky Drop.
+ if (!(gStatuses3[battler] & STATUS3_SKY_DROPPED))
+ gStatuses3[battler] &= ~(STATUS3_SEMI_INVULNERABLE);
+
+ // Check to see if this Pokemon was in the middle of using Sky Drop. If so, release the target.
+ if (gBattleStruct->skyDropTargets[battler] != 0xFF && !(gStatuses3[battler] & STATUS3_SKY_DROPPED))
+ {
+ // Get the target's battler id
+ u8 otherSkyDropper = gBattleStruct->skyDropTargets[battler];
+
+ // Clears sky_dropped and on_air statuses
+ gStatuses3[otherSkyDropper] &= ~(STATUS3_SKY_DROPPED | STATUS3_ON_AIR);
+
+ // Makes both attacker and target's sprites visible
+ gSprites[gBattlerSpriteIds[battler]].invisible = FALSE;
+ gSprites[gBattlerSpriteIds[otherSkyDropper]].invisible = FALSE;
+
+ // If target was sky dropped in the middle of Outrage/Thrash/Petal Dance,
+ // confuse them upon release and display "confused by fatigue" message & animation.
+ // Don't do this if this CancelMultiTurnMoves is caused by falling asleep via Yawn.
+ if (gBattleMons[otherSkyDropper].status2 & STATUS2_LOCK_CONFUSE && gBattleStruct->turnEffectsTracker != 24)
+ {
+ gBattleMons[otherSkyDropper].status2 &= ~(STATUS2_LOCK_CONFUSE);
+
+ // If the target can be confused, confuse them.
+ // Don't use CanBeConfused, can cause issues in edge cases.
+ if (!(GetBattlerAbility(otherSkyDropper) == ABILITY_OWN_TEMPO
+ || gBattleMons[otherSkyDropper].status2 & STATUS2_CONFUSION
+ || IsBattlerTerrainAffected(otherSkyDropper, STATUS_FIELD_MISTY_TERRAIN)))
+ {
+ // Set confused status
+ gBattleMons[otherSkyDropper].status2 |= STATUS2_CONFUSION_TURN(((Random()) % 4) + 2);
+
+ // If this CancelMultiTurnMoves is occuring due to attackcanceller
+ if (gBattlescriptCurrInstr[0] == 0x0)
+ {
+ gBattleStruct->skyDropTargets[battler] = 0xFE;
+ }
+ // If this CancelMultiTurnMoves is occuring due to VARIOUS_GRAVITY_ON_AIRBORNE_MONS
+ // Reapplying STATUS3_SKY_DROPPED allows for avoiding unecessary messages when Gravity is applied to the target.
+ else if (gBattlescriptCurrInstr[0] == 0x76 && gBattlescriptCurrInstr[2] == 76)
+ {
+ gBattleStruct->skyDropTargets[battler] = 0xFE;
+ gStatuses3[otherSkyDropper] |= STATUS3_SKY_DROPPED;
+ }
+ // If this CancelMultiTurnMoves is occuring due to cancelmultiturnmoves script
+ else if (gBattlescriptCurrInstr[0] == 0x76 && gBattlescriptCurrInstr[2] == 0)
+ {
+ gBattlerAttacker = otherSkyDropper;
+ gBattlescriptCurrInstr = BattleScript_ThrashConfuses - 3;
+ }
+ // If this CancelMultiTurnMoves is occuring due to receiving Sleep/Freeze status
+ else if (gBattleScripting.moveEffect <= PRIMARY_STATUS_MOVE_EFFECT)
+ {
+ gBattlerAttacker = otherSkyDropper;
+ BattleScriptPush(gBattlescriptCurrInstr + 1);
+ gBattlescriptCurrInstr = BattleScript_ThrashConfuses - 1;
+ }
+ }
+ }
+
+ // Clear skyDropTargets data, unless this CancelMultiTurnMoves is caused by Yawn, attackcanceler, or VARIOUS_GRAVITY_ON_AIRBORNE_MONS
+ if (!(gBattleMons[otherSkyDropper].status2 & STATUS2_LOCK_CONFUSE) && gBattleStruct->skyDropTargets[battler] < 4)
+ {
+ gBattleStruct->skyDropTargets[battler] = 0xFF;
+ gBattleStruct->skyDropTargets[otherSkyDropper] = 0xFF;
+ }
+ }
gDisableStructs[battler].rolloutTimer = 0;
gDisableStructs[battler].furyCutterCounter = 0;
@@ -1444,6 +1546,8 @@ bool8 WasUnableToUseMove(u8 battler)
void PrepareStringBattle(u16 stringId, u8 battler)
{
+ u16 battlerAbility = GetBattlerAbility(battler);
+ u16 targetAbility = GetBattlerAbility(gBattlerTarget);
// Support for Contrary ability.
// If a move attempted to raise stat - print "won't increase".
// If a move attempted to lower stat - print "won't decrease".
@@ -1452,22 +1556,22 @@ void PrepareStringBattle(u16 stringId, u8 battler)
else if (stringId == STRINGID_STATSWONTINCREASE && gBattleScripting.statChanger & STAT_BUFF_NEGATIVE)
stringId = STRINGID_STATSWONTDECREASE;
- else if (stringId == STRINGID_STATSWONTDECREASE2 && GetBattlerAbility(battler) == ABILITY_CONTRARY)
+ else if (stringId == STRINGID_STATSWONTDECREASE2 && battlerAbility == ABILITY_CONTRARY)
stringId = STRINGID_STATSWONTINCREASE2;
- else if (stringId == STRINGID_STATSWONTINCREASE2 && GetBattlerAbility(battler) == ABILITY_CONTRARY)
+ else if (stringId == STRINGID_STATSWONTINCREASE2 && battlerAbility == ABILITY_CONTRARY)
stringId = STRINGID_STATSWONTDECREASE2;
// Check Defiant and Competitive stat raise whenever a stat is lowered.
else if ((stringId == STRINGID_DEFENDERSSTATFELL || stringId == STRINGID_PKMNCUTSATTACKWITH)
- && ((GetBattlerAbility(gBattlerTarget) == ABILITY_DEFIANT && CompareStat(gBattlerTarget, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN))
- || (GetBattlerAbility(gBattlerTarget) == ABILITY_COMPETITIVE && CompareStat(gBattlerTarget, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN)))
+ && ((targetAbility == ABILITY_DEFIANT && CompareStat(gBattlerTarget, STAT_ATK, MAX_STAT_STAGE, CMP_LESS_THAN))
+ || (targetAbility == ABILITY_COMPETITIVE && CompareStat(gBattlerTarget, STAT_SPATK, MAX_STAT_STAGE, CMP_LESS_THAN)))
&& gSpecialStatuses[gBattlerTarget].changedStatsBattlerId != BATTLE_PARTNER(gBattlerTarget)
&& gSpecialStatuses[gBattlerTarget].changedStatsBattlerId != gBattlerTarget)
{
gBattlerAbility = gBattlerTarget;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_DefiantActivates;
- if (GetBattlerAbility(gBattlerTarget) == ABILITY_DEFIANT)
+ if (targetAbility == ABILITY_DEFIANT)
SET_STATCHANGER(STAT_ATK, 2, FALSE);
else
SET_STATCHANGER(STAT_SPATK, 2, FALSE);
@@ -1722,7 +1826,7 @@ u8 TrySetCantSelectMoveBattleScript(void)
limitations++;
}
}
-
+
if (move == MOVE_STUFF_CHEEKS && ItemId_GetPocket(gBattleMons[gActiveBattler].item) != POCKET_BERRIES)
{
gCurrentMove = move;
@@ -2380,21 +2484,25 @@ u8 DoFieldEndTurnEffects(void)
gBattleStruct->turnCountersTracker++;
break;
case ENDTURN_WATER_SPORT:
- if (gFieldStatuses & STATUS_FIELD_WATERSPORT && --gFieldTimers.waterSportTimer == 0)
- {
- gFieldStatuses &= ~STATUS_FIELD_WATERSPORT;
- BattleScriptExecute(BattleScript_WaterSportEnds);
- effect++;
- }
+ #if B_SPORT_TURNS >= GEN_6
+ if (gFieldStatuses & STATUS_FIELD_WATERSPORT && --gFieldTimers.waterSportTimer == 0)
+ {
+ gFieldStatuses &= ~STATUS_FIELD_WATERSPORT;
+ BattleScriptExecute(BattleScript_WaterSportEnds);
+ effect++;
+ }
+ #endif
gBattleStruct->turnCountersTracker++;
break;
case ENDTURN_MUD_SPORT:
- if (gFieldStatuses & STATUS_FIELD_MUDSPORT && --gFieldTimers.mudSportTimer == 0)
- {
- gFieldStatuses &= ~STATUS_FIELD_MUDSPORT;
- BattleScriptExecute(BattleScript_MudSportEnds);
- effect++;
- }
+ #if B_SPORT_TURNS >= GEN_6
+ if (gFieldStatuses & STATUS_FIELD_MUDSPORT && --gFieldTimers.mudSportTimer == 0)
+ {
+ gFieldStatuses &= ~STATUS_FIELD_MUDSPORT;
+ BattleScriptExecute(BattleScript_MudSportEnds);
+ effect++;
+ }
+ #endif
gBattleStruct->turnCountersTracker++;
break;
case ENDTURN_GRAVITY:
@@ -2718,16 +2826,19 @@ u8 DoBattlerEndTurnEffects(void)
gBattleStruct->turnEffectsTracker++;
break;
case ENDTURN_OCTOLOCK:
- if (gDisableStructs[gActiveBattler].octolock
- && !(GetBattlerAbility(gActiveBattler) == ABILITY_CLEAR_BODY
- || GetBattlerAbility(gActiveBattler) == ABILITY_FULL_METAL_BODY
- || GetBattlerAbility(gActiveBattler) == ABILITY_WHITE_SMOKE))
+ {
+ u16 battlerAbility = GetBattlerAbility(gActiveBattler);
+ if (gDisableStructs[gActiveBattler].octolock
+ && !(battlerAbility == ABILITY_CLEAR_BODY
+ || battlerAbility == ABILITY_FULL_METAL_BODY
+ || battlerAbility == ABILITY_WHITE_SMOKE))
{
gBattlerTarget = gActiveBattler;
BattleScriptExecute(BattleScript_OctolockEndTurn);
effect++;
}
gBattleStruct->turnEffectsTracker++;
+ }
break;
case ENDTURN_UPROAR: // uproar
if (gBattleMons[gActiveBattler].status2 & STATUS2_UPROAR)
@@ -2779,7 +2890,8 @@ u8 DoBattlerEndTurnEffects(void)
gBattleStruct->turnEffectsTracker++;
break;
case ENDTURN_THRASH: // thrash
- if (gBattleMons[gActiveBattler].status2 & STATUS2_LOCK_CONFUSE)
+ // Don't decrement STATUS2_LOCK_CONFUSE if the target is held by Sky Drop
+ if (gBattleMons[gActiveBattler].status2 & STATUS2_LOCK_CONFUSE && !(gStatuses3[gActiveBattler] & STATUS3_SKY_DROPPED))
{
gBattleMons[gActiveBattler].status2 -= STATUS2_LOCK_CONFUSE_TURN(1);
if (WasUnableToUseMove(gActiveBattler))
@@ -2867,10 +2979,11 @@ u8 DoBattlerEndTurnEffects(void)
case ENDTURN_YAWN: // yawn
if (gStatuses3[gActiveBattler] & STATUS3_YAWN)
{
+ u16 battlerAbility = GetBattlerAbility(gActiveBattler);
gStatuses3[gActiveBattler] -= STATUS3_YAWN_TURN(1);
if (!(gStatuses3[gActiveBattler] & STATUS3_YAWN) && !(gBattleMons[gActiveBattler].status1 & STATUS1_ANY)
- && GetBattlerAbility(gActiveBattler) != ABILITY_VITAL_SPIRIT
- && GetBattlerAbility(gActiveBattler) != ABILITY_INSOMNIA && !UproarWakeUpCheck(gActiveBattler)
+ && battlerAbility != ABILITY_VITAL_SPIRIT
+ && battlerAbility != ABILITY_INSOMNIA && !UproarWakeUpCheck(gActiveBattler)
&& !IsLeafGuardProtected(gActiveBattler))
{
CancelMultiTurnMoves(gActiveBattler);
@@ -2887,7 +3000,7 @@ u8 DoBattlerEndTurnEffects(void)
}
else
{
- gBattleMons[gActiveBattler].status1 |= (Random() & 3) + 2;
+ gBattleMons[gActiveBattler].status1 |= (B_SLEEP_TURNS >= GEN_5) ? ((Random() % 3) + 2) : ((Random() % 4) + 3);
BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1);
MarkBattlerForControllerExec(gActiveBattler);
BattleScriptExecute(BattleScript_YawnMakesAsleep);
@@ -3220,6 +3333,7 @@ void TryClearRageAndFuryCutter(void)
enum
{
CANCELLER_FLAGS,
+ CANCELLER_SKY_DROP,
CANCELLER_ASLEEP,
CANCELLER_FROZEN,
CANCELLER_TRUANT,
@@ -3256,6 +3370,16 @@ u8 AtkCanceller_UnableToUseMove(void)
gStatuses3[gBattlerAttacker] &= ~STATUS3_GRUDGE;
gBattleStruct->atkCancellerTracker++;
break;
+ case CANCELLER_SKY_DROP:
+ // If Pokemon is being held in Sky Drop
+ if (gStatuses3[gBattlerAttacker] & STATUS3_SKY_DROPPED)
+ {
+ gBattlescriptCurrInstr = BattleScript_MoveEnd;
+ gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE;
+ effect = 1;
+ }
+ gBattleStruct->atkCancellerTracker++;
+ break;
case CANCELLER_ASLEEP: // check being asleep
if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP)
{
@@ -3758,7 +3882,7 @@ u8 TryWeatherFormChange(u8 battler)
u8 ret = 0;
bool32 weatherEffect = WEATHER_HAS_EFFECT;
u16 holdEffect = GetBattlerHoldEffect(battler, TRUE);
-
+
if (gBattleMons[battler].species == SPECIES_CASTFORM)
{
if (GetBattlerAbility(battler) != ABILITY_FORECAST || gBattleMons[battler].hp == 0)
@@ -3821,6 +3945,8 @@ static const u16 sWeatherFlagsInfo[][3] =
bool32 TryChangeBattleWeather(u8 battler, u32 weatherEnumId, bool32 viaAbility)
{
+ u16 battlerAbility = GetBattlerAbility(battler);
+
if (viaAbility && B_ABILITY_WEATHER <= GEN_5
&& !(gBattleWeather & sWeatherFlagsInfo[weatherEnumId][1]))
{
@@ -3828,9 +3954,9 @@ bool32 TryChangeBattleWeather(u8 battler, u32 weatherEnumId, bool32 viaAbility)
return TRUE;
}
else if (gBattleWeather & B_WEATHER_PRIMAL_ANY
- && GetBattlerAbility(battler) != ABILITY_DESOLATE_LAND
- && GetBattlerAbility(battler) != ABILITY_PRIMORDIAL_SEA
- && GetBattlerAbility(battler) != ABILITY_DELTA_STREAM)
+ && battlerAbility != ABILITY_DESOLATE_LAND
+ && battlerAbility != ABILITY_PRIMORDIAL_SEA
+ && battlerAbility != ABILITY_DELTA_STREAM)
{
return FALSE;
}
@@ -3883,12 +4009,14 @@ static bool32 ShouldChangeFormHpBased(u32 battler)
{ABILITY_SCHOOLING, SPECIES_WISHIWASHI_SCHOOL, SPECIES_WISHIWASHI, 4},
{ABILITY_GULP_MISSILE, SPECIES_CRAMORANT, SPECIES_CRAMORANT_GORGING, 2},
{ABILITY_GULP_MISSILE, SPECIES_CRAMORANT, SPECIES_CRAMORANT_GULPING, 1},
+ {ABILITY_ZEN_MODE, SPECIES_DARMANITAN_GALARIAN, SPECIES_DARMANITAN_ZEN_MODE_GALARIAN, 2},
};
u32 i;
+ u16 battlerAbility = GetBattlerAbility(battler);
for (i = 0; i < ARRAY_COUNT(forms); i++)
{
- if (GetBattlerAbility(battler) == forms[i][0])
+ if (battlerAbility == forms[i][0])
{
if (gBattleMons[battler].species == forms[i][2]
&& gBattleMons[battler].hp > gBattleMons[battler].maxHP / forms[i][3])
@@ -4490,6 +4618,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
&& gBattleStruct->changedItems[battler] == ITEM_NONE // Will not inherit an item
&& ItemId_GetPocket(GetUsedHeldItem(battler)) == POCKET_BERRIES)
{
+ gLastUsedItem = GetUsedHeldItem(battler);
BattleScriptPushCursorAndCallback(BattleScript_HarvestActivates);
effect++;
}
@@ -4707,7 +4836,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
gBattlescriptCurrInstr = BattleScript_DarkTypePreventsPrankster;
effect = 1;
}
-
+
break;
case ABILITYEFFECT_ABSORBING: // 3
if (move != MOVE_NONE)
@@ -4896,7 +5025,9 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
&& !(TestSheerForceFlag(gBattlerAttacker, gCurrentMove))
&& (CanBattlerSwitch(battler) || !(gBattleTypeFlags & BATTLE_TYPE_TRAINER))
&& !(gBattleTypeFlags & BATTLE_TYPE_ARENA)
- && CountUsablePartyMons(battler) > 0)
+ && CountUsablePartyMons(battler) > 0
+ // Not currently held by Sky Drop
+ && !(gStatuses3[battler] & STATUS3_SKY_DROPPED))
{
gBattleResources->flags->flags[battler] |= RESOURCE_FLAG_EMERGENCY_EXIT;
effect++;
@@ -5473,7 +5604,8 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
case ABILITYEFFECT_FORECAST: // 6
for (battler = 0; battler < gBattlersCount; battler++)
{
- if (GetBattlerAbility(battler) == ABILITY_FORECAST || GetBattlerAbility(battler) == ABILITY_FLOWER_GIFT)
+ u16 battlerAbility = GetBattlerAbility(battler);
+ if (battlerAbility == ABILITY_FORECAST || battlerAbility == ABILITY_FLOWER_GIFT)
{
effect = TryWeatherFormChange(battler);
if (effect)
@@ -5534,10 +5666,11 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
case ABILITYEFFECT_INTIMIDATE2:
for (i = 0; i < gBattlersCount; i++)
{
- if (GetBattlerAbility(i) == ABILITY_INTIMIDATE && gBattleResources->flags->flags[i] & RESOURCE_FLAG_INTIMIDATED)
+ if (GetBattlerAbility(i) == ABILITY_INTIMIDATE && gBattleResources->flags->flags[i] & RESOURCE_FLAG_INTIMIDATED
+ && (IsBattlerAlive(BATTLE_OPPOSITE(i)) || IsBattlerAlive(BATTLE_PARTNER(BATTLE_OPPOSITE(i))))) // At least one opposing mon has to be alive.
{
- gLastUsedAbility = ABILITY_INTIMIDATE;
gBattleResources->flags->flags[i] &= ~RESOURCE_FLAG_INTIMIDATED;
+ gLastUsedAbility = ABILITY_INTIMIDATE;
if (caseID == ABILITYEFFECT_INTIMIDATE1)
{
BattleScriptPushCursorAndCallback(BattleScript_IntimidateActivatesEnd3);
@@ -5618,6 +5751,35 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
break;
}
break;
+ case ABILITYEFFECT_FIELD_SPORT:
+ switch (gLastUsedAbility)
+ {
+ case ABILITYEFFECT_MUD_SPORT:
+ for (i = 0; i < gBattlersCount; i++)
+ {
+ if (gStatuses4[i] & STATUS4_MUD_SPORT)
+ effect = i + 1;
+ }
+ break;
+ case ABILITYEFFECT_WATER_SPORT:
+ for (i = 0; i < gBattlersCount; i++)
+ {
+ if (gStatuses4[i] & STATUS4_WATER_SPORT)
+ effect = i + 1;
+ }
+ break;
+ default:
+ for (i = 0; i < gBattlersCount; i++)
+ {
+ if (gBattleMons[i].ability == ability)
+ {
+ gLastUsedAbility = ability;
+ effect = i + 1;
+ }
+ }
+ break;
+ }
+ break;
}
if (effect && gLastUsedAbility != 0xFF)
@@ -5758,6 +5920,8 @@ bool32 CanBattlerEscape(u32 battlerId) // no ability check
return FALSE;
else if (gFieldStatuses & STATUS_FIELD_FAIRY_LOCK)
return FALSE;
+ else if (gStatuses3[battlerId] & STATUS3_SKY_DROPPED)
+ return FALSE;
else
return TRUE;
}
@@ -5794,7 +5958,7 @@ bool32 IsBattlerTerrainAffected(u8 battlerId, u32 terrainFlag)
return FALSE;
else if (gStatuses3[battlerId] & STATUS3_SEMI_INVULNERABLE)
return FALSE;
-
+
return IsBattlerGrounded(battlerId);
}
@@ -5816,7 +5980,7 @@ bool32 CanSleep(u8 battlerId)
bool32 CanBePoisoned(u8 battlerAttacker, u8 battlerTarget)
{
u16 ability = GetBattlerAbility(battlerTarget);
-
+
if (!(CanPoisonType(battlerAttacker, battlerTarget))
|| gSideStatuses[GetBattlerSide(battlerTarget)] & SIDE_STATUS_SAFEGUARD
|| gBattleMons[battlerTarget].status1 & STATUS1_ANY
@@ -5986,13 +6150,14 @@ static u8 RandomStatRaiseBerry(u32 battlerId, u32 itemId, bool32 end2)
}
if (i != NUM_STATS - 1 && HasEnoughHpToEatBerry(battlerId, GetBattlerHoldEffectParam(battlerId), itemId))
{
+ u16 battlerAbility = GetBattlerAbility(battlerId);
do
{
i = Random() % (NUM_STATS - 1);
} while (!CompareStat(battlerId, STAT_ATK + i, MAX_STAT_STAGE, CMP_LESS_THAN));
PREPARE_STAT_BUFFER(gBattleTextBuff1, i + 1);
- stringId = (GetBattlerAbility(battlerId) == ABILITY_CONTRARY) ? STRINGID_STATFELL : STRINGID_STATROSE;
+ stringId = (battlerAbility == ABILITY_CONTRARY) ? STRINGID_STATFELL : STRINGID_STATROSE;
gBattleTextBuff2[0] = B_BUFF_PLACEHOLDER_BEGIN;
gBattleTextBuff2[1] = B_BUFF_STRING;
gBattleTextBuff2[2] = STRINGID_STATSHARPLY;
@@ -6002,7 +6167,7 @@ static u8 RandomStatRaiseBerry(u32 battlerId, u32 itemId, bool32 end2)
gBattleTextBuff2[6] = stringId >> 8;
gBattleTextBuff2[7] = EOS;
gEffectBattler = battlerId;
- if (GetBattlerAbility(battlerId) == ABILITY_RIPEN)
+ if (battlerAbility == ABILITY_RIPEN)
SET_STATCHANGER(i + 1, 4, FALSE);
else
SET_STATCHANGER(i + 1, 2, FALSE);
@@ -6018,7 +6183,7 @@ static u8 RandomStatRaiseBerry(u32 battlerId, u32 itemId, bool32 end2)
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_BerryStatRaiseRet;
}
-
+
return ITEM_STATS_CHANGE;
}
return 0;
@@ -6132,7 +6297,7 @@ static bool32 UnnerveOn(u32 battlerId, u32 itemId)
static bool32 GetMentalHerbEffect(u8 battlerId)
{
bool32 ret = FALSE;
-
+
// Check infatuation
if (gBattleMons[battlerId].status2 & STATUS2_INFATUATION)
{
@@ -7161,14 +7326,12 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
}
break;
case ITEMEFFECT_ORBS:
+ {
+ u16 battlerAbility = GetBattlerAbility(battlerId);
switch (battlerHoldEffect)
{
case HOLD_EFFECT_TOXIC_ORB:
- if (!gBattleMons[battlerId].status1
- && CanPoisonType(battlerId, battlerId)
- && GetBattlerAbility(battlerId) != ABILITY_IMMUNITY
- && GetBattlerAbility(battlerId) != ABILITY_COMATOSE
- && IsBattlerAlive)
+ if (IsBattlerAlive(battlerId) && CanBePoisoned(battlerId, battlerId))
{
effect = ITEM_STATUS_CHANGE;
gBattleMons[battlerId].status1 = STATUS1_TOXIC_POISON;
@@ -7177,12 +7340,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
}
break;
case HOLD_EFFECT_FLAME_ORB:
- if (!gBattleMons[battlerId].status1
- && !IS_BATTLER_OF_TYPE(battlerId, TYPE_FIRE)
- && GetBattlerAbility(battlerId) != ABILITY_WATER_VEIL
- && GetBattlerAbility(battlerId) != ABILITY_WATER_BUBBLE
- && GetBattlerAbility(battlerId) != ABILITY_COMATOSE
- && IsBattlerAlive)
+ if (IsBattlerAlive(battlerId) && CanBeBurned(battlerId))
{
effect = ITEM_STATUS_CHANGE;
gBattleMons[battlerId].status1 = STATUS1_BURN;
@@ -7191,7 +7349,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
}
break;
case HOLD_EFFECT_STICKY_BARB: // Not an orb per se, but similar effect, and needs to NOT activate with pickpocket
- if (GetBattlerAbility(battlerId) != ABILITY_MAGIC_GUARD)
+ if (battlerAbility != ABILITY_MAGIC_GUARD)
{
gBattleMoveDamage = gBattleMons[battlerId].maxHP / 8;
if (gBattleMoveDamage == 0)
@@ -7210,6 +7368,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn)
BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battlerId].status1);
MarkBattlerForControllerExec(gActiveBattler);
}
+ }
break;
}
@@ -7265,11 +7424,11 @@ u32 GetMoveTarget(u16 move, u8 setTarget)
moveTarget = setTarget - 1;
else
moveTarget = gBattleMoves[move].target;
-
+
// Special cases
if (move == MOVE_CURSE && !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST))
moveTarget = MOVE_TARGET_USER;
-
+
switch (moveTarget)
{
case MOVE_TARGET_SELECTED:
@@ -7804,7 +7963,7 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef)
// todo
break;
case EFFECT_FLING:
- // todo: program Fling + Unburden interaction
+ basePower = ItemId_GetFlingPower(gBattleMons[battlerAtk].item);
break;
case EFFECT_ERUPTION:
basePower = gBattleMons[battlerAtk].hp * basePower / gBattleMons[battlerAtk].maxHP;
@@ -8327,7 +8486,15 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe
MulModifier(&modifier, (B_TERRAIN_TYPE_BOOST >= GEN_8) ? UQ_4_12(1.3) : UQ_4_12(1.5));
if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN && moveType == TYPE_PSYCHIC && IsBattlerGrounded(battlerAtk) && !(gStatuses3[battlerAtk] & STATUS3_SEMI_INVULNERABLE))
MulModifier(&modifier, (B_TERRAIN_TYPE_BOOST >= GEN_8) ? UQ_4_12(1.3) : UQ_4_12(1.5));
-
+ #if B_SPORT_TURNS >= GEN_6
+ if ((gFieldStatuses & STATUS_FIELD_MUDSPORT && moveType == TYPE_ELECTRIC)
+ || (gFieldStatuses & STATUS_FIELD_WATERSPORT && moveType == TYPE_FIRE))
+ MulModifier(&modifier, (B_SPORT_DMG_REDUCTION >= GEN_5) ? UQ_4_12(0.23) : UQ_4_12(0.5));
+ #else
+ if ((moveType == TYPE_ELECTRIC && AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, 0, ABILITYEFFECT_MUD_SPORT, 0))
+ || (moveType == TYPE_FIRE && AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, 0, ABILITYEFFECT_WATER_SPORT, 0)))
+ MulModifier(&modifier, (B_SPORT_DMG_REDUCTION >= GEN_5) ? UQ_4_12(0.23) : UQ_4_12(0.5));
+ #endif
return ApplyModifier(modifier, basePower);
}
@@ -8336,6 +8503,9 @@ static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, b
u8 atkStage;
u32 atkStat;
u16 modifier;
+ u16 atkBaseSpeciesId;
+
+ atkBaseSpeciesId = GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species);
if (gBattleMoves[move].effect == EFFECT_FOUL_PLAY)
{
@@ -8482,9 +8652,7 @@ static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, b
switch (GetBattlerHoldEffect(battlerAtk, TRUE))
{
case HOLD_EFFECT_THICK_CLUB:
- if ((GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species) == SPECIES_CUBONE
- || GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species) == SPECIES_MAROWAK)
- && IS_MOVE_PHYSICAL(move))
+ if ((atkBaseSpeciesId == SPECIES_CUBONE || atkBaseSpeciesId == SPECIES_MAROWAK) && IS_MOVE_PHYSICAL(move))
MulModifier(&modifier, UQ_4_12(2.0));
break;
case HOLD_EFFECT_DEEP_SEA_TOOTH:
@@ -8492,7 +8660,7 @@ static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, b
MulModifier(&modifier, UQ_4_12(2.0));
break;
case HOLD_EFFECT_LIGHT_BALL:
- if (gBattleMons[battlerAtk].species == SPECIES_PIKACHU)
+ if (atkBaseSpeciesId == SPECIES_PIKACHU)
MulModifier(&modifier, UQ_4_12(2.0));
break;
case HOLD_EFFECT_CHOICE_BAND:
@@ -8932,6 +9100,8 @@ static void UpdateMoveResultFlags(u16 modifier)
static u16 CalcTypeEffectivenessMultiplierInternal(u16 move, u8 moveType, u8 battlerAtk, u8 battlerDef, bool32 recordAbilities, u16 modifier)
{
+ u16 defAbility = GetBattlerAbility(battlerDef);
+
MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, gBattleMons[battlerDef].type1, battlerAtk, recordAbilities);
if (gBattleMons[battlerDef].type2 != gBattleMons[battlerDef].type1)
MulByTypeEffectiveness(&modifier, move, moveType, battlerDef, gBattleMons[battlerDef].type2, battlerAtk, recordAbilities);
@@ -8942,7 +9112,7 @@ static u16 CalcTypeEffectivenessMultiplierInternal(u16 move, u8 moveType, u8 bat
if (moveType == TYPE_GROUND && !IsBattlerGrounded(battlerDef) && !(gBattleMoves[move].flags & FLAG_DMG_UNGROUNDED_IGNORE_TYPE_IF_FLYING))
{
modifier = UQ_4_12(0.0);
- if (recordAbilities && GetBattlerAbility(battlerDef) == ABILITY_LEVITATE)
+ if (recordAbilities && defAbility == ABILITY_LEVITATE)
{
gLastUsedAbility = ABILITY_LEVITATE;
gMoveResultFlags |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE);
@@ -8955,6 +9125,10 @@ static u16 CalcTypeEffectivenessMultiplierInternal(u16 move, u8 moveType, u8 bat
{
modifier = UQ_4_12(0.0);
}
+ else if (B_GLARE_GHOST >= GEN_4 && move == MOVE_GLARE && IS_BATTLER_OF_TYPE(battlerDef, TYPE_GHOST))
+ {
+ modifier = UQ_4_12(1.0);
+ }
// Thousand Arrows ignores type modifiers for flying mons
if (!IsBattlerGrounded(battlerDef) && (gBattleMoves[move].flags & FLAG_DMG_UNGROUNDED_IGNORE_TYPE_IF_FLYING)
@@ -8963,8 +9137,8 @@ static u16 CalcTypeEffectivenessMultiplierInternal(u16 move, u8 moveType, u8 bat
modifier = UQ_4_12(1.0);
}
- if (((GetBattlerAbility(battlerDef) == ABILITY_WONDER_GUARD && modifier <= UQ_4_12(1.0))
- || (GetBattlerAbility(battlerDef) == ABILITY_TELEPATHY && battlerDef == BATTLE_PARTNER(battlerAtk)))
+ if (((defAbility == ABILITY_WONDER_GUARD && modifier <= UQ_4_12(1.0))
+ || (defAbility == ABILITY_TELEPATHY && battlerDef == BATTLE_PARTNER(battlerAtk)))
&& gBattleMoves[move].power)
{
modifier = UQ_4_12(0.0);
@@ -9140,6 +9314,10 @@ bool32 CanMegaEvolve(u8 battlerId)
return FALSE;
}
+ // Check if mon is currently held by Sky Drop
+ if (gStatuses3[battlerId] & STATUS3_SKY_DROPPED)
+ return FALSE;
+
// Gets mon data.
if (GetBattlerSide(battlerId) == B_SIDE_OPPONENT)
mon = &gEnemyParty[gBattlerPartyIndexes[battlerId]];
@@ -9154,8 +9332,13 @@ bool32 CanMegaEvolve(u8 battlerId)
{
if (B_ENABLE_DEBUG && gBattleStruct->debugHoldEffects[battlerId])
holdEffect = gBattleStruct->debugHoldEffects[battlerId];
+#ifdef ITEM_EXPANSION
+ else if (itemId == ITEM_ENIGMA_BERRY_E_READER)
+ holdEffect = gEnigmaBerries[battlerId].holdEffect;
+#else
else if (itemId == ITEM_ENIGMA_BERRY)
holdEffect = gEnigmaBerries[battlerId].holdEffect;
+#endif
else
holdEffect = ItemId_GetHoldEffect(itemId);
@@ -9217,23 +9400,24 @@ void UndoFormChange(u32 monId, u32 side, bool32 isSwitchingOut)
struct Pokemon *party = (side == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty;
static const u16 species[][3] =
{
- // Changed Form ID Default Form ID Should change on switch
- {SPECIES_MIMIKYU_BUSTED, SPECIES_MIMIKYU, FALSE},
- {SPECIES_GRENINJA_ASH, SPECIES_GRENINJA_BATTLE_BOND, FALSE},
- {SPECIES_MELOETTA_PIROUETTE, SPECIES_MELOETTA, FALSE},
- {SPECIES_AEGISLASH_BLADE, SPECIES_AEGISLASH, TRUE},
- {SPECIES_DARMANITAN_ZEN_MODE, SPECIES_DARMANITAN, TRUE},
- {SPECIES_MINIOR, SPECIES_MINIOR_CORE_RED, TRUE},
- {SPECIES_MINIOR_METEOR_BLUE, SPECIES_MINIOR_CORE_BLUE, TRUE},
- {SPECIES_MINIOR_METEOR_GREEN, SPECIES_MINIOR_CORE_GREEN, TRUE},
- {SPECIES_MINIOR_METEOR_INDIGO, SPECIES_MINIOR_CORE_INDIGO, TRUE},
- {SPECIES_MINIOR_METEOR_ORANGE, SPECIES_MINIOR_CORE_ORANGE, TRUE},
- {SPECIES_MINIOR_METEOR_VIOLET, SPECIES_MINIOR_CORE_VIOLET, TRUE},
- {SPECIES_MINIOR_METEOR_YELLOW, SPECIES_MINIOR_CORE_YELLOW, TRUE},
- {SPECIES_WISHIWASHI_SCHOOL, SPECIES_WISHIWASHI, TRUE},
- {SPECIES_CRAMORANT_GORGING, SPECIES_CRAMORANT, TRUE},
- {SPECIES_CRAMORANT_GULPING, SPECIES_CRAMORANT, TRUE},
- {SPECIES_MORPEKO_HANGRY, SPECIES_MORPEKO, TRUE},
+ // Changed Form ID Default Form ID Should change on switch
+ {SPECIES_MIMIKYU_BUSTED, SPECIES_MIMIKYU, FALSE},
+ {SPECIES_GRENINJA_ASH, SPECIES_GRENINJA_BATTLE_BOND, FALSE},
+ {SPECIES_MELOETTA_PIROUETTE, SPECIES_MELOETTA, FALSE},
+ {SPECIES_AEGISLASH_BLADE, SPECIES_AEGISLASH, TRUE},
+ {SPECIES_DARMANITAN_ZEN_MODE, SPECIES_DARMANITAN, TRUE},
+ {SPECIES_MINIOR, SPECIES_MINIOR_CORE_RED, TRUE},
+ {SPECIES_MINIOR_METEOR_BLUE, SPECIES_MINIOR_CORE_BLUE, TRUE},
+ {SPECIES_MINIOR_METEOR_GREEN, SPECIES_MINIOR_CORE_GREEN, TRUE},
+ {SPECIES_MINIOR_METEOR_INDIGO, SPECIES_MINIOR_CORE_INDIGO, TRUE},
+ {SPECIES_MINIOR_METEOR_ORANGE, SPECIES_MINIOR_CORE_ORANGE, TRUE},
+ {SPECIES_MINIOR_METEOR_VIOLET, SPECIES_MINIOR_CORE_VIOLET, TRUE},
+ {SPECIES_MINIOR_METEOR_YELLOW, SPECIES_MINIOR_CORE_YELLOW, TRUE},
+ {SPECIES_WISHIWASHI_SCHOOL, SPECIES_WISHIWASHI, TRUE},
+ {SPECIES_CRAMORANT_GORGING, SPECIES_CRAMORANT, TRUE},
+ {SPECIES_CRAMORANT_GULPING, SPECIES_CRAMORANT, TRUE},
+ {SPECIES_MORPEKO_HANGRY, SPECIES_MORPEKO, TRUE},
+ {SPECIES_DARMANITAN_ZEN_MODE_GALARIAN, SPECIES_DARMANITAN_GALARIAN, TRUE},
};
currSpecies = GetMonData(&party[monId], MON_DATA_SPECIES, NULL);
@@ -9272,7 +9456,7 @@ bool32 CanBattlerGetOrLoseItem(u8 battlerId, u16 itemId)
{
u16 species = gBattleMons[battlerId].species;
u16 holdEffect = ItemId_GetHoldEffect(itemId);
-
+
// Mail can be stolen now
if (itemId == ITEM_ENIGMA_BERRY)
return FALSE;
@@ -9452,17 +9636,13 @@ bool32 CanFling(u8 battlerId)
u16 itemEffect = ItemId_GetHoldEffect(item);
if (item == ITEM_NONE
+ #if B_KLUTZ_FLING_INTERACTION >= GEN_5
|| GetBattlerAbility(battlerId) == ABILITY_KLUTZ
+ #endif
|| gFieldStatuses & STATUS_FIELD_MAGIC_ROOM
|| gDisableStructs[battlerId].embargoTimer != 0
- || !CanBattlerGetOrLoseItem(battlerId, item)
- //|| itemEffect == HOLD_EFFECT_PRIMAL_ORB
- || itemEffect == HOLD_EFFECT_GEMS
- #ifdef ITEM_ABILITY_CAPSULE
- || item == ITEM_ABILITY_CAPSULE
- #endif
- || (ItemId_GetPocket(item) == POCKET_BERRIES && IsAbilityOnSide(battlerId, ABILITY_UNNERVE))
- || GetPocketByItemId(item) == POCKET_POKE_BALLS)
+ || ItemId_GetFlingPower(item) != 0
+ || !CanBattlerGetOrLoseItem(battlerId, item))
return FALSE;
return TRUE;
@@ -9552,7 +9732,7 @@ void SortBattlersBySpeed(u8 *battlers, bool8 slowToFast)
{
int i, j, currSpeed, currBattler;
u16 speeds[4] = {0};
-
+
for (i = 0; i < gBattlersCount; i++)
speeds[i] = GetBattlerTotalSpeedStat(battlers[i]);
@@ -9590,7 +9770,7 @@ void TryRestoreStolenItems(void)
{
u32 i;
u16 stolenItem = ITEM_NONE;
-
+
for (i = 0; i < PARTY_SIZE; i++)
{
if (gBattleStruct->itemStolen[i].stolen)
@@ -9605,10 +9785,10 @@ void TryRestoreStolenItems(void)
bool32 CanStealItem(u8 battlerStealing, u8 battlerItem, u16 item)
{
u8 stealerSide = GetBattlerSide(battlerStealing);
-
+
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL)
return FALSE;
-
+
// Check if the battler trying to steal should be able to
if (stealerSide == B_SIDE_OPPONENT
&& !(gBattleTypeFlags &
@@ -9634,11 +9814,11 @@ bool32 CanStealItem(u8 battlerStealing, u8 battlerItem, u16 item)
{
return FALSE;
}
-
+
if (!CanBattlerGetOrLoseItem(battlerItem, item) // Battler with item cannot have it stolen
||!CanBattlerGetOrLoseItem(battlerStealing, item)) // Stealer cannot take the item
return FALSE;
-
+
return TRUE;
}
@@ -9686,7 +9866,7 @@ bool32 CompareStat(u8 battlerId, u8 statId, u8 cmpTo, u8 cmpKind)
{
bool8 ret = FALSE;
u8 statValue = gBattleMons[battlerId].statStages[statId];
-
+
// Because this command is used as a way of checking if a stat can be lowered/raised,
// we need to do some modification at run-time.
if (GetBattlerAbility(battlerId) == ABILITY_CONTRARY)
@@ -9729,7 +9909,7 @@ bool32 CompareStat(u8 battlerId, u8 statId, u8 cmpTo, u8 cmpKind)
ret = TRUE;
break;
}
-
+
return ret;
}
@@ -9779,16 +9959,16 @@ bool32 TryRoomService(u8 battlerId)
void DoBurmyFormChange(u32 monId)
{
u16 newSpecies, currSpecies;
- s32 sentIn;
struct Pokemon *party = gPlayerParty;
- sentIn = gSentPokesToOpponent[(gBattlerFainted & 2) >> 1];
currSpecies = GetMonData(&party[monId], MON_DATA_SPECIES, NULL);
- if ((GET_BASE_SPECIES_ID(currSpecies) == SPECIES_BURMY) && (gBitTable[monId] & sentIn))
+ if ((GET_BASE_SPECIES_ID(currSpecies) == SPECIES_BURMY)
+ && (gBattleStruct->appearedInBattle & gBitTable[monId]) // Burmy appeared in battle
+ && GetMonData(&party[monId], MON_DATA_HP, NULL) != 0) // Burmy isn't fainted
{
switch (gBattleTerrain)
- {
+ {
case BATTLE_TERRAIN_GRASS:
case BATTLE_TERRAIN_LONG_GRASS:
case BATTLE_TERRAIN_POND:
@@ -9829,7 +10009,7 @@ bool32 BlocksPrankster(u16 move, u8 battlerPrankster, u8 battlerDef, bool32 chec
return FALSE;
if (gStatuses3[battlerDef] & STATUS3_SEMI_INVULNERABLE)
return FALSE;
-
+
return TRUE;
#endif
return FALSE;
@@ -9844,13 +10024,13 @@ bool32 IsBattlerWeatherAffected(u8 battlerId, u32 weatherFlags)
{
if (!WEATHER_HAS_EFFECT)
return FALSE;
-
+
if (gBattleWeather & weatherFlags)
{
// given weather is active -> check if its sun, rain against utility umbrella ( since only 1 weather can be active at once)
if (gBattleWeather & (B_WEATHER_SUN | B_WEATHER_RAIN) && GetBattlerHoldEffect(battlerId, TRUE) == HOLD_EFFECT_UTILITY_UMBRELLA)
return FALSE; // utility umbrella blocks sun, rain effects
-
+
return TRUE;
}
return FALSE;
diff --git a/src/berry_crush.c b/src/berry_crush.c
index 9b8323e2d7..e7a5df951c 100755
--- a/src/berry_crush.c
+++ b/src/berry_crush.c
@@ -1947,15 +1947,15 @@ static void DrawPlayerNameWindows(struct BerryCrushGame *game)
static void CopyPlayerNameWindowGfxToBg(struct BerryCrushGame *game)
{
u8 i = 0;
- u8 * crusherGfx;
+ u8 * windowGfx;
- LZ77UnCompWram(gBerryCrush_Crusher_Tilemap, gDecompressionBuffer);
+ LZ77UnCompWram(gBerryCrush_TextWindows_Tilemap, gDecompressionBuffer);
- for (crusherGfx = gDecompressionBuffer; i < game->playerCount; i++)
+ for (windowGfx = gDecompressionBuffer; i < game->playerCount; i++)
{
CopyToBgTilemapBufferRect(
3,
- &crusherGfx[game->gfx.playerCoords[i]->playerId * 40],
+ &windowGfx[game->gfx.playerCoords[i]->playerId * 40],
game->gfx.playerCoords[i]->windowGfxX,
game->gfx.playerCoords[i]->windowGfxY,
10,
diff --git a/src/berry_tag_screen.c b/src/berry_tag_screen.c
index a650788aab..3da0d3957b 100644
--- a/src/berry_tag_screen.c
+++ b/src/berry_tag_screen.c
@@ -92,7 +92,7 @@ static const struct BgTemplate sBackgroundTemplates[] =
}
};
-static const u16 sFontPalette[] = INCBIN_U16("graphics/interface/berry_tag_screen.gbapal");
+static const u16 sFontPalette[] = INCBIN_U16("graphics/bag/berry_tag_screen.gbapal");
static const u8 sTextColors[2][3] =
{
diff --git a/src/bike.c b/src/bike.c
index 20166392e9..ae30ce288b 100644
--- a/src/bike.c
+++ b/src/bike.c
@@ -108,7 +108,7 @@ static u8 (*const sAcroBikeInputHandlers[])(u8 *, u16, u16) =
};
// used with bikeFrameCounter from mach bike
-static const u16 sMachBikeSpeeds[] = {BIKE_SPEED_NORMAL, BIKE_SPEED_FAST, BIKE_SPEED_FASTEST};
+static const u16 sMachBikeSpeeds[] = {PLAYER_SPEED_NORMAL, PLAYER_SPEED_FAST, PLAYER_SPEED_FASTEST};
// this is a list of timers to compare against later, terminated with 0. the only timer being compared against is 4 frames in this list.
static const u8 sAcroBikeJumpTimerList[] = {4, 0};
@@ -147,7 +147,7 @@ static u8 GetMachBikeTransition(u8 *dirTraveling)
if (*dirTraveling == 0)
{
*dirTraveling = direction; // update the direction, since below we either faced a direction or we started moving.
- if (gPlayerAvatar.bikeSpeed == BIKE_SPEED_STANDING)
+ if (gPlayerAvatar.bikeSpeed == PLAYER_SPEED_STANDING)
{
gPlayerAvatar.runningState = NOT_MOVING;
return MACH_TRANS_FACE_DIRECTION;
@@ -159,7 +159,7 @@ static u8 GetMachBikeTransition(u8 *dirTraveling)
// we need to check if the last traveled direction changed from the new direction as well as ensuring that we dont update the state while the player is moving: see the else check.
if (*dirTraveling != direction && gPlayerAvatar.runningState != MOVING)
{
- if (gPlayerAvatar.bikeSpeed != BIKE_SPEED_STANDING)
+ if (gPlayerAvatar.bikeSpeed != PLAYER_SPEED_STANDING)
{
*dirTraveling = direction; // implement the new direction
gPlayerAvatar.runningState = MOVING;
@@ -246,7 +246,7 @@ static void MachBikeTransition_TrySlowDown(u8 direction)
{
u8 collision;
- if (gPlayerAvatar.bikeSpeed != BIKE_SPEED_STANDING)
+ if (gPlayerAvatar.bikeSpeed != PLAYER_SPEED_STANDING)
gPlayerAvatar.bikeFrameCounter = --gPlayerAvatar.bikeSpeed;
collision = GetBikeCollision(direction);
@@ -306,7 +306,7 @@ static u8 AcroBikeHandleInputNormal(u8 *newDirection, u16 newKeys, u16 heldKeys)
return ACRO_TRANS_FACE_DIRECTION;
}
}
- if (*newDirection == direction && (heldKeys & B_BUTTON) && gPlayerAvatar.bikeSpeed == BIKE_SPEED_STANDING)
+ if (*newDirection == direction && (heldKeys & B_BUTTON) && gPlayerAvatar.bikeSpeed == PLAYER_SPEED_STANDING)
{
gPlayerAvatar.bikeSpeed++;
gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_MOVING;
@@ -342,7 +342,7 @@ static u8 AcroBikeHandleInputTurning(u8 *newDirection, u16 newKeys, u16 heldKeys
if (*newDirection == AcroBike_GetJumpDirection())
{
Bike_SetBikeStill(); // Bike_SetBikeStill sets speed to standing, but the next line immediately overrides it. could have just reset acroBikeState to 0 here instead of wasting a jump.
- gPlayerAvatar.bikeSpeed = BIKE_SPEED_NORMAL;
+ gPlayerAvatar.bikeSpeed = PLAYER_SPEED_NORMAL;
if (*newDirection == GetOppositeDirection(direction))
{
// do a turn jump.
@@ -775,7 +775,7 @@ static void AcroBike_TryHistoryUpdate(u16 newKeys, u16 heldKeys) // newKeys is u
else
{
Bike_UpdateDirTimerHistory(direction);
- gPlayerAvatar.bikeSpeed = BIKE_SPEED_STANDING;
+ gPlayerAvatar.bikeSpeed = PLAYER_SPEED_STANDING;
}
direction = heldKeys & (A_BUTTON | B_BUTTON | SELECT_BUTTON | START_BUTTON); // directions is reused for some reason.
@@ -787,7 +787,7 @@ static void AcroBike_TryHistoryUpdate(u16 newKeys, u16 heldKeys) // newKeys is u
else
{
Bike_UpdateABStartSelectHistory(direction);
- gPlayerAvatar.bikeSpeed = BIKE_SPEED_STANDING;
+ gPlayerAvatar.bikeSpeed = PLAYER_SPEED_STANDING;
}
}
@@ -900,7 +900,7 @@ static bool8 IsRunningDisallowedByMetatile(u8 tile)
{
if (MetatileBehavior_IsRunningDisallowed(tile))
return TRUE;
- if (MetatileBehavior_IsFortreeBridge(tile) && (PlayerGetZCoord() & 1) == 0)
+ if (MetatileBehavior_IsFortreeBridge(tile) && (PlayerGetElevation() & 1) == 0)
return TRUE;
return FALSE;
}
@@ -994,7 +994,7 @@ void BikeClearState(int newDirHistory, int newAbStartHistory)
gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL;
gPlayerAvatar.newDirBackup = DIR_NONE;
gPlayerAvatar.bikeFrameCounter = 0;
- gPlayerAvatar.bikeSpeed = BIKE_SPEED_STANDING;
+ gPlayerAvatar.bikeSpeed = PLAYER_SPEED_STANDING;
gPlayerAvatar.directionHistory = newDirHistory;
gPlayerAvatar.abStartSelectHistory = newAbStartHistory;
@@ -1014,7 +1014,7 @@ void Bike_UpdateBikeCounterSpeed(u8 counter)
static void Bike_SetBikeStill(void)
{
gPlayerAvatar.bikeFrameCounter = 0;
- gPlayerAvatar.bikeSpeed = BIKE_SPEED_STANDING;
+ gPlayerAvatar.bikeSpeed = PLAYER_SPEED_STANDING;
}
s16 GetPlayerSpeed(void)
@@ -1027,11 +1027,11 @@ s16 GetPlayerSpeed(void)
if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_MACH_BIKE)
return machSpeeds[gPlayerAvatar.bikeFrameCounter];
else if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE)
- return BIKE_SPEED_FASTER;
+ return PLAYER_SPEED_FASTER;
else if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_SURFING | PLAYER_AVATAR_FLAG_DASH))
- return BIKE_SPEED_FAST;
+ return PLAYER_SPEED_FAST;
else
- return BIKE_SPEED_NORMAL;
+ return PLAYER_SPEED_NORMAL;
}
void Bike_HandleBumpySlopeJump(void)
diff --git a/src/braille_puzzles.c b/src/braille_puzzles.c
index 26caa830d3..876e6b4a73 100644
--- a/src/braille_puzzles.c
+++ b/src/braille_puzzles.c
@@ -80,9 +80,9 @@ void DoBrailleDigEffect(void)
MapGridSetMetatileIdAt( 9 + MAP_OFFSET, 1 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_TopLeft);
MapGridSetMetatileIdAt(10 + MAP_OFFSET, 1 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_TopMid);
MapGridSetMetatileIdAt(11 + MAP_OFFSET, 1 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_TopRight);
- MapGridSetMetatileIdAt( 9 + MAP_OFFSET, 2 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_BottomLeft | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt( 9 + MAP_OFFSET, 2 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_BottomLeft | MAPGRID_COLLISION_MASK);
MapGridSetMetatileIdAt(10 + MAP_OFFSET, 2 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_BottomMid);
- MapGridSetMetatileIdAt(11 + MAP_OFFSET, 2 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_BottomRight | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(11 + MAP_OFFSET, 2 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_BottomRight | MAPGRID_COLLISION_MASK);
DrawWholeMapView();
PlaySE(SE_BANG);
FlagSet(FLAG_SYS_BRAILLE_DIG);
@@ -207,9 +207,9 @@ static void DoBrailleRegirockEffect(void)
MapGridSetMetatileIdAt(7 + MAP_OFFSET, 19 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_TopLeft);
MapGridSetMetatileIdAt(8 + MAP_OFFSET, 19 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_TopMid);
MapGridSetMetatileIdAt(9 + MAP_OFFSET, 19 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_TopRight);
- MapGridSetMetatileIdAt(7 + MAP_OFFSET, 20 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_BottomLeft | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(7 + MAP_OFFSET, 20 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_BottomLeft | MAPGRID_COLLISION_MASK);
MapGridSetMetatileIdAt(8 + MAP_OFFSET, 20 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_BottomMid);
- MapGridSetMetatileIdAt(9 + MAP_OFFSET, 20 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_BottomRight | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(9 + MAP_OFFSET, 20 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_BottomRight | MAPGRID_COLLISION_MASK);
DrawWholeMapView();
PlaySE(SE_BANG);
FlagSet(FLAG_SYS_REGIROCK_PUZZLE_COMPLETED);
@@ -246,9 +246,9 @@ static void DoBrailleRegisteelEffect(void)
MapGridSetMetatileIdAt(7 + MAP_OFFSET, 19 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_TopLeft);
MapGridSetMetatileIdAt(8 + MAP_OFFSET, 19 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_TopMid);
MapGridSetMetatileIdAt(9 + MAP_OFFSET, 19 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_TopRight);
- MapGridSetMetatileIdAt(7 + MAP_OFFSET, 20 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_BottomLeft | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(7 + MAP_OFFSET, 20 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_BottomLeft | MAPGRID_COLLISION_MASK);
MapGridSetMetatileIdAt(8 + MAP_OFFSET, 20 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_BottomMid);
- MapGridSetMetatileIdAt(9 + MAP_OFFSET, 20 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_BottomRight | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(9 + MAP_OFFSET, 20 + MAP_OFFSET, METATILE_Cave_SealedChamberEntrance_BottomRight | MAPGRID_COLLISION_MASK);
DrawWholeMapView();
PlaySE(SE_BANG);
FlagSet(FLAG_SYS_REGISTEEL_PUZZLE_COMPLETED);
diff --git a/src/crt0.s b/src/crt0.s
index 7c679c13b5..523061f52d 100644
--- a/src/crt0.s
+++ b/src/crt0.s
@@ -6,7 +6,7 @@
.align 2, 0
.global Init
-Init: @ 8000204
+Init:
mov r0, #PSR_IRQ_MODE
msr cpsr_cf, r0
ldr sp, sp_irq
@@ -34,7 +34,7 @@ sp_irq: .word IWRAM_END - 0x60
.arm
.align 2, 0
.global IntrMain
-IntrMain: @ 8000248
+IntrMain:
mov r3, #REG_BASE
add r3, r3, #OFFSET_REG_IE
ldr r2, [r3]
diff --git a/src/data/battle_moves.h b/src/data/battle_moves.h
index c9a332b9fc..890c8bafb5 100644
--- a/src/data/battle_moves.h
+++ b/src/data/battle_moves.h
@@ -8009,7 +8009,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] =
[MOVE_SKY_DROP] =
{
- .effect = EFFECT_PLACEHOLDER, // Needs a custom move effect
+ .effect = EFFECT_SKY_DROP,
.power = 60,
.type = TYPE_FLYING,
.accuracy = 100,
diff --git a/src/data/easy_chat/easy_chat_words_by_letter.h b/src/data/easy_chat/easy_chat_words_by_letter.h
index df6524b173..8bfe237296 100755
--- a/src/data/easy_chat/easy_chat_words_by_letter.h
+++ b/src/data/easy_chat/easy_chat_words_by_letter.h
@@ -1,5 +1,4 @@
#include "easy_chat.h"
-#include "constants/easy_chat.h"
#define DOUBLE_SPECIES_NAME EC_EMPTY_WORD, 2,
diff --git a/src/data/graphics/berries.h b/src/data/graphics/berries.h
index 919f4e276a..36658427f9 100644
--- a/src/data/graphics/berries.h
+++ b/src/data/graphics/berries.h
@@ -1,10 +1,10 @@
-const u32 gBerryCheck_Gfx[] = INCBIN_U32("graphics/interface/check_berry.4bpp.lz");
-const u32 gBerryCheck_Pal[] = INCBIN_U32("graphics/interface/check_berry.gbapal.lz");
+const u32 gBerryCheck_Gfx[] = INCBIN_U32("graphics/bag/check_berry.4bpp.lz");
+const u32 gBerryCheck_Pal[] = INCBIN_U32("graphics/bag/check_berry.gbapal.lz");
-const u32 gBerryTag_Gfx[] = INCBIN_U32("graphics/interface/berry_tag.bin.lz");
-const u32 gBerryTag_Pal[] = INCBIN_U32("graphics/interface/berry_tag_title.bin.lz");
+const u32 gBerryTag_Gfx[] = INCBIN_U32("graphics/bag/berry_tag.bin.lz");
+const u32 gBerryTag_Pal[] = INCBIN_U32("graphics/bag/berry_tag_title.bin.lz");
-const u32 gBerryCheckCircle_Gfx[] = INCBIN_U32("graphics/interface/check_berry_circle.4bpp.lz");
+const u32 gBerryCheckCircle_Gfx[] = INCBIN_U32("graphics/bag/check_berry_circle.4bpp.lz");
const u32 gBerryPic_Cheri[] = INCBIN_U32("graphics/berries/cheri.4bpp.lz");
const u32 gBerryPic_Chesto[] = INCBIN_U32("graphics/berries/chesto.4bpp.lz");
diff --git a/src/data/graphics/interface_pokeballs.h b/src/data/graphics/interface_pokeballs.h
deleted file mode 100644
index b3711f63aa..0000000000
--- a/src/data/graphics/interface_pokeballs.h
+++ /dev/null
@@ -1,82 +0,0 @@
-const u32 gInterfaceGfx_PokeBall[] = INCBIN_U32("graphics/interface/ball/poke.4bpp.lz");
-const u32 gInterfacePal_PokeBall[] = INCBIN_U32("graphics/interface/ball/poke.gbapal.lz");
-
-const u32 gInterfaceGfx_GreatBall[] = INCBIN_U32("graphics/interface/ball/great.4bpp.lz");
-const u32 gInterfacePal_GreatBall[] = INCBIN_U32("graphics/interface/ball/great.gbapal.lz");
-
-const u32 gInterfaceGfx_UltraBall[] = INCBIN_U32("graphics/interface/ball/ultra.4bpp.lz");
-const u32 gInterfacePal_UltraBall[] = INCBIN_U32("graphics/interface/ball/ultra.gbapal.lz");
-
-const u32 gInterfaceGfx_MasterBall[] = INCBIN_U32("graphics/interface/ball/master.4bpp.lz");
-const u32 gInterfacePal_MasterBall[] = INCBIN_U32("graphics/interface/ball/master.gbapal.lz");
-
-const u32 gInterfaceGfx_PremierBall[] = INCBIN_U32("graphics/interface/ball/premier.4bpp.lz");
-const u32 gInterfacePal_PremierBall[] = INCBIN_U32("graphics/interface/ball/premier.gbapal.lz");
-
-const u32 gInterfaceGfx_HealBall[] = INCBIN_U32("graphics/interface/ball/heal.4bpp.lz");
-const u32 gInterfacePal_HealBall[] = INCBIN_U32("graphics/interface/ball/heal.gbapal.lz");
-
-const u32 gInterfaceGfx_NetBall[] = INCBIN_U32("graphics/interface/ball/net.4bpp.lz");
-const u32 gInterfacePal_NetBall[] = INCBIN_U32("graphics/interface/ball/net.gbapal.lz");
-
-const u32 gInterfaceGfx_NestBall[] = INCBIN_U32("graphics/interface/ball/nest.4bpp.lz");
-const u32 gInterfacePal_NestBall[] = INCBIN_U32("graphics/interface/ball/nest.gbapal.lz");
-
-const u32 gInterfaceGfx_DiveBall[] = INCBIN_U32("graphics/interface/ball/dive.4bpp.lz");
-const u32 gInterfacePal_DiveBall[] = INCBIN_U32("graphics/interface/ball/dive.gbapal.lz");
-
-const u32 gInterfaceGfx_DuskBall[] = INCBIN_U32("graphics/interface/ball/dusk.4bpp.lz");
-const u32 gInterfacePal_DuskBall[] = INCBIN_U32("graphics/interface/ball/dusk.gbapal.lz");
-
-const u32 gInterfaceGfx_TimerBall[] = INCBIN_U32("graphics/interface/ball/timer.4bpp.lz");
-const u32 gInterfacePal_TimerBall[] = INCBIN_U32("graphics/interface/ball/timer.gbapal.lz");
-
-const u32 gInterfaceGfx_QuickBall[] = INCBIN_U32("graphics/interface/ball/quick.4bpp.lz");
-const u32 gInterfacePal_QuickBall[] = INCBIN_U32("graphics/interface/ball/quick.gbapal.lz");
-
-const u32 gInterfaceGfx_RepeatBall[] = INCBIN_U32("graphics/interface/ball/repeat.4bpp.lz");
-const u32 gInterfacePal_RepeatBall[] = INCBIN_U32("graphics/interface/ball/repeat.gbapal.lz");
-
-const u32 gInterfaceGfx_LuxuryBall[] = INCBIN_U32("graphics/interface/ball/luxury.4bpp.lz");
-const u32 gInterfacePal_LuxuryBall[] = INCBIN_U32("graphics/interface/ball/luxury.gbapal.lz");
-
-const u32 gInterfaceGfx_LevelBall[] = INCBIN_U32("graphics/interface/ball/level.4bpp.lz");
-const u32 gInterfacePal_LevelBall[] = INCBIN_U32("graphics/interface/ball/level.gbapal.lz");
-
-const u32 gInterfaceGfx_LureBall[] = INCBIN_U32("graphics/interface/ball/lure.4bpp.lz");
-const u32 gInterfacePal_LureBall[] = INCBIN_U32("graphics/interface/ball/lure.gbapal.lz");
-
-const u32 gInterfaceGfx_MoonBall[] = INCBIN_U32("graphics/interface/ball/moon.4bpp.lz");
-const u32 gInterfacePal_MoonBall[] = INCBIN_U32("graphics/interface/ball/moon.gbapal.lz");
-
-const u32 gInterfaceGfx_FriendBall[] = INCBIN_U32("graphics/interface/ball/friend.4bpp.lz");
-const u32 gInterfacePal_FriendBall[] = INCBIN_U32("graphics/interface/ball/friend.gbapal.lz");
-
-const u32 gInterfaceGfx_LoveBall[] = INCBIN_U32("graphics/interface/ball/love.4bpp.lz");
-const u32 gInterfacePal_LoveBall[] = INCBIN_U32("graphics/interface/ball/love.gbapal.lz");
-
-const u32 gInterfaceGfx_FastBall[] = INCBIN_U32("graphics/interface/ball/fast.4bpp.lz");
-const u32 gInterfacePal_FastBall[] = INCBIN_U32("graphics/interface/ball/fast.gbapal.lz");
-
-const u32 gInterfaceGfx_HeavyBall[] = INCBIN_U32("graphics/interface/ball/heavy.4bpp.lz");
-const u32 gInterfacePal_HeavyBall[] = INCBIN_U32("graphics/interface/ball/heavy.gbapal.lz");
-
-const u32 gInterfaceGfx_DreamBall[] = INCBIN_U32("graphics/interface/ball/dream.4bpp.lz");
-const u32 gInterfacePal_DreamBall[] = INCBIN_U32("graphics/interface/ball/dream.gbapal.lz");
-
-const u32 gInterfaceGfx_SafariBall[] = INCBIN_U32("graphics/interface/ball/safari.4bpp.lz");
-const u32 gInterfacePal_SafariBall[] = INCBIN_U32("graphics/interface/ball/safari.gbapal.lz");
-
-const u32 gInterfaceGfx_SportBall[] = INCBIN_U32("graphics/interface/ball/sport.4bpp.lz");
-const u32 gInterfacePal_SportBall[] = INCBIN_U32("graphics/interface/ball/sport.gbapal.lz");
-
-const u32 gInterfaceGfx_ParkBall[] = INCBIN_U32("graphics/interface/ball/park.4bpp.lz");
-const u32 gInterfacePal_ParkBall[] = INCBIN_U32("graphics/interface/ball/park.gbapal.lz");
-
-const u32 gInterfaceGfx_BeastBall[] = INCBIN_U32("graphics/interface/ball/beast.4bpp.lz");
-const u32 gInterfacePal_BeastBall[] = INCBIN_U32("graphics/interface/ball/beast.gbapal.lz");
-
-const u32 gInterfaceGfx_CherishBall[] = INCBIN_U32("graphics/interface/ball/cherish.4bpp.lz");
-const u32 gInterfacePal_CherishBall[] = INCBIN_U32("graphics/interface/ball/cherish.gbapal.lz");
-
-const u32 gOpenPokeballGfx[] = INCBIN_U32("graphics/interface/ball_open.4bpp.lz");
diff --git a/src/data/graphics/pokeballs.h b/src/data/graphics/pokeballs.h
new file mode 100644
index 0000000000..44f47cde48
--- /dev/null
+++ b/src/data/graphics/pokeballs.h
@@ -0,0 +1,82 @@
+const u32 gBallGfx_Poke[] = INCBIN_U32("graphics/balls/poke.4bpp.lz");
+const u32 gBallPal_Poke[] = INCBIN_U32("graphics/balls/poke.gbapal.lz");
+
+const u32 gBallGfx_Great[] = INCBIN_U32("graphics/balls/great.4bpp.lz");
+const u32 gBallPal_Great[] = INCBIN_U32("graphics/balls/great.gbapal.lz");
+
+const u32 gBallGfx_Ultra[] = INCBIN_U32("graphics/balls/ultra.4bpp.lz");
+const u32 gBallPal_Ultra[] = INCBIN_U32("graphics/balls/ultra.gbapal.lz");
+
+const u32 gBallGfx_Master[] = INCBIN_U32("graphics/balls/master.4bpp.lz");
+const u32 gBallPal_Master[] = INCBIN_U32("graphics/balls/master.gbapal.lz");
+
+const u32 gBallGfx_Premier[] = INCBIN_U32("graphics/balls/premier.4bpp.lz");
+const u32 gBallPal_Premier[] = INCBIN_U32("graphics/balls/premier.gbapal.lz");
+
+const u32 gBallGfx_Heal[] = INCBIN_U32("graphics/balls/heal.4bpp.lz");
+const u32 gBallPal_Heal[] = INCBIN_U32("graphics/balls/heal.gbapal.lz");
+
+const u32 gBallGfx_Net[] = INCBIN_U32("graphics/balls/net.4bpp.lz");
+const u32 gBallPal_Net[] = INCBIN_U32("graphics/balls/net.gbapal.lz");
+
+const u32 gBallGfx_Nest[] = INCBIN_U32("graphics/balls/nest.4bpp.lz");
+const u32 gBallPal_Nest[] = INCBIN_U32("graphics/balls/nest.gbapal.lz");
+
+const u32 gBallGfx_Dive[] = INCBIN_U32("graphics/balls/dive.4bpp.lz");
+const u32 gBallPal_Dive[] = INCBIN_U32("graphics/balls/dive.gbapal.lz");
+
+const u32 gBallGfx_Dusk[] = INCBIN_U32("graphics/balls/dusk.4bpp.lz");
+const u32 gBallPal_Dusk[] = INCBIN_U32("graphics/balls/dusk.gbapal.lz");
+
+const u32 gBallGfx_Timer[] = INCBIN_U32("graphics/balls/timer.4bpp.lz");
+const u32 gBallPal_Timer[] = INCBIN_U32("graphics/balls/timer.gbapal.lz");
+
+const u32 gBallGfx_Quick[] = INCBIN_U32("graphics/balls/quick.4bpp.lz");
+const u32 gBallPal_Quick[] = INCBIN_U32("graphics/balls/quick.gbapal.lz");
+
+const u32 gBallGfx_Repeat[] = INCBIN_U32("graphics/balls/repeat.4bpp.lz");
+const u32 gBallPal_Repeat[] = INCBIN_U32("graphics/balls/repeat.gbapal.lz");
+
+const u32 gBallGfx_Luxury[] = INCBIN_U32("graphics/balls/luxury.4bpp.lz");
+const u32 gBallPal_Luxury[] = INCBIN_U32("graphics/balls/luxury.gbapal.lz");
+
+const u32 gBallGfx_Level[] = INCBIN_U32("graphics/balls/level.4bpp.lz");
+const u32 gBallPal_Level[] = INCBIN_U32("graphics/balls/level.gbapal.lz");
+
+const u32 gBallGfx_Lure[] = INCBIN_U32("graphics/balls/lure.4bpp.lz");
+const u32 gBallPal_Lure[] = INCBIN_U32("graphics/balls/lure.gbapal.lz");
+
+const u32 gBallGfx_Moon[] = INCBIN_U32("graphics/balls/moon.4bpp.lz");
+const u32 gBallPal_Moon[] = INCBIN_U32("graphics/balls/moon.gbapal.lz");
+
+const u32 gBallGfx_Friend[] = INCBIN_U32("graphics/balls/friend.4bpp.lz");
+const u32 gBallPal_Friend[] = INCBIN_U32("graphics/balls/friend.gbapal.lz");
+
+const u32 gBallGfx_Love[] = INCBIN_U32("graphics/balls/love.4bpp.lz");
+const u32 gBallPal_Love[] = INCBIN_U32("graphics/balls/love.gbapal.lz");
+
+const u32 gBallGfx_Fast[] = INCBIN_U32("graphics/balls/fast.4bpp.lz");
+const u32 gBallPal_Fast[] = INCBIN_U32("graphics/balls/fast.gbapal.lz");
+
+const u32 gBallGfx_Heavy[] = INCBIN_U32("graphics/balls/heavy.4bpp.lz");
+const u32 gBallPal_Heavy[] = INCBIN_U32("graphics/balls/heavy.gbapal.lz");
+
+const u32 gBallGfx_Dream[] = INCBIN_U32("graphics/balls/dream.4bpp.lz");
+const u32 gBallPal_Dream[] = INCBIN_U32("graphics/balls/dream.gbapal.lz");
+
+const u32 gBallGfx_Safari[] = INCBIN_U32("graphics/balls/safari.4bpp.lz");
+const u32 gBallPal_Safari[] = INCBIN_U32("graphics/balls/safari.gbapal.lz");
+
+const u32 gBallGfx_Sport[] = INCBIN_U32("graphics/balls/sport.4bpp.lz");
+const u32 gBallPal_Sport[] = INCBIN_U32("graphics/balls/sport.gbapal.lz");
+
+const u32 gBallGfx_Park[] = INCBIN_U32("graphics/balls/park.4bpp.lz");
+const u32 gBallPal_Park[] = INCBIN_U32("graphics/balls/park.gbapal.lz");
+
+const u32 gBallGfx_Beast[] = INCBIN_U32("graphics/balls/beast.4bpp.lz");
+const u32 gBallPal_Beast[] = INCBIN_U32("graphics/balls/beast.gbapal.lz");
+
+const u32 gBallGfx_Cherish[] = INCBIN_U32("graphics/balls/cherish.4bpp.lz");
+const u32 gBallPal_Cherish[] = INCBIN_U32("graphics/balls/cherish.gbapal.lz");
+
+const u32 gOpenPokeballGfx[] = INCBIN_U32("graphics/balls/open.4bpp.lz");
diff --git a/src/data/items.h b/src/data/items.h
index 6d27d8f80f..16e6b34de3 100644
--- a/src/data/items.h
+++ b/src/data/items.h
@@ -8574,7 +8574,6 @@ const struct Item gItems[] =
.name = _("Gracidea"),
.itemId = ITEM_GRACIDEA,
.price = 0,
- .holdEffect = HOLD_EFFECT_GRACIDEA,
.description = sGracideaDesc,
.pocket = POCKET_KEY_ITEMS,
#ifdef POKEMON_EXPANSION
@@ -8722,7 +8721,7 @@ const struct Item gItems[] =
.price = 0,
.description = sBicycleDesc,
.importance = 1,
- .unk19 = 1,
+ .registrability = TRUE,
.pocket = POCKET_KEY_ITEMS,
.type = ITEM_USE_FIELD,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
@@ -8735,7 +8734,7 @@ const struct Item gItems[] =
.price = 0,
.description = sMachBikeDesc,
.importance = 1,
- .unk19 = 1,
+ .registrability = TRUE,
.pocket = POCKET_KEY_ITEMS,
.type = ITEM_USE_FIELD,
.fieldUseFunc = ItemUseOutOfBattle_Bike,
@@ -8749,7 +8748,7 @@ const struct Item gItems[] =
.price = 0,
.description = sAcroBikeDesc,
.importance = 1,
- .unk19 = 1,
+ .registrability = TRUE,
.pocket = POCKET_KEY_ITEMS,
.type = ITEM_USE_FIELD,
.fieldUseFunc = ItemUseOutOfBattle_Bike,
@@ -8763,7 +8762,7 @@ const struct Item gItems[] =
.price = 0,
.description = sOldRodDesc,
.importance = 1,
- .unk19 = 1,
+ .registrability = TRUE,
.pocket = POCKET_KEY_ITEMS,
.type = ITEM_USE_FIELD,
.fieldUseFunc = ItemUseOutOfBattle_Rod,
@@ -8777,7 +8776,7 @@ const struct Item gItems[] =
.price = 0,
.description = sGoodRodDesc,
.importance = 1,
- .unk19 = 1,
+ .registrability = TRUE,
.pocket = POCKET_KEY_ITEMS,
.type = ITEM_USE_FIELD,
.fieldUseFunc = ItemUseOutOfBattle_Rod,
@@ -8791,7 +8790,7 @@ const struct Item gItems[] =
.price = 0,
.description = sSuperRodDesc,
.importance = 1,
- .unk19 = 1,
+ .registrability = TRUE,
.pocket = POCKET_KEY_ITEMS,
.type = ITEM_USE_FIELD,
.fieldUseFunc = ItemUseOutOfBattle_Rod,
@@ -8805,7 +8804,7 @@ const struct Item gItems[] =
.price = 0,
.description = sDowsingMachineDesc,
.importance = 1,
- .unk19 = 1,
+ .registrability = TRUE,
.pocket = POCKET_KEY_ITEMS,
.type = ITEM_USE_FIELD,
.fieldUseFunc = ItemUseOutOfBattle_Itemfinder,
@@ -8818,7 +8817,7 @@ const struct Item gItems[] =
.price = 0,
.description = sTownMapDesc,
.importance = 1,
- .unk19 = 1,
+ .registrability = TRUE,
.pocket = POCKET_KEY_ITEMS,
.type = ITEM_USE_BAG_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
@@ -8831,7 +8830,7 @@ const struct Item gItems[] =
.price = 0,
.description = sVsSeekerDesc,
.importance = 1,
- .unk19 = 1,
+ .registrability = TRUE,
.pocket = POCKET_KEY_ITEMS,
.type = ITEM_USE_FIELD,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
@@ -8844,7 +8843,7 @@ const struct Item gItems[] =
.price = 0,
.description = sTMCaseDesc,
.importance = 1,
- .unk19 = 1,
+ .registrability = TRUE,
.pocket = POCKET_KEY_ITEMS,
.type = ITEM_USE_BAG_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
@@ -8857,7 +8856,7 @@ const struct Item gItems[] =
.price = 0,
.description = sBerryPouchDesc,
.importance = 1,
- .unk19 = 1,
+ .registrability = TRUE,
.pocket = POCKET_KEY_ITEMS,
.type = ITEM_USE_BAG_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
@@ -8893,7 +8892,7 @@ const struct Item gItems[] =
.price = 0,
.description = sPowderJarDesc,
.importance = 1,
- .unk19 = 1,
+ .registrability = TRUE,
.pocket = POCKET_KEY_ITEMS,
.type = ITEM_USE_BAG_MENU,
.fieldUseFunc = ItemUseOutOfBattle_PowderJar,
@@ -8929,7 +8928,7 @@ const struct Item gItems[] =
.price = 0,
.description = sPokeblockCaseDesc,
.importance = 1,
- .unk19 = 1,
+ .registrability = TRUE,
.pocket = POCKET_KEY_ITEMS,
.type = ITEM_USE_PBLOCK_CASE,
.fieldUseFunc = ItemUseOutOfBattle_PokeblockCase,
@@ -8966,7 +8965,7 @@ const struct Item gItems[] =
.price = 0,
.description = sFameCheckerDesc,
.importance = 1,
- .unk19 = 1,
+ .registrability = TRUE,
.pocket = POCKET_KEY_ITEMS,
.type = ITEM_USE_BAG_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
@@ -8979,7 +8978,7 @@ const struct Item gItems[] =
.price = 0,
.description = sTeachyTVDesc,
.importance = 1,
- .unk19 = 1,
+ .registrability = TRUE,
.pocket = POCKET_KEY_ITEMS,
.type = ITEM_USE_FIELD,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
@@ -9019,7 +9018,7 @@ const struct Item gItems[] =
.price = 0,
.description = sMysticTicketDesc,
.importance = 1,
- .unk19 = 1,
+ .registrability = TRUE,
.pocket = POCKET_KEY_ITEMS,
.type = ITEM_USE_BAG_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
@@ -9032,7 +9031,7 @@ const struct Item gItems[] =
.price = 0,
.description = sAuroraTicketDesc,
.importance = 1,
- .unk19 = 1,
+ .registrability = TRUE,
.pocket = POCKET_KEY_ITEMS,
.type = ITEM_USE_BAG_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
@@ -9045,7 +9044,7 @@ const struct Item gItems[] =
.price = 0,
.description = sOldSeaMapDesc,
.importance = 1,
- .unk19 = 1,
+ .registrability = TRUE,
.pocket = POCKET_KEY_ITEMS,
.type = ITEM_USE_BAG_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
@@ -9202,7 +9201,7 @@ const struct Item gItems[] =
.price = 0,
.description = sMagmaEmblemDesc,
.importance = 1,
- .unk19 = 1,
+ .registrability = TRUE,
.pocket = POCKET_KEY_ITEMS,
.type = ITEM_USE_BAG_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
@@ -9311,7 +9310,7 @@ const struct Item gItems[] =
.price = 0,
.description = sTriPassDesc,
.importance = 1,
- .unk19 = 1,
+ .registrability = TRUE,
.pocket = POCKET_KEY_ITEMS,
.type = ITEM_USE_BAG_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
@@ -9324,7 +9323,7 @@ const struct Item gItems[] =
.price = 0,
.description = sRainbowPassDesc,
.importance = 1,
- .unk19 = 1,
+ .registrability = TRUE,
.pocket = POCKET_KEY_ITEMS,
.type = ITEM_USE_BAG_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
@@ -9337,7 +9336,7 @@ const struct Item gItems[] =
.price = 0,
.description = sTeaDesc,
.importance = 1,
- .unk19 = 1,
+ .registrability = TRUE,
.pocket = POCKET_KEY_ITEMS,
.type = ITEM_USE_BAG_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
@@ -9350,7 +9349,7 @@ const struct Item gItems[] =
.price = 0,
.description = sRubyDesc,
.importance = 1,
- .unk19 = 1,
+ .registrability = TRUE,
.pocket = POCKET_KEY_ITEMS,
.type = ITEM_USE_BAG_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
@@ -9363,7 +9362,7 @@ const struct Item gItems[] =
.price = 0,
.description = sSapphireDesc,
.importance = 1,
- .unk19 = 1,
+ .registrability = TRUE,
.pocket = POCKET_KEY_ITEMS,
.type = ITEM_USE_BAG_MENU,
.fieldUseFunc = ItemUseOutOfBattle_CannotUse,
diff --git a/src/data/lilycove_lady.h b/src/data/lilycove_lady.h
index 68e8884aed..bff13c504d 100644
--- a/src/data/lilycove_lady.h
+++ b/src/data/lilycove_lady.h
@@ -1,4 +1,3 @@
-#include "constants/easy_chat.h"
#include "constants/event_objects.h"
#include "constants/items.h"
#include "constants/moves.h"
diff --git a/src/data/party_menu.h b/src/data/party_menu.h
index 465aea1dfb..f6c4db4cae 100644
--- a/src/data/party_menu.h
+++ b/src/data/party_menu.h
@@ -1,3 +1,9 @@
+enum {
+ TAG_POKEBALL = 1200,
+ TAG_POKEBALL_SMALL,
+ TAG_STATUS_ICONS,
+};
+
static const struct BgTemplate sPartyMenuBgTemplates[] =
{
{
@@ -112,8 +118,8 @@ static const u8 sPartyMenuSpriteCoords[PARTY_LAYOUT_COUNT][PARTY_SIZE][4 * 2] =
};
// Used only when both Cancel and Confirm are present
-static const u32 sConfirmButton_Tilemap[] = INCBIN_U32("graphics/interface/party_menu_confirm_button.bin");
-static const u32 sCancelButton_Tilemap[] = INCBIN_U32("graphics/interface/party_menu_cancel_button.bin");
+static const u32 sConfirmButton_Tilemap[] = INCBIN_U32("graphics/party_menu/confirm_button.bin");
+static const u32 sCancelButton_Tilemap[] = INCBIN_U32("graphics/party_menu/cancel_button.bin");
// Text colors for BG, FG, and Shadow in that order
static const u8 sFontColorTable[][3] =
@@ -565,34 +571,14 @@ static const struct WindowTemplate sUnusedWindowTemplate2 =
.baseBlock = 0x39D,
};
-// Tile nums
-static const u8 sMainSlotTileNums[] = {24, 25, 25, 25, 25, 25, 25, 25, 25, 26,
- 32, 33, 33, 33, 33, 33, 33, 33, 33, 34,
- 32, 33, 33, 33, 33, 33, 33, 33, 33, 34,
- 32, 33, 33, 33, 33, 33, 33, 33, 33, 34,
- 40, 59, 60, 58, 58, 58, 58, 58, 58, 61,
- 15, 16, 16, 16, 16, 16, 16, 16, 16, 17,
- 46, 47, 47, 47, 47, 47, 47, 47, 47, 48};
-
-static const u8 sMainSlotTileNums_Egg[] = {24, 25, 25, 25, 25, 25, 25, 25, 25, 26,
- 32, 33, 33, 33, 33, 33, 33, 33, 33, 34,
- 32, 33, 33, 33, 33, 33, 33, 33, 33, 34,
- 32, 33, 33, 33, 33, 33, 33, 33, 33, 34,
- 40, 41, 41, 41, 41, 41, 41, 41, 41, 42,
- 15, 16, 16, 16, 16, 16, 16, 16, 16, 17,
- 46, 47, 47, 47, 47, 47, 47, 47, 47, 48};
-
-static const u8 sOtherSlotsTileNums[] = {43, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 45,
- 49, 33, 33, 33, 33, 33, 33, 33, 33, 52, 53, 51, 51, 51, 51, 51, 51, 54,
- 55, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 57};
-
-static const u8 sOtherSlotsTileNums_Egg[] = {43, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 45,
- 49, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 50,
- 55, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 57};
-
-static const u8 sEmptySlotTileNums[] = {21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23,
- 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31,
- 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 39};
+// Plain tilemaps for party menu slots.
+// The versions with no HP bar are used by eggs, and in certain displays like registering at a battle facility.
+// There is no empty version of the main slot because it shouldn't ever be empty.
+static const u8 sSlotTilemap_Main[] = INCBIN_U8("graphics/party_menu/slot_main.bin");
+static const u8 sSlotTilemap_MainNoHP[] = INCBIN_U8("graphics/party_menu/slot_main_no_hp.bin");
+static const u8 sSlotTilemap_Wide[] = INCBIN_U8("graphics/party_menu/slot_wide.bin");
+static const u8 sSlotTilemap_WideNoHP[] = INCBIN_U8("graphics/party_menu/slot_wide_no_hp.bin");
+static const u8 sSlotTilemap_WideEmpty[] = INCBIN_U8("graphics/party_menu/slot_wide_empty.bin");
// Palette offsets
static const u8 sGenderPalOffsets[] = {11, 12};
@@ -873,8 +859,8 @@ static const u8 *const sUnionRoomTradeMessages[] =
[UR_TRADE_MSG_CANT_TRADE_WITH_PARTNER_2 - 1] = gText_CantTradeWithTrainer,
};
-static const u32 sHeldItemGfx[] = INCBIN_U32("graphics/interface/hold_icons.4bpp");
-static const u16 sHeldItemPalette[] = INCBIN_U16("graphics/interface/hold_icons.gbapal");
+static const u32 sHeldItemGfx[] = INCBIN_U32("graphics/party_menu/hold_icons.4bpp");
+static const u16 sHeldItemPalette[] = INCBIN_U16("graphics/party_menu/hold_icons.gbapal");
static const struct OamData sOamData_HeldItem =
{
@@ -969,19 +955,19 @@ static const union AnimCmd *const sSpriteAnimTable_MenuPokeball[] =
static const struct CompressedSpriteSheet sSpriteSheet_MenuPokeball =
{
- gPartyMenuPokeball_Gfx, 0x400, 0x04b0
+ gPartyMenuPokeball_Gfx, 0x400, TAG_POKEBALL
};
static const struct CompressedSpritePalette sSpritePalette_MenuPokeball =
{
- gPartyMenuPokeball_Pal, 0x04b0
+ gPartyMenuPokeball_Pal, TAG_POKEBALL
};
// Used for the pokeball sprite on each party slot / Cancel button
static const struct SpriteTemplate sSpriteTemplate_MenuPokeball =
{
- .tileTag = 0x04b0,
- .paletteTag = 0x04b0,
+ .tileTag = TAG_POKEBALL,
+ .paletteTag = TAG_POKEBALL,
.oam = &sOamData_MenuPokeball,
.anims = sSpriteAnimTable_MenuPokeball,
.images = NULL,
@@ -1055,14 +1041,14 @@ static const union AnimCmd *const sSpriteAnimTable_MenuPokeballSmall[] =
static const struct CompressedSpriteSheet sSpriteSheet_MenuPokeballSmall =
{
- gPartyMenuPokeballSmall_Gfx, 0x0300, 0x04b1
+ gPartyMenuPokeballSmall_Gfx, 0x0300, TAG_POKEBALL_SMALL
};
// Used for the pokeball sprite next to Cancel and Confirm when both are present, otherwise sSpriteTemplate_MenuPokeball is used
static const struct SpriteTemplate sSpriteTemplate_MenuPokeballSmall =
{
- .tileTag = 1201,
- .paletteTag = 1200,
+ .tileTag = TAG_POKEBALL_SMALL,
+ .paletteTag = TAG_POKEBALL,
.oam = &sOamData_MenuPokeballSmall,
.anims = sSpriteAnimTable_MenuPokeballSmall,
.images = NULL,
@@ -1149,18 +1135,18 @@ static const union AnimCmd *const sSpriteTemplate_StatusCondition[] =
static const struct CompressedSpriteSheet sSpriteSheet_StatusIcons =
{
- gStatusGfx_Icons, 0x400, 1202
+ gStatusGfx_Icons, 0x400, TAG_STATUS_ICONS
};
static const struct CompressedSpritePalette sSpritePalette_StatusIcons =
{
- gStatusPal_Icons, 1202
+ gStatusPal_Icons, TAG_STATUS_ICONS
};
static const struct SpriteTemplate sSpriteTemplate_StatusIcons =
{
- .tileTag = 1202,
- .paletteTag = 1202,
+ .tileTag = TAG_STATUS_ICONS,
+ .paletteTag = TAG_STATUS_ICONS,
.oam = &sOamData_StatusCondition,
.anims = sSpriteTemplate_StatusCondition,
.images = NULL,
diff --git a/src/data/pokedex_area_glow.h b/src/data/pokedex_area_glow.h
new file mode 100644
index 0000000000..ff24d8d6c0
--- /dev/null
+++ b/src/data/pokedex_area_glow.h
@@ -0,0 +1,315 @@
+// These tile numbers correspond to the 8x8 tiles in graphics/pokedex/area_glow.png
+// Left/Right/Top/Bottom are shortened to L/R/T/B
+enum {
+ GLOW_TILE_EMPTY,
+ GLOW_TILE_EDGE_R,
+ GLOW_TILE_EDGE_L,
+ GLOW_TILE_EDGE_L_R,
+ GLOW_TILE_EDGE_B,
+ GLOW_TILE_EDGE_B_R,
+ GLOW_TILE_EDGE_B_L,
+ GLOW_TILE_EDGE_B_L_R,
+ GLOW_TILE_EDGE_T,
+ GLOW_TILE_EDGE_T_R,
+ GLOW_TILE_EDGE_T_L,
+ GLOW_TILE_EDGE_T_L_R,
+ GLOW_TILE_EDGE_T_B,
+ GLOW_TILE_EDGE_T_B_R,
+ GLOW_TILE_EDGE_T_B_L,
+ GLOW_TILE_EDGE_T_B_L_R, // This tile has a misplaced pixel in the top-left corner
+ GLOW_TILE_FULL,
+ GLOW_TILE_CORNER_TL,
+ GLOW_TILE_CORNER_BL,
+ GLOW_TILE_CORNER_BL_TL,
+ GLOW_TILE_CORNER_TR,
+ GLOW_TILE_CORNER_TR_TL,
+ GLOW_TILE_CORNER_TR_BL,
+ GLOW_TILE_CORNER_TR_BL_TL,
+ GLOW_TILE_CORNER_BR,
+ GLOW_TILE_CORNER_BR_TL,
+ GLOW_TILE_CORNER_BR_BL,
+ GLOW_TILE_CORNER_BR_BL_TL,
+ GLOW_TILE_CORNER_BR_TR,
+ GLOW_TILE_CORNER_BR_TR_TL,
+ GLOW_TILE_CORNER_BR_TR_BL,
+ GLOW_TILE_CORNER_BR_TR_BL_TL,
+ GLOW_TILE_EDGE_R_CORNER_TL,
+ GLOW_TILE_EDGE_R_CORNER_BL,
+ GLOW_TILE_EDGE_R_CORNER_BL_TL,
+ GLOW_TILE_EDGE_L_CORNER_TR,
+ GLOW_TILE_EDGE_L_CORNER_BR,
+ GLOW_TILE_EDGE_L_CORNER_BR_TR,
+ GLOW_TILE_EDGE_B_CORNER_TR,
+ GLOW_TILE_EDGE_B_CORNER_TL,
+ GLOW_TILE_EDGE_B_CORNER_TL_TR,
+ GLOW_TILE_EDGE_T_CORNER_BR,
+ GLOW_TILE_EDGE_T_CORNER_BL,
+ GLOW_TILE_EDGE_T_CORNER_BL_BR,
+ GLOW_TILE_EDGE_B_L_CORNER_TR,
+ GLOW_TILE_EDGE_B_R_CORNER_TL,
+ GLOW_TILE_EDGE_T_R_CORNER_BL,
+ GLOW_TILE_EDGE_T_L_CORNER_BR
+};
+
+// This array converts a set of glow position flags to one of the above tile values.
+// Only some parts of this array are actually used, because corner flags that overlap
+// with edge flags are cancelled out before lookup. For example, GLOW_CORNER_TL | GLOW_EDGE_L
+// will never be read, and has the same value as GLOW_EDGE_L.
+static const u8 sAreaGlowTilemapMapping[] = {
+ [0] = GLOW_TILE_EMPTY,
+ [GLOW_EDGE_R] = GLOW_TILE_EDGE_R,
+ [GLOW_EDGE_L] = GLOW_TILE_EDGE_L,
+ [GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_L_R,
+ [GLOW_EDGE_B] = GLOW_TILE_EDGE_B,
+ [GLOW_EDGE_B | GLOW_EDGE_R] = GLOW_TILE_EDGE_B_R,
+ [GLOW_EDGE_B | GLOW_EDGE_L] = GLOW_TILE_EDGE_B_L,
+ [GLOW_EDGE_B | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_B_L_R,
+ [GLOW_EDGE_T] = GLOW_TILE_EDGE_T,
+ [GLOW_EDGE_T | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_R,
+ [GLOW_EDGE_T | GLOW_EDGE_L] = GLOW_TILE_EDGE_T_L,
+ [GLOW_EDGE_T | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_L_R,
+ [GLOW_EDGE_T | GLOW_EDGE_B] = GLOW_TILE_EDGE_T_B,
+ [GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_B_R,
+ [GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_L] = GLOW_TILE_EDGE_T_B_L,
+ [GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_B_L_R,
+ [GLOW_CORNER_TL] = GLOW_TILE_CORNER_TL,
+ [GLOW_CORNER_TL | GLOW_EDGE_R] = GLOW_TILE_EDGE_R_CORNER_TL,
+ [GLOW_CORNER_TL | GLOW_EDGE_L] = GLOW_TILE_EDGE_L,
+ [GLOW_CORNER_TL | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_L_R,
+ [GLOW_CORNER_TL | GLOW_EDGE_B] = GLOW_TILE_EDGE_B_CORNER_TL,
+ [GLOW_CORNER_TL | GLOW_EDGE_B | GLOW_EDGE_R] = GLOW_TILE_EDGE_B_R_CORNER_TL,
+ [GLOW_CORNER_TL | GLOW_EDGE_B | GLOW_EDGE_L] = GLOW_TILE_EDGE_B_L,
+ [GLOW_CORNER_TL | GLOW_EDGE_B | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_B_L_R,
+ [GLOW_CORNER_TL | GLOW_EDGE_T] = GLOW_TILE_EDGE_T,
+ [GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_R,
+ [GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_L] = GLOW_TILE_EDGE_T_L,
+ [GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_L_R,
+ [GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_B] = GLOW_TILE_EDGE_T_B,
+ [GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_B_R,
+ [GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_L] = GLOW_TILE_EDGE_T_B_L,
+ [GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_B_L_R,
+ [GLOW_CORNER_BL] = GLOW_TILE_CORNER_BL,
+ [GLOW_CORNER_BL | GLOW_EDGE_R] = GLOW_TILE_EDGE_R_CORNER_BL,
+ [GLOW_CORNER_BL | GLOW_EDGE_L] = GLOW_TILE_EDGE_L,
+ [GLOW_CORNER_BL | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_L_R,
+ [GLOW_CORNER_BL | GLOW_EDGE_B] = GLOW_TILE_EDGE_B,
+ [GLOW_CORNER_BL | GLOW_EDGE_B | GLOW_EDGE_R] = GLOW_TILE_EDGE_B_R,
+ [GLOW_CORNER_BL | GLOW_EDGE_B | GLOW_EDGE_L] = GLOW_TILE_EDGE_B_L,
+ [GLOW_CORNER_BL | GLOW_EDGE_B | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_B_L_R,
+ [GLOW_CORNER_BL | GLOW_EDGE_T] = GLOW_TILE_EDGE_T_CORNER_BL,
+ [GLOW_CORNER_BL | GLOW_EDGE_T | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_R_CORNER_BL,
+ [GLOW_CORNER_BL | GLOW_EDGE_T | GLOW_EDGE_L] = GLOW_TILE_EDGE_T_L,
+ [GLOW_CORNER_BL | GLOW_EDGE_T | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_L_R,
+ [GLOW_CORNER_BL | GLOW_EDGE_T | GLOW_EDGE_B] = GLOW_TILE_EDGE_T_B,
+ [GLOW_CORNER_BL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_B_R,
+ [GLOW_CORNER_BL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_L] = GLOW_TILE_EDGE_T_B_L,
+ [GLOW_CORNER_BL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_B_L_R,
+ [GLOW_CORNER_BL | GLOW_CORNER_TL] = GLOW_TILE_CORNER_BL_TL,
+ [GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_R] = GLOW_TILE_EDGE_R_CORNER_BL_TL,
+ [GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_L] = GLOW_TILE_EDGE_L,
+ [GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_L_R,
+ [GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_B] = GLOW_TILE_EDGE_B_CORNER_TL,
+ [GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_B | GLOW_EDGE_R] = GLOW_TILE_EDGE_B_R_CORNER_TL,
+ [GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_B | GLOW_EDGE_L] = GLOW_TILE_EDGE_B_L,
+ [GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_B | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_B_L_R,
+ [GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_T] = GLOW_TILE_EDGE_T_CORNER_BL,
+ [GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_R_CORNER_BL,
+ [GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_L] = GLOW_TILE_EDGE_T_L,
+ [GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_L_R,
+ [GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_B] = GLOW_TILE_EDGE_T_B,
+ [GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_B_R,
+ [GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_L] = GLOW_TILE_EDGE_T_B_L,
+ [GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_B_L_R,
+ [GLOW_CORNER_TR] = GLOW_TILE_CORNER_TR,
+ [GLOW_CORNER_TR | GLOW_EDGE_R] = GLOW_TILE_EDGE_R,
+ [GLOW_CORNER_TR | GLOW_EDGE_L] = GLOW_TILE_EDGE_L_CORNER_TR,
+ [GLOW_CORNER_TR | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_L_R,
+ [GLOW_CORNER_TR | GLOW_EDGE_B] = GLOW_TILE_EDGE_B_CORNER_TR,
+ [GLOW_CORNER_TR | GLOW_EDGE_B | GLOW_EDGE_R] = GLOW_TILE_EDGE_B_R,
+ [GLOW_CORNER_TR | GLOW_EDGE_B | GLOW_EDGE_L] = GLOW_TILE_EDGE_B_L_CORNER_TR,
+ [GLOW_CORNER_TR | GLOW_EDGE_B | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_B_L_R,
+ [GLOW_CORNER_TR | GLOW_EDGE_T] = GLOW_TILE_EDGE_T,
+ [GLOW_CORNER_TR | GLOW_EDGE_T | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_R,
+ [GLOW_CORNER_TR | GLOW_EDGE_T | GLOW_EDGE_L] = GLOW_TILE_EDGE_T_L,
+ [GLOW_CORNER_TR | GLOW_EDGE_T | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_L_R,
+ [GLOW_CORNER_TR | GLOW_EDGE_T | GLOW_EDGE_B] = GLOW_TILE_EDGE_T_B,
+ [GLOW_CORNER_TR | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_B_R,
+ [GLOW_CORNER_TR | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_L] = GLOW_TILE_EDGE_T_B_L,
+ [GLOW_CORNER_TR | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_B_L_R,
+ [GLOW_CORNER_TR | GLOW_CORNER_TL] = GLOW_TILE_CORNER_TR_TL,
+ [GLOW_CORNER_TR | GLOW_CORNER_TL | GLOW_EDGE_R] = GLOW_TILE_EDGE_R_CORNER_TL,
+ [GLOW_CORNER_TR | GLOW_CORNER_TL | GLOW_EDGE_L] = GLOW_TILE_EDGE_L_CORNER_TR,
+ [GLOW_CORNER_TR | GLOW_CORNER_TL | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_L_R,
+ [GLOW_CORNER_TR | GLOW_CORNER_TL | GLOW_EDGE_B] = GLOW_TILE_EDGE_B_CORNER_TL_TR,
+ [GLOW_CORNER_TR | GLOW_CORNER_TL | GLOW_EDGE_B | GLOW_EDGE_R] = GLOW_TILE_EDGE_B_R_CORNER_TL,
+ [GLOW_CORNER_TR | GLOW_CORNER_TL | GLOW_EDGE_B | GLOW_EDGE_L] = GLOW_TILE_EDGE_B_L_CORNER_TR,
+ [GLOW_CORNER_TR | GLOW_CORNER_TL | GLOW_EDGE_B | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_B_L_R,
+ [GLOW_CORNER_TR | GLOW_CORNER_TL | GLOW_EDGE_T] = GLOW_TILE_EDGE_T,
+ [GLOW_CORNER_TR | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_R,
+ [GLOW_CORNER_TR | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_L] = GLOW_TILE_EDGE_T_L,
+ [GLOW_CORNER_TR | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_L_R,
+ [GLOW_CORNER_TR | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_B] = GLOW_TILE_EDGE_T_B,
+ [GLOW_CORNER_TR | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_B_R,
+ [GLOW_CORNER_TR | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_L] = GLOW_TILE_EDGE_T_B_L,
+ [GLOW_CORNER_TR | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_B_L_R,
+ [GLOW_CORNER_TR | GLOW_CORNER_BL] = GLOW_TILE_CORNER_TR_BL,
+ [GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_EDGE_R] = GLOW_TILE_EDGE_R_CORNER_BL,
+ [GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_EDGE_L] = GLOW_TILE_EDGE_L_CORNER_TR,
+ [GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_L_R,
+ [GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_EDGE_B] = GLOW_TILE_EDGE_B_CORNER_TR,
+ [GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_EDGE_B | GLOW_EDGE_R] = GLOW_TILE_EDGE_B_R,
+ [GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_EDGE_B | GLOW_EDGE_L] = GLOW_TILE_EDGE_B_L_CORNER_TR,
+ [GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_EDGE_B | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_B_L_R,
+ [GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_EDGE_T] = GLOW_TILE_EDGE_T_CORNER_BL,
+ [GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_EDGE_T | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_R_CORNER_BL,
+ [GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_EDGE_T | GLOW_EDGE_L] = GLOW_TILE_EDGE_T_L,
+ [GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_EDGE_T | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_L_R,
+ [GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_EDGE_T | GLOW_EDGE_B] = GLOW_TILE_EDGE_T_B,
+ [GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_B_R,
+ [GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_L] = GLOW_TILE_EDGE_T_B_L,
+ [GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_B_L_R,
+ [GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_CORNER_TL] = GLOW_TILE_CORNER_TR_BL_TL,
+ [GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_R] = GLOW_TILE_EDGE_R_CORNER_BL_TL,
+ [GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_L] = GLOW_TILE_EDGE_L_CORNER_TR,
+ [GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_L_R,
+ [GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_B] = GLOW_TILE_EDGE_B_CORNER_TL_TR,
+ [GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_B | GLOW_EDGE_R] = GLOW_TILE_EDGE_B_R_CORNER_TL,
+ [GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_B | GLOW_EDGE_L] = GLOW_TILE_EDGE_B_L_CORNER_TR,
+ [GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_B | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_B_L_R,
+ [GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_T] = GLOW_TILE_EDGE_T_CORNER_BL,
+ [GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_R_CORNER_BL,
+ [GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_L] = GLOW_TILE_EDGE_T_L,
+ [GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_L_R,
+ [GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_B] = GLOW_TILE_EDGE_T_B,
+ [GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_B_R,
+ [GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_L] = GLOW_TILE_EDGE_T_B_L,
+ [GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_B_L_R,
+ [GLOW_CORNER_BR] = GLOW_TILE_CORNER_BR,
+ [GLOW_CORNER_BR | GLOW_EDGE_R] = GLOW_TILE_EDGE_R,
+ [GLOW_CORNER_BR | GLOW_EDGE_L] = GLOW_TILE_EDGE_L_CORNER_BR,
+ [GLOW_CORNER_BR | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_L_R,
+ [GLOW_CORNER_BR | GLOW_EDGE_B] = GLOW_TILE_EDGE_B,
+ [GLOW_CORNER_BR | GLOW_EDGE_B | GLOW_EDGE_R] = GLOW_TILE_EDGE_B_R,
+ [GLOW_CORNER_BR | GLOW_EDGE_B | GLOW_EDGE_L] = GLOW_TILE_EDGE_B_L,
+ [GLOW_CORNER_BR | GLOW_EDGE_B | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_B_L_R,
+ [GLOW_CORNER_BR | GLOW_EDGE_T] = GLOW_TILE_EDGE_T_CORNER_BR,
+ [GLOW_CORNER_BR | GLOW_EDGE_T | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_R,
+ [GLOW_CORNER_BR | GLOW_EDGE_T | GLOW_EDGE_L] = GLOW_TILE_EDGE_T_L_CORNER_BR,
+ [GLOW_CORNER_BR | GLOW_EDGE_T | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_L_R,
+ [GLOW_CORNER_BR | GLOW_EDGE_T | GLOW_EDGE_B] = GLOW_TILE_EDGE_T_B,
+ [GLOW_CORNER_BR | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_B_R,
+ [GLOW_CORNER_BR | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_L] = GLOW_TILE_EDGE_T_B_L,
+ [GLOW_CORNER_BR | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_B_L_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_TL] = GLOW_TILE_CORNER_BR_TL,
+ [GLOW_CORNER_BR | GLOW_CORNER_TL | GLOW_EDGE_R] = GLOW_TILE_EDGE_R_CORNER_TL,
+ [GLOW_CORNER_BR | GLOW_CORNER_TL | GLOW_EDGE_L] = GLOW_TILE_EDGE_L_CORNER_BR,
+ [GLOW_CORNER_BR | GLOW_CORNER_TL | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_L_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_TL | GLOW_EDGE_B] = GLOW_TILE_EDGE_B_CORNER_TL,
+ [GLOW_CORNER_BR | GLOW_CORNER_TL | GLOW_EDGE_B | GLOW_EDGE_R] = GLOW_TILE_EDGE_B_R_CORNER_TL,
+ [GLOW_CORNER_BR | GLOW_CORNER_TL | GLOW_EDGE_B | GLOW_EDGE_L] = GLOW_TILE_EDGE_B_L,
+ [GLOW_CORNER_BR | GLOW_CORNER_TL | GLOW_EDGE_B | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_B_L_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_TL | GLOW_EDGE_T] = GLOW_TILE_EDGE_T_CORNER_BR,
+ [GLOW_CORNER_BR | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_L] = GLOW_TILE_EDGE_T_L_CORNER_BR,
+ [GLOW_CORNER_BR | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_L_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_B] = GLOW_TILE_EDGE_T_B,
+ [GLOW_CORNER_BR | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_B_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_L] = GLOW_TILE_EDGE_T_B_L,
+ [GLOW_CORNER_BR | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_B_L_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_BL] = GLOW_TILE_CORNER_BR_BL,
+ [GLOW_CORNER_BR | GLOW_CORNER_BL | GLOW_EDGE_R] = GLOW_TILE_EDGE_R_CORNER_BL,
+ [GLOW_CORNER_BR | GLOW_CORNER_BL | GLOW_EDGE_L] = GLOW_TILE_EDGE_L_CORNER_BR,
+ [GLOW_CORNER_BR | GLOW_CORNER_BL | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_L_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_BL | GLOW_EDGE_B] = GLOW_TILE_EDGE_B,
+ [GLOW_CORNER_BR | GLOW_CORNER_BL | GLOW_EDGE_B | GLOW_EDGE_R] = GLOW_TILE_EDGE_B_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_BL | GLOW_EDGE_B | GLOW_EDGE_L] = GLOW_TILE_EDGE_B_L,
+ [GLOW_CORNER_BR | GLOW_CORNER_BL | GLOW_EDGE_B | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_B_L_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_BL | GLOW_EDGE_T] = GLOW_TILE_EDGE_T_CORNER_BL_BR,
+ [GLOW_CORNER_BR | GLOW_CORNER_BL | GLOW_EDGE_T | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_R_CORNER_BL,
+ [GLOW_CORNER_BR | GLOW_CORNER_BL | GLOW_EDGE_T | GLOW_EDGE_L] = GLOW_TILE_EDGE_T_L_CORNER_BR,
+ [GLOW_CORNER_BR | GLOW_CORNER_BL | GLOW_EDGE_T | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_L_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_BL | GLOW_EDGE_T | GLOW_EDGE_B] = GLOW_TILE_EDGE_T_B,
+ [GLOW_CORNER_BR | GLOW_CORNER_BL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_B_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_BL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_L] = GLOW_TILE_EDGE_T_B_L,
+ [GLOW_CORNER_BR | GLOW_CORNER_BL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_B_L_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_BL | GLOW_CORNER_TL] = GLOW_TILE_CORNER_BR_BL_TL,
+ [GLOW_CORNER_BR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_R] = GLOW_TILE_EDGE_R_CORNER_BL_TL,
+ [GLOW_CORNER_BR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_L] = GLOW_TILE_EDGE_L_CORNER_BR,
+ [GLOW_CORNER_BR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_L_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_B] = GLOW_TILE_EDGE_B_CORNER_TL,
+ [GLOW_CORNER_BR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_B | GLOW_EDGE_R] = GLOW_TILE_EDGE_B_R_CORNER_TL,
+ [GLOW_CORNER_BR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_B | GLOW_EDGE_L] = GLOW_TILE_EDGE_B_L,
+ [GLOW_CORNER_BR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_B | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_B_L_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_T] = GLOW_TILE_EDGE_T_CORNER_BL_BR,
+ [GLOW_CORNER_BR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_R_CORNER_BL,
+ [GLOW_CORNER_BR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_L] = GLOW_TILE_EDGE_T_L_CORNER_BR,
+ [GLOW_CORNER_BR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_L_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_B] = GLOW_TILE_EDGE_T_B,
+ [GLOW_CORNER_BR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_B_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_L] = GLOW_TILE_EDGE_T_B_L,
+ [GLOW_CORNER_BR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_B_L_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR] = GLOW_TILE_CORNER_BR_TR,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_EDGE_R] = GLOW_TILE_EDGE_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_EDGE_L] = GLOW_TILE_EDGE_L_CORNER_BR_TR,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_L_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_EDGE_B] = GLOW_TILE_EDGE_B_CORNER_TR,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_EDGE_B | GLOW_EDGE_R] = GLOW_TILE_EDGE_B_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_EDGE_B | GLOW_EDGE_L] = GLOW_TILE_EDGE_B_L_CORNER_TR,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_EDGE_B | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_B_L_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_EDGE_T] = GLOW_TILE_EDGE_T_CORNER_BR,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_EDGE_T | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_EDGE_T | GLOW_EDGE_L] = GLOW_TILE_EDGE_T_L_CORNER_BR,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_EDGE_T | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_L_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_EDGE_T | GLOW_EDGE_B] = GLOW_TILE_EDGE_T_B,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_B_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_L] = GLOW_TILE_EDGE_T_B_L,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_B_L_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_TL] = GLOW_TILE_CORNER_BR_TR_TL,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_TL | GLOW_EDGE_R] = GLOW_TILE_EDGE_R_CORNER_TL,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_TL | GLOW_EDGE_L] = GLOW_TILE_EDGE_L_CORNER_BR_TR,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_TL | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_L_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_TL | GLOW_EDGE_B] = GLOW_TILE_EDGE_B_CORNER_TL_TR,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_TL | GLOW_EDGE_B | GLOW_EDGE_R] = GLOW_TILE_EDGE_B_R_CORNER_TL,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_TL | GLOW_EDGE_B | GLOW_EDGE_L] = GLOW_TILE_EDGE_B_L_CORNER_TR,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_TL | GLOW_EDGE_B | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_B_L_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_TL | GLOW_EDGE_T] = GLOW_TILE_EDGE_T_CORNER_BR,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_L] = GLOW_TILE_EDGE_T_L_CORNER_BR,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_L_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_B] = GLOW_TILE_EDGE_T_B,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_B_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_L] = GLOW_TILE_EDGE_T_B_L,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_B_L_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_BL] = GLOW_TILE_CORNER_BR_TR_BL,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_EDGE_R] = GLOW_TILE_EDGE_R_CORNER_BL,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_EDGE_L] = GLOW_TILE_EDGE_L_CORNER_BR_TR,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_L_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_EDGE_B] = GLOW_TILE_EDGE_B_CORNER_TR,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_EDGE_B | GLOW_EDGE_R] = GLOW_TILE_EDGE_B_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_EDGE_B | GLOW_EDGE_L] = GLOW_TILE_EDGE_B_L_CORNER_TR,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_EDGE_B | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_B_L_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_EDGE_T] = GLOW_TILE_EDGE_T_CORNER_BL_BR,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_EDGE_T | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_R_CORNER_BL,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_EDGE_T | GLOW_EDGE_L] = GLOW_TILE_EDGE_T_L_CORNER_BR,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_EDGE_T | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_L_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_EDGE_T | GLOW_EDGE_B] = GLOW_TILE_EDGE_T_B,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_B_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_L] = GLOW_TILE_EDGE_T_B_L,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_B_L_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_CORNER_TL] = GLOW_TILE_CORNER_BR_TR_BL_TL,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_R] = GLOW_TILE_EDGE_R_CORNER_BL_TL,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_L] = GLOW_TILE_EDGE_L_CORNER_BR_TR,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_L_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_B] = GLOW_TILE_EDGE_B_CORNER_TL_TR,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_B | GLOW_EDGE_R] = GLOW_TILE_EDGE_B_R_CORNER_TL,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_B | GLOW_EDGE_L] = GLOW_TILE_EDGE_B_L_CORNER_TR,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_B | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_B_L_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_T] = GLOW_TILE_EDGE_T_CORNER_BL_BR,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_R_CORNER_BL,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_L] = GLOW_TILE_EDGE_T_L_CORNER_BR,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_L_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_B] = GLOW_TILE_EDGE_T_B,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_B_R,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_L] = GLOW_TILE_EDGE_T_B_L,
+ [GLOW_CORNER_BR | GLOW_CORNER_TR | GLOW_CORNER_BL | GLOW_CORNER_TL | GLOW_EDGE_T | GLOW_EDGE_B | GLOW_EDGE_L | GLOW_EDGE_R] = GLOW_TILE_EDGE_T_B_L_R,
+};
diff --git a/src/data/pokemon/base_stats.h b/src/data/pokemon/base_stats.h
index 0425df6bad..b9f43bfce6 100644
--- a/src/data/pokemon/base_stats.h
+++ b/src/data/pokemon/base_stats.h
@@ -22437,7 +22437,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_WHITE,
.noFlip = FALSE,
- .flags = F_ULTRA_BEAST,
+ .flags = FLAG_ULTRA_BEAST,
},
[SPECIES_BUZZWOLE] =
@@ -22467,7 +22467,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_RED,
.noFlip = FALSE,
- .flags = F_ULTRA_BEAST,
+ .flags = FLAG_ULTRA_BEAST,
},
[SPECIES_PHEROMOSA] =
@@ -22496,7 +22496,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_WHITE,
.noFlip = FALSE,
- .flags = F_ULTRA_BEAST,
+ .flags = FLAG_ULTRA_BEAST,
},
[SPECIES_XURKITREE] =
@@ -22525,7 +22525,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_BLACK,
.noFlip = FALSE,
- .flags = F_ULTRA_BEAST,
+ .flags = FLAG_ULTRA_BEAST,
},
[SPECIES_CELESTEELA] =
@@ -22556,7 +22556,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_GREEN,
.noFlip = FALSE,
- .flags = F_ULTRA_BEAST,
+ .flags = FLAG_ULTRA_BEAST,
},
[SPECIES_KARTANA] =
@@ -22585,7 +22585,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_WHITE,
.noFlip = FALSE,
- .flags = F_ULTRA_BEAST,
+ .flags = FLAG_ULTRA_BEAST,
},
[SPECIES_GUZZLORD] =
@@ -22614,7 +22614,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_BLACK,
.noFlip = FALSE,
- .flags = F_ULTRA_BEAST,
+ .flags = FLAG_ULTRA_BEAST,
},
[SPECIES_NECROZMA] =
@@ -22729,7 +22729,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_PURPLE,
.noFlip = FALSE,
- .flags = F_ULTRA_BEAST,
+ .flags = FLAG_ULTRA_BEAST,
},
[SPECIES_NAGANADEL] =
@@ -22758,7 +22758,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_PURPLE,
.noFlip = FALSE,
- .flags = F_ULTRA_BEAST,
+ .flags = FLAG_ULTRA_BEAST,
},
[SPECIES_STAKATAKA] =
@@ -22787,7 +22787,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_GRAY,
.noFlip = TRUE,
- .flags = F_ULTRA_BEAST,
+ .flags = FLAG_ULTRA_BEAST,
},
[SPECIES_BLACEPHALON] =
@@ -22816,7 +22816,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_WHITE,
.noFlip = TRUE,
- .flags = F_ULTRA_BEAST,
+ .flags = FLAG_ULTRA_BEAST,
},
[SPECIES_ZERAORA] =
@@ -26779,7 +26779,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_BLACK,
.noFlip = FALSE,
- .flags = F_ALOLAN_FORM,
+ .flags = FLAG_ALOLAN_FORM,
},
[SPECIES_RATICATE_ALOLAN] =
@@ -26809,7 +26809,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_BLACK,
.noFlip = FALSE,
- .flags = F_ALOLAN_FORM,
+ .flags = FLAG_ALOLAN_FORM,
},
[SPECIES_RAICHU_ALOLAN] =
@@ -26838,7 +26838,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_BROWN,
.noFlip = FALSE,
- .flags = F_ALOLAN_FORM,
+ .flags = FLAG_ALOLAN_FORM,
},
[SPECIES_SANDSHREW_ALOLAN] =
@@ -26870,7 +26870,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_BLUE,
.noFlip = FALSE,
- .flags = F_ALOLAN_FORM,
+ .flags = FLAG_ALOLAN_FORM,
},
[SPECIES_SANDSLASH_ALOLAN] =
@@ -26899,7 +26899,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_BLUE,
.noFlip = FALSE,
- .flags = F_ALOLAN_FORM,
+ .flags = FLAG_ALOLAN_FORM,
},
[SPECIES_VULPIX_ALOLAN] =
@@ -26931,7 +26931,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_BLUE,
.noFlip = FALSE,
- .flags = F_ALOLAN_FORM,
+ .flags = FLAG_ALOLAN_FORM,
},
[SPECIES_NINETALES_ALOLAN] =
@@ -26961,7 +26961,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_BLUE,
.noFlip = FALSE,
- .flags = F_ALOLAN_FORM,
+ .flags = FLAG_ALOLAN_FORM,
},
[SPECIES_DIGLETT_ALOLAN] =
@@ -26991,7 +26991,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_BROWN,
.noFlip = FALSE,
- .flags = F_ALOLAN_FORM,
+ .flags = FLAG_ALOLAN_FORM,
},
[SPECIES_DUGTRIO_ALOLAN] =
@@ -27021,7 +27021,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_BROWN,
.noFlip = TRUE,
- .flags = F_ALOLAN_FORM,
+ .flags = FLAG_ALOLAN_FORM,
},
[SPECIES_MEOWTH_ALOLAN] =
@@ -27051,7 +27051,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_GRAY,
.noFlip = FALSE,
- .flags = F_ALOLAN_FORM,
+ .flags = FLAG_ALOLAN_FORM,
},
[SPECIES_PERSIAN_ALOLAN] =
@@ -27081,7 +27081,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_GRAY,
.noFlip = FALSE,
- .flags = F_ALOLAN_FORM,
+ .flags = FLAG_ALOLAN_FORM,
},
[SPECIES_GEODUDE_ALOLAN] =
@@ -27113,7 +27113,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_BROWN,
.noFlip = FALSE,
- .flags = F_ALOLAN_FORM,
+ .flags = FLAG_ALOLAN_FORM,
},
[SPECIES_GRAVELER_ALOLAN] =
@@ -27145,7 +27145,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_BROWN,
.noFlip = FALSE,
- .flags = F_ALOLAN_FORM,
+ .flags = FLAG_ALOLAN_FORM,
},
[SPECIES_GOLEM_ALOLAN] =
@@ -27174,7 +27174,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_BROWN,
.noFlip = FALSE,
- .flags = F_ALOLAN_FORM,
+ .flags = FLAG_ALOLAN_FORM,
},
[SPECIES_GRIMER_ALOLAN] =
@@ -27206,7 +27206,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_GREEN,
.noFlip = FALSE,
- .flags = F_ALOLAN_FORM,
+ .flags = FLAG_ALOLAN_FORM,
},
[SPECIES_MUK_ALOLAN] =
@@ -27236,7 +27236,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_GREEN,
.noFlip = TRUE,
- .flags = F_ALOLAN_FORM,
+ .flags = FLAG_ALOLAN_FORM,
},
[SPECIES_EXEGGUTOR_ALOLAN] =
@@ -27265,7 +27265,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_YELLOW,
.noFlip = FALSE,
- .flags = F_ALOLAN_FORM,
+ .flags = FLAG_ALOLAN_FORM,
},
[SPECIES_MAROWAK_ALOLAN] =
@@ -27294,7 +27294,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_PURPLE,
.noFlip = FALSE,
- .flags = F_ALOLAN_FORM,
+ .flags = FLAG_ALOLAN_FORM,
},
[SPECIES_MEOWTH_GALARIAN] =
@@ -27323,7 +27323,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_BROWN,
.noFlip = FALSE,
- .flags = F_GALARIAN_FORM,
+ .flags = FLAG_GALARIAN_FORM,
},
[SPECIES_PONYTA_GALARIAN] =
@@ -27352,7 +27352,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_WHITE,
.noFlip = FALSE,
- .flags = F_GALARIAN_FORM,
+ .flags = FLAG_GALARIAN_FORM,
},
[SPECIES_RAPIDASH_GALARIAN] =
@@ -27381,7 +27381,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_WHITE,
.noFlip = FALSE,
- .flags = F_GALARIAN_FORM,
+ .flags = FLAG_GALARIAN_FORM,
},
[SPECIES_SLOWPOKE_GALARIAN] =
@@ -27410,7 +27410,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_PINK,
.noFlip = FALSE,
- .flags = F_GALARIAN_FORM,
+ .flags = FLAG_GALARIAN_FORM,
},
@@ -27440,7 +27440,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_PINK,
.noFlip = FALSE,
- .flags = F_GALARIAN_FORM,
+ .flags = FLAG_GALARIAN_FORM,
},
[SPECIES_FARFETCHD_GALARIAN] =
@@ -27470,7 +27470,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_BROWN,
.noFlip = FALSE,
- .flags = F_GALARIAN_FORM,
+ .flags = FLAG_GALARIAN_FORM,
},
[SPECIES_WEEZING_GALARIAN] =
@@ -27502,7 +27502,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_GRAY,
.noFlip = FALSE,
- .flags = F_GALARIAN_FORM,
+ .flags = FLAG_GALARIAN_FORM,
},
[SPECIES_MR_MIME_GALARIAN] =
@@ -27531,7 +27531,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_WHITE,
.noFlip = FALSE,
- .flags = F_GALARIAN_FORM,
+ .flags = FLAG_GALARIAN_FORM,
},
[SPECIES_ARTICUNO_GALARIAN] =
@@ -27560,7 +27560,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_PURPLE,
.noFlip = FALSE,
- .flags = F_GALARIAN_FORM,
+ .flags = FLAG_GALARIAN_FORM,
},
[SPECIES_ZAPDOS_GALARIAN] =
@@ -27589,7 +27589,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_YELLOW,
.noFlip = FALSE,
- .flags = F_GALARIAN_FORM,
+ .flags = FLAG_GALARIAN_FORM,
},
[SPECIES_MOLTRES_GALARIAN] =
@@ -27618,7 +27618,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_RED,
.noFlip = FALSE,
- .flags = F_GALARIAN_FORM,
+ .flags = FLAG_GALARIAN_FORM,
},
[SPECIES_SLOWKING_GALARIAN] =
@@ -27647,7 +27647,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_PINK,
.noFlip = FALSE,
- .flags = F_GALARIAN_FORM,
+ .flags = FLAG_GALARIAN_FORM,
},
[SPECIES_CORSOLA_GALARIAN] =
@@ -27676,7 +27676,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_WHITE,
.noFlip = FALSE,
- .flags = F_GALARIAN_FORM,
+ .flags = FLAG_GALARIAN_FORM,
},
[SPECIES_ZIGZAGOON_GALARIAN] =
@@ -27705,7 +27705,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_WHITE,
.noFlip = FALSE,
- .flags = F_GALARIAN_FORM,
+ .flags = FLAG_GALARIAN_FORM,
},
[SPECIES_LINOONE_GALARIAN] =
@@ -27734,7 +27734,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_WHITE,
.noFlip = FALSE,
- .flags = F_GALARIAN_FORM,
+ .flags = FLAG_GALARIAN_FORM,
},
[SPECIES_DARUMAKA_GALARIAN] =
@@ -27759,7 +27759,7 @@ const struct BaseStats gBaseStats[] =
.abilities = {ABILITY_HUSTLE, ABILITY_NONE, ABILITY_INNER_FOCUS},
.bodyColor = BODY_COLOR_WHITE,
.noFlip = FALSE,
- .flags = F_GALARIAN_FORM,
+ .flags = FLAG_GALARIAN_FORM,
},
[SPECIES_DARMANITAN_GALARIAN] =
@@ -27788,7 +27788,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_WHITE,
.noFlip = FALSE,
- .flags = F_GALARIAN_FORM,
+ .flags = FLAG_GALARIAN_FORM,
},
[SPECIES_YAMASK_GALARIAN] =
@@ -27817,7 +27817,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_BLACK,
.noFlip = FALSE,
- .flags = F_GALARIAN_FORM,
+ .flags = FLAG_GALARIAN_FORM,
},
[SPECIES_STUNFISK_GALARIAN] =
@@ -27846,7 +27846,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_GREEN,
.noFlip = FALSE,
- .flags = F_GALARIAN_FORM,
+ .flags = FLAG_GALARIAN_FORM,
},
[SPECIES_PIKACHU_COSPLAY] =
@@ -29976,7 +29976,7 @@ const struct BaseStats gBaseStats[] =
#endif
.bodyColor = BODY_COLOR_WHITE,
.noFlip = FALSE,
- .flags = F_GALARIAN_FORM,
+ .flags = FLAG_GALARIAN_FORM,
},
[SPECIES_DEERLING_SUMMER] =
diff --git a/src/data/text/abilities.h b/src/data/text/abilities.h
index c2c17b7371..cdc3276082 100644
--- a/src/data/text/abilities.h
+++ b/src/data/text/abilities.h
@@ -255,6 +255,279 @@ static const u8 sGrimNeighDescription[] = _("KOs boost Sp. Atk stat.");
static const u8 sAsOneIceRiderDescription[] = _("Unnerve and Chilling Neigh.");
static const u8 sAsOneShadowRiderDescription[] = _("Unnerve and Grim Neigh.");
+#if B_EXPANDED_ABILITY_NAMES == TRUE
+const u8 gAbilityNames[ABILITIES_COUNT][ABILITY_NAME_LENGTH + 1] =
+{
+ [ABILITY_NONE] = _("-------"),
+ [ABILITY_STENCH] = _("Stench"),
+ [ABILITY_DRIZZLE] = _("Drizzle"),
+ [ABILITY_SPEED_BOOST] = _("Speed Boost"),
+ [ABILITY_BATTLE_ARMOR] = _("Battle Armor"),
+ [ABILITY_STURDY] = _("Sturdy"),
+ [ABILITY_DAMP] = _("Damp"),
+ [ABILITY_LIMBER] = _("Limber"),
+ [ABILITY_SAND_VEIL] = _("Sand Veil"),
+ [ABILITY_STATIC] = _("Static"),
+ [ABILITY_VOLT_ABSORB] = _("Volt Absorb"),
+ [ABILITY_WATER_ABSORB] = _("Water Absorb"),
+ [ABILITY_OBLIVIOUS] = _("Oblivious"),
+ [ABILITY_CLOUD_NINE] = _("Cloud Nine"),
+ [ABILITY_COMPOUND_EYES] = _("Compound Eyes"),
+ [ABILITY_INSOMNIA] = _("Insomnia"),
+ [ABILITY_COLOR_CHANGE] = _("Color Change"),
+ [ABILITY_IMMUNITY] = _("Immunity"),
+ [ABILITY_FLASH_FIRE] = _("Flash Fire"),
+ [ABILITY_SHIELD_DUST] = _("Shield Dust"),
+ [ABILITY_OWN_TEMPO] = _("Own Tempo"),
+ [ABILITY_SUCTION_CUPS] = _("Suction Cups"),
+ [ABILITY_INTIMIDATE] = _("Intimidate"),
+ [ABILITY_SHADOW_TAG] = _("Shadow Tag"),
+ [ABILITY_ROUGH_SKIN] = _("Rough Skin"),
+ [ABILITY_WONDER_GUARD] = _("Wonder Guard"),
+ [ABILITY_LEVITATE] = _("Levitate"),
+ [ABILITY_EFFECT_SPORE] = _("Effect Spore"),
+ [ABILITY_SYNCHRONIZE] = _("Synchronize"),
+ [ABILITY_CLEAR_BODY] = _("Clear Body"),
+ [ABILITY_NATURAL_CURE] = _("Natural Cure"),
+ [ABILITY_LIGHTNING_ROD] = _("Lightning Rod"),
+ [ABILITY_SERENE_GRACE] = _("Serene Grace"),
+ [ABILITY_SWIFT_SWIM] = _("Swift Swim"),
+ [ABILITY_CHLOROPHYLL] = _("Chlorophyll"),
+ [ABILITY_ILLUMINATE] = _("Illuminate"),
+ [ABILITY_TRACE] = _("Trace"),
+ [ABILITY_HUGE_POWER] = _("Huge Power"),
+ [ABILITY_POISON_POINT] = _("Poison Point"),
+ [ABILITY_INNER_FOCUS] = _("Inner Focus"),
+ [ABILITY_MAGMA_ARMOR] = _("Magma Armor"),
+ [ABILITY_WATER_VEIL] = _("Water Veil"),
+ [ABILITY_MAGNET_PULL] = _("Magnet Pull"),
+ [ABILITY_SOUNDPROOF] = _("Soundproof"),
+ [ABILITY_RAIN_DISH] = _("Rain Dish"),
+ [ABILITY_SAND_STREAM] = _("Sand Stream"),
+ [ABILITY_PRESSURE] = _("Pressure"),
+ [ABILITY_THICK_FAT] = _("Thick Fat"),
+ [ABILITY_EARLY_BIRD] = _("Early Bird"),
+ [ABILITY_FLAME_BODY] = _("Flame Body"),
+ [ABILITY_RUN_AWAY] = _("Run Away"),
+ [ABILITY_KEEN_EYE] = _("Keen Eye"),
+ [ABILITY_HYPER_CUTTER] = _("Hyper Cutter"),
+ [ABILITY_PICKUP] = _("Pickup"),
+ [ABILITY_TRUANT] = _("Truant"),
+ [ABILITY_HUSTLE] = _("Hustle"),
+ [ABILITY_CUTE_CHARM] = _("Cute Charm"),
+ [ABILITY_PLUS] = _("Plus"),
+ [ABILITY_MINUS] = _("Minus"),
+ [ABILITY_FORECAST] = _("Forecast"),
+ [ABILITY_STICKY_HOLD] = _("Sticky Hold"),
+ [ABILITY_SHED_SKIN] = _("Shed Skin"),
+ [ABILITY_GUTS] = _("Guts"),
+ [ABILITY_MARVEL_SCALE] = _("Marvel Scale"),
+ [ABILITY_LIQUID_OOZE] = _("Liquid Ooze"),
+ [ABILITY_OVERGROW] = _("Overgrow"),
+ [ABILITY_BLAZE] = _("Blaze"),
+ [ABILITY_TORRENT] = _("Torrent"),
+ [ABILITY_SWARM] = _("Swarm"),
+ [ABILITY_ROCK_HEAD] = _("Rock Head"),
+ [ABILITY_DROUGHT] = _("Drought"),
+ [ABILITY_ARENA_TRAP] = _("Arena Trap"),
+ [ABILITY_VITAL_SPIRIT] = _("Vital Spirit"),
+ [ABILITY_WHITE_SMOKE] = _("White Smoke"),
+ [ABILITY_PURE_POWER] = _("Pure Power"),
+ [ABILITY_SHELL_ARMOR] = _("Shell Armor"),
+ [ABILITY_AIR_LOCK] = _("Air Lock"),
+ [ABILITY_TANGLED_FEET] = _("Tangled Feet"),
+ [ABILITY_MOTOR_DRIVE] = _("Motor Drive"),
+ [ABILITY_RIVALRY] = _("Rivalry"),
+ [ABILITY_STEADFAST] = _("Steadfast"),
+ [ABILITY_SNOW_CLOAK] = _("Snow Cloak"),
+ [ABILITY_GLUTTONY] = _("Gluttony"),
+ [ABILITY_ANGER_POINT] = _("Anger Point"),
+ [ABILITY_UNBURDEN] = _("Unburden"),
+ [ABILITY_HEATPROOF] = _("Heatproof"),
+ [ABILITY_SIMPLE] = _("Simple"),
+ [ABILITY_DRY_SKIN] = _("Dry Skin"),
+ [ABILITY_DOWNLOAD] = _("Download"),
+ [ABILITY_IRON_FIST] = _("Iron Fist"),
+ [ABILITY_POISON_HEAL] = _("Poison Heal"),
+ [ABILITY_ADAPTABILITY] = _("Adaptability"),
+ [ABILITY_SKILL_LINK] = _("Skill Link"),
+ [ABILITY_HYDRATION] = _("Hydration"),
+ [ABILITY_SOLAR_POWER] = _("Solar Power"),
+ [ABILITY_QUICK_FEET] = _("Quick Feet"),
+ [ABILITY_NORMALIZE] = _("Normalize"),
+ [ABILITY_SNIPER] = _("Sniper"),
+ [ABILITY_MAGIC_GUARD] = _("Magic Guard"),
+ [ABILITY_NO_GUARD] = _("No Guard"),
+ [ABILITY_STALL] = _("Stall"),
+ [ABILITY_TECHNICIAN] = _("Technician"),
+ [ABILITY_LEAF_GUARD] = _("Leaf Guard"),
+ [ABILITY_KLUTZ] = _("Klutz"),
+ [ABILITY_MOLD_BREAKER] = _("Mold Breaker"),
+ [ABILITY_SUPER_LUCK] = _("Super Luck"),
+ [ABILITY_AFTERMATH] = _("Aftermath"),
+ [ABILITY_ANTICIPATION] = _("Anticipation"),
+ [ABILITY_FOREWARN] = _("Forewarn"),
+ [ABILITY_UNAWARE] = _("Unaware"),
+ [ABILITY_TINTED_LENS] = _("Tinted Lens"),
+ [ABILITY_FILTER] = _("Filter"),
+ [ABILITY_SLOW_START] = _("Slow Start"),
+ [ABILITY_SCRAPPY] = _("Scrappy"),
+ [ABILITY_STORM_DRAIN] = _("Storm Drain"),
+ [ABILITY_ICE_BODY] = _("Ice Body"),
+ [ABILITY_SOLID_ROCK] = _("Solid Rock"),
+ [ABILITY_SNOW_WARNING] = _("Snow Warning"),
+ [ABILITY_HONEY_GATHER] = _("Honey Gather"),
+ [ABILITY_FRISK] = _("Frisk"),
+ [ABILITY_RECKLESS] = _("Reckless"),
+ [ABILITY_MULTITYPE] = _("Multitype"),
+ [ABILITY_FLOWER_GIFT] = _("Flower Gift"),
+ [ABILITY_BAD_DREAMS] = _("Bad Dreams"),
+ [ABILITY_PICKPOCKET] = _("Pickpocket"),
+ [ABILITY_SHEER_FORCE] = _("Sheer Force"),
+ [ABILITY_CONTRARY] = _("Contrary"),
+ [ABILITY_UNNERVE] = _("Unnerve"),
+ [ABILITY_DEFIANT] = _("Defiant"),
+ [ABILITY_DEFEATIST] = _("Defeatist"),
+ [ABILITY_CURSED_BODY] = _("Cursed Body"),
+ [ABILITY_HEALER] = _("Healer"),
+ [ABILITY_FRIEND_GUARD] = _("Friend Guard"),
+ [ABILITY_WEAK_ARMOR] = _("Weak Armor"),
+ [ABILITY_HEAVY_METAL] = _("Heavy Metal"),
+ [ABILITY_LIGHT_METAL] = _("Light Metal"),
+ [ABILITY_MULTISCALE] = _("Multiscale"),
+ [ABILITY_TOXIC_BOOST] = _("Toxic Boost"),
+ [ABILITY_FLARE_BOOST] = _("Flare Boost"),
+ [ABILITY_HARVEST] = _("Harvest"),
+ [ABILITY_TELEPATHY] = _("Telepathy"),
+ [ABILITY_MOODY] = _("Moody"),
+ [ABILITY_OVERCOAT] = _("Overcoat"),
+ [ABILITY_POISON_TOUCH] = _("Poison Touch"),
+ [ABILITY_REGENERATOR] = _("Regenerator"),
+ [ABILITY_BIG_PECKS] = _("Big Pecks"),
+ [ABILITY_SAND_RUSH] = _("Sand Rush"),
+ [ABILITY_WONDER_SKIN] = _("Wonder Skin"),
+ [ABILITY_ANALYTIC] = _("Analytic"),
+ [ABILITY_ILLUSION] = _("Illusion"),
+ [ABILITY_IMPOSTER] = _("Imposter"),
+ [ABILITY_INFILTRATOR] = _("Infiltrator"),
+ [ABILITY_MUMMY] = _("Mummy"),
+ [ABILITY_MOXIE] = _("Moxie"),
+ [ABILITY_JUSTIFIED] = _("Justified"),
+ [ABILITY_RATTLED] = _("Rattled"),
+ [ABILITY_MAGIC_BOUNCE] = _("Magic Bounce"),
+ [ABILITY_SAP_SIPPER] = _("Sap Sipper"),
+ [ABILITY_PRANKSTER] = _("Prankster"),
+ [ABILITY_SAND_FORCE] = _("Sand Force"),
+ [ABILITY_IRON_BARBS] = _("Iron Barbs"),
+ [ABILITY_ZEN_MODE] = _("Zen Mode"),
+ [ABILITY_VICTORY_STAR] = _("Victory Star"),
+ [ABILITY_TURBOBLAZE] = _("Turboblaze"),
+ [ABILITY_TERAVOLT] = _("Teravolt"),
+ [ABILITY_AROMA_VEIL] = _("Aroma Veil"),
+ [ABILITY_FLOWER_VEIL] = _("Flower Veil"),
+ [ABILITY_CHEEK_POUCH] = _("Cheek Pouch"),
+ [ABILITY_PROTEAN] = _("Protean"),
+ [ABILITY_FUR_COAT] = _("Fur Coat"),
+ [ABILITY_MAGICIAN] = _("Magician"),
+ [ABILITY_BULLETPROOF] = _("Bulletproof"),
+ [ABILITY_COMPETITIVE] = _("Competitive"),
+ [ABILITY_STRONG_JAW] = _("Strong Jaw"),
+ [ABILITY_REFRIGERATE] = _("Refrigerate"),
+ [ABILITY_SWEET_VEIL] = _("Sweet Veil"),
+ [ABILITY_STANCE_CHANGE] = _("Stance Change"),
+ [ABILITY_GALE_WINGS] = _("Gale Wings"),
+ [ABILITY_MEGA_LAUNCHER] = _("Mega Launcher"),
+ [ABILITY_GRASS_PELT] = _("Grass Pelt"),
+ [ABILITY_SYMBIOSIS] = _("Symbiosis"),
+ [ABILITY_TOUGH_CLAWS] = _("Tough Claws"),
+ [ABILITY_PIXILATE] = _("Pixilate"),
+ [ABILITY_GOOEY] = _("Gooey"),
+ [ABILITY_AERILATE] = _("Aerilate"),
+ [ABILITY_PARENTAL_BOND] = _("Parental Bond"),
+ [ABILITY_DARK_AURA] = _("Dark Aura"),
+ [ABILITY_FAIRY_AURA] = _("Fairy Aura"),
+ [ABILITY_AURA_BREAK] = _("Aura Break"),
+ [ABILITY_PRIMORDIAL_SEA] = _("Primordial Sea"),
+ [ABILITY_DESOLATE_LAND] = _("Desolate Land"),
+ [ABILITY_DELTA_STREAM] = _("Delta Stream"),
+ [ABILITY_STAMINA] = _("Stamina"),
+ [ABILITY_WIMP_OUT] = _("Wimp Out"),
+ [ABILITY_EMERGENCY_EXIT] = _("Emergency Exit"),
+ [ABILITY_WATER_COMPACTION] = _("Water Compaction"),
+ [ABILITY_MERCILESS] = _("Merciless"),
+ [ABILITY_SHIELDS_DOWN] = _("Shields Down"),
+ [ABILITY_STAKEOUT] = _("Stakeout"),
+ [ABILITY_WATER_BUBBLE] = _("Water Bubble"),
+ [ABILITY_STEELWORKER] = _("Steelworker"),
+ [ABILITY_BERSERK] = _("Berserk"),
+ [ABILITY_SLUSH_RUSH] = _("Slush Rush"),
+ [ABILITY_LONG_REACH] = _("Long Reach"),
+ [ABILITY_LIQUID_VOICE] = _("Liquid Voice"),
+ [ABILITY_TRIAGE] = _("Triage"),
+ [ABILITY_GALVANIZE] = _("Galvanize"),
+ [ABILITY_SURGE_SURFER] = _("Surge Surfer"),
+ [ABILITY_SCHOOLING] = _("Schooling"),
+ [ABILITY_DISGUISE] = _("Disguise"),
+ [ABILITY_BATTLE_BOND] = _("Battle Bond"),
+ [ABILITY_POWER_CONSTRUCT] = _("Power Construct"),
+ [ABILITY_CORROSION] = _("Corrosion"),
+ [ABILITY_COMATOSE] = _("Comatose"),
+ [ABILITY_QUEENLY_MAJESTY] = _("Queenly Majesty"),
+ [ABILITY_INNARDS_OUT] = _("Innards Out"),
+ [ABILITY_DANCER] = _("Dancer"),
+ [ABILITY_BATTERY] = _("Battery"),
+ [ABILITY_FLUFFY] = _("Fluffy"),
+ [ABILITY_DAZZLING] = _("Dazzling"),
+ [ABILITY_SOUL_HEART] = _("Soul-Heart"),
+ [ABILITY_TANGLING_HAIR] = _("Tangling Hair"),
+ [ABILITY_RECEIVER] = _("Receiver"),
+ [ABILITY_POWER_OF_ALCHEMY] = _("Power Of Alchemy"),
+ [ABILITY_BEAST_BOOST] = _("Beast Boost"),
+ [ABILITY_RKS_SYSTEM] = _("RKS System"),
+ [ABILITY_ELECTRIC_SURGE] = _("Electric Surge"),
+ [ABILITY_PSYCHIC_SURGE] = _("Psychic Surge"),
+ [ABILITY_MISTY_SURGE] = _("Misty Surge"),
+ [ABILITY_GRASSY_SURGE] = _("Grassy Surge"),
+ [ABILITY_FULL_METAL_BODY] = _("Full Metal Body"),
+ [ABILITY_SHADOW_SHIELD] = _("Shadow Shield"),
+ [ABILITY_PRISM_ARMOR] = _("Prism Armor"),
+ [ABILITY_NEUROFORCE] = _("Neuroforce"),
+ [ABILITY_INTREPID_SWORD] = _("Intrepid Sword"),
+ [ABILITY_DAUNTLESS_SHIELD] = _("Dauntless Shield"),
+ [ABILITY_LIBERO] = _("Libero"),
+ [ABILITY_BALL_FETCH] = _("Ball Fetch"),
+ [ABILITY_COTTON_DOWN] = _("Cotton Down"),
+ [ABILITY_PROPELLER_TAIL] = _("Propeller Tail"),
+ [ABILITY_MIRROR_ARMOR] = _("Mirror Armor"),
+ [ABILITY_GULP_MISSILE] = _("Gulp Missile"),
+ [ABILITY_STALWART] = _("Stalwart"),
+ [ABILITY_STEAM_ENGINE] = _("Steam Engine"),
+ [ABILITY_PUNK_ROCK] = _("Punk Rock"),
+ [ABILITY_SAND_SPIT] = _("Sand Spit"),
+ [ABILITY_ICE_SCALES] = _("Ice Scales"),
+ [ABILITY_RIPEN] = _("Ripen"),
+ [ABILITY_ICE_FACE] = _("Ice Face"),
+ [ABILITY_POWER_SPOT] = _("Power Spot"),
+ [ABILITY_MIMICRY] = _("Mimicry"),
+ [ABILITY_SCREEN_CLEANER] = _("Screen Cleaner"),
+ [ABILITY_STEELY_SPIRIT] = _("Steely Spirit"),
+ [ABILITY_PERISH_BODY] = _("Perish Body"),
+ [ABILITY_WANDERING_SPIRIT] = _("Wandering Spirit"),
+ [ABILITY_GORILLA_TACTICS] = _("Gorilla Tactics"),
+ [ABILITY_NEUTRALIZING_GAS] = _("Neutralizing Gas"),
+ [ABILITY_PASTEL_VEIL] = _("Pastel Veil"),
+ [ABILITY_HUNGER_SWITCH] = _("Hunger Switch"),
+ [ABILITY_QUICK_DRAW] = _("Quick Draw"),
+ [ABILITY_UNSEEN_FIST] = _("Unseen Fist"),
+ [ABILITY_CURIOUS_MEDICINE] = _("Curious Medicine"),
+ [ABILITY_TRANSISTOR] = _("Transistor"),
+ [ABILITY_DRAGONS_MAW] = _("Dragon's Maw"),
+ [ABILITY_CHILLING_NEIGH] = _("Chilling Neigh"),
+ [ABILITY_GRIM_NEIGH] = _("Grim Neigh"),
+ [ABILITY_AS_ONE_ICE_RIDER] = _("As One"),
+ [ABILITY_AS_ONE_SHADOW_RIDER] = _("As One"),
+};
+#else // 12 characters
const u8 gAbilityNames[ABILITIES_COUNT][ABILITY_NAME_LENGTH + 1] =
{
[ABILITY_NONE] = _("-------"),
@@ -526,6 +799,7 @@ const u8 gAbilityNames[ABILITIES_COUNT][ABILITY_NAME_LENGTH + 1] =
[ABILITY_AS_ONE_ICE_RIDER] = _("As One"),
[ABILITY_AS_ONE_SHADOW_RIDER] = _("As One"),
};
+#endif
const u8 *const gAbilityDescriptionPointers[ABILITIES_COUNT] =
{
diff --git a/src/data/text/move_descriptions.h b/src/data/text/move_descriptions.h
index 037261e321..f3b9827566 100644
--- a/src/data/text/move_descriptions.h
+++ b/src/data/text/move_descriptions.h
@@ -1417,1227 +1417,1227 @@ static const u8 sPsychoBoostDescription[] = _(
"Allows a full-power attack,\n"
"but sharply lowers Sp. Atk.");
-static const u8 sROOSTDescription[] = _(
+static const u8 sRoostDescription[] = _(
"Restores the user's HP by\n"
"half of its max HP.");
-static const u8 sGRAVITYDescription[] = _(
+static const u8 sGravityDescription[] = _(
"Gravity is intensified\n"
"negating levitation.");
-static const u8 sMIRACLE_EYEDescription[] = _(
+static const u8 sMiracleEyeDescription[] = _(
"Negate evasiveness and\n"
"Dark-type's immunities.");
-static const u8 sWAKE_UP_SLAPDescription[] = _(
+static const u8 sWakeUpSlapDescription[] = _(
"Powerful against sleeping\n"
"foes, but also heals them.");
-static const u8 sHAMMER_ARMDescription[] = _(
+static const u8 sHammerArmDescription[] = _(
"A swinging fist attack\n"
"that also lowers Speed.");
-static const u8 sGYRO_BALLDescription[] = _(
+static const u8 sGyroBallDescription[] = _(
"A high-speed spin that does\n"
"more damage to faster foes.");
-static const u8 sHEALING_WISHDescription[] = _(
+static const u8 sHealingWishDescription[] = _(
"The user faints to heal up\n"
"the recipient.");
-static const u8 sBRINEDescription[] = _(
+static const u8 sBrineDescription[] = _(
"Does double damage to foes\n"
"with half HP.");
-static const u8 sNATURAL_GIFTDescription[] = _(
+static const u8 sNaturalGiftDescription[] = _(
"The effectiveness varies\n"
"with the held Berry.");
-static const u8 sFEINTDescription[] = _(
+static const u8 sFeintDescription[] = _(
"An attack that hits foes\n"
"using moves like Protect.");
-static const u8 sPLUCKDescription[] = _(
+static const u8 sPluckDescription[] = _(
"Eats the foe's held Berry\n"
"gaining its effect.");
-static const u8 sTAILWINDDescription[] = _(
+static const u8 sTailwindDescription[] = _(
"Whips up a turbulent breeze\n"
"that raises Speed.");
-static const u8 sACUPRESSUREDescription[] = _(
+static const u8 sAcupressureDescription[] = _(
"The user sharply raises\n"
"one of its stats.");
-static const u8 sMETAL_BURSTDescription[] = _(
+static const u8 sMetalBurstDescription[] = _(
"Retaliates any hit with\n"
"greater power.");
-static const u8 sU_TURNDescription[] = _(
+static const u8 sUTurnDescription[] = _(
"Does damage then switches\n"
"out the user.");
-static const u8 sCLOSE_COMBATDescription[] = _(
+static const u8 sCloseCombatDescription[] = _(
"A strong attack but lowers\n"
"the defensive stats.");
-static const u8 sPAYBACKDescription[] = _(
+static const u8 sPaybackDescription[] = _(
"An attack that gains power\n"
"if the user moves last.");
-static const u8 sASSURANCEDescription[] = _(
+static const u8 sAssuranceDescription[] = _(
"An attack that gains power\n"
"if the foe has been hurt.");
-static const u8 sEMBARGODescription[] = _(
+static const u8 sEmbargoDescription[] = _(
"Prevents the foe from\n"
"using any items.");
-static const u8 sFLINGDescription[] = _(
+static const u8 sFlingDescription[] = _(
"The effectiveness varies\n"
"with the held item.");
-static const u8 sPSYCHO_SHIFTDescription[] = _(
+static const u8 sPsychoShiftDescription[] = _(
"Transfers status problems\n"
"to the foe.");
-static const u8 sTRUMP_CARDDescription[] = _(
+static const u8 sTrumpCardDescription[] = _(
"The less PP the move has\n"
"the more damage it does.");
-static const u8 sHEAL_BLOCKDescription[] = _(
+static const u8 sHealBlockDescription[] = _(
"Prevents the foe from\n"
"recovering any HP.");
-static const u8 sWRING_OUTDescription[] = _(
+static const u8 sWringOutDescription[] = _(
"The higher the foe's HP\n"
"the more damage caused.");
-static const u8 sPOWER_TRICKDescription[] = _(
+static const u8 sPowerTrickDescription[] = _(
"The user swaps its Attack\n"
"and Defense stats.");
-static const u8 sGASTRO_ACIDDescription[] = _(
+static const u8 sGastroAcidDescription[] = _(
"Stomach acid suppresses\n"
"the foe's ability.");
-static const u8 sLUCKY_CHANTDescription[] = _(
+static const u8 sLuckyChantDescription[] = _(
"Prevents the foe from\n"
"landing critical hits.");
-static const u8 sME_FIRSTDescription[] = _(
+static const u8 sMeFirstDescription[] = _(
"Executes the foe's attack\n"
"with greater power.");
-static const u8 sCOPYCATDescription[] = _(
+static const u8 sCopycatDescription[] = _(
"The user mimics the last\n"
"move used by a foe.");
-static const u8 sPOWER_SWAPDescription[] = _(
+static const u8 sPowerSwapDescription[] = _(
"Swaps changes to Attack\n"
"and Sp. Atk with the foe.");
-static const u8 sGUARD_SWAPDescription[] = _(
+static const u8 sGuardSwapDescription[] = _(
"Swaps changes to Defense\n"
"and Sp. Def with the foe.");
-static const u8 sPUNISHMENTDescription[] = _(
+static const u8 sPunishmentDescription[] = _(
"Does more damage if the\n"
"foe has powered up.");
-static const u8 sLAST_RESORTDescription[] = _(
+static const u8 sLastResortDescription[] = _(
"Can only be used if every\n"
"other move has been used.");
-static const u8 sWORRY_SEEDDescription[] = _(
+static const u8 sWorrySeedDescription[] = _(
"Plants a seed on the foe\n"
"giving it Insomnia.");
-static const u8 sSUCKER_PUNCHDescription[] = _(
+static const u8 sSuckerPunchDescription[] = _(
"Strikes first if the foe\n"
"is preparing an attack.");
-static const u8 sTOXIC_SPIKESDescription[] = _(
+static const u8 sToxicSpikesDescription[] = _(
"Sets spikes that poison a\n"
"foe switching in.");
-static const u8 sHEART_SWAPDescription[] = _(
+static const u8 sHeartSwapDescription[] = _(
"Swaps any stat changes\n"
"with the foe.");
-static const u8 sAQUA_RINGDescription[] = _(
+static const u8 sAquaRingDescription[] = _(
"Forms a veil of water\n"
"that restores HP.");
-static const u8 sMAGNET_RISEDescription[] = _(
+static const u8 sMagnetRiseDescription[] = _(
"The user levitates with\n"
"electromagnetism.");
-static const u8 sFLARE_BLITZDescription[] = _(
+static const u8 sFlareBlitzDescription[] = _(
"A charge that may burn the\n"
"foe. Also hurts the user.");
-static const u8 sFORCE_PALMDescription[] = _(
+static const u8 sForcePalmDescription[] = _(
"A shock wave attack that\n"
"may paralyze the foe.");
-static const u8 sAURA_SPHEREDescription[] = _(
+static const u8 sAuraSphereDescription[] = _(
"Attacks with an aura blast\n"
"that cannot be evaded.");
-static const u8 sROCK_POLISHDescription[] = _(
+static const u8 sRockPolishDescription[] = _(
"Polishes the body to\n"
"sharply raise Speed.");
-static const u8 sPOISON_JABDescription[] = _(
+static const u8 sPoisonJabDescription[] = _(
"A stabbing attack that\n"
"may poison the foe.");
-static const u8 sDARK_PULSEDescription[] = _(
+static const u8 sDarkPulseDescription[] = _(
"Attacks with a horrible\n"
"aura. May cause flinching.");
-static const u8 sNIGHT_SLASHDescription[] = _(
+static const u8 sNightSlashDescription[] = _(
"Hits as soon as possible.\n"
"High critical-hit ratio.");
-static const u8 sAQUA_TAILDescription[] = _(
+static const u8 sAquaTailDescription[] = _(
"The user swings its tail\n"
"like a wave to attack.");
-static const u8 sSEED_BOMBDescription[] = _(
+static const u8 sSeedBombDescription[] = _(
"A barrage of hard seeds\n"
"is fired at the foe.");
-static const u8 sAIR_SLASHDescription[] = _(
+static const u8 sAirSlashDescription[] = _(
"Attacks with a blade of\n"
"air. May cause flinching.");
-static const u8 sX_SCISSORDescription[] = _(
+static const u8 sXScissorDescription[] = _(
"Slashes the foe with crossed\n"
"scythes, claws, etc.");
-static const u8 sBUG_BUZZDescription[] = _(
+static const u8 sBugBuzzDescription[] = _(
"A damaging sound wave that\n"
"may lower Sp. Def.");
-static const u8 sDRAGON_PULSEDescription[] = _(
+static const u8 sDragonPulseDescription[] = _(
"Generates a shock wave to\n"
"damage the foe.");
-static const u8 sDRAGON_RUSHDescription[] = _(
+static const u8 sDragonRushDescription[] = _(
"Tackles the foe with menace.\n"
"May cause flinching.");
-static const u8 sPOWER_GEMDescription[] = _(
+static const u8 sPowerGemDescription[] = _(
"Attacks with rays of light\n"
"that sparkle like diamonds.");
-static const u8 sVACUUM_WAVEDescription[] = _(
+static const u8 sVacuumWaveDescription[] = _(
"Whirls its fists to send\n"
"a wave that strikes first.");
-static const u8 sFOCUS_BLASTDescription[] = _(
+static const u8 sFocusBlastDescription[] = _(
"Attacks at full power.\n"
"May lower Sp. Def.");
-static const u8 sENERGY_BALLDescription[] = _(
+static const u8 sEnergyBallDescription[] = _(
"Draws power from nature to\n"
"attack. May lower Sp. Def.");
-static const u8 sBRAVE_BIRDDescription[] = _(
+static const u8 sBraveBirdDescription[] = _(
"A low altitude charge that\n"
"also hurts the user.");
-static const u8 sEARTH_POWERDescription[] = _(
+static const u8 sEarthPowerDescription[] = _(
"Makes the ground erupt with\n"
"power. May lower Sp. Def.");
-static const u8 sSWITCHEROODescription[] = _(
+static const u8 sSwitcherooDescription[] = _(
"Swaps items with the foe\n"
"faster than the eye can see.");
-static const u8 sNASTY_PLOTDescription[] = _(
+static const u8 sNastyPlotDescription[] = _(
"Thinks bad thoughts to\n"
"sharply boost Sp. Atk.");
-static const u8 sBULLET_PUNCHDescription[] = _(
+static const u8 sBulletPunchDescription[] = _(
"Punches as fast as a bul-\n"
"let. It always hits first.");
-static const u8 sICE_SHARDDescription[] = _(
+static const u8 sIceShardDescription[] = _(
"Hurls a chunk of ice that\n"
"always strike first.");
-static const u8 sSHADOW_CLAWDescription[] = _(
+static const u8 sShadowClawDescription[] = _(
"Strikes with a shadow claw.\n"
"High critical-hit ratio.");
-static const u8 sTHUNDER_FANGDescription[] = _(
+static const u8 sThunderFangDescription[] = _(
"May cause flinching or\n"
"leave the foe paralyzed.");
-static const u8 sICE_FANGDescription[] = _(
+static const u8 sIceFangDescription[] = _(
"May cause flinching or\n"
"leave the foe frozen.");
-static const u8 sFIRE_FANGDescription[] = _(
+static const u8 sFireFangDescription[] = _(
"May cause flinching or\n"
"leave the foe with a burn.");
-static const u8 sSHADOW_SNEAKDescription[] = _(
+static const u8 sShadowSneakDescription[] = _(
"Extends the user's shadow\n"
"to strike first.");
-static const u8 sMUD_BOMBDescription[] = _(
+static const u8 sMudBombDescription[] = _(
"Throws a blob of mud to\n"
"damage and cut accuracy.");
-static const u8 sPSYCHO_CUTDescription[] = _(
+static const u8 sPsychoCutDescription[] = _(
"Tears with psychic blades.\n"
"High critical-hit ratio.");
-static const u8 sZEN_HEADBUTTDescription[] = _(
+static const u8 sZenHeadbuttDescription[] = _(
"Hits with a strong head-\n"
"butt. May cause flinching.");
-static const u8 sMIRROR_SHOTDescription[] = _(
+static const u8 sMirrorShotDescription[] = _(
"Emits a flash of energy to\n"
"damage and cut accuracy.");
-static const u8 sFLASH_CANNONDescription[] = _(
+static const u8 sFlashCannonDescription[] = _(
"Releases a blast of light\n"
"that may lower Sp. Def.");
-static const u8 sROCK_CLIMBDescription[] = _(
+static const u8 sRockClimbDescription[] = _(
"A charging attack that may\n"
"confuse the foe.");
-static const u8 sDEFOGDescription[] = _(
+static const u8 sDefogDescription[] = _(
"Removes obstacles and\n"
"lowers evasion.");
-static const u8 sTRICK_ROOMDescription[] = _(
+static const u8 sTrickRoomDescription[] = _(
"Slower Pokémon get to move\n"
"first for 5 turns.");
-static const u8 sDRACO_METEORDescription[] = _(
+static const u8 sDracoMeteorDescription[] = _(
"Casts comets onto the foe.\n"
"Harshly lowers the Sp. Atk.");
-static const u8 sDISCHARGEDescription[] = _(
+static const u8 sDischargeDescription[] = _(
"Zaps the foes with electri-\n"
"city. May paralyze them.");
-static const u8 sPOWER_WHIPDescription[] = _(
+static const u8 sPowerWhipDescription[] = _(
"Violently lashes the foe\n"
"with vines or tentacles.");
-static const u8 sCROSS_POISONDescription[] = _(
+static const u8 sCrossPoisonDescription[] = _(
"A slash that may poison a\n"
"foe and do critical damage.");
-static const u8 sGUNK_SHOTDescription[] = _(
+static const u8 sGunkShotDescription[] = _(
"Shoots filthy garbage at\n"
"the foe. May also poison.");
-static const u8 sIRON_HEADDescription[] = _(
+static const u8 sIronHeadDescription[] = _(
"Slams the foe with a hard\n"
"head. May cause flinching.");
-static const u8 sMAGNET_BOMBDescription[] = _(
+static const u8 sMagnetBombDescription[] = _(
"Launches a magnet that\n"
"strikes without fail.");
-static const u8 sSTONE_EDGEDescription[] = _(
+static const u8 sStoneEdgeDescription[] = _(
"Stabs the foe with stones.\n"
"High critical-hit ratio.");
-static const u8 sCAPTIVATEDescription[] = _(
+static const u8 sCaptivateDescription[] = _(
"Makes the opposite gender\n"
"sharply reduce its Sp. Atk.");
-static const u8 sSTEALTH_ROCKDescription[] = _(
+static const u8 sStealthRockDescription[] = _(
"Sets floating stones that\n"
"hurt a foe switching in.");
-static const u8 sGRASS_KNOTDescription[] = _(
+static const u8 sGrassKnotDescription[] = _(
"A snare attack that does\n"
"more damage to heavier foes.");
-static const u8 sCHATTERDescription[] = _(
+static const u8 sChatterDescription[] = _(
"Attacks with a sound wave\n"
"that causes confusion.");
-static const u8 sJUDGMENTDescription[] = _(
+static const u8 sJudgmentDescription[] = _(
"The type varies with the\n"
"kind of Plate held.");
-static const u8 sCHARGE_BEAMDescription[] = _(
+static const u8 sChargeBeamDescription[] = _(
"Fires a beam of electricity.\n"
"May raise Sp. Atk.");
-static const u8 sWOOD_HAMMERDescription[] = _(
- "Slams the body into a foe\n"
+static const u8 sWoodHammerDescription[] = _(
+ "Slams the body into a foe.\n"
"The user gets hurt too.");
-static const u8 sAQUA_JETDescription[] = _(
+static const u8 sAquaJetDescription[] = _(
"Strikes first by dashing\n"
"at the foe at a high speed.");
-static const u8 sATTACK_ORDERDescription[] = _(
+static const u8 sAttackOrderDescription[] = _(
"Underlings pummel the foe.\n"
"High critical-hit ratio.");
-static const u8 sDEFEND_ORDERDescription[] = _(
+static const u8 sDefendOrderDescription[] = _(
"Raises Defense and Sp. Def\n"
"with a living shield.");
-static const u8 sHEAL_ORDERDescription[] = _(
+static const u8 sHealOrderDescription[] = _(
"The user's underlings show\n"
"up to heal half its max HP.");
-static const u8 sHEAD_SMASHDescription[] = _(
+static const u8 sHeadSmashDescription[] = _(
"A life-risking headbutt that\n"
"seriously hurts the user.");
-static const u8 sDOUBLE_HITDescription[] = _(
+static const u8 sDoubleHitDescription[] = _(
"Slams the foe with a tail\n"
"etc. Strikes twice.");
-static const u8 sROAR_OF_TIMEDescription[] = _(
+static const u8 sRoarOfTimeDescription[] = _(
"Powerful, but leaves the\n"
"user immobile the next turn.");
-static const u8 sSPACIAL_RENDDescription[] = _(
+static const u8 sSpacialRendDescription[] = _(
"Tears the foe, and space.\n"
"High critical-hit ratio.");
-static const u8 sMAGMA_STORMDescription[] = _(
+static const u8 sMagmaStormDescription[] = _(
"Traps the foe in a vortex\n"
"of fire for 2 to 5 turns.");
-static const u8 sDARK_VOIDDescription[] = _(
+static const u8 sDarkVoidDescription[] = _(
"Drags the foe into total\n"
"darkness, inducing Sleep.");
-static const u8 sSEED_FLAREDescription[] = _(
+static const u8 sSeedFlareDescription[] = _(
"Generates a shock wave that\n"
"sharply reduces Sp. Def.");
-static const u8 sOMINOUS_WINDDescription[] = _(
+static const u8 sOminousWindDescription[] = _(
"A repulsive attack that may\n"
"raise all stats.");
-static const u8 sSHADOW_FORCEDescription[] = _(
+static const u8 sShadowForceDescription[] = _(
"Vanishes on the first turn\n"
"then strikes the next turn.");
-static const u8 sHONE_CLAWSDescription[] = _(
+static const u8 sHoneClawsDescription[] = _(
"Sharpens its claws to raise\n"
"Attack and Accuracy.");
-static const u8 sWIDE_GUARDDescription[] = _(
+static const u8 sWideGuardDescription[] = _(
"Evades wide-ranging attacks\n"
"for one turn.");
-static const u8 sGUARD_SPLITDescription[] = _(
+static const u8 sGuardSplitDescription[] = _(
"Averages changes to Defense\n"
"and Sp. Def with the foe.");
-static const u8 sPOWER_SPLITDescription[] = _(
+static const u8 sPowerSplitDescription[] = _(
"Averages changes to Attack\n"
"and Sp. Atk with the foe.");
-static const u8 sWONDER_ROOMDescription[] = _(
+static const u8 sWonderRoomDescription[] = _(
"Defense and Sp. Def stats\n"
"are swapped for 5 turns.");
-static const u8 sPSYSHOCKDescription[] = _(
+static const u8 sPsyshockDescription[] = _(
"Attacks with a psychic wave\n"
"that does physical damage.");
-static const u8 sTAIL_SLAPDescription[] = _(
+static const u8 sTailSlapDescription[] = _(
"Strikes the foe with its\n"
"tail 2 to 5 times.");
-static const u8 sVENOSHOCKDescription[] = _(
+static const u8 sVenoshockDescription[] = _(
"Does double damage if the\n"
"foe is poisoned.");
-static const u8 sAUTOTOMIZEDescription[] = _(
+static const u8 sAutotomizeDescription[] = _(
"Sheds additional weight to\n"
"sharply boost Speed.");
-static const u8 sRAGE_POWDERDescription[] = _(
+static const u8 sRagePowderDescription[] = _(
"Scatters powder to make\n"
"foes attack only the user.");
-static const u8 sTELEKINESISDescription[] = _(
+static const u8 sTelekinesisDescription[] = _(
"Makes the foe float. It is\n"
"easier to hit for 3 turns.");
-static const u8 sMAGIC_ROOMDescription[] = _(
+static const u8 sMagicRoomDescription[] = _(
"Hold items lose their\n"
"effects for 5 turns.");
-static const u8 sSMACK_DOWNDescription[] = _(
+static const u8 sSmackDownDescription[] = _(
"Throws a rock to knock the\n"
"foe down to the ground.");
-static const u8 sSTORM_THROWDescription[] = _(
+static const u8 sStormThrowDescription[] = _(
"This attack always results\n"
"in a critical hit.");
-static const u8 sFLAME_BURSTDescription[] = _(
+static const u8 sFlameBurstDescription[] = _(
"A bursting flame that does\n"
"damage to all foes.");
-static const u8 sSLUDGE_WAVEDescription[] = _(
+static const u8 sSludgeWaveDescription[] = _(
"Swamps the foe with a wave\n"
"of sludge. May also poison.");
-static const u8 sQUIVER_DANCEDescription[] = _(
+static const u8 sQuiverDanceDescription[] = _(
"Dances to raise Sp. Atk\n"
"Sp. Def and Speed.");
-static const u8 sHEAVY_SLAMDescription[] = _(
+static const u8 sHeavySlamDescription[] = _(
"Does more damage if the\n"
"user outweighs the foe.");
-static const u8 sSYNCHRONOISEDescription[] = _(
+static const u8 sSynchronoiseDescription[] = _(
"An odd shock wave that only\n"
"damages same-type foes.");
-static const u8 sELECTRO_BALLDescription[] = _(
+static const u8 sElectroBallDescription[] = _(
"Hurls an orb that does more\n"
"damage to slower foes.");
-static const u8 sSOAKDescription[] = _(
+static const u8 sSoakDescription[] = _(
"Sprays water at the foe\n"
"making it Water-type.");
-static const u8 sFLAME_CHARGEDescription[] = _(
+static const u8 sFlameChargeDescription[] = _(
"Attacks in a cloak of\n"
"flames. Raises Speed.");
-static const u8 sCOILDescription[] = _(
+static const u8 sCoilDescription[] = _(
"Coils up to raise Attack\n"
"Defense and Accuracy.");
-static const u8 sLOW_SWEEPDescription[] = _(
+static const u8 sLowSweepDescription[] = _(
"Attacks the foe's legs\n"
"lowering its Speed.");
-static const u8 sACID_SPRAYDescription[] = _(
+static const u8 sAcidSprayDescription[] = _(
"Sprays a hide-melting acid.\n"
"Sharply reduces Sp. Def.");
-static const u8 sFOUL_PLAYDescription[] = _(
+static const u8 sFoulPlayDescription[] = _(
"The higher the foe's Attack\n"
"the more damage caused.");
-static const u8 sSIMPLE_BEAMDescription[] = _(
+static const u8 sSimpleBeamDescription[] = _(
"A beam that changes the\n"
"foe's ability to Simple.");
-static const u8 sENTRAINMENTDescription[] = _(
+static const u8 sEntrainmentDescription[] = _(
"Makes the foe mimic the\n"
"user, gaining its ability.");
-static const u8 sAFTER_YOUDescription[] = _(
+static const u8 sAfterYouDescription[] = _(
"Helps out the foe, letting\n"
"it move next.");
-static const u8 sROUNDDescription[] = _(
+static const u8 sRoundDescription[] = _(
"A song that inflicts damage.\n"
"Others can join in too.");
-static const u8 sECHOED_VOICEDescription[] = _(
+static const u8 sEchoedVoiceDescription[] = _(
"Does more damage every turn\n"
"it is used.");
-static const u8 sCHIP_AWAYDescription[] = _(
+static const u8 sChipAwayDescription[] = _(
"Strikes through the foe's\n"
"stat changes.");
-static const u8 sCLEAR_SMOGDescription[] = _(
+static const u8 sClearSmogDescription[] = _(
"Attacks with white haze that\n"
"eliminates all stat changes.");
-static const u8 sSTORED_POWERDescription[] = _(
+static const u8 sStoredPowerDescription[] = _(
"The higher the user's stats\n"
"the more damage caused.");
-static const u8 sQUICK_GUARDDescription[] = _(
+static const u8 sQuickGuardDescription[] = _(
"Evades priority attacks\n"
"for one turn.");
-static const u8 sALLY_SWITCHDescription[] = _(
+static const u8 sAllySwitchDescription[] = _(
"The user switches places\n"
"with its partner.");
-static const u8 sSCALDDescription[] = _(
+static const u8 sScaldDescription[] = _(
"Shoots boiling water at the\n"
"foe. May inflict a burn.");
-static const u8 sSHELL_SMASHDescription[] = _(
+static const u8 sShellSmashDescription[] = _(
"Raises offensive stats, but\n"
"lowers defensive stats.");
-static const u8 sHEAL_PULSEDescription[] = _(
+static const u8 sHealPulseDescription[] = _(
"Recovers up to half the\n"
"target's maximum HP.");
-static const u8 sHEXDescription[] = _(
+static const u8 sHexDescription[] = _(
"Does double damage if the\n"
"foe has a status problem.");
-static const u8 sSKY_DROPDescription[] = _(
+static const u8 sSkyDropDescription[] = _(
"Takes the foe into the sky\n"
"then drops it the next turn.");
-static const u8 sSHIFT_GEARDescription[] = _(
+static const u8 sShiftGearDescription[] = _(
"Rotates its gears to raise\n"
"Attack and Speed.");
-static const u8 sCIRCLE_THROWDescription[] = _(
+static const u8 sCircleThrowDescription[] = _(
"Knocks the foe away to end\n"
"the battle.");
-static const u8 sINCINERATEDescription[] = _(
+static const u8 sIncinerateDescription[] = _(
"Burns up Berries and Gems\n"
"preventing their use.");
-static const u8 sQUASHDescription[] = _(
+static const u8 sQuashDescription[] = _(
"Suppresses the foe, making\n"
"it move last.");
-static const u8 sACROBATICSDescription[] = _(
+static const u8 sAcrobaticsDescription[] = _(
"Does double damage if the\n"
"user has no item.");
-static const u8 sREFLECT_TYPEDescription[] = _(
+static const u8 sReflectTypeDescription[] = _(
"The user reflects the foe's\n"
"type, copying it.");
-static const u8 sRETALIATEDescription[] = _(
+static const u8 sRetaliateDescription[] = _(
"An attack that does more\n"
"damage if an ally fainted.");
-static const u8 sFINAL_GAMBITDescription[] = _(
+static const u8 sFinalGambitDescription[] = _(
"The user faints to damage\n"
"the foe equal to its HP.");
-static const u8 sBESTOWDescription[] = _(
+static const u8 sBestowDescription[] = _(
"The user gives its held\n"
"item to the foe.");
-static const u8 sINFERNODescription[] = _(
+static const u8 sInfernoDescription[] = _(
"Powerful and sure to inflict\n"
"a burn, but inaccurate.");
-static const u8 sWATER_PLEDGEDescription[] = _(
+static const u8 sWaterPledgeDescription[] = _(
"Attacks with a column of\n"
"water. May make a rainbow.");
-static const u8 sFIRE_PLEDGEDescription[] = _(
+static const u8 sFirePledgeDescription[] = _(
"Attacks with a column of\n"
"fire. May burn the grass.");
-static const u8 sGRASS_PLEDGEDescription[] = _(
+static const u8 sGrassPledgeDescription[] = _(
"Attacks with a column of\n"
"grass. May create a swamp.");
-static const u8 sSTRUGGLE_BUGDescription[] = _(
+static const u8 sStruggleBugDescription[] = _(
"Resisting, the user attacks\n"
"the foe. Lowers Sp. Atk.");
-static const u8 sBULLDOZEDescription[] = _(
+static const u8 sBulldozeDescription[] = _(
"Stomps down on the ground.\n"
"Lowers Speed.");
-static const u8 sWORK_UPDescription[] = _(
+static const u8 sWorkUpDescription[] = _(
"The user is roused.\n"
"Ups Attack and Sp. Atk.");
-static const u8 sELECTROWEBDescription[] = _(
+static const u8 sElectrowebDescription[] = _(
"Snares the foe with an\n"
"electric net. Lowers Speed.");
-static const u8 sWILD_CHARGEDescription[] = _(
+static const u8 sWildChargeDescription[] = _(
"An electrical tackle that\n"
"also hurts the user.");
-static const u8 sDRILL_RUNDescription[] = _(
+static const u8 sDrillRunDescription[] = _(
"Spins its body like a drill.\n"
"High critical-hit ratio.");
-static const u8 sDUAL_CHOPDescription[] = _(
+static const u8 sDualChopDescription[] = _(
"Attacks with brutal hits\n"
"that strike twice.");
-static const u8 sHEART_STAMPDescription[] = _(
+static const u8 sHeartStampDescription[] = _(
"A sudden blow after a cute\n"
"act. May cause flinching.");
-static const u8 sRAZOR_SHELLDescription[] = _(
+static const u8 sRazorShellDescription[] = _(
"Tears at the foe with sharp\n"
"shells. May lower Defense.");
-static const u8 sLEAF_TORNADODescription[] = _(
+static const u8 sLeafTornadoDescription[] = _(
"Circles the foe with leaves\n"
"to damage and cut accuracy.");
-static const u8 sSTEAMROLLERDescription[] = _(
+static const u8 sSteamrollerDescription[] = _(
"Crushes the foe with its\n"
"body. May cause flinching.");
-static const u8 sCOTTON_GUARDDescription[] = _(
+static const u8 sCottonGuardDescription[] = _(
"Wraps its body in cotton.\n"
"Drastically raises Defense.");
-static const u8 sNIGHT_DAZEDescription[] = _(
+static const u8 sNightDazeDescription[] = _(
"Looses a pitch-black shock\n"
"wave. May lower accuracy.");
-static const u8 sHURRICANEDescription[] = _(
+static const u8 sHurricaneDescription[] = _(
"Traps the foe in a fierce\n"
"wind. May cause confusion.");
-static const u8 sHEAD_CHARGEDescription[] = _(
+static const u8 sHeadChargeDescription[] = _(
"A charge using guard hair.\n"
"It hurts the user a little.");
-static const u8 sGEAR_GRINDDescription[] = _(
+static const u8 sGearGrindDescription[] = _(
"Throws two steel gears\n"
"that strike twice.");
-static const u8 sTECHNO_BLASTDescription[] = _(
+static const u8 sTechnoBlastDescription[] = _(
"The type varies with the\n"
"kind of Drive held.");
-static const u8 sRELIC_SONGDescription[] = _(
+static const u8 sRelicSongDescription[] = _(
"Attacks with an ancient\n"
"song. May induce sleep.");
-static const u8 sSECRET_SWORDDescription[] = _(
+static const u8 sSecretSwordDescription[] = _(
"Cuts with a long horn that\n"
"does physical damage.");
-static const u8 sGLACIATEDescription[] = _(
+static const u8 sGlaciateDescription[] = _(
"Blows very cold air at the\n"
"foe. It lowers their Speed.");
-static const u8 sBOLT_STRIKEDescription[] = _(
+static const u8 sBoltStrikeDescription[] = _(
"Strikes with a great amount\n"
"of lightning. May paralyze.");
-static const u8 sBLUE_FLAREDescription[] = _(
+static const u8 sBlueFlareDescription[] = _(
"Engulfs the foe in a blue\n"
"flame. May inflict a burn.");
-static const u8 sFIERY_DANCEDescription[] = _(
+static const u8 sFieryDanceDescription[] = _(
"Dances cloaked in flames.\n"
"May raise Sp. Atk.");
-static const u8 sFREEZE_SHOCKDescription[] = _(
+static const u8 sFreezeShockDescription[] = _(
"A powerful 2-turn move that\n"
"may paralyze the foe.");
-static const u8 sICE_BURNDescription[] = _(
+static const u8 sIceBurnDescription[] = _(
"A powerful 2-turn move that\n"
"may inflict a burn.");
-static const u8 sSNARLDescription[] = _(
+static const u8 sSnarlDescription[] = _(
"Yells and rants at the foe\n"
"lowering its Sp. Atk.");
-static const u8 sICICLE_CRASHDescription[] = _(
+static const u8 sIcicleCrashDescription[] = _(
"Drops large icicles on the\n"
"foe. May cause flinching.");
-static const u8 sV_CREATEDescription[] = _(
+static const u8 sVCreateDescription[] = _(
"Very powerful, but lowers\n"
"Defense, Sp. Def and Speed.");
-static const u8 sFUSION_FLAREDescription[] = _(
+static const u8 sFusionFlareDescription[] = _(
"Summons a fireball. Works\n"
"well with a thunderbolt.");
-static const u8 sFUSION_BOLTDescription[] = _(
+static const u8 sFusionBoltDescription[] = _(
"Summons a thunderbolt.\n"
"Works well with a fireball.");
-static const u8 sFLYING_PRESSDescription[] = _(
+static const u8 sFlyingPressDescription[] = _(
"This attack does Fighting\n"
"and Flying-type damage.");
-static const u8 sMAT_BLOCKDescription[] = _(
+static const u8 sMatBlockDescription[] = _(
"Evades damaging moves\n"
"for one turn.");
-static const u8 sBELCHDescription[] = _(
+static const u8 sBelchDescription[] = _(
"Lets out a loud belch.\n"
"Must eat a Berry to use it.");
-static const u8 sROTOTILLERDescription[] = _(
+static const u8 sRototillerDescription[] = _(
"Ups the Attack and Sp. Atk\n"
"of Grass-type Pokémon.");
-static const u8 sSTICKY_WEBDescription[] = _(
+static const u8 sStickyWebDescription[] = _(
"Weaves a sticky net that\n"
"slows foes switching in.");
-static const u8 sFELL_STINGERDescription[] = _(
+static const u8 sFellStingerDescription[] = _(
"If it knocks out a foe\n"
"the Attack stat is raised.");
-static const u8 sTRICK_OR_TREATDescription[] = _(
+static const u8 sTrickOrTreatDescription[] = _(
"Goes trick-or-treating\n"
"making the foe Ghost-type.");
-static const u8 sNOBLE_ROARDescription[] = _(
+static const u8 sNobleRoarDescription[] = _(
"Intimidates the foe, to cut\n"
"Attack and Sp. Atk.");
-static const u8 sION_DELUGEDescription[] = _(
+static const u8 sIonDelugeDescription[] = _(
"Electrifies Normal-type\n"
"moves with charged atoms.");
-static const u8 sPARABOLIC_CHARGEDescription[] = _(
+static const u8 sParabolicChargeDescription[] = _(
"Damages adjacent Pokémon and\n"
"heals up by half of it.");
-static const u8 sFORESTS_CURSEDescription[] = _(
+static const u8 sForestsCurseDescription[] = _(
"Puts a curse on the foe\n"
"making the foe Grass-type.");
-static const u8 sPETAL_BLIZZARDDescription[] = _(
+static const u8 sPetalBlizzardDescription[] = _(
"Stirs up a violent storm\n"
"of petals to attack.");
-static const u8 sFREEZE_DRYDescription[] = _(
+static const u8 sFreezeDryDescription[] = _(
"Super effective on Water-\n"
"types. May cause freezing.");
-static const u8 sDISARMING_VOICEDescription[] = _(
+static const u8 sDisarmingVoiceDescription[] = _(
"Lets out a charming cry\n"
"that cannot be evaded.");
-static const u8 sPARTING_SHOTDescription[] = _(
+static const u8 sPartingShotDescription[] = _(
"Lowers the foe's Attack and\n"
"Sp. Atk, then switches out.");
-static const u8 sTOPSY_TURVYDescription[] = _(
+static const u8 sTopsyTurvyDescription[] = _(
"Swaps all stat changes that\n"
"affect the target.");
-static const u8 sDRAINING_KISSDescription[] = _(
+static const u8 sDrainingKissDescription[] = _(
"An attack that absorbs over\n"
"half the damage inflicted.");
-static const u8 sCRAFTY_SHIELDDescription[] = _(
+static const u8 sCraftyShieldDescription[] = _(
"Evades status moves for\n"
"one turn.");
-static const u8 sFLOWER_SHIELDDescription[] = _(
+static const u8 sFlowerShieldDescription[] = _(
"Raises the Defense of\n"
"Grass-type Pokémon.");
-static const u8 sGRASSY_TERRAINDescription[] = _(
+static const u8 sGrassyTerrainDescription[] = _(
"The ground turns to grass\n"
"for 5 turns. Restores HP.");
-static const u8 sMISTY_TERRAINDescription[] = _(
+static const u8 sMistyTerrainDescription[] = _(
"Covers the ground with mist\n"
"for 5 turns. Blocks status.");
-static const u8 sELECTRIFYDescription[] = _(
+static const u8 sElectrifyDescription[] = _(
"Electrifies the foe, making\n"
"its next move Electric-type.");
-static const u8 sPLAY_ROUGHDescription[] = _(
+static const u8 sPlayRoughDescription[] = _(
"Plays rough with the foe.\n"
"May lower Attack.");
-static const u8 sFAIRY_WINDDescription[] = _(
+static const u8 sFairyWindDescription[] = _(
"Stirs up a fairy wind to\n"
"strike the foe.");
-static const u8 sMOONBLASTDescription[] = _(
+static const u8 sMoonblastDescription[] = _(
"Attacks with the power of\n"
"the moon. May lower Sp. Atk.");
-static const u8 sBOOMBURSTDescription[] = _(
+static const u8 sBoomburstDescription[] = _(
"Attacks everything with a\n"
"destructive sound wave.");
-static const u8 sFAIRY_LOCKDescription[] = _(
+static const u8 sFairyLockDescription[] = _(
"Locks down the battlefield\n"
"preventing escape next turn.");
-static const u8 sKINGS_SHIELDDescription[] = _(
+static const u8 sKingsShieldDescription[] = _(
"Evades damage, and sharply\n"
"reduces Attack if struck.");
-static const u8 sPLAY_NICEDescription[] = _(
+static const u8 sPlayNiceDescription[] = _(
"Befriend the foe, lowering\n"
"its Attack without fail.");
-static const u8 sCONFIDEDescription[] = _(
+static const u8 sConfideDescription[] = _(
"Shares a secret with the\n"
"foe, lowering Sp. Atk.");
-static const u8 sDIAMOND_STORMDescription[] = _(
+static const u8 sDiamondStormDescription[] = _(
"Whips up a storm of\n"
"diamonds. May up Defense.");
-static const u8 sSTEAM_ERUPTIONDescription[] = _(
+static const u8 sSteamEruptionDescription[] = _(
"Immerses the foe in heated\n"
"steam. May inflict a burn.");
-static const u8 sHYPERSPACE_HOLEDescription[] = _(
+static const u8 sHyperspaceHoleDescription[] = _(
"Uses a warp hole to attack.\n"
"Can't be evaded.");
-static const u8 sWATER_SHURIKENDescription[] = _(
+static const u8 sWaterShurikenDescription[] = _(
"Throws 2 to 5 stars that\n"
"are sure to strike first.");
-static const u8 sMYSTICAL_FIREDescription[] = _(
+static const u8 sMysticalFireDescription[] = _(
"Breathes a special, hot\n"
- "fire. May lower Sp. Atk.");
+ "fire. Lowers Sp. Atk.");
-static const u8 sSPIKY_SHIELDDescription[] = _(
+static const u8 sSpikyShieldDescription[] = _(
"Evades attack, and damages\n"
"the foe if struck.");
-static const u8 sAROMATIC_MISTDescription[] = _(
+static const u8 sAromaticMistDescription[] = _(
"Raises the Sp. Def of a\n"
"partner Pokémon.");
-static const u8 sEERIE_IMPULSEDescription[] = _(
+static const u8 sEerieImpulseDescription[] = _(
"Exposes the foe to a pulse\n"
"that sharply cuts Sp. Atk.");
-static const u8 sVENOM_DRENCHDescription[] = _(
+static const u8 sVenomDrenchDescription[] = _(
"Lowers the Attack, Sp. Atk\n"
"and Speed of a poisoned foe.");
-static const u8 sPOWDERDescription[] = _(
+static const u8 sPowderDescription[] = _(
"Damages the foe if it uses\n"
"a Fire-type move.");
-static const u8 sGEOMANCYDescription[] = _(
+static const u8 sGeomancyDescription[] = _(
"Raises Sp. Atk, Sp. Def and\n"
"Speed on the 2nd turn.");
-static const u8 sMAGNETIC_FLUXDescription[] = _(
+static const u8 sMagneticFluxDescription[] = _(
"Boosts the defenses of\n"
"those with Plus or Minus.");
-static const u8 sHAPPY_HOURDescription[] = _(
+static const u8 sHappyHourDescription[] = _(
"Doubles the amount of\n"
"Prize Money received.");
-static const u8 sELECTRIC_TERRAINDescription[] = _(
+static const u8 sElectricTerrainDescription[] = _(
"Electrifies the ground for\n"
"5 turns. Prevents sleep.");
-static const u8 sDAZZLING_GLEAMDescription[] = _(
+static const u8 sDazzlingGleamDescription[] = _(
"Damages foes by emitting\n"
"a bright flash.");
-static const u8 sCELEBRATEDescription[] = _(
+static const u8 sCelebrateDescription[] = _(
"Congratulates you on your\n"
"special day.");
-static const u8 sHOLD_HANDSDescription[] = _(
+static const u8 sHoldHandsDescription[] = _(
"The user and ally hold hands\n"
"making them happy.");
-static const u8 sBABYDOLL_EYESDescription[] = _(
+static const u8 sBabyDollEyesDescription[] = _(
"Lowers the foe's Attack\n"
"before it can move.");
-static const u8 sNUZZLEDescription[] = _(
+static const u8 sNuzzleDescription[] = _(
"Rubs its cheecks against\n"
"the foe, paralyzing it.");
-static const u8 sINFESTATIONDescription[] = _(
+static const u8 sInfestationDescription[] = _(
"The foe is infested and\n"
"attacked for 2 to 5 turns.");
-static const u8 sPOWER_UP_PUNCHDescription[] = _(
+static const u8 sPowerUpPunchDescription[] = _(
"A hard punch that raises\n"
"the user's Attack.");
-static const u8 sTHOUSAND_ARROWSDescription[] = _(
+static const u8 sThousandArrowsDescription[] = _(
"Can hit Flying foes, then\n"
"knocks them to the ground.");
-static const u8 sTHOUSAND_WAVESDescription[] = _(
+static const u8 sThousandWavesDescription[] = _(
"Those hit by the wave can\n"
"no longer escape.");
-static const u8 sLANDS_WRATHDescription[] = _(
+static const u8 sLandsWrathDescription[] = _(
"Gathers the energy of the\n"
"land to attack every foe.");
-static const u8 sLIGHT_OF_RUINDescription[] = _(
+static const u8 sLightOfRuinDescription[] = _(
"Fires a great beam of light\n"
"that also hurts the user.");
-static const u8 sORIGIN_PULSEDescription[] = _(
+static const u8 sOriginPulseDescription[] = _(
"Beams of glowing blue light\n"
"blast both foes.");
-static const u8 sPRECIPICE_BLADESDescription[] = _(
+static const u8 sPrecipiceBladesDescription[] = _(
"Fearsome blades of stone\n"
"attack both foes.");
-static const u8 sLAVA_PLUMEDescription[] = _(
+static const u8 sLavaPlumeDescription[] = _(
"Scarlet flames torch\n"
"everything around the user.");
-static const u8 sLEAF_STORMDescription[] = _(
+static const u8 sLeafStormDescription[] = _(
"Whips up a storm of leaves.\n"
"Harshly lowers the Sp. Atk.");
-static const u8 sSHORE_UPDescription[] = _(
+static const u8 sShoreUpDescription[] = _(
"Restores the user's HP.\n"
"More HP in a sandstorm.");
-static const u8 sFIRST_IMPRESSIONDescription[] = _(
+static const u8 sFirstImpressionDescription[] = _(
"Hits hard and first.\n"
"Only works first turn.");
-static const u8 sBANEFUL_BUNKERDescription[] = _(
+static const u8 sBanefulBunkerDescription[] = _(
"Protects user and poisons\n"
"foes on contact.");
-static const u8 sSPIRIT_SHACKLEDescription[] = _(
+static const u8 sSpiritShackleDescription[] = _(
"After being hit, foes can\n"
"no longer escape.");
-static const u8 sDARKEST_LARIATDescription[] = _(
+static const u8 sDarkestLariatDescription[] = _(
"Swings the arms to strike\n"
"It ignores stat changes.");
-static const u8 sSPARKLING_ARIADescription[] = _(
+static const u8 sSparklingAriaDescription[] = _(
"Sings with bubbles. Cures\n"
"burns on contact.");
-static const u8 sICE_HAMMERDescription[] = _(
+static const u8 sIceHammerDescription[] = _(
"Swings the fist to strike.\n"
"Lowers the user's Speed.");
-static const u8 sFLORAL_HEALINGDescription[] = _(
+static const u8 sFloralHealingDescription[] = _(
"Restores an ally's HP.\n"
"Heals more on grass.");
-static const u8 sHIGH_HORSEPOWERDescription[] = _(
+static const u8 sHighHorsepowerDescription[] = _(
"Slams hard into the foe with\n"
"its entire body.");
-static const u8 sSTRENGTH_SAPDescription[] = _(
+static const u8 sStrengthSapDescription[] = _(
"Saps the foe's Attack to\n"
"heal HP, then drops Attack.");
-static const u8 sSOLAR_BLADEDescription[] = _(
+static const u8 sSolarBladeDescription[] = _(
"Charges first turn, then\n"
"chops with a blade of light.");
-static const u8 sLEAFAGEDescription[] = _(
+static const u8 sLeafageDescription[] = _(
"Attacks with a flurry of\n"
"small leaves.");
-static const u8 sSPOTLIGHTDescription[] = _(
+static const u8 sSpotlightDescription[] = _(
"Makes the foe attack the\n"
"spotlighted Pokémon.");
-static const u8 sTOXIC_THREADDescription[] = _(
+static const u8 sToxicThreadDescription[] = _(
"Attacks with a thread that\n"
"poisons and drops Speed.");
-static const u8 sLASER_FOCUSDescription[] = _(
+static const u8 sLaserFocusDescription[] = _(
"Guarantees the next move\n"
"will be a critical hit.");
-static const u8 sGEAR_UPDescription[] = _(
+static const u8 sGearUpDescription[] = _(
"Boosts the attacks of\n"
"those with Plus or Minus.");
-static const u8 sTHROAT_CHOPDescription[] = _(
+static const u8 sThroatChopDescription[] = _(
"Chops the throat to disable\n"
"sound moves for a while.");
-static const u8 sPOLLEN_PUFFDescription[] = _(
+static const u8 sPollenPuffDescription[] = _(
"Explodes on foes, but\n"
"restores ally's HP.");
-static const u8 sANCHOR_SHOTDescription[] = _(
+static const u8 sAnchorShotDescription[] = _(
"Strangles the foe with a\n"
- "chain. The foe can't flinch.");
+ "chain. The foe can't escape.");
-static const u8 sPSYCHIC_TERRAINDescription[] = _(
+static const u8 sPsychicTerrainDescription[] = _(
"The ground turns weird for\n"
"5 turns. Blocks priority.");
-static const u8 sLUNGEDescription[] = _(
+static const u8 sLungeDescription[] = _(
"Lunges at the foe to lower\n"
"its Attack stat.");
-static const u8 sFIRE_LASHDescription[] = _(
+static const u8 sFireLashDescription[] = _(
"Whips the foe with fire\n"
"lowering its Defense.");
-static const u8 sPOWER_TRIPDescription[] = _(
+static const u8 sPowerTripDescription[] = _(
"It hits harder the more\n"
"stat boosts the user has.");
-static const u8 sBURN_UPDescription[] = _(
+static const u8 sBurnUpDescription[] = _(
"Burns out the user fully\n"
"removing the Fire type.");
-static const u8 sSPEED_SWAPDescription[] = _(
+static const u8 sSpeedSwapDescription[] = _(
"Swaps user's Speed with\n"
"the target's.");
-static const u8 sSMART_STRIKEDescription[] = _(
+static const u8 sSmartStrikeDescription[] = _(
"Hits with an accurate\n"
"horn that never misses.");
-static const u8 sPURIFYDescription[] = _(
+static const u8 sPurifyDescription[] = _(
"Cures the foe's status\n"
"to restore HP.");
-static const u8 sREVELATION_DANCEDescription[] = _(
+static const u8 sRevelationDanceDescription[] = _(
"Dances with mystical power.\n"
"Matches user's first type.");
-static const u8 sCORE_ENFORCERDescription[] = _(
+static const u8 sCoreEnforcerDescription[] = _(
"Hits with a ray that\n"
"nullifies the foe's ability.");
-static const u8 sTROP_KICKDescription[] = _(
+static const u8 sTropKickDescription[] = _(
"An intense kick from the\n"
"tropics. Lowers Attack.");
-static const u8 sINSTRUCTDescription[] = _(
+static const u8 sInstructDescription[] = _(
"Orders the target to use\n"
"its last move again.");
-static const u8 sBEAK_BLASTDescription[] = _(
+static const u8 sBeakBlastDescription[] = _(
"Heats up beak to attack.\n"
"Burns foe on contact.");
-static const u8 sCLANGING_SCALESDescription[] = _(
+static const u8 sClangingScalesDescription[] = _(
"Makes a big noise with\n"
"its scales. Drops Defense.");
-static const u8 sDRAGON_HAMMERDescription[] = _(
+static const u8 sDragonHammerDescription[] = _(
"Swings its whole body\n"
"like a hammer to damage.");
-static const u8 sBRUTAL_SWINGDescription[] = _(
+static const u8 sBrutalSwingDescription[] = _(
"Violently swings around\n"
"to hurt everyone nearby.");
-static const u8 sAURORA_VEILDescription[] = _(
+static const u8 sAuroraVeilDescription[] = _(
"Weakens all attacks, but\n"
"only usable with hail.");
-static const u8 sSHELL_TRAPDescription[] = _(
+static const u8 sShellTrapDescription[] = _(
"Sets a shell trap that\n"
"damages on contact.");
-static const u8 sFLEUR_CANNONDescription[] = _(
+static const u8 sFleurCannonDescription[] = _(
"A strong ray that harshly\n"
"lowers Sp. Attack.");
-static const u8 sPSYCHIC_FANGSDescription[] = _(
+static const u8 sPsychicFangsDescription[] = _(
"Chomps with psychic fangs.\n"
"Destroys any barriers.");
-static const u8 sSTOMPING_TANTRUMDescription[] = _(
+static const u8 sStompingTantrumDescription[] = _(
"Stomps around angrily.\n"
"Stronger after a failure.");
-static const u8 sSHADOW_BONEDescription[] = _(
+static const u8 sShadowBoneDescription[] = _(
"Strikes with a haunted\n"
"bone. Might drop Defense.");
-static const u8 sACCELEROCKDescription[] = _(
+static const u8 sAccelerockDescription[] = _(
"Hits with a high-speed\n"
"rock that always goes first.");
-static const u8 sLIQUIDATIONDescription[] = _(
+static const u8 sLiquidationDescription[] = _(
"Slams the foe with water.\n"
"Can lower Defense.");
-static const u8 sPRISMATIC_LASERDescription[] = _(
+static const u8 sPrismaticLaserDescription[] = _(
"A high power laser that\n"
"forces recharge next turn.");
-static const u8 sSPECTRAL_THIEFDescription[] = _(
+static const u8 sSpectralThiefDescription[] = _(
"Steals the target's stat\n"
"boosts, then attacks.");
-static const u8 sSUNSTEEL_STRIKEDescription[] = _(
+static const u8 sSunsteelStrikeDescription[] = _(
"A sun-fueled strike that\n"
"ignores abilities.");
-static const u8 sMOONGEIST_BEAMDescription[] = _(
+static const u8 sMoongeistBeamDescription[] = _(
"A moon-powered beam that\n"
"ignores abilities.");
-static const u8 sTEARFUL_LOOKDescription[] = _(
+static const u8 sTearfulLookDescription[] = _(
"The user tears up, dropping\n"
"Attack and Sp. Attack.");
-static const u8 sZING_ZAPDescription[] = _(
+static const u8 sZingZapDescription[] = _(
"An electrified impact that\n"
"can cause flinching.");
-static const u8 sNATURES_MADNESSDescription[] = _(
+static const u8 sNaturesMadnessDescription[] = _(
"Halves the foe's HP with\n"
"the power of nature.");
-static const u8 sMULTI_ATTACKDescription[] = _(
+static const u8 sMultiAttackDescription[] = _(
"An attack that changes\n"
"with Memories.");
-static const u8 sMIND_BLOWNDescription[] = _(
+static const u8 sMindBlownDescription[] = _(
"It explodes the user's head\n"
"to damage everything around.");
-static const u8 sPLASMA_FISTSDescription[] = _(
+static const u8 sPlasmaFistsDescription[] = _(
"Hits with electrical fists.\n"
"Normal moves become Electric.");
-static const u8 sPHOTON_GEYSERDescription[] = _(
+static const u8 sPhotonGeyserDescription[] = _(
"User's highest attack stat\n"
"determines its category.");
-static const u8 sZIPPY_ZAPDescription[] = _(
+static const u8 sZippyZapDescription[] = _(
"Electric bursts always go\n"
"first and land a critical hit.");
-static const u8 sSPLISHY_SPLASHDescription[] = _(
+static const u8 sSplishySplashDescription[] = _(
"A huge electrified wave that\n"
"may paralyze the foe.");
-static const u8 sFLOATY_FALLDescription[] = _(
+static const u8 sFloatyFallDescription[] = _(
"Floats in air and dives at\n"
"angle. May cause flinching.");
-static const u8 sPIKA_PAPOWDescription[] = _(
+static const u8 sPikaPapowDescription[] = _(
"Pikachu's love increases its\n"
"power. It never misses.");
-static const u8 sBOUNCY_BUBBLEDescription[] = _(
+static const u8 sBouncyBubbleDescription[] = _(
"An attack that absorbs\n"
#if B_UPDATED_MOVE_DATA >= GEN_8
"all the damage inflicted.");
@@ -2645,300 +2645,300 @@ static const u8 sBOUNCY_BUBBLEDescription[] = _(
"half the damage inflicted.");
#endif
-static const u8 sBUZZY_BUZZDescription[] = _(
+static const u8 sBuzzyBuzzDescription[] = _(
"Shoots a jolt of electricity\n"
"that always paralyzes.");
-static const u8 sSIZZLY_SLIDEDescription[] = _(
+static const u8 sSizzlySlideDescription[] = _(
"User cloaked in fire charges.\n"
"Leaves the foe with a burn.");
-static const u8 sGLITZY_GLOWDescription[] = _(
+static const u8 sGlitzyGlowDescription[] = _(
"Telekinetic force that sets\n"
"wall, lowering Sp. Atk damage.");
-static const u8 sBADDY_BADDescription[] = _(
+static const u8 sBaddyBadDescription[] = _(
"Acting badly, attacks. Sets\n"
"wall, lowering Attack damage.");
-static const u8 sSAPPY_SEEDDescription[] = _(
+static const u8 sSappySeedDescription[] = _(
"Giant stalk scatters seeds\n"
"that drain HP every turn.");
-static const u8 sFREEZY_FROSTDescription[] = _(
+static const u8 sFreezyFrostDescription[] = _(
"Crystal from cold haze hits.\n"
"Eliminates all stat changes.");
-static const u8 sSPARKLY_SWIRLDescription[] = _(
+static const u8 sSparklySwirlDescription[] = _(
"Wrap foe with whirlwind of\n"
"scent. Heals party's status.");
-static const u8 sVEEVEE_VOLLEYDescription[] = _(
+static const u8 sVeeveeVolleyDescription[] = _(
"Eevee's love increases its\n"
"power. It never misses.");
-static const u8 sDOUBLE_IRON_BASHDescription[] = _(
+static const u8 sDoubleIronBashDescription[] = _(
"The user spins and hits with\n"
"its arms. May cause flinch.");
// GEN 8
-static const u8 sDYNAMAX_CANNONDescription[] = _(
+static const u8 sDynamaxCannonDescription[] = _(
"Fires a strong beam. Deals\n"
"2x damage to Dynamaxed foes.");
-static const u8 sSNIPE_SHOTDescription[] = _(
+static const u8 sSnipeShotDescription[] = _(
"The user ignores effects\n"
"that draw in moves.");
-static const u8 sJAW_LOCKDescription[] = _(
+static const u8 sJawLockDescription[] = _(
"Prevents the user and\n"
"the target from escaping.");
-static const u8 sSTUFF_CHEEKSDescription[] = _(
+static const u8 sStuffCheeksDescription[] = _(
"Consumes the user's Berry,\n"
"then sharply raises Def.");
-static const u8 sNO_RETREATDescription[] = _(
+static const u8 sNoRetreatDescription[] = _(
"Raises all of the user's\n"
"stats but prevents escape.");
-static const u8 sTAR_SHOTDescription[] = _(
+static const u8 sTarShotDescription[] = _(
"Lowers the foe's Speed and\n"
"makes it weak to Fire.");
-static const u8 sMAGIC_POWDERDescription[] = _(
+static const u8 sMagicPowderDescription[] = _(
"Magic powder changes the\n"
"target into a Psychic-type.");
-static const u8 sDRAGON_DARTSDescription[] = _(
+static const u8 sDragonDartsDescription[] = _(
"The user attacks twice. Two\n"
"targets are hit once each.");
-static const u8 sTEATIMEDescription[] = _(
+static const u8 sTeatimeDescription[] = _(
"All Pokémon have teatime\n"
"and eat their Berries.");
-static const u8 sOCTOLOCKDescription[] = _(
+static const u8 sOctolockDescription[] = _(
"Traps the foe to lower Def\n"
"and Sp. Def fall each turn.");
-static const u8 sBOLT_BEAKDescription[] = _(
+static const u8 sBoltBeakDescription[] = _(
"Double power if the user\n"
"moves before the target.");
-static const u8 sFISHIOUS_RENDDescription[] = _(
+static const u8 sFishiousRendDescription[] = _(
"Double power if the user\n"
"moves before the target.");
-static const u8 sCOURT_CHANGEDescription[] = _(
+static const u8 sCourtChangeDescription[] = _(
"The user swaps effects on\n"
"either side of the field.");
-static const u8 sCLANGOROUS_SOULDescription[] = _(
+static const u8 sClangorousSoulDescription[] = _(
"The user uses some of its\n"
"HP to raise all its stats.");
-static const u8 sBODY_PRESSDescription[] = _(
+static const u8 sBodyPressDescription[] = _(
"Does more damage the\n"
"higher the user's Def.");
-static const u8 sDECORATEDescription[] = _(
+static const u8 sDecorateDescription[] = _(
"The user sharply raises\n"
"the target's Atk and Sp.Atk");
-static const u8 sDRUM_BEATINGDescription[] = _(
+static const u8 sDrumBeatingDescription[] = _(
"Plays a drum to attack.\n"
"The foe's Speed is lowered.");
-static const u8 sSNAP_TRAPDescription[] = _(
+static const u8 sSnapTrapDescription[] = _(
"Snares the target in a snap\n"
"trap for four to five turns.");
-static const u8 sPYRO_BALLDescription[] = _(
+static const u8 sPyroBallDescription[] = _(
"Launches a fiery ball at the\n"
"target. It may cause a burn.");
-static const u8 sBEHEMOTH_BLADEDescription[] = _(
+static const u8 sBehemothBladeDescription[] = _(
"Strikes as a sword. It deals\n"
"2x damage to Dynamaxed foes.");
-static const u8 sBEHEMOTH_BASHDescription[] = _(
- "Attacks as a sheild. Deals\n"
+static const u8 sBehemothBashDescription[] = _(
+ "Attacks as a shield. Deals\n"
"2x damage to Dynamaxed foes.");
-static const u8 sAURA_WHEELDescription[] = _(
+static const u8 sAuraWheelDescription[] = _(
"Raises Speed to attack. The\n"
"Type is based on its form.");
-static const u8 sBREAKING_SWIPEDescription[] = _(
+static const u8 sBreakingSwipeDescription[] = _(
"Swings its tail to attack.\n"
"Lowers the Atk of those hit.");
-static const u8 sBRANCH_POKEDescription[] = _(
+static const u8 sBranchPokeDescription[] = _(
"The user pokes the target\n"
"with a pointed branch.");
-static const u8 sOVERDRIVEDescription[] = _(
+static const u8 sOverdriveDescription[] = _(
"The user twangs its guitar,\n"
"causing strong vibrations.");
-static const u8 sAPPLE_ACIDDescription[] = _(
+static const u8 sAppleAcidDescription[] = _(
"Attacks with tart apple acid\n"
"to lower the foe's Sp. Def.");
-static const u8 sGRAV_APPLEDescription[] = _(
+static const u8 sGravAppleDescription[] = _(
"Drops an apple from above.\n"
"Lowers the foe's Defense.");
-static const u8 sSPIRIT_BREAKDescription[] = _(
+static const u8 sSpiritBreakDescription[] = _(
"Attacks with spirit-breaking\n"
"force. Lowers Sp. Atk.");
-static const u8 sSTRANGE_STEAMDescription[] = _(
+static const u8 sStrangeSteamDescription[] = _(
"Emits a strange steam to\n"
"potentially confuse the foe.");
-static const u8 sLIFE_DEWDescription[] = _(
+static const u8 sLifeDewDescription[] = _(
"Scatters water to restore\n"
"the HP of itself and allies.");
-static const u8 sOBSTRUCTDescription[] = _(
+static const u8 sObstructDescription[] = _(
"Protects itself, harshly\n"
"lowering Def on contact.");
-static const u8 sFALSE_SURRENDERDescription[] = _(
+static const u8 sFalseSurrenderDescription[] = _(
"Bows to stab the foe\n"
"with hair. It never misses.");
-static const u8 sMETEOR_ASSAULTDescription[] = _(
+static const u8 sMeteorAssaultDescription[] = _(
"Attacks with a thick leek.\n"
"The user must then rest.");
-static const u8 sETERNABEAMDescription[] = _(
+static const u8 sEternabeamDescription[] = _(
"Eternatus' strongest move.\n"
"The user rests next turn.");
-static const u8 sSTEEL_BEAMDescription[] = _(
+static const u8 sSteelBeamDescription[] = _(
"Fires a beam of steel from\n"
"its body. It hurts the user.");
-static const u8 sEXPANDING_FORCEDescription[] = _(
+static const u8 sExpandingForceDescription[] = _(
"Power goes up and damages\n"
"all foes on Psychic Terrain.");
-static const u8 sSTEEL_ROLLERDescription[] = _(
+static const u8 sSteelRollerDescription[] = _(
"Destroys terrain. Fails if\n"
"ground isn't terrain.");
-static const u8 sSCALE_SHOTDescription[] = _(
+static const u8 sScaleShotDescription[] = _(
"Shoots scales 2 to 5 times.\n"
"Ups Speed, lowers defense.");
-static const u8 sMETEOR_BEAMDescription[] = _(
+static const u8 sMeteorBeamDescription[] = _(
"A 2-turn move that raises\n"
"Sp. Attack before attacking.");
-static const u8 sSHELL_SIDE_ARMDescription[] = _(
+static const u8 sShellSideArmDescription[] = _(
"Deals better of physical and\n"
"special damage. May poison.");
-static const u8 sMISTY_EXPLOSIONDescription[] = _(
+static const u8 sMistyExplosionDescription[] = _(
"Hit everything and faint.\n"
"Powers up on Misty Terrain.");
-static const u8 sGRASSY_GLIDEDescription[] = _(
+static const u8 sGrassyGlideDescription[] = _(
"Gliding on ground, hits. Goes\n"
"first on Grassy Terrain.");
-static const u8 sRISING_VOLTAGEDescription[] = _(
+static const u8 sRisingVoltageDescription[] = _(
"This move's power doubles\n"
"when on Electric Terrain.");
-static const u8 sTERRAIN_PULSEDescription[] = _(
+static const u8 sTerrainPulseDescription[] = _(
"Type and power changes\n"
"depending on the terrain.");
-static const u8 sSKITTER_SMACKDescription[] = _(
+static const u8 sSkitterSmackDescription[] = _(
"User skitters behind foe to\n"
"attack. Lowers foe's Sp. Atk.");
-static const u8 sBURNING_JEALOUSYDescription[] = _(
+static const u8 sBurningJealousyDescription[] = _(
"Foes that have stats upped\n"
"during the turn get burned.");
-static const u8 sLASH_OUTDescription[] = _(
+static const u8 sLashOutDescription[] = _(
"If stats lowered during this\n"
"turn, power is doubled.");
-static const u8 sPOLTERGEISTDescription[] = _(
+static const u8 sPoltergeistDescription[] = _(
"Control foe's item to attack.\n"
"Fails if foe has no item.");
-static const u8 sCORROSIVE_GASDescription[] = _(
+static const u8 sCorrosiveGasDescription[] = _(
"Highly acidic gas melts items\n"
"held by surrounding Pokémon.");
-static const u8 sCOACHINGDescription[] = _(
+static const u8 sCoachingDescription[] = _(
"Properly coaches allies to\n"
"up their Attack and Defense.");
-static const u8 sFLIP_TURNDescription[] = _(
+static const u8 sFlipTurnDescription[] = _(
"Attacks and rushes back to\n"
"switch with a party Pokémon.");
-static const u8 sTRIPLE_AXELDescription[] = _(
+static const u8 sTripleAxelDescription[] = _(
"A 3-kick attack that gets\n"
"more powerful with each hit.");
-static const u8 sDUAL_WINGBEATDescription[] = _(
+static const u8 sDualWingbeatDescription[] = _(
"User slams the target with\n"
"wings and hits twice in a row.");
-static const u8 sSCORCHING_SANDSDescription[] = _(
+static const u8 sScorchingSandsDescription[] = _(
"Throws scorching sand at\n"
"the target. May leave a burn.");
-static const u8 sJUNGLE_HEALINGDescription[] = _(
+static const u8 sJungleHealingDescription[] = _(
"Heals HP and status of\n"
"itself and allies in battle.");
-static const u8 sWICKED_BLOWDescription[] = _(
+static const u8 sWickedBlowDescription[] = _(
"Mastering the Dark style,\n"
"strikes with a critical hit.");
-static const u8 sSURGING_STRIKESDescription[] = _(
+static const u8 sSurgingStrikesDescription[] = _(
"Mastering the Water style,\n"
"strikes with 3 critical hits.");
-static const u8 sTHUNDER_CAGEDescription[] = _(
+static const u8 sThunderCageDescription[] = _(
"Traps the foe in a cage of\n"
"electricity for 2 to 5 turns.");
-static const u8 sDRAGON_ENERGYDescription[] = _(
+static const u8 sDragonEnergyDescription[] = _(
"The higher the user's HP\n"
"the more damage caused.");
-static const u8 sFREEZING_GLAREDescription[] = _(
+static const u8 sFreezingGlareDescription[] = _(
"Shoots psychic power from\n"
"the eyes. May freeze the foe.");
-static const u8 sFIERY_WRATHDescription[] = _(
+static const u8 sFieryWrathDescription[] = _(
"An attack fueled by your\n"
"wrath. May cause flinching.");
-static const u8 sTHUNDEROUS_KICKDescription[] = _(
+static const u8 sThunderousKickDescription[] = _(
"Uses a lightning-like kick\n"
"to hit. Lowers foe's Defense.");
-static const u8 sGLACIAL_LANCEDescription[] = _(
+static const u8 sGlacialLanceDescription[] = _(
"Strikes by hurling a blizzard-\n"
"cloaked icicle lance at a foe.");
-static const u8 sASTRAL_BARRAGEDescription[] = _(
+static const u8 sAstralBarrageDescription[] = _(
"Strikes by sending a frightful\n"
"amount of ghosts at a foe.");
-static const u8 sEERIE_SPELLDescription[] = _(
+static const u8 sEerieSpellDescription[] = _(
"Attacks with psychic power.\n"
"Foe's last move has 3 PP cut.");
@@ -3302,406 +3302,406 @@ const u8 *const gMoveDescriptionPointers[MOVES_COUNT - 1] =
[MOVE_WATER_PULSE - 1] = sWaterPulseDescription,
[MOVE_DOOM_DESIRE - 1] = sDoomDesireDescription,
[MOVE_PSYCHO_BOOST - 1] = sPsychoBoostDescription,
- [MOVE_ROOST - 1] = sROOSTDescription,
- [MOVE_GRAVITY - 1] = sGRAVITYDescription,
- [MOVE_MIRACLE_EYE - 1] = sMIRACLE_EYEDescription,
- [MOVE_WAKE_UP_SLAP - 1] = sWAKE_UP_SLAPDescription,
- [MOVE_HAMMER_ARM - 1] = sHAMMER_ARMDescription,
- [MOVE_GYRO_BALL - 1] = sGYRO_BALLDescription,
- [MOVE_HEALING_WISH - 1] = sHEALING_WISHDescription,
- [MOVE_BRINE - 1] = sBRINEDescription,
- [MOVE_NATURAL_GIFT - 1] = sNATURAL_GIFTDescription,
- [MOVE_FEINT - 1] = sFEINTDescription,
- [MOVE_PLUCK - 1] = sPLUCKDescription,
- [MOVE_TAILWIND - 1] = sTAILWINDDescription,
- [MOVE_ACUPRESSURE - 1] = sACUPRESSUREDescription,
- [MOVE_METAL_BURST - 1] = sMETAL_BURSTDescription,
- [MOVE_U_TURN - 1] = sU_TURNDescription,
- [MOVE_CLOSE_COMBAT - 1] = sCLOSE_COMBATDescription,
- [MOVE_PAYBACK - 1] = sPAYBACKDescription,
- [MOVE_ASSURANCE - 1] = sASSURANCEDescription,
- [MOVE_EMBARGO - 1] = sEMBARGODescription,
- [MOVE_FLING - 1] = sFLINGDescription,
- [MOVE_PSYCHO_SHIFT - 1] = sPSYCHO_SHIFTDescription,
- [MOVE_TRUMP_CARD - 1] = sTRUMP_CARDDescription,
- [MOVE_HEAL_BLOCK - 1] = sHEAL_BLOCKDescription,
- [MOVE_WRING_OUT - 1] = sWRING_OUTDescription,
- [MOVE_POWER_TRICK - 1] = sPOWER_TRICKDescription,
- [MOVE_GASTRO_ACID - 1] = sGASTRO_ACIDDescription,
- [MOVE_LUCKY_CHANT - 1] = sLUCKY_CHANTDescription,
- [MOVE_ME_FIRST - 1] = sME_FIRSTDescription,
- [MOVE_COPYCAT - 1] = sCOPYCATDescription,
- [MOVE_POWER_SWAP - 1] = sPOWER_SWAPDescription,
- [MOVE_GUARD_SWAP - 1] = sGUARD_SWAPDescription,
- [MOVE_PUNISHMENT - 1] = sPUNISHMENTDescription,
- [MOVE_LAST_RESORT - 1] = sLAST_RESORTDescription,
- [MOVE_WORRY_SEED - 1] = sWORRY_SEEDDescription,
- [MOVE_SUCKER_PUNCH - 1] = sSUCKER_PUNCHDescription,
- [MOVE_TOXIC_SPIKES - 1] = sTOXIC_SPIKESDescription,
- [MOVE_HEART_SWAP - 1] = sHEART_SWAPDescription,
- [MOVE_AQUA_RING - 1] = sAQUA_RINGDescription,
- [MOVE_MAGNET_RISE - 1] = sMAGNET_RISEDescription,
- [MOVE_FLARE_BLITZ - 1] = sFLARE_BLITZDescription,
- [MOVE_FORCE_PALM - 1] = sFORCE_PALMDescription,
- [MOVE_AURA_SPHERE - 1] = sAURA_SPHEREDescription,
- [MOVE_ROCK_POLISH - 1] = sROCK_POLISHDescription,
- [MOVE_POISON_JAB - 1] = sPOISON_JABDescription,
- [MOVE_DARK_PULSE - 1] = sDARK_PULSEDescription,
- [MOVE_NIGHT_SLASH - 1] = sNIGHT_SLASHDescription,
- [MOVE_AQUA_TAIL - 1] = sAQUA_TAILDescription,
- [MOVE_SEED_BOMB - 1] = sSEED_BOMBDescription,
- [MOVE_AIR_SLASH - 1] = sAIR_SLASHDescription,
- [MOVE_X_SCISSOR - 1] = sX_SCISSORDescription,
- [MOVE_BUG_BUZZ - 1] = sBUG_BUZZDescription,
- [MOVE_DRAGON_PULSE - 1] = sDRAGON_PULSEDescription,
- [MOVE_DRAGON_RUSH - 1] = sDRAGON_RUSHDescription,
- [MOVE_POWER_GEM - 1] = sPOWER_GEMDescription,
- [MOVE_DRAIN_PUNCH - 1] = sDRAINING_KISSDescription,
- [MOVE_VACUUM_WAVE - 1] = sVACUUM_WAVEDescription,
- [MOVE_FOCUS_BLAST - 1] = sFOCUS_BLASTDescription,
- [MOVE_ENERGY_BALL - 1] = sENERGY_BALLDescription,
- [MOVE_BRAVE_BIRD - 1] = sBRAVE_BIRDDescription,
- [MOVE_EARTH_POWER - 1] = sEARTH_POWERDescription,
- [MOVE_SWITCHEROO - 1] = sSWITCHEROODescription,
+ [MOVE_ROOST - 1] = sRoostDescription,
+ [MOVE_GRAVITY - 1] = sGravityDescription,
+ [MOVE_MIRACLE_EYE - 1] = sMiracleEyeDescription,
+ [MOVE_WAKE_UP_SLAP - 1] = sWakeUpSlapDescription,
+ [MOVE_HAMMER_ARM - 1] = sHammerArmDescription,
+ [MOVE_GYRO_BALL - 1] = sGyroBallDescription,
+ [MOVE_HEALING_WISH - 1] = sHealingWishDescription,
+ [MOVE_BRINE - 1] = sBrineDescription,
+ [MOVE_NATURAL_GIFT - 1] = sNaturalGiftDescription,
+ [MOVE_FEINT - 1] = sFeintDescription,
+ [MOVE_PLUCK - 1] = sPluckDescription,
+ [MOVE_TAILWIND - 1] = sTailwindDescription,
+ [MOVE_ACUPRESSURE - 1] = sAcupressureDescription,
+ [MOVE_METAL_BURST - 1] = sMetalBurstDescription,
+ [MOVE_U_TURN - 1] = sUTurnDescription,
+ [MOVE_CLOSE_COMBAT - 1] = sCloseCombatDescription,
+ [MOVE_PAYBACK - 1] = sPaybackDescription,
+ [MOVE_ASSURANCE - 1] = sAssuranceDescription,
+ [MOVE_EMBARGO - 1] = sEmbargoDescription,
+ [MOVE_FLING - 1] = sFlingDescription,
+ [MOVE_PSYCHO_SHIFT - 1] = sPsychoShiftDescription,
+ [MOVE_TRUMP_CARD - 1] = sTrumpCardDescription,
+ [MOVE_HEAL_BLOCK - 1] = sHealBlockDescription,
+ [MOVE_WRING_OUT - 1] = sWringOutDescription,
+ [MOVE_POWER_TRICK - 1] = sPowerTrickDescription,
+ [MOVE_GASTRO_ACID - 1] = sGastroAcidDescription,
+ [MOVE_LUCKY_CHANT - 1] = sLuckyChantDescription,
+ [MOVE_ME_FIRST - 1] = sMeFirstDescription,
+ [MOVE_COPYCAT - 1] = sCopycatDescription,
+ [MOVE_POWER_SWAP - 1] = sPowerSwapDescription,
+ [MOVE_GUARD_SWAP - 1] = sGuardSwapDescription,
+ [MOVE_PUNISHMENT - 1] = sPunishmentDescription,
+ [MOVE_LAST_RESORT - 1] = sLastResortDescription,
+ [MOVE_WORRY_SEED - 1] = sWorrySeedDescription,
+ [MOVE_SUCKER_PUNCH - 1] = sSuckerPunchDescription,
+ [MOVE_TOXIC_SPIKES - 1] = sToxicSpikesDescription,
+ [MOVE_HEART_SWAP - 1] = sHeartSwapDescription,
+ [MOVE_AQUA_RING - 1] = sAquaRingDescription,
+ [MOVE_MAGNET_RISE - 1] = sMagnetRiseDescription,
+ [MOVE_FLARE_BLITZ - 1] = sFlareBlitzDescription,
+ [MOVE_FORCE_PALM - 1] = sForcePalmDescription,
+ [MOVE_AURA_SPHERE - 1] = sAuraSphereDescription,
+ [MOVE_ROCK_POLISH - 1] = sRockPolishDescription,
+ [MOVE_POISON_JAB - 1] = sPoisonJabDescription,
+ [MOVE_DARK_PULSE - 1] = sDarkPulseDescription,
+ [MOVE_NIGHT_SLASH - 1] = sNightSlashDescription,
+ [MOVE_AQUA_TAIL - 1] = sAquaTailDescription,
+ [MOVE_SEED_BOMB - 1] = sSeedBombDescription,
+ [MOVE_AIR_SLASH - 1] = sAirSlashDescription,
+ [MOVE_X_SCISSOR - 1] = sXScissorDescription,
+ [MOVE_BUG_BUZZ - 1] = sBugBuzzDescription,
+ [MOVE_DRAGON_PULSE - 1] = sDragonPulseDescription,
+ [MOVE_DRAGON_RUSH - 1] = sDragonRushDescription,
+ [MOVE_POWER_GEM - 1] = sPowerGemDescription,
+ [MOVE_DRAIN_PUNCH - 1] = sMegaDrainDescription,
+ [MOVE_VACUUM_WAVE - 1] = sVacuumWaveDescription,
+ [MOVE_FOCUS_BLAST - 1] = sFocusBlastDescription,
+ [MOVE_ENERGY_BALL - 1] = sEnergyBallDescription,
+ [MOVE_BRAVE_BIRD - 1] = sBraveBirdDescription,
+ [MOVE_EARTH_POWER - 1] = sEarthPowerDescription,
+ [MOVE_SWITCHEROO - 1] = sSwitcherooDescription,
[MOVE_GIGA_IMPACT - 1] = sHyperBeamDescription,
- [MOVE_NASTY_PLOT - 1] = sNASTY_PLOTDescription,
- [MOVE_BULLET_PUNCH - 1] = sBULLET_PUNCHDescription,
+ [MOVE_NASTY_PLOT - 1] = sNastyPlotDescription,
+ [MOVE_BULLET_PUNCH - 1] = sBulletPunchDescription,
[MOVE_AVALANCHE - 1] = sRevengeDescription,
- [MOVE_ICE_SHARD - 1] = sICE_SHARDDescription,
- [MOVE_SHADOW_CLAW - 1] = sSHADOW_CLAWDescription,
- [MOVE_THUNDER_FANG - 1] = sTHUNDER_FANGDescription,
- [MOVE_ICE_FANG - 1] = sICE_FANGDescription,
- [MOVE_FIRE_FANG - 1] = sFIRE_FANGDescription,
- [MOVE_SHADOW_SNEAK - 1] = sSHADOW_SNEAKDescription,
- [MOVE_MUD_BOMB - 1] = sMUD_BOMBDescription,
- [MOVE_PSYCHO_CUT - 1] = sPSYCHO_CUTDescription,
- [MOVE_ZEN_HEADBUTT - 1] = sZEN_HEADBUTTDescription,
- [MOVE_MIRROR_SHOT - 1] = sMIRROR_SHOTDescription,
- [MOVE_FLASH_CANNON - 1] = sFLASH_CANNONDescription,
- [MOVE_ROCK_CLIMB - 1] = sROCK_CLIMBDescription,
- [MOVE_DEFOG - 1] = sDEFOGDescription,
- [MOVE_TRICK_ROOM - 1] = sTRICK_ROOMDescription,
- [MOVE_DRACO_METEOR - 1] = sDRACO_METEORDescription,
- [MOVE_DISCHARGE - 1] = sDISCHARGEDescription,
- [MOVE_LAVA_PLUME - 1] = sLAVA_PLUMEDescription,
- [MOVE_LEAF_STORM - 1] = sLEAF_STORMDescription,
- [MOVE_POWER_WHIP - 1] = sPOWER_WHIPDescription,
+ [MOVE_ICE_SHARD - 1] = sIceShardDescription,
+ [MOVE_SHADOW_CLAW - 1] = sShadowClawDescription,
+ [MOVE_THUNDER_FANG - 1] = sThunderFangDescription,
+ [MOVE_ICE_FANG - 1] = sIceFangDescription,
+ [MOVE_FIRE_FANG - 1] = sFireFangDescription,
+ [MOVE_SHADOW_SNEAK - 1] = sShadowSneakDescription,
+ [MOVE_MUD_BOMB - 1] = sMudBombDescription,
+ [MOVE_PSYCHO_CUT - 1] = sPsychoCutDescription,
+ [MOVE_ZEN_HEADBUTT - 1] = sZenHeadbuttDescription,
+ [MOVE_MIRROR_SHOT - 1] = sMirrorShotDescription,
+ [MOVE_FLASH_CANNON - 1] = sFlashCannonDescription,
+ [MOVE_ROCK_CLIMB - 1] = sRockClimbDescription,
+ [MOVE_DEFOG - 1] = sDefogDescription,
+ [MOVE_TRICK_ROOM - 1] = sTrickRoomDescription,
+ [MOVE_DRACO_METEOR - 1] = sDracoMeteorDescription,
+ [MOVE_DISCHARGE - 1] = sDischargeDescription,
+ [MOVE_LAVA_PLUME - 1] = sLavaPlumeDescription,
+ [MOVE_LEAF_STORM - 1] = sLeafStormDescription,
+ [MOVE_POWER_WHIP - 1] = sPowerWhipDescription,
[MOVE_ROCK_WRECKER - 1] = sHyperBeamDescription,
- [MOVE_CROSS_POISON - 1] = sCROSS_POISONDescription,
- [MOVE_GUNK_SHOT - 1] = sGUNK_SHOTDescription,
- [MOVE_IRON_HEAD - 1] = sIRON_HEADDescription,
- [MOVE_MAGNET_BOMB - 1] = sMAGNET_BOMBDescription,
- [MOVE_STONE_EDGE - 1] = sSTONE_EDGEDescription,
- [MOVE_CAPTIVATE - 1] = sCAPTIVATEDescription,
- [MOVE_STEALTH_ROCK - 1] = sSTEALTH_ROCKDescription,
- [MOVE_GRASS_KNOT - 1] = sGRASS_KNOTDescription,
- [MOVE_CHATTER - 1] = sCHATTERDescription,
- [MOVE_JUDGMENT - 1] = sJUDGMENTDescription,
- [MOVE_BUG_BITE - 1] = sPLUCKDescription,
- [MOVE_CHARGE_BEAM - 1] = sCHARGE_BEAMDescription,
- [MOVE_WOOD_HAMMER - 1] = sWOOD_HAMMERDescription,
- [MOVE_AQUA_JET - 1] = sAQUA_JETDescription,
- [MOVE_ATTACK_ORDER - 1] = sATTACK_ORDERDescription,
- [MOVE_DEFEND_ORDER - 1] = sDEFEND_ORDERDescription,
- [MOVE_HEAL_ORDER - 1] = sHEAL_ORDERDescription,
- [MOVE_HEAD_SMASH - 1] = sHEAD_SMASHDescription,
- [MOVE_DOUBLE_HIT - 1] = sDOUBLE_HITDescription,
- [MOVE_ROAR_OF_TIME - 1] = sROAR_OF_TIMEDescription,
- [MOVE_SPACIAL_REND - 1] = sSPACIAL_RENDDescription,
- [MOVE_LUNAR_DANCE - 1] = sHEALING_WISHDescription,
- [MOVE_CRUSH_GRIP - 1] = sWRING_OUTDescription,
- [MOVE_MAGMA_STORM - 1] = sMAGMA_STORMDescription,
- [MOVE_DARK_VOID - 1] = sDARK_VOIDDescription,
- [MOVE_SEED_FLARE - 1] = sSEED_FLAREDescription,
- [MOVE_OMINOUS_WIND - 1] = sOMINOUS_WINDDescription,
- [MOVE_SHADOW_FORCE - 1] = sSHADOW_FORCEDescription,
- [MOVE_HONE_CLAWS - 1] = sHONE_CLAWSDescription,
- [MOVE_WIDE_GUARD - 1] = sWIDE_GUARDDescription,
- [MOVE_GUARD_SPLIT - 1] = sGUARD_SPLITDescription,
- [MOVE_POWER_SPLIT - 1] = sPOWER_SPLITDescription,
- [MOVE_WONDER_ROOM - 1] = sWONDER_ROOMDescription,
- [MOVE_PSYSHOCK - 1] = sPSYSHOCKDescription,
- [MOVE_VENOSHOCK - 1] = sVENOSHOCKDescription,
- [MOVE_AUTOTOMIZE - 1] = sAUTOTOMIZEDescription,
- [MOVE_RAGE_POWDER - 1] = sRAGE_POWDERDescription,
- [MOVE_TELEKINESIS - 1] = sTELEKINESISDescription,
- [MOVE_MAGIC_ROOM - 1] = sMAGIC_ROOMDescription,
- [MOVE_SMACK_DOWN - 1] = sSMACK_DOWNDescription,
- [MOVE_STORM_THROW - 1] = sSTORM_THROWDescription,
- [MOVE_FLAME_BURST - 1] = sFLAME_BURSTDescription,
- [MOVE_SLUDGE_WAVE - 1] = sSLUDGE_WAVEDescription,
- [MOVE_QUIVER_DANCE - 1] = sQUIVER_DANCEDescription,
- [MOVE_HEAVY_SLAM - 1] = sHEAVY_SLAMDescription,
- [MOVE_SYNCHRONOISE - 1] = sSYNCHRONOISEDescription,
- [MOVE_ELECTRO_BALL - 1] = sELECTRO_BALLDescription,
- [MOVE_SOAK - 1] = sSOAKDescription,
- [MOVE_FLAME_CHARGE - 1] = sFLAME_CHARGEDescription,
- [MOVE_COIL - 1] = sCOILDescription,
- [MOVE_LOW_SWEEP - 1] = sLOW_SWEEPDescription,
- [MOVE_ACID_SPRAY - 1] = sACID_SPRAYDescription,
- [MOVE_FOUL_PLAY - 1] = sFOUL_PLAYDescription,
- [MOVE_SIMPLE_BEAM - 1] = sSIMPLE_BEAMDescription,
- [MOVE_ENTRAINMENT - 1] = sENTRAINMENTDescription,
- [MOVE_AFTER_YOU - 1] = sAFTER_YOUDescription,
- [MOVE_ROUND - 1] = sROUNDDescription,
- [MOVE_ECHOED_VOICE - 1] = sECHOED_VOICEDescription,
- [MOVE_CHIP_AWAY - 1] = sCHIP_AWAYDescription,
- [MOVE_CLEAR_SMOG - 1] = sCLEAR_SMOGDescription,
- [MOVE_STORED_POWER - 1] = sSTORED_POWERDescription,
- [MOVE_QUICK_GUARD - 1] = sQUICK_GUARDDescription,
- [MOVE_ALLY_SWITCH - 1] = sALLY_SWITCHDescription,
- [MOVE_SCALD - 1] = sSCALDDescription,
- [MOVE_SHELL_SMASH - 1] = sSHELL_SMASHDescription,
- [MOVE_HEAL_PULSE - 1] = sHEAL_PULSEDescription,
- [MOVE_HEX - 1] = sHEXDescription,
- [MOVE_SKY_DROP - 1] = sSKY_DROPDescription,
- [MOVE_SHIFT_GEAR - 1] = sSHIFT_GEARDescription,
- [MOVE_CIRCLE_THROW - 1] = sCIRCLE_THROWDescription,
- [MOVE_INCINERATE - 1] = sINCINERATEDescription,
- [MOVE_QUASH - 1] = sQUASHDescription,
- [MOVE_ACROBATICS - 1] = sACROBATICSDescription,
- [MOVE_REFLECT_TYPE - 1] = sREFLECT_TYPEDescription,
- [MOVE_RETALIATE - 1] = sRETALIATEDescription,
- [MOVE_FINAL_GAMBIT - 1] = sFINAL_GAMBITDescription,
- [MOVE_BESTOW - 1] = sBESTOWDescription,
- [MOVE_INFERNO - 1] = sINFERNODescription,
- [MOVE_WATER_PLEDGE - 1] = sWATER_PLEDGEDescription,
- [MOVE_FIRE_PLEDGE - 1] = sFIRE_PLEDGEDescription,
- [MOVE_GRASS_PLEDGE - 1] = sGRASS_PLEDGEDescription,
- [MOVE_VOLT_SWITCH - 1] = sU_TURNDescription,
- [MOVE_STRUGGLE_BUG - 1] = sSTRUGGLE_BUGDescription,
- [MOVE_BULLDOZE - 1] = sBULLDOZEDescription,
- [MOVE_FROST_BREATH - 1] = sSTORM_THROWDescription,
- [MOVE_DRAGON_TAIL - 1] = sCIRCLE_THROWDescription,
- [MOVE_WORK_UP - 1] = sWORK_UPDescription,
- [MOVE_ELECTROWEB - 1] = sELECTROWEBDescription,
- [MOVE_WILD_CHARGE - 1] = sWILD_CHARGEDescription,
- [MOVE_DRILL_RUN - 1] = sDRILL_RUNDescription,
- [MOVE_DUAL_CHOP - 1] = sDUAL_CHOPDescription,
- [MOVE_HEART_STAMP - 1] = sHEART_STAMPDescription,
+ [MOVE_CROSS_POISON - 1] = sCrossPoisonDescription,
+ [MOVE_GUNK_SHOT - 1] = sGunkShotDescription,
+ [MOVE_IRON_HEAD - 1] = sIronHeadDescription,
+ [MOVE_MAGNET_BOMB - 1] = sMagnetBombDescription,
+ [MOVE_STONE_EDGE - 1] = sStoneEdgeDescription,
+ [MOVE_CAPTIVATE - 1] = sCaptivateDescription,
+ [MOVE_STEALTH_ROCK - 1] = sStealthRockDescription,
+ [MOVE_GRASS_KNOT - 1] = sGrassKnotDescription,
+ [MOVE_CHATTER - 1] = sChatterDescription,
+ [MOVE_JUDGMENT - 1] = sJudgmentDescription,
+ [MOVE_BUG_BITE - 1] = sPluckDescription,
+ [MOVE_CHARGE_BEAM - 1] = sChargeBeamDescription,
+ [MOVE_WOOD_HAMMER - 1] = sWoodHammerDescription,
+ [MOVE_AQUA_JET - 1] = sAquaJetDescription,
+ [MOVE_ATTACK_ORDER - 1] = sAttackOrderDescription,
+ [MOVE_DEFEND_ORDER - 1] = sDefendOrderDescription,
+ [MOVE_HEAL_ORDER - 1] = sHealOrderDescription,
+ [MOVE_HEAD_SMASH - 1] = sHeadSmashDescription,
+ [MOVE_DOUBLE_HIT - 1] = sDoubleHitDescription,
+ [MOVE_ROAR_OF_TIME - 1] = sRoarOfTimeDescription,
+ [MOVE_SPACIAL_REND - 1] = sSpacialRendDescription,
+ [MOVE_LUNAR_DANCE - 1] = sHealingWishDescription,
+ [MOVE_CRUSH_GRIP - 1] = sWringOutDescription,
+ [MOVE_MAGMA_STORM - 1] = sMagmaStormDescription,
+ [MOVE_DARK_VOID - 1] = sDarkVoidDescription,
+ [MOVE_SEED_FLARE - 1] = sSeedFlareDescription,
+ [MOVE_OMINOUS_WIND - 1] = sOminousWindDescription,
+ [MOVE_SHADOW_FORCE - 1] = sShadowForceDescription,
+ [MOVE_HONE_CLAWS - 1] = sHoneClawsDescription,
+ [MOVE_WIDE_GUARD - 1] = sWideGuardDescription,
+ [MOVE_GUARD_SPLIT - 1] = sGuardSplitDescription,
+ [MOVE_POWER_SPLIT - 1] = sPowerSplitDescription,
+ [MOVE_WONDER_ROOM - 1] = sWonderRoomDescription,
+ [MOVE_PSYSHOCK - 1] = sPsyshockDescription,
+ [MOVE_VENOSHOCK - 1] = sVenoshockDescription,
+ [MOVE_AUTOTOMIZE - 1] = sAutotomizeDescription,
+ [MOVE_RAGE_POWDER - 1] = sRagePowderDescription,
+ [MOVE_TELEKINESIS - 1] = sTelekinesisDescription,
+ [MOVE_MAGIC_ROOM - 1] = sMagicRoomDescription,
+ [MOVE_SMACK_DOWN - 1] = sSmackDownDescription,
+ [MOVE_STORM_THROW - 1] = sStormThrowDescription,
+ [MOVE_FLAME_BURST - 1] = sFlameBurstDescription,
+ [MOVE_SLUDGE_WAVE - 1] = sSludgeWaveDescription,
+ [MOVE_QUIVER_DANCE - 1] = sQuiverDanceDescription,
+ [MOVE_HEAVY_SLAM - 1] = sHeavySlamDescription,
+ [MOVE_SYNCHRONOISE - 1] = sSynchronoiseDescription,
+ [MOVE_ELECTRO_BALL - 1] = sElectroBallDescription,
+ [MOVE_SOAK - 1] = sSoakDescription,
+ [MOVE_FLAME_CHARGE - 1] = sFlameChargeDescription,
+ [MOVE_COIL - 1] = sCoilDescription,
+ [MOVE_LOW_SWEEP - 1] = sLowSweepDescription,
+ [MOVE_ACID_SPRAY - 1] = sAcidSprayDescription,
+ [MOVE_FOUL_PLAY - 1] = sFoulPlayDescription,
+ [MOVE_SIMPLE_BEAM - 1] = sSimpleBeamDescription,
+ [MOVE_ENTRAINMENT - 1] = sEntrainmentDescription,
+ [MOVE_AFTER_YOU - 1] = sAfterYouDescription,
+ [MOVE_ROUND - 1] = sRoundDescription,
+ [MOVE_ECHOED_VOICE - 1] = sEchoedVoiceDescription,
+ [MOVE_CHIP_AWAY - 1] = sChipAwayDescription,
+ [MOVE_CLEAR_SMOG - 1] = sClearSmogDescription,
+ [MOVE_STORED_POWER - 1] = sStoredPowerDescription,
+ [MOVE_QUICK_GUARD - 1] = sQuickGuardDescription,
+ [MOVE_ALLY_SWITCH - 1] = sAllySwitchDescription,
+ [MOVE_SCALD - 1] = sScaldDescription,
+ [MOVE_SHELL_SMASH - 1] = sShellSmashDescription,
+ [MOVE_HEAL_PULSE - 1] = sHealPulseDescription,
+ [MOVE_HEX - 1] = sHexDescription,
+ [MOVE_SKY_DROP - 1] = sSkyDropDescription,
+ [MOVE_SHIFT_GEAR - 1] = sShiftGearDescription,
+ [MOVE_CIRCLE_THROW - 1] = sCircleThrowDescription,
+ [MOVE_INCINERATE - 1] = sIncinerateDescription,
+ [MOVE_QUASH - 1] = sQuashDescription,
+ [MOVE_ACROBATICS - 1] = sAcrobaticsDescription,
+ [MOVE_REFLECT_TYPE - 1] = sReflectTypeDescription,
+ [MOVE_RETALIATE - 1] = sRetaliateDescription,
+ [MOVE_FINAL_GAMBIT - 1] = sFinalGambitDescription,
+ [MOVE_BESTOW - 1] = sBestowDescription,
+ [MOVE_INFERNO - 1] = sInfernoDescription,
+ [MOVE_WATER_PLEDGE - 1] = sWaterPledgeDescription,
+ [MOVE_FIRE_PLEDGE - 1] = sFirePledgeDescription,
+ [MOVE_GRASS_PLEDGE - 1] = sGrassPledgeDescription,
+ [MOVE_VOLT_SWITCH - 1] = sUTurnDescription,
+ [MOVE_STRUGGLE_BUG - 1] = sStruggleBugDescription,
+ [MOVE_BULLDOZE - 1] = sBulldozeDescription,
+ [MOVE_FROST_BREATH - 1] = sStormThrowDescription,
+ [MOVE_DRAGON_TAIL - 1] = sCircleThrowDescription,
+ [MOVE_WORK_UP - 1] = sWorkUpDescription,
+ [MOVE_ELECTROWEB - 1] = sElectrowebDescription,
+ [MOVE_WILD_CHARGE - 1] = sWildChargeDescription,
+ [MOVE_DRILL_RUN - 1] = sDrillRunDescription,
+ [MOVE_DUAL_CHOP - 1] = sDualChopDescription,
+ [MOVE_HEART_STAMP - 1] = sHeartStampDescription,
[MOVE_HORN_LEECH - 1] = sMegaDrainDescription,
- [MOVE_SACRED_SWORD - 1] = sCHIP_AWAYDescription,
- [MOVE_RAZOR_SHELL - 1] = sRAZOR_SHELLDescription,
- [MOVE_HEAT_CRASH - 1] = sHEAVY_SLAMDescription,
- [MOVE_LEAF_TORNADO - 1] = sLEAF_TORNADODescription,
- [MOVE_STEAMROLLER - 1] = sSTEAMROLLERDescription,
- [MOVE_COTTON_GUARD - 1] = sCOTTON_GUARDDescription,
- [MOVE_NIGHT_DAZE - 1] = sNIGHT_DAZEDescription,
- [MOVE_PSYSTRIKE - 1] = sPSYSHOCKDescription,
- [MOVE_TAIL_SLAP - 1] = sTAIL_SLAPDescription,
- [MOVE_HURRICANE - 1] = sHURRICANEDescription,
- [MOVE_HEAD_CHARGE - 1] = sHEAD_CHARGEDescription,
- [MOVE_GEAR_GRIND - 1] = sGEAR_GRINDDescription,
- [MOVE_SEARING_SHOT - 1] = sLAVA_PLUMEDescription,
- [MOVE_TECHNO_BLAST - 1] = sTECHNO_BLASTDescription,
- [MOVE_RELIC_SONG - 1] = sRELIC_SONGDescription,
- [MOVE_SECRET_SWORD - 1] = sSECRET_SWORDDescription,
- [MOVE_GLACIATE - 1] = sGLACIATEDescription,
- [MOVE_BOLT_STRIKE - 1] = sBOLT_STRIKEDescription,
- [MOVE_BLUE_FLARE - 1] = sBLUE_FLAREDescription,
- [MOVE_FIERY_DANCE - 1] = sFIERY_DANCEDescription,
- [MOVE_FREEZE_SHOCK - 1] = sFREEZE_SHOCKDescription,
- [MOVE_ICE_BURN - 1] = sICE_BURNDescription,
- [MOVE_SNARL - 1] = sSNARLDescription,
- [MOVE_ICICLE_CRASH - 1] = sICICLE_CRASHDescription,
- [MOVE_V_CREATE - 1] = sV_CREATEDescription,
- [MOVE_FUSION_FLARE - 1] = sFUSION_FLAREDescription,
- [MOVE_FUSION_BOLT - 1] = sFUSION_BOLTDescription,
- [MOVE_FLYING_PRESS - 1] = sFLYING_PRESSDescription,
- [MOVE_MAT_BLOCK - 1] = sMAT_BLOCKDescription,
- [MOVE_BELCH - 1] = sBELCHDescription,
- [MOVE_ROTOTILLER - 1] = sROTOTILLERDescription,
- [MOVE_STICKY_WEB - 1] = sSTICKY_WEBDescription,
- [MOVE_FELL_STINGER - 1] = sFELL_STINGERDescription,
- [MOVE_PHANTOM_FORCE - 1] = sSHADOW_FORCEDescription,
- [MOVE_TRICK_OR_TREAT - 1] = sTRICK_OR_TREATDescription,
- [MOVE_NOBLE_ROAR - 1] = sNOBLE_ROARDescription,
- [MOVE_ION_DELUGE - 1] = sION_DELUGEDescription,
- [MOVE_PARABOLIC_CHARGE - 1] = sPARABOLIC_CHARGEDescription,
- [MOVE_FORESTS_CURSE - 1] = sFORESTS_CURSEDescription,
- [MOVE_PETAL_BLIZZARD - 1] = sPETAL_BLIZZARDDescription,
- [MOVE_FREEZE_DRY - 1] = sFREEZE_DRYDescription,
- [MOVE_DISARMING_VOICE - 1] = sDISARMING_VOICEDescription,
- [MOVE_PARTING_SHOT - 1] = sPARTING_SHOTDescription,
- [MOVE_TOPSY_TURVY - 1] = sTOPSY_TURVYDescription,
- [MOVE_DRAINING_KISS - 1] = sDRAINING_KISSDescription,
- [MOVE_CRAFTY_SHIELD - 1] = sCRAFTY_SHIELDDescription,
- [MOVE_FLOWER_SHIELD - 1] = sFLOWER_SHIELDDescription,
- [MOVE_GRASSY_TERRAIN - 1] = sGRASSY_TERRAINDescription,
- [MOVE_MISTY_TERRAIN - 1] = sMISTY_TERRAINDescription,
- [MOVE_ELECTRIFY - 1] = sELECTRIFYDescription,
- [MOVE_PLAY_ROUGH - 1] = sPLAY_ROUGHDescription,
- [MOVE_FAIRY_WIND - 1] = sFAIRY_WINDDescription,
- [MOVE_MOONBLAST - 1] = sMOONBLASTDescription,
- [MOVE_BOOMBURST - 1] = sBOOMBURSTDescription,
- [MOVE_FAIRY_LOCK - 1] = sFAIRY_LOCKDescription,
- [MOVE_KINGS_SHIELD - 1] = sKINGS_SHIELDDescription,
- [MOVE_PLAY_NICE - 1] = sPLAY_NICEDescription,
- [MOVE_CONFIDE - 1] = sCONFIDEDescription,
- [MOVE_DIAMOND_STORM - 1] = sDIAMOND_STORMDescription,
- [MOVE_STEAM_ERUPTION - 1] = sSTEAM_ERUPTIONDescription,
- [MOVE_HYPERSPACE_HOLE - 1] = sHYPERSPACE_HOLEDescription,
- [MOVE_WATER_SHURIKEN - 1] = sWATER_SHURIKENDescription,
- [MOVE_MYSTICAL_FIRE - 1] = sMYSTICAL_FIREDescription,
- [MOVE_SPIKY_SHIELD - 1] = sSPIKY_SHIELDDescription,
- [MOVE_AROMATIC_MIST - 1] = sAROMATIC_MISTDescription,
- [MOVE_EERIE_IMPULSE - 1] = sEERIE_IMPULSEDescription,
- [MOVE_VENOM_DRENCH - 1] = sVENOM_DRENCHDescription,
- [MOVE_POWDER - 1] = sPOWDERDescription,
- [MOVE_GEOMANCY - 1] = sGEOMANCYDescription,
- [MOVE_MAGNETIC_FLUX - 1] = sMAGNETIC_FLUXDescription,
- [MOVE_HAPPY_HOUR - 1] = sHAPPY_HOURDescription,
- [MOVE_ELECTRIC_TERRAIN - 1] = sELECTRIC_TERRAINDescription,
- [MOVE_DAZZLING_GLEAM - 1] = sDAZZLING_GLEAMDescription,
- [MOVE_CELEBRATE - 1] = sCELEBRATEDescription,
- [MOVE_HOLD_HANDS - 1] = sHOLD_HANDSDescription,
- [MOVE_BABY_DOLL_EYES - 1] = sBABYDOLL_EYESDescription,
- [MOVE_NUZZLE - 1] = sNUZZLEDescription,
+ [MOVE_SACRED_SWORD - 1] = sChipAwayDescription,
+ [MOVE_RAZOR_SHELL - 1] = sRazorShellDescription,
+ [MOVE_HEAT_CRASH - 1] = sHeavySlamDescription,
+ [MOVE_LEAF_TORNADO - 1] = sLeafTornadoDescription,
+ [MOVE_STEAMROLLER - 1] = sSteamrollerDescription,
+ [MOVE_COTTON_GUARD - 1] = sCottonGuardDescription,
+ [MOVE_NIGHT_DAZE - 1] = sNightDazeDescription,
+ [MOVE_PSYSTRIKE - 1] = sPsyshockDescription,
+ [MOVE_TAIL_SLAP - 1] = sTailSlapDescription,
+ [MOVE_HURRICANE - 1] = sHurricaneDescription,
+ [MOVE_HEAD_CHARGE - 1] = sHeadChargeDescription,
+ [MOVE_GEAR_GRIND - 1] = sGearGrindDescription,
+ [MOVE_SEARING_SHOT - 1] = sLavaPlumeDescription,
+ [MOVE_TECHNO_BLAST - 1] = sTechnoBlastDescription,
+ [MOVE_RELIC_SONG - 1] = sRelicSongDescription,
+ [MOVE_SECRET_SWORD - 1] = sSecretSwordDescription,
+ [MOVE_GLACIATE - 1] = sGlaciateDescription,
+ [MOVE_BOLT_STRIKE - 1] = sBoltStrikeDescription,
+ [MOVE_BLUE_FLARE - 1] = sBlueFlareDescription,
+ [MOVE_FIERY_DANCE - 1] = sFieryDanceDescription,
+ [MOVE_FREEZE_SHOCK - 1] = sFreezeShockDescription,
+ [MOVE_ICE_BURN - 1] = sIceBurnDescription,
+ [MOVE_SNARL - 1] = sSnarlDescription,
+ [MOVE_ICICLE_CRASH - 1] = sIcicleCrashDescription,
+ [MOVE_V_CREATE - 1] = sVCreateDescription,
+ [MOVE_FUSION_FLARE - 1] = sFusionFlareDescription,
+ [MOVE_FUSION_BOLT - 1] = sFusionBoltDescription,
+ [MOVE_FLYING_PRESS - 1] = sFlyingPressDescription,
+ [MOVE_MAT_BLOCK - 1] = sMatBlockDescription,
+ [MOVE_BELCH - 1] = sBelchDescription,
+ [MOVE_ROTOTILLER - 1] = sRototillerDescription,
+ [MOVE_STICKY_WEB - 1] = sStickyWebDescription,
+ [MOVE_FELL_STINGER - 1] = sFellStingerDescription,
+ [MOVE_PHANTOM_FORCE - 1] = sShadowForceDescription,
+ [MOVE_TRICK_OR_TREAT - 1] = sTrickOrTreatDescription,
+ [MOVE_NOBLE_ROAR - 1] = sNobleRoarDescription,
+ [MOVE_ION_DELUGE - 1] = sIonDelugeDescription,
+ [MOVE_PARABOLIC_CHARGE - 1] = sParabolicChargeDescription,
+ [MOVE_FORESTS_CURSE - 1] = sForestsCurseDescription,
+ [MOVE_PETAL_BLIZZARD - 1] = sPetalBlizzardDescription,
+ [MOVE_FREEZE_DRY - 1] = sFreezeDryDescription,
+ [MOVE_DISARMING_VOICE - 1] = sDisarmingVoiceDescription,
+ [MOVE_PARTING_SHOT - 1] = sPartingShotDescription,
+ [MOVE_TOPSY_TURVY - 1] = sTopsyTurvyDescription,
+ [MOVE_DRAINING_KISS - 1] = sDrainingKissDescription,
+ [MOVE_CRAFTY_SHIELD - 1] = sCraftyShieldDescription,
+ [MOVE_FLOWER_SHIELD - 1] = sFlowerShieldDescription,
+ [MOVE_GRASSY_TERRAIN - 1] = sGrassyTerrainDescription,
+ [MOVE_MISTY_TERRAIN - 1] = sMistyTerrainDescription,
+ [MOVE_ELECTRIFY - 1] = sElectrifyDescription,
+ [MOVE_PLAY_ROUGH - 1] = sPlayRoughDescription,
+ [MOVE_FAIRY_WIND - 1] = sFairyWindDescription,
+ [MOVE_MOONBLAST - 1] = sMoonblastDescription,
+ [MOVE_BOOMBURST - 1] = sBoomburstDescription,
+ [MOVE_FAIRY_LOCK - 1] = sFairyLockDescription,
+ [MOVE_KINGS_SHIELD - 1] = sKingsShieldDescription,
+ [MOVE_PLAY_NICE - 1] = sPlayNiceDescription,
+ [MOVE_CONFIDE - 1] = sConfideDescription,
+ [MOVE_DIAMOND_STORM - 1] = sDiamondStormDescription,
+ [MOVE_STEAM_ERUPTION - 1] = sSteamEruptionDescription,
+ [MOVE_HYPERSPACE_HOLE - 1] = sHyperspaceHoleDescription,
+ [MOVE_WATER_SHURIKEN - 1] = sWaterShurikenDescription,
+ [MOVE_MYSTICAL_FIRE - 1] = sMysticalFireDescription,
+ [MOVE_SPIKY_SHIELD - 1] = sSpikyShieldDescription,
+ [MOVE_AROMATIC_MIST - 1] = sAromaticMistDescription,
+ [MOVE_EERIE_IMPULSE - 1] = sEerieImpulseDescription,
+ [MOVE_VENOM_DRENCH - 1] = sVenomDrenchDescription,
+ [MOVE_POWDER - 1] = sPowderDescription,
+ [MOVE_GEOMANCY - 1] = sGeomancyDescription,
+ [MOVE_MAGNETIC_FLUX - 1] = sMagneticFluxDescription,
+ [MOVE_HAPPY_HOUR - 1] = sHappyHourDescription,
+ [MOVE_ELECTRIC_TERRAIN - 1] = sElectricTerrainDescription,
+ [MOVE_DAZZLING_GLEAM - 1] = sDazzlingGleamDescription,
+ [MOVE_CELEBRATE - 1] = sCelebrateDescription,
+ [MOVE_HOLD_HANDS - 1] = sHoldHandsDescription,
+ [MOVE_BABY_DOLL_EYES - 1] = sBabyDollEyesDescription,
+ [MOVE_NUZZLE - 1] = sNuzzleDescription,
[MOVE_HOLD_BACK - 1] = sFalseSwipeDescription,
- [MOVE_INFESTATION - 1] = sINFESTATIONDescription,
- [MOVE_POWER_UP_PUNCH - 1] = sPOWER_UP_PUNCHDescription,
- [MOVE_OBLIVION_WING - 1] = sDRAINING_KISSDescription,
- [MOVE_THOUSAND_ARROWS - 1] = sTHOUSAND_ARROWSDescription,
- [MOVE_THOUSAND_WAVES - 1] = sTHOUSAND_WAVESDescription,
- [MOVE_LANDS_WRATH - 1] = sLANDS_WRATHDescription,
- [MOVE_LIGHT_OF_RUIN - 1] = sLIGHT_OF_RUINDescription,
- [MOVE_ORIGIN_PULSE - 1] = sORIGIN_PULSEDescription,
- [MOVE_PRECIPICE_BLADES - 1] = sPRECIPICE_BLADESDescription,
- [MOVE_DRAGON_ASCENT - 1] = sCLOSE_COMBATDescription,
- [MOVE_HYPERSPACE_FURY - 1] = sHYPERSPACE_HOLEDescription,
- [MOVE_SHORE_UP - 1] = sSHORE_UPDescription,
- [MOVE_FIRST_IMPRESSION - 1] = sFIRST_IMPRESSIONDescription,
- [MOVE_BANEFUL_BUNKER - 1] = sBANEFUL_BUNKERDescription,
- [MOVE_SPIRIT_SHACKLE - 1] = sSPIRIT_SHACKLEDescription,
- [MOVE_DARKEST_LARIAT - 1] = sDARKEST_LARIATDescription,
- [MOVE_SPARKLING_ARIA - 1] = sSPARKLING_ARIADescription,
- [MOVE_ICE_HAMMER - 1] = sICE_HAMMERDescription,
- [MOVE_FLORAL_HEALING - 1] = sFLORAL_HEALINGDescription,
- [MOVE_HIGH_HORSEPOWER - 1] = sHIGH_HORSEPOWERDescription,
- [MOVE_STRENGTH_SAP - 1] = sSTRENGTH_SAPDescription,
- [MOVE_SOLAR_BLADE - 1] = sSOLAR_BLADEDescription,
- [MOVE_LEAFAGE - 1] = sLEAFAGEDescription,
- [MOVE_SPOTLIGHT - 1] = sSPOTLIGHTDescription,
- [MOVE_TOXIC_THREAD - 1] = sTOXIC_THREADDescription,
- [MOVE_LASER_FOCUS - 1] = sLASER_FOCUSDescription,
- [MOVE_GEAR_UP - 1] = sGEAR_UPDescription,
- [MOVE_THROAT_CHOP - 1] = sTHROAT_CHOPDescription,
- [MOVE_POLLEN_PUFF - 1] = sPOLLEN_PUFFDescription,
- [MOVE_ANCHOR_SHOT - 1] = sANCHOR_SHOTDescription,
- [MOVE_PSYCHIC_TERRAIN - 1] = sPSYCHIC_TERRAINDescription,
- [MOVE_LUNGE - 1] = sLUNGEDescription,
- [MOVE_FIRE_LASH - 1] = sFIRE_LASHDescription,
- [MOVE_POWER_TRIP - 1] = sPOWER_TRIPDescription,
- [MOVE_BURN_UP - 1] = sBURN_UPDescription,
- [MOVE_SPEED_SWAP - 1] = sSPEED_SWAPDescription,
- [MOVE_SMART_STRIKE - 1] = sSMART_STRIKEDescription,
- [MOVE_PURIFY - 1] = sPURIFYDescription,
- [MOVE_REVELATION_DANCE - 1] = sREVELATION_DANCEDescription,
- [MOVE_CORE_ENFORCER - 1] = sCORE_ENFORCERDescription,
- [MOVE_TROP_KICK - 1] = sTROP_KICKDescription,
- [MOVE_INSTRUCT - 1] = sINSTRUCTDescription,
- [MOVE_BEAK_BLAST - 1] = sBEAK_BLASTDescription,
- [MOVE_CLANGING_SCALES - 1] = sCLANGING_SCALESDescription,
- [MOVE_DRAGON_HAMMER - 1] = sDRAGON_HAMMERDescription,
- [MOVE_BRUTAL_SWING - 1] = sBRUTAL_SWINGDescription,
- [MOVE_AURORA_VEIL - 1] = sAURORA_VEILDescription,
- [MOVE_SHELL_TRAP - 1] = sSHELL_TRAPDescription,
- [MOVE_FLEUR_CANNON - 1] = sFLEUR_CANNONDescription,
- [MOVE_PSYCHIC_FANGS - 1] = sPSYCHIC_FANGSDescription,
- [MOVE_STOMPING_TANTRUM - 1] = sSTOMPING_TANTRUMDescription,
- [MOVE_SHADOW_BONE - 1] = sSHADOW_BONEDescription,
- [MOVE_ACCELEROCK - 1] = sACCELEROCKDescription,
- [MOVE_LIQUIDATION - 1] = sLIQUIDATIONDescription,
- [MOVE_PRISMATIC_LASER - 1] = sPRISMATIC_LASERDescription,
- [MOVE_SPECTRAL_THIEF - 1] = sSPECTRAL_THIEFDescription,
- [MOVE_SUNSTEEL_STRIKE - 1] = sSUNSTEEL_STRIKEDescription,
- [MOVE_MOONGEIST_BEAM - 1] = sMOONGEIST_BEAMDescription,
- [MOVE_TEARFUL_LOOK - 1] = sTEARFUL_LOOKDescription,
- [MOVE_ZING_ZAP - 1] = sZING_ZAPDescription,
- [MOVE_NATURES_MADNESS - 1] = sNATURES_MADNESSDescription,
- [MOVE_MULTI_ATTACK - 1] = sMULTI_ATTACKDescription,
- [MOVE_MIND_BLOWN - 1] = sMIND_BLOWNDescription,
- [MOVE_PLASMA_FISTS - 1] = sPLASMA_FISTSDescription,
- [MOVE_PHOTON_GEYSER - 1] = sPHOTON_GEYSERDescription,
- [MOVE_ZIPPY_ZAP - 1] = sZIPPY_ZAPDescription,
- [MOVE_SPLISHY_SPLASH - 1] = sSPLISHY_SPLASHDescription,
- [MOVE_FLOATY_FALL - 1] = sFLOATY_FALLDescription,
- [MOVE_PIKA_PAPOW - 1] = sPIKA_PAPOWDescription,
- [MOVE_BOUNCY_BUBBLE - 1] = sBOUNCY_BUBBLEDescription,
- [MOVE_BUZZY_BUZZ - 1] = sBUZZY_BUZZDescription,
- [MOVE_SIZZLY_SLIDE - 1] = sSIZZLY_SLIDEDescription,
- [MOVE_GLITZY_GLOW - 1] = sGLITZY_GLOWDescription,
- [MOVE_BADDY_BAD - 1] = sBADDY_BADDescription,
- [MOVE_SAPPY_SEED - 1] = sSAPPY_SEEDDescription,
- [MOVE_FREEZY_FROST - 1] = sFREEZY_FROSTDescription,
- [MOVE_SPARKLY_SWIRL - 1] = sSPARKLY_SWIRLDescription,
- [MOVE_VEEVEE_VOLLEY - 1] = sVEEVEE_VOLLEYDescription,
- [MOVE_DOUBLE_IRON_BASH - 1] = sDOUBLE_IRON_BASHDescription,
+ [MOVE_INFESTATION - 1] = sInfestationDescription,
+ [MOVE_POWER_UP_PUNCH - 1] = sPowerUpPunchDescription,
+ [MOVE_OBLIVION_WING - 1] = sDrainingKissDescription,
+ [MOVE_THOUSAND_ARROWS - 1] = sThousandArrowsDescription,
+ [MOVE_THOUSAND_WAVES - 1] = sThousandWavesDescription,
+ [MOVE_LANDS_WRATH - 1] = sLandsWrathDescription,
+ [MOVE_LIGHT_OF_RUIN - 1] = sLightOfRuinDescription,
+ [MOVE_ORIGIN_PULSE - 1] = sOriginPulseDescription,
+ [MOVE_PRECIPICE_BLADES - 1] = sPrecipiceBladesDescription,
+ [MOVE_DRAGON_ASCENT - 1] = sCloseCombatDescription,
+ [MOVE_HYPERSPACE_FURY - 1] = sHyperspaceHoleDescription,
+ [MOVE_SHORE_UP - 1] = sShoreUpDescription,
+ [MOVE_FIRST_IMPRESSION - 1] = sFirstImpressionDescription,
+ [MOVE_BANEFUL_BUNKER - 1] = sBanefulBunkerDescription,
+ [MOVE_SPIRIT_SHACKLE - 1] = sSpiritShackleDescription,
+ [MOVE_DARKEST_LARIAT - 1] = sDarkestLariatDescription,
+ [MOVE_SPARKLING_ARIA - 1] = sSparklingAriaDescription,
+ [MOVE_ICE_HAMMER - 1] = sIceHammerDescription,
+ [MOVE_FLORAL_HEALING - 1] = sFloralHealingDescription,
+ [MOVE_HIGH_HORSEPOWER - 1] = sHighHorsepowerDescription,
+ [MOVE_STRENGTH_SAP - 1] = sStrengthSapDescription,
+ [MOVE_SOLAR_BLADE - 1] = sSolarBladeDescription,
+ [MOVE_LEAFAGE - 1] = sLeafageDescription,
+ [MOVE_SPOTLIGHT - 1] = sSpotlightDescription,
+ [MOVE_TOXIC_THREAD - 1] = sToxicThreadDescription,
+ [MOVE_LASER_FOCUS - 1] = sLaserFocusDescription,
+ [MOVE_GEAR_UP - 1] = sGearUpDescription,
+ [MOVE_THROAT_CHOP - 1] = sThroatChopDescription,
+ [MOVE_POLLEN_PUFF - 1] = sPollenPuffDescription,
+ [MOVE_ANCHOR_SHOT - 1] = sAnchorShotDescription,
+ [MOVE_PSYCHIC_TERRAIN - 1] = sPsychicTerrainDescription,
+ [MOVE_LUNGE - 1] = sLungeDescription,
+ [MOVE_FIRE_LASH - 1] = sFireLashDescription,
+ [MOVE_POWER_TRIP - 1] = sPowerTripDescription,
+ [MOVE_BURN_UP - 1] = sBurnUpDescription,
+ [MOVE_SPEED_SWAP - 1] = sSpeedSwapDescription,
+ [MOVE_SMART_STRIKE - 1] = sSmartStrikeDescription,
+ [MOVE_PURIFY - 1] = sPurifyDescription,
+ [MOVE_REVELATION_DANCE - 1] = sRevelationDanceDescription,
+ [MOVE_CORE_ENFORCER - 1] = sCoreEnforcerDescription,
+ [MOVE_TROP_KICK - 1] = sTropKickDescription,
+ [MOVE_INSTRUCT - 1] = sInstructDescription,
+ [MOVE_BEAK_BLAST - 1] = sBeakBlastDescription,
+ [MOVE_CLANGING_SCALES - 1] = sClangingScalesDescription,
+ [MOVE_DRAGON_HAMMER - 1] = sDragonHammerDescription,
+ [MOVE_BRUTAL_SWING - 1] = sBrutalSwingDescription,
+ [MOVE_AURORA_VEIL - 1] = sAuroraVeilDescription,
+ [MOVE_SHELL_TRAP - 1] = sShellTrapDescription,
+ [MOVE_FLEUR_CANNON - 1] = sFleurCannonDescription,
+ [MOVE_PSYCHIC_FANGS - 1] = sPsychicFangsDescription,
+ [MOVE_STOMPING_TANTRUM - 1] = sStompingTantrumDescription,
+ [MOVE_SHADOW_BONE - 1] = sShadowBoneDescription,
+ [MOVE_ACCELEROCK - 1] = sAccelerockDescription,
+ [MOVE_LIQUIDATION - 1] = sLiquidationDescription,
+ [MOVE_PRISMATIC_LASER - 1] = sPrismaticLaserDescription,
+ [MOVE_SPECTRAL_THIEF - 1] = sSpectralThiefDescription,
+ [MOVE_SUNSTEEL_STRIKE - 1] = sSunsteelStrikeDescription,
+ [MOVE_MOONGEIST_BEAM - 1] = sMoongeistBeamDescription,
+ [MOVE_TEARFUL_LOOK - 1] = sTearfulLookDescription,
+ [MOVE_ZING_ZAP - 1] = sZingZapDescription,
+ [MOVE_NATURES_MADNESS - 1] = sNaturesMadnessDescription,
+ [MOVE_MULTI_ATTACK - 1] = sMultiAttackDescription,
+ [MOVE_MIND_BLOWN - 1] = sMindBlownDescription,
+ [MOVE_PLASMA_FISTS - 1] = sPlasmaFistsDescription,
+ [MOVE_PHOTON_GEYSER - 1] = sPhotonGeyserDescription,
+ [MOVE_ZIPPY_ZAP - 1] = sZippyZapDescription,
+ [MOVE_SPLISHY_SPLASH - 1] = sSplishySplashDescription,
+ [MOVE_FLOATY_FALL - 1] = sFloatyFallDescription,
+ [MOVE_PIKA_PAPOW - 1] = sPikaPapowDescription,
+ [MOVE_BOUNCY_BUBBLE - 1] = sBouncyBubbleDescription,
+ [MOVE_BUZZY_BUZZ - 1] = sBuzzyBuzzDescription,
+ [MOVE_SIZZLY_SLIDE - 1] = sSizzlySlideDescription,
+ [MOVE_GLITZY_GLOW - 1] = sGlitzyGlowDescription,
+ [MOVE_BADDY_BAD - 1] = sBaddyBadDescription,
+ [MOVE_SAPPY_SEED - 1] = sSappySeedDescription,
+ [MOVE_FREEZY_FROST - 1] = sFreezyFrostDescription,
+ [MOVE_SPARKLY_SWIRL - 1] = sSparklySwirlDescription,
+ [MOVE_VEEVEE_VOLLEY - 1] = sVeeveeVolleyDescription,
+ [MOVE_DOUBLE_IRON_BASH - 1] = sDoubleIronBashDescription,
//GEN 8
- [MOVE_DYNAMAX_CANNON - 1] = sDYNAMAX_CANNONDescription,
- [MOVE_SNIPE_SHOT - 1] = sSNIPE_SHOTDescription,
- [MOVE_JAW_LOCK - 1] = sJAW_LOCKDescription,
- [MOVE_STUFF_CHEEKS - 1] = sSTUFF_CHEEKSDescription,
- [MOVE_NO_RETREAT - 1] = sNO_RETREATDescription,
- [MOVE_TAR_SHOT - 1] = sTAR_SHOTDescription,
- [MOVE_MAGIC_POWDER - 1] = sMAGIC_POWDERDescription,
- [MOVE_DRAGON_DARTS - 1] = sDRAGON_DARTSDescription,
- [MOVE_TEATIME - 1] = sTEATIMEDescription,
- [MOVE_OCTOLOCK - 1] = sOCTOLOCKDescription,
- [MOVE_BOLT_BEAK - 1] = sBOLT_BEAKDescription,
- [MOVE_FISHIOUS_REND - 1] = sFISHIOUS_RENDDescription,
- [MOVE_COURT_CHANGE - 1] = sCOURT_CHANGEDescription,
- [MOVE_CLANGOROUS_SOUL - 1] = sCLANGOROUS_SOULDescription,
- [MOVE_BODY_PRESS - 1] = sBODY_PRESSDescription,
- [MOVE_DECORATE - 1] = sDECORATEDescription,
- [MOVE_DRUM_BEATING - 1] = sDRUM_BEATINGDescription,
- [MOVE_SNAP_TRAP - 1] = sSNAP_TRAPDescription,
- [MOVE_PYRO_BALL - 1] = sPYRO_BALLDescription,
- [MOVE_BEHEMOTH_BLADE - 1] = sBEHEMOTH_BLADEDescription,
- [MOVE_BEHEMOTH_BASH - 1] = sBEHEMOTH_BASHDescription,
- [MOVE_AURA_WHEEL - 1] = sAURA_WHEELDescription,
- [MOVE_BREAKING_SWIPE - 1] = sBREAKING_SWIPEDescription,
- [MOVE_BRANCH_POKE - 1] = sBRANCH_POKEDescription,
- [MOVE_OVERDRIVE - 1] = sOVERDRIVEDescription,
- [MOVE_APPLE_ACID - 1] = sAPPLE_ACIDDescription,
- [MOVE_GRAV_APPLE - 1] = sGRAV_APPLEDescription,
- [MOVE_SPIRIT_BREAK - 1] = sSPIRIT_BREAKDescription,
- [MOVE_STRANGE_STEAM - 1] = sSTRANGE_STEAMDescription,
- [MOVE_LIFE_DEW - 1] = sLIFE_DEWDescription,
- [MOVE_OBSTRUCT - 1] = sOBSTRUCTDescription,
- [MOVE_FALSE_SURRENDER - 1] = sFALSE_SURRENDERDescription,
- [MOVE_METEOR_ASSAULT - 1] = sMETEOR_ASSAULTDescription,
- [MOVE_ETERNABEAM - 1] = sETERNABEAMDescription,
- [MOVE_STEEL_BEAM - 1] = sSTEEL_BEAMDescription,
- [MOVE_EXPANDING_FORCE - 1] = sEXPANDING_FORCEDescription,
- [MOVE_STEEL_ROLLER - 1] = sSTEEL_ROLLERDescription,
- [MOVE_SCALE_SHOT - 1] = sSCALE_SHOTDescription,
- [MOVE_METEOR_BEAM - 1] = sMETEOR_BEAMDescription,
- [MOVE_SHELL_SIDE_ARM - 1] = sSHELL_SIDE_ARMDescription,
- [MOVE_MISTY_EXPLOSION - 1] = sMISTY_EXPLOSIONDescription,
- [MOVE_GRASSY_GLIDE - 1] = sGRASSY_GLIDEDescription,
- [MOVE_RISING_VOLTAGE - 1] = sRISING_VOLTAGEDescription,
- [MOVE_TERRAIN_PULSE - 1] = sTERRAIN_PULSEDescription,
- [MOVE_SKITTER_SMACK - 1] = sSKITTER_SMACKDescription,
- [MOVE_BURNING_JEALOUSY - 1] = sBURNING_JEALOUSYDescription,
- [MOVE_LASH_OUT - 1] = sLASH_OUTDescription,
- [MOVE_POLTERGEIST - 1] = sPOLTERGEISTDescription,
- [MOVE_CORROSIVE_GAS - 1] = sCORROSIVE_GASDescription,
- [MOVE_COACHING - 1] = sCOACHINGDescription,
- [MOVE_FLIP_TURN - 1] = sFLIP_TURNDescription,
- [MOVE_TRIPLE_AXEL - 1] = sTRIPLE_AXELDescription,
- [MOVE_DUAL_WINGBEAT - 1] = sDUAL_WINGBEATDescription,
- [MOVE_SCORCHING_SANDS - 1] = sSCORCHING_SANDSDescription,
- [MOVE_JUNGLE_HEALING - 1] = sJUNGLE_HEALINGDescription,
- [MOVE_WICKED_BLOW - 1] = sWICKED_BLOWDescription,
- [MOVE_SURGING_STRIKES - 1] = sSURGING_STRIKESDescription,
- [MOVE_THUNDER_CAGE - 1] = sTHUNDER_CAGEDescription,
- [MOVE_DRAGON_ENERGY - 1] = sDRAGON_ENERGYDescription,
- [MOVE_FREEZING_GLARE - 1] = sFREEZING_GLAREDescription,
- [MOVE_FIERY_WRATH - 1] = sFIERY_WRATHDescription,
- [MOVE_THUNDEROUS_KICK - 1] = sTHUNDEROUS_KICKDescription,
- [MOVE_GLACIAL_LANCE - 1] = sGLACIAL_LANCEDescription,
- [MOVE_ASTRAL_BARRAGE - 1] = sASTRAL_BARRAGEDescription,
- [MOVE_EERIE_SPELL - 1] = sEERIE_SPELLDescription,
+ [MOVE_DYNAMAX_CANNON - 1] = sDynamaxCannonDescription,
+ [MOVE_SNIPE_SHOT - 1] = sSnipeShotDescription,
+ [MOVE_JAW_LOCK - 1] = sJawLockDescription,
+ [MOVE_STUFF_CHEEKS - 1] = sStuffCheeksDescription,
+ [MOVE_NO_RETREAT - 1] = sNoRetreatDescription,
+ [MOVE_TAR_SHOT - 1] = sTarShotDescription,
+ [MOVE_MAGIC_POWDER - 1] = sMagicPowderDescription,
+ [MOVE_DRAGON_DARTS - 1] = sDragonDartsDescription,
+ [MOVE_TEATIME - 1] = sTeatimeDescription,
+ [MOVE_OCTOLOCK - 1] = sOctolockDescription,
+ [MOVE_BOLT_BEAK - 1] = sBoltBeakDescription,
+ [MOVE_FISHIOUS_REND - 1] = sFishiousRendDescription,
+ [MOVE_COURT_CHANGE - 1] = sCourtChangeDescription,
+ [MOVE_CLANGOROUS_SOUL - 1] = sClangorousSoulDescription,
+ [MOVE_BODY_PRESS - 1] = sBodyPressDescription,
+ [MOVE_DECORATE - 1] = sDecorateDescription,
+ [MOVE_DRUM_BEATING - 1] = sDrumBeatingDescription,
+ [MOVE_SNAP_TRAP - 1] = sSnapTrapDescription,
+ [MOVE_PYRO_BALL - 1] = sPyroBallDescription,
+ [MOVE_BEHEMOTH_BLADE - 1] = sBehemothBladeDescription,
+ [MOVE_BEHEMOTH_BASH - 1] = sBehemothBashDescription,
+ [MOVE_AURA_WHEEL - 1] = sAuraWheelDescription,
+ [MOVE_BREAKING_SWIPE - 1] = sBreakingSwipeDescription,
+ [MOVE_BRANCH_POKE - 1] = sBranchPokeDescription,
+ [MOVE_OVERDRIVE - 1] = sOverdriveDescription,
+ [MOVE_APPLE_ACID - 1] = sAppleAcidDescription,
+ [MOVE_GRAV_APPLE - 1] = sGravAppleDescription,
+ [MOVE_SPIRIT_BREAK - 1] = sSpiritBreakDescription,
+ [MOVE_STRANGE_STEAM - 1] = sStrangeSteamDescription,
+ [MOVE_LIFE_DEW - 1] = sLifeDewDescription,
+ [MOVE_OBSTRUCT - 1] = sObstructDescription,
+ [MOVE_FALSE_SURRENDER - 1] = sFalseSurrenderDescription,
+ [MOVE_METEOR_ASSAULT - 1] = sMeteorAssaultDescription,
+ [MOVE_ETERNABEAM - 1] = sEternabeamDescription,
+ [MOVE_STEEL_BEAM - 1] = sSteelBeamDescription,
+ [MOVE_EXPANDING_FORCE - 1] = sExpandingForceDescription,
+ [MOVE_STEEL_ROLLER - 1] = sSteelRollerDescription,
+ [MOVE_SCALE_SHOT - 1] = sScaleShotDescription,
+ [MOVE_METEOR_BEAM - 1] = sMeteorBeamDescription,
+ [MOVE_SHELL_SIDE_ARM - 1] = sShellSideArmDescription,
+ [MOVE_MISTY_EXPLOSION - 1] = sMistyExplosionDescription,
+ [MOVE_GRASSY_GLIDE - 1] = sGrassyGlideDescription,
+ [MOVE_RISING_VOLTAGE - 1] = sRisingVoltageDescription,
+ [MOVE_TERRAIN_PULSE - 1] = sTerrainPulseDescription,
+ [MOVE_SKITTER_SMACK - 1] = sSkitterSmackDescription,
+ [MOVE_BURNING_JEALOUSY - 1] = sBurningJealousyDescription,
+ [MOVE_LASH_OUT - 1] = sLashOutDescription,
+ [MOVE_POLTERGEIST - 1] = sPoltergeistDescription,
+ [MOVE_CORROSIVE_GAS - 1] = sCorrosiveGasDescription,
+ [MOVE_COACHING - 1] = sCoachingDescription,
+ [MOVE_FLIP_TURN - 1] = sFlipTurnDescription,
+ [MOVE_TRIPLE_AXEL - 1] = sTripleAxelDescription,
+ [MOVE_DUAL_WINGBEAT - 1] = sDualWingbeatDescription,
+ [MOVE_SCORCHING_SANDS - 1] = sScorchingSandsDescription,
+ [MOVE_JUNGLE_HEALING - 1] = sJungleHealingDescription,
+ [MOVE_WICKED_BLOW - 1] = sWickedBlowDescription,
+ [MOVE_SURGING_STRIKES - 1] = sSurgingStrikesDescription,
+ [MOVE_THUNDER_CAGE - 1] = sThunderCageDescription,
+ [MOVE_DRAGON_ENERGY - 1] = sDragonEnergyDescription,
+ [MOVE_FREEZING_GLARE - 1] = sFreezingGlareDescription,
+ [MOVE_FIERY_WRATH - 1] = sFieryWrathDescription,
+ [MOVE_THUNDEROUS_KICK - 1] = sThunderousKickDescription,
+ [MOVE_GLACIAL_LANCE - 1] = sGlacialLanceDescription,
+ [MOVE_ASTRAL_BARRAGE - 1] = sAstralBarrageDescription,
+ [MOVE_EERIE_SPELL - 1] = sEerieSpellDescription,
};
diff --git a/src/decoration.c b/src/decoration.c
index 118b4918e6..7e102251a4 100644
--- a/src/decoration.c
+++ b/src/decoration.c
@@ -41,7 +41,7 @@
#define PLACE_DECORATION_SELECTOR_TAG 0xbe5
#define PLACE_DECORATION_PLAYER_TAG 0x008
-#define NUM_DECORATION_FLAGS (FLAG_DECORATION_14 - FLAG_DECORATION_0)
+#define NUM_DECORATION_FLAGS (FLAG_DECORATION_14 - FLAG_DECORATION_1 + 1)
#define tCursorX data[0]
#define tCursorY data[1]
@@ -440,7 +440,7 @@ static const struct YesNoFuncTable sStopPuttingAwayDecorationsYesNoFunctions =
.noFunc = ContinuePuttingAwayDecorations,
};
-static const u8 sDecorationPuttingAwayCursor[] = INCBIN_U8("graphics/misc/decoration_putting_away_cursor.4bpp");
+static const u8 sDecorationPuttingAwayCursor[] = INCBIN_U8("graphics/decorations/put_away_cursor.4bpp");
static const struct SpritePalette sSpritePal_PuttingAwayCursorBrendan =
{
@@ -1185,10 +1185,10 @@ static u16 GetDecorationElevation(u8 decoration, u8 tileIndex)
switch (decoration)
{
case DECOR_STAND:
- elevation = sDecorationStandElevations[tileIndex] << METATILE_ELEVATION_SHIFT;
+ elevation = sDecorationStandElevations[tileIndex] << MAPGRID_ELEVATION_SHIFT;
return elevation;
case DECOR_SLIDE:
- elevation = sDecorationSlideElevation[tileIndex] << METATILE_ELEVATION_SHIFT;
+ elevation = sDecorationSlideElevation[tileIndex] << MAPGRID_ELEVATION_SHIFT;
return elevation;
default:
return elevation;
@@ -1199,7 +1199,7 @@ static void ShowDecorationOnMap_(u16 mapX, u16 mapY, u8 decWidth, u8 decHeight,
{
u16 i, j;
s16 x, y;
- u16 behavior;
+ u16 attributes;
u16 impassableFlag;
u16 overlapsWall;
u16 elevation;
@@ -1210,9 +1210,10 @@ static void ShowDecorationOnMap_(u16 mapX, u16 mapY, u8 decWidth, u8 decHeight,
for (i = 0; i < decWidth; i++)
{
x = mapX + i;
- behavior = GetBehaviorByMetatileId(NUM_TILES_IN_PRIMARY + gDecorations[decoration].tiles[j * decWidth + i]);
- if (MetatileBehavior_IsSecretBaseImpassable(behavior) == TRUE || (gDecorations[decoration].permission != DECORPERM_PASS_FLOOR && (behavior >> METATILE_ELEVATION_SHIFT)))
- impassableFlag = METATILE_COLLISION_MASK;
+ attributes = GetMetatileAttributesById(NUM_TILES_IN_PRIMARY + gDecorations[decoration].tiles[j * decWidth + i]);
+ if (MetatileBehavior_IsSecretBaseImpassable(attributes & METATILE_ATTR_BEHAVIOR_MASK) == TRUE
+ || (gDecorations[decoration].permission != DECORPERM_PASS_FLOOR && (attributes >> METATILE_ATTR_LAYER_SHIFT) != METATILE_LAYER_TYPE_NORMAL))
+ impassableFlag = MAPGRID_COLLISION_MASK;
else
impassableFlag = 0;
@@ -1471,24 +1472,26 @@ static void AttemptCancelPlaceDecoration(u8 taskId)
DisplayItemMessageOnField(taskId, gStringVar4, CancelDecoratingPrompt);
}
-// Note: behaviorBy is pre-anded with METATILE_ELEVATION_MASK.
-static bool8 IsNonBlockNonElevated(u8 behaviorAt, u16 behaviorBy)
+static bool8 IsSecretBaseTrainerSpot(u8 behaviorAt, u16 layerType)
{
- if (MetatileBehavior_IsBlockDecoration(behaviorAt) != TRUE || behaviorBy != 0)
+ if (!(MetatileBehavior_IsSecretBaseTrainerSpot(behaviorAt) == TRUE && layerType == METATILE_LAYER_TYPE_NORMAL))
return FALSE;
return TRUE;
}
-static bool8 IsntInitialPosition(u8 taskId, s16 x, s16 y, u16 behaviorBy)
+// Can't place decoration where the player was standing when they interacted with the PC
+static bool8 IsntInitialPosition(u8 taskId, s16 x, s16 y, u16 layerType)
{
- if (x == gTasks[taskId].tInitialX + MAP_OFFSET && y == gTasks[taskId].tInitialY + MAP_OFFSET && behaviorBy != 0)
+ if (x == gTasks[taskId].tInitialX + MAP_OFFSET
+ && y == gTasks[taskId].tInitialY + MAP_OFFSET
+ && layerType != METATILE_LAYER_TYPE_NORMAL)
return FALSE;
return TRUE;
}
static bool8 IsFloorOrBoardAndHole(u16 behaviorAt, const struct Decoration *decoration)
{
- if (MetatileBehavior_IsBlockDecoration(behaviorAt) != TRUE)
+ if (MetatileBehavior_IsSecretBaseTrainerSpot(behaviorAt) != TRUE)
{
if (decoration->id == DECOR_SOLID_BOARD && MetatileBehavior_IsSecretBaseHole(behaviorAt) == TRUE)
return TRUE;
@@ -1505,7 +1508,7 @@ static bool8 CanPlaceDecoration(u8 taskId, const struct Decoration *decoration)
u8 i;
u8 j;
u8 behaviorAt;
- u16 behaviorBy;
+ u16 layerType;
u8 mapY;
u8 mapX;
s16 curY;
@@ -1524,14 +1527,14 @@ static bool8 CanPlaceDecoration(u8 taskId, const struct Decoration *decoration)
{
curX = gTasks[taskId].tCursorX + j;
behaviorAt = MapGridGetMetatileBehaviorAt(curX, curY);
- behaviorBy = GetBehaviorByMetatileId(NUM_TILES_IN_PRIMARY + decoration->tiles[(mapY - 1 - i) * mapX + j]) & METATILE_ELEVATION_MASK;
+ layerType = GetMetatileAttributesById(NUM_TILES_IN_PRIMARY + decoration->tiles[(mapY - 1 - i) * mapX + j]) & METATILE_ATTR_LAYER_MASK;
if (!IsFloorOrBoardAndHole(behaviorAt, decoration))
return FALSE;
- if (!IsntInitialPosition(taskId, curX, curY, behaviorBy))
+ if (!IsntInitialPosition(taskId, curX, curY, layerType))
return FALSE;
- behaviorAt = GetObjectEventIdByXYZ(curX, curY, 0);
+ behaviorAt = GetObjectEventIdByPosition(curX, curY, 0);
if (behaviorAt != 0 && behaviorAt != OBJECT_EVENTS_COUNT)
return FALSE;
}
@@ -1545,14 +1548,14 @@ static bool8 CanPlaceDecoration(u8 taskId, const struct Decoration *decoration)
{
curX = gTasks[taskId].tCursorX + j;
behaviorAt = MapGridGetMetatileBehaviorAt(curX, curY);
- behaviorBy = GetBehaviorByMetatileId(NUM_TILES_IN_PRIMARY + decoration->tiles[(mapY - 1 - i) * mapX + j]) & METATILE_ELEVATION_MASK;
- if (!MetatileBehavior_IsNormal(behaviorAt) && !IsNonBlockNonElevated(behaviorAt, behaviorBy))
+ layerType = GetMetatileAttributesById(NUM_TILES_IN_PRIMARY + decoration->tiles[(mapY - 1 - i) * mapX + j]) & METATILE_ATTR_LAYER_MASK;
+ if (!MetatileBehavior_IsNormal(behaviorAt) && !IsSecretBaseTrainerSpot(behaviorAt, layerType))
return FALSE;
- if (!IsntInitialPosition(taskId, curX, curY, behaviorBy))
+ if (!IsntInitialPosition(taskId, curX, curY, layerType))
return FALSE;
- if (GetObjectEventIdByXYZ(curX, curY, 0) != OBJECT_EVENTS_COUNT)
+ if (GetObjectEventIdByPosition(curX, curY, 0) != OBJECT_EVENTS_COUNT)
return FALSE;
}
}
@@ -1562,14 +1565,14 @@ static bool8 CanPlaceDecoration(u8 taskId, const struct Decoration *decoration)
{
curX = gTasks[taskId].tCursorX + j;
behaviorAt = MapGridGetMetatileBehaviorAt(curX, curY);
- behaviorBy = GetBehaviorByMetatileId(NUM_TILES_IN_PRIMARY + decoration->tiles[j]) & METATILE_ELEVATION_MASK;
+ layerType = GetMetatileAttributesById(NUM_TILES_IN_PRIMARY + decoration->tiles[j]) & METATILE_ATTR_LAYER_MASK;
if (!MetatileBehavior_IsNormal(behaviorAt) && !MetatileBehavior_IsSecretBaseNorthWall(behaviorAt))
return FALSE;
- if (!IsntInitialPosition(taskId, curX, curY, behaviorBy))
+ if (!IsntInitialPosition(taskId, curX, curY, layerType))
return FALSE;
- behaviorAt = GetObjectEventIdByXYZ(curX, curY, 0);
+ behaviorAt = GetObjectEventIdByPosition(curX, curY, 0);
if (behaviorAt != 0 && behaviorAt != OBJECT_EVENTS_COUNT)
return FALSE;
}
@@ -1606,7 +1609,7 @@ static bool8 CanPlaceDecoration(u8 taskId, const struct Decoration *decoration)
return FALSE;
}
- if (GetObjectEventIdByXYZ(curX, curY, 0) != OBJECT_EVENTS_COUNT)
+ if (GetObjectEventIdByPosition(curX, curY, 0) != OBJECT_EVENTS_COUNT)
return FALSE;
}
break;
diff --git a/src/decoration_inventory.c b/src/decoration_inventory.c
index af1071b1b1..c84ee69a46 100644
--- a/src/decoration_inventory.c
+++ b/src/decoration_inventory.c
@@ -33,7 +33,7 @@ static void ClearDecorationInventory(u8 category)
void ClearDecorationInventories(void)
{
u8 category;
- for (category = 0; category < 8; category++)
+ for (category = 0; category < DECORCAT_COUNT; category++)
ClearDecorationInventory(category);
}
diff --git a/src/dewford_trend.c b/src/dewford_trend.c
index bba2085e8b..08dd9afe0b 100644
--- a/src/dewford_trend.c
+++ b/src/dewford_trend.c
@@ -8,7 +8,6 @@
#include "text.h"
#include "tv.h"
#include "string_util.h"
-#include "constants/easy_chat.h"
/*
## Overview ##
diff --git a/src/diploma.c b/src/diploma.c
index 76b4ae65c5..ce31578dcb 100644
--- a/src/diploma.c
+++ b/src/diploma.c
@@ -40,12 +40,12 @@ static void VBlankCB(void)
static const u16 sDiplomaPalettes[][16] =
{
- INCBIN_U16("graphics/misc/diploma_national.gbapal"),
- INCBIN_U16("graphics/misc/diploma_hoenn.gbapal"),
+ INCBIN_U16("graphics/diploma/national.gbapal"),
+ INCBIN_U16("graphics/diploma/hoenn.gbapal"),
};
-static const u32 sDiplomaTilemap[] = INCBIN_U32("graphics/misc/diploma_map.bin.lz");
-static const u32 sDiplomaTiles[] = INCBIN_U32("graphics/misc/diploma.4bpp.lz");
+static const u32 sDiplomaTilemap[] = INCBIN_U32("graphics/diploma/tilemap.bin.lz");
+static const u32 sDiplomaTiles[] = INCBIN_U32("graphics/diploma/tiles.4bpp.lz");
void CB2_ShowDiploma(void)
{
diff --git a/src/easy_chat.c b/src/easy_chat.c
index f9ba44ba79..734fd4f18b 100644
--- a/src/easy_chat.c
+++ b/src/easy_chat.c
@@ -27,7 +27,6 @@
#include "task.h"
#include "text_window.h"
#include "window.h"
-#include "constants/easy_chat.h"
#include "constants/event_objects.h"
#include "constants/lilycove_lady.h"
#include "constants/mauville_old_man.h"
diff --git a/src/ereader_helpers.c b/src/ereader_helpers.c
index 611c959bdc..389d1a961c 100755
--- a/src/ereader_helpers.c
+++ b/src/ereader_helpers.c
@@ -10,7 +10,6 @@
#include "task.h"
#include "util.h"
#include "trainer_hill.h"
-#include "constants/easy_chat.h"
#include "constants/trainers.h"
#include "constants/moves.h"
#include "constants/items.h"
diff --git a/src/ereader_screen.c b/src/ereader_screen.c
index f98a0247d3..a22b85babd 100755
--- a/src/ereader_screen.c
+++ b/src/ereader_screen.c
@@ -41,8 +41,8 @@ static void Task_EReader(u8);
struct EReaderData gEReaderData;
-extern const u8 gEReaderLinkData_Start[];
-extern const u8 gEReaderLinkData_End[];
+extern const u8 gMultiBootProgram_EReader_Start[];
+extern const u8 gMultiBootProgram_EReader_End[];
static void EReader_Load(struct EReaderData *eReader, int size, u32 *data)
{
@@ -397,8 +397,8 @@ static void Task_EReader(u8 taskId)
break;
case ER_STATE_CONNECTING:
AddTextPrinterToWindow1(gJPText_Connecting);
- // XXX: This (u32*) cast is discarding the const qualifier from gEReaderLinkData_Start
- EReader_Load(&gEReaderData, gEReaderLinkData_End - gEReaderLinkData_Start, (u32*)gEReaderLinkData_Start);
+ // XXX: This (u32*) cast is discarding the const qualifier from gMultiBootProgram_EReader_Start
+ EReader_Load(&gEReaderData, gMultiBootProgram_EReader_End - gMultiBootProgram_EReader_Start, (u32*)gMultiBootProgram_EReader_Start);
data->state = ER_STATE_TRANSFER;
break;
case ER_STATE_TRANSFER:
diff --git a/src/event_object_movement.c b/src/event_object_movement.c
index 2c7ceedf4c..df79a1d62a 100644
--- a/src/event_object_movement.c
+++ b/src/event_object_movement.c
@@ -110,7 +110,7 @@ static void GetGroundEffectFlags_Seaweed(struct ObjectEvent*, u32*);
static void GetGroundEffectFlags_JumpLanding(struct ObjectEvent*, u32*);
static u8 ObjectEventGetNearbyReflectionType(struct ObjectEvent*);
static u8 GetReflectionTypeByMetatileBehavior(u32);
-static void InitObjectPriorityByZCoord(struct Sprite *sprite, u8 z);
+static void InitObjectPriorityByElevation(struct Sprite *, u8);
static void ObjectEventUpdateSubpriority(struct ObjectEvent*, struct Sprite*);
static void DoTracksGroundEffect_None(struct ObjectEvent*, struct Sprite*, u8);
static void DoTracksGroundEffect_Footprints(struct ObjectEvent*, struct Sprite*, u8);
@@ -142,27 +142,29 @@ static void ResetObjectEventFldEffData(struct ObjectEvent *);
static u8 LoadSpritePaletteIfTagExists(const struct SpritePalette *);
static u8 FindObjectEventPaletteIndexByTag(u16);
static void _PatchObjectPalette(u16, u8);
-static bool8 ObjectEventDoesZCoordMatch(struct ObjectEvent *, u8);
+static bool8 ObjectEventDoesElevationMatch(struct ObjectEvent *, u8);
static void SpriteCB_CameraObject(struct Sprite *);
static void CameraObject_0(struct Sprite *);
static void CameraObject_1(struct Sprite *);
static void CameraObject_2(struct Sprite *);
-static struct ObjectEventTemplate *FindObjectEventTemplateByLocalId(u8 localId, struct ObjectEventTemplate *templates, u8 count);
+static struct ObjectEventTemplate *FindObjectEventTemplateByLocalId(u8, struct ObjectEventTemplate *, u8);
static void ClearObjectEventMovement(struct ObjectEvent *, struct Sprite *);
static void ObjectEventSetSingleMovement(struct ObjectEvent *, struct Sprite *, u8);
static void SetSpriteDataForNormalStep(struct Sprite *, u8, u8);
-static void InitSpriteForFigure8Anim(struct Sprite *sprite);
-static bool8 AnimateSpriteInFigure8(struct Sprite *sprite);
+static void InitSpriteForFigure8Anim(struct Sprite *);
+static bool8 AnimateSpriteInFigure8(struct Sprite *);
static void SpriteCB_VirtualObject(struct Sprite *);
static void DoShadowFieldEffect(struct ObjectEvent *);
static void SetJumpSpriteData(struct Sprite *, u8, u8, u8);
-static void SetWalkSlowSpriteData(struct Sprite *sprite, u8 direction);
-static bool8 UpdateWalkSlowAnim(struct Sprite *sprite);
-static u8 DoJumpSpriteMovement(struct Sprite *sprite);
-static u8 DoJumpSpecialSpriteMovement(struct Sprite *sprite);
+static void SetWalkSlowSpriteData(struct Sprite *, u8);
+static bool8 UpdateWalkSlowAnim(struct Sprite *);
+static u8 DoJumpSpriteMovement(struct Sprite *);
+static u8 DoJumpSpecialSpriteMovement(struct Sprite *);
static void CreateLevitateMovementTask(struct ObjectEvent *);
static void DestroyLevitateMovementTask(u8);
-static bool8 NpcTakeStep(struct Sprite *sprite);
+static bool8 NpcTakeStep(struct Sprite *);
+static bool8 IsElevationMismatchAt(u8, s16, s16);
+static bool8 AreElevationsCompatible(u8 a, u8 b);
static const struct SpriteFrameImage sPicTable_PechaBerryTree[];
@@ -1433,7 +1435,7 @@ static u8 TrySetupObjectEventSprite(struct ObjectEventTemplate *objectEventTempl
if (!objectEvent->inanimate)
StartSpriteAnim(sprite, GetFaceDirectionAnimNum(objectEvent->facingDirection));
- SetObjectSubpriorityByZCoord(objectEvent->previousElevation, sprite, 1);
+ SetObjectSubpriorityByElevation(objectEvent->previousElevation, sprite, 1);
UpdateObjectEventVisibility(objectEvent, sprite);
return objectEventId;
}
@@ -1470,7 +1472,7 @@ u8 SpawnSpecialObjectEvent(struct ObjectEventTemplate *objectEventTemplate)
return TrySpawnObjectEventTemplate(objectEventTemplate, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, cameraX, cameraY);
}
-u8 SpawnSpecialObjectEventParameterized(u8 graphicsId, u8 movementBehavior, u8 localId, s16 x, s16 y, u8 z)
+u8 SpawnSpecialObjectEventParameterized(u8 graphicsId, u8 movementBehavior, u8 localId, s16 x, s16 y, u8 elevation)
{
struct ObjectEventTemplate objectEventTemplate;
@@ -1481,7 +1483,7 @@ u8 SpawnSpecialObjectEventParameterized(u8 graphicsId, u8 movementBehavior, u8 l
objectEventTemplate.inConnection = 0;
objectEventTemplate.x = x;
objectEventTemplate.y = y;
- objectEventTemplate.elevation = z;
+ objectEventTemplate.elevation = elevation;
objectEventTemplate.movementType = movementBehavior;
objectEventTemplate.movementRangeX = 0;
objectEventTemplate.movementRangeY = 0;
@@ -1560,7 +1562,7 @@ u8 CreateObjectGraphicsSprite(u16 graphicsId, void (*callback)(struct Sprite *),
// A unique id is given as an argument and stored in the sprite data to allow referring back to the same virtual object.
// They can be turned (and, in the case of the Union Room, animated teleporting in and out) but do not have movement types
// or any of the other data normally associated with object events.
-u8 CreateVirtualObject(u8 graphicsId, u8 virtualObjId, s16 x, s16 y, u8 z, u8 direction)
+u8 CreateVirtualObject(u8 graphicsId, u8 virtualObjId, s16 x, s16 y, u8 elevation, u8 direction)
{
u8 spriteId;
struct Sprite *sprite;
@@ -1587,7 +1589,7 @@ u8 CreateVirtualObject(u8 graphicsId, u8 virtualObjId, s16 x, s16 y, u8 z, u8 di
sprite->coordOffsetEnabled = TRUE;
sprite->sVirtualObjId = virtualObjId;
- sprite->sVirtualObjElev = z;
+ sprite->sVirtualObjElev = elevation;
if (graphicsInfo->paletteSlot == 10)
LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot);
else if (graphicsInfo->paletteSlot >= 16)
@@ -1598,8 +1600,8 @@ u8 CreateVirtualObject(u8 graphicsId, u8 virtualObjId, s16 x, s16 y, u8 z, u8 di
SetSubspriteTables(sprite, subspriteTables);
sprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY;
}
- InitObjectPriorityByZCoord(sprite, z);
- SetObjectSubpriorityByZCoord(z, sprite, 1);
+ InitObjectPriorityByElevation(sprite, elevation);
+ SetObjectSubpriorityByElevation(elevation, sprite, 1);
StartSpriteAnim(sprite, GetFaceDirectionAnimNum(direction));
}
return spriteId;
@@ -1755,7 +1757,7 @@ static void SpawnObjectEventOnReturnToField(u8 objectEventId, s16 x, s16 y)
StartSpriteAnim(sprite, GetFaceDirectionAnimNum(objectEvent->facingDirection));
ResetObjectEventFldEffData(objectEvent);
- SetObjectSubpriorityByZCoord(objectEvent->previousElevation, sprite, 1);
+ SetObjectSubpriorityByElevation(objectEvent->previousElevation, sprite, 1);
}
}
@@ -2148,7 +2150,7 @@ void UpdateObjectEventCoordsForCameraUpdate(void)
}
}
-u8 GetObjectEventIdByXYZ(u16 x, u16 y, u8 z)
+u8 GetObjectEventIdByPosition(u16 x, u16 y, u8 elevation)
{
u8 i;
@@ -2156,16 +2158,18 @@ u8 GetObjectEventIdByXYZ(u16 x, u16 y, u8 z)
{
if (gObjectEvents[i].active)
{
- if (gObjectEvents[i].currentCoords.x == x && gObjectEvents[i].currentCoords.y == y && ObjectEventDoesZCoordMatch(&gObjectEvents[i], z))
+ if (gObjectEvents[i].currentCoords.x == x
+ && gObjectEvents[i].currentCoords.y == y
+ && ObjectEventDoesElevationMatch(&gObjectEvents[i], elevation))
return i;
}
}
return OBJECT_EVENTS_COUNT;
}
-static bool8 ObjectEventDoesZCoordMatch(struct ObjectEvent *objectEvent, u8 z)
+static bool8 ObjectEventDoesElevationMatch(struct ObjectEvent *objectEvent, u8 elevation)
{
- if (objectEvent->currentElevation != 0 && z != 0 && objectEvent->currentElevation != z)
+ if (objectEvent->currentElevation != 0 && elevation != 0 && objectEvent->currentElevation != elevation)
return FALSE;
return TRUE;
@@ -4626,11 +4630,11 @@ u8 GetCollisionAtCoords(struct ObjectEvent *objectEvent, s16 x, s16 y, u32 dir)
u8 direction = dir;
if (IsCoordOutsideObjectEventMovementRange(objectEvent, x, y))
return COLLISION_OUTSIDE_RANGE;
- else if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(objectEvent, x, y, direction))
+ else if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == CONNECTION_INVALID || IsMetatileDirectionallyImpassable(objectEvent, x, y, direction))
return COLLISION_IMPASSABLE;
else if (objectEvent->trackedByCamera && !CanCameraMoveInDirection(direction))
return COLLISION_IMPASSABLE;
- else if (IsZCoordMismatchAt(objectEvent->currentElevation, x, y))
+ else if (IsElevationMismatchAt(objectEvent->currentElevation, x, y))
return COLLISION_ELEVATION_MISMATCH;
else if (DoesObjectCollideWithObjectAt(objectEvent, x, y))
return COLLISION_OBJECT_EVENT;
@@ -4642,13 +4646,13 @@ u8 GetCollisionFlagsAtCoords(struct ObjectEvent *objectEvent, s16 x, s16 y, u8 d
u8 flags = 0;
if (IsCoordOutsideObjectEventMovementRange(objectEvent, x, y))
- flags |= 1;
- if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(objectEvent, x, y, direction) || (objectEvent->trackedByCamera && !CanCameraMoveInDirection(direction)))
- flags |= 2;
- if (IsZCoordMismatchAt(objectEvent->currentElevation, x, y))
- flags |= 4;
+ flags |= 1 << (COLLISION_OUTSIDE_RANGE - 1);
+ if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == CONNECTION_INVALID || IsMetatileDirectionallyImpassable(objectEvent, x, y, direction) || (objectEvent->trackedByCamera && !CanCameraMoveInDirection(direction)))
+ flags |= 1 << (COLLISION_IMPASSABLE - 1);
+ if (IsElevationMismatchAt(objectEvent->currentElevation, x, y))
+ flags |= 1 << (COLLISION_ELEVATION_MISMATCH - 1);
if (DoesObjectCollideWithObjectAt(objectEvent, x, y))
- flags |= 8;
+ flags |= 1 << (COLLISION_OBJECT_EVENT - 1);
return flags;
}
@@ -4699,7 +4703,7 @@ static bool8 DoesObjectCollideWithObjectAt(struct ObjectEvent *objectEvent, s16
{
if ((curObject->currentCoords.x == x && curObject->currentCoords.y == y) || (curObject->previousCoords.x == x && curObject->previousCoords.y == y))
{
- if (AreZCoordsCompatible(objectEvent->currentElevation, curObject->currentElevation))
+ if (AreElevationsCompatible(objectEvent->currentElevation, curObject->currentElevation))
return TRUE;
}
}
@@ -7667,23 +7671,23 @@ static void SetObjectEventSpriteOamTableForLongGrass(struct ObjectEvent *objEven
sprite->subspriteTableNum = 4;
- if (ZCoordToPriority(objEvent->previousElevation) == 1)
+ if (ElevationToPriority(objEvent->previousElevation) == 1)
sprite->subspriteTableNum = 5;
}
-bool8 IsZCoordMismatchAt(u8 z, s16 x, s16 y)
+static bool8 IsElevationMismatchAt(u8 elevation, s16 x, s16 y)
{
- u8 mapZ;
+ u8 mapElevation;
- if (z == 0)
+ if (elevation == 0)
return FALSE;
- mapZ = MapGridGetZCoordAt(x, y);
+ mapElevation = MapGridGetElevationAt(x, y);
- if (mapZ == 0 || mapZ == 15)
+ if (mapElevation == 0 || mapElevation == 15)
return FALSE;
- if (mapZ != z)
+ if (mapElevation != elevation)
return TRUE;
return FALSE;
@@ -7701,43 +7705,43 @@ static const u8 sElevationToSubspriteTableNum[] = {
1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 1,
};
-void UpdateObjectEventZCoordAndPriority(struct ObjectEvent *objEvent, struct Sprite *sprite)
+static void UpdateObjectEventElevationAndPriority(struct ObjectEvent *objEvent, struct Sprite *sprite)
{
if (objEvent->fixedPriority)
return;
- ObjectEventUpdateZCoord(objEvent);
+ ObjectEventUpdateElevation(objEvent);
sprite->subspriteTableNum = sElevationToSubspriteTableNum[objEvent->previousElevation];
sprite->oam.priority = sElevationToPriority[objEvent->previousElevation];
}
-static void InitObjectPriorityByZCoord(struct Sprite *sprite, u8 z)
+static void InitObjectPriorityByElevation(struct Sprite *sprite, u8 elevation)
{
- sprite->subspriteTableNum = sElevationToSubspriteTableNum[z];
- sprite->oam.priority = sElevationToPriority[z];
+ sprite->subspriteTableNum = sElevationToSubspriteTableNum[elevation];
+ sprite->oam.priority = sElevationToPriority[elevation];
}
-u8 ZCoordToPriority(u8 z)
+u8 ElevationToPriority(u8 elevation)
{
- return sElevationToPriority[z];
+ return sElevationToPriority[elevation];
}
-void ObjectEventUpdateZCoord(struct ObjectEvent *objEvent)
+void ObjectEventUpdateElevation(struct ObjectEvent *objEvent)
{
- u8 z = MapGridGetZCoordAt(objEvent->currentCoords.x, objEvent->currentCoords.y);
- u8 z2 = MapGridGetZCoordAt(objEvent->previousCoords.x, objEvent->previousCoords.y);
+ u8 curElevation = MapGridGetElevationAt(objEvent->currentCoords.x, objEvent->currentCoords.y);
+ u8 prevElevation = MapGridGetElevationAt(objEvent->previousCoords.x, objEvent->previousCoords.y);
- if (z == 0xF || z2 == 0xF)
+ if (curElevation == 15 || prevElevation == 15)
return;
- objEvent->currentElevation = z;
+ objEvent->currentElevation = curElevation;
- if (z != 0 && z != 0xF)
- objEvent->previousElevation = z;
+ if (curElevation != 0 && curElevation != 15)
+ objEvent->previousElevation = curElevation;
}
-void SetObjectSubpriorityByZCoord(u8 elevation, struct Sprite *sprite, u8 subpriority)
+void SetObjectSubpriorityByElevation(u8 elevation, struct Sprite *sprite, u8 subpriority)
{
s32 tmp = sprite->centerToCornerVecY;
u32 tmpa = *(u16 *)&sprite->y;
@@ -7752,10 +7756,10 @@ static void ObjectEventUpdateSubpriority(struct ObjectEvent *objEvent, struct Sp
if (objEvent->fixedPriority)
return;
- SetObjectSubpriorityByZCoord(objEvent->previousElevation, sprite, 1);
+ SetObjectSubpriorityByElevation(objEvent->previousElevation, sprite, 1);
}
-bool8 AreZCoordsCompatible(u8 a, u8 b)
+static bool8 AreElevationsCompatible(u8 a, u8 b)
{
if (a == 0 || b == 0)
return TRUE;
@@ -8051,7 +8055,7 @@ static void DoGroundEffects_OnSpawn(struct ObjectEvent *objEvent, struct Sprite
if (objEvent->triggerGroundEffectsOnMove)
{
flags = 0;
- UpdateObjectEventZCoordAndPriority(objEvent, sprite);
+ UpdateObjectEventElevationAndPriority(objEvent, sprite);
GetAllGroundEffectFlags_OnSpawn(objEvent, &flags);
SetObjectEventSpriteOamTableForLongGrass(objEvent, sprite);
DoFlaggedGroundEffects(objEvent, sprite, flags);
@@ -8067,7 +8071,7 @@ static void DoGroundEffects_OnBeginStep(struct ObjectEvent *objEvent, struct Spr
if (objEvent->triggerGroundEffectsOnMove)
{
flags = 0;
- UpdateObjectEventZCoordAndPriority(objEvent, sprite);
+ UpdateObjectEventElevationAndPriority(objEvent, sprite);
GetAllGroundEffectFlags_OnBeginStep(objEvent, &flags);
SetObjectEventSpriteOamTableForLongGrass(objEvent, sprite);
filters_out_some_ground_effects(objEvent, &flags);
@@ -8084,7 +8088,7 @@ static void DoGroundEffects_OnFinishStep(struct ObjectEvent *objEvent, struct Sp
if (objEvent->triggerGroundEffectsOnStop)
{
flags = 0;
- UpdateObjectEventZCoordAndPriority(objEvent, sprite);
+ UpdateObjectEventElevationAndPriority(objEvent, sprite);
GetAllGroundEffectFlags_OnFinishStep(objEvent, &flags);
SetObjectEventSpriteOamTableForLongGrass(objEvent, sprite);
FilterOutStepOnPuddleGroundEffectIfJumping(objEvent, &flags);
@@ -8548,7 +8552,7 @@ void UpdateObjectEventSpriteInvisibility(struct Sprite *sprite, bool8 invisible)
static void SpriteCB_VirtualObject(struct Sprite *sprite)
{
VirtualObject_UpdateAnim(sprite);
- SetObjectSubpriorityByZCoord(sprite->sVirtualObjElev, sprite, 1);
+ SetObjectSubpriorityByElevation(sprite->sVirtualObjElev, sprite, 1);
UpdateObjectEventSpriteInvisibility(sprite, sprite->sInvisible);
}
diff --git a/src/evolution_graphics.c b/src/evolution_graphics.c
index 50098743db..5d17cca84e 100644
--- a/src/evolution_graphics.c
+++ b/src/evolution_graphics.c
@@ -501,12 +501,12 @@ static void SpriteCB_EvolutionMonSprite(struct Sprite* sprite)
u8 CycleEvolutionMonSprite(u8 preEvoSpriteId, u8 postEvoSpriteId)
{
u16 i;
- u16 stack[16];
+ u16 monPalette[16];
u8 taskId;
s32 toDiv;
- for (i = 0; i < ARRAY_COUNT(stack); i++)
- stack[i] = 0x7FFF;
+ for (i = 0; i < ARRAY_COUNT(monPalette); i++)
+ monPalette[i] = RGB_WHITE;
taskId = CreateTask(Task_CycleEvolutionMonSprite_Init, 0);
gTasks[taskId].tPreEvoSpriteId = preEvoSpriteId;
@@ -522,13 +522,13 @@ u8 CycleEvolutionMonSprite(u8 preEvoSpriteId, u8 postEvoSpriteId)
gSprites[preEvoSpriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;
gSprites[preEvoSpriteId].oam.matrixNum = MATRIX_PRE_EVO;
gSprites[preEvoSpriteId].invisible = FALSE;
- CpuSet(stack, &gPlttBufferFaded[0x100 + (gSprites[preEvoSpriteId].oam.paletteNum * 16)], 16);
+ CpuSet(monPalette, &gPlttBufferFaded[0x100 + (gSprites[preEvoSpriteId].oam.paletteNum * 16)], 16);
gSprites[postEvoSpriteId].callback = SpriteCB_EvolutionMonSprite;
gSprites[postEvoSpriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;
gSprites[postEvoSpriteId].oam.matrixNum = MATRIX_POST_EVO;
gSprites[postEvoSpriteId].invisible = FALSE;
- CpuSet(stack, &gPlttBufferFaded[0x100 + (gSprites[postEvoSpriteId].oam.paletteNum * 16)], 16);
+ CpuSet(monPalette, &gPlttBufferFaded[0x100 + (gSprites[postEvoSpriteId].oam.paletteNum * 16)], 16);
gTasks[taskId].tEvoStopped = FALSE;
return taskId;
diff --git a/src/field_camera.c b/src/field_camera.c
index a36b6883c1..0a00dcbee9 100644
--- a/src/field_camera.c
+++ b/src/field_camera.c
@@ -14,7 +14,6 @@
EWRAM_DATA bool8 gUnusedBikeCameraAheadPanback = FALSE;
-// Static type declarations
struct FieldCameraOffset
{
u8 xPixelOffset;
@@ -24,18 +23,16 @@ struct FieldCameraOffset
bool8 copyBGToVRAM;
};
-// static functions
-static void RedrawMapSliceNorth(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout);
-static void RedrawMapSliceSouth(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout);
-static void RedrawMapSliceEast(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout);
-static void RedrawMapSliceWest(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout);
-static s32 MapPosToBgTilemapOffset(struct FieldCameraOffset *a, s32 x, s32 y);
-static void DrawWholeMapViewInternal(int x, int y, const struct MapLayout *mapLayout);
-static void DrawMetatileAt(const struct MapLayout *mapLayout, u16, int, int);
-static void DrawMetatile(s32 a, u16 *b, u16 c);
+static void RedrawMapSliceNorth(struct FieldCameraOffset *, const struct MapLayout *);
+static void RedrawMapSliceSouth(struct FieldCameraOffset *, const struct MapLayout *);
+static void RedrawMapSliceEast(struct FieldCameraOffset *, const struct MapLayout *);
+static void RedrawMapSliceWest(struct FieldCameraOffset *, const struct MapLayout *);
+static s32 MapPosToBgTilemapOffset(struct FieldCameraOffset *, s32, s32);
+static void DrawWholeMapViewInternal(int, int, const struct MapLayout *);
+static void DrawMetatileAt(const struct MapLayout *, u16, int, int);
+static void DrawMetatile(s32, u16 *, u16);
static void CameraPanningCB_PanAhead(void);
-// IWRAM bss vars
static struct FieldCameraOffset sFieldCameraOffset;
static s16 sHorizontalCameraPan;
static s16 sVerticalCameraPan;
@@ -46,7 +43,6 @@ struct CameraObject gFieldCamera;
u16 gTotalCameraPixelOffsetY;
u16 gTotalCameraPixelOffsetX;
-// text
static void ResetCameraOffset(struct FieldCameraOffset *cameraOffset)
{
cameraOffset->xTileOffset = 0;
@@ -222,7 +218,7 @@ void DrawDoorMetatileAt(int x, int y, u16 *arr)
if (offset >= 0)
{
- DrawMetatile(1, arr, offset);
+ DrawMetatile(METATILE_LAYER_TYPE_COVERED, arr, offset);
sFieldCameraOffset.copyBGToVRAM = TRUE;
}
}
@@ -244,66 +240,66 @@ static void DrawMetatileAt(const struct MapLayout *mapLayout, u16 offset, int x,
DrawMetatile(MapGridGetMetatileLayerTypeAt(x, y), metatiles + metatileId * 8, offset);
}
-static void DrawMetatile(s32 metatileLayerType, u16 *metatiles, u16 offset)
+static void DrawMetatile(s32 metatileLayerType, u16 *tiles, u16 offset)
{
switch (metatileLayerType)
{
- case 2: // LAYER_TYPE_
+ case METATILE_LAYER_TYPE_SPLIT:
// Draw metatile's bottom layer to the bottom background layer.
- gBGTilemapBuffers3[offset] = metatiles[0];
- gBGTilemapBuffers3[offset + 1] = metatiles[1];
- gBGTilemapBuffers3[offset + 0x20] = metatiles[2];
- gBGTilemapBuffers3[offset + 0x21] = metatiles[3];
+ gOverworldTilemapBuffer_Bg3[offset] = tiles[0];
+ gOverworldTilemapBuffer_Bg3[offset + 1] = tiles[1];
+ gOverworldTilemapBuffer_Bg3[offset + 0x20] = tiles[2];
+ gOverworldTilemapBuffer_Bg3[offset + 0x21] = tiles[3];
// Draw transparent tiles to the middle background layer.
- gBGTilemapBuffers1[offset] = 0;
- gBGTilemapBuffers1[offset + 1] = 0;
- gBGTilemapBuffers1[offset + 0x20] = 0;
- gBGTilemapBuffers1[offset + 0x21] = 0;
+ gOverworldTilemapBuffer_Bg2[offset] = 0;
+ gOverworldTilemapBuffer_Bg2[offset + 1] = 0;
+ gOverworldTilemapBuffer_Bg2[offset + 0x20] = 0;
+ gOverworldTilemapBuffer_Bg2[offset + 0x21] = 0;
// Draw metatile's top layer to the top background layer.
- gBGTilemapBuffers2[offset] = metatiles[4];
- gBGTilemapBuffers2[offset + 1] = metatiles[5];
- gBGTilemapBuffers2[offset + 0x20] = metatiles[6];
- gBGTilemapBuffers2[offset + 0x21] = metatiles[7];
+ gOverworldTilemapBuffer_Bg1[offset] = tiles[4];
+ gOverworldTilemapBuffer_Bg1[offset + 1] = tiles[5];
+ gOverworldTilemapBuffer_Bg1[offset + 0x20] = tiles[6];
+ gOverworldTilemapBuffer_Bg1[offset + 0x21] = tiles[7];
break;
- case 1: // LAYER_TYPE_COVERED_BY_OBJECTS
+ case METATILE_LAYER_TYPE_COVERED:
// Draw metatile's bottom layer to the bottom background layer.
- gBGTilemapBuffers3[offset] = metatiles[0];
- gBGTilemapBuffers3[offset + 1] = metatiles[1];
- gBGTilemapBuffers3[offset + 0x20] = metatiles[2];
- gBGTilemapBuffers3[offset + 0x21] = metatiles[3];
+ gOverworldTilemapBuffer_Bg3[offset] = tiles[0];
+ gOverworldTilemapBuffer_Bg3[offset + 1] = tiles[1];
+ gOverworldTilemapBuffer_Bg3[offset + 0x20] = tiles[2];
+ gOverworldTilemapBuffer_Bg3[offset + 0x21] = tiles[3];
// Draw metatile's top layer to the middle background layer.
- gBGTilemapBuffers1[offset] = metatiles[4];
- gBGTilemapBuffers1[offset + 1] = metatiles[5];
- gBGTilemapBuffers1[offset + 0x20] = metatiles[6];
- gBGTilemapBuffers1[offset + 0x21] = metatiles[7];
+ gOverworldTilemapBuffer_Bg2[offset] = tiles[4];
+ gOverworldTilemapBuffer_Bg2[offset + 1] = tiles[5];
+ gOverworldTilemapBuffer_Bg2[offset + 0x20] = tiles[6];
+ gOverworldTilemapBuffer_Bg2[offset + 0x21] = tiles[7];
// Draw transparent tiles to the top background layer.
- gBGTilemapBuffers2[offset] = 0;
- gBGTilemapBuffers2[offset + 1] = 0;
- gBGTilemapBuffers2[offset + 0x20] = 0;
- gBGTilemapBuffers2[offset + 0x21] = 0;
+ gOverworldTilemapBuffer_Bg1[offset] = 0;
+ gOverworldTilemapBuffer_Bg1[offset + 1] = 0;
+ gOverworldTilemapBuffer_Bg1[offset + 0x20] = 0;
+ gOverworldTilemapBuffer_Bg1[offset + 0x21] = 0;
break;
- case 0: // LAYER_TYPE_NORMAL
+ case METATILE_LAYER_TYPE_NORMAL:
// Draw garbage to the bottom background layer.
- gBGTilemapBuffers3[offset] = 0x3014;
- gBGTilemapBuffers3[offset + 1] = 0x3014;
- gBGTilemapBuffers3[offset + 0x20] = 0x3014;
- gBGTilemapBuffers3[offset + 0x21] = 0x3014;
+ gOverworldTilemapBuffer_Bg3[offset] = 0x3014;
+ gOverworldTilemapBuffer_Bg3[offset + 1] = 0x3014;
+ gOverworldTilemapBuffer_Bg3[offset + 0x20] = 0x3014;
+ gOverworldTilemapBuffer_Bg3[offset + 0x21] = 0x3014;
// Draw metatile's bottom layer to the middle background layer.
- gBGTilemapBuffers1[offset] = metatiles[0];
- gBGTilemapBuffers1[offset + 1] = metatiles[1];
- gBGTilemapBuffers1[offset + 0x20] = metatiles[2];
- gBGTilemapBuffers1[offset + 0x21] = metatiles[3];
+ gOverworldTilemapBuffer_Bg2[offset] = tiles[0];
+ gOverworldTilemapBuffer_Bg2[offset + 1] = tiles[1];
+ gOverworldTilemapBuffer_Bg2[offset + 0x20] = tiles[2];
+ gOverworldTilemapBuffer_Bg2[offset + 0x21] = tiles[3];
// Draw metatile's top layer to the top background layer, which covers object event sprites.
- gBGTilemapBuffers2[offset] = metatiles[4];
- gBGTilemapBuffers2[offset + 1] = metatiles[5];
- gBGTilemapBuffers2[offset + 0x20] = metatiles[6];
- gBGTilemapBuffers2[offset + 0x21] = metatiles[7];
+ gOverworldTilemapBuffer_Bg1[offset] = tiles[4];
+ gOverworldTilemapBuffer_Bg1[offset + 1] = tiles[5];
+ gOverworldTilemapBuffer_Bg1[offset + 0x20] = tiles[6];
+ gOverworldTilemapBuffer_Bg1[offset + 0x21] = tiles[7];
break;
}
ScheduleBgCopyTilemapToVram(1);
diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c
index 8d6b564d25..cdb0db6d14 100644
--- a/src/field_control_avatar.c
+++ b/src/field_control_avatar.c
@@ -94,7 +94,7 @@ void FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys)
if ((tileTransitionState == T_TILE_CENTER && forcedMove == FALSE) || tileTransitionState == T_NOT_MOVING)
{
- if (GetPlayerSpeed() != 4)
+ if (GetPlayerSpeed() != PLAYER_SPEED_FASTEST)
{
if (newKeys & START_BUTTON)
input->pressedStartButton = TRUE;
@@ -194,7 +194,7 @@ int ProcessPlayerFieldInput(struct FieldInput *input)
static void GetPlayerPosition(struct MapPosition *position)
{
PlayerGetDestCoords(&position->x, &position->y);
- position->height = PlayerGetZCoord();
+ position->elevation = PlayerGetElevation();
}
static void GetInFrontOfPlayerPosition(struct MapPosition *position)
@@ -203,10 +203,10 @@ static void GetInFrontOfPlayerPosition(struct MapPosition *position)
GetXYCoordsOneStepInFrontOfPlayer(&position->x, &position->y);
PlayerGetDestCoords(&x, &y);
- if (MapGridGetZCoordAt(x, y) != 0)
- position->height = PlayerGetZCoord();
+ if (MapGridGetElevationAt(x, y) != 0)
+ position->elevation = PlayerGetElevation();
else
- position->height = 0;
+ position->elevation = 0;
}
static u16 GetPlayerCurMetatileBehavior(int runningState)
@@ -264,9 +264,9 @@ const u8 *GetInteractedLinkPlayerScript(struct MapPosition *position, u8 metatil
s32 i;
if (!MetatileBehavior_IsCounter(MapGridGetMetatileBehaviorAt(position->x, position->y)))
- objectEventId = GetObjectEventIdByXYZ(position->x, position->y, position->height);
+ objectEventId = GetObjectEventIdByPosition(position->x, position->y, position->elevation);
else
- objectEventId = GetObjectEventIdByXYZ(position->x + gDirectionToVectors[direction].x, position->y + gDirectionToVectors[direction].y, position->height);
+ objectEventId = GetObjectEventIdByPosition(position->x + gDirectionToVectors[direction].x, position->y + gDirectionToVectors[direction].y, position->elevation);
if (objectEventId == OBJECT_EVENTS_COUNT || gObjectEvents[objectEventId].localId == OBJ_EVENT_ID_PLAYER)
return NULL;
@@ -288,14 +288,14 @@ static const u8 *GetInteractedObjectEventScript(struct MapPosition *position, u8
u8 objectEventId;
const u8 *script;
- objectEventId = GetObjectEventIdByXYZ(position->x, position->y, position->height);
+ objectEventId = GetObjectEventIdByPosition(position->x, position->y, position->elevation);
if (objectEventId == OBJECT_EVENTS_COUNT || gObjectEvents[objectEventId].localId == OBJ_EVENT_ID_PLAYER)
{
if (MetatileBehavior_IsCounter(metatileBehavior) != TRUE)
return NULL;
// Look for an object event on the other side of the counter.
- objectEventId = GetObjectEventIdByXYZ(position->x + gDirectionToVectors[direction].x, position->y + gDirectionToVectors[direction].y, position->height);
+ objectEventId = GetObjectEventIdByPosition(position->x + gDirectionToVectors[direction].x, position->y + gDirectionToVectors[direction].y, position->elevation);
if (objectEventId == OBJECT_EVENTS_COUNT || gObjectEvents[objectEventId].localId == OBJ_EVENT_ID_PLAYER)
return NULL;
}
@@ -315,7 +315,7 @@ static const u8 *GetInteractedObjectEventScript(struct MapPosition *position, u8
static const u8 *GetInteractedBackgroundEventScript(struct MapPosition *position, u8 metatileBehavior, u8 direction)
{
- struct BgEvent *bgEvent = GetBackgroundEventAtPosition(&gMapHeader, position->x - MAP_OFFSET, position->y - MAP_OFFSET, position->height);
+ struct BgEvent *bgEvent = GetBackgroundEventAtPosition(&gMapHeader, position->x - MAP_OFFSET, position->y - MAP_OFFSET, position->elevation);
if (bgEvent == NULL)
return NULL;
@@ -366,7 +366,7 @@ static const u8 *GetInteractedBackgroundEventScript(struct MapPosition *position
static const u8 *GetInteractedMetatileScript(struct MapPosition *position, u8 metatileBehavior, u8 direction)
{
- s8 height;
+ s8 elevation;
if (MetatileBehavior_IsPlayerFacingTVScreen(metatileBehavior, direction) == TRUE)
return EventScript_TV;
@@ -409,8 +409,8 @@ static const u8 *GetInteractedMetatileScript(struct MapPosition *position, u8 me
if (MetatileBehavior_IsTrainerHillTimer(metatileBehavior) == TRUE)
return EventScript_TrainerHillTimer;
- height = position->height;
- if (height == MapGridGetZCoordAt(position->x, position->y))
+ elevation = position->elevation;
+ if (elevation == MapGridGetElevationAt(position->x, position->y))
{
if (MetatileBehavior_IsSecretBasePC(metatileBehavior) == TRUE)
return SecretBase_EventScript_PC;
@@ -497,7 +497,7 @@ static bool8 TryStartStepBasedScript(struct MapPosition *position, u16 metatileB
static bool8 TryStartCoordEventScript(struct MapPosition *position)
{
- u8 *script = GetCoordEventScriptAtPosition(&gMapHeader, position->x - MAP_OFFSET, position->y - MAP_OFFSET, position->height);
+ u8 *script = GetCoordEventScriptAtPosition(&gMapHeader, position->x - MAP_OFFSET, position->y - MAP_OFFSET, position->elevation);
if (script == NULL)
return FALSE;
@@ -783,7 +783,7 @@ static bool8 IsArrowWarpMetatileBehavior(u16 metatileBehavior, u8 direction)
static s8 GetWarpEventAtMapPosition(struct MapHeader *mapHeader, struct MapPosition *position)
{
- return GetWarpEventAtPosition(mapHeader, position->x - MAP_OFFSET, position->y - MAP_OFFSET, position->height);
+ return GetWarpEventAtPosition(mapHeader, position->x - MAP_OFFSET, position->y - MAP_OFFSET, position->elevation);
}
static void SetupWarp(struct MapHeader *unused, s8 warpEventId, struct MapPosition *position)
@@ -918,7 +918,7 @@ static u8 *GetCoordEventScriptAtPosition(struct MapHeader *mapHeader, u16 x, u16
u8 *GetCoordEventScriptAtMapPosition(struct MapPosition *position)
{
- return GetCoordEventScriptAtPosition(&gMapHeader, position->x - MAP_OFFSET, position->y - MAP_OFFSET, position->height);
+ return GetCoordEventScriptAtPosition(&gMapHeader, position->x - MAP_OFFSET, position->y - MAP_OFFSET, position->elevation);
}
static struct BgEvent *GetBackgroundEventAtPosition(struct MapHeader *mapHeader, u16 x, u16 y, u8 elevation)
diff --git a/src/field_effect.c b/src/field_effect.c
index 09db2b2cd4..15b01b0af7 100644
--- a/src/field_effect.c
+++ b/src/field_effect.c
@@ -243,32 +243,33 @@ extern u8 *gFieldEffectScriptPointers[];
extern const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[];
static const u32 sNewGameBirch_Gfx[] = INCBIN_U32("graphics/birch_speech/birch.4bpp");
-static const u32 sUnusedBirchBeauty[] = INCBIN_U32("graphics/unused/intro_birch_beauty.4bpp");
+static const u32 sUnusedBirchBeauty[] = INCBIN_U32("graphics/birch_speech/unused_beauty.4bpp");
static const u16 sNewGameBirch_Pal[16] = INCBIN_U16("graphics/birch_speech/birch.gbapal");
-static const u32 sPokeballGlow_Gfx[] = INCBIN_U32("graphics/misc/pokeball_glow.4bpp");
+
+static const u32 sPokeballGlow_Gfx[] = INCBIN_U32("graphics/field_effects/pics/pokeball_glow.4bpp");
static const u16 sPokeballGlow_Pal[16] = INCBIN_U16("graphics/field_effects/palettes/pokeball_glow.gbapal");
-static const u32 sPokecenterMonitor0_Gfx[] = INCBIN_U32("graphics/misc/pokecenter_monitor/0.4bpp");
-static const u32 sPokecenterMonitor1_Gfx[] = INCBIN_U32("graphics/misc/pokecenter_monitor/1.4bpp");
-static const u32 sHofMonitorBig_Gfx[] = INCBIN_U32("graphics/misc/hof_monitor_big.4bpp");
-static const u8 sHofMonitorSmall_Gfx[] = INCBIN_U8("graphics/misc/hof_monitor_small.4bpp");
+static const u32 sPokecenterMonitor0_Gfx[] = INCBIN_U32("graphics/field_effects/pics/pokecenter_monitor/0.4bpp");
+static const u32 sPokecenterMonitor1_Gfx[] = INCBIN_U32("graphics/field_effects/pics/pokecenter_monitor/1.4bpp");
+static const u32 sHofMonitorBig_Gfx[] = INCBIN_U32("graphics/field_effects/pics/hof_monitor_big.4bpp");
+static const u8 sHofMonitorSmall_Gfx[] = INCBIN_U8("graphics/field_effects/pics/hof_monitor_small.4bpp");
static const u16 sHofMonitor_Pal[16] = INCBIN_U16("graphics/field_effects/palettes/hof_monitor.gbapal");
// Graphics for the lights streaking past your Pokemon when it uses a field move.
-static const u32 sFieldMoveStreaksOutdoors_Gfx[] = INCBIN_U32("graphics/misc/field_move_streaks.4bpp");
-static const u16 sFieldMoveStreaksOutdoors_Pal[16] = INCBIN_U16("graphics/misc/field_move_streaks.gbapal");
-static const u16 sFieldMoveStreaksOutdoors_Tilemap[320] = INCBIN_U16("graphics/misc/field_move_streaks_map.bin");
+static const u32 sFieldMoveStreaksOutdoors_Gfx[] = INCBIN_U32("graphics/field_effects/pics/field_move_streaks.4bpp");
+static const u16 sFieldMoveStreaksOutdoors_Pal[16] = INCBIN_U16("graphics/field_effects/pics/field_move_streaks.gbapal");
+static const u16 sFieldMoveStreaksOutdoors_Tilemap[320] = INCBIN_U16("graphics/field_effects/pics/field_move_streaks.bin");
// The following light streaks effect is used when the map is indoors
-static const u32 sFieldMoveStreaksIndoors_Gfx[] = INCBIN_U32("graphics/misc/darkness_field_move_streaks.4bpp");
-static const u16 sFieldMoveStreaksIndoors_Pal[16] = INCBIN_U16("graphics/misc/darkness_field_move_streaks.gbapal");
-static const u16 sFieldMoveStreaksIndoors_Tilemap[320] = INCBIN_U16("graphics/misc/darkness_field_move_streaks_map.bin");
+static const u32 sFieldMoveStreaksIndoors_Gfx[] = INCBIN_U32("graphics/field_effects/pics/field_move_streaks_indoors.4bpp");
+static const u16 sFieldMoveStreaksIndoors_Pal[16] = INCBIN_U16("graphics/field_effects/pics/field_move_streaks_indoors.gbapal");
+static const u16 sFieldMoveStreaksIndoors_Tilemap[320] = INCBIN_U16("graphics/field_effects/pics/field_move_streaks_indoors.bin");
-static const u16 sSpotlight_Pal[16] = INCBIN_U16("graphics/misc/spotlight.gbapal");
-static const u8 sSpotlight_Gfx[] = INCBIN_U8("graphics/misc/spotlight.4bpp");
-static const u8 sRockFragment_TopLeft[] = INCBIN_U8("graphics/misc/deoxys_rock_fragment_top_left.4bpp");
-static const u8 sRockFragment_TopRight[] = INCBIN_U8("graphics/misc/deoxys_rock_fragment_top_right.4bpp");
-static const u8 sRockFragment_BottomLeft[] = INCBIN_U8("graphics/misc/deoxys_rock_fragment_bottom_left.4bpp");
-static const u8 sRockFragment_BottomRight[] = INCBIN_U8("graphics/misc/deoxys_rock_fragment_bottom_right.4bpp");
+static const u16 sSpotlight_Pal[16] = INCBIN_U16("graphics/field_effects/pics/spotlight.gbapal");
+static const u8 sSpotlight_Gfx[] = INCBIN_U8("graphics/field_effects/pics/spotlight.4bpp");
+static const u8 sRockFragment_TopLeft[] = INCBIN_U8("graphics/field_effects/pics/deoxys_rock_fragment_top_left.4bpp");
+static const u8 sRockFragment_TopRight[] = INCBIN_U8("graphics/field_effects/pics/deoxys_rock_fragment_top_right.4bpp");
+static const u8 sRockFragment_BottomLeft[] = INCBIN_U8("graphics/field_effects/pics/deoxys_rock_fragment_bottom_left.4bpp");
+static const u8 sRockFragment_BottomRight[] = INCBIN_U8("graphics/field_effects/pics/deoxys_rock_fragment_bottom_right.4bpp");
bool8 (*const gFieldEffectScriptFuncs[])(u8 **, u32 *) =
{
@@ -2619,7 +2620,7 @@ static void FieldMoveShowMonOutdoorsEffect_LoadGfx(struct Task *task)
u16 delta = ((REG_BG0CNT >> 8) << 11);
CpuCopy16(sFieldMoveStreaksOutdoors_Gfx, (void *)(VRAM + offset), 0x200);
CpuFill32(0, (void *)(VRAM + delta), 0x800);
- LoadPalette(sFieldMoveStreaksOutdoors_Pal, 0xf0, 0x20);
+ LoadPalette(sFieldMoveStreaksOutdoors_Pal, 0xf0, sizeof(sFieldMoveStreaksOutdoors_Pal));
LoadFieldMoveOutdoorStreaksTilemap(delta);
task->tState++;
}
@@ -2782,7 +2783,7 @@ static void FieldMoveShowMonIndoorsEffect_LoadGfx(struct Task *task)
task->data[12] = delta;
CpuCopy16(sFieldMoveStreaksIndoors_Gfx, (void *)(VRAM + offset), 0x80);
CpuFill32(0, (void *)(VRAM + delta), 0x800);
- LoadPalette(sFieldMoveStreaksIndoors_Pal, 0xf0, 0x20);
+ LoadPalette(sFieldMoveStreaksIndoors_Pal, 0xf0, sizeof(sFieldMoveStreaksIndoors_Pal));
task->tState++;
}
diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c
index 0acb158637..65617038d1 100755
--- a/src/field_effect_helpers.c
+++ b/src/field_effect_helpers.c
@@ -359,7 +359,7 @@ void UpdateTallGrassFieldEffect(struct Sprite *sprite)
|| objectEvent->previousCoords.y != sprite->sY))
sprite->sObjectMoved = TRUE;
- // Metatile behavior var re-used
+ // Metatile behavior var re-used as subpriority
metatileBehavior = 0;
if (sprite->animCmdIndex == 0)
metatileBehavior = 4;
@@ -423,7 +423,7 @@ u32 FldEff_LongGrass(void)
{
sprite = &gSprites[spriteId];
sprite->coordOffsetEnabled = TRUE;
- sprite->oam.priority = ZCoordToPriority(gFieldEffectArguments[2]);
+ sprite->oam.priority = ElevationToPriority(gFieldEffectArguments[2]);
sprite->sElevation = gFieldEffectArguments[2];
sprite->sX = gFieldEffectArguments[0];
sprite->sY = gFieldEffectArguments[1];
@@ -1108,7 +1108,7 @@ void SynchroniseSurfPosition(struct ObjectEvent *playerObj, struct Sprite *sprit
for (i = DIR_SOUTH; i <= DIR_EAST; i++, x = sprite->data[6], y = sprite->data[7])
{
MoveCoords(i, &x, &y);
- if (MapGridGetZCoordAt(x, y) == 3)
+ if (MapGridGetElevationAt(x, y) == 3)
{
sprite->data[5]++;
break;
@@ -1646,7 +1646,7 @@ void UpdateJumpImpactEffect(struct Sprite *sprite)
else
{
UpdateObjectEventSpriteInvisibility(sprite, FALSE);
- SetObjectSubpriorityByZCoord(sprite->sElevation, sprite, 0);
+ SetObjectSubpriorityByElevation(sprite->sElevation, sprite, 0);
}
}
@@ -1658,14 +1658,14 @@ void WaitFieldEffectSpriteAnim(struct Sprite *sprite)
UpdateObjectEventSpriteInvisibility(sprite, FALSE);
}
-static void UpdateGrassFieldEffectSubpriority(struct Sprite *sprite, u8 z, u8 offset)
+static void UpdateGrassFieldEffectSubpriority(struct Sprite *sprite, u8 elevation, u8 subpriority)
{
u8 i;
s16 var, xhi, lyhi, yhi, ylo;
const struct ObjectEventGraphicsInfo *graphicsInfo; // Unused Variable
struct Sprite *linkedSprite;
- SetObjectSubpriorityByZCoord(z, sprite, offset);
+ SetObjectSubpriorityByElevation(elevation, sprite, subpriority);
for (i = 0; i < OBJECT_EVENTS_COUNT; i ++)
{
struct ObjectEvent *objectEvent = &gObjectEvents[i];
diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c
index 6458ced2ed..418fa7948e 100644
--- a/src/field_player_avatar.c
+++ b/src/field_player_avatar.c
@@ -30,6 +30,9 @@
#include "constants/songs.h"
#include "constants/trainer_types.h"
+#define NUM_FORCED_MOVEMENTS 18
+#define NUM_ACRO_BIKE_COLLISIONS 5
+
static EWRAM_DATA u8 sSpinStartFacingDir = 0;
EWRAM_DATA struct ObjectEvent gObjectEvents[OBJECT_EVENTS_COUNT] = {};
EWRAM_DATA struct PlayerAvatar gPlayerAvatar = {};
@@ -139,9 +142,7 @@ static void AlignFishingAnimationFrames(void);
static u8 TrySpinPlayerForWarp(struct ObjectEvent *object, s16 *a1);
-// .rodata
-
-static bool8 (*const sForcedMovementTestFuncs[])(u8) =
+static bool8 (*const sForcedMovementTestFuncs[NUM_FORCED_MOVEMENTS])(u8) =
{
MetatileBehavior_IsTrickHouseSlipperyFloor,
MetatileBehavior_IsIce_2,
@@ -163,7 +164,8 @@ static bool8 (*const sForcedMovementTestFuncs[])(u8) =
MetatileBehavior_IsMuddySlope,
};
-static bool8 (*const sForcedMovementFuncs[])(void) =
+// + 1 for ForcedMovement_None, which is excluded above
+static bool8 (*const sForcedMovementFuncs[NUM_FORCED_MOVEMENTS + 1])(void) =
{
ForcedMovement_None,
ForcedMovement_Slip,
@@ -188,12 +190,12 @@ static bool8 (*const sForcedMovementFuncs[])(void) =
static void (*const sPlayerNotOnBikeFuncs[])(u8, u16) =
{
- PlayerNotOnBikeNotMoving,
- PlayerNotOnBikeTurningInPlace,
- PlayerNotOnBikeMoving,
+ [NOT_MOVING] = PlayerNotOnBikeNotMoving,
+ [TURN_DIRECTION] = PlayerNotOnBikeTurningInPlace,
+ [MOVING] = PlayerNotOnBikeMoving,
};
-static bool8 (*const sAcroBikeTrickMetatiles[])(u8) =
+static bool8 (*const sAcroBikeTrickMetatiles[NUM_ACRO_BIKE_COLLISIONS])(u8) =
{
MetatileBehavior_IsBumpySlope,
MetatileBehavior_IsIsolatedVerticalRail,
@@ -202,7 +204,7 @@ static bool8 (*const sAcroBikeTrickMetatiles[])(u8) =
MetatileBehavior_IsHorizontalRail,
};
-static const u8 sAcroBikeTrickCollisionTypes[] = {
+static const u8 sAcroBikeTrickCollisionTypes[NUM_ACRO_BIKE_COLLISIONS] = {
COLLISION_WHEELIE_HOP,
COLLISION_ISOLATED_VERTICAL_RAIL,
COLLISION_ISOLATED_HORIZONTAL_RAIL,
@@ -232,33 +234,41 @@ static bool8 (*const sArrowWarpMetatileBehaviorChecks[])(u8) =
static const u8 sRivalAvatarGfxIds[][2] =
{
- {OBJ_EVENT_GFX_RIVAL_BRENDAN_NORMAL, OBJ_EVENT_GFX_RIVAL_MAY_NORMAL},
- {OBJ_EVENT_GFX_RIVAL_BRENDAN_MACH_BIKE, OBJ_EVENT_GFX_RIVAL_MAY_MACH_BIKE},
- {OBJ_EVENT_GFX_RIVAL_BRENDAN_ACRO_BIKE, OBJ_EVENT_GFX_RIVAL_MAY_ACRO_BIKE},
- {OBJ_EVENT_GFX_RIVAL_BRENDAN_SURFING, OBJ_EVENT_GFX_RIVAL_MAY_SURFING},
- {OBJ_EVENT_GFX_BRENDAN_UNDERWATER, OBJ_EVENT_GFX_MAY_UNDERWATER},
- {OBJ_EVENT_GFX_RIVAL_BRENDAN_FIELD_MOVE, OBJ_EVENT_GFX_RIVAL_MAY_FIELD_MOVE},
- {OBJ_EVENT_GFX_BRENDAN_FISHING, OBJ_EVENT_GFX_MAY_FISHING},
- {OBJ_EVENT_GFX_BRENDAN_WATERING, OBJ_EVENT_GFX_MAY_WATERING}
+ [PLAYER_AVATAR_STATE_NORMAL] = {OBJ_EVENT_GFX_RIVAL_BRENDAN_NORMAL, OBJ_EVENT_GFX_RIVAL_MAY_NORMAL},
+ [PLAYER_AVATAR_STATE_MACH_BIKE] = {OBJ_EVENT_GFX_RIVAL_BRENDAN_MACH_BIKE, OBJ_EVENT_GFX_RIVAL_MAY_MACH_BIKE},
+ [PLAYER_AVATAR_STATE_ACRO_BIKE] = {OBJ_EVENT_GFX_RIVAL_BRENDAN_ACRO_BIKE, OBJ_EVENT_GFX_RIVAL_MAY_ACRO_BIKE},
+ [PLAYER_AVATAR_STATE_SURFING] = {OBJ_EVENT_GFX_RIVAL_BRENDAN_SURFING, OBJ_EVENT_GFX_RIVAL_MAY_SURFING},
+ [PLAYER_AVATAR_STATE_UNDERWATER] = {OBJ_EVENT_GFX_BRENDAN_UNDERWATER, OBJ_EVENT_GFX_MAY_UNDERWATER},
+ [PLAYER_AVATAR_STATE_FIELD_MOVE] = {OBJ_EVENT_GFX_RIVAL_BRENDAN_FIELD_MOVE, OBJ_EVENT_GFX_RIVAL_MAY_FIELD_MOVE},
+ [PLAYER_AVATAR_STATE_FISHING] = {OBJ_EVENT_GFX_BRENDAN_FISHING, OBJ_EVENT_GFX_MAY_FISHING},
+ [PLAYER_AVATAR_STATE_WATERING] = {OBJ_EVENT_GFX_BRENDAN_WATERING, OBJ_EVENT_GFX_MAY_WATERING}
};
static const u8 sPlayerAvatarGfxIds[][2] =
{
- {OBJ_EVENT_GFX_BRENDAN_NORMAL, OBJ_EVENT_GFX_MAY_NORMAL},
- {OBJ_EVENT_GFX_BRENDAN_MACH_BIKE, OBJ_EVENT_GFX_MAY_MACH_BIKE},
- {OBJ_EVENT_GFX_BRENDAN_ACRO_BIKE, OBJ_EVENT_GFX_MAY_ACRO_BIKE},
- {OBJ_EVENT_GFX_BRENDAN_SURFING, OBJ_EVENT_GFX_MAY_SURFING},
- {OBJ_EVENT_GFX_BRENDAN_UNDERWATER, OBJ_EVENT_GFX_MAY_UNDERWATER},
- {OBJ_EVENT_GFX_BRENDAN_FIELD_MOVE, OBJ_EVENT_GFX_MAY_FIELD_MOVE},
- {OBJ_EVENT_GFX_BRENDAN_FISHING, OBJ_EVENT_GFX_MAY_FISHING},
- {OBJ_EVENT_GFX_BRENDAN_WATERING, OBJ_EVENT_GFX_MAY_WATERING},
+ [PLAYER_AVATAR_STATE_NORMAL] = {OBJ_EVENT_GFX_BRENDAN_NORMAL, OBJ_EVENT_GFX_MAY_NORMAL},
+ [PLAYER_AVATAR_STATE_MACH_BIKE] = {OBJ_EVENT_GFX_BRENDAN_MACH_BIKE, OBJ_EVENT_GFX_MAY_MACH_BIKE},
+ [PLAYER_AVATAR_STATE_ACRO_BIKE] = {OBJ_EVENT_GFX_BRENDAN_ACRO_BIKE, OBJ_EVENT_GFX_MAY_ACRO_BIKE},
+ [PLAYER_AVATAR_STATE_SURFING] = {OBJ_EVENT_GFX_BRENDAN_SURFING, OBJ_EVENT_GFX_MAY_SURFING},
+ [PLAYER_AVATAR_STATE_UNDERWATER] = {OBJ_EVENT_GFX_BRENDAN_UNDERWATER, OBJ_EVENT_GFX_MAY_UNDERWATER},
+ [PLAYER_AVATAR_STATE_FIELD_MOVE] = {OBJ_EVENT_GFX_BRENDAN_FIELD_MOVE, OBJ_EVENT_GFX_MAY_FIELD_MOVE},
+ [PLAYER_AVATAR_STATE_FISHING] = {OBJ_EVENT_GFX_BRENDAN_FISHING, OBJ_EVENT_GFX_MAY_FISHING},
+ [PLAYER_AVATAR_STATE_WATERING] = {OBJ_EVENT_GFX_BRENDAN_WATERING, OBJ_EVENT_GFX_MAY_WATERING},
};
-static const u8 sFRLGAvatarGfxIds[] = {OBJ_EVENT_GFX_RED, OBJ_EVENT_GFX_LEAF};
+static const u8 sFRLGAvatarGfxIds[GENDER_COUNT] =
+{
+ [MALE] = OBJ_EVENT_GFX_RED,
+ [FEMALE] = OBJ_EVENT_GFX_LEAF
+};
-static const u8 sRSAvatarGfxIds[] = {OBJ_EVENT_GFX_LINK_RS_BRENDAN, OBJ_EVENT_GFX_LINK_RS_MAY};
+static const u8 sRSAvatarGfxIds[GENDER_COUNT] =
+{
+ [MALE] = OBJ_EVENT_GFX_LINK_RS_BRENDAN,
+ [FEMALE] = OBJ_EVENT_GFX_LINK_RS_MAY
+};
-static const u8 sPlayerAvatarGfxToStateFlag[2][5][2] =
+static const u8 sPlayerAvatarGfxToStateFlag[GENDER_COUNT][5][2] =
{
[MALE] =
{
@@ -306,8 +316,6 @@ static bool8 (*const sPlayerAvatarSecretBaseMatSpin[])(struct Task *, struct Obj
PlayerAvatar_SecretBaseMatSpinStep3,
};
-// .text
-
void MovementType_Player(struct Sprite *sprite)
{
UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->data[0]], sprite, ObjectEventCB2_NoMovement2);
@@ -406,7 +414,7 @@ static u8 GetForcedMovementByMetatileBehavior(void)
{
u8 metatileBehavior = gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior;
- for (i = 0; i < 18; i++)
+ for (i = 0; i < NUM_FORCED_MOVEMENTS; i++)
{
if (sForcedMovementTestFuncs[i](metatileBehavior))
return i + 1;
@@ -429,7 +437,7 @@ static bool8 ForcedMovement_None(void)
return FALSE;
}
-static u8 DoForcedMovement(u8 direction, void (*b)(u8))
+static bool8 DoForcedMovement(u8 direction, void (*moveFunc)(u8))
{
struct PlayerAvatar *playerAvatar = &gPlayerAvatar;
u8 collision = CheckForPlayerAvatarCollision(direction);
@@ -440,7 +448,7 @@ static u8 DoForcedMovement(u8 direction, void (*b)(u8))
ForcedMovement_None();
if (collision < COLLISION_STOP_SURFING)
{
- return 0;
+ return FALSE;
}
else
{
@@ -448,23 +456,23 @@ static u8 DoForcedMovement(u8 direction, void (*b)(u8))
PlayerJumpLedge(direction);
playerAvatar->flags |= PLAYER_AVATAR_FLAG_FORCED_MOVE;
playerAvatar->runningState = MOVING;
- return 1;
+ return TRUE;
}
}
else
{
playerAvatar->runningState = MOVING;
- b(direction);
- return 1;
+ moveFunc(direction);
+ return TRUE;
}
}
-static u8 DoForcedMovementInCurrentDirection(void (*a)(u8))
+static bool8 DoForcedMovementInCurrentDirection(void (*moveFunc)(u8))
{
struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
playerObjEvent->disableAnim = TRUE;
- return DoForcedMovement(playerObjEvent->movementDirection, a);
+ return DoForcedMovement(playerObjEvent->movementDirection, moveFunc);
}
static bool8 ForcedMovement_Slip(void)
@@ -512,13 +520,13 @@ static bool8 ForcedMovement_PushedEastByCurrent(void)
return DoForcedMovement(DIR_EAST, PlayerRideWaterCurrent);
}
-static u8 ForcedMovement_Slide(u8 direction, void (*b)(u8))
+static bool8 ForcedMovement_Slide(u8 direction, void (*moveFunc)(u8))
{
struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
playerObjEvent->disableAnim = TRUE;
playerObjEvent->facingDirectionLocked = TRUE;
- return DoForcedMovement(direction, b);
+ return DoForcedMovement(direction, moveFunc);
}
static bool8 ForcedMovement_SlideSouth(void)
@@ -557,7 +565,7 @@ static bool8 ForcedMovement_MuddySlope(void)
{
struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId];
- if (playerObjEvent->movementDirection != DIR_NORTH || GetPlayerSpeed() <= 3)
+ if (playerObjEvent->movementDirection != DIR_NORTH || GetPlayerSpeed() < PLAYER_SPEED_FASTEST)
{
Bike_UpdateBikeCounterSpeed(0);
playerObjEvent->facingDirectionLocked = TRUE;
@@ -577,20 +585,11 @@ static void MovePlayerNotOnBike(u8 direction, u16 heldKeys)
static u8 CheckMovementInputNotOnBike(u8 direction)
{
if (direction == DIR_NONE)
- {
- gPlayerAvatar.runningState = NOT_MOVING;
- return 0;
- }
+ return gPlayerAvatar.runningState = NOT_MOVING;
else if (direction != GetPlayerMovementDirection() && gPlayerAvatar.runningState != MOVING)
- {
- gPlayerAvatar.runningState = TURN_DIRECTION;
- return 1;
- }
+ return gPlayerAvatar.runningState = TURN_DIRECTION;
else
- {
- gPlayerAvatar.runningState = MOVING;
- return 2;
- }
+ return gPlayerAvatar.runningState = MOVING;
}
static void PlayerNotOnBikeNotMoving(u8 direction, u16 heldKeys)
@@ -709,8 +708,8 @@ static u8 CheckForObjectEventStaticCollision(struct ObjectEvent *objectEvent, s1
static bool8 CanStopSurfing(s16 x, s16 y, u8 direction)
{
if ((gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING)
- && MapGridGetZCoordAt(x, y) == 3
- && GetObjectEventIdByXYZ(x, y, 3) == OBJECT_EVENTS_COUNT)
+ && MapGridGetElevationAt(x, y) == 3
+ && GetObjectEventIdByPosition(x, y, 3) == OBJECT_EVENTS_COUNT)
{
CreateStopSurfingTask(direction);
return TRUE;
@@ -735,13 +734,13 @@ static bool8 TryPushBoulder(s16 x, s16 y, u8 direction)
{
u8 objectEventId = GetObjectEventIdByXY(x, y);
- if (objectEventId != 16 && gObjectEvents[objectEventId].graphicsId == OBJ_EVENT_GFX_PUSHABLE_BOULDER)
+ if (objectEventId != OBJECT_EVENTS_COUNT && gObjectEvents[objectEventId].graphicsId == OBJ_EVENT_GFX_PUSHABLE_BOULDER)
{
x = gObjectEvents[objectEventId].currentCoords.x;
y = gObjectEvents[objectEventId].currentCoords.y;
MoveCoords(direction, &x, &y);
if (GetCollisionAtCoords(&gObjectEvents[objectEventId], x, y, direction) == COLLISION_NONE
- && MetatileBehavior_IsNonAnimDoor(MapGridGetMetatileBehaviorAt(x, y)) == 0)
+ && MetatileBehavior_IsNonAnimDoor(MapGridGetMetatileBehaviorAt(x, y)) == FALSE)
{
StartStrengthAnim(objectEventId, direction);
return TRUE;
@@ -755,7 +754,7 @@ static void CheckAcroBikeCollision(s16 x, s16 y, u8 metatileBehavior, u8 *collis
{
u8 i;
- for (i = 0; i < ARRAY_COUNT(sAcroBikeTrickMetatiles); i++)
+ for (i = 0; i < NUM_ACRO_BIKE_COLLISIONS; i++)
{
if (sAcroBikeTrickMetatiles[i](metatileBehavior))
{
@@ -1169,7 +1168,7 @@ u8 GetPlayerMovementDirection(void)
return gObjectEvents[gPlayerAvatar.objectEventId].movementDirection;
}
-u8 PlayerGetZCoord(void)
+u8 PlayerGetElevation(void)
{
return gObjectEvents[gPlayerAvatar.objectEventId].previousElevation;
}
@@ -1307,7 +1306,7 @@ bool8 IsPlayerFacingSurfableFishableWater(void)
MoveCoords(playerObjEvent->facingDirection, &x, &y);
if (GetCollisionAtCoords(playerObjEvent, x, y, playerObjEvent->facingDirection) == COLLISION_ELEVATION_MISMATCH
- && PlayerGetZCoord() == 3
+ && PlayerGetElevation() == 3
&& MetatileBehavior_IsSurfableFishableWater(MapGridGetMetatileBehaviorAt(x, y)))
return TRUE;
else
diff --git a/src/field_specials.c b/src/field_specials.c
index 96eb949e55..a4cdafafc2 100644
--- a/src/field_specials.c
+++ b/src/field_specials.c
@@ -193,59 +193,40 @@ static void DetermineCyclingRoadResults(u32 numFrames, u8 numBikeCollisions)
result = 0;
if (numBikeCollisions == 0)
- {
result = 5;
- }
else if (numBikeCollisions < 4)
- {
result = 4;
- }
else if (numBikeCollisions < 10)
- {
result = 3;
- }
else if (numBikeCollisions < 20)
- {
result = 2;
- }
else if (numBikeCollisions < 100)
- {
result = 1;
- }
if (numFrames / 60 <= 10)
- {
result += 5;
- }
else if (numFrames / 60 <= 15)
- {
result += 4;
- }
else if (numFrames / 60 <= 20)
- {
result += 3;
- }
else if (numFrames / 60 <= 40)
- {
result += 2;
- }
else if (numFrames / 60 < 60)
- {
result += 1;
- }
-
gSpecialVar_Result = result;
}
-void FinishCyclingRoadChallenge(void) {
+void FinishCyclingRoadChallenge(void)
+{
const u32 numFrames = gMain.vblankCounter1 - sBikeCyclingTimer;
DetermineCyclingRoadResults(numFrames, gBikeCollisions);
RecordCyclingRoadResults(numFrames, gBikeCollisions);
}
-static void RecordCyclingRoadResults(u32 numFrames, u8 numBikeCollisions) {
+static void RecordCyclingRoadResults(u32 numFrames, u8 numBikeCollisions)
+{
u16 low = VarGet(VAR_CYCLING_ROAD_RECORD_TIME_L);
u16 high = VarGet(VAR_CYCLING_ROAD_RECORD_TIME_H);
u32 framesRecord = low + (high << 16);
@@ -258,25 +239,23 @@ static void RecordCyclingRoadResults(u32 numFrames, u8 numBikeCollisions) {
}
}
-u16 GetRecordedCyclingRoadResults(void) {
+u16 GetRecordedCyclingRoadResults(void)
+{
u16 low = VarGet(VAR_CYCLING_ROAD_RECORD_TIME_L);
u16 high = VarGet(VAR_CYCLING_ROAD_RECORD_TIME_H);
u32 framesRecord = low + (high << 16);
if (framesRecord == 0)
- {
return FALSE;
- }
DetermineCyclingRoadResults(framesRecord, VarGet(VAR_CYCLING_ROAD_RECORD_COLLISIONS));
return TRUE;
}
-void UpdateCyclingRoadState(void) {
+void UpdateCyclingRoadState(void)
+{
if (gLastUsedWarp.mapNum == MAP_NUM(ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE) && gLastUsedWarp.mapGroup == MAP_GROUP(ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE))
- {
return;
- }
if (VarGet(VAR_CYCLING_CHALLENGE_STATE) == 2 || VarGet(VAR_CYCLING_CHALLENGE_STATE) == 3)
{
@@ -300,9 +279,8 @@ void ResetSSTidalFlag(void)
bool32 CountSSTidalStep(u16 delta)
{
if (!FlagGet(FLAG_SYS_CRUISE_MODE) || (*GetVarPointer(VAR_CRUISE_STEP_COUNT) += delta) < SS_TIDAL_MAX_STEPS)
- {
return FALSE;
- }
+
return TRUE;
}
@@ -311,51 +289,52 @@ u8 GetSSTidalLocation(s8 *mapGroup, s8 *mapNum, s16 *x, s16 *y)
u16 *varCruiseStepCount = GetVarPointer(VAR_CRUISE_STEP_COUNT);
switch (*GetVarPointer(VAR_SS_TIDAL_STATE))
{
- case SS_TIDAL_BOARD_SLATEPORT:
- case SS_TIDAL_LAND_SLATEPORT:
- return SS_TIDAL_LOCATION_SLATEPORT;
- case SS_TIDAL_HALFWAY_LILYCOVE:
- case SS_TIDAL_EXIT_CURRENTS_RIGHT:
- return SS_TIDAL_LOCATION_ROUTE131;
- case SS_TIDAL_LAND_LILYCOVE:
- case SS_TIDAL_BOARD_LILYCOVE:
- return SS_TIDAL_LOCATION_LILYCOVE;
- case SS_TIDAL_DEPART_LILYCOVE:
- case SS_TIDAL_EXIT_CURRENTS_LEFT:
- return SS_TIDAL_LOCATION_ROUTE124;
- case SS_TIDAL_DEPART_SLATEPORT:
- if (*varCruiseStepCount < 60)
- {
- *mapNum = MAP_NUM(ROUTE134);
- *x = *varCruiseStepCount + 19;
- }
- else if (*varCruiseStepCount < 140)
- {
- *mapNum = MAP_NUM(ROUTE133);
- *x = *varCruiseStepCount - 60;
- }
- else
- {
- *mapNum = MAP_NUM(ROUTE132);
- *x = *varCruiseStepCount - 140;
- }
- break;
- case SS_TIDAL_HALFWAY_SLATEPORT:
- if (*varCruiseStepCount < 66)
- {
- *mapNum = MAP_NUM(ROUTE132);
- *x = 65 - *varCruiseStepCount;
- }
- else if (*varCruiseStepCount < 146) {
- *mapNum = MAP_NUM(ROUTE133);
- *x = 145 - *varCruiseStepCount;
- }
- else
- {
- *mapNum = MAP_NUM(ROUTE134);
- *x = 224 - *varCruiseStepCount;
- }
- break;
+ case SS_TIDAL_BOARD_SLATEPORT:
+ case SS_TIDAL_LAND_SLATEPORT:
+ return SS_TIDAL_LOCATION_SLATEPORT;
+ case SS_TIDAL_HALFWAY_LILYCOVE:
+ case SS_TIDAL_EXIT_CURRENTS_RIGHT:
+ return SS_TIDAL_LOCATION_ROUTE131;
+ case SS_TIDAL_LAND_LILYCOVE:
+ case SS_TIDAL_BOARD_LILYCOVE:
+ return SS_TIDAL_LOCATION_LILYCOVE;
+ case SS_TIDAL_DEPART_LILYCOVE:
+ case SS_TIDAL_EXIT_CURRENTS_LEFT:
+ return SS_TIDAL_LOCATION_ROUTE124;
+ case SS_TIDAL_DEPART_SLATEPORT:
+ if (*varCruiseStepCount < 60)
+ {
+ *mapNum = MAP_NUM(ROUTE134);
+ *x = *varCruiseStepCount + 19;
+ }
+ else if (*varCruiseStepCount < 140)
+ {
+ *mapNum = MAP_NUM(ROUTE133);
+ *x = *varCruiseStepCount - 60;
+ }
+ else
+ {
+ *mapNum = MAP_NUM(ROUTE132);
+ *x = *varCruiseStepCount - 140;
+ }
+ break;
+ case SS_TIDAL_HALFWAY_SLATEPORT:
+ if (*varCruiseStepCount < 66)
+ {
+ *mapNum = MAP_NUM(ROUTE132);
+ *x = 65 - *varCruiseStepCount;
+ }
+ else if (*varCruiseStepCount < 146)
+ {
+ *mapNum = MAP_NUM(ROUTE133);
+ *x = 145 - *varCruiseStepCount;
+ }
+ else
+ {
+ *mapNum = MAP_NUM(ROUTE134);
+ *x = 224 - *varCruiseStepCount;
+ }
+ break;
}
*mapGroup = MAP_GROUP(ROUTE132);
*y = 20;
@@ -368,17 +347,15 @@ bool32 ShouldDoWallyCall(void)
{
switch (gMapHeader.mapType)
{
- case MAP_TYPE_TOWN:
- case MAP_TYPE_CITY:
- case MAP_TYPE_ROUTE:
- case MAP_TYPE_OCEAN_ROUTE:
- if (++(*GetVarPointer(VAR_WALLY_CALL_STEP_COUNTER)) < 250)
- {
- return FALSE;
- }
- break;
- default:
+ case MAP_TYPE_TOWN:
+ case MAP_TYPE_CITY:
+ case MAP_TYPE_ROUTE:
+ case MAP_TYPE_OCEAN_ROUTE:
+ if (++(*GetVarPointer(VAR_WALLY_CALL_STEP_COUNTER)) < 250)
return FALSE;
+ break;
+ default:
+ return FALSE;
}
}
else
@@ -395,17 +372,15 @@ bool32 ShouldDoScottFortreeCall(void)
{
switch (gMapHeader.mapType)
{
- case MAP_TYPE_TOWN:
- case MAP_TYPE_CITY:
- case MAP_TYPE_ROUTE:
- case MAP_TYPE_OCEAN_ROUTE:
- if (++(*GetVarPointer(VAR_SCOTT_FORTREE_CALL_STEP_COUNTER)) < 10)
- {
- return FALSE;
- }
- break;
- default:
+ case MAP_TYPE_TOWN:
+ case MAP_TYPE_CITY:
+ case MAP_TYPE_ROUTE:
+ case MAP_TYPE_OCEAN_ROUTE:
+ if (++(*GetVarPointer(VAR_SCOTT_FORTREE_CALL_STEP_COUNTER)) < 10)
return FALSE;
+ break;
+ default:
+ return FALSE;
}
}
else
@@ -422,17 +397,15 @@ bool32 ShouldDoScottBattleFrontierCall(void)
{
switch (gMapHeader.mapType)
{
- case MAP_TYPE_TOWN:
- case MAP_TYPE_CITY:
- case MAP_TYPE_ROUTE:
- case MAP_TYPE_OCEAN_ROUTE:
- if (++(*GetVarPointer(VAR_SCOTT_BF_CALL_STEP_COUNTER)) < 10)
- {
- return FALSE;
- }
- break;
- default:
+ case MAP_TYPE_TOWN:
+ case MAP_TYPE_CITY:
+ case MAP_TYPE_ROUTE:
+ case MAP_TYPE_OCEAN_ROUTE:
+ if (++(*GetVarPointer(VAR_SCOTT_BF_CALL_STEP_COUNTER)) < 10)
return FALSE;
+ break;
+ default:
+ return FALSE;
}
}
else
@@ -449,17 +422,15 @@ bool32 ShouldDoRoxanneCall(void)
{
switch (gMapHeader.mapType)
{
- case MAP_TYPE_TOWN:
- case MAP_TYPE_CITY:
- case MAP_TYPE_ROUTE:
- case MAP_TYPE_OCEAN_ROUTE:
- if (++(*GetVarPointer(VAR_ROXANNE_CALL_STEP_COUNTER)) < 250)
- {
- return FALSE;
- }
- break;
- default:
+ case MAP_TYPE_TOWN:
+ case MAP_TYPE_CITY:
+ case MAP_TYPE_ROUTE:
+ case MAP_TYPE_OCEAN_ROUTE:
+ if (++(*GetVarPointer(VAR_ROXANNE_CALL_STEP_COUNTER)) < 250)
return FALSE;
+ break;
+ default:
+ return FALSE;
}
}
else
@@ -476,17 +447,15 @@ bool32 ShouldDoRivalRayquazaCall(void)
{
switch (gMapHeader.mapType)
{
- case MAP_TYPE_TOWN:
- case MAP_TYPE_CITY:
- case MAP_TYPE_ROUTE:
- case MAP_TYPE_OCEAN_ROUTE:
- if (++(*GetVarPointer(VAR_RIVAL_RAYQUAZA_CALL_STEP_COUNTER)) < 250)
- {
- return FALSE;
- }
- break;
- default:
+ case MAP_TYPE_TOWN:
+ case MAP_TYPE_CITY:
+ case MAP_TYPE_ROUTE:
+ case MAP_TYPE_OCEAN_ROUTE:
+ if (++(*GetVarPointer(VAR_RIVAL_RAYQUAZA_CALL_STEP_COUNTER)) < 250)
return FALSE;
+ break;
+ default:
+ return FALSE;
}
}
else
@@ -540,24 +509,24 @@ void SpawnLinkPartnerObjectEvent(void)
playerFacingDirection = GetPlayerFacingDirection();
switch (playerFacingDirection)
{
- case DIR_WEST:
- j = 2;
- x = gSaveBlock1Ptr->pos.x - 1;
- y = gSaveBlock1Ptr->pos.y;
- break;
- case DIR_NORTH:
- j = 1;
- x = gSaveBlock1Ptr->pos.x;
- y = gSaveBlock1Ptr->pos.y - 1;
- break;
- case DIR_EAST:
- x = gSaveBlock1Ptr->pos.x + 1;
- y = gSaveBlock1Ptr->pos.y;
- break;
- case DIR_SOUTH:
- j = 3;
- x = gSaveBlock1Ptr->pos.x;
- y = gSaveBlock1Ptr->pos.y + 1;
+ case DIR_WEST:
+ j = 2;
+ x = gSaveBlock1Ptr->pos.x - 1;
+ y = gSaveBlock1Ptr->pos.y;
+ break;
+ case DIR_NORTH:
+ j = 1;
+ x = gSaveBlock1Ptr->pos.x;
+ y = gSaveBlock1Ptr->pos.y - 1;
+ break;
+ case DIR_EAST:
+ x = gSaveBlock1Ptr->pos.x + 1;
+ y = gSaveBlock1Ptr->pos.y;
+ break;
+ case DIR_SOUTH:
+ j = 3;
+ x = gSaveBlock1Ptr->pos.x;
+ y = gSaveBlock1Ptr->pos.y + 1;
}
for (i = 0; i < gSpecialVar_0x8004; i++)
{
@@ -565,33 +534,31 @@ void SpawnLinkPartnerObjectEvent(void)
{
switch ((u8)gLinkPlayers[i].version)
{
- case VERSION_RUBY:
- case VERSION_SAPPHIRE:
- if (gLinkPlayers[i].gender == 0)
- linkSpriteId = OBJ_EVENT_GFX_LINK_RS_BRENDAN;
- else
- linkSpriteId = OBJ_EVENT_GFX_LINK_RS_MAY;
- break;
- case VERSION_EMERALD:
- if (gLinkPlayers[i].gender == 0)
- linkSpriteId = OBJ_EVENT_GFX_RIVAL_BRENDAN_NORMAL;
- else
- linkSpriteId = OBJ_EVENT_GFX_RIVAL_MAY_NORMAL;
- break;
- default:
- if (gLinkPlayers[i].gender == 0)
- linkSpriteId = OBJ_EVENT_GFX_RIVAL_BRENDAN_NORMAL;
- else
- linkSpriteId = OBJ_EVENT_GFX_RIVAL_MAY_NORMAL;
- break;
+ case VERSION_RUBY:
+ case VERSION_SAPPHIRE:
+ if (gLinkPlayers[i].gender == 0)
+ linkSpriteId = OBJ_EVENT_GFX_LINK_RS_BRENDAN;
+ else
+ linkSpriteId = OBJ_EVENT_GFX_LINK_RS_MAY;
+ break;
+ case VERSION_EMERALD:
+ if (gLinkPlayers[i].gender == 0)
+ linkSpriteId = OBJ_EVENT_GFX_RIVAL_BRENDAN_NORMAL;
+ else
+ linkSpriteId = OBJ_EVENT_GFX_RIVAL_MAY_NORMAL;
+ break;
+ default:
+ if (gLinkPlayers[i].gender == 0)
+ linkSpriteId = OBJ_EVENT_GFX_RIVAL_BRENDAN_NORMAL;
+ else
+ linkSpriteId = OBJ_EVENT_GFX_RIVAL_MAY_NORMAL;
+ break;
}
SpawnSpecialObjectEventParameterized(linkSpriteId, movementTypes[j], 240 - i, coordOffsets[j][0] + x + MAP_OFFSET, coordOffsets[j][1] + y + MAP_OFFSET, 0);
LoadLinkPartnerObjectEventSpritePalette(linkSpriteId, 240 - i, i);
j++;
if (j == MAX_LINK_PLAYERS)
- {
j = 0;
- }
}
}
}
@@ -664,84 +631,84 @@ void MauvilleGymSetDefaultBarriers(void)
{
switch (MapGridGetMetatileIdAt(x, y))
{
- case METATILE_MauvilleGym_GreenBeamH1_On:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamH1_Off);
- break;
- case METATILE_MauvilleGym_GreenBeamH2_On:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamH2_Off);
- break;
- case METATILE_MauvilleGym_GreenBeamH3_On:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamH3_Off);
- break;
- case METATILE_MauvilleGym_GreenBeamH4_On:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamH4_Off);
- break;
- case METATILE_MauvilleGym_GreenBeamH1_Off:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamH1_On);
- break;
- case METATILE_MauvilleGym_GreenBeamH2_Off:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamH2_On);
- break;
- case METATILE_MauvilleGym_GreenBeamH3_Off:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamH3_On | METATILE_COLLISION_MASK);
- break;
- case METATILE_MauvilleGym_GreenBeamH4_Off:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamH4_On | METATILE_COLLISION_MASK);
- break;
- case METATILE_MauvilleGym_RedBeamH1_On:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamH1_Off);
- break;
- case METATILE_MauvilleGym_RedBeamH2_On:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamH2_Off);
- break;
- case METATILE_MauvilleGym_RedBeamH3_On:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamH3_Off);
- break;
- case METATILE_MauvilleGym_RedBeamH4_On:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamH4_Off);
- break;
- case METATILE_MauvilleGym_RedBeamH1_Off:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamH1_On);
- break;
- case METATILE_MauvilleGym_RedBeamH2_Off:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamH2_On);
- break;
- case METATILE_MauvilleGym_RedBeamH3_Off:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamH3_On | METATILE_COLLISION_MASK);
- break;
- case METATILE_MauvilleGym_RedBeamH4_Off:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamH4_On | METATILE_COLLISION_MASK);
- break;
- case METATILE_MauvilleGym_GreenBeamV1_On:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_PoleBottom_On | METATILE_COLLISION_MASK);
- break;
- case METATILE_MauvilleGym_GreenBeamV2_On:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_FloorTile);
- break;
- case METATILE_MauvilleGym_RedBeamV1_On:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_PoleBottom_Off | METATILE_COLLISION_MASK);
- break;
- case METATILE_MauvilleGym_RedBeamV2_On:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_FloorTile);
- break;
- case METATILE_MauvilleGym_PoleBottom_On:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamV1_On | METATILE_COLLISION_MASK);
- break;
- case METATILE_MauvilleGym_FloorTile:
- if (MapGridGetMetatileIdAt(x, y - 1) == METATILE_MauvilleGym_GreenBeamV1_On)
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamV2_On | METATILE_COLLISION_MASK);
- else
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamV2_On | METATILE_COLLISION_MASK);
- break;
- case METATILE_MauvilleGym_PoleBottom_Off:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamV1_On | METATILE_COLLISION_MASK);
- break;
- case METATILE_MauvilleGym_PoleTop_Off:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_PoleTop_On | METATILE_COLLISION_MASK);
- break;
- case METATILE_MauvilleGym_PoleTop_On:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_PoleTop_Off);
- break;
+ case METATILE_MauvilleGym_GreenBeamH1_On:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamH1_Off);
+ break;
+ case METATILE_MauvilleGym_GreenBeamH2_On:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamH2_Off);
+ break;
+ case METATILE_MauvilleGym_GreenBeamH3_On:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamH3_Off);
+ break;
+ case METATILE_MauvilleGym_GreenBeamH4_On:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamH4_Off);
+ break;
+ case METATILE_MauvilleGym_GreenBeamH1_Off:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamH1_On);
+ break;
+ case METATILE_MauvilleGym_GreenBeamH2_Off:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamH2_On);
+ break;
+ case METATILE_MauvilleGym_GreenBeamH3_Off:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamH3_On | MAPGRID_COLLISION_MASK);
+ break;
+ case METATILE_MauvilleGym_GreenBeamH4_Off:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamH4_On | MAPGRID_COLLISION_MASK);
+ break;
+ case METATILE_MauvilleGym_RedBeamH1_On:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamH1_Off);
+ break;
+ case METATILE_MauvilleGym_RedBeamH2_On:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamH2_Off);
+ break;
+ case METATILE_MauvilleGym_RedBeamH3_On:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamH3_Off);
+ break;
+ case METATILE_MauvilleGym_RedBeamH4_On:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamH4_Off);
+ break;
+ case METATILE_MauvilleGym_RedBeamH1_Off:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamH1_On);
+ break;
+ case METATILE_MauvilleGym_RedBeamH2_Off:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamH2_On);
+ break;
+ case METATILE_MauvilleGym_RedBeamH3_Off:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamH3_On | MAPGRID_COLLISION_MASK);
+ break;
+ case METATILE_MauvilleGym_RedBeamH4_Off:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamH4_On | MAPGRID_COLLISION_MASK);
+ break;
+ case METATILE_MauvilleGym_GreenBeamV1_On:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_PoleBottom_On | MAPGRID_COLLISION_MASK);
+ break;
+ case METATILE_MauvilleGym_GreenBeamV2_On:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_FloorTile);
+ break;
+ case METATILE_MauvilleGym_RedBeamV1_On:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_PoleBottom_Off | MAPGRID_COLLISION_MASK);
+ break;
+ case METATILE_MauvilleGym_RedBeamV2_On:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_FloorTile);
+ break;
+ case METATILE_MauvilleGym_PoleBottom_On:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamV1_On | MAPGRID_COLLISION_MASK);
+ break;
+ case METATILE_MauvilleGym_FloorTile:
+ if (MapGridGetMetatileIdAt(x, y - 1) == METATILE_MauvilleGym_GreenBeamV1_On)
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamV2_On | MAPGRID_COLLISION_MASK);
+ else
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamV2_On | MAPGRID_COLLISION_MASK);
+ break;
+ case METATILE_MauvilleGym_PoleBottom_Off:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamV1_On | MAPGRID_COLLISION_MASK);
+ break;
+ case METATILE_MauvilleGym_PoleTop_Off:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_PoleTop_On | MAPGRID_COLLISION_MASK);
+ break;
+ case METATILE_MauvilleGym_PoleTop_On:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_PoleTop_Off);
+ break;
}
}
}
@@ -763,43 +730,43 @@ void MauvilleGymDeactivatePuzzle(void)
{
switch (MapGridGetMetatileIdAt(x, y))
{
- case METATILE_MauvilleGym_GreenBeamH1_On:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamH1_Off);
- break;
- case METATILE_MauvilleGym_GreenBeamH2_On:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamH2_Off);
- break;
- case METATILE_MauvilleGym_GreenBeamH3_On:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamH3_Off);
- break;
- case METATILE_MauvilleGym_GreenBeamH4_On:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamH4_Off);
- break;
- case METATILE_MauvilleGym_RedBeamH1_On:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamH1_Off);
- break;
- case METATILE_MauvilleGym_RedBeamH2_On:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamH2_Off);
- break;
- case METATILE_MauvilleGym_RedBeamH3_On:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamH3_Off);
- break;
- case METATILE_MauvilleGym_RedBeamH4_On:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamH4_Off);
- break;
- case METATILE_MauvilleGym_GreenBeamV1_On:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_PoleBottom_On | METATILE_COLLISION_MASK);
- break;
- case METATILE_MauvilleGym_RedBeamV1_On:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_PoleBottom_Off | METATILE_COLLISION_MASK);
- break;
- case METATILE_MauvilleGym_GreenBeamV2_On:
- case METATILE_MauvilleGym_RedBeamV2_On:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_FloorTile);
- break;
- case METATILE_MauvilleGym_PoleTop_On:
- MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_PoleTop_Off);
- break;
+ case METATILE_MauvilleGym_GreenBeamH1_On:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamH1_Off);
+ break;
+ case METATILE_MauvilleGym_GreenBeamH2_On:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamH2_Off);
+ break;
+ case METATILE_MauvilleGym_GreenBeamH3_On:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamH3_Off);
+ break;
+ case METATILE_MauvilleGym_GreenBeamH4_On:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_GreenBeamH4_Off);
+ break;
+ case METATILE_MauvilleGym_RedBeamH1_On:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamH1_Off);
+ break;
+ case METATILE_MauvilleGym_RedBeamH2_On:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamH2_Off);
+ break;
+ case METATILE_MauvilleGym_RedBeamH3_On:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamH3_Off);
+ break;
+ case METATILE_MauvilleGym_RedBeamH4_On:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_RedBeamH4_Off);
+ break;
+ case METATILE_MauvilleGym_GreenBeamV1_On:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_PoleBottom_On | MAPGRID_COLLISION_MASK);
+ break;
+ case METATILE_MauvilleGym_RedBeamV1_On:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_PoleBottom_Off | MAPGRID_COLLISION_MASK);
+ break;
+ case METATILE_MauvilleGym_GreenBeamV2_On:
+ case METATILE_MauvilleGym_RedBeamV2_On:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_FloorTile);
+ break;
+ case METATILE_MauvilleGym_PoleTop_On:
+ MapGridSetMetatileIdAt(x, y, METATILE_MauvilleGym_PoleTop_Off);
+ break;
}
}
}
@@ -849,59 +816,59 @@ static void PetalburgGymSetDoorMetatiles(u8 roomNumber, u16 metatileId)
u8 nDoors = 0;
switch (roomNumber)
{
- case 1:
- nDoors = 2;
- doorCoordsX[0] = 1;
- doorCoordsX[1] = 7;
- doorCoordsY[0] = 104;
- doorCoordsY[1] = 104;
- break;
- case 2:
- nDoors = 2;
- doorCoordsX[0] = 1;
- doorCoordsX[1] = 7;
- doorCoordsY[0] = 78;
- doorCoordsY[1] = 78;
- break;
- case 3:
- nDoors = 2;
- doorCoordsX[0] = 1;
- doorCoordsX[1] = 7;
- doorCoordsY[0] = 91;
- doorCoordsY[1] = 91;
- break;
- case 4:
- nDoors = 1;
- doorCoordsX[0] = 7;
- doorCoordsY[0] = 39;
- break;
- case 5:
- nDoors = 2;
- doorCoordsX[0] = 1;
- doorCoordsX[1] = 7;
- doorCoordsY[0] = 52;
- doorCoordsY[1] = 52;
- break;
- case 6:
- nDoors = 1;
- doorCoordsX[0] = 1;
- doorCoordsY[0] = 65;
- break;
- case 7:
- nDoors = 1;
- doorCoordsX[0] = 7;
- doorCoordsY[0] = 13;
- break;
- case 8:
- nDoors = 1;
- doorCoordsX[0] = 1;
- doorCoordsY[0] = 26;
- break;
+ case 1:
+ nDoors = 2;
+ doorCoordsX[0] = 1;
+ doorCoordsX[1] = 7;
+ doorCoordsY[0] = 104;
+ doorCoordsY[1] = 104;
+ break;
+ case 2:
+ nDoors = 2;
+ doorCoordsX[0] = 1;
+ doorCoordsX[1] = 7;
+ doorCoordsY[0] = 78;
+ doorCoordsY[1] = 78;
+ break;
+ case 3:
+ nDoors = 2;
+ doorCoordsX[0] = 1;
+ doorCoordsX[1] = 7;
+ doorCoordsY[0] = 91;
+ doorCoordsY[1] = 91;
+ break;
+ case 4:
+ nDoors = 1;
+ doorCoordsX[0] = 7;
+ doorCoordsY[0] = 39;
+ break;
+ case 5:
+ nDoors = 2;
+ doorCoordsX[0] = 1;
+ doorCoordsX[1] = 7;
+ doorCoordsY[0] = 52;
+ doorCoordsY[1] = 52;
+ break;
+ case 6:
+ nDoors = 1;
+ doorCoordsX[0] = 1;
+ doorCoordsY[0] = 65;
+ break;
+ case 7:
+ nDoors = 1;
+ doorCoordsX[0] = 7;
+ doorCoordsY[0] = 13;
+ break;
+ case 8:
+ nDoors = 1;
+ doorCoordsX[0] = 1;
+ doorCoordsY[0] = 26;
+ break;
}
for (i = 0; i < nDoors; i++)
{
- MapGridSetMetatileIdAt(doorCoordsX[i] + MAP_OFFSET, doorCoordsY[i] + MAP_OFFSET, metatileId | METATILE_COLLISION_MASK);
- MapGridSetMetatileIdAt(doorCoordsX[i] + MAP_OFFSET, doorCoordsY[i] + MAP_OFFSET + 1, (metatileId + 8) | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(doorCoordsX[i] + MAP_OFFSET, doorCoordsY[i] + MAP_OFFSET, metatileId | MAPGRID_COLLISION_MASK);
+ MapGridSetMetatileIdAt(doorCoordsX[i] + MAP_OFFSET, doorCoordsY[i] + MAP_OFFSET + 1, (metatileId + 8) | MAPGRID_COLLISION_MASK);
}
DrawWholeMapView();
}
@@ -930,25 +897,17 @@ u8 GetPlayerTrainerIdOnesDigit(void)
void GetPlayerBigGuyGirlString(void)
{
if (gSaveBlock2Ptr->playerGender == MALE)
- {
StringCopy(gStringVar1, gText_BigGuy);
- }
else
- {
StringCopy(gStringVar1, gText_BigGirl);
- }
}
void GetRivalSonDaughterString(void)
{
if (gSaveBlock2Ptr->playerGender == MALE)
- {
StringCopy(gStringVar1, gText_Daughter);
- }
else
- {
StringCopy(gStringVar1, gText_Son);
- }
}
u8 GetBattleOutcome(void)
@@ -973,9 +932,8 @@ u16 GetWeekCount(void)
{
u16 weekCount = gLocalTime.days / 7;
if (weekCount > 9999)
- {
weekCount = 9999;
- }
+
return weekCount;
}
@@ -983,29 +941,18 @@ u8 GetLeadMonFriendshipScore(void)
{
struct Pokemon *pokemon = &gPlayerParty[GetLeadMonIndex()];
if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) == MAX_FRIENDSHIP)
- {
return 6;
- }
if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 200)
- {
return 5;
- }
if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 150)
- {
return 4;
- }
if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 100)
- {
return 3;
- }
if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 50)
- {
return 2;
- }
if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 1)
- {
return 1;
- }
+
return 0;
}
@@ -1036,9 +983,7 @@ static void Task_PCTurnOnEffect(u8 taskId)
{
struct Task *task = &gTasks[taskId];
if (task->data[0] == 0)
- {
PCTurnOnEffect_0(task);
- }
}
static void PCTurnOnEffect_0(struct Task *task)
@@ -1052,26 +997,24 @@ static void PCTurnOnEffect_0(struct Task *task)
playerDirection = GetPlayerFacingDirection();
switch (playerDirection)
{
- case DIR_NORTH:
- dx = 0;
- dy = -1;
- break;
- case DIR_WEST:
- dx = -1;
- dy = -1;
- break;
- case DIR_EAST:
- dx = 1;
- dy = -1;
- break;
+ case DIR_NORTH:
+ dx = 0;
+ dy = -1;
+ break;
+ case DIR_WEST:
+ dx = -1;
+ dy = -1;
+ break;
+ case DIR_EAST:
+ dx = 1;
+ dy = -1;
+ break;
}
PCTurnOnEffect_1(task->data[4], dx, dy);
DrawWholeMapView();
task->data[4] ^= 1;
if ((++task->data[2]) == 5)
- {
DestroyTask(task->data[1]);
- }
}
task->data[3]++;
}
@@ -1082,34 +1025,22 @@ static void PCTurnOnEffect_1(s16 isPcTurnedOn, s8 dx, s8 dy)
if (isPcTurnedOn)
{
if (gSpecialVar_0x8004 == PC_LOCATION_OTHER)
- {
tileId = METATILE_Building_PC_Off;
- }
else if (gSpecialVar_0x8004 == PC_LOCATION_BRENDANS_HOUSE)
- {
tileId = METATILE_BrendansMaysHouse_BrendanPC_Off;
- }
else if (gSpecialVar_0x8004 == PC_LOCATION_MAYS_HOUSE)
- {
tileId = METATILE_BrendansMaysHouse_MayPC_Off;
- }
}
else
{
if (gSpecialVar_0x8004 == PC_LOCATION_OTHER)
- {
tileId = METATILE_Building_PC_On;
- }
else if (gSpecialVar_0x8004 == PC_LOCATION_BRENDANS_HOUSE)
- {
tileId = METATILE_BrendansMaysHouse_BrendanPC_On;
- }
else if (gSpecialVar_0x8004 == PC_LOCATION_MAYS_HOUSE)
- {
tileId = METATILE_BrendansMaysHouse_MayPC_On;
- }
}
- MapGridSetMetatileIdAt(gSaveBlock1Ptr->pos.x + dx + MAP_OFFSET, gSaveBlock1Ptr->pos.y + dy + MAP_OFFSET, tileId | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(gSaveBlock1Ptr->pos.x + dx + MAP_OFFSET, gSaveBlock1Ptr->pos.y + dy + MAP_OFFSET, tileId | MAPGRID_COLLISION_MASK);
}
void DoPCTurnOffEffect(void)
@@ -1125,32 +1056,26 @@ static void PCTurnOffEffect(void)
u8 playerDirection = GetPlayerFacingDirection();
switch (playerDirection)
{
- case DIR_NORTH:
- dx = 0;
- dy = -1;
- break;
- case DIR_WEST:
- dx = -1;
- dy = -1;
- break;
- case DIR_EAST:
- dx = 1;
- dy = -1;
- break;
+ case DIR_NORTH:
+ dx = 0;
+ dy = -1;
+ break;
+ case DIR_WEST:
+ dx = -1;
+ dy = -1;
+ break;
+ case DIR_EAST:
+ dx = 1;
+ dy = -1;
+ break;
}
- if (gSpecialVar_0x8004 == 0)
- {
+ if (gSpecialVar_0x8004 == PC_LOCATION_OTHER)
tileId = METATILE_Building_PC_Off;
- }
- else if (gSpecialVar_0x8004 == 1)
- {
+ else if (gSpecialVar_0x8004 == PC_LOCATION_BRENDANS_HOUSE)
tileId = METATILE_BrendansMaysHouse_BrendanPC_Off;
- }
- else if (gSpecialVar_0x8004 == 2)
- {
+ else if (gSpecialVar_0x8004 == PC_LOCATION_MAYS_HOUSE)
tileId = METATILE_BrendansMaysHouse_MayPC_Off;
- }
- MapGridSetMetatileIdAt(gSaveBlock1Ptr->pos.x + dx + MAP_OFFSET, gSaveBlock1Ptr->pos.y + dy + MAP_OFFSET, tileId | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(gSaveBlock1Ptr->pos.x + dx + MAP_OFFSET, gSaveBlock1Ptr->pos.y + dy + MAP_OFFSET, tileId | MAPGRID_COLLISION_MASK);
DrawWholeMapView();
}
@@ -1171,9 +1096,7 @@ static void Task_LotteryCornerComputerEffect(u8 taskId)
{
struct Task *task = &gTasks[taskId];
if (task->data[0] == 0)
- {
LotteryCornerComputerEffect(task);
- }
}
static void LotteryCornerComputerEffect(struct Task *task)
@@ -1183,28 +1106,26 @@ static void LotteryCornerComputerEffect(struct Task *task)
task->data[3] = 0;
if (task->data[4] != 0)
{
- MapGridSetMetatileIdAt(11 + MAP_OFFSET, 1 + MAP_OFFSET, METATILE_Shop_Laptop1_Normal | METATILE_COLLISION_MASK);
- MapGridSetMetatileIdAt(11 + MAP_OFFSET, 2 + MAP_OFFSET, METATILE_Shop_Laptop2_Normal | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(11 + MAP_OFFSET, 1 + MAP_OFFSET, METATILE_Shop_Laptop1_Normal | MAPGRID_COLLISION_MASK);
+ MapGridSetMetatileIdAt(11 + MAP_OFFSET, 2 + MAP_OFFSET, METATILE_Shop_Laptop2_Normal | MAPGRID_COLLISION_MASK);
}
else
{
- MapGridSetMetatileIdAt(11 + MAP_OFFSET, 1 + MAP_OFFSET, METATILE_Shop_Laptop1_Flash | METATILE_COLLISION_MASK);
- MapGridSetMetatileIdAt(11 + MAP_OFFSET, 2 + MAP_OFFSET, METATILE_Shop_Laptop2_Flash | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(11 + MAP_OFFSET, 1 + MAP_OFFSET, METATILE_Shop_Laptop1_Flash | MAPGRID_COLLISION_MASK);
+ MapGridSetMetatileIdAt(11 + MAP_OFFSET, 2 + MAP_OFFSET, METATILE_Shop_Laptop2_Flash | MAPGRID_COLLISION_MASK);
}
DrawWholeMapView();
task->data[4] ^= 1;
if ((++task->data[2]) == 5)
- {
DestroyTask(task->data[1]);
- }
}
task->data[3]++;
}
void EndLotteryCornerComputerEffect(void)
{
- MapGridSetMetatileIdAt(11 + MAP_OFFSET, 1 + MAP_OFFSET, METATILE_Shop_Laptop1_Normal | METATILE_COLLISION_MASK);
- MapGridSetMetatileIdAt(11 + MAP_OFFSET, 2 + MAP_OFFSET, METATILE_Shop_Laptop2_Normal | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(11 + MAP_OFFSET, 1 + MAP_OFFSET, METATILE_Shop_Laptop1_Normal | MAPGRID_COLLISION_MASK);
+ MapGridSetMetatileIdAt(11 + MAP_OFFSET, 2 + MAP_OFFSET, METATILE_Shop_Laptop2_Normal | MAPGRID_COLLISION_MASK);
DrawWholeMapView();
}
@@ -1227,45 +1148,40 @@ void ResetTrickHouseNuggetFlag(void)
bool8 CheckLeadMonCool(void)
{
if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_COOL) < 200)
- {
return FALSE;
- }
+
return TRUE;
}
bool8 CheckLeadMonBeauty(void)
{
if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_BEAUTY) < 200)
- {
return FALSE;
- }
+
return TRUE;
}
bool8 CheckLeadMonCute(void)
{
if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_CUTE) < 200)
- {
return FALSE;
- }
+
return TRUE;
}
bool8 CheckLeadMonSmart(void)
{
if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SMART) < 200)
- {
return FALSE;
- }
+
return TRUE;
}
bool8 CheckLeadMonTough(void)
{
if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_TOUGH) < 200)
- {
return FALSE;
- }
+
return TRUE;
}
@@ -1373,9 +1289,8 @@ bool8 FoundAbandonedShipRoom1Key(void)
u16 flag = FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_1_KEY;
*specVar = flag;
if (!FlagGet(flag))
- {
return FALSE;
- }
+
return TRUE;
}
@@ -1385,9 +1300,8 @@ bool8 FoundAbandonedShipRoom2Key(void)
u16 flag = FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_2_KEY;
*specVar = flag;
if (!FlagGet(flag))
- {
return FALSE;
- }
+
return TRUE;
}
@@ -1397,9 +1311,8 @@ bool8 FoundAbandonedShipRoom4Key(void)
u16 flag = FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_4_KEY;
*specVar = flag;
if (!FlagGet(flag))
- {
return FALSE;
- }
+
return TRUE;
}
@@ -1409,9 +1322,8 @@ bool8 FoundAbandonedShipRoom6Key(void)
u16 flag = FLAG_HIDDEN_ITEM_ABANDONED_SHIP_RM_6_KEY;
*specVar = flag;
if (!FlagGet(flag))
- {
return FALSE;
- }
+
return TRUE;
}
@@ -1430,17 +1342,14 @@ void GiveLeadMonEffortRibbon(void)
leadMon = &gPlayerParty[GetLeadMonIndex()];
SetMonData(leadMon, MON_DATA_EFFORT_RIBBON, &ribbonSet);
if (GetRibbonCount(leadMon) > NUM_CUTIES_RIBBONS)
- {
TryPutSpotTheCutiesOnAir(leadMon, MON_DATA_EFFORT_RIBBON);
- }
}
bool8 Special_AreLeadMonEVsMaxedOut(void)
{
if (GetMonEVCount(&gPlayerParty[GetLeadMonIndex()]) >= MAX_TOTAL_EVS)
- {
return TRUE;
- }
+
return FALSE;
}
@@ -1491,9 +1400,7 @@ bool8 IsStarterInParty(void)
for (i = 0; i < partyCount; i++)
{
if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL) == starter)
- {
return TRUE;
- }
}
return FALSE;
}
@@ -1506,9 +1413,8 @@ bool8 ScriptCheckFreePokemonStorageSpace(void)
bool8 IsPokerusInParty(void)
{
if (!CheckPartyPokerus(gPlayerParty, 0x3f))
- {
return FALSE;
- }
+
return TRUE;
}
@@ -1586,9 +1492,7 @@ u8 GetLeadMonIndex(void)
for (i = 0; i < partyCount; i++)
{
if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL) != SPECIES_EGG && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL) != 0)
- {
return i;
- }
}
return 0;
}
@@ -1608,13 +1512,10 @@ u16 GetDaysUntilPacifidlogTMAvailable(void)
{
u16 tmReceivedDay = VarGet(VAR_PACIFIDLOG_TM_RECEIVED_DAY);
if (gLocalTime.days - tmReceivedDay >= 7)
- {
return 0;
- }
else if (gLocalTime.days < 0)
- {
return 8;
- }
+
return 7 - (gLocalTime.days - tmReceivedDay);
}
@@ -1675,18 +1576,18 @@ u16 GetMysteryGiftCardStat(void)
{
switch (gSpecialVar_Result)
{
- case GET_NUM_STAMPS:
- return MysteryGift_GetCardStat(CARD_STAT_NUM_STAMPS);
- case GET_MAX_STAMPS:
- return MysteryGift_GetCardStat(CARD_STAT_MAX_STAMPS);
- case GET_CARD_BATTLES_WON:
- return MysteryGift_GetCardStat(CARD_STAT_BATTLES_WON);
- case GET_CARD_BATTLES_LOST: // Never occurs
- return MysteryGift_GetCardStat(CARD_STAT_BATTLES_LOST);
- case GET_CARD_NUM_TRADES: // Never occurs
- return MysteryGift_GetCardStat(CARD_STAT_NUM_TRADES);
- default:
- return 0;
+ case GET_NUM_STAMPS:
+ return MysteryGift_GetCardStat(CARD_STAT_NUM_STAMPS);
+ case GET_MAX_STAMPS:
+ return MysteryGift_GetCardStat(CARD_STAT_MAX_STAMPS);
+ case GET_CARD_BATTLES_WON:
+ return MysteryGift_GetCardStat(CARD_STAT_BATTLES_WON);
+ case GET_CARD_BATTLES_LOST: // Never occurs
+ return MysteryGift_GetCardStat(CARD_STAT_BATTLES_LOST);
+ case GET_CARD_NUM_TRADES: // Never occurs
+ return MysteryGift_GetCardStat(CARD_STAT_NUM_TRADES);
+ default:
+ return 0;
}
}
@@ -1804,27 +1705,27 @@ void SetDeptStoreFloor(void)
u8 deptStoreFloor;
switch (gSaveBlock1Ptr->dynamicWarp.mapNum)
{
- case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_1F):
- deptStoreFloor = DEPT_STORE_FLOORNUM_1F;
- break;
- case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_2F):
- deptStoreFloor = DEPT_STORE_FLOORNUM_2F;
- break;
- case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_3F):
- deptStoreFloor = DEPT_STORE_FLOORNUM_3F;
- break;
- case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_4F):
- deptStoreFloor = DEPT_STORE_FLOORNUM_4F;
- break;
- case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_5F):
- deptStoreFloor = DEPT_STORE_FLOORNUM_5F;
- break;
- case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP):
- deptStoreFloor = DEPT_STORE_FLOORNUM_ROOFTOP;
- break;
- default:
- deptStoreFloor = DEPT_STORE_FLOORNUM_1F;
- break;
+ case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_1F):
+ deptStoreFloor = DEPT_STORE_FLOORNUM_1F;
+ break;
+ case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_2F):
+ deptStoreFloor = DEPT_STORE_FLOORNUM_2F;
+ break;
+ case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_3F):
+ deptStoreFloor = DEPT_STORE_FLOORNUM_3F;
+ break;
+ case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_4F):
+ deptStoreFloor = DEPT_STORE_FLOORNUM_4F;
+ break;
+ case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_5F):
+ deptStoreFloor = DEPT_STORE_FLOORNUM_5F;
+ break;
+ case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP):
+ deptStoreFloor = DEPT_STORE_FLOORNUM_ROOFTOP;
+ break;
+ default:
+ deptStoreFloor = DEPT_STORE_FLOORNUM_1F;
+ break;
}
VarSet(VAR_DEPT_STORE_FLOOR, deptStoreFloor);
}
@@ -1838,26 +1739,26 @@ u16 GetDeptStoreDefaultFloorChoice(void)
{
switch (gSaveBlock1Ptr->dynamicWarp.mapNum)
{
- case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_5F):
- sLilycoveDeptStore_NeverRead = 0;
- sLilycoveDeptStore_DefaultFloorChoice = 0;
- break;
- case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_4F):
- sLilycoveDeptStore_NeverRead = 0;
- sLilycoveDeptStore_DefaultFloorChoice = 1;
- break;
- case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_3F):
- sLilycoveDeptStore_NeverRead = 0;
- sLilycoveDeptStore_DefaultFloorChoice = 2;
- break;
- case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_2F):
- sLilycoveDeptStore_NeverRead = 0;
- sLilycoveDeptStore_DefaultFloorChoice = 3;
- break;
- case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_1F):
- sLilycoveDeptStore_NeverRead = 0;
- sLilycoveDeptStore_DefaultFloorChoice = 4;
- break;
+ case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_5F):
+ sLilycoveDeptStore_NeverRead = 0;
+ sLilycoveDeptStore_DefaultFloorChoice = 0;
+ break;
+ case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_4F):
+ sLilycoveDeptStore_NeverRead = 0;
+ sLilycoveDeptStore_DefaultFloorChoice = 1;
+ break;
+ case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_3F):
+ sLilycoveDeptStore_NeverRead = 0;
+ sLilycoveDeptStore_DefaultFloorChoice = 2;
+ break;
+ case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_2F):
+ sLilycoveDeptStore_NeverRead = 0;
+ sLilycoveDeptStore_DefaultFloorChoice = 3;
+ break;
+ case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_1F):
+ sLilycoveDeptStore_NeverRead = 0;
+ sLilycoveDeptStore_DefaultFloorChoice = 4;
+ break;
}
}
@@ -1969,22 +1870,24 @@ static void Task_MoveElevatorWindowLights(u8 taskId)
if (data[2] == FALSE)
{
for (y = 0; y < 3; y++)
+ {
for (x = 0; x < 3; x++)
- MapGridSetMetatileIdAt(x + MAP_OFFSET + 1, y + MAP_OFFSET, sElevatorWindowTiles_Ascending[y][data[0] % 3] | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(x + MAP_OFFSET + 1, y + MAP_OFFSET, sElevatorWindowTiles_Ascending[y][data[0] % 3] | MAPGRID_COLLISION_MASK);
+ }
}
// descending
else
{
for (y = 0; y < 3; y++)
+ {
for (x = 0; x < 3; x++)
- MapGridSetMetatileIdAt(x + MAP_OFFSET + 1, y + MAP_OFFSET, sElevatorWindowTiles_Descending[y][data[0] % 3] | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(x + MAP_OFFSET + 1, y + MAP_OFFSET, sElevatorWindowTiles_Descending[y][data[0] % 3] | MAPGRID_COLLISION_MASK);
+ }
}
DrawWholeMapView();
data[1] = 0;
if (data[0] == data[3])
- {
DestroyTask(taskId);
- }
}
data[1]++;
}
@@ -2004,9 +1907,7 @@ void BufferVarsForIVRater(void)
gSpecialVar_0x8005 = 0;
for (i = 0; i < NUM_STATS; i++)
- {
gSpecialVar_0x8005 += ivStorage[i];
- }
gSpecialVar_0x8006 = 0;
gSpecialVar_0x8007 = ivStorage[STAT_HP];
@@ -2070,9 +1971,8 @@ bool8 UsedPokemonCenterWarp(void)
bool32 PlayerNotAtTrainerHillEntrance(void)
{
if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(TRAINER_HILL_ENTRANCE) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_HILL_ENTRANCE))
- {
return FALSE;
- }
+
return TRUE;
}
@@ -2169,86 +2069,58 @@ void ShowFrontierManiacMessage(void)
switch (facility)
{
- case FRONTIER_MANIAC_TOWER_SINGLES:
- case FRONTIER_MANIAC_TOWER_DOUBLES:
- case FRONTIER_MANIAC_TOWER_MULTIS:
- case FRONTIER_MANIAC_TOWER_LINK:
- if (gSaveBlock2Ptr->frontier.towerWinStreaks[facility][FRONTIER_LVL_50]
- >= gSaveBlock2Ptr->frontier.towerWinStreaks[facility][FRONTIER_LVL_OPEN])
- {
- winStreak = gSaveBlock2Ptr->frontier.towerWinStreaks[facility][FRONTIER_LVL_50];
- }
- else
- {
- winStreak = gSaveBlock2Ptr->frontier.towerWinStreaks[facility][FRONTIER_LVL_OPEN];
- }
- break;
- case FRONTIER_MANIAC_DOME:
- if (gSaveBlock2Ptr->frontier.domeWinStreaks[FRONTIER_MODE_SINGLES][FRONTIER_LVL_50]
- >= gSaveBlock2Ptr->frontier.domeWinStreaks[FRONTIER_MODE_SINGLES][FRONTIER_LVL_OPEN])
- {
- winStreak = gSaveBlock2Ptr->frontier.domeWinStreaks[FRONTIER_MODE_SINGLES][FRONTIER_LVL_50];
- }
- else
- {
- winStreak = gSaveBlock2Ptr->frontier.domeWinStreaks[FRONTIER_MODE_SINGLES][FRONTIER_LVL_OPEN];
- }
- break;
- case FRONTIER_MANIAC_FACTORY:
- if (gSaveBlock2Ptr->frontier.factoryWinStreaks[FRONTIER_MODE_SINGLES][FRONTIER_LVL_50]
- >= gSaveBlock2Ptr->frontier.factoryWinStreaks[FRONTIER_MODE_SINGLES][FRONTIER_LVL_OPEN])
- {
- winStreak = gSaveBlock2Ptr->frontier.factoryWinStreaks[FRONTIER_MODE_SINGLES][FRONTIER_LVL_50];
- }
- else
- {
- winStreak = gSaveBlock2Ptr->frontier.factoryWinStreaks[FRONTIER_MODE_SINGLES][FRONTIER_LVL_OPEN];
- }
- break;
- case FRONTIER_MANIAC_PALACE:
- if (gSaveBlock2Ptr->frontier.palaceWinStreaks[FRONTIER_MODE_SINGLES][FRONTIER_LVL_50]
- >= gSaveBlock2Ptr->frontier.palaceWinStreaks[FRONTIER_MODE_SINGLES][FRONTIER_LVL_OPEN])
- {
- winStreak = gSaveBlock2Ptr->frontier.palaceWinStreaks[FRONTIER_MODE_SINGLES][FRONTIER_LVL_50];
- }
- else
- {
- winStreak = gSaveBlock2Ptr->frontier.palaceWinStreaks[FRONTIER_MODE_SINGLES][FRONTIER_LVL_OPEN];
- }
- break;
- case FRONTIER_MANIAC_ARENA:
- if (gSaveBlock2Ptr->frontier.arenaWinStreaks[FRONTIER_LVL_50]
- >= gSaveBlock2Ptr->frontier.arenaWinStreaks[FRONTIER_LVL_OPEN])
- {
- winStreak = gSaveBlock2Ptr->frontier.arenaWinStreaks[FRONTIER_LVL_50];
- }
- else
- {
- winStreak = gSaveBlock2Ptr->frontier.arenaWinStreaks[FRONTIER_LVL_OPEN];
- }
- break;
- case FRONTIER_MANIAC_PIKE:
- if (gSaveBlock2Ptr->frontier.pikeWinStreaks[FRONTIER_LVL_50]
- >= gSaveBlock2Ptr->frontier.pikeWinStreaks[FRONTIER_LVL_OPEN])
- {
- winStreak = gSaveBlock2Ptr->frontier.pikeWinStreaks[FRONTIER_LVL_50];
- }
- else
- {
- winStreak = gSaveBlock2Ptr->frontier.pikeWinStreaks[FRONTIER_LVL_OPEN];
- }
- break;
- case FRONTIER_MANIAC_PYRAMID:
- if (gSaveBlock2Ptr->frontier.pyramidWinStreaks[FRONTIER_LVL_50]
- >= gSaveBlock2Ptr->frontier.pyramidWinStreaks[FRONTIER_LVL_OPEN])
- {
- winStreak = gSaveBlock2Ptr->frontier.pyramidWinStreaks[FRONTIER_LVL_50];
- }
- else
- {
- winStreak = gSaveBlock2Ptr->frontier.pyramidWinStreaks[FRONTIER_LVL_OPEN];
- }
- break;
+ case FRONTIER_MANIAC_TOWER_SINGLES:
+ case FRONTIER_MANIAC_TOWER_DOUBLES:
+ case FRONTIER_MANIAC_TOWER_MULTIS:
+ case FRONTIER_MANIAC_TOWER_LINK:
+ if (gSaveBlock2Ptr->frontier.towerWinStreaks[facility][FRONTIER_LVL_50]
+ >= gSaveBlock2Ptr->frontier.towerWinStreaks[facility][FRONTIER_LVL_OPEN])
+ winStreak = gSaveBlock2Ptr->frontier.towerWinStreaks[facility][FRONTIER_LVL_50];
+ else
+ winStreak = gSaveBlock2Ptr->frontier.towerWinStreaks[facility][FRONTIER_LVL_OPEN];
+ break;
+ case FRONTIER_MANIAC_DOME:
+ if (gSaveBlock2Ptr->frontier.domeWinStreaks[FRONTIER_MODE_SINGLES][FRONTIER_LVL_50]
+ >= gSaveBlock2Ptr->frontier.domeWinStreaks[FRONTIER_MODE_SINGLES][FRONTIER_LVL_OPEN])
+ winStreak = gSaveBlock2Ptr->frontier.domeWinStreaks[FRONTIER_MODE_SINGLES][FRONTIER_LVL_50];
+ else
+ winStreak = gSaveBlock2Ptr->frontier.domeWinStreaks[FRONTIER_MODE_SINGLES][FRONTIER_LVL_OPEN];
+ break;
+ case FRONTIER_MANIAC_FACTORY:
+ if (gSaveBlock2Ptr->frontier.factoryWinStreaks[FRONTIER_MODE_SINGLES][FRONTIER_LVL_50]
+ >= gSaveBlock2Ptr->frontier.factoryWinStreaks[FRONTIER_MODE_SINGLES][FRONTIER_LVL_OPEN])
+ winStreak = gSaveBlock2Ptr->frontier.factoryWinStreaks[FRONTIER_MODE_SINGLES][FRONTIER_LVL_50];
+ else
+ winStreak = gSaveBlock2Ptr->frontier.factoryWinStreaks[FRONTIER_MODE_SINGLES][FRONTIER_LVL_OPEN];
+ break;
+ case FRONTIER_MANIAC_PALACE:
+ if (gSaveBlock2Ptr->frontier.palaceWinStreaks[FRONTIER_MODE_SINGLES][FRONTIER_LVL_50]
+ >= gSaveBlock2Ptr->frontier.palaceWinStreaks[FRONTIER_MODE_SINGLES][FRONTIER_LVL_OPEN])
+ winStreak = gSaveBlock2Ptr->frontier.palaceWinStreaks[FRONTIER_MODE_SINGLES][FRONTIER_LVL_50];
+ else
+ winStreak = gSaveBlock2Ptr->frontier.palaceWinStreaks[FRONTIER_MODE_SINGLES][FRONTIER_LVL_OPEN];
+ break;
+ case FRONTIER_MANIAC_ARENA:
+ if (gSaveBlock2Ptr->frontier.arenaWinStreaks[FRONTIER_LVL_50]
+ >= gSaveBlock2Ptr->frontier.arenaWinStreaks[FRONTIER_LVL_OPEN])
+ winStreak = gSaveBlock2Ptr->frontier.arenaWinStreaks[FRONTIER_LVL_50];
+ else
+ winStreak = gSaveBlock2Ptr->frontier.arenaWinStreaks[FRONTIER_LVL_OPEN];
+ break;
+ case FRONTIER_MANIAC_PIKE:
+ if (gSaveBlock2Ptr->frontier.pikeWinStreaks[FRONTIER_LVL_50]
+ >= gSaveBlock2Ptr->frontier.pikeWinStreaks[FRONTIER_LVL_OPEN])
+ winStreak = gSaveBlock2Ptr->frontier.pikeWinStreaks[FRONTIER_LVL_50];
+ else
+ winStreak = gSaveBlock2Ptr->frontier.pikeWinStreaks[FRONTIER_LVL_OPEN];
+ break;
+ case FRONTIER_MANIAC_PYRAMID:
+ if (gSaveBlock2Ptr->frontier.pyramidWinStreaks[FRONTIER_LVL_50]
+ >= gSaveBlock2Ptr->frontier.pyramidWinStreaks[FRONTIER_LVL_OPEN])
+ winStreak = gSaveBlock2Ptr->frontier.pyramidWinStreaks[FRONTIER_LVL_50];
+ else
+ winStreak = gSaveBlock2Ptr->frontier.pyramidWinStreaks[FRONTIER_LVL_OPEN];
+ break;
}
for (i = 0; i < FRONTIER_MANIAC_MESSAGE_COUNT - 1 && sFrontierManiacStreakThresholds[facility][i] < winStreak; i++);
@@ -2313,131 +2185,131 @@ void ShowScrollableMultichoice(void)
switch (gSpecialVar_0x8004)
{
- case SCROLL_MULTI_NONE:
- task->tMaxItemsOnScreen = 1;
- task->tNumItems = 1;
- task->tLeft = 1;
- task->tTop = 1;
- task->tWidth = 1;
- task->tHeight = 1;
- task->tKeepOpenAfterSelect = FALSE;
- task->tTaskId = taskId;
- break;
- case SCROLL_MULTI_GLASS_WORKSHOP_VENDOR:
- task->tMaxItemsOnScreen = MAX_SCROLL_MULTI_ON_SCREEN - 1;
- task->tNumItems = 8;
- task->tLeft = 1;
- task->tTop = 1;
- task->tWidth = 9;
- task->tHeight = 10;
- task->tKeepOpenAfterSelect = FALSE;
- task->tTaskId = taskId;
- break;
- case SCROLL_MULTI_POKEMON_FAN_CLUB_RATER:
- task->tMaxItemsOnScreen = MAX_SCROLL_MULTI_ON_SCREEN;
- task->tNumItems = 12;
- task->tLeft = 1;
- task->tTop = 1;
- task->tWidth = 7;
- task->tHeight = 12;
- task->tKeepOpenAfterSelect = FALSE;
- task->tTaskId = taskId;
- break;
- case SCROLL_MULTI_BF_EXCHANGE_CORNER_DECOR_VENDOR_1:
- task->tMaxItemsOnScreen = MAX_SCROLL_MULTI_ON_SCREEN;
- task->tNumItems = 11;
- task->tLeft = 14;
- task->tTop = 1;
- task->tWidth = 15;
- task->tHeight = 12;
- task->tKeepOpenAfterSelect = FALSE;
- task->tTaskId = taskId;
- break;
- case SCROLL_MULTI_BF_EXCHANGE_CORNER_DECOR_VENDOR_2:
- task->tMaxItemsOnScreen = MAX_SCROLL_MULTI_ON_SCREEN;
- task->tNumItems = 6;
- task->tLeft = 14;
- task->tTop = 1;
- task->tWidth = 15;
- task->tHeight = 12;
- task->tKeepOpenAfterSelect = FALSE;
- task->tTaskId = taskId;
- break;
- case SCROLL_MULTI_BF_EXCHANGE_CORNER_VITAMIN_VENDOR:
- task->tMaxItemsOnScreen = MAX_SCROLL_MULTI_ON_SCREEN;
- task->tNumItems = 7;
- task->tLeft = 14;
- task->tTop = 1;
- task->tWidth = 15;
- task->tHeight = 12;
- task->tKeepOpenAfterSelect = FALSE;
- task->tTaskId = taskId;
- break;
- case SCROLL_MULTI_BF_EXCHANGE_CORNER_HOLD_ITEM_VENDOR:
- task->tMaxItemsOnScreen = MAX_SCROLL_MULTI_ON_SCREEN;
- task->tNumItems = 10;
- task->tLeft = 14;
- task->tTop = 1;
- task->tWidth = 15;
- task->tHeight = 12;
- task->tKeepOpenAfterSelect = FALSE;
- task->tTaskId = taskId;
- break;
- case SCROLL_MULTI_BERRY_POWDER_VENDOR:
- task->tMaxItemsOnScreen = MAX_SCROLL_MULTI_ON_SCREEN;
- task->tNumItems = 12;
- task->tLeft = 15;
- task->tTop = 1;
- task->tWidth = 14;
- task->tHeight = 12;
- task->tKeepOpenAfterSelect = FALSE;
- task->tTaskId = taskId;
- break;
- case SCROLL_MULTI_BF_RECEPTIONIST:
- task->tMaxItemsOnScreen = MAX_SCROLL_MULTI_ON_SCREEN;
- task->tNumItems = 10;
- task->tLeft = 17;
- task->tTop = 1;
- task->tWidth = 11;
- task->tHeight = 12;
- task->tKeepOpenAfterSelect = FALSE;
- task->tTaskId = taskId;
- break;
- case SCROLL_MULTI_BF_MOVE_TUTOR_1:
- case SCROLL_MULTI_BF_MOVE_TUTOR_2:
- task->tMaxItemsOnScreen = MAX_SCROLL_MULTI_ON_SCREEN;
- task->tNumItems = 11;
- task->tLeft = 15;
- task->tTop = 1;
- task->tWidth = 14;
- task->tHeight = 12;
- task->tKeepOpenAfterSelect = FALSE;
- task->tTaskId = taskId;
- break;
- case SCROLL_MULTI_SS_TIDAL_DESTINATION:
- task->tMaxItemsOnScreen = MAX_SCROLL_MULTI_ON_SCREEN;
- task->tNumItems = 7;
- task->tLeft = 19;
- task->tTop = 1;
- task->tWidth = 10;
- task->tHeight = 12;
- task->tKeepOpenAfterSelect = FALSE;
- task->tTaskId = taskId;
- break;
- case SCROLL_MULTI_BATTLE_TENT_RULES:
- task->tMaxItemsOnScreen = MAX_SCROLL_MULTI_ON_SCREEN;
- task->tNumItems = 7;
- task->tLeft = 17;
- task->tTop = 1;
- task->tWidth = 12;
- task->tHeight = 12;
- task->tKeepOpenAfterSelect = FALSE;
- task->tTaskId = taskId;
- break;
- default:
- gSpecialVar_Result = MULTI_B_PRESSED;
- DestroyTask(taskId);
- break;
+ case SCROLL_MULTI_NONE:
+ task->tMaxItemsOnScreen = 1;
+ task->tNumItems = 1;
+ task->tLeft = 1;
+ task->tTop = 1;
+ task->tWidth = 1;
+ task->tHeight = 1;
+ task->tKeepOpenAfterSelect = FALSE;
+ task->tTaskId = taskId;
+ break;
+ case SCROLL_MULTI_GLASS_WORKSHOP_VENDOR:
+ task->tMaxItemsOnScreen = MAX_SCROLL_MULTI_ON_SCREEN - 1;
+ task->tNumItems = 8;
+ task->tLeft = 1;
+ task->tTop = 1;
+ task->tWidth = 9;
+ task->tHeight = 10;
+ task->tKeepOpenAfterSelect = FALSE;
+ task->tTaskId = taskId;
+ break;
+ case SCROLL_MULTI_POKEMON_FAN_CLUB_RATER:
+ task->tMaxItemsOnScreen = MAX_SCROLL_MULTI_ON_SCREEN;
+ task->tNumItems = 12;
+ task->tLeft = 1;
+ task->tTop = 1;
+ task->tWidth = 7;
+ task->tHeight = 12;
+ task->tKeepOpenAfterSelect = FALSE;
+ task->tTaskId = taskId;
+ break;
+ case SCROLL_MULTI_BF_EXCHANGE_CORNER_DECOR_VENDOR_1:
+ task->tMaxItemsOnScreen = MAX_SCROLL_MULTI_ON_SCREEN;
+ task->tNumItems = 11;
+ task->tLeft = 14;
+ task->tTop = 1;
+ task->tWidth = 15;
+ task->tHeight = 12;
+ task->tKeepOpenAfterSelect = FALSE;
+ task->tTaskId = taskId;
+ break;
+ case SCROLL_MULTI_BF_EXCHANGE_CORNER_DECOR_VENDOR_2:
+ task->tMaxItemsOnScreen = MAX_SCROLL_MULTI_ON_SCREEN;
+ task->tNumItems = 6;
+ task->tLeft = 14;
+ task->tTop = 1;
+ task->tWidth = 15;
+ task->tHeight = 12;
+ task->tKeepOpenAfterSelect = FALSE;
+ task->tTaskId = taskId;
+ break;
+ case SCROLL_MULTI_BF_EXCHANGE_CORNER_VITAMIN_VENDOR:
+ task->tMaxItemsOnScreen = MAX_SCROLL_MULTI_ON_SCREEN;
+ task->tNumItems = 7;
+ task->tLeft = 14;
+ task->tTop = 1;
+ task->tWidth = 15;
+ task->tHeight = 12;
+ task->tKeepOpenAfterSelect = FALSE;
+ task->tTaskId = taskId;
+ break;
+ case SCROLL_MULTI_BF_EXCHANGE_CORNER_HOLD_ITEM_VENDOR:
+ task->tMaxItemsOnScreen = MAX_SCROLL_MULTI_ON_SCREEN;
+ task->tNumItems = 10;
+ task->tLeft = 14;
+ task->tTop = 1;
+ task->tWidth = 15;
+ task->tHeight = 12;
+ task->tKeepOpenAfterSelect = FALSE;
+ task->tTaskId = taskId;
+ break;
+ case SCROLL_MULTI_BERRY_POWDER_VENDOR:
+ task->tMaxItemsOnScreen = MAX_SCROLL_MULTI_ON_SCREEN;
+ task->tNumItems = 12;
+ task->tLeft = 15;
+ task->tTop = 1;
+ task->tWidth = 14;
+ task->tHeight = 12;
+ task->tKeepOpenAfterSelect = FALSE;
+ task->tTaskId = taskId;
+ break;
+ case SCROLL_MULTI_BF_RECEPTIONIST:
+ task->tMaxItemsOnScreen = MAX_SCROLL_MULTI_ON_SCREEN;
+ task->tNumItems = 10;
+ task->tLeft = 17;
+ task->tTop = 1;
+ task->tWidth = 11;
+ task->tHeight = 12;
+ task->tKeepOpenAfterSelect = FALSE;
+ task->tTaskId = taskId;
+ break;
+ case SCROLL_MULTI_BF_MOVE_TUTOR_1:
+ case SCROLL_MULTI_BF_MOVE_TUTOR_2:
+ task->tMaxItemsOnScreen = MAX_SCROLL_MULTI_ON_SCREEN;
+ task->tNumItems = 11;
+ task->tLeft = 15;
+ task->tTop = 1;
+ task->tWidth = 14;
+ task->tHeight = 12;
+ task->tKeepOpenAfterSelect = FALSE;
+ task->tTaskId = taskId;
+ break;
+ case SCROLL_MULTI_SS_TIDAL_DESTINATION:
+ task->tMaxItemsOnScreen = MAX_SCROLL_MULTI_ON_SCREEN;
+ task->tNumItems = 7;
+ task->tLeft = 19;
+ task->tTop = 1;
+ task->tWidth = 10;
+ task->tHeight = 12;
+ task->tKeepOpenAfterSelect = FALSE;
+ task->tTaskId = taskId;
+ break;
+ case SCROLL_MULTI_BATTLE_TENT_RULES:
+ task->tMaxItemsOnScreen = MAX_SCROLL_MULTI_ON_SCREEN;
+ task->tNumItems = 7;
+ task->tLeft = 17;
+ task->tTop = 1;
+ task->tWidth = 12;
+ task->tHeight = 12;
+ task->tKeepOpenAfterSelect = FALSE;
+ task->tTaskId = taskId;
+ break;
+ default:
+ gSpecialVar_Result = MULTI_B_PRESSED;
+ DestroyTask(taskId);
+ break;
}
}
@@ -2627,13 +2499,9 @@ static void Task_ShowScrollableMultichoice(u8 taskId)
{
int adjustedLeft = MAX_MULTICHOICE_WIDTH + 1 - task->tWidth;
if (adjustedLeft < 0)
- {
task->tLeft = 0;
- }
else
- {
task->tLeft = adjustedLeft;
- }
}
template = CreateWindowTemplate(0, task->tLeft, task->tTop, task->tWidth, task->tHeight, 0xF, 0x64);
@@ -2713,13 +2581,14 @@ static void ScrollableMultichoice_ProcessInput(u8 taskId)
{
CloseScrollableMultichoice(taskId);
}
- // if selected option was the last one (Exit)
else if (input == task->tNumItems - 1)
{
+ // Selected option was the last one (Exit)
CloseScrollableMultichoice(taskId);
}
- else // Handle selection while keeping the menu open
+ else
{
+ // Handle selection while keeping the menu open
ScrollableMultichoice_RemoveScrollArrows(taskId);
task->func = Task_ScrollableMultichoice_WaitReturnToList;
EnableBothScriptContexts();
@@ -2828,13 +2697,9 @@ void SetBattleTowerLinkPlayerGfx(void)
for (i = 0; i < 2; i++)
{
if (gLinkPlayers[i].gender == MALE)
- {
VarSet(VAR_OBJ_GFX_ID_F - i, OBJ_EVENT_GFX_BRENDAN_NORMAL);
- }
else
- {
VarSet(VAR_OBJ_GFX_ID_F - i, OBJ_EVENT_GFX_RIVAL_MAY_NORMAL);
- }
}
}
@@ -2871,9 +2736,7 @@ void ShowNatureGirlMessage(void)
u8 nature;
if (gSpecialVar_0x8004 >= PARTY_SIZE)
- {
gSpecialVar_0x8004 = 0;
- }
nature = GetNature(&gPlayerParty[gSpecialVar_0x8004]);
ShowFieldMessage(sNatureGirlMessages[nature]);
@@ -2957,13 +2820,9 @@ void FrontierGamblerSetWonOrLost(bool8 won)
if (sFrontierChallenges[challenge] == FRONTIER_CHALLENGE(frontierFacilityId, battleMode))
{
if (won)
- {
VarSet(VAR_FRONTIER_GAMBLER_STATE, FRONTIER_GAMBLER_WON);
- }
else
- {
VarSet(VAR_FRONTIER_GAMBLER_STATE, FRONTIER_GAMBLER_LOST);
- }
}
}
}
@@ -2979,7 +2838,8 @@ void UpdateBattlePointsWindow(void)
void ShowBattlePointsWindow(void)
{
- static const struct WindowTemplate sBattlePoints_WindowTemplate = {
+ static const struct WindowTemplate sBattlePoints_WindowTemplate =
+ {
.bg = 0,
.tilemapLeft = 1,
.tilemapTop = 1,
@@ -3024,7 +2884,8 @@ u16 GetFrontierBattlePoints(void)
void ShowFrontierExchangeCornerItemIconWindow(void)
{
- static const struct WindowTemplate sFrontierExchangeCorner_ItemIconWindowTemplate = {
+ static const struct WindowTemplate sFrontierExchangeCorner_ItemIconWindowTemplate =
+ {
.bg = 0,
.tilemapLeft = 2,
.tilemapTop = 9,
@@ -3056,40 +2917,40 @@ static void FillFrontierExchangeCornerWindowAndItemIcon(u16 menu, u16 selection)
FillWindowPixelRect(0, PIXEL_FILL(1), 0, 0, 216, 32);
switch (menu)
{
- case SCROLL_MULTI_BF_EXCHANGE_CORNER_DECOR_VENDOR_1:
- AddTextPrinterParameterized2(0, FONT_NORMAL, sFrontierExchangeCorner_Decor1Descriptions[selection], 0, NULL, 2, 1, 3);
- if (sFrontierExchangeCorner_Decor1[selection] == 0xFFFF)
- {
- ShowFrontierExchangeCornerItemIcon(sFrontierExchangeCorner_Decor1[selection]);
- }
- else
- {
- FreeSpriteTilesByTag(TAG_ITEM_ICON);
- FreeSpritePaletteByTag(TAG_ITEM_ICON);
- sScrollableMultichoice_ItemSpriteId = AddDecorationIconObject(sFrontierExchangeCorner_Decor1[selection], 33, 88, 0, TAG_ITEM_ICON, TAG_ITEM_ICON);
- }
- break;
- case SCROLL_MULTI_BF_EXCHANGE_CORNER_DECOR_VENDOR_2:
- AddTextPrinterParameterized2(0, FONT_NORMAL, sFrontierExchangeCorner_Decor2Descriptions[selection], 0, NULL, 2, 1, 3);
- if (sFrontierExchangeCorner_Decor2[selection] == 0xFFFF)
- {
- ShowFrontierExchangeCornerItemIcon(sFrontierExchangeCorner_Decor2[selection]);
- }
- else
- {
- FreeSpriteTilesByTag(TAG_ITEM_ICON);
- FreeSpritePaletteByTag(TAG_ITEM_ICON);
- sScrollableMultichoice_ItemSpriteId = AddDecorationIconObject(sFrontierExchangeCorner_Decor2[selection], 33, 88, 0, TAG_ITEM_ICON, TAG_ITEM_ICON);
- }
- break;
- case SCROLL_MULTI_BF_EXCHANGE_CORNER_VITAMIN_VENDOR:
- AddTextPrinterParameterized2(0, FONT_NORMAL, sFrontierExchangeCorner_VitaminsDescriptions[selection], 0, NULL, 2, 1, 3);
- ShowFrontierExchangeCornerItemIcon(sFrontierExchangeCorner_Vitamins[selection]);
- break;
- case SCROLL_MULTI_BF_EXCHANGE_CORNER_HOLD_ITEM_VENDOR:
- AddTextPrinterParameterized2(0, FONT_NORMAL, sFrontierExchangeCorner_HoldItemsDescriptions[selection], 0, NULL, 2, 1, 3);
- ShowFrontierExchangeCornerItemIcon(sFrontierExchangeCorner_HoldItems[selection]);
- break;
+ case SCROLL_MULTI_BF_EXCHANGE_CORNER_DECOR_VENDOR_1:
+ AddTextPrinterParameterized2(0, FONT_NORMAL, sFrontierExchangeCorner_Decor1Descriptions[selection], 0, NULL, 2, 1, 3);
+ if (sFrontierExchangeCorner_Decor1[selection] == 0xFFFF)
+ {
+ ShowFrontierExchangeCornerItemIcon(sFrontierExchangeCorner_Decor1[selection]);
+ }
+ else
+ {
+ FreeSpriteTilesByTag(TAG_ITEM_ICON);
+ FreeSpritePaletteByTag(TAG_ITEM_ICON);
+ sScrollableMultichoice_ItemSpriteId = AddDecorationIconObject(sFrontierExchangeCorner_Decor1[selection], 33, 88, 0, TAG_ITEM_ICON, TAG_ITEM_ICON);
+ }
+ break;
+ case SCROLL_MULTI_BF_EXCHANGE_CORNER_DECOR_VENDOR_2:
+ AddTextPrinterParameterized2(0, FONT_NORMAL, sFrontierExchangeCorner_Decor2Descriptions[selection], 0, NULL, 2, 1, 3);
+ if (sFrontierExchangeCorner_Decor2[selection] == 0xFFFF)
+ {
+ ShowFrontierExchangeCornerItemIcon(sFrontierExchangeCorner_Decor2[selection]);
+ }
+ else
+ {
+ FreeSpriteTilesByTag(TAG_ITEM_ICON);
+ FreeSpritePaletteByTag(TAG_ITEM_ICON);
+ sScrollableMultichoice_ItemSpriteId = AddDecorationIconObject(sFrontierExchangeCorner_Decor2[selection], 33, 88, 0, TAG_ITEM_ICON, TAG_ITEM_ICON);
+ }
+ break;
+ case SCROLL_MULTI_BF_EXCHANGE_CORNER_VITAMIN_VENDOR:
+ AddTextPrinterParameterized2(0, FONT_NORMAL, sFrontierExchangeCorner_VitaminsDescriptions[selection], 0, NULL, 2, 1, 3);
+ ShowFrontierExchangeCornerItemIcon(sFrontierExchangeCorner_Vitamins[selection]);
+ break;
+ case SCROLL_MULTI_BF_EXCHANGE_CORNER_HOLD_ITEM_VENDOR:
+ AddTextPrinterParameterized2(0, FONT_NORMAL, sFrontierExchangeCorner_HoldItemsDescriptions[selection], 0, NULL, 2, 1, 3);
+ ShowFrontierExchangeCornerItemIcon(sFrontierExchangeCorner_HoldItems[selection]);
+ break;
}
}
}
@@ -3114,12 +2975,12 @@ static void HideFrontierExchangeCornerItemIcon(u16 menu, u16 unused)
{
switch (menu)
{
- case SCROLL_MULTI_BF_EXCHANGE_CORNER_DECOR_VENDOR_1:
- case SCROLL_MULTI_BF_EXCHANGE_CORNER_DECOR_VENDOR_2:
- case SCROLL_MULTI_BF_EXCHANGE_CORNER_VITAMIN_VENDOR:
- case SCROLL_MULTI_BF_EXCHANGE_CORNER_HOLD_ITEM_VENDOR:
- DestroySpriteAndFreeResources(&gSprites[sScrollableMultichoice_ItemSpriteId]);
- break;
+ case SCROLL_MULTI_BF_EXCHANGE_CORNER_DECOR_VENDOR_1:
+ case SCROLL_MULTI_BF_EXCHANGE_CORNER_DECOR_VENDOR_2:
+ case SCROLL_MULTI_BF_EXCHANGE_CORNER_VITAMIN_VENDOR:
+ case SCROLL_MULTI_BF_EXCHANGE_CORNER_HOLD_ITEM_VENDOR:
+ DestroySpriteAndFreeResources(&gSprites[sScrollableMultichoice_ItemSpriteId]);
+ break;
}
sScrollableMultichoice_ItemSpriteId = MAX_SPRITES;
}
@@ -3156,13 +3017,9 @@ static const u16 sBattleFrontier_TutorMoves2[] =
void BufferBattleFrontierTutorMoveName(void)
{
if (gSpecialVar_0x8005 != 0)
- {
StringCopy(gStringVar1, gMoveNames[sBattleFrontier_TutorMoves2[gSpecialVar_0x8004]]);
- }
else
- {
StringCopy(gStringVar1, gMoveNames[sBattleFrontier_TutorMoves1[gSpecialVar_0x8004]]);
- }
}
static void ShowBattleFrontierTutorWindow(u8 menu, u16 selection)
@@ -3225,13 +3082,9 @@ static void ShowBattleFrontierTutorMoveDescription(u8 menu, u16 selection)
{
FillWindowPixelRect(sTutorMoveAndElevatorWindowId, PIXEL_FILL(1), 0, 0, 96, 48);
if (menu == SCROLL_MULTI_BF_MOVE_TUTOR_2)
- {
AddTextPrinterParameterized(sTutorMoveAndElevatorWindowId, FONT_NORMAL, sBattleFrontier_TutorMoveDescriptions2[selection], 0, 1, 0, NULL);
- }
else
- {
AddTextPrinterParameterized(sTutorMoveAndElevatorWindowId, FONT_NORMAL, sBattleFrontier_TutorMoveDescriptions1[selection], 0, 1, 0, NULL);
- }
}
}
@@ -3341,17 +3194,17 @@ void DoDeoxysRockInteraction(void)
}
static const u16 sDeoxysRockPalettes[][16] = {
- INCBIN_U16("graphics/misc/deoxys1.gbapal"),
- INCBIN_U16("graphics/misc/deoxys2.gbapal"),
- INCBIN_U16("graphics/misc/deoxys3.gbapal"),
- INCBIN_U16("graphics/misc/deoxys4.gbapal"),
- INCBIN_U16("graphics/misc/deoxys5.gbapal"),
- INCBIN_U16("graphics/misc/deoxys6.gbapal"),
- INCBIN_U16("graphics/misc/deoxys7.gbapal"),
- INCBIN_U16("graphics/misc/deoxys8.gbapal"),
- INCBIN_U16("graphics/misc/deoxys9.gbapal"),
- INCBIN_U16("graphics/misc/deoxys10.gbapal"),
- INCBIN_U16("graphics/misc/deoxys11.gbapal"),
+ INCBIN_U16("graphics/field_effects/palettes/deoxys_rock_1.gbapal"),
+ INCBIN_U16("graphics/field_effects/palettes/deoxys_rock_2.gbapal"),
+ INCBIN_U16("graphics/field_effects/palettes/deoxys_rock_3.gbapal"),
+ INCBIN_U16("graphics/field_effects/palettes/deoxys_rock_4.gbapal"),
+ INCBIN_U16("graphics/field_effects/palettes/deoxys_rock_5.gbapal"),
+ INCBIN_U16("graphics/field_effects/palettes/deoxys_rock_6.gbapal"),
+ INCBIN_U16("graphics/field_effects/palettes/deoxys_rock_7.gbapal"),
+ INCBIN_U16("graphics/field_effects/palettes/deoxys_rock_8.gbapal"),
+ INCBIN_U16("graphics/field_effects/palettes/deoxys_rock_9.gbapal"),
+ INCBIN_U16("graphics/field_effects/palettes/deoxys_rock_10.gbapal"),
+ INCBIN_U16("graphics/field_effects/palettes/deoxys_rock_11.gbapal"),
};
static const u8 sDeoxysRockCoords[][2] = {
@@ -3453,13 +3306,9 @@ void IncrementBirthIslandRockStepCount(void)
{
var++;
if (var > 99)
- {
VarSet(VAR_DEOXYS_ROCK_STEP_COUNT, 0);
- }
else
- {
VarSet(VAR_DEOXYS_ROCK_STEP_COUNT, var);
- }
}
}
@@ -3505,18 +3354,14 @@ bool8 IsDestinationBoxFull(void)
if (GetBoxMonData(GetBoxedMonPtr(box, i), MON_DATA_SPECIES, 0) == SPECIES_NONE)
{
if (GetPCBoxToSendMon() != box)
- {
FlagClear(FLAG_SHOWN_BOX_WAS_FULL_MESSAGE);
- }
VarSet(VAR_PC_BOX_TO_SEND_MON, box);
return ShouldShowBoxWasFullMessage();
}
}
if (++box == TOTAL_BOXES_COUNT)
- {
box = 0;
- }
} while (box != StorageGetCurrentBox());
return FALSE;
}
@@ -3582,7 +3427,8 @@ bool32 GetAbnormalWeatherMapNameAndType(void)
bool8 AbnormalWeatherHasExpired(void)
{
// Duplicate array.
- static const u8 sAbnormalWeatherMapNumbers[] = {
+ static const u8 sAbnormalWeatherMapNumbers[] =
+ {
MAP_NUM(ROUTE114),
MAP_NUM(ROUTE114),
MAP_NUM(ROUTE115),
@@ -3605,9 +3451,7 @@ bool8 AbnormalWeatherHasExpired(void)
u16 abnormalWeather = VarGet(VAR_ABNORMAL_WEATHER_LOCATION);
if (abnormalWeather == ABNORMAL_WEATHER_NONE)
- {
return FALSE;
- }
if (++steps > 999)
{
@@ -3616,15 +3460,15 @@ bool8 AbnormalWeatherHasExpired(void)
{
switch (gSaveBlock1Ptr->location.mapNum)
{
- case MAP_NUM(UNDERWATER_MARINE_CAVE):
- case MAP_NUM(MARINE_CAVE_ENTRANCE):
- case MAP_NUM(MARINE_CAVE_END):
- case MAP_NUM(TERRA_CAVE_ENTRANCE):
- case MAP_NUM(TERRA_CAVE_END):
- VarSet(VAR_SHOULD_END_ABNORMAL_WEATHER, 1);
- return FALSE;
- default:
- break;
+ case MAP_NUM(UNDERWATER_MARINE_CAVE):
+ case MAP_NUM(MARINE_CAVE_ENTRANCE):
+ case MAP_NUM(MARINE_CAVE_END):
+ case MAP_NUM(TERRA_CAVE_ENTRANCE):
+ case MAP_NUM(TERRA_CAVE_END):
+ VarSet(VAR_SHOULD_END_ABNORMAL_WEATHER, 1);
+ return FALSE;
+ default:
+ break;
}
}
@@ -3632,14 +3476,14 @@ bool8 AbnormalWeatherHasExpired(void)
{
switch (gSaveBlock1Ptr->location.mapNum)
{
- case MAP_NUM(UNDERWATER_ROUTE127):
- case MAP_NUM(UNDERWATER_ROUTE129):
- case MAP_NUM(UNDERWATER_ROUTE105):
- case MAP_NUM(UNDERWATER_ROUTE125):
- VarSet(VAR_SHOULD_END_ABNORMAL_WEATHER, 1);
- return FALSE;
- default:
- break;
+ case MAP_NUM(UNDERWATER_ROUTE127):
+ case MAP_NUM(UNDERWATER_ROUTE129):
+ case MAP_NUM(UNDERWATER_ROUTE105):
+ case MAP_NUM(UNDERWATER_ROUTE125):
+ VarSet(VAR_SHOULD_END_ABNORMAL_WEATHER, 1);
+ return FALSE;
+ default:
+ break;
}
}
@@ -3691,9 +3535,7 @@ u32 GetMartEmployeeObjectEventId(void)
if (gSaveBlock1Ptr->location.mapGroup == sPokeMarts[i][0])
{
if (gSaveBlock1Ptr->location.mapNum == sPokeMarts[i][1])
- {
return sPokeMarts[i][2];
- }
}
}
return 1;
@@ -3748,9 +3590,7 @@ static void Task_LinkRetireStatusWithBattleTowerPartner(u8 taskId)
{
case 0:
if (!FuncIsActiveTask(Task_ReconnectWithLinkPlayers))
- {
gTasks[taskId].tState++;
- }
break;
case 1:
if (IsLinkTaskFinished() == TRUE)
@@ -3781,23 +3621,15 @@ static void Task_LinkRetireStatusWithBattleTowerPartner(u8 taskId)
if (gSpecialVar_0x8004 == BATTLE_TOWER_LINK_RETIRE
&& gSpecialVar_0x8005 == BATTLE_TOWER_LINK_RETIRE)
- {
gSpecialVar_Result = BATTLE_TOWER_LINKSTAT_BOTH_RETIRE;
- }
else if (gSpecialVar_0x8004 == BATTLE_TOWER_LINK_CONTINUE
&& gSpecialVar_0x8005 == BATTLE_TOWER_LINK_RETIRE)
- {
gSpecialVar_Result = BATTLE_TOWER_LINKSTAT_MEMBER_RETIRE;
- }
else if (gSpecialVar_0x8004 == BATTLE_TOWER_LINK_RETIRE
&& gSpecialVar_0x8005 == BATTLE_TOWER_LINK_CONTINUE)
- {
gSpecialVar_Result = BATTLE_TOWER_LINKSTAT_LEADER_RETIRE;
- }
else
- {
gSpecialVar_Result = BATTLE_TOWER_LINKSTAT_CONTINUE;
- }
}
gTasks[taskId].tState++;
}
@@ -3912,9 +3744,7 @@ static void Task_LoopWingFlapSE(u8 taskId)
}
if (playCount == gSpecialVar_0x8004 - 1)
- {
DestroyTask(taskId);
- }
}
#undef playCount
@@ -3976,9 +3806,7 @@ void GetBattlePyramidHint(void)
void ResetHealLocationFromDewford(void)
{
if (gSaveBlock1Ptr->lastHealLocation.mapGroup == MAP_GROUP(DEWFORD_TOWN) && gSaveBlock1Ptr->lastHealLocation.mapNum == MAP_NUM(DEWFORD_TOWN))
- {
SetLastHealLocationWarp(HEAL_LOCATION_PETALBURG_CITY);
- }
}
bool8 InPokemonCenter(void)
@@ -4015,9 +3843,7 @@ bool8 InPokemonCenter(void)
for (i = 0; sPokemonCenters[i] != 0xFFFF; i++)
{
if (sPokemonCenters[i] == map)
- {
return TRUE;
- }
}
return FALSE;
}
@@ -4192,9 +4018,7 @@ static u16 PlayerLoseRandomTrainerFan(void)
u8 idx = 0;
if (GetNumFansOfPlayerInTrainerFanClub() == 1)
- {
return 0;
- }
for (i = 0; i < ARRAY_COUNT(sFanClubMemberIds); i++)
{
@@ -4210,9 +4034,7 @@ static u16 PlayerLoseRandomTrainerFan(void)
}
if (GET_TRAINER_FAN_CLUB_FLAG(sFanClubMemberIds[idx]))
- {
FLIP_TRAINER_FAN_CLUB_FLAG(sFanClubMemberIds[idx]);
- }
return idx;
}
@@ -4277,32 +4099,32 @@ void BufferFanClubTrainerName(void)
u8 whichNPCTrainer = 0;
switch (gSpecialVar_0x8004)
{
- case FANCLUB_MEMBER1:
- break;
- case FANCLUB_MEMBER2:
- break;
- case FANCLUB_MEMBER3:
- whichLinkTrainer = 0;
- whichNPCTrainer = 3;
- break;
- case FANCLUB_MEMBER4:
- whichLinkTrainer = 0;
- whichNPCTrainer = 1;
- break;
- case FANCLUB_MEMBER5:
- whichLinkTrainer = 1;
- whichNPCTrainer = 0;
- break;
- case FANCLUB_MEMBER6:
- whichLinkTrainer = 0;
- whichNPCTrainer = 4;
- break;
- case FANCLUB_MEMBER7:
- whichLinkTrainer = 1;
- whichNPCTrainer = 5;
- break;
- case FANCLUB_MEMBER8:
- break;
+ case FANCLUB_MEMBER1:
+ break;
+ case FANCLUB_MEMBER2:
+ break;
+ case FANCLUB_MEMBER3:
+ whichLinkTrainer = 0;
+ whichNPCTrainer = 3;
+ break;
+ case FANCLUB_MEMBER4:
+ whichLinkTrainer = 0;
+ whichNPCTrainer = 1;
+ break;
+ case FANCLUB_MEMBER5:
+ whichLinkTrainer = 1;
+ whichNPCTrainer = 0;
+ break;
+ case FANCLUB_MEMBER6:
+ whichLinkTrainer = 0;
+ whichNPCTrainer = 4;
+ break;
+ case FANCLUB_MEMBER7:
+ whichLinkTrainer = 1;
+ whichNPCTrainer = 5;
+ break;
+ case FANCLUB_MEMBER8:
+ break;
}
BufferFanClubTrainerName_(&gSaveBlock1Ptr->linkBattleRecords, whichLinkTrainer, whichNPCTrainer);
}
@@ -4314,27 +4136,27 @@ static void BufferFanClubTrainerName_(struct LinkBattleRecords *linkRecords, u8
{
switch (whichNPCTrainer)
{
- case 0:
- StringCopy(gStringVar1, gText_Wallace);
- break;
- case 1:
- StringCopy(gStringVar1, gText_Steven);
- break;
- case 2:
- StringCopy(gStringVar1, gText_Brawly);
- break;
- case 3:
- StringCopy(gStringVar1, gText_Winona);
- break;
- case 4:
- StringCopy(gStringVar1, gText_Phoebe);
- break;
- case 5:
- StringCopy(gStringVar1, gText_Glacia);
- break;
- default:
- StringCopy(gStringVar1, gText_Wallace);
- break;
+ case 0:
+ StringCopy(gStringVar1, gText_Wallace);
+ break;
+ case 1:
+ StringCopy(gStringVar1, gText_Steven);
+ break;
+ case 2:
+ StringCopy(gStringVar1, gText_Brawly);
+ break;
+ case 3:
+ StringCopy(gStringVar1, gText_Winona);
+ break;
+ case 4:
+ StringCopy(gStringVar1, gText_Phoebe);
+ break;
+ case 5:
+ StringCopy(gStringVar1, gText_Glacia);
+ break;
+ default:
+ StringCopy(gStringVar1, gText_Wallace);
+ break;
}
}
else
diff --git a/src/field_tasks.c b/src/field_tasks.c
index 760d853693..8e8875993d 100644
--- a/src/field_tasks.c
+++ b/src/field_tasks.c
@@ -445,8 +445,8 @@ static void PacifidlogBridgePerStepCallback(u8 taskId)
static void TryLowerFortreeBridge(s16 x, s16 y)
{
- u8 z = PlayerGetZCoord();
- if (!(z & 1))
+ u8 elevation = PlayerGetElevation();
+ if (!(elevation & 1))
{
switch (MapGridGetMetatileIdAt(x, y))
{
@@ -462,8 +462,8 @@ static void TryLowerFortreeBridge(s16 x, s16 y)
static void TryRaiseFortreeBridge(s16 x, s16 y)
{
- u8 z = PlayerGetZCoord();
- if (!(z & 1))
+ u8 elevation = PlayerGetElevation();
+ if (!(elevation & 1))
{
switch (MapGridGetMetatileIdAt(x, y))
{
@@ -488,7 +488,7 @@ static void FortreeBridgePerStepCallback(u8 taskId)
{
bool8 isFortreeBridgeCur;
bool8 isFortreeBridgePrev;
- u8 z, onBridgeElevation;
+ u8 elevation, onBridgeElevation;
s16 x, y, prevX, prevY;
s16 *data = gTasks[taskId].data;
PlayerGetDestCoords(&x, &y);
@@ -520,9 +520,9 @@ static void FortreeBridgePerStepCallback(u8 taskId)
isFortreeBridgePrev = MetatileBehavior_IsFortreeBridge(MapGridGetMetatileBehaviorAt(prevX, prevY));
// Make sure player isn't below bridge
- z = PlayerGetZCoord();
+ elevation = PlayerGetElevation();
onBridgeElevation = FALSE;
- if ((u8)(z & 1) == 0)
+ if ((u8)(elevation & 1) == 0)
onBridgeElevation = TRUE;
if (onBridgeElevation && (isFortreeBridgeCur == TRUE || isFortreeBridgePrev == TRUE))
@@ -820,7 +820,7 @@ static void CrackedFloorPerStepCallback(u8 taskId)
tPrevY = y;
if (MetatileBehavior_IsCrackedFloor(behavior))
{
- if (GetPlayerSpeed() != BIKE_SPEED_FASTEST)
+ if (GetPlayerSpeed() != PLAYER_SPEED_FASTEST)
VarSet(VAR_ICE_STEP_COUNT, 0); // this var does double duty
if (tFloor1Delay == 0)
diff --git a/src/fieldmap.c b/src/fieldmap.c
index aff72c4c68..4dbf981cf5 100644
--- a/src/fieldmap.c
+++ b/src/fieldmap.c
@@ -43,12 +43,12 @@ static void FillWestConnection(struct MapHeader const *mapHeader, struct MapHead
static void FillEastConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset);
static void InitBackupMapLayoutConnections(struct MapHeader *mapHeader);
static void LoadSavedMapView(void);
-static bool8 SkipCopyingMetatileFromSavedMap(u16* mapMetatilePtr, u16 mapWidth, u8 yMode);
+static bool8 SkipCopyingMetatileFromSavedMap(u16* mapBlock, u16 mapWidth, u8 yMode);
static struct MapConnection *GetIncomingConnection(u8 direction, int x, int y);
static bool8 IsPosInIncomingConnectingMap(u8 direction, int x, int y, struct MapConnection *connection);
static bool8 IsCoordInIncomingConnectingMap(int coord, int srcMax, int destMax, int offset);
-#define MapGridGetBorderTileAt(x, y) ({ \
+#define GetBorderBlockAt(x, y)({ \
u16 block; \
int i; \
u16 *border = gMapHeader.mapLayout->border; \
@@ -56,12 +56,12 @@ static bool8 IsCoordInIncomingConnectingMap(int coord, int srcMax, int destMax,
i = (x + 1) & 1; \
i += ((y + 1) & 1) * 2; \
\
- block = gMapHeader.mapLayout->border[i] | METATILE_COLLISION_MASK; \
+ block = gMapHeader.mapLayout->border[i] | MAPGRID_COLLISION_MASK; \
})
#define AreCoordsWithinMapGridBounds(x, y) (x >= 0 && x < gBackupMapLayout.width && y >= 0 && y < gBackupMapLayout.height)
-#define MapGridGetTileAt(x, y) (AreCoordsWithinMapGridBounds(x, y) ? gBackupMapLayout.map[x + gBackupMapLayout.width * y] : MapGridGetBorderTileAt(x, y))
+#define GetMapGridBlockAt(x, y) (AreCoordsWithinMapGridBounds(x, y) ? gBackupMapLayout.map[x + gBackupMapLayout.width * y] : GetBorderBlockAt(x, y))
struct MapHeader const *const GetMapHeaderFromConnection(struct MapConnection *connection)
{
@@ -87,13 +87,13 @@ void InitMapFromSavedGame(void)
void InitBattlePyramidMap(bool8 setPlayerPosition)
{
- CpuFastFill(METATILE_ID_UNDEFINED << 16 | METATILE_ID_UNDEFINED, gBackupMapData, sizeof(gBackupMapData));
+ CpuFastFill(MAPGRID_UNDEFINED << 16 | MAPGRID_UNDEFINED, gBackupMapData, sizeof(gBackupMapData));
GenerateBattlePyramidFloorLayout(gBackupMapData, setPlayerPosition);
}
void InitTrainerHillMap(void)
{
- CpuFastFill(METATILE_ID_UNDEFINED << 16 | METATILE_ID_UNDEFINED, gBackupMapData, sizeof(gBackupMapData));
+ CpuFastFill(MAPGRID_UNDEFINED << 16 | MAPGRID_UNDEFINED, gBackupMapData, sizeof(gBackupMapData));
GenerateTrainerHillFloorLayout(gBackupMapData);
}
@@ -103,7 +103,7 @@ static void InitMapLayoutData(struct MapHeader *mapHeader)
int width;
int height;
mapLayout = mapHeader->mapLayout;
- CpuFastFill16(METATILE_ID_UNDEFINED, gBackupMapData, sizeof(gBackupMapData));
+ CpuFastFill16(MAPGRID_UNDEFINED, gBackupMapData, sizeof(gBackupMapData));
gBackupMapLayout.map = gBackupMapData;
width = mapLayout->width + MAP_OFFSET_W;
gBackupMapLayout.width = width;
@@ -342,46 +342,46 @@ static void FillEastConnection(struct MapHeader const *mapHeader, struct MapHead
}
}
-u8 MapGridGetZCoordAt(int x, int y)
+u8 MapGridGetElevationAt(int x, int y)
{
- u16 block = MapGridGetTileAt(x, y);
+ u16 block = GetMapGridBlockAt(x, y);
- if (block == METATILE_ID_UNDEFINED)
+ if (block == MAPGRID_UNDEFINED)
return 0;
- return block >> METATILE_ELEVATION_SHIFT;
+ return block >> MAPGRID_ELEVATION_SHIFT;
}
bool8 MapGridIsImpassableAt(int x, int y)
{
- u16 block = MapGridGetTileAt(x, y);
+ u16 block = GetMapGridBlockAt(x, y);
- if (block == METATILE_ID_UNDEFINED)
+ if (block == MAPGRID_UNDEFINED)
return TRUE;
- return (block & METATILE_COLLISION_MASK) >> METATILE_COLLISION_SHIFT;
+ return (block & MAPGRID_COLLISION_MASK) >> MAPGRID_COLLISION_SHIFT;
}
u32 MapGridGetMetatileIdAt(int x, int y)
{
- u16 block = MapGridGetTileAt(x, y);
+ u16 block = GetMapGridBlockAt(x, y);
- if (block == METATILE_ID_UNDEFINED)
- return MapGridGetBorderTileAt(x, y) & METATILE_ID_MASK;
+ if (block == MAPGRID_UNDEFINED)
+ return GetBorderBlockAt(x, y) & MAPGRID_METATILE_ID_MASK;
- return block & METATILE_ID_MASK;
+ return block & MAPGRID_METATILE_ID_MASK;
}
u32 MapGridGetMetatileBehaviorAt(int x, int y)
{
u16 metatile = MapGridGetMetatileIdAt(x, y);
- return GetBehaviorByMetatileId(metatile) & METATILE_BEHAVIOR_MASK;
+ return GetMetatileAttributesById(metatile) & METATILE_ATTR_BEHAVIOR_MASK;
}
u8 MapGridGetMetatileLayerTypeAt(int x, int y)
{
u16 metatile = MapGridGetMetatileIdAt(x, y);
- return (GetBehaviorByMetatileId(metatile) & METATILE_ELEVATION_MASK) >> METATILE_ELEVATION_SHIFT;
+ return (GetMetatileAttributesById(metatile) & METATILE_ATTR_LAYER_MASK) >> METATILE_ATTR_LAYER_SHIFT;
}
void MapGridSetMetatileIdAt(int x, int y, u16 metatile)
@@ -390,7 +390,7 @@ void MapGridSetMetatileIdAt(int x, int y, u16 metatile)
if (AreCoordsWithinMapGridBounds(x, y))
{
i = x + y * gBackupMapLayout.width;
- gBackupMapLayout.map[i] = (gBackupMapLayout.map[i] & METATILE_ELEVATION_MASK) | (metatile & ~METATILE_ELEVATION_MASK);
+ gBackupMapLayout.map[i] = (gBackupMapLayout.map[i] & MAPGRID_ELEVATION_MASK) | (metatile & ~MAPGRID_ELEVATION_MASK);
}
}
@@ -404,7 +404,7 @@ void MapGridSetMetatileEntryAt(int x, int y, u16 metatile)
}
}
-u16 GetBehaviorByMetatileId(u16 metatile)
+u16 GetMetatileAttributesById(u16 metatile)
{
u16 *attributes;
if (metatile < NUM_METATILES_IN_PRIMARY)
@@ -565,7 +565,7 @@ static void MoveMapViewToBackup(u8 direction)
int GetMapBorderIdAt(int x, int y)
{
- if (MapGridGetTileAt(x, y) == METATILE_ID_UNDEFINED)
+ if (GetMapGridBlockAt(x, y) == MAPGRID_UNDEFINED)
return CONNECTION_INVALID;
if (x >= (gBackupMapLayout.width - (MAP_OFFSET + 1)))
@@ -817,23 +817,23 @@ void MapGridSetMetatileImpassabilityAt(int x, int y, bool32 impassable)
if (AreCoordsWithinMapGridBounds(x, y))
{
if (impassable)
- gBackupMapLayout.map[x + gBackupMapLayout.width * y] |= METATILE_COLLISION_MASK;
+ gBackupMapLayout.map[x + gBackupMapLayout.width * y] |= MAPGRID_COLLISION_MASK;
else
- gBackupMapLayout.map[x + gBackupMapLayout.width * y] &= ~METATILE_COLLISION_MASK;
+ gBackupMapLayout.map[x + gBackupMapLayout.width * y] &= ~MAPGRID_COLLISION_MASK;
}
}
-static bool8 SkipCopyingMetatileFromSavedMap(u16* mapMetatilePtr, u16 mapWidth, u8 yMode)
+static bool8 SkipCopyingMetatileFromSavedMap(u16* mapBlock, u16 mapWidth, u8 yMode)
{
if (yMode == 0xFF)
return FALSE;
if (yMode == 0)
- mapMetatilePtr -= mapWidth;
+ mapBlock -= mapWidth;
else
- mapMetatilePtr += mapWidth;
+ mapBlock += mapWidth;
- if (IsLargeBreakableDecoration(*mapMetatilePtr & METATILE_ID_MASK, yMode) == TRUE)
+ if (IsLargeBreakableDecoration(*mapBlock & MAPGRID_METATILE_ID_MASK, yMode) == TRUE)
return TRUE;
return FALSE;
}
diff --git a/src/fldeff_cut.c b/src/fldeff_cut.c
index 0e639d21fb..fea9e31ea4 100644
--- a/src/fldeff_cut.c
+++ b/src/fldeff_cut.c
@@ -181,7 +181,7 @@ bool8 SetUpFieldMove_Cut(void)
for (j = 0; j < CUT_NORMAL_SIDE; j++)
{
x = j - 1 + gPlayerFacingPosition.x;
- if (MapGridGetZCoordAt(x, y) == gPlayerFacingPosition.height)
+ if (MapGridGetElevationAt(x, y) == gPlayerFacingPosition.elevation)
{
tileBehavior = MapGridGetMetatileBehaviorAt(x, y);
if (MetatileBehavior_IsPokeGrass(tileBehavior) == TRUE
@@ -238,7 +238,7 @@ bool8 SetUpFieldMove_Cut(void)
if (tileCuttable == TRUE)
{
- if (MapGridGetZCoordAt(x, y) == gPlayerFacingPosition.height)
+ if (MapGridGetElevationAt(x, y) == gPlayerFacingPosition.elevation)
{
u8 tileArrayId = ((sHyperCutStruct[i].y * 5) + 12) + (sHyperCutStruct[i].x);
tileBehavior = MapGridGetMetatileBehaviorAt(x, y);
diff --git a/src/fldeff_escalator.c b/src/fldeff_escalator.c
index 769e735623..0dc98c319c 100644
--- a/src/fldeff_escalator.c
+++ b/src/fldeff_escalator.c
@@ -126,13 +126,13 @@ static void Task_DrawEscalator(u8 taskId)
SetEscalatorMetatile(taskId, sEscalatorMetatiles_1F_1, 0);
break;
case 2:
- SetEscalatorMetatile(taskId, sEscalatorMetatiles_1F_2, METATILE_COLLISION_MASK);
+ SetEscalatorMetatile(taskId, sEscalatorMetatiles_1F_2, MAPGRID_COLLISION_MASK);
break;
case 3:
SetEscalatorMetatile(taskId, sEscalatorMetatiles_1F_3, 0);
break;
case 4:
- SetEscalatorMetatile(taskId, sEscalatorMetatiles_2F_0, METATILE_COLLISION_MASK);
+ SetEscalatorMetatile(taskId, sEscalatorMetatiles_2F_0, MAPGRID_COLLISION_MASK);
break;
case 5:
SetEscalatorMetatile(taskId, sEscalatorMetatiles_2F_1, 0);
diff --git a/src/fldeff_flash.c b/src/fldeff_flash.c
index 9c166d0085..a303b8423b 100644
--- a/src/fldeff_flash.c
+++ b/src/fldeff_flash.c
@@ -61,13 +61,13 @@ static const struct FlashStruct sTransitionTypes[] =
{},
};
-static const u16 sCaveTransitionPalette_White[] = INCBIN_U16("graphics/misc/cave_transition_white.gbapal");
-static const u16 sCaveTransitionPalette_Black[] = INCBIN_U16("graphics/misc/cave_transition_black.gbapal");
+static const u16 sCaveTransitionPalette_White[] = INCBIN_U16("graphics/cave_transition/white.gbapal");
+static const u16 sCaveTransitionPalette_Black[] = INCBIN_U16("graphics/cave_transition/black.gbapal");
-static const u16 sCaveTransitionPalette_Enter[] = INCBIN_U16("graphics/misc/cave_transition_enter.gbapal");
-static const u16 sCaveTransitionPalette_Exit[] = INCBIN_U16("graphics/misc/cave_transition_exit.gbapal");
-static const u32 sCaveTransitionTilemap[] = INCBIN_U32("graphics/misc/cave_transition_map.bin.lz");
-static const u32 sCaveTransitionTiles[] = INCBIN_U32("graphics/misc/cave_transition.4bpp.lz");
+static const u16 sCaveTransitionPalette_Enter[] = INCBIN_U16("graphics/cave_transition/enter.gbapal");
+static const u16 sCaveTransitionPalette_Exit[] = INCBIN_U16("graphics/cave_transition/exit.gbapal");
+static const u32 sCaveTransitionTilemap[] = INCBIN_U32("graphics/cave_transition/tilemap.bin.lz");
+static const u32 sCaveTransitionTiles[] = INCBIN_U32("graphics/cave_transition/tiles.4bpp.lz");
bool8 SetUpFieldMove_Flash(void)
{
diff --git a/src/fldeff_misc.c b/src/fldeff_misc.c
index c01babb68a..4f3f53fa60 100644
--- a/src/fldeff_misc.c
+++ b/src/fldeff_misc.c
@@ -840,9 +840,9 @@ void DoSecretBasePCTurnOffEffect(void)
PlaySE(SE_PC_OFF);
if (!VarGet(VAR_CURRENT_SECRET_BASE))
- MapGridSetMetatileIdAt(x, y, METATILE_SecretBase_PC | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(x, y, METATILE_SecretBase_PC | MAPGRID_COLLISION_MASK);
else
- MapGridSetMetatileIdAt(x, y, METATILE_SecretBase_RegisterPC | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(x, y, METATILE_SecretBase_RegisterPC | MAPGRID_COLLISION_MASK);
CurrentMapDrawMetatileAt(x, y);
}
@@ -1083,7 +1083,7 @@ static void SpriteCB_SandPillar_BreakTop(struct Sprite *sprite)
PlaySE(SE_M_ROCK_THROW);
if (MapGridGetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1) == METATILE_SecretBase_SandOrnament_TopWall)
- MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1, METATILE_SecretBase_Wall_TopMid | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1, METATILE_SecretBase_Wall_TopMid | MAPGRID_COLLISION_MASK);
else
MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1, METATILE_SecretBase_SandOrnament_BrokenTop);
@@ -1103,7 +1103,7 @@ static void SpriteCB_SandPillar_BreakBase(struct Sprite *sprite)
}
else
{
- MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6], METATILE_SecretBase_SandOrnament_BrokenBase | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6], METATILE_SecretBase_SandOrnament_BrokenBase | MAPGRID_COLLISION_MASK);
CurrentMapDrawMetatileAt(gFieldEffectArguments[5], gFieldEffectArguments[6]);
sprite->data[0] = 0;
sprite->callback = SpriteCB_SandPillar_End;
diff --git a/src/fldeff_rocksmash.c b/src/fldeff_rocksmash.c
index 6f4ce8002b..a30000e526 100644
--- a/src/fldeff_rocksmash.c
+++ b/src/fldeff_rocksmash.c
@@ -19,7 +19,6 @@
#include "constants/map_types.h"
#include "constants/songs.h"
-// static functions
static void Task_DoFieldMove_Init(u8 taskId);
static void Task_DoFieldMove_ShowMonAfterPose(u8 taskId);
static void Task_DoFieldMove_WaitForMon(u8 taskId);
@@ -28,14 +27,13 @@ static void Task_DoFieldMove_RunFunc(u8 taskId);
static void FieldCallback_RockSmash(void);
static void FieldMove_RockSmash(void);
-// text
bool8 CheckObjectGraphicsInFrontOfPlayer(u8 graphicsId)
{
u8 objEventId;
GetXYCoordsOneStepInFrontOfPlayer(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y);
- gPlayerFacingPosition.height = PlayerGetZCoord();
- objEventId = GetObjectEventIdByXYZ(gPlayerFacingPosition.x, gPlayerFacingPosition.y, gPlayerFacingPosition.height);
+ gPlayerFacingPosition.elevation = PlayerGetElevation();
+ objEventId = GetObjectEventIdByPosition(gPlayerFacingPosition.x, gPlayerFacingPosition.y, gPlayerFacingPosition.elevation);
if (gObjectEvents[objEventId].graphicsId != graphicsId)
{
return FALSE;
diff --git a/src/frontier_pass.c b/src/frontier_pass.c
index 07dd8f2289..b143587415 100644
--- a/src/frontier_pass.c
+++ b/src/frontier_pass.c
@@ -173,7 +173,7 @@ static const u32 sHeads_Gfx[] = INCBIN_U32("graphics/frontier
static const u32 sMapCursor_Gfx[] = INCBIN_U32("graphics/frontier_pass/map_cursor.4bpp.lz");
static const u32 sMapScreen_Tilemap[] = INCBIN_U32("graphics/frontier_pass/map_screen.bin.lz");
static const u32 sMapAndCard_ZoomedOut_Tilemap[] = INCBIN_U32("graphics/frontier_pass/small_map_and_card.bin.lz");
-static const u32 sUnusedData[] = INCBIN_U32("graphics/frontier_pass/unused.bin");
+static const u32 sCardBall_Filled_Tilemap[] = INCBIN_U32("graphics/frontier_pass/card_ball_filled.bin"); // Unused
static const u32 sBattleRecord_Tilemap[] = INCBIN_U32("graphics/frontier_pass/record_frame.bin.lz");
static const u32 sMapAndCard_Zooming_Tilemap[] = INCBIN_U32("graphics/frontier_pass/small_map_and_card_affine.bin.lz");
diff --git a/src/graphics.c b/src/graphics.c
index 513736c1ae..ed8c3df0fe 100644
--- a/src/graphics.c
+++ b/src/graphics.c
@@ -11,7 +11,7 @@ const u32 gUnusedPal_OldCharmap[] = INCBIN_U32("graphics/unused/old_charmap.gbap
const u32 gSmokescreenImpactTiles[] = INCBIN_U32("graphics/battle_anims/sprites/smokescreen_impact.4bpp.lz");
const u32 gSmokescreenImpactPalette[] = INCBIN_U32("graphics/battle_anims/sprites/smokescreen_impact.gbapal.lz");
-#include "data/graphics/interface_pokeballs.h"
+#include "data/graphics/pokeballs.h"
const u32 gBlankGfxCompressed[] = INCBIN_U32("graphics/interface/blank.4bpp.lz");
@@ -466,7 +466,7 @@ const u32 gBattleAnimSpriteGfx_ClawSlash[] = INCBIN_U32("graphics/battle_anims/s
const u32 gBattleAnimSpriteGfx_Scratch3[] = INCBIN_U32("graphics/battle_anims/sprites/scratch_3.4bpp.lz");
const u32 gBattleAnimSpriteGfx_Scratch2[] = INCBIN_U32("graphics/battle_anims/sprites/scratch_2.4bpp.lz");
-const u32 gPartyMenuHpBar_Gfx[] = INCBIN_U32("graphics/interface/party_menu_hpbar.4bpp.lz");
+const u32 gUnusedHpBar_Gfx[] = INCBIN_U32("graphics/battle_interface/hpbar_unused.4bpp.lz");
const u32 gBattleAnimSpriteGfx_BubbleBurst2[] = INCBIN_U32("graphics/battle_anims/sprites/bubble_burst_2.4bpp.lz");
@@ -484,7 +484,7 @@ const u32 gBattleAnimSpriteGfx_PinkHeart2[] = INCBIN_U32("graphics/battle_anims/
const u32 gBattleInterfaceGfx_UnusedWindow1[] = INCBIN_U32("graphics/battle_interface/unused_window.4bpp.lz");
const u32 gBattleInterfacePal_UnusedWindow1[] = INCBIN_U32("graphics/battle_interface/unused_window.gbapal.lz");
-const u32 gBattleInterfaceGfx_BattleBar[] = INCBIN_U32("graphics/interface/battle_bar.4bpp.lz");
+const u32 gBattleInterfaceGfx_BattleBar[] = INCBIN_U32("graphics/battle_interface/battle_bar.4bpp.lz");
const u32 gBattleAnimSpriteGfx_SapDrip[] = INCBIN_U32("graphics/battle_anims/sprites/sap_drip.4bpp.lz");
const u32 gBattleAnimSpritePal_SapDrip[] = INCBIN_U32("graphics/battle_anims/sprites/sap_drip.gbapal.lz");
@@ -754,15 +754,15 @@ const u32 gBattleAnimSpriteGfx_BlueFlames2[] = INCBIN_U32("graphics/battle_anims
// Contest
const u32 gJPContestGfx1[] = INCBIN_U32("graphics/contest/japanese/composite_1.4bpp.lz");
const u32 gJPContestPal[] = INCBIN_U32("graphics/contest/japanese/palette.gbapal.lz");
-const u32 gJPContestTilemap1[] = INCBIN_U32("graphics/contest/japanese/tilemap_1.bin.lz");
-const u32 gJPContestTilemap2[] = INCBIN_U32("graphics/contest/japanese/tilemap_2.bin.lz");
+const u32 gJPContestBgTilemap[] = INCBIN_U32("graphics/contest/japanese/bg.bin.lz");
+const u32 gJPContestWindowsTilemap[] = INCBIN_U32("graphics/contest/japanese/windows.bin.lz");
const u32 gJPContestGfx2[] = INCBIN_U32("graphics/contest/japanese/composite_2.4bpp.lz");
const u32 gContestInterfaceAudiencePalette[] = INCBIN_U32("graphics/contest/interface_audience.gbapal.lz");
const u32 gContestAudienceTilemap[] = INCBIN_U32("graphics/contest/audience.bin.lz");
const u32 gContestInterfaceTilemap[] = INCBIN_U32("graphics/contest/interface.bin.lz");
-const u32 gContestUnusedTilemap1[] = INCBIN_U32("graphics/contest/unused_tilemap_1.bin.lz");
-const u32 gContestUnusedTilemap2[] = INCBIN_U32("graphics/contest/unused_tilemap_2.bin.lz");
+const u32 gJPContestInterfaceTilemap[] = INCBIN_U32("graphics/contest/japanese/interface.bin.lz");
+const u32 gJPContestAudienceTilemap[] = INCBIN_U32("graphics/contest/japanese/audience.bin.lz");
const u32 gContestCurtainTilemap[] = INCBIN_U32("graphics/contest/curtain.bin.lz");
const u32 gContestInterfaceGfx[] = INCBIN_U32("graphics/contest/interface.4bpp.lz");
@@ -788,6 +788,9 @@ const u32 gBattleAnimSpritePal_Impact[] = INCBIN_U32("graphics/battle_anims/spri
const u32 gBattleAnimSpriteGfx_Particles[] = INCBIN_U32("graphics/battle_anims/sprites/particles.4bpp.lz");
+const u32 gBattleAnimSpriteGfx_Particles2[] = INCBIN_U32("graphics/battle_anims/sprites/particles2.4bpp.lz");
+const u32 gBattleAnimSpritePal_Particles2[] = INCBIN_U32("graphics/battle_anims/sprites/particles2.gbapal.lz");
+
const u32 gBattleAnimSpriteGfx_CircleImpact[] = INCBIN_U32("graphics/battle_anims/sprites/circle_impact.4bpp.lz");
const u32 gBattleAnimSpritePal_CircleImpact[] = INCBIN_U32("graphics/battle_anims/sprites/circle_impact.gbapal.lz");
@@ -1266,9 +1269,9 @@ const u32 gVsLettersGfx[] = INCBIN_U32("graphics/battle_transitions/vs.4bpp.lz")
#include "data/graphics/battle_terrain.h"
// Battle Dome
-const u32 gDomeTourneyBg_Gfx[] = INCBIN_U32("graphics/battle_frontier/tourney_bg.4bpp.lz");
+const u32 gDomeTourneyTree_Gfx[] = INCBIN_U32("graphics/battle_frontier/tourney_tree.4bpp.lz");
const u32 gDomeTourneyLine_Gfx[] = INCBIN_U32("graphics/battle_frontier/tourney_line.4bpp.lz"); // the red glow mask for the tourney advancement lines
-const u32 gDomeTourneyLineMask_Tilemap[] = INCBIN_U32("graphics/battle_frontier/tourney_line_mask_map.bin.lz");
+const u32 gDomeTourneyTree_Tilemap[] = INCBIN_U32("graphics/battle_frontier/tourney_tree.bin.lz");
const u32 gDomeTourneyLineDown_Tilemap[] = INCBIN_U32("graphics/battle_frontier/tourney_line_down_map.bin.lz");
const u32 gDomeTourneyLineUp_Tilemap[] = INCBIN_U32("graphics/battle_frontier/tourney_line_up_map.bin.lz");
const u32 gDomeTourneyInfoCard_Gfx[] = INCBIN_U32("graphics/battle_frontier/tourney_info_card.4bpp.lz");
@@ -1283,7 +1286,7 @@ const u32 gBattleArenaJudgementSymbolsGfx[] = INCBIN_U32("graphics/battle_fronti
const u32 gBattleArenaJudgementSymbolsPalette[] = INCBIN_U32("graphics/battle_frontier/arena_judgement_symbols.gbapal.lz");
const u32 gBattleWindowTextPalette[] = INCBIN_U32("graphics/battle_interface/text.gbapal.lz");
-const u16 gPPTextPalette[] = INCBIN_U16("graphics/battle_frontier/text_pp.gbapal");
+const u16 gPPTextPalette[] = INCBIN_U16("graphics/battle_interface/text_pp.gbapal");
const u16 gTilesetAnims_BattleDomePals0_0[] = INCBIN_U16("graphics/battle_frontier/dome_anim1.gbapal");
const u16 gTilesetAnims_BattleDomePals0_1[] = INCBIN_U16("graphics/battle_frontier/dome_anim2.gbapal");
@@ -1601,13 +1604,13 @@ const u32 gBattleAnimSpritePal_Slash2[] = INCBIN_U32("graphics/battle_anims/spri
const u32 gBattleAnimSpriteGfx_WhiteShadow[] = INCBIN_U32("graphics/battle_anims/sprites/white_shadow.4bpp.lz");
const u32 gBattleAnimSpritePal_WhiteShadow[] = INCBIN_U32("graphics/battle_anims/sprites/white_shadow.gbapal.lz");
-const u32 gPartyMenuBg_Gfx[] = INCBIN_U32("graphics/interface/party_menu_bg.4bpp.lz");
-const u32 gPartyMenuBg_Pal[] = INCBIN_U32("graphics/interface/party_menu_bg.gbapal.lz");
-const u32 gPartyMenuBg_Tilemap[] = INCBIN_U32("graphics/interface/party_menu_bg.bin.lz");
+const u32 gPartyMenuBg_Gfx[] = INCBIN_U32("graphics/party_menu/bg.4bpp.lz");
+const u32 gPartyMenuBg_Pal[] = INCBIN_U32("graphics/party_menu/bg.gbapal.lz");
+const u32 gPartyMenuBg_Tilemap[] = INCBIN_U32("graphics/party_menu/bg.bin.lz");
-const u32 gPartyMenuPokeball_Gfx[] = INCBIN_U32("graphics/interface/party_menu_pokeball.4bpp.lz");
-const u32 gPartyMenuPokeballSmall_Gfx[] = INCBIN_U32("graphics/interface/party_menu_pokeball_small.4bpp.lz"); //unused
-const u32 gPartyMenuPokeball_Pal[] = INCBIN_U32("graphics/interface/party_menu_pokeball.gbapal.lz");
+const u32 gPartyMenuPokeball_Gfx[] = INCBIN_U32("graphics/party_menu/pokeball.4bpp.lz");
+const u32 gPartyMenuPokeballSmall_Gfx[] = INCBIN_U32("graphics/party_menu/pokeball_small.4bpp.lz"); //unused
+const u32 gPartyMenuPokeball_Pal[] = INCBIN_U32("graphics/party_menu/pokeball.gbapal.lz");
const u32 gStatusGfx_Icons[] = INCBIN_U32("graphics/interface/status_icons.4bpp.lz");
const u32 gStatusPal_Icons[] = INCBIN_U32("graphics/interface/status_icons.gbapal.lz");
@@ -1615,50 +1618,50 @@ const u32 gStatusPal_Icons[] = INCBIN_U32("graphics/interface/status_icons.gbapa
const u32 gMoveTypes_Gfx[] = INCBIN_U32("graphics/types/move_types.4bpp.lz");
const u32 gMoveTypes_Pal[] = INCBIN_U32("graphics/types/move_types.gbapal.lz");
-const u32 gSummaryMoveSelect_Gfx[] = INCBIN_U32("graphics/interface/summary_frames.4bpp.lz");
-const u32 gSummaryMoveSelect_Pal[] = INCBIN_U32("graphics/interface/summary_frames.gbapal.lz");
+const u32 gSummaryMoveSelect_Gfx[] = INCBIN_U32("graphics/summary_screen/move_select.4bpp.lz");
+const u32 gSummaryMoveSelect_Pal[] = INCBIN_U32("graphics/summary_screen/move_select.gbapal.lz");
-const u32 gSummaryScreen_Gfx[] = INCBIN_U32("graphics/interface/summary_screen.4bpp.lz");
-const u32 gSummaryScreen_Pal[] = INCBIN_U32("graphics/interface/summary_screen.gbapal.lz");
-const u32 gSummaryPage_Info_Tilemap[] = INCBIN_U32("graphics/interface/summary_page_info.bin.lz");
-const u32 gSummaryPage_Skills_Tilemap[] = INCBIN_U32("graphics/interface/summary_page_skills.bin.lz");
-const u32 gSummaryPage_BattleMoves_Tilemap[] = INCBIN_U32("graphics/interface/summary_page_battle_moves.bin.lz");
-const u32 gSummaryPage_ContestMoves_Tilemap[] = INCBIN_U32("graphics/interface/summary_page_contest_moves.bin.lz");
-const u32 gSummaryPage_InfoCopy_Tilemap[] = INCBIN_U32("graphics/interface/summary_page_info_copy.bin.lz");
+const u32 gSummaryScreen_Gfx[] = INCBIN_U32("graphics/summary_screen/tiles.4bpp.lz");
+const u32 gSummaryScreen_Pal[] = INCBIN_U32("graphics/summary_screen/tiles.gbapal.lz");
+const u32 gSummaryPage_Info_Tilemap[] = INCBIN_U32("graphics/summary_screen/page_info.bin.lz");
+const u32 gSummaryPage_Skills_Tilemap[] = INCBIN_U32("graphics/summary_screen/page_skills.bin.lz");
+const u32 gSummaryPage_BattleMoves_Tilemap[] = INCBIN_U32("graphics/summary_screen/page_battle_moves.bin.lz");
+const u32 gSummaryPage_ContestMoves_Tilemap[] = INCBIN_U32("graphics/summary_screen/page_contest_moves.bin.lz");
+const u32 gSummaryPage_InfoEgg_Tilemap[] = INCBIN_U32("graphics/summary_screen/page_info_egg.bin.lz");
-const u32 gBagMaleTiles[] = INCBIN_U32("graphics/misc/bag_male.4bpp.lz");
-const u32 gBagFemaleTiles[] = INCBIN_U32("graphics/misc/bag_female.4bpp.lz");
-const u32 gBagPalette[] = INCBIN_U32("graphics/misc/bag.gbapal.lz");
+const u32 gBagMaleTiles[] = INCBIN_U32("graphics/bag/bag_male.4bpp.lz");
+const u32 gBagFemaleTiles[] = INCBIN_U32("graphics/bag/bag_female.4bpp.lz");
+const u32 gBagPalette[] = INCBIN_U32("graphics/bag/bag.gbapal.lz");
-const u32 gBagScreenMale_Pal[] = INCBIN_U32("graphics/interface/bag_screen_male.gbapal.lz");
-const u32 gBagScreenFemale_Pal[] = INCBIN_U32("graphics/interface/bag_screen_female.gbapal.lz");
+const u32 gBagScreenMale_Pal[] = INCBIN_U32("graphics/bag/menu_male.gbapal.lz");
+const u32 gBagScreenFemale_Pal[] = INCBIN_U32("graphics/bag/menu_female.gbapal.lz");
-const u32 gBagScreen_Gfx[] = INCBIN_U32("graphics/interface/bag_screen.4bpp.lz");
-const u32 gBagScreen_GfxTileMap[] = INCBIN_U32("graphics/interface/bag_screen_tilemap.bin.lz");
+const u32 gBagScreen_Gfx[] = INCBIN_U32("graphics/bag/menu.4bpp.lz");
+const u32 gBagScreen_GfxTileMap[] = INCBIN_U32("graphics/bag/menu.bin.lz");
-const u32 gBattlePyramidBag_Gfx[] = INCBIN_U32("graphics/interface/bag_pyramid.4bpp.lz");
-const u32 gBattlePyramidBag_Pal[] = INCBIN_U32("graphics/interface/bag_pyramid.gbapal.lz"); // female palette is first and male is second.
-const u32 gBattlePyramidBagTilemap[] = INCBIN_U32("graphics/interface/bag_pyramid_tilemap.bin.lz");
-const u32 gBattlePyramidBagInterface_Pal[] = INCBIN_U32("graphics/interface/bag_pyramid_interface.gbapal.lz");
+const u32 gBattlePyramidBag_Gfx[] = INCBIN_U32("graphics/bag/bag_pyramid.4bpp.lz");
+const u32 gBattlePyramidBag_Pal[] = INCBIN_U32("graphics/bag/bag_pyramid.gbapal.lz"); // female palette is first and male is second.
+const u32 gBattlePyramidBagTilemap[] = INCBIN_U32("graphics/bag/menu_pyramid.bin.lz");
+const u32 gBattlePyramidBagInterface_Pal[] = INCBIN_U32("graphics/bag/menu_pyramid.gbapal.lz");
-const u32 gBagSwapLineGfx[] = INCBIN_U32("graphics/interface/bag_swap.4bpp.lz");
-const u32 gBagSwapLinePal[] = INCBIN_U32("graphics/interface/bag_swap.gbapal.lz");
+const u32 gSwapLineGfx[] = INCBIN_U32("graphics/interface/swap_line.4bpp.lz");
+const u32 gSwapLinePal[] = INCBIN_U32("graphics/interface/swap_line.gbapal.lz");
-const u32 gBuyMenuFrame_Gfx[] = INCBIN_U32("graphics/interface/mart_frame.4bpp.lz");
-const u32 gMenuMoneyPal[] = INCBIN_U32("graphics/interface/mart_frame.gbapal.lz");
-const u32 gBuyMenuFrame_Tilemap[] = INCBIN_U32("graphics/interface/mart_frame.bin.lz");
-
-const u32 gMenuMoneyGfx[] = INCBIN_U32("graphics/interface/money.4bpp.lz");
+const u32 gShopMenu_Gfx[] = INCBIN_U32("graphics/shop/menu.4bpp.lz");
+const u32 gShopMenu_Pal[] = INCBIN_U32("graphics/shop/menu.gbapal.lz");
+const u32 gShopMenu_Tilemap[] = INCBIN_U32("graphics/shop/menu.bin.lz");
+const u32 gShopMenuMoney_Gfx[] = INCBIN_U32("graphics/shop/money.4bpp.lz");
// Pokeblock
-const u32 gMenuPokeblock_Gfx[] = INCBIN_U32("graphics/interface/pokeblock_case_frame.4bpp.lz");
-const u32 gMenuPokeblock_Pal[] = INCBIN_U32("graphics/interface/pokeblock_case_frame.gbapal.lz");
+const u32 gMenuPokeblock_Gfx[] = INCBIN_U32("graphics/pokeblock/menu.4bpp.lz");
+const u32 gMenuPokeblock_Pal[] = INCBIN_U32("graphics/pokeblock/menu.gbapal.lz");
-const u32 gMenuPokeblockDevice_Gfx[] = INCBIN_U32("graphics/interface/pokeblock_device.4bpp.lz");
-const u32 gMenuPokeblockDevice_Pal[] = INCBIN_U32("graphics/interface/pokeblock_device.gbapal.lz");
+const u32 gMenuPokeblockDevice_Gfx[] = INCBIN_U32("graphics/pokeblock/device.4bpp.lz");
+const u32 gMenuPokeblockDevice_Pal[] = INCBIN_U32("graphics/pokeblock/device.gbapal.lz");
+
+const u32 gMenuPokeblock_Tilemap[] = INCBIN_U32("graphics/pokeblock/menu.bin.lz");
-const u32 gMenuPokeblock_Tilemap[] = INCBIN_U32("graphics/interface/pokeblock.bin.lz");
const u32 gPokeblock_Gfx[] = INCBIN_U32("graphics/pokeblock/pokeblock.4bpp.lz");
const u32 gPokeblockRed_Pal[] = INCBIN_U32("graphics/pokeblock/red.gbapal.lz");
const u32 gPokeblockBlue_Pal[] = INCBIN_U32("graphics/pokeblock/blue.gbapal.lz");
@@ -1675,7 +1678,7 @@ const u32 gPokeblockBlack_Pal[] = INCBIN_U32("graphics/pokeblock/black.gbapal.lz
const u32 gPokeblockWhite_Pal[] = INCBIN_U32("graphics/pokeblock/white.gbapal.lz");
const u32 gPokeblockGold_Pal[] = INCBIN_U32("graphics/pokeblock/gold.gbapal.lz");
-const u32 gPokeblockFeedBg_Tilemap[] = INCBIN_U32("graphics/interface/pokeblock_feeding_bg_map.bin.lz");
+const u32 gPokeblockFeedBg_Tilemap[] = INCBIN_U32("graphics/pokeblock/feeding_bg.bin.lz");
#include "data/graphics/berries.h"
#include "data/graphics/rayquaza_scene.h"
@@ -1748,9 +1751,9 @@ const u32 gPokedexSearchMenu_Gfx[] = INCBIN_U32("graphics/pokedex/search_menu.4b
const u32 gPokedexSearchMenuNational_Tilemap[] = INCBIN_U32("graphics/pokedex/search_menu_national.bin.lz");
const u32 gPokedexSearchMenuHoenn_Tilemap[] = INCBIN_U32("graphics/pokedex/search_menu_hoenn.bin.lz");
-const u16 gSummaryScreenPowAcc_Tilemap[] = INCBIN_U16("graphics/interface/powacc_tilemap.bin");
-const u16 gSummaryScreenAppealJam_Tilemap[] = INCBIN_U16("graphics/interface/appealjam_tilemap.bin");
-const u16 gSummaryScreenWindow_Tilemap[] = INCBIN_U16("graphics/interface/summary.bin");
+const u16 gSummaryScreen_MoveEffect_Battle_Tilemap[] = INCBIN_U16("graphics/summary_screen/effect_battle.bin");
+const u16 gSummaryScreen_MoveEffect_Contest_Tilemap[] = INCBIN_U16("graphics/summary_screen/effect_contest.bin");
+const u16 gSummaryScreen_MoveEffect_Cancel_Tilemap[] = INCBIN_U16("graphics/summary_screen/effect_cancel.bin");
const u16 gIntroCopyright_Pal[] = INCBIN_U16("graphics/intro/copyright.gbapal");
const u32 gIntroCopyright_Gfx[] = INCBIN_U32("graphics/intro/copyright.4bpp.lz");
@@ -1759,14 +1762,12 @@ const u32 gIntroCopyright_Tilemap[] = INCBIN_U32("graphics/intro/copyright.bin.l
const u16 gPokedexAreaScreenAreaUnknown_Pal[] = INCBIN_U16("graphics/pokedex/area_unknown.gbapal");
const u32 gPokedexAreaScreenAreaUnknown_Gfx[] = INCBIN_U32("graphics/pokedex/area_unknown.4bpp.lz");
-// seems to be fire red leftovers, but the menu elements is reused in the item menu for TM descriptions.
-
const u16 gMenuInfoElements1_Pal[] = INCBIN_U16("graphics/interface/menu_info1.gbapal");
const u16 gMenuInfoElements2_Pal[] = INCBIN_U16("graphics/interface/menu_info2.gbapal");
const u16 gMenuInfoElements3_Pal[] = INCBIN_U16("graphics/interface/menu_info3.gbapal");
-const u8 gMenuInfoElements_Gfx[] = INCBIN_U8("graphics/interface/menu_info.4bpp"); //the types are reused for item menu
+const u8 gMenuInfoElements_Gfx[] = INCBIN_U8("graphics/interface/menu_info.4bpp");
-const u8 gBagMenuHMIcon_Gfx[] = INCBIN_U8("graphics/interface/hm.4bpp");
+const u8 gBagMenuHMIcon_Gfx[] = INCBIN_U8("graphics/bag/hm.4bpp");
// contest results screen
@@ -1820,8 +1821,8 @@ const u32 gRegionMapCityZoomText_Gfx[] = INCBIN_U32("graphics/pokenav/city_zoom_
const u16 gPokenavConditionCancel_Pal[] = INCBIN_U16("graphics/pokenav/condition/cancel.gbapal");
const u8 gPokenavConditionCancel_Gfx[] = INCBIN_U8("graphics/pokenav/condition/cancel.4bpp");
-const u16 gMonMarkingsMenu_Pal[] = INCBIN_U16("graphics/misc/mon_markings_menu.gbapal");
-const u8 gMonMarkingsMenu_Gfx[] = INCBIN_U8("graphics/misc/mon_markings_menu.4bpp");
+const u16 gMonMarkingsMenu_Pal[] = INCBIN_U16("graphics/interface/mon_markings_menu.gbapal");
+const u8 gMonMarkingsMenu_Gfx[] = INCBIN_U8("graphics/interface/mon_markings_menu.4bpp");
const u16 gBerryBlenderMiscPalette[] = INCBIN_U16("graphics/berry_blender/misc.gbapal");
const u16 gBerryBlenderArrowPalette[] = INCBIN_U16("graphics/berry_blender/arrow.gbapal");
@@ -1938,9 +1939,9 @@ const u32 gTilesetTiles_General[] = INCBIN_U32("data/tilesets/primary/general/ti
// trade/egg hatch
-const u16 gTradeGba_Pal[] = INCBIN_U16("graphics/link/gba.gbapal");
-const u16 gTradeGba2_Pal[] = INCBIN_U16("graphics/link/gba_pal2.gbapal");
-const u8 gTradeGba_Gfx[] = INCBIN_U8("graphics/link/gba.4bpp");
+const u16 gTradeGba_Pal[] = INCBIN_U16("graphics/trade/gba.gbapal");
+const u16 gTradeGba2_Pal[] = INCBIN_U16("graphics/trade/gba_pal2.gbapal");
+const u8 gTradeGba_Gfx[] = INCBIN_U8("graphics/trade/gba.4bpp");
static const u16 sEmptyPal[16] = {0};
@@ -1997,12 +1998,12 @@ const u16 gMonIconPalettes[][16] =
const u16 gTitleScreenBgPalettes[] = INCBIN_U16("graphics/title_screen/pokemon_logo.gbapal",
"graphics/title_screen/rayquaza_and_clouds.gbapal");
const u16 gTitleScreenEmeraldVersionPal[] = INCBIN_U16("graphics/title_screen/emerald_version.gbapal");
-const u32 gTitleScreenCloudsTilemap[] = INCBIN_U32("graphics/title_screen/title_screen1.bin.lz");
+const u32 gTitleScreenCloudsTilemap[] = INCBIN_U32("graphics/title_screen/clouds.bin.lz");
const u32 gTitleScreenPokemonLogoGfx[] = INCBIN_U32("graphics/title_screen/pokemon_logo.8bpp.lz");
const u32 gTitleScreenEmeraldVersionGfx[] = INCBIN_U32("graphics/title_screen/emerald_version.8bpp.lz");
const u16 gTitleScreenPressStartPal[] = INCBIN_U16("graphics/title_screen/press_start.gbapal");
const u32 gTitleScreenPressStartGfx[] = INCBIN_U32("graphics/title_screen/press_start.4bpp.lz");
-const u32 gTitleScreenPokemonLogoTilemap[] = INCBIN_U32("graphics/title_screen/title_screen2.bin.lz");
+const u32 gTitleScreenPokemonLogoTilemap[] = INCBIN_U32("graphics/title_screen/pokemon_logo.bin.lz");
// size in LoadPalette calls is reported as 0xD0 << 1, which is 0x1A0, but palette is only 0x100 bytes long so it loads garbage as well
const u16 gFrontierPassBg_Pal[][16] = INCBIN_U16("graphics/frontier_pass/bg.gbapal");
@@ -2015,7 +2016,7 @@ const u16 gFrontierPassCancelButtonHighlighted_Tilemap[] = INCBIN_U16("graphics/
// Berry Crush
const u16 gBerryCrush_Crusher_Pal[] = INCBIN_U16("graphics/berry_crush/crusher.gbapal");
const u32 gBerryCrush_Crusher_Gfx[] = INCBIN_U32("graphics/berry_crush/crusher.4bpp.lz");
-const u32 gBerryCrush_Crusher_Tilemap[] = INCBIN_U32("graphics/berry_crush/crusher.bin.lz");
+const u32 gBerryCrush_TextWindows_Tilemap[] = INCBIN_U32("graphics/berry_crush/text_windows.bin.lz");
// random garbage at the end.
static const u8 sEmpty3[0x54BAC] = {0};
diff --git a/src/item.c b/src/item.c
index 027800c1e6..0a65540af5 100644
--- a/src/item.c
+++ b/src/item.c
@@ -913,9 +913,9 @@ u8 ItemId_GetImportance(u16 itemId)
}
// unused
-u8 ItemId_GetUnknownValue(u16 itemId)
+u8 ItemId_GetRegistrability(u16 itemId)
{
- return gItems[SanitizeItemId(itemId)].unk19;
+ return gItems[SanitizeItemId(itemId)].registrability;
}
u8 ItemId_GetPocket(u16 itemId)
@@ -959,14 +959,15 @@ bool32 IsPinchBerryItemEffect(u16 holdEffect)
case HOLD_EFFECT_SP_DEFENSE_UP:
case HOLD_EFFECT_CRITICAL_UP:
case HOLD_EFFECT_RANDOM_STAT_UP:
- #ifdef HOLD_EFFECT_CUSTAP_BERRY
case HOLD_EFFECT_CUSTAP_BERRY:
- #endif
- #ifdef HOLD_EFFECT_MICLE_BERRY
case HOLD_EFFECT_MICLE_BERRY:
- #endif
return TRUE;
}
return FALSE;
}
+
+u8 ItemId_GetFlingPower(u16 itemId)
+{
+ return gItems[SanitizeItemId(itemId)].flingPower;
+}
diff --git a/src/item_menu.c b/src/item_menu.c
index ba5a8ddaa0..a1f7db6569 100755
--- a/src/item_menu.c
+++ b/src/item_menu.c
@@ -372,7 +372,7 @@ static const struct ScrollArrowsTemplate sBagScrollArrowsTemplate = {
.palNum = 0,
};
-static const u8 sRegisteredSelect_Gfx[] = INCBIN_U8("graphics/interface/select_button.4bpp");
+static const u8 sRegisteredSelect_Gfx[] = INCBIN_U8("graphics/bag/select_button.4bpp");
enum {
COLORID_NORMAL,
diff --git a/src/item_menu_icons.c b/src/item_menu_icons.c
index 0bf6f94c65..598be18a0f 100644
--- a/src/item_menu_icons.c
+++ b/src/item_menu_icons.c
@@ -33,8 +33,8 @@ static void SpriteCB_SwitchPocketRotatingBallInit(struct Sprite *sprite);
static void SpriteCB_SwitchPocketRotatingBallContinue(struct Sprite *sprite);
// static const rom data
-static const u16 gRotatingBall_Pal[] = INCBIN_U16("graphics/interface/bag_spinner.gbapal");
-static const u8 gRotatingBall[] = INCBIN_U8("graphics/interface/bag_spinner.4bpp");
+static const u16 sRotatingBall_Pal[] = INCBIN_U16("graphics/bag/rotating_ball.gbapal");
+static const u8 sRotatingBall_Gfx[] = INCBIN_U8("graphics/bag/rotating_ball.4bpp");
static const u8 gCherryUnused[] = INCBIN_U8("graphics/unused/cherry.4bpp");
static const u16 gCherryUnused_Pal[] = INCBIN_U16("graphics/unused/cherry.gbapal");
@@ -200,12 +200,12 @@ static const union AffineAnimCmd *const sRotatingBallAnimCmds_FullRotation[] =
static const struct SpriteSheet sRotatingBallTable =
{
- gRotatingBall, 0x80, TAG_ROTATING_BALL_GFX
+ sRotatingBall_Gfx, 0x80, TAG_ROTATING_BALL_GFX
};
static const struct SpritePalette sRotatingBallPaletteTable =
{
- gRotatingBall_Pal, TAG_ROTATING_BALL_GFX
+ sRotatingBall_Pal, TAG_ROTATING_BALL_GFX
};
static const struct SpriteTemplate sRotatingBallSpriteTemplate =
diff --git a/src/item_use.c b/src/item_use.c
index 28a97bb08c..b4aa1c1e51 100755
--- a/src/item_use.c
+++ b/src/item_use.c
@@ -404,25 +404,25 @@ static bool8 IsHiddenItemPresentInConnection(struct MapConnection *connection, i
switch (connection->direction)
{
// same weird temp variable behavior seen in IsHiddenItemPresentAtCoords
- case 2:
+ case CONNECTION_NORTH:
localOffset = connection->offset + MAP_OFFSET;
localX = x - localOffset;
localLength = mapHeader->mapLayout->height - MAP_OFFSET;
localY = localLength + y; // additions are reversed for some reason
break;
- case 1:
+ case CONNECTION_SOUTH:
localOffset = connection->offset + MAP_OFFSET;
localX = x - localOffset;
localLength = gMapHeader.mapLayout->height + MAP_OFFSET;
localY = y - localLength;
break;
- case 3:
+ case CONNECTION_WEST:
localLength = mapHeader->mapLayout->width - MAP_OFFSET;
localX = localLength + x; // additions are reversed for some reason
localOffset = connection->offset + MAP_OFFSET;
localY = y - localOffset;
break;
- case 4:
+ case CONNECTION_EAST:
localLength = gMapHeader.mapLayout->width + MAP_OFFSET;
localX = x - localLength;
localOffset = connection->offset + MAP_OFFSET;
@@ -726,11 +726,11 @@ static void ItemUseOnFieldCB_WailmerPailBerry(u8 taskId)
static bool8 TryToWaterSudowoodo(void)
{
u16 x, y;
- u8 z;
+ u8 elevation;
u8 objId;
GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
- z = PlayerGetZCoord();
- objId = GetObjectEventIdByXYZ(x, y, z);
+ elevation = PlayerGetElevation();
+ objId = GetObjectEventIdByPosition(x, y, elevation);
if (objId == OBJECT_EVENTS_COUNT || gObjectEvents[objId].graphicsId != OBJ_EVENT_GFX_SUDOWOODO)
return FALSE;
else
@@ -948,34 +948,33 @@ void ItemUseOutOfBattle_EvolutionStone(u8 taskId)
SetUpItemUseCallback(taskId);
}
-u32 CanThrowBall(void)
+static u32 GetBallThrowableState(void)
{
if (IsBattlerAlive(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT))
- && IsBattlerAlive(GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)))
- {
- return 1; // There are two present pokemon.
- }
+ && IsBattlerAlive(GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)))
+ return BALL_THROW_UNABLE_TWO_MONS;
else if (IsPlayerPartyAndPokemonStorageFull() == TRUE)
- {
- return 2; // No room for mon
- }
- #if B_SEMI_INVULNERABLE_CATCH >= GEN_4
+ return BALL_THROW_UNABLE_NO_ROOM;
+#if B_SEMI_INVULNERABLE_CATCH >= GEN_4
else if (gStatuses3[GetCatchingBattler()] & STATUS3_SEMI_INVULNERABLE)
- {
- return 3; // in semi-invulnerable state
- }
- #endif
-
- return 0; // usable
+ return BALL_THROW_UNABLE_SEMI_INVULNERABLE;
+#endif
+
+ return BALL_THROW_ABLE;
+}
+
+bool32 CanThrowBall(void)
+{
+ return (GetBallThrowableState() == BALL_THROW_ABLE);
}
static const u8 sText_CantThrowPokeBall_TwoMons[] = _("Cannot throw a ball!\nThere are two Pokémon out there!\p");
static const u8 sText_CantThrowPokeBall_SemiInvulnerable[] = _("Cannot throw a ball!\nThere's no Pokémon in sight!\p");
void ItemUseInBattle_PokeBall(u8 taskId)
{
- switch (CanThrowBall())
+ switch (GetBallThrowableState())
{
- case 0: // usable
+ case BALL_THROW_ABLE:
default:
RemoveBagItem(gSpecialVar_ItemId, 1);
if (!InBattlePyramid())
@@ -983,20 +982,20 @@ void ItemUseInBattle_PokeBall(u8 taskId)
else
CloseBattlePyramidBag(taskId);
break;
- case 1: // There are two present pokemon.
+ case BALL_THROW_UNABLE_TWO_MONS:
if (!InBattlePyramid())
DisplayItemMessage(taskId, FONT_NORMAL, sText_CantThrowPokeBall_TwoMons, CloseItemMessage);
else
DisplayItemMessageInBattlePyramid(taskId, sText_CantThrowPokeBall_TwoMons, Task_CloseBattlePyramidBagMessage);
break;
- case 2: // No room for mon
+ case BALL_THROW_UNABLE_NO_ROOM:
if (!InBattlePyramid())
DisplayItemMessage(taskId, FONT_NORMAL, gText_BoxFull, CloseItemMessage);
else
DisplayItemMessageInBattlePyramid(taskId, gText_BoxFull, Task_CloseBattlePyramidBagMessage);
break;
#if B_SEMI_INVULNERABLE_CATCH >= GEN_4
- case 3: // Semi-Invulnerable
+ case BALL_THROW_UNABLE_SEMI_INVULNERABLE:
if (!InBattlePyramid())
DisplayItemMessage(taskId, FONT_NORMAL, sText_CantThrowPokeBall_SemiInvulnerable, CloseItemMessage);
else
diff --git a/src/libgcnmultiboot.s b/src/libgcnmultiboot.s
index 5ecc7d2f90..968a0836ec 100644
--- a/src/libgcnmultiboot.s
+++ b/src/libgcnmultiboot.s
@@ -40,7 +40,7 @@
.text
thumb_func_start GameCubeMultiBoot_Hash
-GameCubeMultiBoot_Hash: @ 82DED70
+GameCubeMultiBoot_Hash:
push {r4,lr}
ldr r4, pool_HashVal
eors r3, r1
@@ -61,7 +61,7 @@ GameCubeMultiBoot_Hash_SkipEor:
thumb_func_start GameCubeMultiBoot_Main
@ void GameCubeMultiBoot_Main(struct GameCubeMultiBoot *mb);
-GameCubeMultiBoot_Main: @ 82DED84
+GameCubeMultiBoot_Main:
@ If there is no interrupt handler, skip counter manipulation
ldr r1, [r0, GCMB_STRUCT_SERIAL_INTR_HANDLER]
cmp r1, 0
@@ -246,7 +246,7 @@ pool_NintendoLogo: .4byte RomHeaderNintendoLogo
thumb_func_start GameCubeMultiBoot_ExecuteProgram
@ void GameCubeMultiBoot_ExecuteProgram(struct GameCubeMultiBoot *mb);
-GameCubeMultiBoot_ExecuteProgram: @ 82DEE84
+GameCubeMultiBoot_ExecuteProgram:
@ If there's no multiboot image ready, just return to caller
ldrb r1, [r0, GCMB_STRUCT_MBPROGRESS]
cmp r1, MBPROGRESS_READY_TO_BOOT
@@ -265,7 +265,7 @@ GameCubeMultiBoot_ExecuteProgram_Fail:
thumb_func_start GameCubeMultiBoot_Init
@ void GameCubeMultiBoot_Init(struct GameCubeMultiBoot *mb);
-GameCubeMultiBoot_Init: @ 82DEE98
+GameCubeMultiBoot_Init:
ldr r3, pool_InterruptRegs
@ Save IME register.
@@ -336,7 +336,7 @@ GameCubeMultiBoot_Init_ClearStructLoop:
non_word_aligned_thumb_func_start GameCubeMultiBoot_HandleSerialInterrupt
@ void GameCubeMultiBoot_HandleSerialInterrupt(struct GameCubeMultiBoot *mb);
-GameCubeMultiBoot_HandleSerialInterrupt: @ 82DEEE2
+GameCubeMultiBoot_HandleSerialInterrupt:
ldr r3, pool_SerialRegs
@ Acknowledge reset/receive/send flags.
@@ -400,7 +400,7 @@ GameCubeMultiBoot_BeginHandshake:
.align 2, 0
-GcMbIntrHandler_CheckGameCodeSent: @ 82DEF24
+GcMbIntrHandler_CheckGameCodeSent:
lsls r1, 31
bcc GcMbIntrHandler_Stop @ stop if send failed
bmi GameCubeMultiBoot_CheckHandshakeResponse @ branch if receive is complete
@@ -412,7 +412,7 @@ GcMbIntrHandler_CheckGameCodeSent: @ 82DEF24
.align 2, 0
-GcMbIntrHandler_CheckHandshakeResponse: @ 82DEF30
+GcMbIntrHandler_CheckHandshakeResponse:
lsrs r1, 1 @ is receive complete?
bcc GcMbIntrHandler_Stop @ stop if not
@@ -429,7 +429,7 @@ GameCubeMultiBoot_CheckHandshakeResponse:
.align 2, 0
-GcMbIntrHandler_ReceiveKeyA: @ 82DEF44
+GcMbIntrHandler_ReceiveKeyA:
lsrs r1, 1 @ is receive complete?
bcc GcMbIntrHandler_Stop @ branch if not
ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120]
@@ -473,7 +473,7 @@ GameCubeMultiBoot_KeyBCheckEnd:
.align 2, 0
-GcMbIntrHandler_CheckKeyBSent: @ 82DEF84
+GcMbIntrHandler_CheckKeyBSent:
lsls r1, 31
bcc GcMbIntrHandler_Stop @ stop if send failed
bmi GameCubeMultiBoot_CheckImageSizeResponse @ branch if receive is complete
@@ -482,7 +482,7 @@ GcMbIntrHandler_CheckKeyBSent: @ 82DEF84
.align 2, 0
-GcMbIntrHandler_CheckImageSizeResponse: @ 82DEF90
+GcMbIntrHandler_CheckImageSizeResponse:
lsrs r1, 1 @ is receive complete?
bcc GcMbIntrHandler_Stop @ branch if not
GameCubeMultiBoot_CheckImageSizeResponse:
@@ -505,7 +505,7 @@ GcMbIntrHandler_StopIfNotEqual:
.align 2, 0
-GcMbIntrHandler_CheckImageResponse: @ 82DEFB4
+GcMbIntrHandler_CheckImageResponse:
lsrs r1, 1 @ is receive complete?
bcc GcMbIntrHandler_Stop @ branch if not
ldr r2, [r0, GCMB_STRUCT_CUR_DEST_PTR]
@@ -553,7 +553,7 @@ GcMbIntrHandler_StopIfSendFailed:
.align 2, 0
-GcMbIntrHandler_CheckKeyCDerivationSent: @ 82DEFF0
+GcMbIntrHandler_CheckKeyCDerivationSent:
lsls r1, 31
bcc GcMbIntrHandler_StopIfSendFailed @ branch if send failed
bmi GameCubeMultiBoot_CheckBootKeyResponse @ branch if receive is complete
@@ -562,7 +562,7 @@ GcMbIntrHandler_CheckKeyCDerivationSent: @ 82DEFF0
.align 2, 0
-GcMbIntrHandler_CheckBootKeyResponse: @ 82DEFFC
+GcMbIntrHandler_CheckBootKeyResponse:
lsrs r1, 1 @ is receive complete?
bcc GcMbIntrHandler_StopIfSendFailed @ branch if not
@@ -580,14 +580,14 @@ GameCubeMultiBoot_CheckBootKeyResponse:
.align 2, 0
-GcMbIntrHandler_StopUnconditionally: @ 82DF010
+GcMbIntrHandler_StopUnconditionally:
b GcMbIntrHandler_Stop
thumb_func_end GameCubeMultiBoot_HandleSerialInterrupt
non_word_aligned_thumb_func_start GameCubeMultiBoot_Quit
@ void GameCubeMultiBoot_Quit();
-GameCubeMultiBoot_Quit: @ 82DF012
+GameCubeMultiBoot_Quit:
ldr r3, pool_InterruptRegs
@ Save IME register.
diff --git a/src/link.c b/src/link.c
index 1084d4a6de..aa9a0d73df 100644
--- a/src/link.c
+++ b/src/link.c
@@ -158,13 +158,13 @@ static void DoSend(void);
static void StopTimer(void);
static void SendRecvDone(void);
-static const u16 sWirelessLinkDisplayPal[] = INCBIN_U16("graphics/interface/wireless_link_display.gbapal");
-static const u32 sWirelessLinkDisplayGfx[] = INCBIN_U32("graphics/interface/wireless_link_display.4bpp.lz");
-static const u32 sWirelessLinkDisplayTilemap[] = INCBIN_U32("graphics/interface/wireless_link_display.bin.lz");
-static const u16 sLinkTestDigitsPal[] = INCBIN_U16("graphics/interface/link_test_digits.gbapal");
-static const u16 sLinkTestDigitsGfx[] = INCBIN_U16("graphics/interface/link_test_digits.4bpp");
+static const u16 sWirelessLinkDisplayPal[] = INCBIN_U16("graphics/link/wireless_display.gbapal");
+static const u32 sWirelessLinkDisplayGfx[] = INCBIN_U32("graphics/link/wireless_display.4bpp.lz");
+static const u32 sWirelessLinkDisplayTilemap[] = INCBIN_U32("graphics/link/wireless_display.bin.lz");
+static const u16 sLinkTestDigitsPal[] = INCBIN_U16("graphics/link/test_digits.gbapal");
+static const u16 sLinkTestDigitsGfx[] = INCBIN_U16("graphics/link/test_digits.4bpp");
static const u8 sUnusedTransparentWhite[] = _("{HIGHLIGHT TRANSPARENT}{COLOR WHITE}");
-static const u16 sCommErrorBg_Gfx[] = INCBIN_U16("graphics/interface/comm_error_bg.4bpp");
+static const u16 sCommErrorBg_Gfx[] = INCBIN_U16("graphics/link/comm_error_bg.4bpp");
static const struct BlockRequest sBlockRequests[] = {
[BLOCK_REQ_SIZE_NONE] = {gBlockSendBuffer, 200},
[BLOCK_REQ_SIZE_200] = {gBlockSendBuffer, 200},
diff --git a/src/link_rfu_3.c b/src/link_rfu_3.c
index 571f305d0e..1e1fe5b347 100644
--- a/src/link_rfu_3.c
+++ b/src/link_rfu_3.c
@@ -34,8 +34,8 @@ EWRAM_DATA u8 gWirelessStatusIndicatorSpriteId = 0;
static u8 sSequenceArrayValOffset;
-static const u16 sWirelessLinkIconPalette[] = INCBIN_U16("graphics/interface/wireless_link_icon.gbapal");
-static const u32 sWirelessLinkIconPic[] = INCBIN_U32("graphics/interface/wireless_link_icon.4bpp.lz");
+static const u16 sWirelessLinkIconPalette[] = INCBIN_U16("graphics/link/wireless_icon.gbapal");
+static const u32 sWirelessLinkIconPic[] = INCBIN_U32("graphics/link/wireless_icon.4bpp.lz");
// Most of the below two tables won't make sense with ASCII encoding.
static const u8 sWireless_ASCIItoRSETable[256] = {
diff --git a/src/m4a.c b/src/m4a.c
index b159e3873d..faeef83e79 100644
--- a/src/m4a.c
+++ b/src/m4a.c
@@ -83,7 +83,7 @@ void m4aSoundInit(void)
for (i = 0; i < NUM_MUSIC_PLAYERS; i++)
{
struct MusicPlayerInfo *mplayInfo = gMPlayTable[i].info;
- MPlayOpen(mplayInfo, gMPlayTable[i].track, gMPlayTable[i].unk_8);
+ MPlayOpen(mplayInfo, gMPlayTable[i].track, gMPlayTable[i].numTracks);
mplayInfo->unk_B = gMPlayTable[i].unk_A;
mplayInfo->memAccArea = gMPlayMemAccArea;
}
diff --git a/src/m4a_1.s b/src/m4a_1.s
index f71a5546e4..cc5d3238d6 100644
--- a/src/m4a_1.s
+++ b/src/m4a_1.s
@@ -1910,27 +1910,7 @@ _081DDD90:
.align 2, 0 @ Don't pad with nop.
- .bss
+ .bss
gDecodingBuffer: @ Used as a buffer for audio decoded from compressed DPCM
- .space 0x40
- .size gDecodingBuffer, .-gDecodingBuffer
-
- .global gMPlayTrack_BGM
-gMPlayTrack_BGM:
- .space 0x320
- .size gMPlayTrack_BGM, .-gMPlayTrack_BGM
-
- .global gMPlayTrack_SE1
-gMPlayTrack_SE1:
- .space 0xF0
- .size gMPlayTrack_SE1, .-gMPlayTrack_SE1
-
- .global gMPlayTrack_SE2
-gMPlayTrack_SE2:
- .space 0x2D0
- .size gMPlayTrack_SE2, .-gMPlayTrack_SE2
-
- .global gMPlayTrack_SE3
-gMPlayTrack_SE3:
- .space 0x50
- .size gMPlayTrack_SE3, .-gMPlayTrack_SE3
+ .space 0x40
+ .size gDecodingBuffer, .-gDecodingBuffer
diff --git a/src/mail_data.c b/src/mail_data.c
index ca50a687e7..99cf1f9edd 100644
--- a/src/mail_data.c
+++ b/src/mail_data.c
@@ -5,7 +5,6 @@
#include "pokemon_icon.h"
#include "text.h"
#include "international_string_util.h"
-#include "constants/easy_chat.h"
#define UNOWN_OFFSET 30000
diff --git a/src/main_menu.c b/src/main_menu.c
index 601e66cb9d..ed6158a9cf 100644
--- a/src/main_menu.c
+++ b/src/main_menu.c
@@ -104,7 +104,7 @@
* printing, and then wait for A or B to be pressed.
* - Then advance to Task_HandleMainMenuBPressed.
*
- * Task_NewGameBirchSpeechInit
+ * Task_NewGameBirchSpeech_Init
* - Load the sprites for the intro speech, start playing music
* Task_NewGameBirchSpeech_WaitToShowBirch
* - Spawn Task_NewGameBirchSpeech_FadeInTarget1OutTarget2
@@ -403,8 +403,8 @@ static const struct WindowTemplate gNewGameBirchSpeechTextWindows[] =
DUMMY_WIN_TEMPLATE
};
-static const u16 sMainMenuBgPal[] = INCBIN_U16("graphics/misc/main_menu_bg.gbapal");
-static const u16 sMainMenuTextPal[] = INCBIN_U16("graphics/misc/main_menu_text.gbapal");
+static const u16 sMainMenuBgPal[] = INCBIN_U16("graphics/interface/main_menu_bg.gbapal");
+static const u16 sMainMenuTextPal[] = INCBIN_U16("graphics/interface/main_menu_text.gbapal");
static const u8 sTextColor_Headers[] = {TEXT_DYNAMIC_COLOR_1, TEXT_DYNAMIC_COLOR_2, TEXT_DYNAMIC_COLOR_3};
static const u8 sTextColor_MenuInfo[] = {TEXT_DYNAMIC_COLOR_1, TEXT_COLOR_WHITE, TEXT_DYNAMIC_COLOR_3};
@@ -2090,7 +2090,7 @@ static void NewGameBirchSpeech_ShowGenderMenu(void)
DrawMainMenuWindowBorder(&gNewGameBirchSpeechTextWindows[1], 0xF3);
FillWindowPixelBuffer(1, PIXEL_FILL(1));
PrintMenuTable(1, ARRAY_COUNT(sMenuActions_Gender), sMenuActions_Gender);
- InitMenuInUpperLeftCornerNormal(1, 2, 0);
+ InitMenuInUpperLeftCornerNormal(1, ARRAY_COUNT(sMenuActions_Gender), 0);
PutWindowTilemap(1);
CopyWindowToVram(1, COPYWIN_FULL);
}
diff --git a/src/map_name_popup.c b/src/map_name_popup.c
index e44fb33833..8cf1a6bab1 100644
--- a/src/map_name_popup.c
+++ b/src/map_name_popup.c
@@ -38,35 +38,35 @@ static EWRAM_DATA u8 sPopupTaskId = 0;
// .rodata
static const u8 sMapPopUp_Table[][960] =
{
- [MAPPOPUP_THEME_WOOD] = INCBIN_U8("graphics/interface/map_popup/wood.4bpp"),
- [MAPPOPUP_THEME_MARBLE] = INCBIN_U8("graphics/interface/map_popup/marble.4bpp"),
- [MAPPOPUP_THEME_STONE] = INCBIN_U8("graphics/interface/map_popup/stone.4bpp"),
- [MAPPOPUP_THEME_BRICK] = INCBIN_U8("graphics/interface/map_popup/brick.4bpp"),
- [MAPPOPUP_THEME_UNDERWATER] = INCBIN_U8("graphics/interface/map_popup/underwater.4bpp"),
- [MAPPOPUP_THEME_STONE2] = INCBIN_U8("graphics/interface/map_popup/stone2.4bpp"),
+ [MAPPOPUP_THEME_WOOD] = INCBIN_U8("graphics/map_popup/wood.4bpp"),
+ [MAPPOPUP_THEME_MARBLE] = INCBIN_U8("graphics/map_popup/marble.4bpp"),
+ [MAPPOPUP_THEME_STONE] = INCBIN_U8("graphics/map_popup/stone.4bpp"),
+ [MAPPOPUP_THEME_BRICK] = INCBIN_U8("graphics/map_popup/brick.4bpp"),
+ [MAPPOPUP_THEME_UNDERWATER] = INCBIN_U8("graphics/map_popup/underwater.4bpp"),
+ [MAPPOPUP_THEME_STONE2] = INCBIN_U8("graphics/map_popup/stone2.4bpp"),
};
static const u8 sMapPopUp_OutlineTable[][960] =
{
- [MAPPOPUP_THEME_WOOD] = INCBIN_U8("graphics/interface/map_popup/wood_outline.4bpp"),
- [MAPPOPUP_THEME_MARBLE] = INCBIN_U8("graphics/interface/map_popup/marble_outline.4bpp"),
- [MAPPOPUP_THEME_STONE] = INCBIN_U8("graphics/interface/map_popup/stone_outline.4bpp"),
- [MAPPOPUP_THEME_BRICK] = INCBIN_U8("graphics/interface/map_popup/brick_outline.4bpp"),
- [MAPPOPUP_THEME_UNDERWATER] = INCBIN_U8("graphics/interface/map_popup/underwater_outline.4bpp"),
- [MAPPOPUP_THEME_STONE2] = INCBIN_U8("graphics/interface/map_popup/stone2_outline.4bpp"),
+ [MAPPOPUP_THEME_WOOD] = INCBIN_U8("graphics/map_popup/wood_outline.4bpp"),
+ [MAPPOPUP_THEME_MARBLE] = INCBIN_U8("graphics/map_popup/marble_outline.4bpp"),
+ [MAPPOPUP_THEME_STONE] = INCBIN_U8("graphics/map_popup/stone_outline.4bpp"),
+ [MAPPOPUP_THEME_BRICK] = INCBIN_U8("graphics/map_popup/brick_outline.4bpp"),
+ [MAPPOPUP_THEME_UNDERWATER] = INCBIN_U8("graphics/map_popup/underwater_outline.4bpp"),
+ [MAPPOPUP_THEME_STONE2] = INCBIN_U8("graphics/map_popup/stone2_outline.4bpp"),
};
static const u16 sMapPopUp_PaletteTable[][16] =
{
- [MAPPOPUP_THEME_WOOD] = INCBIN_U16("graphics/interface/map_popup/wood.gbapal"),
- [MAPPOPUP_THEME_MARBLE] = INCBIN_U16("graphics/interface/map_popup/marble_outline.gbapal"),
- [MAPPOPUP_THEME_STONE] = INCBIN_U16("graphics/interface/map_popup/stone_outline.gbapal"),
- [MAPPOPUP_THEME_BRICK] = INCBIN_U16("graphics/interface/map_popup/brick_outline.gbapal"),
- [MAPPOPUP_THEME_UNDERWATER] = INCBIN_U16("graphics/interface/map_popup/underwater_outline.gbapal"),
- [MAPPOPUP_THEME_STONE2] = INCBIN_U16("graphics/interface/map_popup/stone2_outline.gbapal"),
+ [MAPPOPUP_THEME_WOOD] = INCBIN_U16("graphics/map_popup/wood.gbapal"),
+ [MAPPOPUP_THEME_MARBLE] = INCBIN_U16("graphics/map_popup/marble_outline.gbapal"),
+ [MAPPOPUP_THEME_STONE] = INCBIN_U16("graphics/map_popup/stone_outline.gbapal"),
+ [MAPPOPUP_THEME_BRICK] = INCBIN_U16("graphics/map_popup/brick_outline.gbapal"),
+ [MAPPOPUP_THEME_UNDERWATER] = INCBIN_U16("graphics/map_popup/underwater_outline.gbapal"),
+ [MAPPOPUP_THEME_STONE2] = INCBIN_U16("graphics/map_popup/stone2_outline.gbapal"),
};
-static const u16 sMapPopUp_Palette_Underwater[16] = INCBIN_U16("graphics/interface/map_popup/underwater.gbapal");
+static const u16 sMapPopUp_Palette_Underwater[16] = INCBIN_U16("graphics/map_popup/underwater.gbapal");
static const u8 sRegionMapSectionId_To_PopUpThemeIdMapping[] =
{
diff --git a/src/mauville_old_man.c b/src/mauville_old_man.c
index 06c3b82886..681a3dadfd 100644
--- a/src/mauville_old_man.c
+++ b/src/mauville_old_man.c
@@ -1,7 +1,6 @@
#include "global.h"
#include "main.h"
#include "constants/songs.h"
-#include "constants/easy_chat.h"
#include "constants/event_objects.h"
#include "mauville_old_man.h"
#include "event_data.h"
diff --git a/src/menu.c b/src/menu.c
index d34f56329d..37a12a036f 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -1543,25 +1543,25 @@ static s8 Menu_ProcessGridInputRepeat(void)
{
return MENU_B_PRESSED;
}
- else if ((JOY_REPEAT(DPAD_ANY)) == DPAD_UP)
+ else if (JOY_REPEAT(DPAD_ANY) == DPAD_UP)
{
if (oldPos != ChangeGridMenuCursorPosition(0, -1))
PlaySE(SE_SELECT);
return MENU_NOTHING_CHOSEN;
}
- else if ((JOY_REPEAT(DPAD_ANY)) == DPAD_DOWN)
+ else if (JOY_REPEAT(DPAD_ANY) == DPAD_DOWN)
{
if (oldPos != ChangeGridMenuCursorPosition(0, 1))
PlaySE(SE_SELECT);
return MENU_NOTHING_CHOSEN;
}
- else if ((JOY_REPEAT(DPAD_ANY)) == DPAD_LEFT || GetLRKeysPressedAndHeld() == MENU_L_PRESSED)
+ else if (JOY_REPEAT(DPAD_ANY) == DPAD_LEFT || GetLRKeysPressedAndHeld() == MENU_L_PRESSED)
{
if (oldPos != ChangeGridMenuCursorPosition(-1, 0))
PlaySE(SE_SELECT);
return MENU_NOTHING_CHOSEN;
}
- else if ((JOY_REPEAT(DPAD_ANY)) == DPAD_RIGHT || GetLRKeysPressedAndHeld() == MENU_R_PRESSED)
+ else if (JOY_REPEAT(DPAD_ANY) == DPAD_RIGHT || GetLRKeysPressedAndHeld() == MENU_R_PRESSED)
{
if (oldPos != ChangeGridMenuCursorPosition(1, 0))
PlaySE(SE_SELECT);
diff --git a/src/menu_helpers.c b/src/menu_helpers.c
index 48af41d69e..bb7830c311 100644
--- a/src/menu_helpers.c
+++ b/src/menu_helpers.c
@@ -71,12 +71,12 @@ static const union AnimCmd *const sAnims_SwapLine[] =
static const struct CompressedSpriteSheet sSpriteSheet_SwapLine =
{
- gBagSwapLineGfx, 0x100, TAG_SWAP_LINE
+ gSwapLineGfx, 0x100, TAG_SWAP_LINE
};
static const struct CompressedSpritePalette sSpritePalette_SwapLine =
{
- gBagSwapLinePal, TAG_SWAP_LINE
+ gSwapLinePal, TAG_SWAP_LINE
};
static const struct SpriteTemplate sSpriteTemplate_SwapLine =
diff --git a/src/metatile_behavior.c b/src/metatile_behavior.c
index 6b58e3f05b..72d3ac632f 100644
--- a/src/metatile_behavior.c
+++ b/src/metatile_behavior.c
@@ -2,254 +2,129 @@
#include "metatile_behavior.h"
#include "constants/metatile_behaviors.h"
-#define TILE_FLAG_ENCOUNTER_TILE 1
-#define TILE_FLAG_SURFABLE 2
+#define TILE_FLAG_HAS_ENCOUNTERS (1 << 0)
+#define TILE_FLAG_SURFABLE (1 << 1)
+#define TILE_FLAG_UNUSED (1 << 2) // Roughly all of the traversable metatiles. Set but never read
-#define TILE_ATTRIBUTES(unused, surfable, wildEncounter) (((wildEncounter) ? 1 : 0) | ((surfable) ? 2 : 0) | ((unused) ? 4 : 0))
-
-// wonder what the third flag is supposed to do
-static const u8 sTileBitAttributes[] =
+static const u8 sTileBitAttributes[NUM_METATILE_BEHAVIORS] =
{
- [MB_NORMAL] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_SECRET_BASE_WALL] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_TALL_GRASS] = TILE_ATTRIBUTES(TRUE, FALSE, TRUE),
- [MB_LONG_GRASS] = TILE_ATTRIBUTES(TRUE, FALSE, TRUE),
- [MB_UNUSED_04] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_05] = TILE_ATTRIBUTES(FALSE, FALSE, TRUE),
- [MB_DEEP_SAND] = TILE_ATTRIBUTES(TRUE, FALSE, TRUE),
- [MB_SHORT_GRASS] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_UNUSED_CAVE] = TILE_ATTRIBUTES(TRUE, FALSE, TRUE),
- [MB_LONG_GRASS_SOUTH_EDGE] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_NO_RUNNING] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_INDOOR_ENCOUNTER] = TILE_ATTRIBUTES(TRUE, FALSE, TRUE),
- [MB_MOUNTAIN_TOP] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_BATTLE_PYRAMID_WARP] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_MOSSDEEP_GYM_WARP] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_MT_PYRE_HOLE] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_POND_WATER] = TILE_ATTRIBUTES(TRUE, TRUE, TRUE),
- [MB_SEMI_DEEP_WATER] = TILE_ATTRIBUTES(TRUE, TRUE, TRUE),
- [MB_DEEP_WATER] = TILE_ATTRIBUTES(TRUE, TRUE, TRUE),
- [MB_WATERFALL] = TILE_ATTRIBUTES(TRUE, TRUE, FALSE),
- [MB_SOOTOPOLIS_DEEP_WATER] = TILE_ATTRIBUTES(TRUE, TRUE, FALSE),
- [MB_OCEAN_WATER] = TILE_ATTRIBUTES(TRUE, TRUE, TRUE),
- [MB_PUDDLE] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_SHALLOW_WATER] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_UNUSED_SOOTOPOLIS_DEEP_WATER] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_NO_SURFACING] = TILE_ATTRIBUTES(TRUE, TRUE, FALSE),
- [MB_UNUSED_SOOTOPOLIS_DEEP_WATER_2] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_STAIRS_OUTSIDE_ABANDONED_SHIP] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_SHOAL_CAVE_ENTRANCE] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_UNUSED_1D] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_1E] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_1F] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_ICE] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_SAND] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_SEAWEED] = TILE_ATTRIBUTES(TRUE, TRUE, TRUE),
- [MB_UNUSED_23] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_ASHGRASS] = TILE_ATTRIBUTES(TRUE, FALSE, TRUE),
- [MB_FOOTPRINTS] = TILE_ATTRIBUTES(TRUE, FALSE, TRUE),
- [MB_THIN_ICE] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_CRACKED_ICE] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_HOT_SPRINGS] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_LAVARIDGE_GYM_B1F_WARP] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_SEAWEED_NO_SURFACING] = TILE_ATTRIBUTES(TRUE, TRUE, TRUE),
- [MB_REFLECTION_UNDER_BRIDGE] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_UNUSED_2C] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_2D] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_2E] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_2F] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_IMPASSABLE_EAST] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_IMPASSABLE_WEST] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_IMPASSABLE_NORTH] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_IMPASSABLE_SOUTH] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_IMPASSABLE_NORTHEAST] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_IMPASSABLE_NORTHWEST] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_IMPASSABLE_SOUTHEAST] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_IMPASSABLE_SOUTHWEST] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_JUMP_EAST] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_JUMP_WEST] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_JUMP_NORTH] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_JUMP_SOUTH] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_JUMP_NORTHEAST] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_JUMP_NORTHWEST] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_JUMP_SOUTHEAST] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_JUMP_SOUTHWEST] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_WALK_EAST] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_WALK_WEST] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_WALK_NORTH] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_WALK_SOUTH] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_SLIDE_EAST] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_SLIDE_WEST] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_SLIDE_NORTH] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_SLIDE_SOUTH] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_TRICK_HOUSE_PUZZLE_8_FLOOR] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_UNUSED_49] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_UNUSED_4A] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_UNUSED_4B] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_4C] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_4D] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_4E] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_4F] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_EASTWARD_CURRENT] = TILE_ATTRIBUTES(TRUE, TRUE, FALSE),
- [MB_WESTWARD_CURRENT] = TILE_ATTRIBUTES(TRUE, TRUE, FALSE),
- [MB_NORTHWARD_CURRENT] = TILE_ATTRIBUTES(TRUE, TRUE, FALSE),
- [MB_SOUTHWARD_CURRENT] = TILE_ATTRIBUTES(TRUE, TRUE, FALSE),
- [MB_UNUSED_54] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_55] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_56] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_57] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_58] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_59] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_5A] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_5B] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_5C] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_5D] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_5E] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_5F] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_NON_ANIMATED_DOOR] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_LADDER] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_EAST_ARROW_WARP] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_WEST_ARROW_WARP] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_NORTH_ARROW_WARP] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_SOUTH_ARROW_WARP] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_CRACKED_FLOOR_HOLE] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_AQUA_HIDEOUT_WARP] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_LAVARIDGE_GYM_1F_WARP] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_ANIMATED_DOOR] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_UP_ESCALATOR] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_DOWN_ESCALATOR] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_WATER_DOOR] = TILE_ATTRIBUTES(TRUE, TRUE, FALSE),
- [MB_WATER_SOUTH_ARROW_WARP] = TILE_ATTRIBUTES(TRUE, TRUE, FALSE),
- [MB_DEEP_SOUTH_WARP] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_UNUSED_6F] = TILE_ATTRIBUTES(TRUE, TRUE, FALSE),
- [MB_BRIDGE_OVER_OCEAN] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_BRIDGE_OVER_POND_LOW] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_BRIDGE_OVER_POND_MED] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_BRIDGE_OVER_POND_HIGH] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_PACIFIDLOG_VERTICAL_LOG_TOP] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_PACIFIDLOG_VERTICAL_LOG_BOTTOM] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_PACIFIDLOG_HORIZONTAL_LOG_LEFT] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_PACIFIDLOG_HORIZONTAL_LOG_RIGHT] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_FORTREE_BRIDGE] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_UNUSED_79] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_BRIDGE_OVER_POND_MED_EDGE_1] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_BRIDGE_OVER_POND_MED_EDGE_2] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_BRIDGE_OVER_POND_HIGH_EDGE_1] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_BRIDGE_OVER_POND_HIGH_EDGE_2] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_UNUSED_BRIDGE] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_BIKE_BRIDGE_OVER_BARRIER] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_COUNTER] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_81] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_82] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_PC] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_CABLE_BOX_RESULTS_1] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_REGION_MAP] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_TELEVISION] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_POKEBLOCK_FEEDER] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_88] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_SLOT_MACHINE] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_ROULETTE] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_CLOSED_SOOTOPOLIS_DOOR] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_TRICK_HOUSE_PUZZLE_DOOR] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_PETALBURG_GYM_DOOR] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_RUNNING_SHOES_INSTRUCTION] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_QUESTIONNAIRE] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_SECRET_BASE_SPOT_RED_CAVE] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_SECRET_BASE_SPOT_RED_CAVE_OPEN] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_SECRET_BASE_SPOT_BROWN_CAVE] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_SECRET_BASE_SPOT_BROWN_CAVE_OPEN] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_SECRET_BASE_SPOT_YELLOW_CAVE] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_SECRET_BASE_SPOT_YELLOW_CAVE_OPEN] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_SECRET_BASE_SPOT_TREE_LEFT] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_SECRET_BASE_SPOT_TREE_LEFT_OPEN] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_SECRET_BASE_SPOT_SHRUB] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_SECRET_BASE_SPOT_SHRUB_OPEN] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_SECRET_BASE_SPOT_BLUE_CAVE] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_SECRET_BASE_SPOT_BLUE_CAVE_OPEN] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_SECRET_BASE_SPOT_TREE_RIGHT] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_SECRET_BASE_SPOT_TREE_RIGHT_OPEN] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_9E] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_9F] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_BERRY_TREE_SOIL] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_A1] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_A2] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_A3] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_A4] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_A5] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_A6] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_A7] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_A8] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_A9] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_AA] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_AB] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_AC] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_AD] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_AE] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_AF] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_SECRET_BASE_PC] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_SECRET_BASE_REGISTER_PC] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_SECRET_BASE_UNUSED] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_BLOCK_DECORATION] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_SECRET_BASE_DECORATION] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_HOLDS_SMALL_DECORATION] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_UNUSED_B6] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_SECRET_BASE_NORTH_WALL] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_SECRET_BASE_BALLOON] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_SECRET_BASE_IMPASSABLE] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_SECRET_BASE_GLITTER_MAT] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_SECRET_BASE_JUMP_MAT] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_SECRET_BASE_SPIN_MAT] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_SECRET_BASE_SOUND_MAT] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_SECRET_BASE_BREAKABLE_DOOR] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_SECRET_BASE_SAND_ORNAMENT] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_IMPASSABLE_SOUTH_AND_NORTH] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_IMPASSABLE_WEST_AND_EAST] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_SECRET_BASE_HOLE] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_HOLDS_LARGE_DECORATION] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_SECRET_BASE_TV_SHIELD] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_PLAYER_ROOM_PC_ON] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_SECRET_BASE_DECORATION_BASE] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_SECRET_BASE_POSTER] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_C8] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_C9] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_CA] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_CB] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_CC] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_CD] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_CE] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_CF] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_MUDDY_SLOPE] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_BUMPY_SLOPE] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_CRACKED_FLOOR] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_ISOLATED_VERTICAL_RAIL] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_ISOLATED_HORIZONTAL_RAIL] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_VERTICAL_RAIL] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_HORIZONTAL_RAIL] = TILE_ATTRIBUTES(TRUE, FALSE, FALSE),
- [MB_UNUSED_D7] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_D8] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_D9] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_DA] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_DB] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_DC] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_DD] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_DE] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_DF] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_PICTURE_BOOK_SHELF] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_BOOKSHELF] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_POKEMON_CENTER_BOOKSHELF] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_VASE] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_TRASH_CAN] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_SHOP_SHELF] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_BLUEPRINT] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_CABLE_BOX_RESULTS_2] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_WIRELESS_BOX_RESULTS] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_TRAINER_HILL_TIMER] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_SKY_PILLAR_CLOSED_DOOR] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_EB] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_EC] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_ED] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_EE] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
- [MB_UNUSED_EF] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE),
+ [MB_NORMAL] = TILE_FLAG_UNUSED,
+ [MB_TALL_GRASS] = TILE_FLAG_UNUSED | TILE_FLAG_HAS_ENCOUNTERS,
+ [MB_LONG_GRASS] = TILE_FLAG_UNUSED | TILE_FLAG_HAS_ENCOUNTERS,
+ [MB_UNUSED_05] = TILE_FLAG_HAS_ENCOUNTERS,
+ [MB_DEEP_SAND] = TILE_FLAG_UNUSED | TILE_FLAG_HAS_ENCOUNTERS,
+ [MB_SHORT_GRASS] = TILE_FLAG_UNUSED,
+ [MB_CAVE] = TILE_FLAG_UNUSED | TILE_FLAG_HAS_ENCOUNTERS,
+ [MB_LONG_GRASS_SOUTH_EDGE] = TILE_FLAG_UNUSED,
+ [MB_NO_RUNNING] = TILE_FLAG_UNUSED,
+ [MB_INDOOR_ENCOUNTER] = TILE_FLAG_UNUSED | TILE_FLAG_HAS_ENCOUNTERS,
+ [MB_MOUNTAIN_TOP] = TILE_FLAG_UNUSED,
+ [MB_BATTLE_PYRAMID_WARP] = TILE_FLAG_UNUSED,
+ [MB_MOSSDEEP_GYM_WARP] = TILE_FLAG_UNUSED,
+ [MB_MT_PYRE_HOLE] = TILE_FLAG_UNUSED,
+ [MB_POND_WATER] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE | TILE_FLAG_HAS_ENCOUNTERS,
+ [MB_SEMI_DEEP_WATER] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE | TILE_FLAG_HAS_ENCOUNTERS,
+ [MB_DEEP_WATER] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE | TILE_FLAG_HAS_ENCOUNTERS,
+ [MB_WATERFALL] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE,
+ [MB_SOOTOPOLIS_DEEP_WATER] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE,
+ [MB_OCEAN_WATER] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE | TILE_FLAG_HAS_ENCOUNTERS,
+ [MB_PUDDLE] = TILE_FLAG_UNUSED,
+ [MB_SHALLOW_WATER] = TILE_FLAG_UNUSED,
+ [MB_NO_SURFACING] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE,
+ [MB_STAIRS_OUTSIDE_ABANDONED_SHIP] = TILE_FLAG_UNUSED,
+ [MB_SHOAL_CAVE_ENTRANCE] = TILE_FLAG_UNUSED,
+ [MB_ICE] = TILE_FLAG_UNUSED,
+ [MB_SAND] = TILE_FLAG_UNUSED,
+ [MB_SEAWEED] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE | TILE_FLAG_HAS_ENCOUNTERS,
+ [MB_UNUSED_23] = TILE_FLAG_UNUSED,
+ [MB_ASHGRASS] = TILE_FLAG_UNUSED | TILE_FLAG_HAS_ENCOUNTERS,
+ [MB_FOOTPRINTS] = TILE_FLAG_UNUSED | TILE_FLAG_HAS_ENCOUNTERS,
+ [MB_THIN_ICE] = TILE_FLAG_UNUSED,
+ [MB_CRACKED_ICE] = TILE_FLAG_UNUSED,
+ [MB_HOT_SPRINGS] = TILE_FLAG_UNUSED,
+ [MB_LAVARIDGE_GYM_B1F_WARP] = TILE_FLAG_UNUSED,
+ [MB_SEAWEED_NO_SURFACING] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE | TILE_FLAG_HAS_ENCOUNTERS,
+ [MB_REFLECTION_UNDER_BRIDGE] = TILE_FLAG_UNUSED,
+ [MB_IMPASSABLE_EAST] = TILE_FLAG_UNUSED,
+ [MB_IMPASSABLE_WEST] = TILE_FLAG_UNUSED,
+ [MB_IMPASSABLE_NORTH] = TILE_FLAG_UNUSED,
+ [MB_IMPASSABLE_SOUTH] = TILE_FLAG_UNUSED,
+ [MB_IMPASSABLE_NORTHEAST] = TILE_FLAG_UNUSED,
+ [MB_IMPASSABLE_NORTHWEST] = TILE_FLAG_UNUSED,
+ [MB_IMPASSABLE_SOUTHEAST] = TILE_FLAG_UNUSED,
+ [MB_IMPASSABLE_SOUTHWEST] = TILE_FLAG_UNUSED,
+ [MB_JUMP_NORTHEAST] = TILE_FLAG_UNUSED,
+ [MB_JUMP_NORTHWEST] = TILE_FLAG_UNUSED,
+ [MB_JUMP_SOUTHEAST] = TILE_FLAG_UNUSED,
+ [MB_JUMP_SOUTHWEST] = TILE_FLAG_UNUSED,
+ [MB_WALK_EAST] = TILE_FLAG_UNUSED,
+ [MB_WALK_WEST] = TILE_FLAG_UNUSED,
+ [MB_WALK_NORTH] = TILE_FLAG_UNUSED,
+ [MB_WALK_SOUTH] = TILE_FLAG_UNUSED,
+ [MB_SLIDE_EAST] = TILE_FLAG_UNUSED,
+ [MB_SLIDE_WEST] = TILE_FLAG_UNUSED,
+ [MB_SLIDE_NORTH] = TILE_FLAG_UNUSED,
+ [MB_SLIDE_SOUTH] = TILE_FLAG_UNUSED,
+ [MB_TRICK_HOUSE_PUZZLE_8_FLOOR] = TILE_FLAG_UNUSED,
+ [MB_UNUSED_49] = TILE_FLAG_UNUSED,
+ [MB_UNUSED_4A] = TILE_FLAG_UNUSED,
+ [MB_EASTWARD_CURRENT] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE,
+ [MB_WESTWARD_CURRENT] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE,
+ [MB_NORTHWARD_CURRENT] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE,
+ [MB_SOUTHWARD_CURRENT] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE,
+ [MB_NON_ANIMATED_DOOR] = TILE_FLAG_UNUSED,
+ [MB_LADDER] = TILE_FLAG_UNUSED,
+ [MB_EAST_ARROW_WARP] = TILE_FLAG_UNUSED,
+ [MB_WEST_ARROW_WARP] = TILE_FLAG_UNUSED,
+ [MB_NORTH_ARROW_WARP] = TILE_FLAG_UNUSED,
+ [MB_SOUTH_ARROW_WARP] = TILE_FLAG_UNUSED,
+ [MB_CRACKED_FLOOR_HOLE] = TILE_FLAG_UNUSED,
+ [MB_AQUA_HIDEOUT_WARP] = TILE_FLAG_UNUSED,
+ [MB_LAVARIDGE_GYM_1F_WARP] = TILE_FLAG_UNUSED,
+ [MB_ANIMATED_DOOR] = TILE_FLAG_UNUSED,
+ [MB_UP_ESCALATOR] = TILE_FLAG_UNUSED,
+ [MB_DOWN_ESCALATOR] = TILE_FLAG_UNUSED,
+ [MB_WATER_DOOR] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE,
+ [MB_WATER_SOUTH_ARROW_WARP] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE,
+ [MB_DEEP_SOUTH_WARP] = TILE_FLAG_UNUSED,
+ [MB_UNUSED_6F] = TILE_FLAG_UNUSED | TILE_FLAG_SURFABLE,
+ [MB_BRIDGE_OVER_POND_LOW] = TILE_FLAG_UNUSED,
+ [MB_BRIDGE_OVER_POND_MED] = TILE_FLAG_UNUSED,
+ [MB_BRIDGE_OVER_POND_HIGH] = TILE_FLAG_UNUSED,
+ [MB_PACIFIDLOG_VERTICAL_LOG_TOP] = TILE_FLAG_UNUSED,
+ [MB_PACIFIDLOG_VERTICAL_LOG_BOTTOM] = TILE_FLAG_UNUSED,
+ [MB_PACIFIDLOG_HORIZONTAL_LOG_LEFT] = TILE_FLAG_UNUSED,
+ [MB_PACIFIDLOG_HORIZONTAL_LOG_RIGHT] = TILE_FLAG_UNUSED,
+ [MB_FORTREE_BRIDGE] = TILE_FLAG_UNUSED,
+ [MB_BRIDGE_OVER_POND_MED_EDGE_1] = TILE_FLAG_UNUSED,
+ [MB_BRIDGE_OVER_POND_MED_EDGE_2] = TILE_FLAG_UNUSED,
+ [MB_BRIDGE_OVER_POND_HIGH_EDGE_1] = TILE_FLAG_UNUSED,
+ [MB_BRIDGE_OVER_POND_HIGH_EDGE_2] = TILE_FLAG_UNUSED,
+ [MB_UNUSED_BRIDGE] = TILE_FLAG_UNUSED,
+ [MB_BIKE_BRIDGE_OVER_BARRIER] = TILE_FLAG_UNUSED,
+ [MB_SECRET_BASE_SCENERY] = TILE_FLAG_UNUSED,
+ [MB_SECRET_BASE_TRAINER_SPOT] = TILE_FLAG_UNUSED,
+ [MB_HOLDS_SMALL_DECORATION] = TILE_FLAG_UNUSED,
+ [MB_SECRET_BASE_BALLOON] = TILE_FLAG_UNUSED,
+ [MB_SECRET_BASE_IMPASSABLE] = TILE_FLAG_UNUSED,
+ [MB_SECRET_BASE_GLITTER_MAT] = TILE_FLAG_UNUSED,
+ [MB_SECRET_BASE_JUMP_MAT] = TILE_FLAG_UNUSED,
+ [MB_SECRET_BASE_SPIN_MAT] = TILE_FLAG_UNUSED,
+ [MB_SECRET_BASE_SOUND_MAT] = TILE_FLAG_UNUSED,
+ [MB_SECRET_BASE_BREAKABLE_DOOR] = TILE_FLAG_UNUSED,
+ [MB_IMPASSABLE_SOUTH_AND_NORTH] = TILE_FLAG_UNUSED,
+ [MB_IMPASSABLE_WEST_AND_EAST] = TILE_FLAG_UNUSED,
+ [MB_SECRET_BASE_HOLE] = TILE_FLAG_UNUSED,
+ [MB_HOLDS_LARGE_DECORATION] = TILE_FLAG_UNUSED,
+ [MB_SECRET_BASE_TV_SHIELD] = TILE_FLAG_UNUSED,
+ [MB_PLAYER_ROOM_PC_ON] = TILE_FLAG_UNUSED,
+ [MB_MUDDY_SLOPE] = TILE_FLAG_UNUSED,
+ [MB_BUMPY_SLOPE] = TILE_FLAG_UNUSED,
+ [MB_CRACKED_FLOOR] = TILE_FLAG_UNUSED,
+ [MB_ISOLATED_VERTICAL_RAIL] = TILE_FLAG_UNUSED,
+ [MB_ISOLATED_HORIZONTAL_RAIL] = TILE_FLAG_UNUSED,
+ [MB_VERTICAL_RAIL] = TILE_FLAG_UNUSED,
+ [MB_HORIZONTAL_RAIL] = TILE_FLAG_UNUSED,
};
bool8 MetatileBehavior_IsATile(u8 metatileBehavior)
@@ -259,7 +134,7 @@ bool8 MetatileBehavior_IsATile(u8 metatileBehavior)
bool8 MetatileBehavior_IsEncounterTile(u8 metatileBehavior)
{
- if ((sTileBitAttributes[metatileBehavior] & TILE_FLAG_ENCOUNTER_TILE))
+ if ((sTileBitAttributes[metatileBehavior] & TILE_FLAG_HAS_ENCOUNTERS))
return TRUE;
else
return FALSE;
@@ -687,17 +562,19 @@ bool8 MetatileBehavior_IsRecordMixingSecretBasePC(u8 metatileBehavior)
return FALSE;
}
-bool8 Unref_MetatileBehavior_IsSecretBaseUnused_B2(u8 metatileBehavior)
+// Used by the rock/grass floor spaces that the secret base trainer is not standing on
+bool8 MetatileBehavior_IsSecretBaseScenery1(u8 metatileBehavior)
{
- if (metatileBehavior == MB_SECRET_BASE_UNUSED)
+ if (metatileBehavior == MB_SECRET_BASE_SCENERY)
return TRUE;
else
return FALSE;
}
-bool8 MetatileBehavior_IsBlockDecoration(u8 metatileBehavior)
+// Used by the rock/grass floor space that the secret base trainer stands on
+bool8 MetatileBehavior_IsSecretBaseTrainerSpot(u8 metatileBehavior)
{
- if (metatileBehavior == MB_BLOCK_DECORATION)
+ if (metatileBehavior == MB_SECRET_BASE_TRAINER_SPOT)
return TRUE;
else
return FALSE;
@@ -743,9 +620,9 @@ bool8 MetatileBehavior_IsSecretBaseNorthWall(u8 metatileBehavior)
return FALSE;
}
-bool8 Unref_MetatileBehavior_IsSecretBaseUnused_B2_2(u8 metatileBehavior)
+bool8 MetatileBehavior_IsSecretBaseScenery2(u8 metatileBehavior)
{
- if (metatileBehavior == MB_SECRET_BASE_UNUSED)
+ if (metatileBehavior == MB_SECRET_BASE_SCENERY)
return TRUE;
else
return FALSE;
diff --git a/src/minigame_countdown.c b/src/minigame_countdown.c
index 178b6d5b79..4c72136d4c 100644
--- a/src/minigame_countdown.c
+++ b/src/minigame_countdown.c
@@ -48,8 +48,8 @@ static void Task_StaticCountdown_Free(u8 taskId);
static void Task_StaticCountdown_Start(u8 taskId);
static void Task_StaticCountdown_Run(u8 taskId);
-static const u16 s321Start_Static_Pal[] = INCBIN_U16("graphics/minigame_countdown/321start_static.gbapal");
-static const u32 s321Start_Static_Gfx[] = INCBIN_U32("graphics/minigame_countdown/321start_static.4bpp.lz");
+static const u16 s321Start_Static_Pal[] = INCBIN_U16("graphics/link/321start_static.gbapal");
+static const u32 s321Start_Static_Gfx[] = INCBIN_U32("graphics/link/321start_static.4bpp.lz");
static const struct CompressedSpriteSheet sSpriteSheet_321Start_Static[] =
{
@@ -374,8 +374,8 @@ static void CreateStartSprite(u16 tileTag, u16 palTag, s16 x, s16 y, u8 subprior
static void InitStartGraphic(u8 spriteId1, u8 spriteId2, u8 spriteId3);
static void SpriteCB_Start(struct Sprite *sprite);
-static const u16 s321Start_Pal[] = INCBIN_U16("graphics/minigame_countdown/321start.gbapal");
-static const u32 s321Start_Gfx[] = INCBIN_U32("graphics/minigame_countdown/321start.4bpp.lz");
+static const u16 s321Start_Pal[] = INCBIN_U16("graphics/link/321start.gbapal");
+static const u32 s321Start_Gfx[] = INCBIN_U32("graphics/link/321start.4bpp.lz");
#define tState data[0]
#define tTilesTag data[2]
diff --git a/src/mon_markings.c b/src/mon_markings.c
index dbd5a2fa81..1e03179e94 100644
--- a/src/mon_markings.c
+++ b/src/mon_markings.c
@@ -22,8 +22,8 @@ static void SpriteCB_Marking(struct Sprite *);
static void SpriteCB_Cursor(struct Sprite *);
static struct Sprite *CreateMarkingComboSprite(u16, u16, const u16 *, u16);
-static const u16 sMonMarkings_Pal[] = INCBIN_U16("graphics/misc/mon_markings.gbapal");
-static const u8 sMonMarkings_Gfx[] = INCBIN_U8("graphics/misc/mon_markings.4bpp");
+static const u16 sMonMarkings_Pal[] = INCBIN_U16("graphics/interface/mon_markings.gbapal");
+static const u8 sMonMarkings_Gfx[] = INCBIN_U8("graphics/interface/mon_markings.4bpp");
static const struct OamData sOamData_MenuWindow =
{
diff --git a/src/money.c b/src/money.c
index c331462d4e..5723974a83 100644
--- a/src/money.c
+++ b/src/money.c
@@ -58,14 +58,14 @@ static const struct SpriteTemplate sSpriteTemplate_MoneyLabel =
static const struct CompressedSpriteSheet sSpriteSheet_MoneyLabel =
{
- .data = gMenuMoneyGfx,
+ .data = gShopMenuMoney_Gfx,
.size = 256,
.tag = MONEY_LABEL_TAG,
};
static const struct CompressedSpritePalette sSpritePalette_MoneyLabel =
{
- .data = gMenuMoneyPal,
+ .data = gShopMenu_Pal,
.tag = MONEY_LABEL_TAG
};
@@ -132,7 +132,7 @@ void SubtractMoneyFromVar0x8005(void)
void PrintMoneyAmountInMoneyBox(u8 windowId, int amount, u8 speed)
{
- PrintMoneyAmount(windowId, 0x26, 1, amount, speed);
+ PrintMoneyAmount(windowId, 38, 1, amount, speed);
}
void PrintMoneyAmount(u8 windowId, u8 x, u8 y, int amount, u8 speed)
@@ -146,7 +146,7 @@ void PrintMoneyAmount(u8 windowId, u8 x, u8 y, int amount, u8 speed)
txtPtr = gStringVar4;
while (strLength-- > 0)
- *(txtPtr++) = 0x77;
+ *(txtPtr++) = CHAR_SPACER;
StringExpandPlaceholders(txtPtr, gText_PokedollarVar1);
AddTextPrinterParameterized(windowId, FONT_NORMAL, gStringVar4, x, y, speed, NULL);
diff --git a/src/naming_screen.c b/src/naming_screen.c
index 17a1d18bfc..6badae8d7a 100644
--- a/src/naming_screen.c
+++ b/src/naming_screen.c
@@ -1408,10 +1408,10 @@ static void NamingScreen_CreatePlayerIcon(void)
u8 rivalGfxId;
u8 spriteId;
- rivalGfxId = GetRivalAvatarGraphicsIdByStateIdAndGender(0, sNamingScreen->monSpecies);
+ rivalGfxId = GetRivalAvatarGraphicsIdByStateIdAndGender(PLAYER_AVATAR_STATE_NORMAL, sNamingScreen->monSpecies);
spriteId = CreateObjectGraphicsSprite(rivalGfxId, SpriteCallbackDummy, 56, 37, 0);
gSprites[spriteId].oam.priority = 3;
- StartSpriteAnim(&gSprites[spriteId], 4);
+ StartSpriteAnim(&gSprites[spriteId], ANIM_STD_GO_SOUTH);
}
static void NamingScreen_CreatePCIcon(void)
@@ -1438,7 +1438,7 @@ static void NamingScreen_CreateWaldaDadIcon(void)
spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_MAN_1, SpriteCallbackDummy, 56, 37, 0);
gSprites[spriteId].oam.priority = 3;
- StartSpriteAnim(&gSprites[spriteId], 4);
+ StartSpriteAnim(&gSprites[spriteId], ANIM_STD_GO_SOUTH);
}
//--------------------------------------------------
diff --git a/src/option_menu.c b/src/option_menu.c
index e66bddd7f2..2991913d78 100644
--- a/src/option_menu.c
+++ b/src/option_menu.c
@@ -79,9 +79,9 @@ static void DrawBgWindowFrames(void);
EWRAM_DATA static bool8 sArrowPressed = FALSE;
-static const u16 sOptionMenuText_Pal[] = INCBIN_U16("graphics/misc/option_menu_text.gbapal");
+static const u16 sOptionMenuText_Pal[] = INCBIN_U16("graphics/interface/option_menu_text.gbapal");
// note: this is only used in the Japanese release
-static const u8 sEqualSignGfx[] = INCBIN_U8("graphics/misc/option_menu_equals_sign.4bpp");
+static const u8 sEqualSignGfx[] = INCBIN_U8("graphics/interface/option_menu_equals_sign.4bpp");
static const u8 *const sOptionMenuItemsNames[MENUITEM_COUNT] =
{
diff --git a/src/overworld.c b/src/overworld.c
index ee4c660bda..02879a2490 100644
--- a/src/overworld.c
+++ b/src/overworld.c
@@ -183,9 +183,9 @@ static u16 (*sPlayerKeyInterceptCallback)(u32);
static bool8 sReceivingFromLink;
static u8 sRfuKeepAliveTimer;
-u16 *gBGTilemapBuffers1;
-u16 *gBGTilemapBuffers2;
-u16 *gBGTilemapBuffers3;
+u16 *gOverworldTilemapBuffer_Bg2;
+u16 *gOverworldTilemapBuffer_Bg1;
+u16 *gOverworldTilemapBuffer_Bg3;
u16 gHeldKeyCodeToSend;
void (*gFieldCallback)(void);
bool8 (*gFieldCallback2)(void);
@@ -1397,12 +1397,12 @@ static void InitOverworldBgs(void)
SetBgAttribute(1, BG_ATTR_MOSAIC, 1);
SetBgAttribute(2, BG_ATTR_MOSAIC, 1);
SetBgAttribute(3, BG_ATTR_MOSAIC, 1);
- gBGTilemapBuffers2 = AllocZeroed(BG_SCREEN_SIZE);
- gBGTilemapBuffers1 = AllocZeroed(BG_SCREEN_SIZE);
- gBGTilemapBuffers3 = AllocZeroed(BG_SCREEN_SIZE);
- SetBgTilemapBuffer(1, gBGTilemapBuffers2);
- SetBgTilemapBuffer(2, gBGTilemapBuffers1);
- SetBgTilemapBuffer(3, gBGTilemapBuffers3);
+ gOverworldTilemapBuffer_Bg1 = AllocZeroed(BG_SCREEN_SIZE);
+ gOverworldTilemapBuffer_Bg2 = AllocZeroed(BG_SCREEN_SIZE);
+ gOverworldTilemapBuffer_Bg3 = AllocZeroed(BG_SCREEN_SIZE);
+ SetBgTilemapBuffer(1, gOverworldTilemapBuffer_Bg1);
+ SetBgTilemapBuffer(2, gOverworldTilemapBuffer_Bg2);
+ SetBgTilemapBuffer(3, gOverworldTilemapBuffer_Bg3);
InitStandardTextBoxWindows();
}
@@ -1410,12 +1410,9 @@ void CleanupOverworldWindowsAndTilemaps(void)
{
ClearMirageTowerPulseBlendEffect();
FreeAllOverworldWindowBuffers();
- if (gBGTilemapBuffers3)
- FREE_AND_SET_NULL(gBGTilemapBuffers3);
- if (gBGTilemapBuffers1)
- FREE_AND_SET_NULL(gBGTilemapBuffers1);
- if (gBGTilemapBuffers2)
- FREE_AND_SET_NULL(gBGTilemapBuffers2);
+ TRY_FREE_AND_SET_NULL(gOverworldTilemapBuffer_Bg3);
+ TRY_FREE_AND_SET_NULL(gOverworldTilemapBuffer_Bg2);
+ TRY_FREE_AND_SET_NULL(gOverworldTilemapBuffer_Bg1);
}
static void ResetSafariZoneFlag_(void)
@@ -2698,7 +2695,7 @@ static void LoadCableClubPlayer(s32 linkPlayerId, s32 myPlayerId, struct CableCl
GetLinkPlayerCoords(linkPlayerId, &x, &y);
trainer->pos.x = x;
trainer->pos.y = y;
- trainer->pos.height = GetLinkPlayerElevation(linkPlayerId);
+ trainer->pos.elevation = GetLinkPlayerElevation(linkPlayerId);
trainer->metatileBehavior = MapGridGetMetatileBehaviorAt(x, y);
}
@@ -2751,7 +2748,7 @@ static const u8 *TryInteractWithPlayer(struct CableClubPlayer *player)
otherPlayerPos = player->pos;
otherPlayerPos.x += gDirectionToVectors[player->facing].x;
otherPlayerPos.y += gDirectionToVectors[player->facing].y;
- otherPlayerPos.height = 0;
+ otherPlayerPos.elevation = 0;
linkPlayerId = GetLinkPlayerIdAt(otherPlayerPos.x, otherPlayerPos.y);
if (linkPlayerId != MAX_LINK_PLAYERS)
@@ -2961,7 +2958,7 @@ static void InitLinkPlayerObjectEventPos(struct ObjectEvent *objEvent, s16 x, s1
objEvent->previousCoords.y = y;
SetSpritePosToMapCoords(x, y, &objEvent->initialCoords.x, &objEvent->initialCoords.y);
objEvent->initialCoords.x += 8;
- ObjectEventUpdateZCoord(objEvent);
+ ObjectEventUpdateElevation(objEvent);
}
static void SetLinkPlayerObjectRange(u8 linkPlayerId, u8 dir)
@@ -3101,7 +3098,7 @@ static bool8 FacingHandler_DpadMovement(struct LinkPlayerObjectEvent *linkPlayer
{
objEvent->directionSequenceIndex = 16;
ShiftObjectEventCoords(objEvent, x, y);
- ObjectEventUpdateZCoord(objEvent);
+ ObjectEventUpdateElevation(objEvent);
return TRUE;
}
}
@@ -3207,8 +3204,8 @@ static void SpriteCB_LinkPlayer(struct Sprite *sprite)
struct ObjectEvent *objEvent = &gObjectEvents[linkPlayerObjEvent->objEventId];
sprite->x = objEvent->initialCoords.x;
sprite->y = objEvent->initialCoords.y;
- SetObjectSubpriorityByZCoord(objEvent->previousElevation, sprite, 1);
- sprite->oam.priority = ZCoordToPriority(objEvent->previousElevation);
+ SetObjectSubpriorityByElevation(objEvent->previousElevation, sprite, 1);
+ sprite->oam.priority = ElevationToPriority(objEvent->previousElevation);
if (linkPlayerObjEvent->movementMode == MOVEMENT_MODE_FREE)
StartSpriteAnim(sprite, GetFaceDirectionAnimNum(linkDirection(objEvent)));
diff --git a/src/party_menu.c b/src/party_menu.c
index 73d88e9b4a..9cc6541aca 100755
--- a/src/party_menu.c
+++ b/src/party_menu.c
@@ -65,7 +65,6 @@
#include "window.h"
#include "constants/battle.h"
#include "constants/battle_frontier.h"
-#include "constants/easy_chat.h"
#include "constants/field_effects.h"
#include "constants/item_effects.h"
#include "constants/items.h"
@@ -98,7 +97,7 @@ enum
struct PartyMenuBoxInfoRects
{
- void (*blitFunc)(u8, u8, u8, u8, u8, u8);
+ void (*blitFunc)(u8, u8, u8, u8, u8, bool8);
u8 dimensions[24];
u8 descTextLeft;
u8 descTextTop;
@@ -378,8 +377,8 @@ static void Task_ChooseMonForMoveRelearner(u8);
static void CB2_ChooseMonForMoveRelearner(void);
static void Task_BattlePyramidChooseMonHeldItems(u8);
static void ShiftMoveSlot(struct Pokemon*, u8, u8);
-static void BlitBitmapToPartyWindow_LeftColumn(u8, u8, u8, u8, u8, u8);
-static void BlitBitmapToPartyWindow_RightColumn(u8, u8, u8, u8, u8, u8);
+static void BlitBitmapToPartyWindow_LeftColumn(u8, u8, u8, u8, u8, bool8);
+static void BlitBitmapToPartyWindow_RightColumn(u8, u8, u8, u8, u8, bool8);
static void CursorCb_Summary(u8);
static void CursorCb_Switch(u8);
static void CursorCb_Cancel1(u8);
@@ -2089,35 +2088,35 @@ static void BlitBitmapToPartyWindow(u8 windowId, const u8 *b, u8 c, u8 x, u8 y,
}
}
-static void BlitBitmapToPartyWindow_LeftColumn(u8 windowId, u8 x, u8 y, u8 width, u8 height, u8 isEgg)
+static void BlitBitmapToPartyWindow_LeftColumn(u8 windowId, u8 x, u8 y, u8 width, u8 height, bool8 hideHP)
{
if (width == 0 && height == 0)
{
width = 10;
height = 7;
}
- if (isEgg == FALSE)
- BlitBitmapToPartyWindow(windowId, sMainSlotTileNums, 10, x, y, width, height);
+ if (hideHP == FALSE)
+ BlitBitmapToPartyWindow(windowId, sSlotTilemap_Main, 10, x, y, width, height);
else
- BlitBitmapToPartyWindow(windowId, sMainSlotTileNums_Egg, 10, x, y, width, height);
+ BlitBitmapToPartyWindow(windowId, sSlotTilemap_MainNoHP, 10, x, y, width, height);
}
-static void BlitBitmapToPartyWindow_RightColumn(u8 windowId, u8 x, u8 y, u8 width, u8 height, u8 isEgg)
+static void BlitBitmapToPartyWindow_RightColumn(u8 windowId, u8 x, u8 y, u8 width, u8 height, bool8 hideHP)
{
if (width == 0 && height == 0)
{
width = 18;
height = 3;
}
- if (isEgg == FALSE)
- BlitBitmapToPartyWindow(windowId, sOtherSlotsTileNums, 18, x, y, width, height);
+ if (hideHP == FALSE)
+ BlitBitmapToPartyWindow(windowId, sSlotTilemap_Wide, 18, x, y, width, height);
else
- BlitBitmapToPartyWindow(windowId, sOtherSlotsTileNums_Egg, 18, x, y, width, height);
+ BlitBitmapToPartyWindow(windowId, sSlotTilemap_WideNoHP, 18, x, y, width, height);
}
static void DrawEmptySlot(u8 windowId)
{
- BlitBitmapToPartyWindow(windowId, sEmptySlotTileNums, 18, 0, 0, 18, 3);
+ BlitBitmapToPartyWindow(windowId, sSlotTilemap_WideEmpty, 18, 0, 0, 18, 3);
}
#define LOAD_PARTY_BOX_PAL(paletteIds, paletteOffsets) \
diff --git a/src/player_pc.c b/src/player_pc.c
index 06f58fdeb4..bf8479ce11 100644
--- a/src/player_pc.c
+++ b/src/player_pc.c
@@ -511,7 +511,7 @@ static void InitItemStorageMenu(u8 taskId, u8 var)
tWindowId = AddWindow(&windowTemplate);
SetStandardWindowBorderStyle(tWindowId, 0);
PrintMenuTable(tWindowId, ARRAY_COUNT(sItemStorage_MenuActions), sItemStorage_MenuActions);
- InitMenuInUpperLeftCornerNormal(tWindowId, 4, var);
+ InitMenuInUpperLeftCornerNormal(tWindowId, ARRAY_COUNT(sItemStorage_MenuActions), var);
ScheduleBgCopyTilemapToVram(0);
ItemStorageMenuPrint(sItemStorage_OptionDescriptions[var]);
}
@@ -753,7 +753,7 @@ static void Mailbox_PrintMailOptions(u8 taskId)
{
u8 windowId = MailboxMenu_AddWindow(MAILBOXWIN_OPTIONS);
PrintMenuTable(windowId, ARRAY_COUNT(gMailboxMailOptions), gMailboxMailOptions);
- InitMenuInUpperLeftCornerNormal(windowId, 4, 0);
+ InitMenuInUpperLeftCornerNormal(windowId, ARRAY_COUNT(gMailboxMailOptions), 0);
ScheduleBgCopyTilemapToVram(0);
gTasks[taskId].func = Mailbox_MailOptionsProcessInput;
}
diff --git a/src/pokeball.c b/src/pokeball.c
index 97c0d11d52..32ef497b88 100644
--- a/src/pokeball.c
+++ b/src/pokeball.c
@@ -74,64 +74,64 @@ static u16 GetBattlerPokeballItemId(u8 battlerId);
const struct CompressedSpriteSheet gBallSpriteSheets[POKEBALL_COUNT] =
{
- [BALL_POKE] = {gInterfaceGfx_PokeBall, 384, GFX_TAG_POKEBALL},
- [BALL_GREAT] = {gInterfaceGfx_GreatBall, 384, GFX_TAG_GREATBALL},
- [BALL_ULTRA] = {gInterfaceGfx_UltraBall, 384, GFX_TAG_ULTRABALL},
- [BALL_MASTER] = {gInterfaceGfx_MasterBall, 384, GFX_TAG_MASTERBALL},
- [BALL_PREMIER] = {gInterfaceGfx_PremierBall, 384, GFX_TAG_PREMIERBALL},
- [BALL_HEAL] = {gInterfaceGfx_HealBall, 384, GFX_TAG_HEALBALL},
- [BALL_NET] = {gInterfaceGfx_NetBall, 384, GFX_TAG_NETBALL},
- [BALL_NEST] = {gInterfaceGfx_NestBall, 384, GFX_TAG_NESTBALL},
- [BALL_DIVE] = {gInterfaceGfx_DiveBall, 384, GFX_TAG_DIVEBALL},
- [BALL_DUSK] = {gInterfaceGfx_DuskBall, 384, GFX_TAG_DUSKBALL},
- [BALL_TIMER] = {gInterfaceGfx_TimerBall, 384, GFX_TAG_TIMERBALL},
- [BALL_QUICK] = {gInterfaceGfx_QuickBall, 384, GFX_TAG_QUICKBALL},
- [BALL_REPEAT] = {gInterfaceGfx_RepeatBall, 384, GFX_TAG_REPEATBALL},
- [BALL_LUXURY] = {gInterfaceGfx_LuxuryBall, 384, GFX_TAG_LUXURYBALL},
- [BALL_LEVEL] = {gInterfaceGfx_LevelBall, 384, GFX_TAG_LEVELBALL},
- [BALL_LURE] = {gInterfaceGfx_LureBall, 384, GFX_TAG_LUREBALL},
- [BALL_MOON] = {gInterfaceGfx_MoonBall, 384, GFX_TAG_MOONBALL},
- [BALL_FRIEND] = {gInterfaceGfx_FriendBall, 384, GFX_TAG_FRIENDBALL},
- [BALL_LOVE] = {gInterfaceGfx_LoveBall, 384, GFX_TAG_LOVEBALL},
- [BALL_FAST] = {gInterfaceGfx_FastBall, 384, GFX_TAG_FASTBALL},
- [BALL_HEAVY] = {gInterfaceGfx_HeavyBall, 384, GFX_TAG_HEAVYBALL},
- [BALL_DREAM] = {gInterfaceGfx_DreamBall, 384, GFX_TAG_DREAMBALL},
- [BALL_SAFARI] = {gInterfaceGfx_SafariBall, 384, GFX_TAG_SAFARIBALL},
- [BALL_SPORT] = {gInterfaceGfx_SportBall, 384, GFX_TAG_SPORTBALL},
- [BALL_PARK] = {gInterfaceGfx_ParkBall, 384, GFX_TAG_PARKBALL},
- [BALL_BEAST] = {gInterfaceGfx_BeastBall, 384, GFX_TAG_BEASTBALL},
- [BALL_CHERISH] = {gInterfaceGfx_CherishBall, 384, GFX_TAG_CHERISHBALL},
+ [BALL_POKE] = {gBallGfx_Poke, 384, GFX_TAG_POKEBALL},
+ [BALL_GREAT] = {gBallGfx_Great, 384, GFX_TAG_GREATBALL},
+ [BALL_ULTRA] = {gBallGfx_Ultra, 384, GFX_TAG_ULTRABALL},
+ [BALL_MASTER] = {gBallGfx_Master, 384, GFX_TAG_MASTERBALL},
+ [BALL_PREMIER] = {gBallGfx_Premier, 384, GFX_TAG_PREMIERBALL},
+ [BALL_HEAL] = {gBallGfx_Heal, 384, GFX_TAG_HEALBALL},
+ [BALL_NET] = {gBallGfx_Net, 384, GFX_TAG_NETBALL},
+ [BALL_NEST] = {gBallGfx_Nest, 384, GFX_TAG_NESTBALL},
+ [BALL_DIVE] = {gBallGfx_Dive, 384, GFX_TAG_DIVEBALL},
+ [BALL_DUSK] = {gBallGfx_Dusk, 384, GFX_TAG_DUSKBALL},
+ [BALL_TIMER] = {gBallGfx_Timer, 384, GFX_TAG_TIMERBALL},
+ [BALL_QUICK] = {gBallGfx_Quick, 384, GFX_TAG_QUICKBALL},
+ [BALL_REPEAT] = {gBallGfx_Repeat, 384, GFX_TAG_REPEATBALL},
+ [BALL_LUXURY] = {gBallGfx_Luxury, 384, GFX_TAG_LUXURYBALL},
+ [BALL_LEVEL] = {gBallGfx_Level, 384, GFX_TAG_LEVELBALL},
+ [BALL_LURE] = {gBallGfx_Lure, 384, GFX_TAG_LUREBALL},
+ [BALL_MOON] = {gBallGfx_Moon, 384, GFX_TAG_MOONBALL},
+ [BALL_FRIEND] = {gBallGfx_Friend, 384, GFX_TAG_FRIENDBALL},
+ [BALL_LOVE] = {gBallGfx_Love, 384, GFX_TAG_LOVEBALL},
+ [BALL_FAST] = {gBallGfx_Fast, 384, GFX_TAG_FASTBALL},
+ [BALL_HEAVY] = {gBallGfx_Heavy, 384, GFX_TAG_HEAVYBALL},
+ [BALL_DREAM] = {gBallGfx_Dream, 384, GFX_TAG_DREAMBALL},
+ [BALL_SAFARI] = {gBallGfx_Safari, 384, GFX_TAG_SAFARIBALL},
+ [BALL_SPORT] = {gBallGfx_Sport, 384, GFX_TAG_SPORTBALL},
+ [BALL_PARK] = {gBallGfx_Park, 384, GFX_TAG_PARKBALL},
+ [BALL_BEAST] = {gBallGfx_Beast, 384, GFX_TAG_BEASTBALL},
+ [BALL_CHERISH] = {gBallGfx_Cherish, 384, GFX_TAG_CHERISHBALL},
};
const struct CompressedSpritePalette gBallSpritePalettes[POKEBALL_COUNT] =
{
- [BALL_POKE] = {gInterfacePal_PokeBall, GFX_TAG_POKEBALL},
- [BALL_GREAT] = {gInterfacePal_GreatBall, GFX_TAG_GREATBALL},
- [BALL_ULTRA] = {gInterfacePal_UltraBall, GFX_TAG_ULTRABALL},
- [BALL_MASTER] = {gInterfacePal_MasterBall, GFX_TAG_MASTERBALL},
- [BALL_PREMIER] = {gInterfacePal_PremierBall, GFX_TAG_PREMIERBALL},
- [BALL_HEAL] = {gInterfacePal_HealBall, GFX_TAG_HEALBALL},
- [BALL_NET] = {gInterfacePal_NetBall, GFX_TAG_NETBALL},
- [BALL_NEST] = {gInterfacePal_NestBall, GFX_TAG_NESTBALL},
- [BALL_DIVE] = {gInterfacePal_DiveBall, GFX_TAG_DIVEBALL},
- [BALL_DUSK] = {gInterfacePal_DuskBall, GFX_TAG_DUSKBALL},
- [BALL_TIMER] = {gInterfacePal_TimerBall, GFX_TAG_TIMERBALL},
- [BALL_QUICK] = {gInterfacePal_QuickBall, GFX_TAG_QUICKBALL},
- [BALL_REPEAT] = {gInterfacePal_RepeatBall, GFX_TAG_REPEATBALL},
- [BALL_LUXURY] = {gInterfacePal_LuxuryBall, GFX_TAG_LUXURYBALL},
- [BALL_LEVEL] = {gInterfacePal_LevelBall, GFX_TAG_LEVELBALL},
- [BALL_LURE] = {gInterfacePal_LureBall, GFX_TAG_LUREBALL},
- [BALL_MOON] = {gInterfacePal_MoonBall, GFX_TAG_MOONBALL},
- [BALL_FRIEND] = {gInterfacePal_FriendBall, GFX_TAG_FRIENDBALL},
- [BALL_LOVE] = {gInterfacePal_LoveBall, GFX_TAG_LOVEBALL},
- [BALL_FAST] = {gInterfacePal_FastBall, GFX_TAG_FASTBALL},
- [BALL_HEAVY] = {gInterfacePal_HeavyBall, GFX_TAG_HEAVYBALL},
- [BALL_DREAM] = {gInterfacePal_DreamBall, GFX_TAG_DREAMBALL},
- [BALL_SAFARI] = {gInterfacePal_SafariBall, GFX_TAG_SAFARIBALL},
- [BALL_SPORT] = {gInterfacePal_SportBall, GFX_TAG_SPORTBALL},
- [BALL_PARK] = {gInterfacePal_ParkBall, GFX_TAG_PARKBALL},
- [BALL_BEAST] = {gInterfacePal_BeastBall, GFX_TAG_BEASTBALL},
- [BALL_CHERISH] = {gInterfacePal_CherishBall, GFX_TAG_CHERISHBALL},
+ [BALL_POKE] = {gBallPal_Poke, GFX_TAG_POKEBALL},
+ [BALL_GREAT] = {gBallPal_Great, GFX_TAG_GREATBALL},
+ [BALL_ULTRA] = {gBallPal_Ultra, GFX_TAG_ULTRABALL},
+ [BALL_MASTER] = {gBallPal_Master, GFX_TAG_MASTERBALL},
+ [BALL_PREMIER] = {gBallPal_Premier, GFX_TAG_PREMIERBALL},
+ [BALL_HEAL] = {gBallPal_Heal, GFX_TAG_HEALBALL},
+ [BALL_NET] = {gBallPal_Net, GFX_TAG_NETBALL},
+ [BALL_NEST] = {gBallPal_Nest, GFX_TAG_NESTBALL},
+ [BALL_DIVE] = {gBallPal_Dive, GFX_TAG_DIVEBALL},
+ [BALL_DUSK] = {gBallPal_Dusk, GFX_TAG_DUSKBALL},
+ [BALL_TIMER] = {gBallPal_Timer, GFX_TAG_TIMERBALL},
+ [BALL_QUICK] = {gBallPal_Quick, GFX_TAG_QUICKBALL},
+ [BALL_REPEAT] = {gBallPal_Repeat, GFX_TAG_REPEATBALL},
+ [BALL_LUXURY] = {gBallPal_Luxury, GFX_TAG_LUXURYBALL},
+ [BALL_LEVEL] = {gBallPal_Level, GFX_TAG_LEVELBALL},
+ [BALL_LURE] = {gBallPal_Lure, GFX_TAG_LUREBALL},
+ [BALL_MOON] = {gBallPal_Moon, GFX_TAG_MOONBALL},
+ [BALL_FRIEND] = {gBallPal_Friend, GFX_TAG_FRIENDBALL},
+ [BALL_LOVE] = {gBallPal_Love, GFX_TAG_LOVEBALL},
+ [BALL_FAST] = {gBallPal_Fast, GFX_TAG_FASTBALL},
+ [BALL_HEAVY] = {gBallPal_Heavy, GFX_TAG_HEAVYBALL},
+ [BALL_DREAM] = {gBallPal_Dream, GFX_TAG_DREAMBALL},
+ [BALL_SAFARI] = {gBallPal_Safari, GFX_TAG_SAFARIBALL},
+ [BALL_SPORT] = {gBallPal_Sport, GFX_TAG_SPORTBALL},
+ [BALL_PARK] = {gBallPal_Park, GFX_TAG_PARKBALL},
+ [BALL_BEAST] = {gBallPal_Beast, GFX_TAG_BEASTBALL},
+ [BALL_CHERISH] = {gBallPal_Cherish, GFX_TAG_CHERISHBALL},
};
static const struct OamData sBallOamData =
@@ -249,6 +249,7 @@ static const union AffineAnimCmd *const sAffineAnim_BallRotate[] =
const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
{
+ [BALL_POKE] =
{
.tileTag = GFX_TAG_POKEBALL,
.paletteTag = GFX_TAG_POKEBALL,
@@ -258,6 +259,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
+ [BALL_GREAT] =
{
.tileTag = GFX_TAG_GREATBALL,
.paletteTag = GFX_TAG_GREATBALL,
@@ -267,6 +269,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
+ [BALL_ULTRA] =
{
.tileTag = GFX_TAG_ULTRABALL,
.paletteTag = GFX_TAG_ULTRABALL,
@@ -276,6 +279,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
+ [BALL_MASTER] =
{
.tileTag = GFX_TAG_MASTERBALL,
.paletteTag = GFX_TAG_MASTERBALL,
@@ -285,6 +289,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
+ [BALL_PREMIER] =
{
.tileTag = GFX_TAG_PREMIERBALL,
.paletteTag = GFX_TAG_PREMIERBALL,
@@ -294,6 +299,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
+ [BALL_HEAL] =
{
.tileTag = GFX_TAG_HEALBALL,
.paletteTag = GFX_TAG_HEALBALL,
@@ -303,6 +309,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
+ [BALL_NET] =
{
.tileTag = GFX_TAG_NETBALL,
.paletteTag = GFX_TAG_NETBALL,
@@ -312,6 +319,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
+ [BALL_NEST] =
{
.tileTag = GFX_TAG_NESTBALL,
.paletteTag = GFX_TAG_NESTBALL,
@@ -321,6 +329,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
+ [BALL_DIVE] =
{
.tileTag = GFX_TAG_DIVEBALL,
.paletteTag = GFX_TAG_DIVEBALL,
@@ -330,6 +339,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
+ [BALL_DUSK] =
{
.tileTag = GFX_TAG_DUSKBALL,
.paletteTag = GFX_TAG_DUSKBALL,
@@ -339,6 +349,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
+ [BALL_TIMER] =
{
.tileTag = GFX_TAG_TIMERBALL,
.paletteTag = GFX_TAG_TIMERBALL,
@@ -348,6 +359,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
+ [BALL_QUICK] =
{
.tileTag = GFX_TAG_QUICKBALL,
.paletteTag = GFX_TAG_QUICKBALL,
@@ -357,6 +369,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
+ [BALL_REPEAT] =
{
.tileTag = GFX_TAG_REPEATBALL,
.paletteTag = GFX_TAG_REPEATBALL,
@@ -366,6 +379,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
+ [BALL_LUXURY] =
{
.tileTag = GFX_TAG_LUXURYBALL,
.paletteTag = GFX_TAG_LUXURYBALL,
@@ -375,6 +389,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
+ [BALL_LEVEL] =
{
.tileTag = GFX_TAG_LEVELBALL,
.paletteTag = GFX_TAG_LEVELBALL,
@@ -384,6 +399,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
+ [BALL_LURE] =
{
.tileTag = GFX_TAG_LUREBALL,
.paletteTag = GFX_TAG_LUREBALL,
@@ -393,6 +409,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
+ [BALL_MOON] =
{
.tileTag = GFX_TAG_MOONBALL,
.paletteTag = GFX_TAG_MOONBALL,
@@ -402,6 +419,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
+ [BALL_FRIEND] =
{
.tileTag = GFX_TAG_FRIENDBALL,
.paletteTag = GFX_TAG_FRIENDBALL,
@@ -411,6 +429,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
+ [BALL_LOVE] =
{
.tileTag = GFX_TAG_LOVEBALL,
.paletteTag = GFX_TAG_LOVEBALL,
@@ -420,6 +439,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
+ [BALL_FAST] =
{
.tileTag = GFX_TAG_FASTBALL,
.paletteTag = GFX_TAG_FASTBALL,
@@ -429,6 +449,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
+ [BALL_HEAVY] =
{
.tileTag = GFX_TAG_HEAVYBALL,
.paletteTag = GFX_TAG_HEAVYBALL,
@@ -438,6 +459,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
+ [BALL_DREAM] =
{
.tileTag = GFX_TAG_DREAMBALL,
.paletteTag = GFX_TAG_DREAMBALL,
@@ -447,6 +469,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
+ [BALL_SAFARI] =
{
.tileTag = GFX_TAG_SAFARIBALL,
.paletteTag = GFX_TAG_SAFARIBALL,
@@ -456,6 +479,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
+ [BALL_SPORT] =
{
.tileTag = GFX_TAG_SPORTBALL,
.paletteTag = GFX_TAG_SPORTBALL,
@@ -465,6 +489,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
+ [BALL_PARK] =
{
.tileTag = GFX_TAG_PARKBALL,
.paletteTag = GFX_TAG_PARKBALL,
@@ -474,6 +499,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
+ [BALL_BEAST] =
{
.tileTag = GFX_TAG_BEASTBALL,
.paletteTag = GFX_TAG_BEASTBALL,
@@ -483,6 +509,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] =
.affineAnims = sAffineAnim_BallRotate,
.callback = SpriteCB_BallThrow,
},
+ [BALL_CHERISH] =
{
.tileTag = GFX_TAG_CHERISHBALL,
.paletteTag = GFX_TAG_CHERISHBALL,
diff --git a/src/pokedex.c b/src/pokedex.c
index 63c5d633d9..04d1fd67f5 100644
--- a/src/pokedex.c
+++ b/src/pokedex.c
@@ -1514,7 +1514,7 @@ void ResetPokedex(void)
gSaveBlock2Ptr->pokedex.spindaPersonality = 0;
gSaveBlock2Ptr->pokedex.unknown3 = 0;
DisableNationalPokedex();
- for (i = 0; i < DEX_FLAGS_NO; i++)
+ for (i = 0; i < NUM_DEX_FLAG_BYTES; i++)
{
gSaveBlock1Ptr->dexCaught[i] = 0;
gSaveBlock1Ptr->dexSeen[i] = 0;
diff --git a/src/pokedex_area_region_map.c b/src/pokedex_area_region_map.c
index 2ec2c5c8d7..4926c019dd 100644
--- a/src/pokedex_area_region_map.c
+++ b/src/pokedex_area_region_map.c
@@ -8,11 +8,11 @@
static EWRAM_DATA u8 *sPokedexAreaMapBgNum = NULL;
-static const u16 sPokedexAreaMap_Pal[] = INCBIN_U16("graphics/interface/region_map.gbapal");
-static const u32 sPokedexAreaMap_Gfx[] = INCBIN_U32("graphics/interface/region_map.8bpp.lz");
-static const u32 sPokedexAreaMap_Tilemap[] = INCBIN_U32("graphics/interface/region_map.bin.lz");
-static const u32 sPokedexAreaMapAffine_Gfx[] = INCBIN_U32("graphics/interface/region_map_affine.8bpp.lz");
-static const u32 sPokedexAreaMapAffine_Tilemap[] = INCBIN_U32("graphics/interface/region_map_affine.bin.lz");
+static const u16 sPokedexAreaMap_Pal[] = INCBIN_U16("graphics/pokedex/region_map.gbapal");
+static const u32 sPokedexAreaMap_Gfx[] = INCBIN_U32("graphics/pokedex/region_map.8bpp.lz");
+static const u32 sPokedexAreaMap_Tilemap[] = INCBIN_U32("graphics/pokedex/region_map.bin.lz");
+static const u32 sPokedexAreaMapAffine_Gfx[] = INCBIN_U32("graphics/pokedex/region_map_affine.8bpp.lz");
+static const u32 sPokedexAreaMapAffine_Tilemap[] = INCBIN_U32("graphics/pokedex/region_map_affine.bin.lz");
void LoadPokedexAreaMapGfx(const struct PokedexAreaMapTemplate *template)
{
@@ -41,7 +41,7 @@ void LoadPokedexAreaMapGfx(const struct PokedexAreaMapTemplate *template)
ChangeBgX(template->bg, 0, BG_COORD_SET);
ChangeBgY(template->bg, 0, BG_COORD_SET);
SetBgAttribute(template->bg, BG_ATTR_PALETTEMODE, 1);
- CpuCopy32(sPokedexAreaMap_Pal, &gPlttBufferUnfaded[0x70], 0x60);
+ CpuCopy32(sPokedexAreaMap_Pal, &gPlttBufferUnfaded[0x70], sizeof(sPokedexAreaMap_Pal));
*sPokedexAreaMapBgNum = template->bg;
}
diff --git a/src/pokedex_area_screen.c b/src/pokedex_area_screen.c
index 141041f4f1..dde86f1557 100755
--- a/src/pokedex_area_screen.c
+++ b/src/pokedex_area_screen.c
@@ -20,65 +20,84 @@
#include "constants/rgb.h"
#include "constants/songs.h"
+// There are two types of indicators for the area screen to show where a Pokémon can occur:
+// - Area glows, which highlight any of the maps in MAP_GROUP_TOWNS_AND_ROUTES that have the species.
+// These are a tilemap with colored rectangular areas that blends in and out. The positions of the
+// rectangles is determined by the positions of the matching MAPSEC values on the region map layout.
+// - Area markers, which highlight any of the maps in MAP_GROUP_DUNGEONS or MAP_GROUP_SPECIAL_AREA that
+// have the species. These are circular sprites that flash twice. The positions of the sprites is
+// determined by the data for the corresponding MAPSEC in gRegionMapEntries.
+
+// Only maps in the following map groups have their encounters considered for the area screen
+#define MAP_GROUP_TOWNS_AND_ROUTES MAP_GROUP(PETALBURG_CITY)
+#define MAP_GROUP_DUNGEONS MAP_GROUP(METEOR_FALLS_1F_1R)
+#define MAP_GROUP_SPECIAL_AREA MAP_GROUP(SAFARI_ZONE_NORTHWEST)
+
#define AREA_SCREEN_WIDTH 32
#define AREA_SCREEN_HEIGHT 20
-#define GLOW_TILE_FULL 0xFFFF
-#define GLOW_TILE_LEFT (1 << 0)
-#define GLOW_TILE_RIGHT (1 << 1)
-#define GLOW_TILE_TOP (1 << 2)
-#define GLOW_TILE_BOTTOM (1 << 3)
-#define GLOW_TILE_BOTTOM_RIGHT (1 << 4)
-#define GLOW_TILE_TOP_RIGHT (1 << 5)
-#define GLOW_TILE_BOTTOM_LEFT (1 << 6)
-#define GLOW_TILE_TOP_LEFT (1 << 7)
+#define GLOW_FULL 0xFFFF
+#define GLOW_EDGE_R (1 << 0)
+#define GLOW_EDGE_L (1 << 1)
+#define GLOW_EDGE_B (1 << 2)
+#define GLOW_EDGE_T (1 << 3)
+#define GLOW_CORNER_TL (1 << 4)
+#define GLOW_CORNER_BL (1 << 5)
+#define GLOW_CORNER_TR (1 << 6)
+#define GLOW_CORNER_BR (1 << 7)
-struct PokeDexAreaScreenMapIdentity
+#define GLOW_PALETTE 10
+
+#define TAG_AREA_MARKER 2
+#define TAG_AREA_UNKNOWN 3
+
+#define MAX_AREA_HIGHLIGHTS 64 // Maximum number of rectangular route highlights
+#define MAX_AREA_MARKERS 32 // Maximum number of circular spot highlights
+
+struct OverworldArea
{
u8 mapGroup;
u8 mapNum;
u16 regionMapSectionId;
};
-struct PokeDexAreaScreen
+struct
{
/*0x000*/ void (*callback)(void); // unused
/*0x004*/ MainCallback prev; // unused
/*0x008*/ MainCallback next; // unused
/*0x00C*/ u16 state; // unused
/*0x00E*/ u16 species;
- /*0x010*/ struct PokeDexAreaScreenMapIdentity overworldAreasWithMons[0x40];
+ /*0x010*/ struct OverworldArea overworldAreasWithMons[MAX_AREA_HIGHLIGHTS];
/*0x110*/ u16 numOverworldAreas;
/*0x112*/ u16 numSpecialAreas;
/*0x114*/ u16 drawAreaGlowState;
- /*0x116*/ u16 areaGlowTilemap[0x280];
- /*0x616*/ u16 areaShadeOrMarkerFrameCounter;
- /*0x618*/ u16 areaShadeFrameCounter;
+ /*0x116*/ u16 areaGlowTilemap[AREA_SCREEN_WIDTH * AREA_SCREEN_HEIGHT];
+ /*0x616*/ u16 markerTimer;
+ /*0x618*/ u16 glowTimer;
/*0x61A*/ u16 areaShadeBldArgLo;
/*0x61C*/ u16 areaShadeBldArgHi;
- /*0x61E*/ u8 whichMarkersFlashing;
- /*0x61F*/ u8 specialMarkerCycleCounter;
- /*0x620*/ u16 specialAreaRegionMapSectionIds[0x20];
- /*0x660*/ struct Sprite *areaMarkerSprites[0x20];
+ /*0x61E*/ bool8 showingMarkers;
+ /*0x61F*/ u8 markerFlashCounter;
+ /*0x620*/ u16 specialAreaRegionMapSectionIds[MAX_AREA_MARKERS];
+ /*0x660*/ struct Sprite *areaMarkerSprites[MAX_AREA_MARKERS];
/*0x6E0*/ u16 numAreaMarkerSprites;
- /*0x6E2*/ u16 unk6E2;
- /*0x6E4*/ u16 unk6E4;
+ /*0x6E2*/ u16 alteringCaveCounter;
+ /*0x6E4*/ u16 alteringCaveId;
/*0x6E8*/ u8 *screenSwitchState;
/*0x6EC*/ struct RegionMap regionMap;
- /*0xF70*/ u8 charBuffer[0x40];
+ /*0xF70*/ u8 charBuffer[64];
/*0xFB0*/ struct Sprite * areaUnknownSprites[3];
/*0xFBC*/ u8 areaUnknownGraphicsBuffer[0x600];
-};
-
-static EWRAM_DATA struct PokeDexAreaScreen *sPokedexAreaScreen = NULL;
+} static EWRAM_DATA *sPokedexAreaScreen = NULL;
static void FindMapsWithMon(u16);
static void BuildAreaGlowTilemap(void);
static void SetAreaHasMon(u16, u16);
static void SetSpecialMapHasMon(u16, u16);
static u16 GetRegionMapSectionId(u8, u8);
-static bool8 MapHasMon(const struct WildPokemonHeader *, u16);
-static bool8 MonListHasMon(const struct WildPokemonInfo *, u16, u16);
+static bool8 MapHasSpecies(const struct WildPokemonHeader *, u16);
+static bool8 MonListHasSpecies(const struct WildPokemonInfo *, u16, u16);
static void DoAreaGlow(void);
static void Task_ShowPokedexAreaScreen(u8);
static void CreateAreaMarkerSprites(void);
@@ -86,7 +105,7 @@ static void LoadAreaUnknownGraphics(void);
static void CreateAreaUnknownSprites(void);
static void Task_HandlePokedexAreaScreenInput(u8);
static void ResetPokedexAreaMapBg(void);
-static void DestroyAreaMarkerSprites(void);
+static void DestroyAreaScreenSprites(void);
static const u32 sAreaGlow_Pal[] = INCBIN_U32("graphics/pokedex/area_glow.gbapal");
static const u32 sAreaGlow_Gfx[] = INCBIN_U32("graphics/pokedex/area_glow.4bpp.lz");
@@ -117,115 +136,7 @@ static const u16 sLandmarkData[][2] =
{MAPSEC_NONE}
};
-// Only some parts of this array are acutally used, because corner flags that overlap
-// with edge flags are cancelled out before lookup. For example, GLOW_TILE_BOTTOM_RIGHT | GLOW_TILE_RIGHT
-// will never be read.
-//
-// The rest of the bytes seem to be old data from before the cancellation was implemented.
-// Most of them line up as you would expect ([BOTTOM_RIGHT | RIGHT] has the same value as [RIGHT]).
-//
-// Any unreachable entries are simply listed in order, without the fancy "[FLAGS] = 0xXX" notation.
-static const u8 sAreaGlowTilemapMapping[] = {
- [0] = 0x00,
- [GLOW_TILE_LEFT] = 0x01,
- [GLOW_TILE_RIGHT] = 0x02,
- [GLOW_TILE_RIGHT | GLOW_TILE_LEFT] = 0x03,
- [GLOW_TILE_TOP] = 0x04,
- [GLOW_TILE_TOP | GLOW_TILE_LEFT] = 0x05,
- [GLOW_TILE_TOP | GLOW_TILE_RIGHT] = 0x06,
- [GLOW_TILE_TOP | GLOW_TILE_RIGHT | GLOW_TILE_LEFT] = 0x07,
- [GLOW_TILE_BOTTOM] = 0x08,
- [GLOW_TILE_BOTTOM | GLOW_TILE_LEFT] = 0x09,
- [GLOW_TILE_BOTTOM | GLOW_TILE_RIGHT] = 0x0a,
- [GLOW_TILE_BOTTOM | GLOW_TILE_RIGHT | GLOW_TILE_LEFT] = 0x0b,
- [GLOW_TILE_BOTTOM | GLOW_TILE_TOP] = 0x0c,
- [GLOW_TILE_BOTTOM | GLOW_TILE_TOP | GLOW_TILE_LEFT] = 0x0d,
- [GLOW_TILE_BOTTOM | GLOW_TILE_TOP | GLOW_TILE_RIGHT] = 0x0e,
- [GLOW_TILE_BOTTOM | GLOW_TILE_TOP | GLOW_TILE_RIGHT | GLOW_TILE_LEFT] = 0x0f,
- [GLOW_TILE_BOTTOM_RIGHT] = 0x11,
- [GLOW_TILE_BOTTOM_RIGHT | GLOW_TILE_LEFT] = 0x20,
- 0x02, 0x03,
- [GLOW_TILE_BOTTOM_RIGHT | GLOW_TILE_TOP] = 0x27,
- [GLOW_TILE_BOTTOM_RIGHT | GLOW_TILE_TOP | GLOW_TILE_LEFT] = 0x2d,
- 0x06, 0x07, 0x08, 0x09, 0x0a,
- 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
- [GLOW_TILE_TOP_RIGHT] = 0x12,
- [GLOW_TILE_TOP_RIGHT | GLOW_TILE_LEFT] = 0x21,
- 0x02, 0x03, 0x04, 0x05, 0x06,
- 0x07,
- [GLOW_TILE_TOP_RIGHT | GLOW_TILE_BOTTOM] = 0x2a,
- [GLOW_TILE_TOP_RIGHT | GLOW_TILE_BOTTOM | GLOW_TILE_LEFT] = 0x2e,
- 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
- 0x0f,
- [GLOW_TILE_TOP_RIGHT | GLOW_TILE_BOTTOM_RIGHT] = 0x13,
- [GLOW_TILE_TOP_RIGHT | GLOW_TILE_BOTTOM_RIGHT | GLOW_TILE_LEFT] = 0x22,
- 0x02, 0x03, 0x27, 0x2d, 0x06,
- 0x07, 0x2a, 0x2e, 0x0a, 0x0b,
- 0x0c, 0x0d, 0x0e, 0x0f,
- [GLOW_TILE_BOTTOM_LEFT] = 0x14,
- 0x01,
- [GLOW_TILE_BOTTOM_LEFT | GLOW_TILE_RIGHT] = 0x23,
- 0x03,
- [GLOW_TILE_BOTTOM_LEFT | GLOW_TILE_TOP] = 0x26,
- 0x05,
- [GLOW_TILE_BOTTOM_LEFT | GLOW_TILE_TOP | GLOW_TILE_RIGHT] = 0x2c,
- 0x07, 0x08, 0x09, 0x0a, 0x0b,
- 0x0c, 0x0d, 0x0e, 0x0f,
- [GLOW_TILE_BOTTOM_LEFT | GLOW_TILE_BOTTOM_RIGHT] = 0x15,
- 0x20, 0x23, 0x03,
- [GLOW_TILE_BOTTOM_LEFT | GLOW_TILE_BOTTOM_RIGHT | GLOW_TILE_TOP] = 0x28,
- 0x2d, 0x2c, 0x07, 0x08, 0x09,
- 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
- 0x0f,
- [GLOW_TILE_BOTTOM_LEFT | GLOW_TILE_TOP_RIGHT] = 0x16,
- 0x21, 0x23, 0x03, 0x26, 0x05,
- 0x2c, 0x07, 0x2a, 0x2e, 0x0a,
- 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
- [GLOW_TILE_BOTTOM_LEFT | GLOW_TILE_TOP_RIGHT | GLOW_TILE_BOTTOM_RIGHT] = 0x17,
- 0x22, 0x23, 0x03, 0x28, 0x2d,
- 0x2c, 0x07, 0x2a, 0x2e, 0x0a,
- 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
- [GLOW_TILE_TOP_LEFT] = 0x18,
- 0x01,
- [GLOW_TILE_TOP_LEFT | GLOW_TILE_RIGHT] = 0x24,
- 0x03, 0x04, 0x05, 0x06, 0x07,
- [GLOW_TILE_TOP_LEFT | GLOW_TILE_BOTTOM] = 0x29,
- 0x09,
- [GLOW_TILE_TOP_LEFT | GLOW_TILE_BOTTOM | GLOW_TILE_RIGHT] = 0x2f,
- 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
- [GLOW_TILE_TOP_LEFT | GLOW_TILE_BOTTOM_RIGHT] = 0x19,
- 0x20, 0x24, 0x03, 0x27, 0x2d,
- 0x06, 0x07, 0x29, 0x09, 0x2f,
- 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
- [GLOW_TILE_TOP_LEFT | GLOW_TILE_TOP_RIGHT] = 0x1a,
- 0x21, 0x24, 0x03, 0x04, 0x05,
- 0x06, 0x07,
- [GLOW_TILE_TOP_LEFT | GLOW_TILE_TOP_RIGHT | GLOW_TILE_BOTTOM] = 0x2b,
- 0x2e, 0x2f, 0x0b, 0x0c, 0x0d,
- 0x0e, 0x0f,
- [GLOW_TILE_TOP_LEFT | GLOW_TILE_TOP_RIGHT | GLOW_TILE_BOTTOM_RIGHT] = 0x1b,
- 0x22, 0x24, 0x03, 0x27, 0x2d,
- 0x06, 0x07, 0x2b, 0x2e, 0x2f,
- 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
- [GLOW_TILE_TOP_LEFT | GLOW_TILE_BOTTOM_LEFT] = 0x1c,
- 0x01,
- [GLOW_TILE_TOP_LEFT | GLOW_TILE_BOTTOM_LEFT | GLOW_TILE_RIGHT] = 0x25,
- 0x03, 0x26, 0x05, 0x2c, 0x07,
- 0x29, 0x09, 0x2f, 0x0b, 0x0c,
- 0x0d, 0x0e, 0x0f,
- [GLOW_TILE_TOP_LEFT | GLOW_TILE_BOTTOM_LEFT | GLOW_TILE_BOTTOM_RIGHT] = 0x1d,
- 0x20, 0x25, 0x03, 0x28, 0x2d,
- 0x2c, 0x07, 0x29, 0x09, 0x2f,
- 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
- [GLOW_TILE_TOP_LEFT | GLOW_TILE_BOTTOM_LEFT | GLOW_TILE_TOP_RIGHT] = 0x1e,
- 0x21, 0x25, 0x03, 0x26, 0x05,
- 0x2c, 0x07, 0x2b, 0x2e, 0x2f,
- 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
- [GLOW_TILE_TOP_LEFT | GLOW_TILE_BOTTOM_LEFT | GLOW_TILE_TOP_RIGHT | GLOW_TILE_BOTTOM_RIGHT] = 0x1f,
- 0x22, 0x25, 0x03, 0x28, 0x2d,
- 0x2c, 0x07, 0x2b, 0x2e, 0x2f,
- 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-};
+#include "data/pokedex_area_glow.h"
static const struct PokedexAreaMapTemplate sPokedexAreaMapTemplate =
{
@@ -238,13 +149,13 @@ static const struct PokedexAreaMapTemplate sPokedexAreaMapTemplate =
static const u8 sAreaMarkerTiles[];
static const struct SpriteSheet sAreaMarkerSpriteSheet =
{
- sAreaMarkerTiles, 0x80, 2
+ .data = sAreaMarkerTiles, .size = 0x80, .tag = TAG_AREA_MARKER
};
static const u16 sAreaMarkerPalette[];
static const struct SpritePalette sAreaMarkerSpritePalette =
{
- sAreaMarkerPalette, 2
+ .data = sAreaMarkerPalette, .tag = TAG_AREA_MARKER
};
static const struct OamData sAreaMarkerOamData =
@@ -256,13 +167,13 @@ static const struct OamData sAreaMarkerOamData =
static const struct SpriteTemplate sAreaMarkerSpriteTemplate =
{
- 2,
- 2,
- &sAreaMarkerOamData,
- gDummySpriteAnimTable,
- NULL,
- gDummySpriteAffineAnimTable,
- SpriteCallbackDummy
+ .tileTag = TAG_AREA_MARKER,
+ .paletteTag = TAG_AREA_MARKER,
+ .oam = &sAreaMarkerOamData,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
};
static const u16 sAreaMarkerPalette[] = INCBIN_U16("graphics/pokedex/area_marker.gbapal");
@@ -270,7 +181,7 @@ static const u8 sAreaMarkerTiles[] = INCBIN_U8("graphics/pokedex/area_marker.4bp
static const struct SpritePalette sAreaUnknownSpritePalette =
{
- gPokedexAreaScreenAreaUnknown_Pal, 3
+ .data = gPokedexAreaScreenAreaUnknown_Pal, .tag = TAG_AREA_UNKNOWN
};
static const struct OamData sAreaUnknownOamData =
@@ -282,13 +193,13 @@ static const struct OamData sAreaUnknownOamData =
static const struct SpriteTemplate sAreaUnknownSpriteTemplate =
{
- 3,
- 3,
- &sAreaUnknownOamData,
- gDummySpriteAnimTable,
- NULL,
- gDummySpriteAffineAnimTable,
- SpriteCallbackDummy
+ .tileTag = TAG_AREA_UNKNOWN,
+ .paletteTag = TAG_AREA_UNKNOWN,
+ .oam = &sAreaUnknownOamData,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
};
static void ResetDrawAreaGlowState(void)
@@ -308,17 +219,17 @@ static bool8 DrawAreaGlow(void)
break;
case 2:
DecompressAndCopyTileDataToVram(2, sAreaGlow_Gfx, 0, 0, 0);
- LoadBgTilemap(2, sPokedexAreaScreen->areaGlowTilemap, 0x500, 0);
+ LoadBgTilemap(2, sPokedexAreaScreen->areaGlowTilemap, sizeof(sPokedexAreaScreen->areaGlowTilemap), 0);
break;
case 3:
if (!FreeTempTileDataBuffersIfPossible())
{
- CpuCopy32(sAreaGlow_Pal, gPlttBufferUnfaded + 0xA0, 0x20);
+ CpuCopy32(sAreaGlow_Pal, &gPlttBufferUnfaded[GLOW_PALETTE * 16], sizeof(sAreaGlow_Pal));
sPokedexAreaScreen->drawAreaGlowState++;
}
return TRUE;
case 4:
- ChangeBgY(2, -0x800, BG_COORD_SET);
+ ChangeBgY(2, -BG_SCREEN_SIZE, BG_COORD_SET);
break;
default:
return FALSE;
@@ -333,58 +244,67 @@ static void FindMapsWithMon(u16 species)
u16 i;
struct Roamer *roamer;
- sPokedexAreaScreen->unk6E2 = 0;
- sPokedexAreaScreen->unk6E4 = VarGet(VAR_ALTERING_CAVE_WILD_SET);
- if (sPokedexAreaScreen->unk6E4 > 8)
- sPokedexAreaScreen->unk6E4 = 0;
+ sPokedexAreaScreen->alteringCaveCounter = 0;
+ sPokedexAreaScreen->alteringCaveId = VarGet(VAR_ALTERING_CAVE_WILD_SET);
+ if (sPokedexAreaScreen->alteringCaveId >= NUM_ALTERING_CAVE_TABLES)
+ sPokedexAreaScreen->alteringCaveId = 0;
roamer = &gSaveBlock1Ptr->roamer;
if (species != roamer->species)
{
sPokedexAreaScreen->numOverworldAreas = 0;
sPokedexAreaScreen->numSpecialAreas = 0;
+
+ // Check if this species should be hidden from the area map.
+ // This only applies to Wynaut, to hide the encounters on Mirage Island.
for (i = 0; i < ARRAY_COUNT(sSpeciesHiddenFromAreaScreen); i++)
{
if (sSpeciesHiddenFromAreaScreen[i] == species)
return;
}
+ // Add Pokémon with special encounter circumstances (i.e. not listed
+ // in the regular wild encounter table) to the area map.
+ // This only applies to Feebas on Route 119, but it was clearly set
+ // up to allow handling others.
for (i = 0; sFeebasData[i][0] != NUM_SPECIES; i++)
{
if (species == sFeebasData[i][0])
{
switch (sFeebasData[i][1])
{
- case MAP_GROUP_OVERWORLD_MONS:
- SetAreaHasMon(sFeebasData[i][1], sFeebasData[i][2]);
- break;
- case MAP_GROUP_SPECIAL_MONS_1:
- case MAP_GROUP_SPECIAL_MONS_2:
- SetSpecialMapHasMon(sFeebasData[i][1], sFeebasData[i][2]);
- break;
+ case MAP_GROUP_TOWNS_AND_ROUTES:
+ SetAreaHasMon(sFeebasData[i][1], sFeebasData[i][2]);
+ break;
+ case MAP_GROUP_DUNGEONS:
+ case MAP_GROUP_SPECIAL_AREA:
+ SetSpecialMapHasMon(sFeebasData[i][1], sFeebasData[i][2]);
+ break;
}
}
}
+ // Add regular species to the area map
for (i = 0; gWildMonHeaders[i].mapGroup != MAP_GROUP(UNDEFINED); i++)
{
- if (MapHasMon(&gWildMonHeaders[i], species))
+ if (MapHasSpecies(&gWildMonHeaders[i], species))
{
switch (gWildMonHeaders[i].mapGroup)
{
- case MAP_GROUP_OVERWORLD_MONS:
- SetAreaHasMon(gWildMonHeaders[i].mapGroup, gWildMonHeaders[i].mapNum);
- break;
- case MAP_GROUP_SPECIAL_MONS_1:
- case MAP_GROUP_SPECIAL_MONS_2:
- SetSpecialMapHasMon(gWildMonHeaders[i].mapGroup, gWildMonHeaders[i].mapNum);
- break;
+ case MAP_GROUP_TOWNS_AND_ROUTES:
+ SetAreaHasMon(gWildMonHeaders[i].mapGroup, gWildMonHeaders[i].mapNum);
+ break;
+ case MAP_GROUP_DUNGEONS:
+ case MAP_GROUP_SPECIAL_AREA:
+ SetSpecialMapHasMon(gWildMonHeaders[i].mapGroup, gWildMonHeaders[i].mapNum);
+ break;
}
}
}
}
else
{
+ // This is the roamer's species, show where the roamer is currently
sPokedexAreaScreen->numSpecialAreas = 0;
if (roamer->active)
{
@@ -401,7 +321,7 @@ static void FindMapsWithMon(u16 species)
static void SetAreaHasMon(u16 mapGroup, u16 mapNum)
{
- if (sPokedexAreaScreen->numOverworldAreas < 0x40)
+ if (sPokedexAreaScreen->numOverworldAreas < MAX_AREA_HIGHLIGHTS)
{
sPokedexAreaScreen->overworldAreasWithMons[sPokedexAreaScreen->numOverworldAreas].mapGroup = mapGroup;
sPokedexAreaScreen->overworldAreasWithMons[sPokedexAreaScreen->numOverworldAreas].mapNum = mapNum;
@@ -414,23 +334,26 @@ static void SetSpecialMapHasMon(u16 mapGroup, u16 mapNum)
{
int i;
- if (sPokedexAreaScreen->numSpecialAreas < 0x20)
+ if (sPokedexAreaScreen->numSpecialAreas < MAX_AREA_MARKERS)
{
u16 regionMapSectionId = GetRegionMapSectionId(mapGroup, mapNum);
if (regionMapSectionId < MAPSEC_NONE)
{
+ // Don't highlight the area if it's a moving area (Marine/Terra Cave)
for (i = 0; i < ARRAY_COUNT(sMovingRegionMapSections); i++)
{
if (regionMapSectionId == sMovingRegionMapSections[i])
return;
}
+ // Don't highlight the area if it's an undiscovered landmark (e.g. Sky Pillar)
for (i = 0; sLandmarkData[i][0] != MAPSEC_NONE; i++)
{
if (regionMapSectionId == sLandmarkData[i][0] && !FlagGet(sLandmarkData[i][1]))
return;
}
+ // Check if this special area is already being tracked
for (i = 0; i < sPokedexAreaScreen->numSpecialAreas; i++)
{
if (sPokedexAreaScreen->specialAreaRegionMapSectionIds[i] == regionMapSectionId)
@@ -439,6 +362,7 @@ static void SetSpecialMapHasMon(u16 mapGroup, u16 mapNum)
if (i == sPokedexAreaScreen->numSpecialAreas)
{
+ // New special area
sPokedexAreaScreen->specialAreaRegionMapSectionIds[i] = regionMapSectionId;
sPokedexAreaScreen->numSpecialAreas++;
}
@@ -451,27 +375,34 @@ static u16 GetRegionMapSectionId(u8 mapGroup, u8 mapNum)
return Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum)->regionMapSectionId;
}
-static bool8 MapHasMon(const struct WildPokemonHeader *info, u16 species)
+static bool8 MapHasSpecies(const struct WildPokemonHeader *info, u16 species)
{
+ // If this is a header for Altering Cave, skip it if it's not the current Altering Cave encounter set
if (GetRegionMapSectionId(info->mapGroup, info->mapNum) == MAPSEC_ALTERING_CAVE)
{
- sPokedexAreaScreen->unk6E2++;
- if (sPokedexAreaScreen->unk6E2 != sPokedexAreaScreen->unk6E4 + 1)
+ sPokedexAreaScreen->alteringCaveCounter++;
+ if (sPokedexAreaScreen->alteringCaveCounter != sPokedexAreaScreen->alteringCaveId + 1)
return FALSE;
}
- if (MonListHasMon(info->landMonsInfo, species, 12))
+ if (MonListHasSpecies(info->landMonsInfo, species, LAND_WILD_COUNT))
return TRUE;
- if (MonListHasMon(info->waterMonsInfo, species, 5))
+ if (MonListHasSpecies(info->waterMonsInfo, species, WATER_WILD_COUNT))
return TRUE;
- if (MonListHasMon(info->fishingMonsInfo, species, 12))
+// When searching the fishing encounters, this incorrectly uses the size of the land encounters.
+// As a result it's reading out of bounds of the fishing encounters tables.
+#ifdef BUGFIX
+ if (MonListHasSpecies(info->fishingMonsInfo, species, FISH_WILD_COUNT))
+#else
+ if (MonListHasSpecies(info->fishingMonsInfo, species, LAND_WILD_COUNT))
+#endif
return TRUE;
- if (MonListHasMon(info->rockSmashMonsInfo, species, 5))
+ if (MonListHasSpecies(info->rockSmashMonsInfo, species, ROCK_WILD_COUNT))
return TRUE;
return FALSE;
}
-static bool8 MonListHasMon(const struct WildPokemonInfo *info, u16 species, u16 size)
+static bool8 MonListHasSpecies(const struct WildPokemonInfo *info, u16 species, u16 size)
{
u16 i;
if (info != NULL)
@@ -489,9 +420,12 @@ static void BuildAreaGlowTilemap(void)
{
u16 i, y, x, j;
+ // Reset tilemap
for (i = 0; i < ARRAY_COUNT(sPokedexAreaScreen->areaGlowTilemap); i++)
sPokedexAreaScreen->areaGlowTilemap[i] = 0;
+ // For each area with this species, scan the region map layout and find any locations that have a matching mapsec.
+ // Add a "full glow" indicator for these matching spaces.
for (i = 0; i < sPokedexAreaScreen->numOverworldAreas; i++)
{
j = 0;
@@ -500,69 +434,73 @@ static void BuildAreaGlowTilemap(void)
for (x = 0; x < AREA_SCREEN_WIDTH; x++)
{
if (GetRegionMapSecIdAt(x, y) == sPokedexAreaScreen->overworldAreasWithMons[i].regionMapSectionId)
- sPokedexAreaScreen->areaGlowTilemap[j] = GLOW_TILE_FULL;
-
+ sPokedexAreaScreen->areaGlowTilemap[j] = GLOW_FULL;
j++;
}
}
}
+ // Scan the tilemap. For every "full glow" indicator added above, fill in its edges and corners.
j = 0;
for (y = 0; y < AREA_SCREEN_HEIGHT; y++)
{
for (x = 0; x < AREA_SCREEN_WIDTH; x++)
{
- if (sPokedexAreaScreen->areaGlowTilemap[j] == GLOW_TILE_FULL)
+ if (sPokedexAreaScreen->areaGlowTilemap[j] == GLOW_FULL)
{
- // The "tile != GLOW_TILE_FULL" check is pointless in all of these conditionals,
+ // The "tile != GLOW_FULL" check is pointless in all of these conditionals,
// since there's no harm in OR'ing 0xFFFF with anything else.
// Edges
- if (x != 0 && sPokedexAreaScreen->areaGlowTilemap[j - 1] != GLOW_TILE_FULL)
- sPokedexAreaScreen->areaGlowTilemap[j - 1] |= GLOW_TILE_RIGHT;
- if (x != AREA_SCREEN_WIDTH - 1 && sPokedexAreaScreen->areaGlowTilemap[j + 1] != GLOW_TILE_FULL)
- sPokedexAreaScreen->areaGlowTilemap[j + 1] |= GLOW_TILE_LEFT;
- if (y != 0 && sPokedexAreaScreen->areaGlowTilemap[j - AREA_SCREEN_WIDTH] != GLOW_TILE_FULL)
- sPokedexAreaScreen->areaGlowTilemap[j - AREA_SCREEN_WIDTH] |= GLOW_TILE_BOTTOM;
- if (y != AREA_SCREEN_HEIGHT - 1 && sPokedexAreaScreen->areaGlowTilemap[j + AREA_SCREEN_WIDTH] != GLOW_TILE_FULL)
- sPokedexAreaScreen->areaGlowTilemap[j + AREA_SCREEN_WIDTH] |= GLOW_TILE_TOP;
+ if (x != 0 && sPokedexAreaScreen->areaGlowTilemap[j - 1] != GLOW_FULL)
+ sPokedexAreaScreen->areaGlowTilemap[j - 1] |= GLOW_EDGE_L;
+ if (x != AREA_SCREEN_WIDTH - 1 && sPokedexAreaScreen->areaGlowTilemap[j + 1] != GLOW_FULL)
+ sPokedexAreaScreen->areaGlowTilemap[j + 1] |= GLOW_EDGE_R;
+ if (y != 0 && sPokedexAreaScreen->areaGlowTilemap[j - AREA_SCREEN_WIDTH] != GLOW_FULL)
+ sPokedexAreaScreen->areaGlowTilemap[j - AREA_SCREEN_WIDTH] |= GLOW_EDGE_T;
+ if (y != AREA_SCREEN_HEIGHT - 1 && sPokedexAreaScreen->areaGlowTilemap[j + AREA_SCREEN_WIDTH] != GLOW_FULL)
+ sPokedexAreaScreen->areaGlowTilemap[j + AREA_SCREEN_WIDTH] |= GLOW_EDGE_B;
- // Diagonals
- if (x != 0 && y != 0 && sPokedexAreaScreen->areaGlowTilemap[j - AREA_SCREEN_WIDTH - 1] != GLOW_TILE_FULL)
- sPokedexAreaScreen->areaGlowTilemap[j - AREA_SCREEN_WIDTH - 1] |= GLOW_TILE_BOTTOM_RIGHT;
- if (x != AREA_SCREEN_WIDTH - 1 && y != 0 && sPokedexAreaScreen->areaGlowTilemap[j - AREA_SCREEN_WIDTH + 1] != GLOW_TILE_FULL)
- sPokedexAreaScreen->areaGlowTilemap[j - AREA_SCREEN_WIDTH + 1] |= GLOW_TILE_BOTTOM_LEFT;
- if (x != 0 && y != AREA_SCREEN_HEIGHT - 1 && sPokedexAreaScreen->areaGlowTilemap[j + AREA_SCREEN_WIDTH - 1] != GLOW_TILE_FULL)
- sPokedexAreaScreen->areaGlowTilemap[j + AREA_SCREEN_WIDTH - 1] |= GLOW_TILE_TOP_RIGHT;
- if (x != AREA_SCREEN_WIDTH - 1 && y != AREA_SCREEN_HEIGHT - 1 && sPokedexAreaScreen->areaGlowTilemap[j + AREA_SCREEN_WIDTH + 1] != GLOW_TILE_FULL)
- sPokedexAreaScreen->areaGlowTilemap[j + AREA_SCREEN_WIDTH + 1] |= GLOW_TILE_TOP_LEFT;
+ // Corners
+ if (x != 0 && y != 0 && sPokedexAreaScreen->areaGlowTilemap[j - AREA_SCREEN_WIDTH - 1] != GLOW_FULL)
+ sPokedexAreaScreen->areaGlowTilemap[j - AREA_SCREEN_WIDTH - 1] |= GLOW_CORNER_TL;
+ if (x != AREA_SCREEN_WIDTH - 1 && y != 0 && sPokedexAreaScreen->areaGlowTilemap[j - AREA_SCREEN_WIDTH + 1] != GLOW_FULL)
+ sPokedexAreaScreen->areaGlowTilemap[j - AREA_SCREEN_WIDTH + 1] |= GLOW_CORNER_TR;
+ if (x != 0 && y != AREA_SCREEN_HEIGHT - 1 && sPokedexAreaScreen->areaGlowTilemap[j + AREA_SCREEN_WIDTH - 1] != GLOW_FULL)
+ sPokedexAreaScreen->areaGlowTilemap[j + AREA_SCREEN_WIDTH - 1] |= GLOW_CORNER_BL;
+ if (x != AREA_SCREEN_WIDTH - 1 && y != AREA_SCREEN_HEIGHT - 1 && sPokedexAreaScreen->areaGlowTilemap[j + AREA_SCREEN_WIDTH + 1] != GLOW_FULL)
+ sPokedexAreaScreen->areaGlowTilemap[j + AREA_SCREEN_WIDTH + 1] |= GLOW_CORNER_BR;
}
j++;
}
}
+ // Scan the tilemap again. Replace the "full tile" indicators with the actual tile id,
+ // and remove corner flags when they're overlapped by an edge.
for (i = 0; i < ARRAY_COUNT(sPokedexAreaScreen->areaGlowTilemap); i++)
{
- if (sPokedexAreaScreen->areaGlowTilemap[i] == GLOW_TILE_FULL)
+ if (sPokedexAreaScreen->areaGlowTilemap[i] == GLOW_FULL)
{
- sPokedexAreaScreen->areaGlowTilemap[i] = 0x10;
- sPokedexAreaScreen->areaGlowTilemap[i] |= 0xA000;
+ sPokedexAreaScreen->areaGlowTilemap[i] = GLOW_TILE_FULL;
+ sPokedexAreaScreen->areaGlowTilemap[i] |= (GLOW_PALETTE << 12);
}
else if (sPokedexAreaScreen->areaGlowTilemap[i])
{
- // Get rid of overlapping flags
- if (sPokedexAreaScreen->areaGlowTilemap[i] & GLOW_TILE_RIGHT)
- sPokedexAreaScreen->areaGlowTilemap[i] &= ~(GLOW_TILE_BOTTOM_RIGHT | GLOW_TILE_TOP_RIGHT);
- if (sPokedexAreaScreen->areaGlowTilemap[i] & GLOW_TILE_LEFT)
- sPokedexAreaScreen->areaGlowTilemap[i] &= ~(GLOW_TILE_BOTTOM_LEFT | GLOW_TILE_TOP_LEFT);
- if (sPokedexAreaScreen->areaGlowTilemap[i] & GLOW_TILE_BOTTOM)
- sPokedexAreaScreen->areaGlowTilemap[i] &= ~(GLOW_TILE_BOTTOM_LEFT | GLOW_TILE_BOTTOM_RIGHT);
- if (sPokedexAreaScreen->areaGlowTilemap[i] & GLOW_TILE_TOP)
- sPokedexAreaScreen->areaGlowTilemap[i] &= ~(GLOW_TILE_TOP_LEFT | GLOW_TILE_TOP_RIGHT);
+ // Get rid of overlapping flags.
+ // This is pointless, as sAreaGlowTilemapMapping can handle overlaps.
+ if (sPokedexAreaScreen->areaGlowTilemap[i] & GLOW_EDGE_L)
+ sPokedexAreaScreen->areaGlowTilemap[i] &= ~(GLOW_CORNER_TL | GLOW_CORNER_BL);
+ if (sPokedexAreaScreen->areaGlowTilemap[i] & GLOW_EDGE_R)
+ sPokedexAreaScreen->areaGlowTilemap[i] &= ~(GLOW_CORNER_TR | GLOW_CORNER_BR);
+ if (sPokedexAreaScreen->areaGlowTilemap[i] & GLOW_EDGE_T)
+ sPokedexAreaScreen->areaGlowTilemap[i] &= ~(GLOW_CORNER_TR | GLOW_CORNER_TL);
+ if (sPokedexAreaScreen->areaGlowTilemap[i] & GLOW_EDGE_B)
+ sPokedexAreaScreen->areaGlowTilemap[i] &= ~(GLOW_CORNER_BR | GLOW_CORNER_BL);
+ // Assign tile id
sPokedexAreaScreen->areaGlowTilemap[i] = sAreaGlowTilemapMapping[sPokedexAreaScreen->areaGlowTilemap[i]];
- sPokedexAreaScreen->areaGlowTilemap[i] |= 0xA000;
+ sPokedexAreaScreen->areaGlowTilemap[i] |= (GLOW_PALETTE << 12);
}
}
}
@@ -570,15 +508,15 @@ static void BuildAreaGlowTilemap(void)
static void StartAreaGlow(void)
{
if (sPokedexAreaScreen->numSpecialAreas && sPokedexAreaScreen->numOverworldAreas == 0)
- sPokedexAreaScreen->whichMarkersFlashing = 1;
+ sPokedexAreaScreen->showingMarkers = TRUE;
else
- sPokedexAreaScreen->whichMarkersFlashing = 0;
+ sPokedexAreaScreen->showingMarkers = FALSE;
- sPokedexAreaScreen->areaShadeOrMarkerFrameCounter = 0;
- sPokedexAreaScreen->areaShadeFrameCounter = 0;
+ sPokedexAreaScreen->markerTimer = 0;
+ sPokedexAreaScreen->glowTimer = 0;
sPokedexAreaScreen->areaShadeBldArgLo = 0;
- sPokedexAreaScreen->areaShadeBldArgHi = 0x40;
- sPokedexAreaScreen->specialMarkerCycleCounter = 1;
+ sPokedexAreaScreen->areaShadeBldArgHi = 64;
+ sPokedexAreaScreen->markerFlashCounter = 1;
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL);
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));
DoAreaGlow();
@@ -589,12 +527,13 @@ static void DoAreaGlow(void)
u16 x, y;
u16 i;
- if (sPokedexAreaScreen->whichMarkersFlashing == 0)
+ if (!sPokedexAreaScreen->showingMarkers)
{
- if (sPokedexAreaScreen->areaShadeOrMarkerFrameCounter == 0)
+ // Showing area glow
+ if (sPokedexAreaScreen->markerTimer == 0)
{
- sPokedexAreaScreen->areaShadeFrameCounter++;
- if (sPokedexAreaScreen->areaShadeFrameCounter & 1)
+ sPokedexAreaScreen->glowTimer++;
+ if (sPokedexAreaScreen->glowTimer & 1)
sPokedexAreaScreen->areaShadeBldArgLo = (sPokedexAreaScreen->areaShadeBldArgLo + 4) & 0x7f;
else
sPokedexAreaScreen->areaShadeBldArgHi = (sPokedexAreaScreen->areaShadeBldArgHi + 4) & 0x7f;
@@ -602,32 +541,38 @@ static void DoAreaGlow(void)
x = gSineTable[sPokedexAreaScreen->areaShadeBldArgLo] >> 4;
y = gSineTable[sPokedexAreaScreen->areaShadeBldArgHi] >> 4;
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(x, y));
- sPokedexAreaScreen->areaShadeOrMarkerFrameCounter = 0;
- if (sPokedexAreaScreen->areaShadeFrameCounter == 0x40)
+ sPokedexAreaScreen->markerTimer = 0;
+ if (sPokedexAreaScreen->glowTimer == 64)
{
- sPokedexAreaScreen->areaShadeFrameCounter = 0;
+ // Done glowing, reset and try to switch to the special area markers
+ sPokedexAreaScreen->glowTimer = 0;
if (sPokedexAreaScreen->numSpecialAreas != 0)
- sPokedexAreaScreen->whichMarkersFlashing = 1;
+ sPokedexAreaScreen->showingMarkers = TRUE;
}
}
else
- sPokedexAreaScreen->areaShadeOrMarkerFrameCounter--;
+ sPokedexAreaScreen->markerTimer--;
}
else
{
- sPokedexAreaScreen->areaShadeOrMarkerFrameCounter++;
- if (sPokedexAreaScreen->areaShadeOrMarkerFrameCounter > 12)
+ // Showing special area markers
+ sPokedexAreaScreen->markerTimer++;
+ if (sPokedexAreaScreen->markerTimer > 12)
{
- sPokedexAreaScreen->areaShadeOrMarkerFrameCounter = 0;
- sPokedexAreaScreen->specialMarkerCycleCounter++;
+ sPokedexAreaScreen->markerTimer = 0;
+
+ // Flash the marker
+ // With a max of 4, the marker will disappear twice
+ sPokedexAreaScreen->markerFlashCounter++;
for (i = 0; i < sPokedexAreaScreen->numSpecialAreas; i++)
- sPokedexAreaScreen->areaMarkerSprites[i]->invisible = sPokedexAreaScreen->specialMarkerCycleCounter & 1;
+ sPokedexAreaScreen->areaMarkerSprites[i]->invisible = sPokedexAreaScreen->markerFlashCounter & 1;
- if (sPokedexAreaScreen->specialMarkerCycleCounter > 4)
+ if (sPokedexAreaScreen->markerFlashCounter > 4)
{
- sPokedexAreaScreen->specialMarkerCycleCounter = 1;
+ // Done flashing, reset and try to switch to the area glow
+ sPokedexAreaScreen->markerFlashCounter = 1;
if (sPokedexAreaScreen->numOverworldAreas != 0)
- sPokedexAreaScreen->whichMarkersFlashing = 0;
+ sPokedexAreaScreen->showingMarkers = FALSE;
}
}
}
@@ -651,58 +596,58 @@ static void Task_ShowPokedexAreaScreen(u8 taskId)
{
switch (gTasks[taskId].tState)
{
- case 0:
- ResetSpriteData();
- FreeAllSpritePalettes();
- HideBg(3);
- HideBg(2);
- HideBg(0);
- break;
- case 1:
- SetBgAttribute(3, BG_ATTR_CHARBASEINDEX, 3);
- LoadPokedexAreaMapGfx(&sPokedexAreaMapTemplate);
- StringFill(sPokedexAreaScreen->charBuffer, CHAR_SPACE, 16);
- break;
- case 2:
- if (TryShowPokedexAreaMap() == TRUE)
- return;
- PokedexAreaMapChangeBgY(-8);
- break;
- case 3:
- ResetDrawAreaGlowState();
- break;
- case 4:
- if (DrawAreaGlow())
- return;
- break;
- case 5:
- ShowRegionMapForPokedexAreaScreen(&sPokedexAreaScreen->regionMap);
- CreateRegionMapPlayerIcon(1, 1);
- PokedexAreaScreen_UpdateRegionMapVariablesAndVideoRegs(0, -8);
- break;
- case 6:
- CreateAreaMarkerSprites();
- break;
- case 7:
- LoadAreaUnknownGraphics();
- break;
- case 8:
- CreateAreaUnknownSprites();
- break;
- case 9:
- BeginNormalPaletteFade(PALETTES_ALL & ~(0x14), 0, 16, 0, RGB(0, 0, 0));
- break;
- case 10:
- SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG0 | BLDCNT_TGT2_ALL);
- StartAreaGlow();
- ShowBg(2);
- ShowBg(3); // TryShowPokedexAreaMap will have done this already
- SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON);
- break;
- case 11:
- gTasks[taskId].func = Task_HandlePokedexAreaScreenInput;
- gTasks[taskId].tState = 0;
+ case 0:
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ HideBg(3);
+ HideBg(2);
+ HideBg(0);
+ break;
+ case 1:
+ SetBgAttribute(3, BG_ATTR_CHARBASEINDEX, 3);
+ LoadPokedexAreaMapGfx(&sPokedexAreaMapTemplate);
+ StringFill(sPokedexAreaScreen->charBuffer, CHAR_SPACE, 16);
+ break;
+ case 2:
+ if (TryShowPokedexAreaMap() == TRUE)
return;
+ PokedexAreaMapChangeBgY(-8);
+ break;
+ case 3:
+ ResetDrawAreaGlowState();
+ break;
+ case 4:
+ if (DrawAreaGlow())
+ return;
+ break;
+ case 5:
+ ShowRegionMapForPokedexAreaScreen(&sPokedexAreaScreen->regionMap);
+ CreateRegionMapPlayerIcon(1, 1);
+ PokedexAreaScreen_UpdateRegionMapVariablesAndVideoRegs(0, -8);
+ break;
+ case 6:
+ CreateAreaMarkerSprites();
+ break;
+ case 7:
+ LoadAreaUnknownGraphics();
+ break;
+ case 8:
+ CreateAreaUnknownSprites();
+ break;
+ case 9:
+ BeginNormalPaletteFade(PALETTES_ALL & ~(0x14), 0, 16, 0, RGB_BLACK);
+ break;
+ case 10:
+ SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG0 | BLDCNT_TGT2_ALL);
+ StartAreaGlow();
+ ShowBg(2);
+ ShowBg(3); // TryShowPokedexAreaMap will have done this already
+ SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON);
+ break;
+ case 11:
+ gTasks[taskId].func = Task_HandlePokedexAreaScreenInput;
+ gTasks[taskId].tState = 0;
+ return;
}
gTasks[taskId].tState++;
@@ -740,7 +685,7 @@ static void Task_HandlePokedexAreaScreenInput(u8 taskId)
case 3:
if (gPaletteFade.active)
return;
- DestroyAreaMarkerSprites();
+ DestroyAreaScreenSprites();
sPokedexAreaScreen->screenSwitchState[0] = gTasks[taskId].data[1];
ResetPokedexAreaMapBg();
DestroyTask(taskId);
@@ -758,6 +703,7 @@ static void ResetPokedexAreaMapBg(void)
SetBgAttribute(3, BG_ATTR_PALETTEMODE, 0);
}
+// Creates the circular sprites to highlight special areas (like caves) where a Pokémon can be found
static void CreateAreaMarkerSprites(void)
{
u8 spriteId;
@@ -788,17 +734,20 @@ static void CreateAreaMarkerSprites(void)
sPokedexAreaScreen->numAreaMarkerSprites = numSprites;
}
-static void DestroyAreaMarkerSprites(void)
+static void DestroyAreaScreenSprites(void)
{
u16 i;
- FreeSpriteTilesByTag(2);
- FreeSpritePaletteByTag(2);
+
+ // Destroy area marker sprites
+ FreeSpriteTilesByTag(TAG_AREA_MARKER);
+ FreeSpritePaletteByTag(TAG_AREA_MARKER);
for (i = 0; i < sPokedexAreaScreen->numAreaMarkerSprites; i++)
DestroySprite(sPokedexAreaScreen->areaMarkerSprites[i]);
- FreeSpriteTilesByTag(3);
- FreeSpritePaletteByTag(3);
- for (i = 0; i < 3; i++)
+ // Destroy "Area Unknown" sprites
+ FreeSpriteTilesByTag(TAG_AREA_UNKNOWN);
+ FreeSpritePaletteByTag(TAG_AREA_UNKNOWN);
+ for (i = 0; i < ARRAY_COUNT(sPokedexAreaScreen->areaUnknownSprites); i++)
{
if (sPokedexAreaScreen->areaUnknownSprites[i])
DestroySprite(sPokedexAreaScreen->areaUnknownSprites[i]);
@@ -809,8 +758,8 @@ static void LoadAreaUnknownGraphics(void)
{
struct SpriteSheet spriteSheet = {
.data = sPokedexAreaScreen->areaUnknownGraphicsBuffer,
- .size = 0x600,
- .tag = 3,
+ .size = sizeof(sPokedexAreaScreen->areaUnknownGraphicsBuffer),
+ .tag = TAG_AREA_UNKNOWN,
};
LZ77UnCompWram(gPokedexAreaScreenAreaUnknown_Gfx, sPokedexAreaScreen->areaUnknownGraphicsBuffer);
LoadSpriteSheet(&spriteSheet);
@@ -820,25 +769,27 @@ static void LoadAreaUnknownGraphics(void)
static void CreateAreaUnknownSprites(void)
{
u16 i;
- u8 spriteId;
if (sPokedexAreaScreen->numOverworldAreas || sPokedexAreaScreen->numSpecialAreas)
{
- for (i = 0; i < 3; i++)
+ // The current species is present on the map, don't create any "Area Unknown" sprites
+ for (i = 0; i < ARRAY_COUNT(sPokedexAreaScreen->areaUnknownSprites); i++)
sPokedexAreaScreen->areaUnknownSprites[i] = NULL;
}
else
{
- for (i = 0; i < 3; i++)
+ // The current species is absent on the map, try to create "Area Unknown" sprites
+ for (i = 0; i < ARRAY_COUNT(sPokedexAreaScreen->areaUnknownSprites); i++)
{
- spriteId = CreateSprite(&sAreaUnknownSpriteTemplate, i * 32 + 0xa0, 0x8c, 0);
+ u8 spriteId = CreateSprite(&sAreaUnknownSpriteTemplate, i * 32 + 160, 140, 0);
if (spriteId != MAX_SPRITES)
{
gSprites[spriteId].oam.tileNum += i * 16;
- sPokedexAreaScreen->areaUnknownSprites[i] = gSprites + spriteId;
+ sPokedexAreaScreen->areaUnknownSprites[i] = &gSprites[spriteId];
}
else
{
+ // Failed to create sprite
sPokedexAreaScreen->areaUnknownSprites[i] = NULL;
}
}
diff --git a/src/pokemon.c b/src/pokemon.c
index 2c98448e99..6df0920458 100644
--- a/src/pokemon.c
+++ b/src/pokemon.c
@@ -91,11 +91,14 @@ static const struct CombinedMove sCombinedMoves[2] =
{0xFFFF, 0xFFFF, 0xFFFF}
};
+// NOTE: The order of the elements in the 3 arrays below is irrelevant.
+// To reorder the pokedex, see the values in include/constants/pokedex.h.
+
#define SPECIES_TO_HOENN(name) [SPECIES_##name - 1] = HOENN_DEX_##name
#define SPECIES_TO_NATIONAL(name) [SPECIES_##name - 1] = NATIONAL_DEX_##name
#define HOENN_TO_NATIONAL(name) [HOENN_DEX_##name - 1] = NATIONAL_DEX_##name
- // Assigns all species to the Hoenn Dex Index (Summary No. for Hoenn Dex)
+// Assigns all species to the Hoenn Dex Index (Summary No. for Hoenn Dex)
static const u16 sSpeciesToHoennPokedexNum[NUM_SPECIES - 1] =
{
SPECIES_TO_HOENN(TREECKO),
@@ -311,7 +314,7 @@ static const u16 sSpeciesToHoennPokedexNum[NUM_SPECIES - 1] =
SPECIES_TO_HOENN(DEOXYS),
};
- // Assigns all species to the National Dex Index (Summary No. for National Dex)
+// Assigns all species to the National Dex Index (Summary No. for National Dex)
static const u16 sSpeciesToNationalPokedexNum[NUM_SPECIES - 1] =
{
SPECIES_TO_NATIONAL(BULBASAUR),
@@ -1805,10 +1808,10 @@ static const u16 sHoennToNationalOrder[HOENN_DEX_COUNT - 1] =
const struct SpindaSpot gSpindaSpotGraphics[] =
{
- {16, 7, INCBIN_U16("graphics/spinda_spots/spot_0.bin")},
- {40, 8, INCBIN_U16("graphics/spinda_spots/spot_1.bin")},
- {22, 25, INCBIN_U16("graphics/spinda_spots/spot_2.bin")},
- {34, 26, INCBIN_U16("graphics/spinda_spots/spot_3.bin")}
+ {.x = 16, .y = 7, .image = INCBIN_U16("graphics/spinda_spots/spot_0.bin")},
+ {.x = 40, .y = 8, .image = INCBIN_U16("graphics/spinda_spots/spot_1.bin")},
+ {.x = 22, .y = 25, .image = INCBIN_U16("graphics/spinda_spots/spot_2.bin")},
+ {.x = 34, .y = 26, .image = INCBIN_U16("graphics/spinda_spots/spot_3.bin")}
};
#include "data/pokemon/item_effects.h"
@@ -6570,42 +6573,78 @@ u16 HoennToNationalOrder(u16 hoennNum)
return sHoennToNationalOrder[hoennNum - 1];
}
-#define DRAW_SPINDA_SPOTS \
+// Spots can be drawn on Spinda's color indexes 1, 2, or 3
+#define FIRST_SPOT_COLOR 1
+#define LAST_SPOT_COLOR 3
+
+// To draw a spot pixel, add 4 to the color index
+#define SPOT_COLOR_ADJUSTMENT 4
+/*
+ The macro below handles drawing the randomly-placed spots on Spinda's front sprite.
+ Spinda has 4 spots, each with an entry in gSpindaSpotGraphics. Each entry contains
+ a base x and y coordinate for the spot and a 16x16 binary image. Each bit in the image
+ determines whether that pixel should be considered part of the spot.
+ The position of each spot is randomized using the Spinda's personality. The entire 32 bit
+ personality value is used, 4 bits for each coordinate of the 4 spots. If the personality
+ value is 0x87654321, then 0x1 will be used for the 1st spot's x coord, 0x2 will be used for
+ the 1st spot's y coord, 0x3 will be used for the 2nd spot's x coord, and so on. Each
+ coordinate is calculated as (baseCoord + (given 4 bits of personality) - 8). In effect this
+ means each spot can start at any position -8 to +7 off of its base coordinates (256 possibilities).
+ The macro then loops over the 16x16 spot image. For each bit in the spot's binary image, if
+ the bit is set then it's part of the spot; try to draw it. A pixel is drawn on Spinda if the
+ pixel on Spinda satisfies the following formula: ((u8)(colorIndex - 1) <= 2). The -1 excludes
+ transparent pixels, as these are index 0. Therefore only colors 1, 2, or 3 on Spinda will
+ allow a spot to be drawn. These color indexes are Spinda's light brown body colors. To create
+ the spot it adds 4 to the color index, so Spinda's spots will be colors 5, 6, and 7.
+ The above is done two different ways in the macro: one with << 4, and one without. This
+ is because Spinda's sprite is a 4 bits per pixel image, but the pointer to Spinda's pixels
+ (destPixels) is an 8 bit pointer, so it addresses two pixels. Shifting by 4 accesses the 2nd
+ of these pixels, so this is done every other time.
+*/
+#define DRAW_SPINDA_SPOTS(personality, dest) \
{ \
- int i; \
- for (i = 0; i < 4; i++) \
+ s32 i; \
+ for (i = 0; i < (s32)ARRAY_COUNT(gSpindaSpotGraphics); i++) \
{ \
- int j; \
+ s32 row; \
u8 x = gSpindaSpotGraphics[i].x + ((personality & 0x0F) - 8); \
u8 y = gSpindaSpotGraphics[i].y + (((personality & 0xF0) >> 4) - 8); \
\
- for (j = 0; j < 16; j++) \
+ for (row = 0; row < SPINDA_SPOT_HEIGHT; row++) \
{ \
- int k; \
- s32 row = gSpindaSpotGraphics[i].image[j]; \
+ s32 column; \
+ s32 spotPixelRow = gSpindaSpotGraphics[i].image[row]; \
\
- for (k = x; k < x + 16; k++) \
+ for (column = x; column < x + SPINDA_SPOT_WIDTH; column++) \
{ \
- u8 *val = dest + ((k / 8) * 32) + \
- ((k % 8) / 2) + \
- ((y >> 3) << 8) + \
- ((y & 7) << 2); \
+ /* Get target pixels on Spinda's sprite */ \
+ u8 *destPixels = dest + ((column / 8) * TILE_SIZE_4BPP) + \
+ ((column % 8) / 2) + \
+ ((y / 8) * TILE_SIZE_4BPP * 8) + \
+ ((y % 8) * 4); \
\
- if (row & 1) \
+ /* Is this pixel in the 16x16 spot image part of the spot? */ \
+ if (spotPixelRow & 1) \
{ \
- if (k & 1) \
+ /* destPixels addressess two pixels, alternate which */ \
+ /* of the two pixels is being considered for drawing */ \
+ if (column & 1) \
{ \
- if ((u8)((*val & 0xF0) - 0x10) <= 0x20) \
- *val += 0x40; \
+ /* Draw spot pixel if this is Spinda's body color */ \
+ if ((u8)((*destPixels & 0xF0) - (FIRST_SPOT_COLOR << 4))\
+ <= ((LAST_SPOT_COLOR - FIRST_SPOT_COLOR) << 4))\
+ *destPixels += (SPOT_COLOR_ADJUSTMENT << 4); \
} \
else \
{ \
- if ((u8)((*val & 0xF) - 0x01) <= 0x02) \
- *val += 0x04; \
+ /* Draw spot pixel if this is Spinda's body color */ \
+ if ((u8)((*destPixels & 0xF) - FIRST_SPOT_COLOR) \
+ <= (LAST_SPOT_COLOR - FIRST_SPOT_COLOR)) \
+ *destPixels += SPOT_COLOR_ADJUSTMENT; \
} \
} \
\
- row >>= 1; \
+ spotPixelRow >>= 1; \
} \
\
y++; \
@@ -6622,13 +6661,13 @@ static void DrawSpindaSpotsUnused(u16 species, u32 personality, u8 *dest)
if (species == SPECIES_SPINDA
&& dest != gMonSpritesGfxPtr->sprites.ptr[B_POSITION_PLAYER_LEFT]
&& dest != gMonSpritesGfxPtr->sprites.ptr[B_POSITION_PLAYER_RIGHT])
- DRAW_SPINDA_SPOTS;
+ DRAW_SPINDA_SPOTS(personality, dest);
}
void DrawSpindaSpots(u16 species, u32 personality, u8 *dest, bool8 isFrontPic)
{
if (species == SPECIES_SPINDA && isFrontPic)
- DRAW_SPINDA_SPOTS;
+ DRAW_SPINDA_SPOTS(personality, dest);
}
void EvolutionRenameMon(struct Pokemon *mon, u16 oldSpecies, u16 newSpecies)
@@ -6688,7 +6727,7 @@ s32 GetBattlerMultiplayerId(u16 a1)
u8 GetTrainerEncounterMusicId(u16 trainerOpponentId)
{
if (InBattlePyramid())
- return GetBattlePyramindTrainerEncounterMusicId(trainerOpponentId);
+ return GetTrainerEncounterMusicIdInBattlePyramid(trainerOpponentId);
else if (InTrainerHillChallenge())
return GetTrainerEncounterMusicIdInTrainerHill(trainerOpponentId);
else
diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c
index ce72b434e5..1bbdd066bc 100644
--- a/src/pokemon_storage_system.c
+++ b/src/pokemon_storage_system.c
@@ -332,6 +332,13 @@ enum {
TILEMAPID_COUNT
};
+// Window IDs for sWindowTemplates
+enum {
+ WIN_DISPLAY_INFO,
+ WIN_MESSAGE,
+ WIN_ITEM_DESC,
+};
+
struct Wallpaper
{
const u32 *tiles;
@@ -940,49 +947,31 @@ static const union AffineAnimCmd *const sAffineAnims_ChooseBoxMenu[] =
static const u8 sChooseBoxMenu_TextColors[] = {TEXT_COLOR_RED, TEXT_DYNAMIC_COLOR_6, TEXT_DYNAMIC_COLOR_5};
static const u8 sText_OutOf30[] = _("/30");
-static const u16 sChooseBoxMenu_Pal[] = INCBIN_U16("graphics/pokemon_storage/box_selection_popup.gbapal");
-static const u8 sChooseBoxMenuCenter_Gfx[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_center.4bpp");
-static const u8 sChooseBoxMenuSides_Gfx[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_sides.4bpp");
-static const u32 sScrollingBg_Gfx[] = INCBIN_U32("graphics/pokemon_storage/scrolling_bg.4bpp.lz");
-static const u32 sScrollingBg_Tilemap[] = INCBIN_U32("graphics/pokemon_storage/scrolling_bg.bin.lz");
-static const u16 sDisplayMenu_Pal[] = INCBIN_U16("graphics/pokemon_storage/display_menu.gbapal"); // Unused
-static const u32 sDisplayMenu_Tilemap[] = INCBIN_U32("graphics/pokemon_storage/display_menu.bin.lz");
-
-static const u16 sPkmnData_Tilemap[] =
-{
- 0x0101, 0x0102, 0x0103, 0x0104, 0x0105, 0x0106, 0x0107, 0x0108, 0x0111, 0x0112, 0x0113, 0x0114, 0x0115, 0x0116, 0x0117, 0x0118,
- 0x2101, 0x2102, 0x2103, 0x2104, 0x2105, 0x2106, 0x2107, 0x2108, 0x2111, 0x2112, 0x2113, 0x2114, 0x2115, 0x2116, 0x2117, 0x2118,
-};
-
+static const u16 sChooseBoxMenu_Pal[] = INCBIN_U16("graphics/pokemon_storage/box_selection_popup.gbapal");
+static const u8 sChooseBoxMenuCenter_Gfx[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_center.4bpp");
+static const u8 sChooseBoxMenuSides_Gfx[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_sides.4bpp");
+static const u32 sScrollingBg_Gfx[] = INCBIN_U32("graphics/pokemon_storage/scrolling_bg.4bpp.lz");
+static const u32 sScrollingBg_Tilemap[] = INCBIN_U32("graphics/pokemon_storage/scrolling_bg.bin.lz");
+static const u16 sDisplayMenu_Pal[] = INCBIN_U16("graphics/pokemon_storage/display_menu.gbapal"); // Unused
+static const u32 sDisplayMenu_Tilemap[] = INCBIN_U32("graphics/pokemon_storage/display_menu.bin.lz");
+static const u16 sPkmnData_Tilemap[] = INCBIN_U16("graphics/pokemon_storage/pkmn_data.bin");
// sInterface_Pal - parts of the display frame, "PkmnData"'s normal color, Close Box
-static const u16 sInterface_Pal[] = INCBIN_U16("graphics/pokemon_storage/interface.gbapal");
-static const u16 sPkmnDataGray_Pal[] = INCBIN_U16("graphics/pokemon_storage/pkmn_data_gray.gbapal");
-static const u16 sBg_Pal[] = INCBIN_U16("graphics/pokemon_storage/bg.gbapal");
-static const u16 sBgMoveItems_Pal[] = INCBIN_U16("graphics/pokemon_storage/bg_move_items.gbapal");
-
-static const u16 sCloseBoxButton_Tilemap[] =
-{
- 0x014c, 0x014d, 0x014e, 0x014f, 0x0170, 0x0171, 0x0172, 0x0173, 0x0174, 0x015c, 0x015d, 0x015e, 0x015f, 0x0180, 0x0181, 0x0182,
- 0x0183, 0x0184, 0x0175, 0x0176, 0x0177, 0x0178, 0x0179, 0x017a, 0x017b, 0x017c, 0x017d, 0x0185, 0x0186, 0x0187, 0x0188, 0x0189,
- 0x018a, 0x018b, 0x018c, 0x018d
-};
-static const u16 sPartySlotFilled_Tilemap[] =
-{
- 0x1140, 0x1141, 0x1141, 0x1142, 0x1150, 0x1151, 0x1151, 0x1152, 0x1160, 0x1161, 0x1161, 0x1162,
-};
-static const u16 sPartySlotEmpty_Tilemap[] =
-{
- 0x1143, 0x1144, 0x1144, 0x1145, 0x1153, 0x1154, 0x1154, 0x1155, 0x1163, 0x1164, 0x1164, 0x1165,
-};
-
-static const u16 sWaveform_Pal[] = INCBIN_U16("graphics/pokemon_storage/waveform.gbapal");
-static const u32 sWaveform_Gfx[] = INCBIN_U32("graphics/pokemon_storage/waveform.4bpp");
-static const u16 sUnused_Pal[] = INCBIN_U16("graphics/pokemon_storage/unused.gbapal");
-static const u16 sUnknown_Pal[] = INCBIN_U16("graphics/pokemon_storage/unknown.gbapal");
+static const u16 sInterface_Pal[] = INCBIN_U16("graphics/pokemon_storage/interface.gbapal");
+static const u16 sPkmnDataGray_Pal[] = INCBIN_U16("graphics/pokemon_storage/pkmn_data_gray.gbapal");
+static const u16 sBg_Pal[] = INCBIN_U16("graphics/pokemon_storage/bg.gbapal");
+static const u16 sBgMoveItems_Pal[] = INCBIN_U16("graphics/pokemon_storage/bg_move_items.gbapal");
+static const u16 sCloseBoxButton_Tilemap[] = INCBIN_U16("graphics/pokemon_storage/close_box_button.bin");
+static const u16 sPartySlotFilled_Tilemap[] = INCBIN_U16("graphics/pokemon_storage/party_slot_filled.bin");
+static const u16 sPartySlotEmpty_Tilemap[] = INCBIN_U16("graphics/pokemon_storage/party_slot_empty.bin");
+static const u16 sWaveform_Pal[] = INCBIN_U16("graphics/pokemon_storage/waveform.gbapal");
+static const u32 sWaveform_Gfx[] = INCBIN_U32("graphics/pokemon_storage/waveform.4bpp");
+static const u16 sUnused_Pal[] = INCBIN_U16("graphics/pokemon_storage/unused.gbapal");
+static const u16 sTextWindows_Pal[] = INCBIN_U16("graphics/pokemon_storage/text_windows.gbapal");
static const struct WindowTemplate sWindowTemplates[] =
{
- {
+ // The panel below the currently displayed Pokémon
+ [WIN_DISPLAY_INFO] = {
.bg = 1,
.tilemapLeft = 0,
.tilemapTop = 11,
@@ -991,7 +980,7 @@ static const struct WindowTemplate sWindowTemplates[] =
.paletteNum = 3,
.baseBlock = 0xC0,
},
- {
+ [WIN_MESSAGE] = {
.bg = 0,
.tilemapLeft = 11,
.tilemapTop = 17,
@@ -1000,7 +989,7 @@ static const struct WindowTemplate sWindowTemplates[] =
.paletteNum = 15,
.baseBlock = 0x14,
},
- {
+ [WIN_ITEM_DESC] = {
.bg = 0,
.tilemapLeft = 0,
.tilemapTop = 13,
@@ -1350,7 +1339,7 @@ void DrawTextWindowAndBufferTiles(const u8 *string, void *dst, u8 zero1, u8 zero
windowId = AddWindow(&winTemplate);
FillWindowPixelBuffer(windowId, PIXEL_FILL(zero2));
tileData1 = (u8*) GetWindowAttribute(windowId, WINDOW_TILE_DATA);
- tileData2 = (winTemplate.width * 32) + tileData1;
+ tileData2 = (winTemplate.width * TILE_SIZE_4BPP) + tileData1;
if (!zero1)
txtColor[0] = TEXT_COLOR_TRANSPARENT;
@@ -1386,7 +1375,7 @@ void DrawTextWindowAndBufferTiles(const u8 *string, void *dst, u8 zero1, u8 zero
// Unused
static void UnusedDrawTextWindow(const u8 *string, void *dst, u16 offset, u8 bgColor, u8 fgColor, u8 shadowColor)
{
- u32 tileSize;
+ u32 tilesSize;
u8 windowId;
u8 txtColor[3];
u8 *tileData1, *tileData2;
@@ -1394,17 +1383,17 @@ static void UnusedDrawTextWindow(const u8 *string, void *dst, u16 offset, u8 bgC
winTemplate.width = StringLength_Multibyte(string);
winTemplate.height = 2;
- tileSize = winTemplate.width * 32;
+ tilesSize = winTemplate.width * TILE_SIZE_4BPP;
windowId = AddWindow(&winTemplate);
FillWindowPixelBuffer(windowId, PIXEL_FILL(bgColor));
tileData1 = (u8*) GetWindowAttribute(windowId, WINDOW_TILE_DATA);
- tileData2 = (winTemplate.width * 32) + tileData1;
+ tileData2 = (winTemplate.width * TILE_SIZE_4BPP) + tileData1;
txtColor[0] = bgColor;
txtColor[1] = fgColor;
txtColor[2] = shadowColor;
AddTextPrinterParameterized4(windowId, FONT_NORMAL, 0, 2, 0, 0, txtColor, TEXT_SKIP_DRAW, string);
- CpuCopy16(tileData1, dst, tileSize);
- CpuCopy16(tileData2, dst + offset, tileSize);
+ CpuCopy16(tileData1, dst, tilesSize);
+ CpuCopy16(tileData2, dst + offset, tilesSize);
RemoveWindow(windowId);
}
@@ -2137,10 +2126,10 @@ static void Task_InitPokeStorage(u8 taskId)
}
break;
case 2:
- PutWindowTilemap(0);
- ClearWindowTilemap(1);
+ PutWindowTilemap(WIN_DISPLAY_INFO);
+ ClearWindowTilemap(WIN_MESSAGE);
CpuFill32(0, (void *)VRAM, 0x200);
- LoadUserWindowBorderGfx(1, 0xB, 0xE0);
+ LoadUserWindowBorderGfx(WIN_MESSAGE, 0xB, 0xE0);
break;
case 3:
ResetAllBgCoords();
@@ -3863,7 +3852,7 @@ static void InitPalettesAndSprites(void)
{
LoadPalette(sInterface_Pal, 0, sizeof(sInterface_Pal));
LoadPalette(sPkmnDataGray_Pal, 0x20, sizeof(sPkmnDataGray_Pal));
- LoadPalette(sUnknown_Pal, 0xF0, sizeof(sUnknown_Pal));
+ LoadPalette(sTextWindows_Pal, 0xF0, sizeof(sTextWindows_Pal));
if (sStorage->boxOption != OPTION_MOVE_ITEMS)
LoadPalette(sBg_Pal, 0x30, sizeof(sBg_Pal));
else
@@ -3971,7 +3960,7 @@ static void CreateDisplayMonSprite(void)
sStorage->displayMonSprite = &gSprites[spriteId];
sStorage->displayMonPalOffset = palSlot * 16 + 0x100;
- sStorage->displayMonTilePtr = (void*) OBJ_VRAM0 + tileStart * 32;
+ sStorage->displayMonTilePtr = (void*) OBJ_VRAM0 + tileStart * TILE_SIZE_4BPP;
} while (0);
if (sStorage->displayMonSprite == NULL)
@@ -4002,23 +3991,23 @@ static void LoadDisplayMonGfx(u16 species, u32 pid)
static void PrintDisplayMonInfo(void)
{
- FillWindowPixelBuffer(0, PIXEL_FILL(1));
+ FillWindowPixelBuffer(WIN_DISPLAY_INFO, PIXEL_FILL(1));
if (sStorage->boxOption != OPTION_MOVE_ITEMS)
{
- AddTextPrinterParameterized(0, FONT_NORMAL, sStorage->displayMonNameText, 6, 0, TEXT_SKIP_DRAW, NULL);
- AddTextPrinterParameterized(0, FONT_SHORT, sStorage->displayMonSpeciesName, 6, 15, TEXT_SKIP_DRAW, NULL);
- AddTextPrinterParameterized(0, FONT_SHORT, sStorage->displayMonGenderLvlText, 10, 29, TEXT_SKIP_DRAW, NULL);
- AddTextPrinterParameterized(0, FONT_SMALL, sStorage->displayMonItemName, 6, 43, TEXT_SKIP_DRAW, NULL);
+ AddTextPrinterParameterized(WIN_DISPLAY_INFO, FONT_NORMAL, sStorage->displayMonNameText, 6, 0, TEXT_SKIP_DRAW, NULL);
+ AddTextPrinterParameterized(WIN_DISPLAY_INFO, FONT_SHORT, sStorage->displayMonSpeciesName, 6, 15, TEXT_SKIP_DRAW, NULL);
+ AddTextPrinterParameterized(WIN_DISPLAY_INFO, FONT_SHORT, sStorage->displayMonGenderLvlText, 10, 29, TEXT_SKIP_DRAW, NULL);
+ AddTextPrinterParameterized(WIN_DISPLAY_INFO, FONT_SMALL, sStorage->displayMonItemName, 6, 43, TEXT_SKIP_DRAW, NULL);
}
else
{
- AddTextPrinterParameterized(0, FONT_SMALL, sStorage->displayMonItemName, 6, 0, TEXT_SKIP_DRAW, NULL);
- AddTextPrinterParameterized(0, FONT_NORMAL, sStorage->displayMonNameText, 6, 13, TEXT_SKIP_DRAW, NULL);
- AddTextPrinterParameterized(0, FONT_SHORT, sStorage->displayMonSpeciesName, 6, 28, TEXT_SKIP_DRAW, NULL);
- AddTextPrinterParameterized(0, FONT_SHORT, sStorage->displayMonGenderLvlText, 10, 42, TEXT_SKIP_DRAW, NULL);
+ AddTextPrinterParameterized(WIN_DISPLAY_INFO, FONT_SMALL, sStorage->displayMonItemName, 6, 0, TEXT_SKIP_DRAW, NULL);
+ AddTextPrinterParameterized(WIN_DISPLAY_INFO, FONT_NORMAL, sStorage->displayMonNameText, 6, 13, TEXT_SKIP_DRAW, NULL);
+ AddTextPrinterParameterized(WIN_DISPLAY_INFO, FONT_SHORT, sStorage->displayMonSpeciesName, 6, 28, TEXT_SKIP_DRAW, NULL);
+ AddTextPrinterParameterized(WIN_DISPLAY_INFO, FONT_SHORT, sStorage->displayMonGenderLvlText, 10, 42, TEXT_SKIP_DRAW, NULL);
}
- CopyWindowToVram(0, COPYWIN_GFX);
+ CopyWindowToVram(WIN_DISPLAY_INFO, COPYWIN_GFX);
if (sStorage->displayMonSpecies != SPECIES_NONE)
{
UpdateMonMarkingTiles(sStorage->displayMonMarkings, sStorage->markingComboTilesPtr);
@@ -4279,7 +4268,7 @@ static void UpdateBoxToSendMons(void)
static void InitPokeStorageBg0(void)
{
SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(29));
- LoadUserWindowBorderGfx(1, 2, 208);
+ LoadUserWindowBorderGfx(WIN_MESSAGE, 2, 208);
FillBgTilemapBufferRect(0, 0, 0, 0, 32, 20, 17);
CopyBgTilemapBufferToVram(0);
}
@@ -4318,11 +4307,11 @@ static void PrintMessage(u8 id)
}
DynamicPlaceholderTextUtil_ExpandPlaceholders(sStorage->messageText, sMessages[id].text);
- FillWindowPixelBuffer(1, PIXEL_FILL(1));
- AddTextPrinterParameterized(1, FONT_NORMAL, sStorage->messageText, 0, 1, TEXT_SKIP_DRAW, NULL);
- DrawTextBorderOuter(1, 2, 14);
- PutWindowTilemap(1);
- CopyWindowToVram(1, COPYWIN_GFX);
+ FillWindowPixelBuffer(WIN_MESSAGE, PIXEL_FILL(1));
+ AddTextPrinterParameterized(WIN_MESSAGE, FONT_NORMAL, sStorage->messageText, 0, 1, TEXT_SKIP_DRAW, NULL);
+ DrawTextBorderOuter(WIN_MESSAGE, 2, 14);
+ PutWindowTilemap(WIN_MESSAGE);
+ CopyWindowToVram(WIN_MESSAGE, COPYWIN_GFX);
ScheduleBgCopyTilemapToVram(0);
}
@@ -4334,7 +4323,7 @@ static void ShowYesNoWindow(s8 cursorPos)
static void ClearBottomWindow(void)
{
- ClearStdWindowAndFrameToTransparent(1, FALSE);
+ ClearStdWindowAndFrameToTransparent(WIN_MESSAGE, FALSE);
ScheduleBgCopyTilemapToVram(0);
}
@@ -8779,7 +8768,7 @@ static void CreateItemIconSprites(void)
{
spriteSheet.tag = GFXTAG_ITEM_ICON_0 + i;
LoadCompressedSpriteSheet(&spriteSheet);
- sStorage->itemIcons[i].tiles = GetSpriteTileStartByTag(spriteSheet.tag) * 32 + (void*)(OBJ_VRAM0);
+ sStorage->itemIcons[i].tiles = GetSpriteTileStartByTag(spriteSheet.tag) * TILE_SIZE_4BPP + (void*)(OBJ_VRAM0);
sStorage->itemIcons[i].palIndex = AllocSpritePalette(PALTAG_ITEM_ICON_0 + i);
sStorage->itemIcons[i].palIndex *= 16;
sStorage->itemIcons[i].palIndex += 0x100;
@@ -9225,8 +9214,8 @@ static void PrintItemDescription(void)
else
description = ItemId_GetDescription(sStorage->displayMonItemId);
- FillWindowPixelBuffer(2, PIXEL_FILL(1));
- AddTextPrinterParameterized5(2, FONT_NORMAL, description, 4, 0, 0, NULL, 0, 1);
+ FillWindowPixelBuffer(WIN_ITEM_DESC, PIXEL_FILL(1));
+ AddTextPrinterParameterized5(WIN_ITEM_DESC, FONT_NORMAL, description, 4, 0, 0, NULL, 0, 1);
}
static void InitItemInfoWindow(void)
diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c
index 2e6566cb92..323c428181 100644
--- a/src/pokemon_summary_screen.c
+++ b/src/pokemon_summary_screen.c
@@ -368,7 +368,7 @@ struct TilemapCtrl
u8 field_9;
};
-static const u16 sStatusTilemap[] = INCBIN_U16("graphics/interface/status_tilemap.bin");
+static const u16 sStatusTilemap[] = INCBIN_U16("graphics/summary_screen/status_tilemap.bin");
static const struct TilemapCtrl sStatusTilemapCtrl1 =
{
sStatusTilemap, 1, 10, 2, 0, 18
@@ -379,11 +379,11 @@ static const struct TilemapCtrl sStatusTilemapCtrl2 =
};
static const struct TilemapCtrl sBattleMoveTilemapCtrl =
{
- gSummaryScreenPowAcc_Tilemap, 0, 10, 7, 0, 45
+ gSummaryScreen_MoveEffect_Battle_Tilemap, 0, 10, 7, 0, 45
};
static const struct TilemapCtrl sContestMoveTilemapCtrl =
{
- gSummaryScreenAppealJam_Tilemap, 0, 10, 7, 0, 45
+ gSummaryScreen_MoveEffect_Contest_Tilemap, 0, 10, 7, 0, 45
};
static const s8 sMultiBattleOrder[] = {0, 2, 3, 1, 4, 5};
static const struct WindowTemplate sSummaryTemplate[] =
@@ -704,8 +704,8 @@ static const u8 sTextColors[][3] =
{0, 7, 8}
};
-static const u8 sSummaryAButtonBitmap[] = INCBIN_U8("graphics/interface/summary_a_button.4bpp");
-static const u8 sSummaryBButtonBitmap[] = INCBIN_U8("graphics/interface/summary_b_button.4bpp");
+static const u8 sAButton_Gfx[] = INCBIN_U8("graphics/summary_screen/a_button.4bpp");
+static const u8 sBButton_Gfx[] = INCBIN_U8("graphics/summary_screen/b_button.4bpp");
static void (*const sTextPrinterFunctions[])(void) =
{
@@ -1140,7 +1140,7 @@ static const struct SpriteTemplate sSpriteTemplate_StatusCondition =
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy
};
-static const u16 sSummaryMarkingsPalette[] = INCBIN_U16("graphics/interface/summary_markings.gbapal");
+static const u16 sMarkings_Pal[] = INCBIN_U16("graphics/summary_screen/markings.gbapal");
// code
static u8 ShowSplitIcon(u32 split)
@@ -1399,7 +1399,7 @@ static bool8 DecompressGraphics(void)
}
break;
case 2:
- LZDecompressWram(gSummaryPage_InfoCopy_Tilemap, sMonSummaryScreen->bgTilemapBuffers[PSS_PAGE_INFO][1]);
+ LZDecompressWram(gSummaryPage_InfoEgg_Tilemap, sMonSummaryScreen->bgTilemapBuffers[PSS_PAGE_INFO][1]);
sMonSummaryScreen->switchCounter++;
break;
case 3:
@@ -2643,6 +2643,7 @@ static void Task_ShowStatusWindow(u8 taskId)
}
}
+// Toggles the "Cancel" window that appears when selecting a move
static void TilemapFiveMovesDisplay(u16 *dst, u16 palette, bool8 remove)
{
u16 i, id;
@@ -2653,18 +2654,18 @@ static void TilemapFiveMovesDisplay(u16 *dst, u16 palette, bool8 remove)
{
for (i = 0; i < 20; i++)
{
- dst[id + i] = gSummaryScreenWindow_Tilemap[i] + palette;
- dst[id + i + 0x20] = gSummaryScreenWindow_Tilemap[i] + palette;
- dst[id + i + 0x40] = gSummaryScreenWindow_Tilemap[i + 20] + palette;
+ dst[id + i] = gSummaryScreen_MoveEffect_Cancel_Tilemap[i] + palette;
+ dst[id + i + 0x20] = gSummaryScreen_MoveEffect_Cancel_Tilemap[i] + palette;
+ dst[id + i + 0x40] = gSummaryScreen_MoveEffect_Cancel_Tilemap[i + 20] + palette;
}
}
else // Remove
{
for (i = 0; i < 20; i++)
{
- dst[id + i] = gSummaryScreenWindow_Tilemap[i + 20] + palette;
- dst[id + i + 0x20] = gSummaryScreenWindow_Tilemap[i + 40] + palette;
- dst[id + i + 0x40] = gSummaryScreenWindow_Tilemap[i + 40] + palette;
+ dst[id + i] = gSummaryScreen_MoveEffect_Cancel_Tilemap[i + 20] + palette;
+ dst[id + i + 0x20] = gSummaryScreen_MoveEffect_Cancel_Tilemap[i + 40] + palette;
+ dst[id + i + 0x40] = gSummaryScreen_MoveEffect_Cancel_Tilemap[i + 40] + palette;
}
}
}
@@ -2880,8 +2881,8 @@ static void PrintGenderSymbol(struct Pokemon *mon, u16 species)
static void PrintAOrBButtonIcon(u8 windowId, bool8 bButton, u32 x)
{
- // sSummaryBButtonBitmap - 0x80 = sSummaryAButtonBitmap
- BlitBitmapToWindow(windowId, (bButton) ? sSummaryBButtonBitmap : sSummaryBButtonBitmap - 0x80, x, 0, 16, 16);
+ // sBButton_Gfx - sizeof(sBButton_Gfx) = sAButton_Gfx
+ BlitBitmapToWindow(windowId, (bButton) ? sBButton_Gfx : sBButton_Gfx - sizeof(sBButton_Gfx), x, 0, 16, 16);
}
static void PrintPageNamesAndStats(void)
@@ -4090,7 +4091,7 @@ static void StopPokemonAnimations(void) // A subtle effect, this function stops
static void CreateMonMarkingsSprite(struct Pokemon *mon)
{
- struct Sprite *sprite = CreateMonMarkingAllCombosSprite(TAG_MON_MARKINGS, TAG_MON_MARKINGS, sSummaryMarkingsPalette);
+ struct Sprite *sprite = CreateMonMarkingAllCombosSprite(TAG_MON_MARKINGS, TAG_MON_MARKINGS, sMarkings_Pal);
sMonSummaryScreen->markingsSprite = sprite;
if (sprite != NULL)
diff --git a/src/region_map.c b/src/region_map.c
index 0dc9026742..09e2d69bf2 100644
--- a/src/region_map.c
+++ b/src/region_map.c
@@ -1516,28 +1516,26 @@ static void UnhideRegionMapPlayerIcon(void)
}
}
+#define sY data[0]
+#define sX data[1]
+#define sVisible data[2]
+#define sTimer data[7]
+
static void SpriteCB_PlayerIconMapZoomed(struct Sprite *sprite)
{
sprite->x2 = -2 * gRegionMap->scrollX;
sprite->y2 = -2 * gRegionMap->scrollY;
- sprite->data[0] = sprite->y + sprite->y2 + sprite->centerToCornerVecY;
- sprite->data[1] = sprite->x + sprite->x2 + sprite->centerToCornerVecX;
- if (sprite->data[0] < -8 || sprite->data[0] > 0xa8 || sprite->data[1] < -8 || sprite->data[1] > 0xf8)
- {
- sprite->data[2] = FALSE;
- }
+ sprite->sY = sprite->y + sprite->y2 + sprite->centerToCornerVecY;
+ sprite->sX = sprite->x + sprite->x2 + sprite->centerToCornerVecX;
+ if (sprite->sY < -8 || sprite->sY > DISPLAY_HEIGHT + 8 || sprite->sX < -8 || sprite->sX > DISPLAY_WIDTH + 8)
+ sprite->sVisible = FALSE;
else
- {
- sprite->data[2] = TRUE;
- }
- if (sprite->data[2] == TRUE)
- {
+ sprite->sVisible = TRUE;
+
+ if (sprite->sVisible == TRUE)
SpriteCB_PlayerIcon(sprite);
- }
else
- {
sprite->invisible = TRUE;
- }
}
static void SpriteCB_PlayerIconMapFull(struct Sprite *sprite)
@@ -1549,9 +1547,9 @@ static void SpriteCB_PlayerIcon(struct Sprite *sprite)
{
if (gRegionMap->blinkPlayerIcon)
{
- if (++sprite->data[7] > 16)
+ if (++sprite->sTimer > 16)
{
- sprite->data[7] = 0;
+ sprite->sTimer = 0;
sprite->invisible = sprite->invisible ? FALSE : TRUE;
}
}
@@ -1567,6 +1565,11 @@ void TrySetPlayerIconBlink(void)
gRegionMap->blinkPlayerIcon = TRUE;
}
+#undef sY
+#undef sX
+#undef sVisible
+#undef sTimer
+
u8 *GetMapName(u8 *dest, u16 regionMapId, u16 padLength)
{
u8 *str;
@@ -1709,7 +1712,7 @@ void CB2_OpenFlyMap(void)
gMain.state++;
break;
case 7:
- LoadPalette(sRegionMapFramePal, 0x10, 0x20);
+ LoadPalette(sRegionMapFramePal, 0x10, sizeof(sRegionMapFramePal));
PutWindowTilemap(2);
FillWindowPixelBuffer(2, PIXEL_FILL(0));
AddTextPrinterParameterized(2, FONT_NORMAL, gText_FlyToWhere, 0, 1, 0, NULL);
diff --git a/src/roamer.c b/src/roamer.c
index 4811ac3b22..c17ec490c8 100644
--- a/src/roamer.c
+++ b/src/roamer.c
@@ -193,10 +193,18 @@ bool8 IsRoamerAt(u8 mapGroup, u8 mapNum)
void CreateRoamerMonInstance(void)
{
+ u32 status;
struct Pokemon *mon = &gEnemyParty[0];
ZeroEnemyPartyMons();
CreateMonWithIVsPersonality(mon, ROAMER->species, ROAMER->level, ROAMER->ivs, ROAMER->personality);
+// The roamer's status field is u8, but SetMonData expects status to be u32, so will set the roamer's status
+// using the status field and the following 3 bytes (cool, beauty, and cute).
+#ifdef BUGFIX
+ status = ROAMER->status;
+ SetMonData(mon, MON_DATA_STATUS, &status);
+#else
SetMonData(mon, MON_DATA_STATUS, &ROAMER->status);
+#endif
SetMonData(mon, MON_DATA_HP, &ROAMER->hp);
SetMonData(mon, MON_DATA_COOL, &ROAMER->cool);
SetMonData(mon, MON_DATA_BEAUTY, &ROAMER->beauty);
diff --git a/src/rom_header.s b/src/rom_header.s
index 5ed45124de..9ab7240fba 100644
--- a/src/rom_header.s
+++ b/src/rom_header.s
@@ -2,7 +2,7 @@
@ It's populated by gbafix using data provided in the Makefile.
.global Start
-Start: @ 8000000
+Start:
b Init
.global RomHeaderNintendoLogo
@@ -41,23 +41,20 @@ RomHeaderChecksum:
RomHeaderReserved2:
.space 2
-@ 80000C0
.word 0
.global GPIOPortData
-GPIOPortData: @ 80000C4
+GPIOPortData:
.2byte 0
.global GPIOPortDirection
-GPIOPortDirection: @ 80000C6
+GPIOPortDirection:
.2byte 0
.global GPIOPortReadEnable
-GPIOPortReadEnable: @ 80000C8
+GPIOPortReadEnable:
.2byte 0
-@ 80000CA
.2byte 0
-@ 80000CC
.space 0x34
diff --git a/src/rotating_gate.c b/src/rotating_gate.c
index 23fbb3e1d6..f839d22c30 100644
--- a/src/rotating_gate.c
+++ b/src/rotating_gate.c
@@ -219,14 +219,14 @@ static const struct RotatingGatePuzzle sRotatingGate_TrickHousePuzzleConfig[] =
{10, 19, GATE_SHAPE_L3, GATE_ORIENTATION_180},
};
-static const u8 sRotatingGateTiles_1[] = INCBIN_U8("graphics/misc/rotating_gate_1.4bpp");
-static const u8 sRotatingGateTiles_2[] = INCBIN_U8("graphics/misc/rotating_gate_2.4bpp");
-static const u8 sRotatingGateTiles_3[] = INCBIN_U8("graphics/misc/rotating_gate_3.4bpp");
-static const u8 sRotatingGateTiles_4[] = INCBIN_U8("graphics/misc/rotating_gate_4.4bpp");
-static const u8 sRotatingGateTiles_5[] = INCBIN_U8("graphics/misc/rotating_gate_5.4bpp");
-static const u8 sRotatingGateTiles_6[] = INCBIN_U8("graphics/misc/rotating_gate_6.4bpp");
-static const u8 sRotatingGateTiles_7[] = INCBIN_U8("graphics/misc/rotating_gate_7.4bpp");
-static const u8 sRotatingGateTiles_8[] = INCBIN_U8("graphics/misc/rotating_gate_8.4bpp");
+static const u8 sRotatingGateTiles_1[] = INCBIN_U8("graphics/rotating_gates/l1.4bpp");
+static const u8 sRotatingGateTiles_2[] = INCBIN_U8("graphics/rotating_gates/l2.4bpp");
+static const u8 sRotatingGateTiles_3[] = INCBIN_U8("graphics/rotating_gates/l3.4bpp");
+static const u8 sRotatingGateTiles_4[] = INCBIN_U8("graphics/rotating_gates/l4.4bpp");
+static const u8 sRotatingGateTiles_5[] = INCBIN_U8("graphics/rotating_gates/t1.4bpp");
+static const u8 sRotatingGateTiles_6[] = INCBIN_U8("graphics/rotating_gates/t2.4bpp");
+static const u8 sRotatingGateTiles_7[] = INCBIN_U8("graphics/rotating_gates/t3.4bpp");
+static const u8 sRotatingGateTiles_8[] = INCBIN_U8("graphics/rotating_gates/t4.4bpp");
static const struct OamData sOamData_RotatingGateLarge =
{
@@ -684,13 +684,11 @@ static void RotatingGate_LoadPuzzleConfig(void)
{
case PUZZLE_FORTREE_CITY_GYM:
gRotatingGate_PuzzleConfig = sRotatingGate_FortreePuzzleConfig;
- gRotatingGate_PuzzleCount =
- sizeof(sRotatingGate_FortreePuzzleConfig) / sizeof(struct RotatingGatePuzzle);
+ gRotatingGate_PuzzleCount = ARRAY_COUNT(sRotatingGate_FortreePuzzleConfig);
break;
case PUZZLE_ROUTE110_TRICK_HOUSE_PUZZLE6:
gRotatingGate_PuzzleConfig = sRotatingGate_TrickHousePuzzleConfig;
- gRotatingGate_PuzzleCount =
- sizeof(sRotatingGate_TrickHousePuzzleConfig) / sizeof(struct RotatingGatePuzzle);
+ gRotatingGate_PuzzleCount = ARRAY_COUNT(sRotatingGate_TrickHousePuzzleConfig);
break;
case PUZZLE_NONE:
default:
@@ -698,9 +696,7 @@ static void RotatingGate_LoadPuzzleConfig(void)
}
for (i = 0; i < ROTATING_GATE_PUZZLE_MAX - 1; i++)
- {
gRotatingGate_GateSpriteIds[i] = MAX_SPRITES;
- }
}
static void RotatingGate_CreateGatesWithinViewport(s16 deltaX, s16 deltaY)
@@ -773,7 +769,7 @@ static void SpriteCallback_RotatingGate(struct Sprite *sprite)
{
affineAnimation = orientation + 4;
- if (GetPlayerSpeed() != 1)
+ if (GetPlayerSpeed() != PLAYER_SPEED_NORMAL)
affineAnimation += 8;
PlaySE(SE_ROTATING_GATE);
@@ -783,7 +779,7 @@ static void SpriteCallback_RotatingGate(struct Sprite *sprite)
{
affineAnimation = orientation + 8;
- if (GetPlayerSpeed() != 1)
+ if (GetPlayerSpeed() != PLAYER_SPEED_NORMAL)
affineAnimation += 8;
PlaySE(SE_ROTATING_GATE);
diff --git a/src/save.c b/src/save.c
index b539564383..dafc20868e 100644
--- a/src/save.c
+++ b/src/save.c
@@ -428,7 +428,7 @@ static u8 CopySectorSecurityByte(u16 sectorId, const struct SaveSectorLocation *
}
else
{
- // Succeded
+ // Succeeded
SetDamagedSectorBits(DISABLE, sector);
return SAVE_STATUS_OK;
}
@@ -734,7 +734,7 @@ u8 HandleSavingData(u8 saveType)
WriteSaveSectorOrSlot(FULL_SAVE_SLOT, gRamSaveSectorLocations);
break;
case SAVE_LINK:
- case SAVE_LINK2:
+ case SAVE_EREADER: // Dummied, now duplicate of SAVE_LINK
// Used by link / Battle Frontier
// Write only SaveBlocks 1 and 2 (skips the PC)
CopyPartyAndObjectsToSave();
diff --git a/src/scrcmd.c b/src/scrcmd.c
index 3dd3bdaf9f..6941742ca1 100644
--- a/src/scrcmd.c
+++ b/src/scrcmd.c
@@ -1000,7 +1000,7 @@ bool8 ScrCmd_applymovement(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_applymovement_at(struct ScriptContext *ctx)
+bool8 ScrCmd_applymovementat(struct ScriptContext *ctx)
{
u16 localId = VarGet(ScriptReadHalfword(ctx));
const void *movementScript = (const void *)ScriptReadWord(ctx);
@@ -1029,7 +1029,7 @@ bool8 ScrCmd_waitmovement(struct ScriptContext *ctx)
return TRUE;
}
-bool8 ScrCmd_waitmovement_at(struct ScriptContext *ctx)
+bool8 ScrCmd_waitmovementat(struct ScriptContext *ctx)
{
u16 localId = VarGet(ScriptReadHalfword(ctx));
u8 mapGroup;
@@ -1053,7 +1053,7 @@ bool8 ScrCmd_removeobject(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_removeobject_at(struct ScriptContext *ctx)
+bool8 ScrCmd_removeobjectat(struct ScriptContext *ctx)
{
u16 objectId = VarGet(ScriptReadHalfword(ctx));
u8 mapGroup = ScriptReadByte(ctx);
@@ -1071,7 +1071,7 @@ bool8 ScrCmd_addobject(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_addobject_at(struct ScriptContext *ctx)
+bool8 ScrCmd_addobjectat(struct ScriptContext *ctx)
{
u16 objectId = VarGet(ScriptReadHalfword(ctx));
u8 mapGroup = ScriptReadByte(ctx);
@@ -1109,7 +1109,7 @@ bool8 ScrCmd_copyobjectxytoperm(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_showobject_at(struct ScriptContext *ctx)
+bool8 ScrCmd_showobjectat(struct ScriptContext *ctx)
{
u16 localId = VarGet(ScriptReadHalfword(ctx));
u8 mapGroup = ScriptReadByte(ctx);
@@ -1119,7 +1119,7 @@ bool8 ScrCmd_showobject_at(struct ScriptContext *ctx)
return FALSE;
}
-bool8 ScrCmd_hideobject_at(struct ScriptContext *ctx)
+bool8 ScrCmd_hideobjectat(struct ScriptContext *ctx)
{
u16 localId = VarGet(ScriptReadHalfword(ctx));
u8 mapGroup = ScriptReadByte(ctx);
@@ -1939,9 +1939,9 @@ bool8 ScrCmd_pokemartdecoration2(struct ScriptContext *ctx)
bool8 ScrCmd_playslotmachine(struct ScriptContext *ctx)
{
- u8 slotMachineIndex = VarGet(ScriptReadHalfword(ctx));
+ u8 machineId = VarGet(ScriptReadHalfword(ctx));
- PlaySlotMachine(slotMachineIndex, CB2_ReturnToFieldContinueScriptPlayMapMusic);
+ PlaySlotMachine(machineId, CB2_ReturnToFieldContinueScriptPlayMapMusic);
ScriptContext1_Stop();
return TRUE;
}
@@ -2069,7 +2069,7 @@ bool8 ScrCmd_setmetatile(struct ScriptContext *ctx)
if (!isImpassable)
MapGridSetMetatileIdAt(x, y, tileId);
else
- MapGridSetMetatileIdAt(x, y, tileId | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(x, y, tileId | MAPGRID_COLLISION_MASK);
return FALSE;
}
diff --git a/src/secret_base.c b/src/secret_base.c
index 8fc97141fc..fa424889e0 100644
--- a/src/secret_base.c
+++ b/src/secret_base.c
@@ -305,7 +305,7 @@ static void FindMetatileIdMapCoords(s16 *x, s16 *y, u16 metatileId)
{
for (i = 0; i < mapLayout->width; i++)
{
- if ((mapLayout->map[j * mapLayout->width + i] & METATILE_ID_MASK) == metatileId)
+ if ((mapLayout->map[j * mapLayout->width + i] & MAPGRID_METATILE_ID_MASK) == metatileId)
{
*x = i;
*y = j;
@@ -330,7 +330,7 @@ void ToggleSecretBaseEntranceMetatile(void)
{
if (sSecretBaseEntranceMetatiles[i].closedMetatileId == metatileId)
{
- MapGridSetMetatileIdAt(x, y, sSecretBaseEntranceMetatiles[i].openMetatileId | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(x, y, sSecretBaseEntranceMetatiles[i].openMetatileId | MAPGRID_COLLISION_MASK);
CurrentMapDrawMetatileAt(x, y);
return;
}
@@ -341,7 +341,7 @@ void ToggleSecretBaseEntranceMetatile(void)
{
if (sSecretBaseEntranceMetatiles[i].openMetatileId == metatileId)
{
- MapGridSetMetatileIdAt(x, y, sSecretBaseEntranceMetatiles[i].closedMetatileId | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(x, y, sSecretBaseEntranceMetatiles[i].closedMetatileId | MAPGRID_COLLISION_MASK);
CurrentMapDrawMetatileAt(x, y);
return;
}
@@ -396,7 +396,7 @@ void SetOccupiedSecretBaseEntranceMetatiles(struct MapEvents const *events)
{
if (sSecretBaseEntranceMetatiles[i].closedMetatileId == tile_id)
{
- MapGridSetMetatileIdAt(x, y, sSecretBaseEntranceMetatiles[i].openMetatileId | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(x, y, sSecretBaseEntranceMetatiles[i].openMetatileId | MAPGRID_COLLISION_MASK);
break;
}
}
@@ -475,7 +475,7 @@ static void EnterNewlyCreatedSecretBase_StartFadeIn(void)
FindMetatileIdMapCoords(&x, &y, METATILE_SecretBase_PC);
x += MAP_OFFSET;
y += MAP_OFFSET;
- MapGridSetMetatileIdAt(x, y, METATILE_SecretBase_PC | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(x, y, METATILE_SecretBase_PC | MAPGRID_COLLISION_MASK);
CurrentMapDrawMetatileAt(x, y);
FadeInFromBlack();
CreateTask(EnterNewlyCreatedSecretBase_WaitFadeIn, 0);
@@ -536,13 +536,13 @@ void InitSecretBaseAppearance(bool8 hidePC)
{
// Another player's secret base. Change PC type to the "Register" PC.
FindMetatileIdMapCoords(&x, &y, METATILE_SecretBase_PC);
- MapGridSetMetatileIdAt(x + MAP_OFFSET, y + MAP_OFFSET, METATILE_SecretBase_RegisterPC | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(x + MAP_OFFSET, y + MAP_OFFSET, METATILE_SecretBase_RegisterPC | MAPGRID_COLLISION_MASK);
}
else if (hidePC == TRUE && VarGet(VAR_SECRET_BASE_INITIALIZED) == 1)
{
// Change PC to regular ground tile.
FindMetatileIdMapCoords(&x, &y, METATILE_SecretBase_PC);
- MapGridSetMetatileIdAt(x + MAP_OFFSET, y + MAP_OFFSET, METATILE_SecretBase_Ground | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(x + MAP_OFFSET, y + MAP_OFFSET, METATILE_SecretBase_Ground | MAPGRID_COLLISION_MASK);
}
}
}
@@ -838,7 +838,7 @@ static void ClosePlayerSecretBaseEntrance(void)
{
MapGridSetMetatileIdAt(events->bgEvents[i].x + MAP_OFFSET,
events->bgEvents[i].y + MAP_OFFSET,
- sSecretBaseEntranceMetatiles[j].closedMetatileId | METATILE_COLLISION_MASK);
+ sSecretBaseEntranceMetatiles[j].closedMetatileId | MAPGRID_COLLISION_MASK);
break;
}
}
@@ -1027,7 +1027,7 @@ static void ShowRegistryMenuActions(u8 taskId)
tActionWindowId = AddWindow(&template);
SetStandardWindowBorderStyle(tActionWindowId, 0);
PrintMenuTable(tActionWindowId, ARRAY_COUNT(sRegistryMenuActions), sRegistryMenuActions);
- InitMenuInUpperLeftCornerNormal(tActionWindowId, 2, 0);
+ InitMenuInUpperLeftCornerNormal(tActionWindowId, ARRAY_COUNT(sRegistryMenuActions), 0);
ScheduleBgCopyTilemapToVram(0);
gTasks[taskId].func = HandleRegistryMenuActionsInput;
}
diff --git a/src/shop.c b/src/shop.c
index f41ae315f1..700a53e37a 100755
--- a/src/shop.c
+++ b/src/shop.c
@@ -674,9 +674,9 @@ static void BuyMenuInitBgs(void)
static void BuyMenuDecompressBgGraphics(void)
{
- DecompressAndCopyTileDataToVram(1, gBuyMenuFrame_Gfx, 0x3A0, 0x3E3, 0);
- LZDecompressWram(gBuyMenuFrame_Tilemap, sShopData->tilemapBuffers[0]);
- LoadCompressedPalette(gMenuMoneyPal, 0xC0, 0x20);
+ DecompressAndCopyTileDataToVram(1, gShopMenu_Gfx, 0x3A0, 0x3E3, 0);
+ LZDecompressWram(gShopMenu_Tilemap, sShopData->tilemapBuffers[0]);
+ LoadCompressedPalette(gShopMenu_Pal, 0xC0, 0x20);
}
static void BuyMenuInitWindows(void)
@@ -743,7 +743,7 @@ static void BuyMenuDrawMapBg(void)
if (BuyMenuCheckForOverlapWithMenuBg(i, j) == TRUE)
metatileLayerType = MapGridGetMetatileLayerTypeAt(x + i, y + j);
else
- metatileLayerType = 1;
+ metatileLayerType = METATILE_LAYER_TYPE_COVERED;
if (metatile < NUM_METATILES_IN_PRIMARY)
{
@@ -764,15 +764,15 @@ static void BuyMenuDrawMapMetatile(s16 x, s16 y, const u16 *src, u8 metatileLaye
switch (metatileLayerType)
{
- case 0:
+ case METATILE_LAYER_TYPE_NORMAL:
BuyMenuDrawMapMetatileLayer(sShopData->tilemapBuffers[3], offset1, offset2, src);
BuyMenuDrawMapMetatileLayer(sShopData->tilemapBuffers[1], offset1, offset2, src + 4);
break;
- case 1:
+ case METATILE_LAYER_TYPE_COVERED:
BuyMenuDrawMapMetatileLayer(sShopData->tilemapBuffers[2], offset1, offset2, src);
BuyMenuDrawMapMetatileLayer(sShopData->tilemapBuffers[3], offset1, offset2, src + 4);
break;
- case 2:
+ case METATILE_LAYER_TYPE_SPLIT:
BuyMenuDrawMapMetatileLayer(sShopData->tilemapBuffers[2], offset1, offset2, src);
BuyMenuDrawMapMetatileLayer(sShopData->tilemapBuffers[1], offset1, offset2, src + 4);
break;
@@ -866,7 +866,7 @@ static void BuyMenuDrawObjectEvents(void)
static bool8 BuyMenuCheckIfObjectEventOverlapsMenuBg(s16 *object)
{
- if (!BuyMenuCheckForOverlapWithMenuBg(object[X_COORD], object[Y_COORD] + 2) && object[LAYER_TYPE] != MB_SECRET_BASE_WALL)
+ if (!BuyMenuCheckForOverlapWithMenuBg(object[X_COORD], object[Y_COORD] + 2) && object[LAYER_TYPE] != METATILE_LAYER_TYPE_COVERED)
{
return TRUE;
}
diff --git a/src/slot_machine.c b/src/slot_machine.c
index 6cbcd76fdf..1dfa026e5f 100644
--- a/src/slot_machine.c
+++ b/src/slot_machine.c
@@ -31,20 +31,60 @@
#define SLOTMACHINE_GFX_TILES 233
#define MAX_BET 3
-#define SYMBOLS_PER_REEL 21
-#define REEL_SYMBOL_HEIGHT 24
+#define SYMBOLS_PER_REEL 21
+#define REEL_SYMBOL_HEIGHT 24
+#define REEL_HEIGHT (SYMBOLS_PER_REEL * REEL_SYMBOL_HEIGHT)
-// Lucky Flags
-#define LUCKY_BIAS_REPLAY (1 << 0)
-#define LUCKY_BIAS_CHERRY (1 << 1)
-#define LUCKY_BIAS_LOTAD (1 << 2)
-#define LUCKY_BIAS_AZURILL (1 << 3)
-#define LUCKY_BIAS_POWER (1 << 4)
-#define LUCKY_BIAS_REELTIME (1 << 5)
-#define LUCKY_BIAS_MIXED_777 (1 << 6)
-#define LUCKY_BIAS_777 (1 << 7)
+#define REELTIME_SYMBOLS 6
+#define REELTIME_SYMBOL_HEIGHT 20
+#define REELTIME_REEL_HEIGHT (REELTIME_SYMBOLS * REELTIME_SYMBOL_HEIGHT)
+
+// There are three categories of biases: 7's, ReelTime, Regular
+// - 7's: BIAS_STRAIGHT_7, BIAS_MIXED_7
+// - ReelTime: BIAS_REELTIME
+// - Regular: everything else
+//
+// The 7's and ReelTime biases can be grouped together as 'Special' biases.
+//
+// There can be at most two biases at a time. If there are two, one bias will be
+// ReelTime and the other will be one of the Regular biases.
+//
+// A new bias is drawn every round, except during ReelTime. Bias towards 7's
+// persists across rounds until you match 7's. All other biases are reset after
+// the round.
+#define BIAS_REPLAY (1 << 0)
+#define BIAS_CHERRY (1 << 1)
+#define BIAS_LOTAD (1 << 2)
+#define BIAS_AZURILL (1 << 3)
+#define BIAS_POWER (1 << 4)
+#define BIAS_REELTIME (1 << 5)
+#define BIAS_MIXED_7 (1 << 6)
+#define BIAS_STRAIGHT_7 (1 << 7)
+
+#define BIAS_7 (BIAS_STRAIGHT_7 | BIAS_MIXED_7)
+#define BIAS_SPECIAL (BIAS_7 | BIAS_REELTIME)
+#define BIAS_REGULAR (BIAS_REPLAY | BIAS_CHERRY | BIAS_LOATAD | BIAS_AZURILL | BIAS_POWER)
+
+// The slot machine will try to manipulate the outcome by adding up to 4 extra
+// turns to the reel after you press stop.
+//
+// The only exception is when it is stopping the third reel and it has decided
+// you will lose. In this case, it adds as many turns as necessary to prevent a
+// match.
+#define MAX_EXTRA_TURNS 4
enum {
+ SYMBOL_7_RED,
+ SYMBOL_7_BLUE,
+ SYMBOL_AZURILL,
+ SYMBOL_LOTAD,
+ SYMBOL_CHERRY,
+ SYMBOL_POWER,
+ SYMBOL_REPLAY,
+};
+
+enum
+{
GFXTAG_7_RED,
GFXTAG_7_BLUE,
GFXTAG_AZURILL,
@@ -72,6 +112,10 @@ enum {
#define GFXTAG_SYMBOLS_START (GFXTAG_7_RED)
#define GFXTAG_NUMBERS_START (GFXTAG_NUM_0)
+#define REEL_NORMAL_SPEED 8
+#define REEL_HALF_SPEED 4
+#define REEL_QUARTER_SPEED 2
+
enum {
PALTAG_REEL,
PALTAG_REEL_TIME_PIKACHU,
@@ -84,16 +128,16 @@ enum {
};
enum {
- MATCHED_1CHERRY,
- MATCHED_2CHERRY,
- MATCHED_REPLAY,
- MATCHED_LOTAD,
- MATCHED_AZURILL,
- MATCHED_POWER,
- MATCHED_777_MIXED,
- MATCHED_777_RED,
- MATCHED_777_BLUE,
- MATCHED_NONE,
+ MATCH_CHERRY, // Cherry in center of first reel
+ MATCH_TOPBOT_CHERRY, // Cherry in top/bottom of first reel
+ MATCH_REPLAY,
+ MATCH_LOTAD,
+ MATCH_AZURILL,
+ MATCH_POWER,
+ MATCH_MIXED_7, // First two 7's are same color; last is other color
+ MATCH_RED_7,
+ MATCH_BLUE_7,
+ MATCH_NONE,
};
enum {
@@ -113,43 +157,78 @@ enum {
};
enum {
- SLOT_ACTION_UNFADE,
- SLOT_ACTION_WAIT_FADE,
- SLOT_ACTION_READY_NEW_SPIN,
- SLOT_ACTION_READY_NEW_RT_SPIN,
- SLOT_ACTION_ASK_INSERT_BET,
- SLOT_ACTION_BET_INPUT,
- SLOT_ACTION_MSG_NEED_3_COINS,
- SLOT_ACTION_WAIT_MSG_NEED_3_COINS,
- SLOT_ACTION_WAIT_INFO_BOX,
- SLOT_ACTION_START_SPIN,
- SLOT_ACTION_START_RT_SPIN,
- SLOT_ACTION_SET_LUCKY_SPINS,
- SLOT_ACTION_AWAIT_REEL_STOP,
- SLOT_ACTION_AWAIT_ALL_REELS_STOP,
- SLOT_ACTION_CHECK_MATCHES,
- SLOT_ACTION_WAIT_PAYOUT,
- SLOT_ACTION_END_PAYOUT,
- SLOT_ACTION_MATCHED_POWER,
- SLOT_ACTION_WAIT_RT_ANIM,
- SLOT_ACTION_RESET_BET_TILES,
- SLOT_ACTION_NO_MATCHES,
- SLOT_ACTION_ASK_QUIT,
- SLOT_ACTION_HANDLE_QUIT_INPUT,
- SLOT_ACTION_MSG_MAX_COINS,
- SLOT_ACTION_WAIT_MSG_MAX_COINS,
- SLOT_ACTION_MSG_NO_MORE_COINS,
- SLOT_ACTION_WAIT_MSG_NO_MORE_COINS,
- SLOT_ACTION_END,
- SLOT_ACTION_FREE,
+ SLOTTASK_UNFADE,
+ SLOTTASK_WAIT_FADE,
+ SLOTTASK_READY_NEW_SPIN,
+ SLOTTASK_READY_NEW_RT_SPIN,
+ SLOTTASK_ASK_INSERT_BET,
+ SLOTTASK_BET_INPUT,
+ SLOTTASK_MSG_NEED_3_COINS,
+ SLOTTASK_WAIT_MSG_NEED_3_COINS,
+ SLOTTASK_WAIT_INFO_BOX,
+ SLOTTASK_START_SPIN,
+ SLOTTASK_START_RT_SPIN,
+ SLOTTASK_RESET_BIAS_FAILURE,
+ SLOTTASK_WAIT_REEL_STOP,
+ SLOTTASK_WAIT_ALL_REELS_STOP,
+ SLOTTASK_CHECK_MATCHES,
+ SLOTTASK_WAIT_PAYOUT,
+ SLOTTASK_END_PAYOUT,
+ SLOTTASK_MATCHED_POWER,
+ SLOTTASK_WAIT_RT_ANIM,
+ SLOTTASK_RESET_BET_TILES,
+ SLOTTASK_NO_MATCHES,
+ SLOTTASK_ASK_QUIT,
+ SLOTTASK_HANDLE_QUIT_INPUT,
+ SLOTTASK_MSG_MAX_COINS,
+ SLOTTASK_WAIT_MSG_MAX_COINS,
+ SLOTTASK_MSG_NO_MORE_COINS,
+ SLOTTASK_WAIT_MSG_NO_MORE_COINS,
+ SLOTTASK_END,
+ SLOTTASK_FREE,
+};
+enum
+{
+ PAYOUT_TASK_INIT,
+ PAYOUT_TASK_GIVE_PAYOUT,
+ PAYOUT_TASK_FREE,
};
enum {
- REEL_ACTION_STILL,
- REEL_ACTION_SPIN,
- REEL_ACTION_STOP,
- REEL_ACTION_STOP_MOVE,
- REEL_ACTION_STOP_SHAKE,
+ REEL_TASK_STILL,
+ REEL_TASK_SPIN,
+ REEL_TASK_DECIDE_STOP,
+ REEL_TASK_STOP_MOVE,
+ REEL_TASK_STOP_SHAKE,
+};
+
+enum {
+ PIKABOLT_TASK_IDLE,
+ PIKABOLT_TASK_ADD_BOLT,
+ PIKABOLT_TASK_WAIT_ANIM,
+ PIKABOLT_TASK_CLEAR_ALL,
+};
+
+enum {
+ RT_TASK_INIT,
+ RT_TASK_WINDOW_ENTER,
+ RT_TASK_WAIT_START_PIKA,
+ RT_TASK_PIKA_SPEEDUP1,
+ RT_TASK_PIKA_SPEEDUP2,
+ RT_TASK_WAIT_REEL,
+ RT_TASK_CHECK_EXPLODE,
+ RT_TASK_LAND,
+ RT_TASK_PIKA_REACT,
+ RT_TASK_WAIT_CLEAR_POWER,
+ RT_TASK_CLOSE_WINDOW_SUCCESS,
+ RT_TASK_DESTROY_SPRITES,
+ RT_TASK_SET_REEL_SPEED,
+ RT_TASK_END_SUCCESS,
+ RT_TASK_EXPLODE,
+ RT_TASK_WAIT_EXPLODE,
+ RT_TASK_WAIT_SMOKE,
+ RT_TASK_CLOSE_WINDOW_FAILURE,
+ RT_TASK_END_FAILURE,
};
#define DIG_SPRITE_DUMMY {255, 0, 0}
@@ -235,29 +314,74 @@ enum {
DIG_DISPLAY_BONUS_BIG
};
+
+// How ReelTime works
+// ==================
+// Entering ReelTime:
+// - If the bias you draw at the start of the round is BIAS_REELTIME, the
+// ReelTime lottery begins.
+// - At the start of the lottery, the game selects how many ReelTime spins you
+// will get, based on how many Power bolts you've collected and whether it
+// is a lucky game.
+// - The lottery machine rolls until it lands on the selected number. If it
+// selected 0 spins, the lottery machine will mostly likely explode before
+// landing on 0.
+// - If you win:
+// - You receive the selected number of ReelTime spins
+// - You lose all the Power bolts you've collected thus far
+// - The lottery window closes and ReelTime officially begins
+//
+// During ReelTime:
+// - You still have to pay coins for bets.
+// - The slot reels may spin slower than usual in ReelTime. The machine draws a
+// reel speed at the beginning of each ReelTime spin. The more coins you've
+// lost to the machine, and the more consecutive ReelTime spins you've done,
+// the higher your chances of getting a slower reel speed.
+// - In ReelTime, the reel stops exactly on your input. That is, it won't add
+// extra turns to manipulate the outcome.
+// - ReelTime ends early if you win red 7's or blue 7's.
+
+
+// SlotMachine field explanations:
+//
+// luckyGame:
+// Determined at random when you start playing. Some events modify this:
+// - Blue 7 match: game becomes lucky
+// - Red 7 match: game becomes normal
+//
+// Effectively, a lucky game inreases the odds of getting more ReelTime spins.
+// If the game is lucky, you have a slightly higher chance of matching Power
+// bolts (at the expense of Replays). This helps you fill your Power bolt
+// gauge faster.
+//
+// During ReelTime, the more Power bolts you have, the greater your chances
+// of drawing more ReelTime spins. In a lucky game, you have greater odds of
+// drawing high yields (3+ RT spins). You also have greater odds of drawing 0
+// RT spins. But drawing 0 lets you keep all your Power bolts, allowing you to
+// fill your gauge further.
struct SlotMachine
{
/*0x00*/ u8 state;
/*0x01*/ u8 machineId;
- /*0x02*/ u8 pikaPower;
- /*0x03*/ u8 luckyGame;
- /*0x04*/ u8 luckyFlags;
+ /*0x02*/ u8 pikaPowerBolts;
+ /*0x03*/ bool8 luckyGame;
+ /*0x04*/ u8 machineBias;
/*0x05*/ u8 reelTimeDraw;
- /*0x06*/ u8 isLuckySpin;
- /*0x07*/ u8 biasTag;
- /*0x08*/ u16 matchedSymbols;
+ /*0x06*/ bool8 didNotFailBias;
+ /*0x07*/ u8 biasSymbol;
+ /*0x08*/ u16 matches;
/*0x0A*/ u8 reelTimeSpinsLeft;
/*0x0B*/ u8 reelTimeSpinsUsed;
/*0x0C*/ s16 coins;
/*0x0E*/ s16 payout;
- /*0x10*/ s16 netCoinLoss; // coins lost to machine (but never goes below 0)
+ /*0x10*/ s16 netCoinLoss; // never negative
/*0x12*/ s16 bet;
/*0x14*/ s16 reeltimePixelOffset;
/*0x16*/ s16 reeltimePosition;
- /*0x18*/ s16 currReel;
- /*0x1A*/ s16 reelIncrement; // speed of reel
+ /*0x18*/ s16 currentReel;
+ /*0x1A*/ s16 reelSpeed;
/*0x1C*/ s16 reelPixelOffsets[NUM_REELS];
- /*0x22*/ u16 reelPixelOffsetsWhileStopping[NUM_REELS];
+ /*0x22*/ u16 reelShockOffsets[NUM_REELS];
/*0x28*/ s16 reelPositions[NUM_REELS];
/*0x2E*/ s16 reelExtraTurns[NUM_REELS];
/*0x34*/ s16 winnerRows[NUM_REELS];
@@ -299,7 +423,7 @@ static void SlotMachineSetup_InitBgsWindows(void);
static void SlotMachineSetup_InitVRAM(void);
static void SlotMachineSetup_InitOAM(void);
static void SlotMachineSetup_InitGpuRegs(void);
-static void SlotMachineSetup_InitSlotMachineStruct(void);
+static void InitSlotMachine(void);
static void SlotMachineSetup_InitPalsSpritesTasks(void);
static void SlotMachineSetup_InitTilemaps(void);
static void SlotMachineSetup_LoadGfxAndTilemaps(void);
@@ -308,84 +432,84 @@ static void AllocDigitalDisplayGfx(void);
static void SetDigitalDisplayImagePtrs(void);
static void CreateSlotMachineSprites(void);
static void CreateGameplayTasks(void);
-static void CreateSlotMachineTask(void);
+static void CreateSlotMachineTasks(void);
static void DestroyDigitalDisplayScene(void);
static void Task_SlotMachine(u8);
-static bool8 SlotAction_UnfadeScreen(struct Task *);
-static bool8 SlotAction_WaitForUnfade(struct Task *);
-static bool8 SlotAction_ReadyNewSpin(struct Task *);
-static bool8 SlotAction_ReadyNewReelTimeSpin(struct Task *);
-static bool8 SlotAction_AskInsertBet(struct Task *);
-static bool8 SlotAction_HandleBetInput(struct Task *);
-static bool8 SlotAction_PrintMsg_Need3Coins(struct Task *);
-static bool8 SlotAction_WaitMsg_Need3Coins(struct Task *);
-static bool8 SlotAction_WaitForInfoBox(struct Task *);
-static bool8 SlotAction_StartSpin(struct Task *);
-static bool8 SlotAction_StartReelTimeSpin(struct Task *);
-static bool8 SlotAction_SetLuckySpins(struct Task *);
-static bool8 SlotAction_AwaitReelStop(struct Task *);
-static bool8 SlotAction_WaitForAllReelsToStop(struct Task *);
-static bool8 SlotAction_CheckMatches(struct Task *);
-static bool8 SlotAction_WaitForPayoutToBeAwarded(struct Task *);
-static bool8 SlotAction_EndPayout(struct Task *);
-static bool8 SlotAction_MatchedPower(struct Task *);
-static bool8 SlotAction_WaitReelTimeAnim(struct Task *);
-static bool8 SlotAction_ResetBetTiles(struct Task *);
-static bool8 SlotAction_NoMatches(struct Task *);
-static bool8 SlotAction_AskQuit(struct Task *);
-static bool8 SlotAction_HandleQuitInput(struct Task *);
-static bool8 SlotAction_PrintMsg_9999Coins(struct Task *);
-static bool8 SlotAction_WaitMsg_9999Coins(struct Task *);
-static bool8 SlotAction_PrintMsg_NoMoreCoins(struct Task *);
-static bool8 SlotAction_WaitMsg_NoMoreCoins(struct Task *);
-static bool8 SlotAction_EndGame(struct Task *);
-static bool8 SlotAction_FreeDataStructures(struct Task *);
-static void DrawLuckyFlags(void);
-static void SetLuckySpins(void);
-static bool8 IsThisRoundLucky(void);
-static u8 AttemptsAtLuckyFlags_Top3(void);
-static u16 SlowReelSpeed(void);
-static u8 AttemptsAtLuckyFlags_NotTop3(void);
+static bool8 SlotTask_UnfadeScreen(struct Task *);
+static bool8 SlotTask_WaitUnfade(struct Task *);
+static bool8 SlotTask_ReadyNewSpin(struct Task *);
+static bool8 SlotTask_ReadyNewReelTimeSpin(struct Task *);
+static bool8 SlotTask_AskInsertBet(struct Task *);
+static bool8 SlotTask_HandleBetInput(struct Task *);
+static bool8 SlotTask_PrintMsg_Need3Coins(struct Task *);
+static bool8 SlotTask_WaitMsg_Need3Coins(struct Task *);
+static bool8 SlotTask_WaitInfoBox(struct Task *);
+static bool8 SlotTask_StartSpin(struct Task *);
+static bool8 SlotTask_StartReelTimeSpin(struct Task *);
+static bool8 SlotTask_ResetBiasFailure(struct Task *);
+static bool8 SlotTask_WaitReelStop(struct Task *);
+static bool8 SlotTask_WaitAllReelsStop(struct Task *);
+static bool8 SlotTask_CheckMatches(struct Task *);
+static bool8 SlotTask_WaitPayout(struct Task *);
+static bool8 SlotTask_EndPayout(struct Task *);
+static bool8 SlotTask_MatchedPower(struct Task *);
+static bool8 SlotTask_WaitReelTimeAnim(struct Task *);
+static bool8 SlotTask_ResetBetTiles(struct Task *);
+static bool8 SlotTask_NoMatches(struct Task *);
+static bool8 SlotTask_AskQuit(struct Task *);
+static bool8 SlotTask_HandleQuitInput(struct Task *);
+static bool8 SlotTask_PrintMsg_MaxCoins(struct Task *);
+static bool8 SlotTask_WaitMsg_MaxCoins(struct Task *);
+static bool8 SlotTask_PrintMsg_NoMoreCoins(struct Task *);
+static bool8 SlotTask_WaitMsg_NoMoreCoins(struct Task *);
+static bool8 SlotTask_EndGame(struct Task *);
+static bool8 SlotTask_FreeDataStructures(struct Task *);
+static void DrawMachineBias(void);
+static void ResetBiasFailure(void);
+static bool8 ShouldTrySpecialBias(void);
+static u8 TrySelectBias_Special(void);
+static u16 ReelTimeSpeed(void);
+static u8 TrySelectBias_Regular(void);
static void CheckMatch(void);
static void CheckMatch_CenterRow(void);
static void CheckMatch_TopAndBottom(void);
static void CheckMatch_Diagonals(void);
static u8 GetMatchFromSymbols(u8, u8, u8);
static void AwardPayout(void);
-static void RunAwardPayoutActions(u8);
-static bool8 IsFinalTask_RunAwardPayoutActions(void);
-static bool8 AwardPayoutAction0(struct Task *);
-static bool8 AwardPayoutAction_GivePayoutToPlayer(struct Task *);
-static bool8 AwardPayoutAction_FreeTask(struct Task *);
-static u8 GetTagAtRest(u8, s16);
-static void CreateSlotReelTasks(void);
+static void Task_Payout(u8);
+static bool8 IsFinalTask_Task_Payout(void);
+static bool8 PayoutTask_Init(struct Task *);
+static bool8 PayoutTask_GivePayout(struct Task *);
+static bool8 PayoutTask_Free(struct Task *);
+static u8 GetSymbolAtRest(u8, s16);
+static void CreateReelTasks(void);
static void SpinSlotReel(u8);
static void StopSlotReel(u8);
static bool8 IsSlotReelMoving(u8);
-static void Task_RunSlotReelActions(u8);
-static bool8 SlotReelAction_StayStill(struct Task *);
-static bool8 SlotReelAction_Spin(struct Task *);
-static bool8 SlotReelAction_DecideWhereToStop(struct Task *);
-static bool8 SlotReelAction_MoveToStop(struct Task *);
-static bool8 SlotReelAction_OscillatingStop(struct Task *);
-static bool8 DecideReelTurns_BiasTag_Reel1(void);
-static bool8 DecideReelTurns_BiasTag_Reel1_Bet1(u8, u8);
-static bool8 DecideReelTurns_BiasTag_Reel1_Bet2or3(u8, u8);
-static bool8 DecideReelTurns_BiasTag_Reel2(void);
-static bool8 DecideReelTurns_BiasTag_Reel2_Bet1or2(void);
-static bool8 DecideReelTurns_BiasTag_Reel2_Bet3(void);
-static bool8 DecideReelTurns_BiasTag_Reel3(void);
-static bool8 DecideReelTurns_BiasTag_Reel3_Bet1or2(u8);
-static bool8 DecideReelTurns_BiasTag_Reel3_Bet3(u8);
-static void DecideReelTurns_NoBiasTag_Reel1(void);
-static void DecideReelTurns_NoBiasTag_Reel2(void);
-static void DecideReelTurns_NoBiasTag_Reel2_Bet1(void);
-static void DecideReelTurns_NoBiasTag_Reel2_Bet2(void);
-static void DecideReelTurns_NoBiasTag_Reel2_Bet3(void);
-static void DecideReelTurns_NoBiasTag_Reel3(void);
-static void DecideReelTurns_NoBiasTag_Reel3_Bet1(void);
-static void DecideReelTurns_NoBiasTag_Reel3_Bet2(void);
-static void DecideReelTurns_NoBiasTag_Reel3_Bet3(void);
+static void Task_Reel(u8);
+static bool8 ReelTask_StayStill(struct Task *);
+static bool8 ReelTask_Spin(struct Task *);
+static bool8 ReelTask_DecideStop(struct Task *);
+static bool8 ReelTask_MoveToStop(struct Task *);
+static bool8 ReelTask_ShakingStop(struct Task *);
+static bool8 DecideStop_Bias_Reel1(void);
+static bool8 DecideStop_Bias_Reel1_Bet1(u8, u8);
+static bool8 DecideStop_Bias_Reel1_Bet2or3(u8, u8);
+static bool8 DecideStop_Bias_Reel2(void);
+static bool8 DecideStop_Bias_Reel2_Bet1or2(void);
+static bool8 DecideStop_Bias_Reel2_Bet3(void);
+static bool8 DecideStop_Bias_Reel3(void);
+static bool8 DecideStop_Bias_Reel3_Bet1or2(u8);
+static bool8 DecideStop_Bias_Reel3_Bet3(u8);
+static void DecideStop_NoBias_Reel1(void);
+static void DecideStop_NoBias_Reel2(void);
+static void DecideStop_NoBias_Reel2_Bet1(void);
+static void DecideStop_NoBias_Reel2_Bet2(void);
+static void DecideStop_NoBias_Reel2_Bet3(void);
+static void DecideStop_NoBias_Reel3(void);
+static void DecideStop_NoBias_Reel3_Bet1(void);
+static void DecideStop_NoBias_Reel3_Bet2(void);
+static void DecideStop_NoBias_Reel3_Bet3(void);
static void PressStopReelButton(u8);
static void Task_PressStopReelButton(u8);
static void LightenBetTiles(u8);
@@ -427,7 +551,7 @@ static void ReelTime_PikachuReact(struct Task *);
static void ReelTime_WaitClearPikaPower(struct Task *);
static void ReelTime_CloseWindow(struct Task *);
static void ReelTime_DestroySprites(struct Task *);
-static void ReelTime_SetReelIncrement(struct Task *);
+static void ReelTime_SetReelSpeed(struct Task *);
static void ReelTime_EndSuccess(struct Task *);
static void ReelTime_ExplodeMachine(struct Task *);
static void ReelTime_WaitExplode(struct Task *);
@@ -437,11 +561,11 @@ static void LoadReelTimeWindowTilemap(s16, s16);
static void ClearReelTimeWindowTilemap(s16);
static void OpenInfoBox(u8);
static bool8 IsInfoBoxClosed(void);
-static void RunInfoBoxActions(u8 );
+static void Task_InfoBox(u8 );
static void InfoBox_FadeIn(struct Task *);
-static void InfoBox_WaitForFade(struct Task *);
+static void InfoBox_WaitFade(struct Task *);
static void InfoBox_DrawWindow(struct Task *);
-static void InfoBox_AwaitPlayerInput(struct Task *);
+static void InfoBox_WaitInput(struct Task *);
static void InfoBox_AddText(struct Task *);
static void InfoBox_LoadPikaPowerMeter(struct Task *);
static void InfoBox_LoadSlotMachineTilemap(struct Task *);
@@ -557,10 +681,10 @@ static struct SpriteFrameImage *sImageTables_DigitalDisplay[NUM_DIG_DISPLAY_SPRI
// Const rom data.
static const struct DigitalDisplaySprite *const sDigitalDisplayScenes[];
static const u16 sUnkPalette[];
-static const u8 sLuckyRoundProbabilities[NUM_SLOT_MACHINE_IDS][MAX_BET];
-static const u8 sBiasTags[];
-static const u16 sLuckyFlagSettings_Top3[3];
-static const u16 sLuckyFlagSettings_NotTop3[5];
+static const u8 sSpecialDrawOdds[NUM_SLOT_MACHINE_IDS][MAX_BET];
+static const u8 sBiasSymbols[];
+static const u16 sBiasesSpecial[3];
+static const u16 sBiasesRegular[5];
static const s16 sDigitalDisplay_SpriteCoords[][2];
static const SpriteCallback sDigitalDisplay_SpriteCallbacks[];
static const struct SpriteTemplate *const sSpriteTemplates_DigitalDisplay[NUM_DIG_DISPLAY_SPRITES];
@@ -572,8 +696,8 @@ static const struct SpriteTemplate sSpriteTemplate_ReelTimeExplosion;
static const struct SpriteTemplate sSpriteTemplate_ReelTimePikachuAura;
static const u16 sReelTimeExplodeProbability[];
static const u16 *const sPokeballShiningPalTable[];
-static const u16 sReelIncrementTable[][2];
-static const u16 sReelTimeBonusIncrementTable[];
+static const u16 sReelTimeSpeed_Probabilities[][2];
+static const u16 sQuarterSpeed_ProbabilityBoost[];
static const u16 sSlotMatchFlags[];
static const u16 sSlotPayouts[];
static const u8 *const sReelBackground_Tilemap;
@@ -582,13 +706,13 @@ static const struct SpriteSheet sSlotMachineSpriteSheets[22];
static const struct SpritePalette sSlotMachineSpritePalettes[];
static const u16 *const sDigitalDisplay_Pal;
static const s16 sInitialReelPositions[NUM_REELS][2];
-static const u8 sLuckyFlagProbabilities_Top3[][NUM_SLOT_MACHINE_IDS];
-static const u8 sLuckyFlagProbabilities_NotTop3[][NUM_SLOT_MACHINE_IDS];
-static const u8 sReeltimeProbabilities_UnluckyGame[][17];
+static const u8 sBiasProbabilities_Special[][NUM_SLOT_MACHINE_IDS];
+static const u8 sBiasProbabilities_Regular[][NUM_SLOT_MACHINE_IDS];
+static const u8 sReelTimeProbabilities_NormalGame[][17];
static const u8 sReelTimeProbabilities_LuckyGame[][17];
-static const u8 sSymToMatch[];
-static const u8 sReelTimeTags[];
-static const u8 sReelSymbolTileTags[NUM_REELS][SYMBOLS_PER_REEL];
+static const u8 sSymbolToMatch[];
+static const u8 sReelTimeSymbols[];
+static const u8 sReelSymbols[NUM_REELS][SYMBOLS_PER_REEL];
static const u16 *const sLitMatchLinePalTable[NUM_MATCH_LINES];
static const u16 *const sDarkMatchLinePalTable[NUM_MATCH_LINES];
static const u8 sMatchLinePalOffsets[NUM_MATCH_LINES];
@@ -684,123 +808,131 @@ static const struct WindowTemplate sWindowTemplate_InfoBox =
static const u8 sColors_ReeltimeHelp[] = {TEXT_COLOR_LIGHT_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY};
-static bool8 (*const sSlotActions[])(struct Task *task) =
+static bool8 (*const sSlotTasks[])(struct Task *task) =
{
- [SLOT_ACTION_UNFADE] = SlotAction_UnfadeScreen,
- [SLOT_ACTION_WAIT_FADE] = SlotAction_WaitForUnfade,
- [SLOT_ACTION_READY_NEW_SPIN] = SlotAction_ReadyNewSpin,
- [SLOT_ACTION_READY_NEW_RT_SPIN] = SlotAction_ReadyNewReelTimeSpin,
- [SLOT_ACTION_ASK_INSERT_BET] = SlotAction_AskInsertBet,
- [SLOT_ACTION_BET_INPUT] = SlotAction_HandleBetInput,
- [SLOT_ACTION_MSG_NEED_3_COINS] = SlotAction_PrintMsg_Need3Coins,
- [SLOT_ACTION_WAIT_MSG_NEED_3_COINS] = SlotAction_WaitMsg_Need3Coins,
- [SLOT_ACTION_WAIT_INFO_BOX] = SlotAction_WaitForInfoBox,
- [SLOT_ACTION_START_SPIN] = SlotAction_StartSpin,
- [SLOT_ACTION_START_RT_SPIN] = SlotAction_StartReelTimeSpin,
- [SLOT_ACTION_SET_LUCKY_SPINS] = SlotAction_SetLuckySpins,
- [SLOT_ACTION_AWAIT_REEL_STOP] = SlotAction_AwaitReelStop,
- [SLOT_ACTION_AWAIT_ALL_REELS_STOP] = SlotAction_WaitForAllReelsToStop,
- [SLOT_ACTION_CHECK_MATCHES] = SlotAction_CheckMatches,
- [SLOT_ACTION_WAIT_PAYOUT] = SlotAction_WaitForPayoutToBeAwarded,
- [SLOT_ACTION_END_PAYOUT] = SlotAction_EndPayout,
- [SLOT_ACTION_MATCHED_POWER] = SlotAction_MatchedPower,
- [SLOT_ACTION_WAIT_RT_ANIM] = SlotAction_WaitReelTimeAnim,
- [SLOT_ACTION_RESET_BET_TILES] = SlotAction_ResetBetTiles,
- [SLOT_ACTION_NO_MATCHES] = SlotAction_NoMatches,
- [SLOT_ACTION_ASK_QUIT] = SlotAction_AskQuit,
- [SLOT_ACTION_HANDLE_QUIT_INPUT] = SlotAction_HandleQuitInput,
- [SLOT_ACTION_MSG_MAX_COINS] = SlotAction_PrintMsg_9999Coins,
- [SLOT_ACTION_WAIT_MSG_MAX_COINS] = SlotAction_WaitMsg_9999Coins,
- [SLOT_ACTION_MSG_NO_MORE_COINS] = SlotAction_PrintMsg_NoMoreCoins,
- [SLOT_ACTION_WAIT_MSG_NO_MORE_COINS] = SlotAction_WaitMsg_NoMoreCoins,
- [SLOT_ACTION_END] = SlotAction_EndGame,
- [SLOT_ACTION_FREE] = SlotAction_FreeDataStructures,
+ [SLOTTASK_UNFADE] = SlotTask_UnfadeScreen,
+ [SLOTTASK_WAIT_FADE] = SlotTask_WaitUnfade,
+ [SLOTTASK_READY_NEW_SPIN] = SlotTask_ReadyNewSpin,
+ [SLOTTASK_READY_NEW_RT_SPIN] = SlotTask_ReadyNewReelTimeSpin,
+ [SLOTTASK_ASK_INSERT_BET] = SlotTask_AskInsertBet,
+ [SLOTTASK_BET_INPUT] = SlotTask_HandleBetInput,
+ [SLOTTASK_MSG_NEED_3_COINS] = SlotTask_PrintMsg_Need3Coins,
+ [SLOTTASK_WAIT_MSG_NEED_3_COINS] = SlotTask_WaitMsg_Need3Coins,
+ [SLOTTASK_WAIT_INFO_BOX] = SlotTask_WaitInfoBox,
+ [SLOTTASK_START_SPIN] = SlotTask_StartSpin,
+ [SLOTTASK_START_RT_SPIN] = SlotTask_StartReelTimeSpin,
+ [SLOTTASK_RESET_BIAS_FAILURE] = SlotTask_ResetBiasFailure,
+ [SLOTTASK_WAIT_REEL_STOP] = SlotTask_WaitReelStop,
+ [SLOTTASK_WAIT_ALL_REELS_STOP] = SlotTask_WaitAllReelsStop,
+ [SLOTTASK_CHECK_MATCHES] = SlotTask_CheckMatches,
+ [SLOTTASK_WAIT_PAYOUT] = SlotTask_WaitPayout,
+ [SLOTTASK_END_PAYOUT] = SlotTask_EndPayout,
+ [SLOTTASK_MATCHED_POWER] = SlotTask_MatchedPower,
+ [SLOTTASK_WAIT_RT_ANIM] = SlotTask_WaitReelTimeAnim,
+ [SLOTTASK_RESET_BET_TILES] = SlotTask_ResetBetTiles,
+ [SLOTTASK_NO_MATCHES] = SlotTask_NoMatches,
+ [SLOTTASK_ASK_QUIT] = SlotTask_AskQuit,
+ [SLOTTASK_HANDLE_QUIT_INPUT] = SlotTask_HandleQuitInput,
+ [SLOTTASK_MSG_MAX_COINS] = SlotTask_PrintMsg_MaxCoins,
+ [SLOTTASK_WAIT_MSG_MAX_COINS] = SlotTask_WaitMsg_MaxCoins,
+ [SLOTTASK_MSG_NO_MORE_COINS] = SlotTask_PrintMsg_NoMoreCoins,
+ [SLOTTASK_WAIT_MSG_NO_MORE_COINS] = SlotTask_WaitMsg_NoMoreCoins,
+ [SLOTTASK_END] = SlotTask_EndGame,
+ [SLOTTASK_FREE] = SlotTask_FreeDataStructures,
};
-static bool8 (*const sAwardPayoutActions[])(struct Task *task) =
+static bool8 (*const sPayoutTasks[])(struct Task *task) =
{
- AwardPayoutAction0,
- AwardPayoutAction_GivePayoutToPlayer,
- AwardPayoutAction_FreeTask
+ [PAYOUT_TASK_INIT] = PayoutTask_Init,
+ [PAYOUT_TASK_GIVE_PAYOUT] = PayoutTask_GivePayout,
+ [PAYOUT_TASK_FREE] = PayoutTask_Free,
};
-static bool8 (*const sSlotReelActions[])(struct Task *task) =
+static bool8 (*const sReelTasks[])(struct Task *task) =
{
- [REEL_ACTION_STILL] = SlotReelAction_StayStill,
- [REEL_ACTION_SPIN] = SlotReelAction_Spin,
- [REEL_ACTION_STOP] = SlotReelAction_DecideWhereToStop,
- [REEL_ACTION_STOP_MOVE] = SlotReelAction_MoveToStop,
- [REEL_ACTION_STOP_SHAKE] = SlotReelAction_OscillatingStop
+ [REEL_TASK_STILL] = ReelTask_StayStill,
+ [REEL_TASK_SPIN] = ReelTask_Spin,
+ [REEL_TASK_DECIDE_STOP] = ReelTask_DecideStop,
+ [REEL_TASK_STOP_MOVE] = ReelTask_MoveToStop,
+ [REEL_TASK_STOP_SHAKE] = ReelTask_ShakingStop,
};
-// returns True if a match with the biasTag is possible in that reel
-// also modifies data in sSlotMachine reel arrays to indicate how to get to the matching state
-static bool8 (*const sDecideReelTurns_BiasTag[NUM_REELS])(void) =
+// Returns true if it is possible to match the bias symbol in the reel.
+//
+// Modifies the winnerRows and reelExtraTurns to indicate how to match the bias
+// symbol.
+static bool8 (*const sDecideStop_Bias[NUM_REELS])(void) =
{
- DecideReelTurns_BiasTag_Reel1,
- DecideReelTurns_BiasTag_Reel2,
- DecideReelTurns_BiasTag_Reel3
+ DecideStop_Bias_Reel1,
+ DecideStop_Bias_Reel2,
+ DecideStop_Bias_Reel3,
};
-static void (*const sDecideReelTurns_NoBiasTag[NUM_REELS])(void) =
+// The player will always lose (barring a few rare circumstances that were not
+// accounted for in implementation).
+//
+// Modifies the winnerRows and reelExtraTurns to indicate how to make the player
+// lose.
+static void (*const sDecideStop_NoBias[NUM_REELS])(void) =
{
- DecideReelTurns_NoBiasTag_Reel1,
- DecideReelTurns_NoBiasTag_Reel2,
- DecideReelTurns_NoBiasTag_Reel3
+ DecideStop_NoBias_Reel1,
+ DecideStop_NoBias_Reel2,
+ DecideStop_NoBias_Reel3,
};
+// The magnitude of the shock depends on how many extra turns are added.
static const u16 sReelStopShocks[] = {2, 4, 4, 4, 8};
-static bool8 (*const sDecideReelTurns_BiasTag_Reel1_Bets[MAX_BET])(u8 tag1, u8 tag2) =
+static bool8 (*const sDecideStop_Bias_Reel1_Bets[MAX_BET])(u8 sym1, u8 sym2) =
{
- DecideReelTurns_BiasTag_Reel1_Bet1,
- DecideReelTurns_BiasTag_Reel1_Bet2or3,
- DecideReelTurns_BiasTag_Reel1_Bet2or3
+ DecideStop_Bias_Reel1_Bet1,
+ DecideStop_Bias_Reel1_Bet2or3,
+ DecideStop_Bias_Reel1_Bet2or3,
};
-static bool8 (*const sDecideReelTurns_BiasTag_Reel2_Bets[MAX_BET])(void) =
+static bool8 (*const sDecideStop_Bias_Reel2_Bets[MAX_BET])(void) =
{
- DecideReelTurns_BiasTag_Reel2_Bet1or2,
- DecideReelTurns_BiasTag_Reel2_Bet1or2,
- DecideReelTurns_BiasTag_Reel2_Bet3
+ DecideStop_Bias_Reel2_Bet1or2,
+ DecideStop_Bias_Reel2_Bet1or2,
+ DecideStop_Bias_Reel2_Bet3,
};
-static bool8 (*const sDecideReelTurns_BiasTag_Reel3_Bets[MAX_BET])(u8 biasTag) =
+static bool8 (*const sDecideStop_Bias_Reel3_Bets[MAX_BET])(u8 biasSymbol) =
{
- DecideReelTurns_BiasTag_Reel3_Bet1or2,
- DecideReelTurns_BiasTag_Reel3_Bet1or2,
- DecideReelTurns_BiasTag_Reel3_Bet3
+ DecideStop_Bias_Reel3_Bet1or2,
+ DecideStop_Bias_Reel3_Bet1or2,
+ DecideStop_Bias_Reel3_Bet3,
};
-static void (*const sDecideReelTurns_NoBiasTag_Reel2_Bets[MAX_BET])(void) =
+static void (*const sDecideStop_NoBias_Reel2_Bets[MAX_BET])(void) =
{
- DecideReelTurns_NoBiasTag_Reel2_Bet1,
- DecideReelTurns_NoBiasTag_Reel2_Bet2,
- DecideReelTurns_NoBiasTag_Reel2_Bet3
+ DecideStop_NoBias_Reel2_Bet1,
+ DecideStop_NoBias_Reel2_Bet2,
+ DecideStop_NoBias_Reel2_Bet3,
};
-static void (*const sDecideReelTurns_NoBiasTag_Reel3_Bets[MAX_BET])(void) =
+static void (*const sDecideStop_NoBias_Reel3_Bets[MAX_BET])(void) =
{
- DecideReelTurns_NoBiasTag_Reel3_Bet1,
- DecideReelTurns_NoBiasTag_Reel3_Bet2,
- DecideReelTurns_NoBiasTag_Reel3_Bet3
+ DecideStop_NoBias_Reel3_Bet1,
+ DecideStop_NoBias_Reel3_Bet2,
+ DecideStop_NoBias_Reel3_Bet3,
};
-static void (*const sReelStopButtonFuncs[])(struct Task *task, u8 taskId) =
+static void (*const sReelStopButtonTasks[])(struct Task *task, u8 taskId) =
{
StopReelButton_Press,
StopReelButton_Wait,
- StopReelButton_Unpress
+ StopReelButton_Unpress,
};
static const s16 sReelButtonOffsets[NUM_REELS] = {5, 10, 15};
-static void (*const sPikaPowerBoltFuncs[])(struct Task *task) =
+static void (*const sPikaPowerBoltTasks[])(struct Task *task) =
{
PikaPowerBolt_Idle,
PikaPowerBolt_AddBolt,
PikaPowerBolt_WaitAnim,
- PikaPowerBolt_ClearAll
+ PikaPowerBolt_ClearAll,
};
static const u16 sPikaPowerTileTable[][2] =
@@ -810,65 +942,61 @@ static const u16 sPikaPowerTileTable[][2] =
{0xaf, 0x7f},
};
-static void (*const sReelTimeActions[])(struct Task *task) =
+static void (*const sReelTimeTasks[])(struct Task *task) =
{
- ReelTime_Init,
- ReelTime_WindowEnter,
- ReelTime_WaitStartPikachu,
- ReelTime_PikachuSpeedUp1,
- ReelTime_PikachuSpeedUp2,
- ReelTime_WaitReel,
- ReelTime_CheckExplode,
- ReelTime_LandOnOutcome,
- ReelTime_PikachuReact,
- ReelTime_WaitClearPikaPower,
- ReelTime_CloseWindow,
- ReelTime_DestroySprites,
- ReelTime_SetReelIncrement,
- ReelTime_EndSuccess,
- ReelTime_ExplodeMachine,
- ReelTime_WaitExplode,
- ReelTime_WaitSmoke,
- ReelTime_CloseWindow,
- ReelTime_EndFailure
+ [RT_TASK_INIT] = ReelTime_Init,
+ [RT_TASK_WINDOW_ENTER] = ReelTime_WindowEnter,
+ [RT_TASK_WAIT_START_PIKA] = ReelTime_WaitStartPikachu,
+ [RT_TASK_PIKA_SPEEDUP1] = ReelTime_PikachuSpeedUp1,
+ [RT_TASK_PIKA_SPEEDUP2] = ReelTime_PikachuSpeedUp2,
+ [RT_TASK_WAIT_REEL] = ReelTime_WaitReel,
+ [RT_TASK_CHECK_EXPLODE] = ReelTime_CheckExplode,
+ [RT_TASK_LAND] = ReelTime_LandOnOutcome,
+ [RT_TASK_PIKA_REACT] = ReelTime_PikachuReact,
+ [RT_TASK_WAIT_CLEAR_POWER] = ReelTime_WaitClearPikaPower,
+ [RT_TASK_CLOSE_WINDOW_SUCCESS] = ReelTime_CloseWindow,
+ [RT_TASK_DESTROY_SPRITES] = ReelTime_DestroySprites,
+ [RT_TASK_SET_REEL_SPEED] = ReelTime_SetReelSpeed,
+ [RT_TASK_END_SUCCESS] = ReelTime_EndSuccess,
+ [RT_TASK_EXPLODE] = ReelTime_ExplodeMachine,
+ [RT_TASK_WAIT_EXPLODE] = ReelTime_WaitExplode,
+ [RT_TASK_WAIT_SMOKE] = ReelTime_WaitSmoke,
+ [RT_TASK_CLOSE_WINDOW_FAILURE] = ReelTime_CloseWindow,
+ [RT_TASK_END_FAILURE] = ReelTime_EndFailure,
};
static const u8 sReelTimePikachuAnimIds[] = {1, 1, 2, 2};
static const s16 sReelTimeBoltDelays[] = {64, 48, 24, 8};
static const s16 sPikachuAuraFlashDelays[] = {10, 8, 6, 4};
-static void (*const sInfoBoxActions[])(struct Task *task) =
+static void (*const sInfoBoxTasks[])(struct Task *task) =
{
// Go to Info screen
InfoBox_FadeIn,
- InfoBox_WaitForFade,
+ InfoBox_WaitFade,
InfoBox_DrawWindow,
- InfoBox_WaitForFade,
+ InfoBox_WaitFade,
InfoBox_AddText,
- InfoBox_WaitForFade,
+ InfoBox_WaitFade,
// On Info screen
- InfoBox_AwaitPlayerInput,
+ InfoBox_WaitInput,
// Exit Info screen
- InfoBox_WaitForFade,
+ InfoBox_WaitFade,
InfoBox_LoadSlotMachineTilemap,
- InfoBox_WaitForFade,
+ InfoBox_WaitFade,
InfoBox_CreateDigitalDisplay,
- InfoBox_WaitForFade,
+ InfoBox_WaitFade,
InfoBox_LoadPikaPowerMeter,
- InfoBox_WaitForFade,
+ InfoBox_WaitFade,
InfoBox_FreeTask,
};
// Just idles, digital display is handled by CreateDigitalDisplayScene and sprite callbacks
-static void (*const sDigitalDisplayActions[])(struct Task *task) =
+static void (*const sDigitalDisplayTasks[])(struct Task *task) =
{
DigitalDisplay_Idle,
};
-
-
-
-// code
#define tState data[0]
static void Task_FadeToSlotMachine(u8 taskId)
@@ -889,12 +1017,12 @@ static void Task_FadeToSlotMachine(u8 taskId)
}
}
-void PlaySlotMachine(u8 slotMachineIndex, MainCallback exitCallback)
+void PlaySlotMachine(u8 machineId, MainCallback exitCallback)
{
u8 taskId;
sSlotMachine = AllocZeroed(sizeof(*sSlotMachine));
- PlaySlotMachine_Internal(slotMachineIndex, exitCallback);
+ PlaySlotMachine_Internal(machineId, exitCallback);
taskId = CreateTask(Task_FadeToSlotMachine, 0);
gTasks[taskId].tState = 0;
}
@@ -907,7 +1035,7 @@ static void CB2_SlotMachineSetup(void)
{
case 0:
SlotMachineSetup_InitBgsWindows();
- SlotMachineSetup_InitSlotMachineStruct();
+ InitSlotMachine();
gMain.state++;
break;
case 1:
@@ -981,25 +1109,31 @@ static void SlotMachine_VBlankCB(void)
SetGpuReg(REG_OFFSET_WINOUT, sSlotMachine->winOut);
}
-static void PlaySlotMachine_Internal(u8 slotMachineIndex, MainCallback exitCallback)
+#define tMachineId data[0]
+#define tExitCallback data[1]
+
+static void PlaySlotMachine_Internal(u8 machineId, MainCallback exitCallback)
{
struct Task *task = &gTasks[CreateTask(SlotMachineDummyTask, 0xFF)];
- task->data[0] = slotMachineIndex;
- StoreWordInTwoHalfwords(&task->data[1], (intptr_t)exitCallback);
+ task->tMachineId = machineId;
+ StoreWordInTwoHalfwords(&task->tExitCallback, (intptr_t)exitCallback);
}
-
-static void SlotMachineInitDummyTask(void)
+// Extracts and assigns machineId and exit callback from task.
+static void SlotMachine_InitFromTask(void)
{
struct Task *task = &gTasks[FindTaskIdByFunc(SlotMachineDummyTask)];
- sSlotMachine->machineId = task->data[0];
- LoadWordFromTwoHalfwords((u16 *)&task->data[1], (u32 *)&sSlotMachine->prevMainCb);
+ sSlotMachine->machineId = task->tMachineId;
+ LoadWordFromTwoHalfwords((u16 *)&task->tExitCallback, (u32 *)&sSlotMachine->prevMainCb);
}
static void SlotMachineDummyTask(u8 taskId)
{
}
+#undef tMachineId
+#undef tExitCallback
+
static void SlotMachineSetup_InitBgsWindows(void)
{
SetVBlankCallback(NULL);
@@ -1048,25 +1182,25 @@ static void SlotMachineSetup_InitGpuRegs(void)
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(9, 8));
}
-// set up initial state of slot machine
-static void SlotMachineSetup_InitSlotMachineStruct(void)
+// Set up initial state of slot machine
+static void InitSlotMachine(void)
{
u8 i;
- SlotMachineInitDummyTask(); // assigns sSlotMachine->machineId, etc.
- sSlotMachine->state = 0;
- sSlotMachine->pikaPower = 0;
+ SlotMachine_InitFromTask();
+ sSlotMachine->state = SLOTTASK_UNFADE;
+ sSlotMachine->pikaPowerBolts = 0;
sSlotMachine->luckyGame = Random() & 1;
- sSlotMachine->luckyFlags = 0;
- sSlotMachine->matchedSymbols = 0;
+ sSlotMachine->machineBias = 0;
+ sSlotMachine->matches = 0;
sSlotMachine->reelTimeSpinsLeft = 0;
sSlotMachine->reelTimeSpinsUsed = 0;
sSlotMachine->coins = GetCoins();
sSlotMachine->payout = 0;
sSlotMachine->netCoinLoss = 0;
sSlotMachine->bet = 0;
- sSlotMachine->currReel = 0;
- sSlotMachine->reelIncrement = 8;
+ sSlotMachine->currentReel = LEFT_REEL;
+ sSlotMachine->reelSpeed = REEL_NORMAL_SPEED;
sSlotMachine->win0h = DISPLAY_WIDTH;
sSlotMachine->win0v = DISPLAY_HEIGHT;
sSlotMachine->winIn = WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR;
@@ -1075,10 +1209,10 @@ static void SlotMachineSetup_InitSlotMachineStruct(void)
for (i = 0; i < NUM_REELS; i++)
{
- sSlotMachine->reelPixelOffsetsWhileStopping[i] = 0;
+ sSlotMachine->reelShockOffsets[i] = 0;
sSlotMachine->reelPositions[i] = sInitialReelPositions[i][sSlotMachine->luckyGame] % SYMBOLS_PER_REEL;
- sSlotMachine->reelPixelOffsets[i] = SYMBOLS_PER_REEL * REEL_SYMBOL_HEIGHT - sSlotMachine->reelPositions[i] * REEL_SYMBOL_HEIGHT;
- sSlotMachine->reelPixelOffsets[i] %= SYMBOLS_PER_REEL * REEL_SYMBOL_HEIGHT;
+ sSlotMachine->reelPixelOffsets[i] = REEL_HEIGHT - sSlotMachine->reelPositions[i] * REEL_SYMBOL_HEIGHT;
+ sSlotMachine->reelPixelOffsets[i] %= REEL_HEIGHT;
}
AlertTVThatPlayerPlayedSlotMachine(GetCoins());
}
@@ -1129,89 +1263,92 @@ static void CreateSlotMachineSprites(void)
static void CreateGameplayTasks(void)
{
CreatePikaPowerBoltTask();
- CreateSlotReelTasks();
+ CreateReelTasks();
CreateDigitalDisplayTask();
- CreateSlotMachineTask();
+ CreateSlotMachineTasks();
}
-static void CreateSlotMachineTask(void)
+static void CreateSlotMachineTasks(void)
{
Task_SlotMachine(CreateTask(Task_SlotMachine, 0));
}
-// task->data[0] is a timer
static void Task_SlotMachine(u8 taskId)
{
- while (sSlotActions[sSlotMachine->state](&gTasks[taskId]))
+ while (sSlotTasks[sSlotMachine->state](&gTasks[taskId]))
;
}
-// SLOT_ACTION_UNFADE
-static bool8 SlotAction_UnfadeScreen(struct Task *task)
+#define tTimer data[0]
+#define tTimer2 data[1]
+
+// SLOTTASK_UNFADE
+static bool8 SlotTask_UnfadeScreen(struct Task *task)
{
BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB(0, 0, 0));
- LoadPikaPowerMeter(sSlotMachine->pikaPower);
- sSlotMachine->state++; // SLOT_ACTION_WAIT_FADE
+ LoadPikaPowerMeter(sSlotMachine->pikaPowerBolts);
+ sSlotMachine->state++; // SLOTTASK_WAIT_FADE
return FALSE;
}
-// SLOT_ACTION_WAIT_FADE
-static bool8 SlotAction_WaitForUnfade(struct Task *task)
+// SLOTTASK_WAIT_FADE
+static bool8 SlotTask_WaitUnfade(struct Task *task)
{
if (!gPaletteFade.active)
sSlotMachine->state++;
return FALSE;
}
-// SLOT_ACTION_READY_NEW_SPIN
-static bool8 SlotAction_ReadyNewSpin(struct Task *task)
+// SLOTTASK_READY_NEW_SPIN
+static bool8 SlotTask_ReadyNewSpin(struct Task *task)
{
sSlotMachine->payout = 0;
sSlotMachine->bet = 0;
- sSlotMachine->currReel = 0;
- sSlotMachine->luckyFlags &= (LUCKY_BIAS_777 | LUCKY_BIAS_MIXED_777);
- sSlotMachine->state = SLOT_ACTION_ASK_INSERT_BET;
+ sSlotMachine->currentReel = LEFT_REEL;
+ sSlotMachine->machineBias &= (BIAS_STRAIGHT_7 | BIAS_MIXED_7);
+ sSlotMachine->state = SLOTTASK_ASK_INSERT_BET;
if (sSlotMachine->coins <= 0)
{
- sSlotMachine->state = SLOT_ACTION_MSG_NO_MORE_COINS;
+ sSlotMachine->state = SLOTTASK_MSG_NO_MORE_COINS;
}
else if (sSlotMachine->reelTimeSpinsLeft)
{
- sSlotMachine->state = SLOT_ACTION_READY_NEW_RT_SPIN;
+ sSlotMachine->state = SLOTTASK_READY_NEW_RT_SPIN;
CreateDigitalDisplayScene(DIG_DISPLAY_REEL_TIME);
}
return TRUE;
}
-// SLOT_ACTION_READY_NEW_RT_SPIN
-static bool8 SlotAction_ReadyNewReelTimeSpin(struct Task *task)
+// SLOTTASK_READY_NEW_RT_SPIN
+static bool8 SlotTask_ReadyNewReelTimeSpin(struct Task *task)
{
if (IsDigitalDisplayAnimFinished())
- sSlotMachine->state = SLOT_ACTION_ASK_INSERT_BET;
+ sSlotMachine->state = SLOTTASK_ASK_INSERT_BET;
return FALSE;
}
-// SLOT_ACTION_ASK_INSERT_BET
-static bool8 SlotAction_AskInsertBet(struct Task *task)
+// SLOTTASK_ASK_INSERT_BET
+static bool8 SlotTask_AskInsertBet(struct Task *task)
{
CreateDigitalDisplayScene(DIG_DISPLAY_INSERT_BET);
- sSlotMachine->state = SLOT_ACTION_BET_INPUT;
+ sSlotMachine->state = SLOTTASK_BET_INPUT;
if (sSlotMachine->coins >= MAX_COINS)
- sSlotMachine->state = SLOT_ACTION_MSG_MAX_COINS;
+ sSlotMachine->state = SLOTTASK_MSG_MAX_COINS;
return TRUE;
}
-// SLOT_ACTION_BET_INPUT
-static bool8 SlotAction_HandleBetInput(struct Task *task)
+// SLOTTASK_BET_INPUT
+static bool8 SlotTask_HandleBetInput(struct Task *task)
{
s16 i;
if (JOY_NEW(SELECT_BUTTON))
{
OpenInfoBox(DIG_DISPLAY_INSERT_BET);
- sSlotMachine->state = SLOT_ACTION_WAIT_INFO_BOX;
+ sSlotMachine->state = SLOTTASK_WAIT_INFO_BOX;
}
- else if (JOY_NEW(R_BUTTON)) // bet the max amount
+ // Try to bet the max amount
+ else if (JOY_NEW(R_BUTTON))
{
if (sSlotMachine->coins - (MAX_BET - sSlotMachine->bet) >= 0)
{
@@ -1219,12 +1356,13 @@ static bool8 SlotAction_HandleBetInput(struct Task *task)
LightenBetTiles(i);
sSlotMachine->coins -= (MAX_BET - sSlotMachine->bet);
sSlotMachine->bet = MAX_BET;
- sSlotMachine->state = SLOT_ACTION_START_SPIN;
+ sSlotMachine->state = SLOTTASK_START_SPIN;
PlaySE(SE_SHOP);
}
- else // you didn't have enough coins to bet the max
+ // Not enough coins
+ else
{
- sSlotMachine->state = SLOT_ACTION_MSG_NEED_3_COINS;
+ sSlotMachine->state = SLOTTASK_MSG_NEED_3_COINS;
}
}
else
@@ -1240,48 +1378,48 @@ static bool8 SlotAction_HandleBetInput(struct Task *task)
// Maxed bet or finished betting
if (sSlotMachine->bet >= MAX_BET || (sSlotMachine->bet != 0 && JOY_NEW(A_BUTTON)))
- sSlotMachine->state = SLOT_ACTION_START_SPIN;
+ sSlotMachine->state = SLOTTASK_START_SPIN;
// Quit prompt
if (JOY_NEW(B_BUTTON))
- sSlotMachine->state = SLOT_ACTION_ASK_QUIT;
+ sSlotMachine->state = SLOTTASK_ASK_QUIT;
}
return FALSE;
}
-// SLOT_ACTION_NEED_3_COINS
-static bool8 SlotAction_PrintMsg_Need3Coins(struct Task *task)
+// SLOTTASK_MSG_NEED_3_COINS
+static bool8 SlotTask_PrintMsg_Need3Coins(struct Task *task)
{
DrawDialogueFrame(0, 0);
AddTextPrinterParameterized(0, FONT_NORMAL, gText_YouDontHaveThreeCoins, 0, 1, 0, 0);
CopyWindowToVram(0, COPYWIN_FULL);
- sSlotMachine->state = SLOT_ACTION_WAIT_MSG_NEED_3_COINS;
+ sSlotMachine->state = SLOTTASK_WAIT_MSG_NEED_3_COINS;
return FALSE;
}
-// SLOT_ACTION_WAIT_MSG_NEED_3_COINS
-static bool8 SlotAction_WaitMsg_Need3Coins(struct Task *task)
+// SLOTTASK_WAIT_MSG_NEED_3_COINS
+static bool8 SlotTask_WaitMsg_Need3Coins(struct Task *task)
{
if (JOY_NEW(A_BUTTON | B_BUTTON))
{
ClearDialogWindowAndFrame(0, TRUE);
- sSlotMachine->state = SLOT_ACTION_BET_INPUT;
+ sSlotMachine->state = SLOTTASK_BET_INPUT;
}
return FALSE;
}
-// SLOT_ACTION_WAIT_INFO_BOX
-static bool8 SlotAction_WaitForInfoBox(struct Task *task)
+// SLOTTASK_WAIT_INFO_BOX
+static bool8 SlotTask_WaitInfoBox(struct Task *task)
{
if (IsInfoBoxClosed())
- sSlotMachine->state = SLOT_ACTION_BET_INPUT;
+ sSlotMachine->state = SLOTTASK_BET_INPUT;
return FALSE;
}
-// SLOT_ACTION_START_SPIN
-static bool8 SlotAction_StartSpin(struct Task *task)
+// SLOTTASK_START_SPIN
+static bool8 SlotTask_StartSpin(struct Task *task)
{
- DrawLuckyFlags();
+ DrawMachineBias();
DestroyDigitalDisplayScene();
SpinSlotReel(LEFT_REEL);
@@ -1290,79 +1428,79 @@ static bool8 SlotAction_StartSpin(struct Task *task)
IncrementDailySlotsUses();
- task->data[0] = 0;
- if (sSlotMachine->luckyFlags & LUCKY_BIAS_REELTIME)
+ task->tTimer = 0;
+ if (sSlotMachine->machineBias & BIAS_REELTIME)
{
BeginReelTime();
- sSlotMachine->state = SLOT_ACTION_START_RT_SPIN;
+ sSlotMachine->state = SLOTTASK_START_RT_SPIN;
}
else
{
CreateDigitalDisplayScene(DIG_DISPLAY_STOP_REEL);
- sSlotMachine->state = SLOT_ACTION_SET_LUCKY_SPINS;
+ sSlotMachine->state = SLOTTASK_RESET_BIAS_FAILURE;
}
- sSlotMachine->reelIncrement = 8;
+ sSlotMachine->reelSpeed = REEL_NORMAL_SPEED;
if (sSlotMachine->reelTimeSpinsLeft)
- sSlotMachine->reelIncrement = SlowReelSpeed();
+ sSlotMachine->reelSpeed = ReelTimeSpeed();
return FALSE;
}
-// SLOT_ACTION_START_RT_SPIN
-static bool8 SlotAction_StartReelTimeSpin(struct Task *task)
+// SLOTTASK_START_RT_SPIN
+static bool8 SlotTask_StartReelTimeSpin(struct Task *task)
{
if (IsReelTimeTaskDone())
{
CreateDigitalDisplayScene(DIG_DISPLAY_STOP_REEL);
- sSlotMachine->luckyFlags &= ~LUCKY_BIAS_REELTIME;
- sSlotMachine->state = SLOT_ACTION_SET_LUCKY_SPINS;
+ sSlotMachine->machineBias &= ~BIAS_REELTIME;
+ sSlotMachine->state = SLOTTASK_RESET_BIAS_FAILURE;
}
return FALSE;
}
-// SLOT_ACTION_SET_LUCKY_SPINS
-static bool8 SlotAction_SetLuckySpins(struct Task *task)
+// SLOTTASK_RESET_BIAS_FAILURE
+static bool8 SlotTask_ResetBiasFailure(struct Task *task)
{
- if (++task->data[0] >= 30)
+ if (++task->tTimer >= 30)
{
- SetLuckySpins();
- sSlotMachine->state = SLOT_ACTION_AWAIT_REEL_STOP;
+ ResetBiasFailure();
+ sSlotMachine->state = SLOTTASK_WAIT_REEL_STOP;
}
return FALSE;
}
-// SLOT_ACTION_AWAIT_REEL_STOP
-static bool8 SlotAction_AwaitReelStop(struct Task *task)
+// SLOTTASK_WAIT_REEL_STOP
+static bool8 SlotTask_WaitReelStop(struct Task *task)
{
if (JOY_NEW(A_BUTTON))
{
PlaySE(SE_CONTEST_PLACE);
- StopSlotReel(sSlotMachine->currReel);
- PressStopReelButton(sSlotMachine->currReel);
- sSlotMachine->state = SLOT_ACTION_AWAIT_ALL_REELS_STOP;
+ StopSlotReel(sSlotMachine->currentReel);
+ PressStopReelButton(sSlotMachine->currentReel);
+ sSlotMachine->state = SLOTTASK_WAIT_ALL_REELS_STOP;
}
return FALSE;
}
-// SLOT_ACTION_AWAIT_ALL_REELS_STOP
-static bool8 SlotAction_WaitForAllReelsToStop(struct Task *task)
+// SLOTTASK_WAIT_ALL_REELS_STOP
+static bool8 SlotTask_WaitAllReelsStop(struct Task *task)
{
- if (!IsSlotReelMoving(sSlotMachine->currReel))
+ if (!IsSlotReelMoving(sSlotMachine->currentReel))
{
- sSlotMachine->currReel++;
- sSlotMachine->state = SLOT_ACTION_AWAIT_REEL_STOP;
- if (sSlotMachine->currReel >= NUM_REELS)
+ sSlotMachine->currentReel++;
+ sSlotMachine->state = SLOTTASK_WAIT_REEL_STOP;
+ if (sSlotMachine->currentReel >= NUM_REELS)
{
- sSlotMachine->state = SLOT_ACTION_CHECK_MATCHES;
+ sSlotMachine->state = SLOTTASK_CHECK_MATCHES;
}
return TRUE;
}
return FALSE;
}
-// SLOT_ACTION_CHECK_MATCHES
-static bool8 SlotAction_CheckMatches(struct Task *task)
+// SLOTTASK_CHECK_MATCHES
+static bool8 SlotTask_CheckMatches(struct Task *task)
{
- sSlotMachine->luckyFlags &= (LUCKY_BIAS_777 | LUCKY_BIAS_MIXED_777);
+ sSlotMachine->machineBias &= (BIAS_STRAIGHT_7 | BIAS_MIXED_7);
CheckMatch();
if (sSlotMachine->reelTimeSpinsLeft)
{
@@ -1370,21 +1508,21 @@ static bool8 SlotAction_CheckMatches(struct Task *task)
sSlotMachine->reelTimeSpinsUsed++;
}
- if (sSlotMachine->matchedSymbols)
+ if (sSlotMachine->matches)
{
- sSlotMachine->state = SLOT_ACTION_WAIT_PAYOUT;
+ sSlotMachine->state = SLOTTASK_WAIT_PAYOUT;
AwardPayout();
FlashSlotMachineLights();
if ((sSlotMachine->netCoinLoss -= sSlotMachine->payout) < 0)
{
sSlotMachine->netCoinLoss = 0;
}
- if (sSlotMachine->matchedSymbols & ((1 << MATCHED_777_BLUE) | (1 << MATCHED_777_RED)))
+ if (sSlotMachine->matches & ((1 << MATCH_BLUE_7) | (1 << MATCH_RED_7)))
{
PlayFanfare(MUS_SLOTS_JACKPOT);
CreateDigitalDisplayScene(DIG_DISPLAY_BONUS_BIG);
}
- else if (sSlotMachine->matchedSymbols & (1 << MATCHED_777_MIXED))
+ else if (sSlotMachine->matches & (1 << MATCH_MIXED_7))
{
PlayFanfare(MUS_SLOTS_JACKPOT);
CreateDigitalDisplayScene(DIG_DISPLAY_BONUS_REG);
@@ -1394,212 +1532,212 @@ static bool8 SlotAction_CheckMatches(struct Task *task)
PlayFanfare(MUS_SLOTS_WIN);
CreateDigitalDisplayScene(DIG_DISPLAY_WIN);
}
- // if you matched 777...
- if (sSlotMachine->matchedSymbols & ((1 << MATCHED_777_MIXED) | (1 << MATCHED_777_BLUE) | (1 << MATCHED_777_RED)))
+
+ if (sSlotMachine->matches & ((1 << MATCH_MIXED_7) | (1 << MATCH_BLUE_7) | (1 << MATCH_RED_7)))
{
- sSlotMachine->luckyFlags &= ~(LUCKY_BIAS_777 | LUCKY_BIAS_MIXED_777);
- if (sSlotMachine->matchedSymbols & ((1 << MATCHED_777_BLUE) | (1 << MATCHED_777_RED)))
+ sSlotMachine->machineBias &= ~(BIAS_STRAIGHT_7 | BIAS_MIXED_7);
+ if (sSlotMachine->matches & ((1 << MATCH_BLUE_7) | (1 << MATCH_RED_7)))
{
+ // ReelTime ends if it was ongoing
sSlotMachine->reelTimeSpinsLeft = 0;
sSlotMachine->reelTimeSpinsUsed = 0;
sSlotMachine->luckyGame = FALSE;
- if (sSlotMachine->matchedSymbols & (1 << MATCHED_777_BLUE))
- // this may be an error, but if you get blue 777, the game becomes lucky
+ if (sSlotMachine->matches & (1 << MATCH_BLUE_7))
sSlotMachine->luckyGame = TRUE;
}
}
- if (sSlotMachine->matchedSymbols & (1 << MATCHED_POWER) && sSlotMachine->pikaPower < 16)
+ if (sSlotMachine->matches & (1 << MATCH_POWER) && sSlotMachine->pikaPowerBolts < 16)
{
- sSlotMachine->pikaPower++;
- AddPikaPowerBolt(sSlotMachine->pikaPower);
+ sSlotMachine->pikaPowerBolts++;
+ AddPikaPowerBolt(sSlotMachine->pikaPowerBolts);
}
}
else
{
CreateDigitalDisplayScene(DIG_DISPLAY_LOSE);
- sSlotMachine->state = SLOT_ACTION_NO_MATCHES;
+ sSlotMachine->state = SLOTTASK_NO_MATCHES;
if ((sSlotMachine->netCoinLoss += sSlotMachine->bet) > MAX_COINS)
sSlotMachine->netCoinLoss = MAX_COINS;
}
return FALSE;
}
-// SLOT_ACTION_WAIT_PAYOUT
-static bool8 SlotAction_WaitForPayoutToBeAwarded(struct Task *task)
+// SLOTTASK_WAIT_PAYOUT
+static bool8 SlotTask_WaitPayout(struct Task *task)
{
- if (IsFinalTask_RunAwardPayoutActions())
- sSlotMachine->state = SLOT_ACTION_END_PAYOUT;
+ if (IsFinalTask_Task_Payout())
+ sSlotMachine->state = SLOTTASK_END_PAYOUT;
return FALSE;
}
-// SLOT_ACTION_END_PAYOUT
-static bool8 SlotAction_EndPayout(struct Task *task)
+// SLOTTASK_END_PAYOUT
+static bool8 SlotTask_EndPayout(struct Task *task)
{
if (TryStopSlotMachineLights())
{
- sSlotMachine->state = SLOT_ACTION_RESET_BET_TILES;
+ sSlotMachine->state = SLOTTASK_RESET_BET_TILES;
- if (sSlotMachine->matchedSymbols & ((1 << MATCHED_777_RED) | (1 << MATCHED_777_BLUE)))
+ if (sSlotMachine->matches & ((1 << MATCH_RED_7) | (1 << MATCH_BLUE_7)))
IncrementGameStat(GAME_STAT_SLOT_JACKPOTS);
- if (sSlotMachine->matchedSymbols & (1 << MATCHED_REPLAY))
+ if (sSlotMachine->matches & (1 << MATCH_REPLAY))
{
- sSlotMachine->currReel = 0;
- sSlotMachine->state = SLOT_ACTION_START_SPIN;
+ sSlotMachine->currentReel = LEFT_REEL;
+ sSlotMachine->state = SLOTTASK_START_SPIN;
}
- if (sSlotMachine->matchedSymbols & (1 << MATCHED_POWER))
- sSlotMachine->state = SLOT_ACTION_MATCHED_POWER;
+ if (sSlotMachine->matches & (1 << MATCH_POWER))
+ sSlotMachine->state = SLOTTASK_MATCHED_POWER;
- if (sSlotMachine->reelTimeSpinsLeft && sSlotMachine->matchedSymbols & (1 << MATCHED_REPLAY))
+ if (sSlotMachine->reelTimeSpinsLeft && sSlotMachine->matches & (1 << MATCH_REPLAY))
{
CreateDigitalDisplayScene(DIG_DISPLAY_REEL_TIME);
- sSlotMachine->state = SLOT_ACTION_WAIT_RT_ANIM;
+ sSlotMachine->state = SLOTTASK_WAIT_RT_ANIM;
}
}
return FALSE;
}
-// SLOT_ACTION_MATCHED_POWER
-static bool8 SlotAction_MatchedPower(struct Task *task)
+// SLOTTASK_MATCHED_POWER
+static bool8 SlotTask_MatchedPower(struct Task *task)
{
if (!IsPikaPowerBoltAnimating())
{
- sSlotMachine->state = SLOT_ACTION_RESET_BET_TILES;
- if (sSlotMachine->matchedSymbols & (1 << MATCHED_REPLAY))
+ sSlotMachine->state = SLOTTASK_RESET_BET_TILES;
+ if (sSlotMachine->matches & (1 << MATCH_REPLAY))
{
- sSlotMachine->state = SLOT_ACTION_START_SPIN;
+ sSlotMachine->state = SLOTTASK_START_SPIN;
if (sSlotMachine->reelTimeSpinsLeft)
{
CreateDigitalDisplayScene(DIG_DISPLAY_REEL_TIME);
- sSlotMachine->state = SLOT_ACTION_WAIT_RT_ANIM;
+ sSlotMachine->state = SLOTTASK_WAIT_RT_ANIM;
}
}
}
return FALSE;
}
-// SLOT_ACTION_WAIT_RT_ANIM
-static bool8 SlotAction_WaitReelTimeAnim(struct Task *task)
+// SLOTTASK_WAIT_RT_ANIM
+static bool8 SlotTask_WaitReelTimeAnim(struct Task *task)
{
if (IsDigitalDisplayAnimFinished())
{
- sSlotMachine->state = SLOT_ACTION_RESET_BET_TILES;
- if (sSlotMachine->matchedSymbols & (1 << MATCHED_REPLAY))
+ sSlotMachine->state = SLOTTASK_RESET_BET_TILES;
+ if (sSlotMachine->matches & (1 << MATCH_REPLAY))
{
- sSlotMachine->state = SLOT_ACTION_START_SPIN;
+ sSlotMachine->state = SLOTTASK_START_SPIN;
}
}
return FALSE;
}
-// SLOT_ACTION_RESET_BET_TILES
-static bool8 SlotAction_ResetBetTiles(struct Task *task)
+// SLOTTASK_RESET_BET_TILES
+static bool8 SlotTask_ResetBetTiles(struct Task *task)
{
DarkenBetTiles(0);
DarkenBetTiles(1);
DarkenBetTiles(2);
- sSlotMachine->state = SLOT_ACTION_READY_NEW_SPIN;
+ sSlotMachine->state = SLOTTASK_READY_NEW_SPIN;
return FALSE;
}
-// SLOT_ACTION_NO_MATCHES
-static bool8 SlotAction_NoMatches(struct Task *task)
+// SLOTTASK_NO_MATCHES
+static bool8 SlotTask_NoMatches(struct Task *task)
{
- if (++task->data[1] > 64)
+ if (++task->tTimer2 > 64)
{
- task->data[1] = 0;
- sSlotMachine->state = SLOT_ACTION_RESET_BET_TILES;
+ task->tTimer2 = 0;
+ sSlotMachine->state = SLOTTASK_RESET_BET_TILES;
}
return FALSE;
}
-// SLOT_ACTION_ASK_QUIT
-static bool8 SlotAction_AskQuit(struct Task *task)
+// SLOTTASK_ASK_QUIT
+static bool8 SlotTask_AskQuit(struct Task *task)
{
DrawDialogueFrame(0, 0);
AddTextPrinterParameterized(0, FONT_NORMAL, gText_QuitTheGame, 0, 1, 0, 0);
CopyWindowToVram(0, COPYWIN_FULL);
CreateYesNoMenuParameterized(0x15, 7, 0x214, 0x180, 0xE, 0xF);
- sSlotMachine->state = SLOT_ACTION_HANDLE_QUIT_INPUT;
+ sSlotMachine->state = SLOTTASK_HANDLE_QUIT_INPUT;
return FALSE;
}
-// SLOT_ACTION_HANDLE_QUIT_INPUT
-static bool8 SlotAction_HandleQuitInput(struct Task *task)
+// SLOTTASK_HANDLE_QUIT_INPUT
+static bool8 SlotTask_HandleQuitInput(struct Task *task)
{
s8 input = Menu_ProcessInputNoWrapClearOnChoose();
- if (input == 0) // player chooses to quit
+ if (input == 0) // Chose to quit
{
ClearDialogWindowAndFrame(0, TRUE);
DarkenBetTiles(0);
DarkenBetTiles(1);
DarkenBetTiles(2);
sSlotMachine->coins += sSlotMachine->bet;
- sSlotMachine->state = SLOT_ACTION_END;
+ sSlotMachine->state = SLOTTASK_END;
}
- else if (input == 1 || input == -1) // player chooses not to quit
+ else if (input == 1 || input == -1) // Chose not to quit
{
ClearDialogWindowAndFrame(0, TRUE);
- sSlotMachine->state = SLOT_ACTION_BET_INPUT;
+ sSlotMachine->state = SLOTTASK_BET_INPUT;
}
return FALSE;
}
-// SLOT_ACTION_MSG_MAX_COINS
-static bool8 SlotAction_PrintMsg_9999Coins(struct Task *task)
+// SLOTTASK_MSG_MAX_COINS
+static bool8 SlotTask_PrintMsg_MaxCoins(struct Task *task)
{
DrawDialogueFrame(0, 0);
AddTextPrinterParameterized(0, FONT_NORMAL, gText_YouveGot9999Coins, 0, 1, 0, 0);
CopyWindowToVram(0, COPYWIN_FULL);
- sSlotMachine->state = SLOT_ACTION_WAIT_MSG_MAX_COINS;
+ sSlotMachine->state = SLOTTASK_WAIT_MSG_MAX_COINS;
return FALSE;
}
-// SLOT_ACTION_WAIT_MSG_MAX_COINS
-static bool8 SlotAction_WaitMsg_9999Coins(struct Task *task)
+// SLOTTASK_WAIT_MSG_MAX_COINS
+static bool8 SlotTask_WaitMsg_MaxCoins(struct Task *task)
{
if (JOY_NEW(A_BUTTON | B_BUTTON))
{
ClearDialogWindowAndFrame(0, TRUE);
- sSlotMachine->state = SLOT_ACTION_BET_INPUT;
+ sSlotMachine->state = SLOTTASK_BET_INPUT;
}
return FALSE;
}
-// SLOT_ACTION_MSG_NO_MORE_COINS
-static bool8 SlotAction_PrintMsg_NoMoreCoins(struct Task *task)
+// SLOTTASK_MSG_NO_MORE_COINS
+static bool8 SlotTask_PrintMsg_NoMoreCoins(struct Task *task)
{
DrawDialogueFrame(0, 0);
AddTextPrinterParameterized(0, FONT_NORMAL, gText_YouveRunOutOfCoins, 0, 1, 0, 0);
CopyWindowToVram(0, COPYWIN_FULL);
- sSlotMachine->state = SLOT_ACTION_WAIT_MSG_NO_MORE_COINS;
+ sSlotMachine->state = SLOTTASK_WAIT_MSG_NO_MORE_COINS;
return FALSE;
}
-// SLOT_ACTION_WAIT_MSG_NO_MORE_COINS
-static bool8 SlotAction_WaitMsg_NoMoreCoins(struct Task *task)
+// SLOTTASK_WAIT_MSG_NO_MORE_COINS
+static bool8 SlotTask_WaitMsg_NoMoreCoins(struct Task *task)
{
if (JOY_NEW(A_BUTTON | B_BUTTON))
{
ClearDialogWindowAndFrame(0, TRUE);
- sSlotMachine->state = SLOT_ACTION_END;
+ sSlotMachine->state = SLOTTASK_END;
}
return FALSE;
}
-// SLOT_ACTION_END
-static bool8 SlotAction_EndGame(struct Task *task)
+// SLOTTASK_END
+static bool8 SlotTask_EndGame(struct Task *task)
{
SetCoins(sSlotMachine->coins);
TryPutFindThatGamerOnAir(GetCoins());
BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB(0, 0, 0));
- sSlotMachine->state++; // SLOT_ACTION_FREE
+ sSlotMachine->state++; // SLOTTASK_FREE
return FALSE;
}
-// SLOT_ACTION_FREE
-static bool8 SlotAction_FreeDataStructures(struct Task *task)
+// SLOTTASK_FREE
+static bool8 SlotTask_FreeDataStructures(struct Task *task)
{
if (!gPaletteFade.active)
{
@@ -1640,93 +1778,122 @@ static bool8 SlotAction_FreeDataStructures(struct Task *task)
return FALSE;
}
-static void DrawLuckyFlags(void)
+# undef tTimer
+# undef tTimer2
+
+// Determine the biases for this round. There can be at most two biases, one of
+// which would need to be a ReelTime bias.
+//
+// HOW IT WORKS:
+// If the machine is already biased toward 7's, keep this bias.
+//
+// Otherwise, there are up to three draws. You first draw to see if you'll get
+// to draw a Special bias. If so, then you draw for the Special bias (and can
+// still potentially miss).
+//
+// If you didn't get to draw a Special bias, missed a Special bias, or drew a
+// ReelTime bias, then you can still try to draw a Regular bias.
+static void DrawMachineBias(void)
{
- u8 attempts;
+ u8 whichBias;
if (sSlotMachine->reelTimeSpinsLeft == 0)
{
- if (!(sSlotMachine->luckyFlags & (LUCKY_BIAS_777 | LUCKY_BIAS_MIXED_777)))
+ if (!(sSlotMachine->machineBias & (BIAS_STRAIGHT_7 | BIAS_MIXED_7)))
{
- if (IsThisRoundLucky())
+ if (ShouldTrySpecialBias())
{
- attempts = AttemptsAtLuckyFlags_Top3();
- if (attempts != ARRAY_COUNT(sLuckyFlagSettings_Top3)) // if you found a lucky number
+ whichBias = TrySelectBias_Special();
+ if (whichBias != ARRAY_COUNT(sBiasesSpecial)) // A bias was selected
{
- // attempts == 1: reelTime flag set
- sSlotMachine->luckyFlags |= sLuckyFlagSettings_Top3[attempts];
- if (attempts != 1)
- return;
+ sSlotMachine->machineBias |= sBiasesSpecial[whichBias];
+
+ // ReelTime was not selected; don't add other biases
+ if (whichBias != 1) return;
}
}
- // if it's not a lucky round or you got reel time, roll for the lower lucky flags
- attempts = AttemptsAtLuckyFlags_NotTop3();
- if (attempts != ARRAY_COUNT(sLuckyFlagSettings_NotTop3)) // if you found a lucky number
- sSlotMachine->luckyFlags |= sLuckyFlagSettings_NotTop3[attempts];
+
+ whichBias = TrySelectBias_Regular();
+ if (whichBias != ARRAY_COUNT(sBiasesRegular)) // A bias was selected
+ sSlotMachine->machineBias |= sBiasesRegular[whichBias];
}
}
}
-static void SetLuckySpins(void)
+// Reset `didNotFailBias` to match `machineBias`.
+static void ResetBiasFailure(void)
{
- sSlotMachine->isLuckySpin = FALSE;
- if (sSlotMachine->luckyFlags)
- sSlotMachine->isLuckySpin = TRUE;
+ sSlotMachine->didNotFailBias = FALSE;
+ if (sSlotMachine->machineBias)
+ sSlotMachine->didNotFailBias = TRUE;
}
-static u8 GetBiasTag(u8 luckyFlags)
+// See sBiasSymbols for each bias's corresponding symbol.
+static u8 GetBiasSymbol(u8 machineBias)
{
u8 i;
for (i = 0; i < 8; i++)
{
- if (luckyFlags & 1)
- return sBiasTags[i];
- luckyFlags >>= 1;
+ if (machineBias & 1)
+ return sBiasSymbols[i];
+ machineBias >>= 1;
}
return 0;
}
-// you have way more luck betting 3 coins than anything lower
-static bool8 IsThisRoundLucky(void)
+// Decides whether you will be given the opportunity to draw for a Special bias.
+// Depends on your bet and the machine you're using.
+//
+// The probability of getting to draw a Special is miniscule if you don't bet 3
+// coins: barely 1% even on the luckiest machine.
+//
+// The odds increase to roughly ~5% if you bet 3 coins.
+static bool8 ShouldTrySpecialBias(void)
{
u8 rval = Random();
- if (sLuckyRoundProbabilities[sSlotMachine->machineId][sSlotMachine->bet - 1] > rval)
+ if (sSpecialDrawOdds[sSlotMachine->machineId][sSlotMachine->bet - 1] > rval)
return TRUE;
return FALSE;
}
-static u8 AttemptsAtLuckyFlags_Top3(void)
+// Draws for a Special bias. Note that even when you're given the opportunity to
+// draw a Special bias, you can still miss.
+//
+// On the luckiest machine, there's a 61% chance of drawing no Special bias. On
+// the unluckiest, a 73% chance.
+static u8 TrySelectBias_Special(void)
{
- s16 count;
+ s16 whichBias;
- for (count = 0; count < (int)ARRAY_COUNT(sLuckyFlagSettings_Top3); count++)
+ for (whichBias = 0; whichBias < (int)ARRAY_COUNT(sBiasesSpecial); whichBias++)
{
s16 rval = Random() & 0xff;
- s16 value = sLuckyFlagProbabilities_Top3[count][sSlotMachine->machineId];
+ s16 value = sBiasProbabilities_Special[whichBias][sSlotMachine->machineId];
if (value > rval)
break;
}
- return count;
+ return whichBias;
}
-static u8 AttemptsAtLuckyFlags_NotTop3(void)
+static u8 TrySelectBias_Regular(void)
{
- s16 count;
+ s16 whichBias;
- for (count = 0; count < (int)ARRAY_COUNT(sLuckyFlagSettings_NotTop3); count++)
+ for (whichBias = 0; whichBias < (int)ARRAY_COUNT(sBiasesRegular); whichBias++)
{
- s16 rval = Random() & 0xff; // random byte
- s16 value = sLuckyFlagProbabilities_NotTop3[count][sSlotMachine->machineId];
- // make first attempt easier if it's a lucky game
- if (count == 0 && sSlotMachine->luckyGame == TRUE)
+ s16 rval = Random() & 0xff;
+ s16 value = sBiasProbabilities_Regular[whichBias][sSlotMachine->machineId];
+
+ // Boost odds of BIAS_POWER if it's a lucky game.
+ if (whichBias == 0 && sSlotMachine->luckyGame == TRUE)
{
value += 10;
if (value > 0x100)
value = 0x100;
}
- // make last attempt harder if it's a lucky game
- else if (count == 4 && sSlotMachine->luckyGame == TRUE)
+ // Reduce odds of BIAS_REPLAY if it's a lucky game
+ else if (whichBias == 4 && sSlotMachine->luckyGame == TRUE)
{
value -= 10;
if (value < 0)
@@ -1735,45 +1902,60 @@ static u8 AttemptsAtLuckyFlags_NotTop3(void)
if (value > rval)
break;
}
- return count;
+ return whichBias;
}
-static u8 GetReelTimeProbability(u8 reelTimeDraw)
+// Return the probability of drawing the given number of ReelTime spins.
+//
+// This depends on whether it is a lucky game and the number of Power bolts you
+// have collected.
+static u8 GetReelTimeSpinProbability(u8 spins)
{
if (sSlotMachine->luckyGame == FALSE)
- return sReeltimeProbabilities_UnluckyGame[reelTimeDraw][sSlotMachine->pikaPower];
+ return sReelTimeProbabilities_NormalGame[spins][sSlotMachine->pikaPowerBolts];
else
- return sReelTimeProbabilities_LuckyGame[reelTimeDraw][sSlotMachine->pikaPower];
+ return sReelTimeProbabilities_LuckyGame[spins][sSlotMachine->pikaPowerBolts];
}
-static void GetReeltimeDraw(void)
+// The way this is computed skews the odds much more toward drawing a 0 than
+// intended. It initially checks whether you draw a 0 (using the intended
+// probability). It then tries to draw positive values, but if these draws all
+// miss, you'll still draw a 0.
+//
+// As a result, even when the power gauge is maxed out, you still have a ~30%
+// chance of drawing 0 spins. See sReelTimeProbabilities for more details.
+//
+// Drawing a random number via a cumulative pdf would have prevented this.
+static void GetReelTimeDraw(void)
{
u8 rval;
- s16 reelTimeDraw;
+ s16 spins;
sSlotMachine->reelTimeDraw = 0;
rval = Random();
- if (rval < GetReelTimeProbability(0))
+ if (rval < GetReelTimeSpinProbability(0))
return;
- for (reelTimeDraw = 5; reelTimeDraw > 0; reelTimeDraw--)
+ for (spins = 5; spins > 0; spins--)
{
rval = Random();
- if (rval < GetReelTimeProbability(reelTimeDraw))
+ if (rval < GetReelTimeSpinProbability(spins))
break;
}
- sSlotMachine->reelTimeDraw = reelTimeDraw;
+ sSlotMachine->reelTimeDraw = spins;
}
-static bool8 ShouldReelTimeMachineExplode(u16 i)
+// Returns true if the ReelTime machine should explode. Each time we check,
+// the odds of explosion increase.
+static bool8 ShouldReelTimeMachineExplode(u16 check)
{
u16 rval = Random() & 0xff;
- if (rval < sReelTimeExplodeProbability[i])
+ if (rval < sReelTimeExplodeProbability[check])
return TRUE;
else
return FALSE;
}
-static u16 SlowReelSpeed(void)
+static u16 ReelTimeSpeed(void)
{
u8 i = 0;
u8 rval;
@@ -1786,20 +1968,23 @@ static u16 SlowReelSpeed(void)
i = 2;
else if (sSlotMachine->netCoinLoss >= 150)
i = 1;
+
rval = Random() % 100;
- value = sReelIncrementTable[i][0];
+ value = sReelTimeSpeed_Probabilities[i][0];
if (rval < value)
- return 4;
+ return REEL_HALF_SPEED;
+
rval = Random() % 100;
- value = sReelIncrementTable[i][1] + sReelTimeBonusIncrementTable[sSlotMachine->reelTimeSpinsUsed];
+ value = sReelTimeSpeed_Probabilities[i][1] + sQuarterSpeed_ProbabilityBoost[sSlotMachine->reelTimeSpinsUsed];
if (rval < value)
- return 2;
- return 8;
+ return REEL_QUARTER_SPEED;
+
+ return REEL_NORMAL_SPEED;
}
static void CheckMatch(void)
{
- sSlotMachine->matchedSymbols = 0;
+ sSlotMachine->matches = 0;
CheckMatch_CenterRow();
if (sSlotMachine->bet > 1)
CheckMatch_TopAndBottom();
@@ -1809,140 +1994,146 @@ static void CheckMatch(void)
static void CheckMatch_CenterRow(void)
{
- u8 c1, c2, c3, match;
+ u8 sym1, sym2, sym3, match;
- c1 = GetTagAtRest(LEFT_REEL, 2);
- c2 = GetTagAtRest(MIDDLE_REEL, 2);
- c3 = GetTagAtRest(RIGHT_REEL, 2);
- match = GetMatchFromSymbols(c1, c2, c3);
- if (match != MATCHED_NONE)
+ sym1 = GetSymbolAtRest(LEFT_REEL, 2);
+ sym2 = GetSymbolAtRest(MIDDLE_REEL, 2);
+ sym3 = GetSymbolAtRest(RIGHT_REEL, 2);
+ match = GetMatchFromSymbols(sym1, sym2, sym3);
+ if (match != MATCH_NONE)
{
sSlotMachine->payout += sSlotPayouts[match];
- sSlotMachine->matchedSymbols |= sSlotMatchFlags[match];
+ sSlotMachine->matches |= sSlotMatchFlags[match];
FlashMatchLine(MATCH_MIDDLE_ROW);
}
}
static void CheckMatch_TopAndBottom(void)
{
- u8 c1, c2, c3, match;
+ u8 sym1, sym2, sym3, match;
- c1 = GetTagAtRest(LEFT_REEL, 1);
- c2 = GetTagAtRest(MIDDLE_REEL, 1);
- c3 = GetTagAtRest(RIGHT_REEL, 1);
- match = GetMatchFromSymbols(c1, c2, c3);
- if (match != MATCHED_NONE)
+ sym1 = GetSymbolAtRest(LEFT_REEL, 1);
+ sym2 = GetSymbolAtRest(MIDDLE_REEL, 1);
+ sym3 = GetSymbolAtRest(RIGHT_REEL, 1);
+ match = GetMatchFromSymbols(sym1, sym2, sym3);
+ if (match != MATCH_NONE)
{
- if (match == MATCHED_1CHERRY)
- match = MATCHED_2CHERRY;
+ if (match == MATCH_CHERRY)
+ match = MATCH_TOPBOT_CHERRY;
sSlotMachine->payout += sSlotPayouts[match];
- sSlotMachine->matchedSymbols |= sSlotMatchFlags[match];
+ sSlotMachine->matches |= sSlotMatchFlags[match];
FlashMatchLine(MATCH_TOP_ROW);
}
- c1 = GetTagAtRest(LEFT_REEL, 3);
- c2 = GetTagAtRest(MIDDLE_REEL, 3);
- c3 = GetTagAtRest(RIGHT_REEL, 3);
- match = GetMatchFromSymbols(c1, c2, c3);
- if (match != MATCHED_NONE)
+ sym1 = GetSymbolAtRest(LEFT_REEL, 3);
+ sym2 = GetSymbolAtRest(MIDDLE_REEL, 3);
+ sym3 = GetSymbolAtRest(RIGHT_REEL, 3);
+ match = GetMatchFromSymbols(sym1, sym2, sym3);
+ if (match != MATCH_NONE)
{
- if (match == MATCHED_1CHERRY)
- match = MATCHED_2CHERRY;
+ if (match == MATCH_CHERRY)
+ match = MATCH_TOPBOT_CHERRY;
sSlotMachine->payout += sSlotPayouts[match];
- sSlotMachine->matchedSymbols |= sSlotMatchFlags[match];
+ sSlotMachine->matches |= sSlotMatchFlags[match];
FlashMatchLine(MATCH_BOTTOM_ROW);
}
}
static void CheckMatch_Diagonals(void)
{
- u8 c1, c2, c3, match;
+ u8 sym1, sym2, sym3, match;
- c1 = GetTagAtRest(LEFT_REEL, 1);
- c2 = GetTagAtRest(MIDDLE_REEL, 2);
- c3 = GetTagAtRest(RIGHT_REEL, 3);
- match = GetMatchFromSymbols(c1, c2, c3);
- if (match != MATCHED_NONE)
+ sym1 = GetSymbolAtRest(LEFT_REEL, 1);
+ sym2 = GetSymbolAtRest(MIDDLE_REEL, 2);
+ sym3 = GetSymbolAtRest(RIGHT_REEL, 3);
+ match = GetMatchFromSymbols(sym1, sym2, sym3);
+ if (match != MATCH_NONE)
{
- if (match != MATCHED_1CHERRY)
+ // Don't add payout for cherry, since it's already counted in
+ // CheckMatch_TopAndBottom().
+ if (match != MATCH_CHERRY)
{
sSlotMachine->payout += sSlotPayouts[match];
- sSlotMachine->matchedSymbols |= sSlotMatchFlags[match];
+ sSlotMachine->matches |= sSlotMatchFlags[match];
}
FlashMatchLine(MATCH_NWSE_DIAG);
}
- c1 = GetTagAtRest(LEFT_REEL, 3);
- c2 = GetTagAtRest(MIDDLE_REEL, 2);
- c3 = GetTagAtRest(RIGHT_REEL, 1);
- match = GetMatchFromSymbols(c1, c2, c3);
- if (match != MATCHED_NONE)
+ sym1 = GetSymbolAtRest(LEFT_REEL, 3);
+ sym2 = GetSymbolAtRest(MIDDLE_REEL, 2);
+ sym3 = GetSymbolAtRest(RIGHT_REEL, 1);
+ match = GetMatchFromSymbols(sym1, sym2, sym3);
+ if (match != MATCH_NONE)
{
- if (match != MATCHED_1CHERRY)
+ // Don't add payout for cherry, since it's already counted in
+ // CheckMatch_TopAndBottom().
+ if (match != MATCH_CHERRY)
{
sSlotMachine->payout += sSlotPayouts[match];
- sSlotMachine->matchedSymbols |= sSlotMatchFlags[match];
+ sSlotMachine->matches |= sSlotMatchFlags[match];
}
FlashMatchLine(MATCH_NESW_DIAG);
}
}
-static u8 GetMatchFromSymbols(u8 c1, u8 c2, u8 c3)
+static u8 GetMatchFromSymbols(u8 sym1, u8 sym2, u8 sym3)
{
- if (c1 == c2 && c1 == c3)
- return sSymToMatch[c1];
- if (c1 == GFXTAG_7_RED && c2 == GFXTAG_7_RED && c3 == GFXTAG_7_BLUE)
- return MATCHED_777_MIXED;
- if (c1 == GFXTAG_7_BLUE && c2 == GFXTAG_7_BLUE && c3 == GFXTAG_7_RED)
- return MATCHED_777_MIXED;
- if (c1 == GFXTAG_CHERRY)
- return MATCHED_1CHERRY;
- return MATCHED_NONE;
+ if (sym1 == sym2 && sym1 == sym3)
+ return sSymbolToMatch[sym1];
+ if (sym1 == SYMBOL_7_RED && sym2 == SYMBOL_7_RED && sym3 == SYMBOL_7_BLUE)
+ return MATCH_MIXED_7;
+ if (sym1 == SYMBOL_7_BLUE && sym2 == SYMBOL_7_BLUE && sym3 == SYMBOL_7_RED)
+ return MATCH_MIXED_7;
+ if (sym1 == SYMBOL_CHERRY)
+ return MATCH_CHERRY;
+ return MATCH_NONE;
}
static void AwardPayout(void)
{
- RunAwardPayoutActions(CreateTask(RunAwardPayoutActions, 4));
+ Task_Payout(CreateTask(Task_Payout, 4));
}
-static bool8 IsFinalTask_RunAwardPayoutActions(void)
+static bool8 IsFinalTask_Task_Payout(void)
{
- if (FindTaskIdByFunc(RunAwardPayoutActions) == TAIL_SENTINEL)
+ if (FindTaskIdByFunc(Task_Payout) == TAIL_SENTINEL)
return TRUE;
else
return FALSE;
}
-static void RunAwardPayoutActions(u8 taskId)
+static void Task_Payout(u8 taskId)
{
- while (sAwardPayoutActions[gTasks[taskId].data[0]](&gTasks[taskId]))
+ while (sPayoutTasks[gTasks[taskId].data[0]](&gTasks[taskId]))
;
}
-static bool8 AwardPayoutAction0(struct Task *task)
+#define tState data[0]
+#define tTimer data[1]
+
+static bool8 PayoutTask_Init(struct Task *task)
{
if (IsMatchLineDoneFlashingBeforePayout())
{
- task->data[0]++;
+ task->tState++; // PAYOUT_TASK_GIVE_PAYOUT
if (sSlotMachine->payout == 0)
{
- task->data[0] = 2;
+ task->tState = PAYOUT_TASK_FREE;
return TRUE;
}
}
return FALSE;
}
-// task->data[1]: timer
-static bool8 AwardPayoutAction_GivePayoutToPlayer(struct Task *task)
+static bool8 PayoutTask_GivePayout(struct Task *task)
{
- if (!task->data[1]--)
+ if (!task->tTimer--)
{
if (IsFanfareTaskInactive())
PlaySE(SE_PIN);
sSlotMachine->payout--;
if (sSlotMachine->coins < MAX_COINS)
sSlotMachine->coins++;
- task->data[1] = 8;
+ task->tTimer = 8;
if (JOY_HELD(A_BUTTON))
- task->data[1] = 4;
+ task->tTimer = 4;
}
if (IsFanfareTaskInactive() && JOY_NEW(START_BUTTON))
{
@@ -1953,19 +2144,22 @@ static bool8 AwardPayoutAction_GivePayoutToPlayer(struct Task *task)
sSlotMachine->payout = 0;
}
if (sSlotMachine->payout == 0)
- task->data[0]++;
+ task->tState++; // PAYOUT_TASK_FREE
return FALSE;
}
-static bool8 AwardPayoutAction_FreeTask(struct Task *task)
+static bool8 PayoutTask_Free(struct Task *task)
{
if (TryStopMatchLinesFlashing())
- DestroyTask(FindTaskIdByFunc(RunAwardPayoutActions));
+ DestroyTask(FindTaskIdByFunc(Task_Payout));
return FALSE;
}
-// Get the tag at position `offset` below the top of the reel's tape. Note that
-// if `offset` is negative, it wraps around to the bottom of the tape.
+#undef tState
+#undef tTimer
+
+// Get the symbol at position `offset` below the top of the reel's tape. Note
+// that if `offset` is negative, it wraps around to the bottom of the tape.
// .-----------------.
// | [ ] | [ ] | [ ] | <- offset = 0
// /-----|-----|-----\
@@ -1976,40 +2170,42 @@ static bool8 AwardPayoutAction_FreeTask(struct Task *task)
// | ... | ... | ... |
// | [ ] | [ ] | [ ] | <- offset = 20
// .-----------------.
-static u8 GetTagAtRest(u8 reel, s16 offset)
+static u8 GetSymbolAtRest(u8 reel, s16 offset)
{
s16 pos = (sSlotMachine->reelPositions[reel] + offset) % SYMBOLS_PER_REEL;
if (pos < 0)
pos += SYMBOLS_PER_REEL;
- return sReelSymbolTileTags[reel][pos];
+ return sReelSymbols[reel][pos];
}
-// Calculates GetTagAtRest as if the reel were snapped downwards into place.
-static u8 GetTag(u8 reel, s16 offset)
+// Calculates GetSymbolAtRest as if the reel were snapped downwards into place.
+static u8 GetSymbol(u8 reel, s16 offset)
{
s16 inc = 0;
s16 pixelOffset = sSlotMachine->reelPixelOffsets[reel] % REEL_SYMBOL_HEIGHT;
if (pixelOffset != 0)
inc = -1;
- return GetTagAtRest(reel, offset + inc);
+ return GetSymbolAtRest(reel, offset + inc);
}
-static u8 GetNearbyReelTimeTag(s16 n)
+static u8 GetReelTimeSymbol(s16 offset)
{
- s16 newPosition = (sSlotMachine->reeltimePosition + n) % 6;
+ s16 newPosition = (sSlotMachine->reeltimePosition + offset) % REELTIME_SYMBOLS;
if (newPosition < 0)
- newPosition += 6;
- return sReelTimeTags[newPosition];
+ newPosition += REELTIME_SYMBOLS;
+ return sReelTimeSymbols[newPosition];
}
static void AdvanceSlotReel(u8 reelIndex, s16 value)
{
sSlotMachine->reelPixelOffsets[reelIndex] += value;
- sSlotMachine->reelPixelOffsets[reelIndex] %= 504;
+ sSlotMachine->reelPixelOffsets[reelIndex] %= REEL_HEIGHT;
sSlotMachine->reelPositions[reelIndex] = SYMBOLS_PER_REEL - sSlotMachine->reelPixelOffsets[reelIndex] / REEL_SYMBOL_HEIGHT;
}
-s16 AdvanceSlotReelToNextTag(u8 reelIndex, s16 value)
+// Advances the reel no further than the next symbol. Returns the remaining
+// pixels until the next symbol.
+s16 AdvanceSlotReelToNextSymbol(u8 reelIndex, s16 value)
{
s16 offset = sSlotMachine->reelPixelOffsets[reelIndex] % REEL_SYMBOL_HEIGHT;
if (offset != 0)
@@ -2025,48 +2221,53 @@ s16 AdvanceSlotReelToNextTag(u8 reelIndex, s16 value)
static void AdvanceReeltimeReel(s16 value)
{
sSlotMachine->reeltimePixelOffset += value;
- sSlotMachine->reeltimePixelOffset %= 120;
- sSlotMachine->reeltimePosition = 6 - sSlotMachine->reeltimePixelOffset / 20;
+ sSlotMachine->reeltimePixelOffset %= REELTIME_REEL_HEIGHT;
+ sSlotMachine->reeltimePosition = REELTIME_SYMBOLS - sSlotMachine->reeltimePixelOffset / REELTIME_SYMBOL_HEIGHT;
}
-s16 AdvanceReeltimeReelToNextTag(s16 value)
+// Advances the reel no further than the next symbol. Returns the remaining
+// pixels until the next symbol.
+s16 AdvanceReeltimeReelToNextSymbol(s16 value)
{
- s16 offset = sSlotMachine->reeltimePixelOffset % 20;
+ s16 offset = sSlotMachine->reeltimePixelOffset % REELTIME_SYMBOL_HEIGHT;
if (offset != 0)
{
if (offset < value)
value = offset;
AdvanceReeltimeReel(value);
- offset = sSlotMachine->reeltimePixelOffset % 20;
+ offset = sSlotMachine->reeltimePixelOffset % REELTIME_SYMBOL_HEIGHT;
}
return offset;
}
-#define tState data[0]
-#define tMoving data[14]
-#define tReelId data[15]
+#define tState data[0]
+#define tExtraTurns data[1]
+#define tShockMagnitude data[1]
+#define tTimer data[2]
+#define tMoving data[14]
+#define tReelId data[15]
-static void CreateSlotReelTasks(void)
+static void CreateReelTasks(void)
{
u8 i;
for (i = 0; i < NUM_REELS; i++)
{
- u8 taskId = CreateTask(Task_RunSlotReelActions, 2);
+ u8 taskId = CreateTask(Task_Reel, 2);
gTasks[taskId].tReelId = i;
sSlotMachine->slotReelTasks[i] = taskId;
- Task_RunSlotReelActions(taskId);
+ Task_Reel(taskId);
}
}
static void SpinSlotReel(u8 reelIndex)
{
- gTasks[sSlotMachine->slotReelTasks[reelIndex]].tState = REEL_ACTION_SPIN;
+ gTasks[sSlotMachine->slotReelTasks[reelIndex]].tState = REEL_TASK_SPIN;
gTasks[sSlotMachine->slotReelTasks[reelIndex]].tMoving = TRUE;
}
static void StopSlotReel(u8 reelIndex)
{
- gTasks[sSlotMachine->slotReelTasks[reelIndex]].tState = REEL_ACTION_STOP;
+ gTasks[sSlotMachine->slotReelTasks[reelIndex]].tState = REEL_TASK_DECIDE_STOP;
}
static bool8 IsSlotReelMoving(u8 reelIndex)
@@ -2074,43 +2275,52 @@ static bool8 IsSlotReelMoving(u8 reelIndex)
return gTasks[sSlotMachine->slotReelTasks[reelIndex]].tMoving;
}
-static void Task_RunSlotReelActions(u8 taskId)
+static void Task_Reel(u8 taskId)
{
- while (sSlotReelActions[gTasks[taskId].tState](&gTasks[taskId]))
+ while (sReelTasks[gTasks[taskId].tState](&gTasks[taskId]))
;
}
-// task->data[1] reel turns
-static bool8 SlotReelAction_StayStill(struct Task *task)
+static bool8 ReelTask_StayStill(struct Task *task)
{
return FALSE;
}
-static bool8 SlotReelAction_Spin(struct Task *task)
+static bool8 ReelTask_Spin(struct Task *task)
{
- AdvanceSlotReel(task->tReelId, sSlotMachine->reelIncrement);
+ AdvanceSlotReel(task->tReelId, sSlotMachine->reelSpeed);
return FALSE;
}
-// As in previous generations, the slot machine often doesn't stop exactly when you press stop
-static bool8 SlotReelAction_DecideWhereToStop(struct Task *task)
+// In ReelTime, the reel stops immediately. Otherwise, the game may manipulate
+// the results by stopping after at most 4 extra turns. The exact behavior
+// differs depending on whether the machine has a bias.
+//
+// If the machine has a bias, it will try to match the bias symbol in each reel.
+//
+// Otherwise, if the machine doesn't have a bias or it could not line up the
+// bias symbol in any of the previous reels, it will perform the NoBias stopping
+// routine, which manipulates the outcome so the player loses.
+static bool8 ReelTask_DecideStop(struct Task *task)
{
- task->tState++;
- // initialize data for that reel --> these will be changed if sBiasTags can be lined up
+ task->tState++; // REEL_TASK_STOP_MOVE
sSlotMachine->winnerRows[task->tReelId] = 0;
sSlotMachine->reelExtraTurns[task->tReelId] = 0;
- if (sSlotMachine->reelTimeSpinsLeft == 0 && (sSlotMachine->luckyFlags == 0 || !sSlotMachine->isLuckySpin || !sDecideReelTurns_BiasTag[task->tReelId]()))
+ if (sSlotMachine->reelTimeSpinsLeft == 0)
{
- sSlotMachine->isLuckySpin = FALSE;
- sDecideReelTurns_NoBiasTag[task->tReelId]();
+ if (sSlotMachine->machineBias == 0 || !sSlotMachine->didNotFailBias || !sDecideStop_Bias[task->tReelId]())
+ {
+ sSlotMachine->didNotFailBias = FALSE;
+ sDecideStop_NoBias[task->tReelId]();
+ }
}
- task->data[1] = sSlotMachine->reelExtraTurns[task->tReelId];
+ task->tExtraTurns = sSlotMachine->reelExtraTurns[task->tReelId];
return TRUE;
}
-// go to next tag and then do any additional turns
-static bool8 SlotReelAction_MoveToStop(struct Task *task)
+// Go to the next symbol, then add any extra turns.
+static bool8 ReelTask_MoveToStop(struct Task *task)
{
u16 reelStopShocks[ARRAY_COUNT(sReelStopShocks)];
s16 reelPixelPos;
@@ -2118,112 +2328,147 @@ static bool8 SlotReelAction_MoveToStop(struct Task *task)
memcpy(reelStopShocks, sReelStopShocks, sizeof(sReelStopShocks));
reelPixelPos = sSlotMachine->reelPixelOffsets[task->tReelId] % REEL_SYMBOL_HEIGHT;
if (reelPixelPos != 0)
- reelPixelPos = AdvanceSlotReelToNextTag(task->tReelId, sSlotMachine->reelIncrement);
+ reelPixelPos = AdvanceSlotReelToNextSymbol(task->tReelId, sSlotMachine->reelSpeed);
else if (sSlotMachine->reelExtraTurns[task->tReelId])
{
sSlotMachine->reelExtraTurns[task->tReelId]--;
- AdvanceSlotReel(task->tReelId, sSlotMachine->reelIncrement);
+ AdvanceSlotReel(task->tReelId, sSlotMachine->reelSpeed);
reelPixelPos = sSlotMachine->reelPixelOffsets[task->tReelId] % REEL_SYMBOL_HEIGHT;
}
+
if (reelPixelPos == 0 && sSlotMachine->reelExtraTurns[task->tReelId] == 0)
{
- task->tState++;
- task->data[1] = reelStopShocks[task->data[1]];
- task->data[2] = 0;
+ task->tState++; // REEL_TASK_STOP_SHAKE
+ task->tShockMagnitude = reelStopShocks[task->tExtraTurns];
+ task->tTimer = 0;
}
return FALSE;
}
-// make selected tag oscillate before it becomes still
-static bool8 SlotReelAction_OscillatingStop(struct Task *task)
+// The reel shakes a little at the selected symbol before settling.
+static bool8 ReelTask_ShakingStop(struct Task *task)
{
- sSlotMachine->reelPixelOffsetsWhileStopping[task->tReelId] = task->data[1];
- task->data[1] = -task->data[1];
- task->data[2]++;
- if ((task->data[2] & 0x3) == 0)
- task->data[1] >>= 1;
- if (task->data[1] == 0)
+ sSlotMachine->reelShockOffsets[task->tReelId] = task->tShockMagnitude;
+ task->tShockMagnitude = -task->tShockMagnitude;
+ task->tTimer++;
+ if ((task->tTimer & 0x3) == 0)
+ task->tShockMagnitude >>= 1;
+ if (task->tShockMagnitude == 0)
{
task->tState = 0;
task->tMoving = FALSE;
- sSlotMachine->reelPixelOffsetsWhileStopping[task->tReelId] = 0;
+ sSlotMachine->reelShockOffsets[task->tReelId] = 0;
}
return FALSE;
}
#undef tState
+#undef tExtraTurns
+#undef tShockMagnitude
+#undef tTimer
#undef tMoving
#undef tReelId
-static bool8 DecideReelTurns_BiasTag_Reel1(void)
+// We pass along two symbols to bias toward. If the machine is biased toward
+// 7's, we pass both the 7 symbols. Otherwise, we just pass the bias symbol
+// twice.
+static bool8 DecideStop_Bias_Reel1(void)
{
- u8 tag2 = GetBiasTag(sSlotMachine->luckyFlags);
- u8 tag1 = tag2;
- if (sSlotMachine->luckyFlags & (LUCKY_BIAS_777 | LUCKY_BIAS_MIXED_777))
+ u8 sym2 = GetBiasSymbol(sSlotMachine->machineBias);
+ u8 sym1 = sym2;
+ if (sSlotMachine->machineBias & (BIAS_STRAIGHT_7 | BIAS_MIXED_7))
{
- tag1 = GFXTAG_7_RED;
- tag2 = GFXTAG_7_BLUE;
+ sym1 = SYMBOL_7_RED;
+ sym2 = SYMBOL_7_BLUE;
}
- return sDecideReelTurns_BiasTag_Reel1_Bets[sSlotMachine->bet - 1](tag1, tag2);
+ return sDecideStop_Bias_Reel1_Bets[sSlotMachine->bet - 1](sym1, sym2);
}
-static bool8 AreTagsAtPosition_Reel1(s16 pos, u8 tag1, u8 tag2)
+// The biasSymbol for subsequent reels is determined based on which of the bias
+// symbols can be found in reel 1. This really only matters when the machine is
+// biased toward 7's. It will try to match a 7 of the same color as reel 1.
+static bool8 EitherSymbolAtPos_Reel1(s16 pos, u8 sym1, u8 sym2)
{
- u8 tag = GetTag(LEFT_REEL, pos);
- if (tag == tag1 || tag == tag2)
+ u8 sym = GetSymbol(LEFT_REEL, pos);
+ if (sym == sym1 || sym == sym2)
{
- sSlotMachine->biasTag = tag;
+ sSlotMachine->biasSymbol = sym;
return TRUE;
}
return FALSE;
}
-static bool8 AreCherriesOnScreen_Reel1(s16 offsetFromCenter)
+// Returns true if there are cherries on screen in reel 1 after the given number
+// of turns.
+static bool8 AreCherriesOnScreen_Reel1(s16 turns)
{
- if (GetTag(LEFT_REEL, 1 - offsetFromCenter) == GFXTAG_CHERRY
- || GetTag(LEFT_REEL, 2 - offsetFromCenter) == GFXTAG_CHERRY
- || GetTag(LEFT_REEL, 3 - offsetFromCenter) == GFXTAG_CHERRY)
+ if (GetSymbol(LEFT_REEL, 1 - turns) == SYMBOL_CHERRY
+ || GetSymbol(LEFT_REEL, 2 - turns) == SYMBOL_CHERRY
+ || GetSymbol(LEFT_REEL, 3 - turns) == SYMBOL_CHERRY)
return TRUE;
else
return FALSE;
}
-static bool8 IsBiasTowardsCherryOr7s(void)
+static bool8 BiasedTowardCherryOr7s(void)
{
- if (sSlotMachine->luckyFlags & (LUCKY_BIAS_777 | LUCKY_BIAS_MIXED_777 | LUCKY_BIAS_CHERRY))
+ if (sSlotMachine->machineBias & (BIAS_STRAIGHT_7 | BIAS_MIXED_7 | BIAS_CHERRY))
return TRUE;
else
return FALSE;
}
-static bool8 DecideReelTurns_BiasTag_Reel1_Bet1(u8 tag1, u8 tag2)
+// If a bias symbol appears in the center of reel 1 within the next 4 turns,
+// stop there. That symbol becomes the biasSymbol for the subsequent reels.
+static bool8 DecideStop_Bias_Reel1_Bet1(u8 sym1, u8 sym2)
{
s16 i;
- for (i = 0; i < 5; i++)
+ for (i = 0; i <= MAX_EXTRA_TURNS; i++)
{
- // if a lucky tag appears in the center row within 4 turns
- if (AreTagsAtPosition_Reel1(2 - i, tag1, tag2))
+ if (EitherSymbolAtPos_Reel1(2 - i, sym1, sym2))
{
sSlotMachine->winnerRows[LEFT_REEL] = 2;
- sSlotMachine->reelExtraTurns[0] = i;
+ sSlotMachine->reelExtraTurns[LEFT_REEL] = i;
return TRUE;
}
}
return FALSE;
}
-static bool8 DecideReelTurns_BiasTag_Reel1_Bet2or3(u8 tag1, u8 tag2)
+// There is slightly different behavior depending on the machine's bias.
+//
+// Bias toward cherry or 7s:
+// - Check if a cherry or 7 is currently on screen. If so, stop immediately.
+// - Roll up to 4 extra turns to see if a cherry or 7 enters the screen:
+// - If it enters after 1 turn, stop the reel when it gets the bottom row.
+// - Otherwise, if it enters before the 4th turn, stop the reel when it gets
+// to the middle row.
+// - If it enters on the 4th turn, stop here. It will be in the top row.
+//
+// Other bias:
+// - This is very similar, except the game is checking for the bias symbol
+// rather than cherries / 7s.
+//
+// However, the game adds an additional constraint: it will not stop if there
+// will be any cherries on screen. Presumably, this ensures that you will not
+// get any matches if you fail to line up the bias symbol in the remaining
+// reels.
+//
+// This is programmed in such a way that it excludes more options than
+// necessary. If there are cherries in the two positions below the bias symbol,
+// it will skip over this option, even if those cherries would not have ended
+// up on screen.
+static bool8 DecideStop_Bias_Reel1_Bet2or3(u8 sym1, u8 sym2)
{
s16 i;
- bool8 biased = IsBiasTowardsCherryOr7s();
- // if lucky numbers or no cherries are currently on screen in reel 1...
- if (biased || !AreCherriesOnScreen_Reel1(0))
+ bool8 cherry7Bias = BiasedTowardCherryOr7s();
+ if (cherry7Bias || !AreCherriesOnScreen_Reel1(0))
{
- for (i = 1; i < 4; i++)
+ // Check the current screen
+ for (i = 1; i <= 3; i++)
{
- // if a bias tag is currently on the screen
- if (AreTagsAtPosition_Reel1(i, tag1, tag2))
+ if (EitherSymbolAtPos_Reel1(i, sym1, sym2))
{
sSlotMachine->winnerRows[0] = i;
sSlotMachine->reelExtraTurns[0] = 0;
@@ -2231,30 +2476,27 @@ static bool8 DecideReelTurns_BiasTag_Reel1_Bet2or3(u8 tag1, u8 tag2)
}
}
}
- for (i = 1; i < 5; i++)
+
+ // Check the next 4 turns
+ for (i = 1; i <= MAX_EXTRA_TURNS; i++)
{
- bool8 biasedCopy = biased; // redundant
- // if biased or if in the next 4 turns there is a screen with no cherries...
- if (biasedCopy || !AreCherriesOnScreen_Reel1(i))
+ bool8 cherry7BiasCopy = cherry7Bias; // redundant
+ if (cherry7BiasCopy || !AreCherriesOnScreen_Reel1(i))
{
- //...and if a bias tag is in top row of that screen
- if (AreTagsAtPosition_Reel1(1 - i, tag1, tag2))
+ if (EitherSymbolAtPos_Reel1(1 - i, sym1, sym2))
{
- //...and if it only took 1 turn and the lucky tag could also be the bottom row of a screen with no cherries...
- if (i == 1 && (biasedCopy || !AreCherriesOnScreen_Reel1(3)))
+ if (i == 1 && (cherry7BiasCopy || !AreCherriesOnScreen_Reel1(3)))
{
sSlotMachine->winnerRows[0] = 3;
sSlotMachine->reelExtraTurns[0] = 3;
return TRUE;
}
- //...or if it isn't the last turn and the lucky tag could be in the center row of a screen with no cherries...
- if (i < 4 && (biasedCopy || !AreCherriesOnScreen_Reel1(i + 1)))
+ if (i <= 3 && (cherry7BiasCopy || !AreCherriesOnScreen_Reel1(i + 1)))
{
sSlotMachine->winnerRows[0] = 2;
sSlotMachine->reelExtraTurns[0] = i + 1;
return TRUE;
}
- //...else
sSlotMachine->winnerRows[0] = 1;
sSlotMachine->reelExtraTurns[0] = i;
return TRUE;
@@ -2264,22 +2506,23 @@ static bool8 DecideReelTurns_BiasTag_Reel1_Bet2or3(u8 tag1, u8 tag2)
return FALSE;
}
-static bool8 DecideReelTurns_BiasTag_Reel2(void)
+static bool8 DecideStop_Bias_Reel2(void)
{
- return sDecideReelTurns_BiasTag_Reel2_Bets[sSlotMachine->bet - 1]();
+ return sDecideStop_Bias_Reel2_Bets[sSlotMachine->bet - 1]();
}
-static bool8 DecideReelTurns_BiasTag_Reel2_Bet1or2(void)
+// Turn at most 4 extra turns to try to line up the bias symbol in the same row
+// as reel 1.
+static bool8 DecideStop_Bias_Reel2_Bet1or2(void)
{
s16 i;
- s16 biasTagLocation_Reel1 = sSlotMachine->winnerRows[0];
+ s16 reel1BiasRow = sSlotMachine->winnerRows[0];
- for (i = 0; i < 5; i++)
+ for (i = 0; i <= MAX_EXTRA_TURNS; i++)
{
- // if biasTag appears in the same row within 4 turns
- if (GetTag(MIDDLE_REEL, biasTagLocation_Reel1 - i) == sSlotMachine->biasTag)
+ if (GetSymbol(MIDDLE_REEL, reel1BiasRow - i) == sSlotMachine->biasSymbol)
{
- sSlotMachine->winnerRows[1] = biasTagLocation_Reel1;
+ sSlotMachine->winnerRows[1] = reel1BiasRow;
sSlotMachine->reelExtraTurns[1] = i;
return TRUE;
}
@@ -2287,19 +2530,55 @@ static bool8 DecideReelTurns_BiasTag_Reel2_Bet1or2(void)
return FALSE;
}
-static bool8 DecideReelTurns_BiasTag_Reel2_Bet3(void)
+// Checks whether it can match the bias symbol diagonally, and sometimes skews
+// toward this type of match rather than a match straight across.
+//
+// The behavior is different depending on where the bias symbol landed in
+// reel 1:
+//
+// Landed in middle row:
+// A diagonal match is impossible. Just try to match the bias symbol in the
+// middle row of reel 2 within 4 turns.
+//
+// Landed in top/bottom row:
+// - If it would take 2 or 3 turns to get the bias symbol into the same row as
+// reel 1, force a diagonal match by stopping it in the middle row instead.
+// - Check if the bias symbol is already in the same row as reel 1, or if it
+// takes 1 or 4 turns to get it there. If so, stop when it reaches that row.
+// - Otherwise, check if the bias symbol is already in the middle row of
+// reel 2. If so, stop here.
+//
+// So in how many more cases would betting 3 coins let you win compared to
+// betting 2?
+// Not many. Most of the time, the game would have matched the symbol in the
+// same row as reel 1 if you had bet 2 coins. Betting 3 effectively adds
+// coverage for only two additional cases:
+// - Bias symbol is in top row of reel 1 and bias symbol is currently in
+// middle row of reel 2.
+// - Bias symbol is in bottom row of reel 1 and bias symbol could get to the
+// middle row of reel 2 in 4 turns.
+//
+// Assuming this is the implementation Game Freak intended, the game effectively
+// turns straight matches into diagonal matches with 2/5 probability.
+// Presumably, this makes the player feel fortunate that they bet 3 coins rather
+// than 2, even though most times the game would have still forced a match with
+// only 2 coins.
+static bool8 DecideStop_Bias_Reel2_Bet3(void)
{
s16 i;
- // if biasTag appears in the same row within 4 turns...
- if (DecideReelTurns_BiasTag_Reel2_Bet1or2())
+ // If you can line up the bias symbol in the same row as reel 1 within 4
+ // turns
+ if (DecideStop_Bias_Reel2_Bet1or2())
{
- //...and if the biasTag is not in middle row of reel 1 and if biasTag appears in middle row of reel 2 in 2 or 3 turns...
+ // If bias symbol is not in the middle row of reel 1 and it takes either
+ // 2 or 3 turns to get it in the same row for reel 2
if (sSlotMachine->winnerRows[0] != 2 && sSlotMachine->reelExtraTurns[1] > 1 && sSlotMachine->reelExtraTurns[1] != 4)
{
- for (i = 0; i < 5; i++)
+ // Try turning this into a diagonal match by lining up the bias
+ // symbol in the middle row of reel 2 within 4 turns.
+ for (i = 0; i <= MAX_EXTRA_TURNS; i++)
{
- //...and if the bias tag will appear in the middle row within 4 turns
- if (GetTag(MIDDLE_REEL, 2 - i) == sSlotMachine->biasTag)
+ if (GetSymbol(MIDDLE_REEL, 2 - i) == sSlotMachine->biasSymbol)
{
sSlotMachine->winnerRows[1] = 2;
sSlotMachine->reelExtraTurns[1] = i;
@@ -2309,13 +2588,16 @@ static bool8 DecideReelTurns_BiasTag_Reel2_Bet3(void)
}
return TRUE;
}
- // else if the biasTag is not in middle row of reel 1...
+
+ // If you can't line up the bias symbol in the same row in 4 turns, and the
+ // bias symbol is not in the middle row of reel 1
if (sSlotMachine->winnerRows[0] != 2)
{
- for (i = 0; i < 5; i++)
+ // Try to match the bias symbol in middle row of reel 2 within 4 turns.
+ // Adds coverage for the two cases mentioned above.
+ for (i = 0; i <= MAX_EXTRA_TURNS; i++)
{
- //...and if the biasTag will appear in the center row of reel 2 within 4 turns
- if (GetTag(MIDDLE_REEL, 2 - i) == sSlotMachine->biasTag)
+ if (GetSymbol(MIDDLE_REEL, 2 - i) == sSlotMachine->biasSymbol)
{
sSlotMachine->winnerRows[1] = 2;
sSlotMachine->reelExtraTurns[1] = i;
@@ -2326,31 +2608,34 @@ static bool8 DecideReelTurns_BiasTag_Reel2_Bet3(void)
return FALSE;
}
-static bool8 DecideReelTurns_BiasTag_Reel3(void)
+// If the machine is biased toward mixed 7's, swap the color of the bias symbol
+// from red 7 to blue 7, or vice versa.
+static bool8 DecideStop_Bias_Reel3(void)
{
- u8 biasTag = sSlotMachine->biasTag;
- if (sSlotMachine->luckyFlags & LUCKY_BIAS_MIXED_777)
+ u8 biasSymbol = sSlotMachine->biasSymbol;
+ if (sSlotMachine->machineBias & BIAS_MIXED_7)
{
- biasTag = GFXTAG_7_RED;
- if (sSlotMachine->biasTag == GFXTAG_7_RED)
+ biasSymbol = SYMBOL_7_RED;
+ if (sSlotMachine->biasSymbol == SYMBOL_7_RED)
{
- biasTag = GFXTAG_7_BLUE;
+ biasSymbol = SYMBOL_7_BLUE;
}
}
- return sDecideReelTurns_BiasTag_Reel3_Bets[sSlotMachine->bet - 1](biasTag);
+ return sDecideStop_Bias_Reel3_Bets[sSlotMachine->bet - 1](biasSymbol);
}
-static bool8 DecideReelTurns_BiasTag_Reel3_Bet1or2(u8 biasTag)
+// Turn at most 4 extra turns to try to line up the bias symbol in the same
+// row as reel 2.
+static bool8 DecideStop_Bias_Reel3_Bet1or2(u8 biasSymbol)
{
s16 i;
- s16 biasTagLocation_Reel2 = sSlotMachine->winnerRows[1];
+ s16 reel2BiasRow = sSlotMachine->winnerRows[1];
- for (i = 0; i < 5; i++)
+ for (i = 0; i <= MAX_EXTRA_TURNS; i++)
{
- // if the biasTag appears in the same row as in reel 2 within 4 turns
- if (GetTag(RIGHT_REEL, biasTagLocation_Reel2 - i) == biasTag)
+ if (GetSymbol(RIGHT_REEL, reel2BiasRow - i) == biasSymbol)
{
- sSlotMachine->winnerRows[2] = biasTagLocation_Reel2;
+ sSlotMachine->winnerRows[2] = reel2BiasRow;
sSlotMachine->reelExtraTurns[2] = i;
return TRUE;
}
@@ -2358,35 +2643,40 @@ static bool8 DecideReelTurns_BiasTag_Reel3_Bet1or2(u8 biasTag)
return FALSE;
}
-static bool8 DecideReelTurns_BiasTag_Reel3_Bet3(u8 biasTag)
+// Try to complete a match in reel 3 by lining up a bias symbol with the bias
+// symbols from the first two reels.
+static bool8 DecideStop_Bias_Reel3_Bet3(u8 biasSymbol)
{
s16 i;
- s16 biasTagFinalPos;
- // if the final position of the biasTag matches in reel 1 and reel 2...
+ s16 biasRow;
+
+ // First two bias symbols in the same row. Try to line up bias symbol in
+ // same the row here too
if (sSlotMachine->winnerRows[0] == sSlotMachine->winnerRows[1])
- //...then try to line it up in reel 3
- return DecideReelTurns_BiasTag_Reel3_Bet1or2(biasTag);
- // else place it in the row opposite reel 1's
+ return DecideStop_Bias_Reel3_Bet1or2(biasSymbol);
+
+ // Otherwise, try to line up the bias symbol diagonally
if (sSlotMachine->winnerRows[0] == 1)
- biasTagFinalPos = 3;
+ biasRow = 3;
else
- biasTagFinalPos = 1;
- for (i = 0; i < 5; i++)
+ biasRow = 1;
+ for (i = 0; i <= MAX_EXTRA_TURNS; i++)
{
- // if the biasTag lands in that position within 4 turns
- if (GetTag(RIGHT_REEL, biasTagFinalPos - i) == biasTag)
+ if (GetSymbol(RIGHT_REEL, biasRow - i) == biasSymbol)
{
sSlotMachine->reelExtraTurns[2] = i;
- sSlotMachine->winnerRows[2] = biasTagFinalPos;
+ sSlotMachine->winnerRows[2] = biasRow;
return TRUE;
}
}
return FALSE;
}
-// Advance until there are no cherries on screen in reel 1
-
-static void DecideReelTurns_NoBiasTag_Reel1(void)
+// Advance as many turns as needed until there are no cherries on screen in
+// reel 1, as cherries would cause a match.
+//
+// Based on the distribution of reel 1, this will add at most 3 extra turns.
+static void DecideStop_NoBias_Reel1(void)
{
s16 i = 0;
@@ -2395,41 +2685,60 @@ static void DecideReelTurns_NoBiasTag_Reel1(void)
sSlotMachine->reelExtraTurns[0] = i;
}
-static bool8 IsBiasTag777_SwitchColor(u8 *biasTagPtr)
+// If the bias symbol is one of the 7's, switch to the opposite color and return
+// true. Otherwise, return false.
+static bool8 IfSymbol7_SwitchColor(u8 *symbol)
{
- if (*biasTagPtr == GFXTAG_7_RED)
+ if (*symbol == SYMBOL_7_RED)
{
- *biasTagPtr = GFXTAG_7_BLUE;
+ *symbol = SYMBOL_7_BLUE;
return TRUE;
}
- if (*biasTagPtr == GFXTAG_7_BLUE)
+ if (*symbol == SYMBOL_7_BLUE)
{
- *biasTagPtr = GFXTAG_7_RED;
+ *symbol = SYMBOL_7_RED;
return TRUE;
}
return FALSE;
}
-static void DecideReelTurns_NoBiasTag_Reel2(void)
+// If the machine doesn't have a bias, the reel stops immediately.
+//
+// Otherwise, the machine tries to taunt the player if it is biased toward
+// straight 7's. This would only happen if the player did not stop near the
+// correct-color 7, so the machine couldn't force a match.
+//
+// Instead, the machine now tries to line up the opposite-color 7, which is not
+// a valid match.
+static void DecideStop_NoBias_Reel2(void)
{
- sDecideReelTurns_NoBiasTag_Reel2_Bets[sSlotMachine->bet - 1]();
+ sDecideStop_NoBias_Reel2_Bets[sSlotMachine->bet - 1]();
}
-// only does stuff if the biasTag is one of the 7's, plus other conditions
-static void DecideReelTurns_NoBiasTag_Reel2_Bet1(void)
+// If the machine has no bias, stop immediately.
+//
+// Otherwise, the machine manipulates the results if all the following
+// conditions are met:
+// If
+// - The machine is biased toward straight 7's
+// - The machine managed to match a 7 in the middle of reel 1
+// - The machine could not line up a 7 of the same color in reel 2
+// Then
+// The machine will try to line up a 7 of the opposite color in reel 2
+static void DecideStop_NoBias_Reel2_Bet1(void)
{
- if (sSlotMachine->winnerRows[0] != 0 && sSlotMachine->luckyFlags & LUCKY_BIAS_777)
+ if (sSlotMachine->winnerRows[0] != 0 && sSlotMachine->machineBias & BIAS_STRAIGHT_7)
{
- u8 biasTag = GetTag(LEFT_REEL, 2 - sSlotMachine->reelExtraTurns[0]);
- //...and if biasTag is one of the 7's...
- if (IsBiasTag777_SwitchColor(&biasTag))
- //...swap color of biasTag...
+ // Note here and in other NoBias functions, reelExtraTurns is 0 if it
+ // corresponds to a previous reel. That reel has already stopped and any
+ // extra turns were applied.
+ u8 reel1MiddleSym = GetSymbol(LEFT_REEL, 2 - sSlotMachine->reelExtraTurns[0]);
+ if (IfSymbol7_SwitchColor(&reel1MiddleSym))
{
s16 i;
- for (i = 0; i < 5; i++)
+ for (i = 0; i <= MAX_EXTRA_TURNS; i++)
{
- //...and if the biasTag appears within 4 turns
- if (biasTag == GetTag(MIDDLE_REEL, 2 - i))
+ if (reel1MiddleSym == GetSymbol(MIDDLE_REEL, 2 - i))
{
sSlotMachine->winnerRows[1] = 2;
sSlotMachine->reelExtraTurns[1] = i;
@@ -2440,20 +2749,27 @@ static void DecideReelTurns_NoBiasTag_Reel2_Bet1(void)
}
}
-static void DecideReelTurns_NoBiasTag_Reel2_Bet2(void)
+// If the machine has no bias, stop immediately.
+//
+// Otherwise, the machine manipulates the results if all the following
+// conditions are met:
+// If
+// - The machine is biased toward straight 7's
+// - The machine managed to match a 7 anywhere in reel 1
+// - The machine could not line up a 7 of the same color in reel 2
+// Then
+// The machine will try to line up a 7 of the opposite color in reel 2
+static void DecideStop_NoBias_Reel2_Bet2(void)
{
- if (sSlotMachine->winnerRows[0] != 0 && sSlotMachine->luckyFlags & LUCKY_BIAS_777)
+ if (sSlotMachine->winnerRows[0] != 0 && sSlotMachine->machineBias & BIAS_STRAIGHT_7)
{
- u8 biasTag = GetTag(LEFT_REEL, sSlotMachine->winnerRows[0] - sSlotMachine->reelExtraTurns[0]);
- //...and if biasTag is one of the 7's...
- if (IsBiasTag777_SwitchColor(&biasTag))
- //...swap color of biasTag...
+ u8 reel1BiasSym = GetSymbol(LEFT_REEL, sSlotMachine->winnerRows[0] - sSlotMachine->reelExtraTurns[0]);
+ if (IfSymbol7_SwitchColor(&reel1BiasSym))
{
s16 i;
- for (i = 0; i < 5; i++)
+ for (i = 0; i <= MAX_EXTRA_TURNS; i++)
{
- //...and if the biasTag appears in same row in reel 2 within 4 turns
- if (biasTag == GetTag(MIDDLE_REEL, sSlotMachine->winnerRows[0] - i))
+ if (reel1BiasSym == GetSymbol(MIDDLE_REEL, sSlotMachine->winnerRows[0] - i))
{
sSlotMachine->winnerRows[1] = sSlotMachine->winnerRows[0];
sSlotMachine->reelExtraTurns[1] = i;
@@ -2464,146 +2780,225 @@ static void DecideReelTurns_NoBiasTag_Reel2_Bet2(void)
}
}
-static void DecideReelTurns_NoBiasTag_Reel2_Bet3(void)
+// If the machine has no bias, stop immediately.
+//
+// Otherwise, the machine manipulates the results if all the following
+// conditions are met:
+// If
+// - The machine is biased toward straight 7's
+// - The machine managed to match a 7 anywhere in reel 1
+// - The machine could not line up a 7 of the same color in reel 2
+// Then
+// The machine will try to line up a 7 of the opposite color in reel 2
+//
+// The way it tries to line up an opposite-color 7 differs depending on where
+// the 7 is in reel 1:
+//
+// Middle row:
+// Try to line up an opposite-color 7 in the middle of reel 2 within 4 turns.
+//
+// Top row:
+// - First check for an opposite-color 7 in the top and middle rows of the
+// current screen. If found, stop immediately.
+// - Otherwise, check if an opposite-color 7 will enter the top row within 4
+// turns.
+// - If one enters in 1 or 2 turns, stop the reel when it gets to the middle
+// row.
+// - If one enters in 3 or 4 turns, stop the reel when it gets to the top
+// row.
+//
+// Bottom row:
+// - First check for an opposite-color 7 in the middle and bottom rows of the
+// current screen. If found, stop immediately.
+// - Otherwise, check if an opposite-color 7 will enter the bottom row within 4
+// turns.
+// - If one enters in 1 or 2 turns, stop the reel when it gets to the bottom
+// row.
+// - If one enters in 3 or 4 turns, stop the reel when it gets to the middle
+// row.
+//
+// BUG: This procedure misses an opportunity to line up an opposite-color 7 in
+// one scenario, when:
+// - There is a 7 in the bottom row of reel 1
+// - And, you can get an opposite-color 7 in the middle row of reel 2 in 4
+// turns
+static void DecideStop_NoBias_Reel2_Bet3(void)
{
s16 i;
s16 j;
- // if reel 1 has a biasTag and bit 7 is set in luckyFlags...
- if (sSlotMachine->winnerRows[0] != 0 && sSlotMachine->luckyFlags & LUCKY_BIAS_777)
+ u8 reel1BiasSym;
+
+ if (sSlotMachine->winnerRows[0] != 0 && sSlotMachine->machineBias & BIAS_STRAIGHT_7)
{
- //...and if biasTag appeared in the center row of reel 1
+ // Lined up 7 in middle of reel 1
if (sSlotMachine->winnerRows[0] == 2)
{
- DecideReelTurns_NoBiasTag_Reel2_Bet2();
+ DecideStop_NoBias_Reel2_Bet2();
+ return;
}
- else
+
+ reel1BiasSym = GetSymbol(LEFT_REEL, sSlotMachine->winnerRows[0] - sSlotMachine->reelExtraTurns[0]);
+ if (IfSymbol7_SwitchColor(&reel1BiasSym))
{
- u8 biasTag = GetTag(LEFT_REEL, sSlotMachine->winnerRows[0] - sSlotMachine->reelExtraTurns[0]);
- //...and if biasTag is one of the 7's...
- if (IsBiasTag777_SwitchColor(&biasTag))
- //...swap the color of the 7...
+ // Check current screen to see if there is already an opposite-color
+ // 7 lined up for a match.
+ j = 2;
+ if (sSlotMachine->winnerRows[0] == 3)
+ j = 3;
+ for (i = 0; i < 2; i++, j--)
{
- j = 2;
- if (sSlotMachine->winnerRows[0] == 3)
- j = 3;
- for (i = 0; i < 2; i++, j--)
+ if (reel1BiasSym == GetSymbol(MIDDLE_REEL, j))
{
- if (biasTag == GetTag(MIDDLE_REEL, j))
- {
- sSlotMachine->winnerRows[1] = j;
- sSlotMachine->reelExtraTurns[1] = 0;
- return;
- }
+ sSlotMachine->winnerRows[1] = j;
+ sSlotMachine->reelExtraTurns[1] = 0;
+ return;
}
- for (j = 1; j < 5; j++)
+ }
+
+ // Check if opposite-color 7 will appear in same row as reel 1 in
+ // over the next 4 turns
+ for (j = 1; j <= MAX_EXTRA_TURNS; j++)
+ {
+ if (reel1BiasSym == GetSymbol(MIDDLE_REEL, sSlotMachine->winnerRows[0] - j))
{
- if (biasTag == GetTag(MIDDLE_REEL, sSlotMachine->winnerRows[0] - j))
+ // If 7 appeared in top row of reel 1
+ if (sSlotMachine->winnerRows[0] == 1)
{
- if (sSlotMachine->winnerRows[0] == 1)
+ if (j <= 2)
{
- if (j < 3)
- {
- sSlotMachine->winnerRows[1] = 2;
- sSlotMachine->reelExtraTurns[1] = j + 1;
- }
- else
- {
- sSlotMachine->winnerRows[1] = 1;
- sSlotMachine->reelExtraTurns[1] = j;
- }
+ sSlotMachine->winnerRows[1] = 2;
+ sSlotMachine->reelExtraTurns[1] = j + 1;
}
else
{
- if (j < 3)
- {
- sSlotMachine->winnerRows[1] = 3;
- sSlotMachine->reelExtraTurns[1] = j;
- }
- else
- {
- sSlotMachine->winnerRows[1] = 2;
- sSlotMachine->reelExtraTurns[1] = j - 1;
- }
+ sSlotMachine->winnerRows[1] = 1;
+ sSlotMachine->reelExtraTurns[1] = j;
}
- return;
}
+ // If 7 appeared in bottom row of reel 1
+ else
+ {
+ if (j <= 2)
+ {
+ sSlotMachine->winnerRows[1] = 3;
+ sSlotMachine->reelExtraTurns[1] = j;
+ }
+ else
+ {
+ sSlotMachine->winnerRows[1] = 2;
+ sSlotMachine->reelExtraTurns[1] = j - 1;
+ }
+ }
+ return;
}
}
}
}
}
-static bool8 AreTagsMixed77(u8 tag1, u8 tag2)
+// Returns true if the reel 1 and reel 2 symbols are opposite-color 7's.
+//
+// Note that if true, this does not constitue a MATCH_MIXED_7, as the first two
+// reels are not the same color.
+static bool8 MismatchedSyms_77(u8 sym1, u8 sym2)
{
- if ((tag1 == GFXTAG_7_RED && tag2 == GFXTAG_7_BLUE) || (tag1 == GFXTAG_7_BLUE && tag2 == GFXTAG_7_RED))
+ if ((sym1 == SYMBOL_7_RED && sym2 == SYMBOL_7_BLUE) || (sym1 == SYMBOL_7_BLUE && sym2 == SYMBOL_7_RED))
return TRUE;
else
return FALSE;
}
-static bool8 AreTagsMixed777(u8 tag1, u8 tag2, u8 tag3)
+// Returns true if the reel 1, reel 2 and reel 3 symbolss form a 7 mismatch,
+// i.e. {7R, 7B, 7R} or {7B, 7R, 7B}.
+static bool8 MismatchedSyms_777(u8 sym1, u8 sym2, u8 sym3)
{
- if ((tag1 == GFXTAG_7_RED && tag2 == GFXTAG_7_BLUE && tag3 == GFXTAG_7_RED) ||
- (tag1 == GFXTAG_7_BLUE && tag2 == GFXTAG_7_RED && tag3 == GFXTAG_7_BLUE))
+ if ((sym1 == SYMBOL_7_RED && sym2 == SYMBOL_7_BLUE && sym3 == SYMBOL_7_RED) ||
+ (sym1 == SYMBOL_7_BLUE && sym2 == SYMBOL_7_RED && sym3 == SYMBOL_7_BLUE))
return TRUE;
else
return FALSE;
}
-static bool8 TagsDontMatchOrHaveAny7s(u8 tag1, u8 tag2, u8 tag3)
+// Returns false if either:
+// - The symbols form a match (including MATCH_MIXED_7)
+// - Or, the symbols form a 7 mismatch (i.e., {7R, 7B, 7R} or {7B, 7R, 7B})
+//
+// Note, this does not account for cherry matches.
+static bool8 NeitherMatchNor7Mismatch(u8 sym1, u8 sym2, u8 sym3)
{
- if ((tag1 == GFXTAG_7_RED && tag2 == GFXTAG_7_BLUE && tag3 == GFXTAG_7_RED) ||
- (tag1 == GFXTAG_7_BLUE && tag2 == GFXTAG_7_RED && tag3 == GFXTAG_7_BLUE) ||
- (tag1 == GFXTAG_7_RED && tag2 == GFXTAG_7_RED && tag3 == GFXTAG_7_BLUE) ||
- (tag1 == GFXTAG_7_BLUE && tag2 == GFXTAG_7_BLUE && tag3 == GFXTAG_7_RED) ||
- (tag1 == tag2 && tag1 == tag3))
+ if ((sym1 == SYMBOL_7_RED && sym2 == SYMBOL_7_BLUE && sym3 == SYMBOL_7_RED)
+ || (sym1 == SYMBOL_7_BLUE && sym2 == SYMBOL_7_RED && sym3 == SYMBOL_7_BLUE)
+ || (sym1 == SYMBOL_7_RED && sym2 == SYMBOL_7_RED && sym3 == SYMBOL_7_BLUE)
+ || (sym1 == SYMBOL_7_BLUE && sym2 == SYMBOL_7_BLUE && sym3 == SYMBOL_7_RED)
+ || (sym1 == sym2 && sym1 == sym3))
{
return FALSE;
}
return TRUE;
}
-static void DecideReelTurns_NoBiasTag_Reel3(void)
+// Spin until there's no match, or try to taunt the player with a 7 mismatch if
+// they failed the straight 7 bias.
+static void DecideStop_NoBias_Reel3(void)
{
- sDecideReelTurns_NoBiasTag_Reel3_Bets[sSlotMachine->bet - 1]();
+ sDecideStop_NoBias_Reel3_Bets[sSlotMachine->bet - 1]();
}
-static void DecideReelTurns_NoBiasTag_Reel3_Bet1(void)
+// Spin until there is no match in reel 3. Additionally, if the player failed a
+// straight 7 bias, try to taunt them with a 7 mismatch.
+//
+// The way this plays out depends on the first two matched symbols.
+//
+// If first two symbols are the same:
+// Spin until you get a symbol that won't complete a match.
+//
+// Otherwise, if the first two symbols are opposite-color 7's:
+// - If the machine is biased toward straight 7's, then the player must have
+// failed with this bias. The machine tries to taunt the player by turning
+// up to 4 turns to complete a 7 mismatch (i.e., {7R, 7B, 7R} or
+// {7B, 7R, 7B}).
+// - Otherwise, spin until you get a symbol that won't complete a match.
+static void DecideStop_NoBias_Reel3_Bet1(void)
{
s16 i = 0;
- u8 tag1 = GetTag(LEFT_REEL, 2 - sSlotMachine->reelExtraTurns[0]);
- u8 tag2 = GetTag(MIDDLE_REEL, 2 - sSlotMachine->reelExtraTurns[1]);
- // if tags match in first 2 reels...
- if (tag1 == tag2)
+ u8 sym1 = GetSymbol(LEFT_REEL, 2 - sSlotMachine->reelExtraTurns[0]);
+ u8 sym2 = GetSymbol(MIDDLE_REEL, 2 - sSlotMachine->reelExtraTurns[1]);
+
+ // If first two symbols match, spin until you get a non-matching symbol
+ if (sym1 == sym2)
{
- //...spin until you get non-matching tag
- while (1)
+ while (TRUE)
{
- u8 tag3;
- if (!(tag1 == (tag3 = GetTag(RIGHT_REEL, 2 - i)) || (tag1 == GFXTAG_7_RED && tag3 == GFXTAG_7_BLUE) || (tag1 == GFXTAG_7_BLUE && tag3 == GFXTAG_7_RED)))
+ u8 sym3;
+ if (!((sym1 == (sym3 = GetSymbol(RIGHT_REEL, 2 - i)))
+ || (sym1 == SYMBOL_7_RED && sym3 == SYMBOL_7_BLUE)
+ || (sym1 == SYMBOL_7_BLUE && sym3 == SYMBOL_7_RED)))
break;
i++;
}
}
- else if (AreTagsMixed77(tag1, tag2))
+ // First two symbols are opposite-color 7's
+ else if (MismatchedSyms_77(sym1, sym2))
{
- if (sSlotMachine->luckyFlags & LUCKY_BIAS_777)
+ // If biased toward straight 7's, try to complete the 7 mismatch in 4
+ // turns
+ if (sSlotMachine->machineBias & BIAS_STRAIGHT_7)
{
- //...see if you can match with reel 1 within 4 turns
- for (i = 0; i < 5; i++)
+ for (i = 0; i <= MAX_EXTRA_TURNS; i++)
{
- if (tag1 == GetTag(RIGHT_REEL, 2 - i))
+ if (sym1 == GetSymbol(RIGHT_REEL, 2 - i))
{
sSlotMachine->reelExtraTurns[2] = i;
return;
}
}
}
- // turn until you aren't matching with reel 1
+
+ // Otherwise, just spin until you get a non-matching symbol
i = 0;
- while (1)
+ while (TRUE)
{
- if (tag1 != GetTag(RIGHT_REEL, 2 - i))
+ if (sym1 != GetSymbol(RIGHT_REEL, 2 - i))
break;
i++;
}
@@ -2611,25 +3006,49 @@ static void DecideReelTurns_NoBiasTag_Reel3_Bet1(void)
sSlotMachine->reelExtraTurns[2] = i;
}
-static void DecideReelTurns_NoBiasTag_Reel3_Bet2(void)
+// Spin until there is no match in reel 3. Additionally, if the player failed a
+// straight 7 bias, try to taunt them with a 7 mismatch.
+//
+// There are up to two stages, depending on the first two matched symbols:
+//
+// 1. [Optional] If first two symbols are opposite-color 7's in the same row and
+// the machine is biased toward straight 7's:
+// Check if a 7 with the same color as reel 1 appears in the same row
+// within 4 turns. If so, initially advance to that position.
+//
+// 2. Check rows. Keep advancing the reel a turn at a time as long as:
+// - There is a match in any row
+// - Or, there is a 7 mismatch in any row and the machine isn't biased
+// toward straight 7's
+//
+// Note, stage 2 is not limited to 4 turns. The reel keeps spinning until you
+// lose.
+static void DecideStop_NoBias_Reel3_Bet2(void)
{
s16 extraTurns = 0;
s16 i;
- u8 tag1;
- u8 tag2;
- u8 tag3;
- if (sSlotMachine->winnerRows[1] != 0 && sSlotMachine->winnerRows[0] == sSlotMachine->winnerRows[1] && sSlotMachine->luckyFlags & LUCKY_BIAS_777)
+ u8 sym1;
+ u8 sym2;
+ u8 sym3;
+
+ // Effectively, if you lined up two 7's in the same row
+ if (sSlotMachine->winnerRows[1] != 0 &&
+ sSlotMachine->winnerRows[0] == sSlotMachine->winnerRows[1] &&
+ sSlotMachine->machineBias & BIAS_STRAIGHT_7)
{
- tag1 = GetTag(LEFT_REEL, sSlotMachine->winnerRows[0] - sSlotMachine->reelExtraTurns[0]);
- tag2 = GetTag(MIDDLE_REEL, sSlotMachine->winnerRows[1] - sSlotMachine->reelExtraTurns[1]);
- //...and if tags are mixed 7s...
- if (AreTagsMixed77(tag1, tag2))
+ sym1 = GetSymbol(LEFT_REEL, sSlotMachine->winnerRows[0] - sSlotMachine->reelExtraTurns[0]);
+ sym2 = GetSymbol(MIDDLE_REEL, sSlotMachine->winnerRows[1] - sSlotMachine->reelExtraTurns[1]);
+
+ // If the first two 7's are opposite colors, see if you can line up a 7
+ // mismatch in the same row. If so, advance initially to that position.
+ // More turns may be added further below.
+ if (MismatchedSyms_77(sym1, sym2))
{
- //...try to match with reel 1 within 4 turns
- for (i = 0; i < 5; i++)
+ // Iterate over the next 4 turns
+ for (i = 0; i <= MAX_EXTRA_TURNS; i++)
{
- tag3 = GetTag(RIGHT_REEL, sSlotMachine->winnerRows[1] - i);
- if (tag1 == tag3)
+ sym3 = GetSymbol(RIGHT_REEL, sSlotMachine->winnerRows[1] - i);
+ if (sym1 == sym3)
{
extraTurns = i;
break;
@@ -2637,53 +3056,100 @@ static void DecideReelTurns_NoBiasTag_Reel3_Bet2(void)
}
}
}
- // GUESS: spin until there's no possible match within 4 turns of you stopping
- while (1)
+
+ while (TRUE)
{
- s16 loopExit;
- for (i = 1, loopExit = 0; i < 4; i++)
+ s16 numMatches;
+ // Iterate over the rows of the screen after `extraTurns` turns
+ for (i = 1, numMatches = 0; i <= 3; i++)
{
- tag1 = GetTag(LEFT_REEL, i - sSlotMachine->reelExtraTurns[0]); // why does this update with i
- tag2 = GetTag(MIDDLE_REEL, i - sSlotMachine->reelExtraTurns[1]);
- tag3 = GetTag(RIGHT_REEL, i - extraTurns);
- // if bit 7 of luckyFlags is unset...
- //...and if all 3 tags match and they're not mixed 7s
- if (!TagsDontMatchOrHaveAny7s(tag1, tag2, tag3) && (!AreTagsMixed777(tag1, tag2, tag3) || !(sSlotMachine->luckyFlags & LUCKY_BIAS_777)))
+ sym1 = GetSymbol(LEFT_REEL, i - sSlotMachine->reelExtraTurns[0]);
+ sym2 = GetSymbol(MIDDLE_REEL, i - sSlotMachine->reelExtraTurns[1]);
+ sym3 = GetSymbol(RIGHT_REEL, i - extraTurns);
+
+ // This boils down to:
+ // If there's a match on screen, keep spinning. Otherwise, if
+ // there's a 7 mismatch on screen, keep spinning if the machine
+ // isn't biased toward straight 7's.
+ if (!NeitherMatchNor7Mismatch(sym1, sym2, sym3) &&
+ !(MismatchedSyms_777(sym1, sym2, sym3) && (sSlotMachine->machineBias & BIAS_STRAIGHT_7)))
{
- loopExit++;
+ numMatches++;
break;
}
}
- if (loopExit == 0)
+
+ // If no matches were found, stop here. Otherwise, add an extra spin and
+ // check again.
+ if (numMatches == 0)
break;
extraTurns++;
}
sSlotMachine->reelExtraTurns[2] = extraTurns;
}
-static void DecideReelTurns_NoBiasTag_Reel3_Bet3(void)
+// Try to spin until there is no match in reel 3. Additionally, if the player
+// failed a straight 7 bias, try to taunt them with a 7 mismatch.
+//
+// There are up to four stages:
+//
+// 1. Advance the reel as if 2 coins were bet: to mildly oversimplify, spin
+// until there's no matches straight across in any rows.
+//
+// 2. [Optional] If you've lined up two opposite-color 7's diagonally and the
+// machine is biased toward straight 7's:
+// Check if a 7 with the same color as reel 1 appears in the final diagonal
+// position within 4 turns. If so, advance to that position.
+//
+// 3. Check NWSE diagonal. Keep advancing the reel a turn at a time as long as:
+// - There is a match in the diagonal
+// - Or, there is a 7 mismatch in the diagonal and the machine isn't
+// biased toward straight 7's
+//
+// 3. Check NESW diagonal. Keep advancing the reel a turn at a time as long as:
+// - There is a match in the diagonal
+// - Or, there is a 7 mismatch in the diagonal and the machine isn't
+// biased toward straight 7's
+//
+// Note that stages 3 and 4 are not limited to 4 turns.
+//
+// Also, note that it actually is possible to win a match here. After stage 1,
+// the game never again checks whether it will be matching any rows straight
+// across. So any extra turns added in stages 2-4 could result in a match
+// occurring straight across.
+static void DecideStop_NoBias_Reel3_Bet3(void)
{
- u8 tag1;
- u8 tag2;
- u8 tag3;
- s16 j;
+ u8 sym1;
+ u8 sym2;
+ u8 sym3;
+ s16 row;
s16 i;
- DecideReelTurns_NoBiasTag_Reel3_Bet2();
- if (sSlotMachine->winnerRows[1] != 0 && sSlotMachine->winnerRows[0] != sSlotMachine->winnerRows[1] && sSlotMachine->luckyFlags & LUCKY_BIAS_777)
+ // Spin until there's no matches in any row straight across, potentially
+ // skewing toward a 7 mismatch. Consider this the new starting position for
+ // this function.
+ DecideStop_NoBias_Reel3_Bet2();
+
+ // Essentially, if you lined up two 7's diagonally
+ if (sSlotMachine->winnerRows[1] != 0 &&
+ sSlotMachine->winnerRows[0] != sSlotMachine->winnerRows[1] &&
+ sSlotMachine->machineBias & BIAS_STRAIGHT_7)
{
- tag1 = GetTag(LEFT_REEL, sSlotMachine->winnerRows[0] - sSlotMachine->reelExtraTurns[0]);
- tag2 = GetTag(MIDDLE_REEL, sSlotMachine->winnerRows[1] - sSlotMachine->reelExtraTurns[1]);
- //..and if tags are mixed 7s...
- if (AreTagsMixed77(tag1, tag2))
+ sym1 = GetSymbol(LEFT_REEL, sSlotMachine->winnerRows[0] - sSlotMachine->reelExtraTurns[0]);
+ sym2 = GetSymbol(MIDDLE_REEL, sSlotMachine->winnerRows[1] - sSlotMachine->reelExtraTurns[1]);
+
+ // If the first two 7's are opposite colors, try advancing up to 4
+ // additional turns to line up a diagonal 7 mismatch. More turns may be
+ // added further below.
+ if (MismatchedSyms_77(sym1, sym2))
{
- j = 1;
+ row = 1;
if (sSlotMachine->winnerRows[0] == 1)
- j = 3;
- for (i = 0; i < 5; i++)
+ row = 3;
+ for (i = 0; i <= MAX_EXTRA_TURNS; i++)
{
- tag3 = GetTag(RIGHT_REEL, j - (sSlotMachine->reelExtraTurns[2] + i));
- if (tag1 == tag3)
+ sym3 = GetSymbol(RIGHT_REEL, row - (sSlotMachine->reelExtraTurns[2] + i));
+ if (sym1 == sym3)
{
sSlotMachine->reelExtraTurns[2] += i;
break;
@@ -2691,21 +3157,27 @@ static void DecideReelTurns_NoBiasTag_Reel3_Bet3(void)
}
}
}
- while (1)
+
+ while (TRUE)
{
- tag1 = GetTag(LEFT_REEL, 1 - sSlotMachine->reelExtraTurns[0]);
- tag2 = GetTag(MIDDLE_REEL, 2 - sSlotMachine->reelExtraTurns[1]);
- tag3 = GetTag(RIGHT_REEL, 3 - sSlotMachine->reelExtraTurns[2]);
- if (TagsDontMatchOrHaveAny7s(tag1, tag2, tag3) || (AreTagsMixed777(tag1, tag2, tag3) && sSlotMachine->luckyFlags & LUCKY_BIAS_777))
+ // Check NWSE diagonal
+ sym1 = GetSymbol(LEFT_REEL, 1 - sSlotMachine->reelExtraTurns[0]);
+ sym2 = GetSymbol(MIDDLE_REEL, 2 - sSlotMachine->reelExtraTurns[1]);
+ sym3 = GetSymbol(RIGHT_REEL, 3 - sSlotMachine->reelExtraTurns[2]);
+ if (NeitherMatchNor7Mismatch(sym1, sym2, sym3)
+ || (MismatchedSyms_777(sym1, sym2, sym3) && sSlotMachine->machineBias & BIAS_STRAIGHT_7))
break;
sSlotMachine->reelExtraTurns[2]++;
}
- while (1)
+
+ while (TRUE)
{
- tag1 = GetTag(LEFT_REEL, 3 - sSlotMachine->reelExtraTurns[0]);
- tag2 = GetTag(MIDDLE_REEL, 2 - sSlotMachine->reelExtraTurns[1]);
- tag3 = GetTag(RIGHT_REEL, 1 - sSlotMachine->reelExtraTurns[2]);
- if (TagsDontMatchOrHaveAny7s(tag1, tag2, tag3) || (AreTagsMixed777(tag1, tag2, tag3) && sSlotMachine->luckyFlags & LUCKY_BIAS_777))
+ // Check NESW diagonal
+ sym1 = GetSymbol(LEFT_REEL, 3 - sSlotMachine->reelExtraTurns[0]);
+ sym2 = GetSymbol(MIDDLE_REEL, 2 - sSlotMachine->reelExtraTurns[1]);
+ sym3 = GetSymbol(RIGHT_REEL, 1 - sSlotMachine->reelExtraTurns[2]);
+ if (NeitherMatchNor7Mismatch(sym1, sym2, sym3)
+ || (MismatchedSyms_777(sym1, sym2, sym3) && sSlotMachine->machineBias & BIAS_STRAIGHT_7))
break;
sSlotMachine->reelExtraTurns[2]++;
}
@@ -2720,7 +3192,7 @@ static void PressStopReelButton(u8 reelNum)
static void Task_PressStopReelButton(u8 taskId)
{
- sReelStopButtonFuncs[gTasks[taskId].data[0]](&gTasks[taskId], taskId);
+ sReelStopButtonTasks[gTasks[taskId].data[0]](&gTasks[taskId], taskId);
}
static void StopReelButton_Press(struct Task *task, u8 taskId)
@@ -2926,11 +3398,11 @@ static void CreatePikaPowerBoltTask(void)
sSlotMachine->pikaPowerBoltTaskId = CreateTask(Task_CreatePikaPowerBolt, 8);
}
-static void AddPikaPowerBolt(u8 pikaPower)
+static void AddPikaPowerBolt(u8 bolts)
{
struct Task *task = &gTasks[sSlotMachine->pikaPowerBoltTaskId];
ResetPikaPowerBoltTask(task);
- task->tState = 1;
+ task->tState = PIKABOLT_TASK_ADD_BOLT;
task->tNumBolts++;
task->tAnimating = TRUE;
}
@@ -2939,7 +3411,7 @@ static void ResetPikaPowerBolts(void)
{
struct Task *task = &gTasks[sSlotMachine->pikaPowerBoltTaskId];
ResetPikaPowerBoltTask(task);
- task->tState = 3;
+ task->tState = PIKABOLT_TASK_CLEAR_ALL;
task->tAnimating = TRUE;
}
@@ -2950,7 +3422,7 @@ static bool8 IsPikaPowerBoltAnimating(void)
static void Task_CreatePikaPowerBolt(u8 taskId)
{
- sPikaPowerBoltFuncs[gTasks[taskId].tState](&gTasks[taskId]);
+ sPikaPowerBoltTasks[gTasks[taskId].tState](&gTasks[taskId]);
}
static void PikaPowerBolt_Idle(struct Task *task)
@@ -2960,7 +3432,7 @@ static void PikaPowerBolt_Idle(struct Task *task)
static void PikaPowerBolt_AddBolt(struct Task *task)
{
task->tSpriteId = CreatePikaPowerBoltSprite((task->tNumBolts << 3) + 20, 20);
- task->tState++;
+ task->tState++; // PIKABOLT_TASK_WAIT_ANIM
}
// The bolt sprite spins around as it appears
@@ -2979,7 +3451,7 @@ static void PikaPowerBolt_WaitAnim(struct Task *task)
sSelectedPikaPowerTile[r2] = sPikaPowerTileTable[r3][0];
LoadBgTilemap(2, &sSelectedPikaPowerTile[r2], 2, r5 + 0x40);
DestroyPikaPowerBoltSprite(task->tSpriteId);
- task->tState = 0;
+ task->tState = PIKABOLT_TASK_IDLE;
task->tAnimating = 0;
}
}
@@ -3003,7 +3475,7 @@ static void PikaPowerBolt_ClearAll(struct Task *task)
task->tTimer = 0;
if (task->tNumBolts == 0)
{
- task->tState = 0;
+ task->tState = PIKABOLT_TASK_IDLE;
task->tAnimating = 0;
}
}
@@ -3016,17 +3488,17 @@ static void ResetPikaPowerBoltTask(struct Task *task)
task->data[i] = 0;
}
-static void LoadPikaPowerMeter(u8 pikaPower)
+static void LoadPikaPowerMeter(u8 bolts)
{
s16 i;
s16 r3 = 0, r1 = 0;
s16 r4 = 3;
- for (i = 0; i < pikaPower; i++, r4++)
+ for (i = 0; i < bolts; i++, r4++)
{
r3 = 0, r1 = 0;
if (i == 0)
r3 = 1, r1 = 1;
- else if (i == 15) // pikaPower meter is full
+ else if (i == 15) // meter is full
r3 = 2, r1 = 2;
sSelectedPikaPowerTile[r1] = sPikaPowerTileTable[r3][0];
LoadBgTilemap(2, &sSelectedPikaPowerTile[r1], 2, r4 + 0x40);
@@ -3041,7 +3513,7 @@ static void LoadPikaPowerMeter(u8 pikaPower)
sSelectedPikaPowerTile[r1] = sPikaPowerTileTable[r3][1];
LoadBgTilemap(2, &sSelectedPikaPowerTile[r1], 2, r4 + 0x40);
}
- gTasks[sSlotMachine->pikaPowerBoltTaskId].data[1] = pikaPower;
+ gTasks[sSlotMachine->pikaPowerBoltTaskId].data[1] = bolts;
}
#undef tState
@@ -3050,7 +3522,13 @@ static void LoadPikaPowerMeter(u8 pikaPower)
#undef tTimer
#undef tAnimating
-#define tState data[0]
+#define tState data[0]
+#define tReelSpeed data[1]
+#define tTimer3 data[2]
+#define tRtReelSpeed data[4]
+#define tTimer2 data[4]
+#define tTimer1 data[5]
+#define tExplodeChecks data[6]
static void BeginReelTime(void)
{
@@ -3067,10 +3545,7 @@ static bool8 IsReelTimeTaskDone(void)
static void Task_ReelTime(u8 taskId)
{
- // task.data[1] has something to do with the threshold
- // task.data[4] says how many pixels to advance the reel
- // task.data[5] is a timer
- sReelTimeActions[gTasks[taskId].tState](&gTasks[taskId]);
+ sReelTimeTasks[gTasks[taskId].tState](&gTasks[taskId]);
}
static void ReelTime_Init(struct Task *task)
@@ -3078,10 +3553,10 @@ static void ReelTime_Init(struct Task *task)
sSlotMachine->reelTimeSpinsLeft = 0;
sSlotMachine->reeltimePixelOffset = 0;
sSlotMachine->reeltimePosition = 0;
- task->tState++;
+ task->tState++; // RT_TASK_WINDOW_ENTER
task->data[1] = 0;
task->data[2] = 30;
- task->data[4] = 1280; // reel speed
+ task->tRtReelSpeed = 1280;
gSpriteCoordOffsetX = 0;
gSpriteCoordOffsetY = 0;
SetGpuReg(REG_OFFSET_BG1HOFS, 0);
@@ -3092,7 +3567,7 @@ static void ReelTime_Init(struct Task *task)
CreateReelTimeNumberSprites();
CreateReelTimeShadowSprites();
CreateReelTimeNumberGapSprite();
- GetReeltimeDraw();
+ GetReelTimeDraw();
StopMapMusic();
PlayNewMapMusic(MUS_ROULETTE);
}
@@ -3112,18 +3587,18 @@ static void ReelTime_WindowEnter(struct Task *task)
}
if (task->data[1] >= 200)
{
- task->tState++;
+ task->tState++; // RT_TASK_WAIT_START_PIKA
task->data[3] = 0;
}
- AdvanceReeltimeReel(task->data[4] >> 8);
+ AdvanceReeltimeReel(task->tRtReelSpeed >> 8);
}
static void ReelTime_WaitStartPikachu(struct Task *task)
{
- AdvanceReeltimeReel(task->data[4] >> 8);
- if (++task->data[5] >= 60)
+ AdvanceReeltimeReel(task->tRtReelSpeed >> 8);
+ if (++task->tTimer1 >= 60)
{
- task->tState++;
+ task->tState++; // RT_TASK_PIKA_SPEEDUP1
CreateReelTimeBoltSprites();
CreateReelTimePikachuAuraSprites();
}
@@ -3140,29 +3615,29 @@ static void ReelTime_PikachuSpeedUp1(struct Task *task)
memcpy(reelTimeBoltDelays, sReelTimeBoltDelays, sizeof(sReelTimeBoltDelays));
memcpy(pikachuAuraFlashDelays, sPikachuAuraFlashDelays, sizeof(sPikachuAuraFlashDelays));
- AdvanceReeltimeReel(task->data[4] >> 8);
+ AdvanceReeltimeReel(task->tRtReelSpeed >> 8);
// gradually slow down the reel
- task->data[4] -= 4;
- i = 4 - (task->data[4] >> 8);
+ task->tRtReelSpeed -= 4;
+ i = 4 - (task->tRtReelSpeed >> 8);
SetReelTimeBoltDelay(reelTimeBoltDelays[i]);
SetReelTimePikachuAuraFlashDelay(pikachuAuraFlashDelays[i]);
StartSpriteAnimIfDifferent(&gSprites[sSlotMachine->reelTimePikachuSpriteId], pikachuAnimIds[i]);
- // once speed goes below 256, go to next ReelTimeAction and keep the speed level
- if (task->data[4] <= 0x100)
+ // once speed goes below 256, go to next ReelTime task and keep the speed level
+ if (task->tRtReelSpeed <= 0x100)
{
- task->tState++;
- task->data[4] = 0x100;
- task->data[5] = 0;
+ task->tState++; // RT_TASK_PIKA_SPEEDUP2
+ task->tRtReelSpeed = 0x100;
+ task->tTimer1 = 0;
}
}
static void ReelTime_PikachuSpeedUp2(struct Task *task)
{
- AdvanceReeltimeReel(task->data[4] >> 8);
- if (++task->data[5] >= 80)
+ AdvanceReeltimeReel(task->tRtReelSpeed >> 8);
+ if (++task->tTimer1 >= 80)
{
- task->tState++;
- task->data[5] = 0;
+ task->tState++; // RT_TASK_WAIT_REEL
+ task->tTimer1 = 0;
SetReelTimePikachuAuraFlashDelay(2);
StartSpriteAnimIfDifferent(&gSprites[sSlotMachine->reelTimePikachuSpriteId], 3);
}
@@ -3170,83 +3645,94 @@ static void ReelTime_PikachuSpeedUp2(struct Task *task)
static void ReelTime_WaitReel(struct Task *task)
{
- AdvanceReeltimeReel(task->data[4] >> 8);
- task->data[4] = (u8)task->data[4] + 0x80;
- if (++task->data[5] >= 80)
+ AdvanceReeltimeReel(task->tRtReelSpeed >> 8);
+ task->tRtReelSpeed = (u8)task->tRtReelSpeed + 0x80;
+ if (++task->tTimer1 >= 80)
{
- task->tState++;
- task->data[5] = 0;
+ task->tState++; // RT_TASK_CHECK_EXPLODE
+ task->tTimer1 = 0;
}
}
+// Check whether the ReelTime machine should explode.
+//
+// The ReelTime machine displays 0 when this task starts. If there is a positive
+// ReelTime draw, the machine keeps spinning until it lands on that number.
+//
+// Otherwise, it checks every 40 frames whether it should explode. If so, it
+// explodes immediately. After 4 checks, the machine won't explode but continues
+// to spin until it lands on 0.
static void ReelTime_CheckExplode(struct Task *task)
{
- AdvanceReeltimeReel(task->data[4] >> 8);
- task->data[4] = (u8)task->data[4] + 0x40;
- if (++task->data[5] >= 40)
+ AdvanceReeltimeReel(task->tRtReelSpeed >> 8);
+ task->tRtReelSpeed = (u8)task->tRtReelSpeed + 0x40;
+ if (++task->tTimer1 >= 40)
{
- task->data[5] = 0;
+ task->tTimer1 = 0;
if (sSlotMachine->reelTimeDraw)
{
- if (sSlotMachine->reelTimeSpinsLeft <= task->data[6])
- task->tState++;
+ if (sSlotMachine->reelTimeSpinsLeft <= task->tExplodeChecks)
+ task->tState++; // RT_TASK_LAND
}
- else if (task->data[6] > 3)
+ else if (task->tExplodeChecks > 3)
{
- task->tState++;
+ task->tState++; // RT_TASK_LAND
}
- else if (ShouldReelTimeMachineExplode(task->data[6]))
+ else if (ShouldReelTimeMachineExplode(task->tExplodeChecks))
{
- task->tState = 14; // ReelTime_ExplodeMachine
+ task->tState = RT_TASK_EXPLODE;
}
- task->data[6]++;
+ task->tExplodeChecks++;
}
}
+// Reel spins until it lands on the selected outcome.
static void ReelTime_LandOnOutcome(struct Task *task)
{
s16 reeltimePixelOffset = sSlotMachine->reeltimePixelOffset % 20;
if (reeltimePixelOffset)
{
- reeltimePixelOffset = AdvanceReeltimeReelToNextTag(task->data[4] >> 8);
- task->data[4] = (u8)task->data[4] + 0x40;
+ reeltimePixelOffset = AdvanceReeltimeReelToNextSymbol(task->tRtReelSpeed >> 8);
+ task->tRtReelSpeed = (u8)task->tRtReelSpeed + 0x40;
}
- else if (GetNearbyReelTimeTag(1) != sSlotMachine->reelTimeDraw)
+ else if (GetReelTimeSymbol(1) != sSlotMachine->reelTimeDraw)
{
- AdvanceReeltimeReel(task->data[4] >> 8);
+ AdvanceReeltimeReel(task->tRtReelSpeed >> 8);
reeltimePixelOffset = sSlotMachine->reeltimePixelOffset % 20;
- task->data[4] = (u8)task->data[4] + 0x40;
+ task->tRtReelSpeed = (u8)task->tRtReelSpeed + 0x40;
}
- if (reeltimePixelOffset == 0 && GetNearbyReelTimeTag(1) == sSlotMachine->reelTimeDraw)
+ if (reeltimePixelOffset == 0 && GetReelTimeSymbol(1) == sSlotMachine->reelTimeDraw)
{
- task->data[4] = 0; // stop moving
- task->tState++;
+ task->tRtReelSpeed = 0; // Also initializes task->tTimer2
+ task->tState++; // RT_TASK_PIKA_REACT
}
}
+// Animate Pikachu reaction. Clear any power bolts the player may have won if
+// they got a positive ReelTime draw.
static void ReelTime_PikachuReact(struct Task *task)
{
- if (++task->data[4] >= 60)
+ if (++task->tTimer2 >= 60)
{
StopMapMusic();
DestroyReelTimeBoltSprites();
DestroyReelTimePikachuAuraSprites();
- task->tState++;
+ task->tState++; // RT_TASK_WAIT_CLEAR_POWER
if(sSlotMachine->reelTimeDraw == 0)
{
- task->data[4] = 0xa0;
+ task->tTimer2 = 0xa0;
StartSpriteAnimIfDifferent(&gSprites[sSlotMachine->reelTimePikachuSpriteId], 5);
PlayFanfare(MUS_TOO_BAD);
}
else
{
- task->data[4] = 0xc0;
+ task->tTimer2 = 0xc0;
StartSpriteAnimIfDifferent(&gSprites[sSlotMachine->reelTimePikachuSpriteId], 4);
gSprites[sSlotMachine->reelTimePikachuSpriteId].animCmdIndex = 0;
- if (sSlotMachine->pikaPower)
+ if (sSlotMachine->pikaPowerBolts)
{
ResetPikaPowerBolts();
- sSlotMachine->pikaPower = 0;
+ sSlotMachine->pikaPowerBolts = 0;
}
PlayFanfare(MUS_SLOTS_WIN);
}
@@ -3255,8 +3741,8 @@ static void ReelTime_PikachuReact(struct Task *task)
static void ReelTime_WaitClearPikaPower(struct Task *task)
{
- if ((task->data[4] == 0 || --task->data[4] == 0) && !IsPikaPowerBoltAnimating())
- task->tState++;
+ if ((task->tTimer2 == 0 || --task->tTimer2 == 0) && !IsPikaPowerBoltAnimating())
+ task->tState++; // RT_TASK_CLOSE_WINDOW_SUCCESS
}
static void ReelTime_CloseWindow(struct Task *task)
@@ -3270,16 +3756,20 @@ static void ReelTime_CloseWindow(struct Task *task)
if (task->data[3] >> 3 <= 25)
ClearReelTimeWindowTilemap(r4);
else
- task->tState++;
+ task->tState++; // RT_TASK_DESTROY_SPRITES
}
+// Destroy sprites and wrap up the ReelTime task.
+//
+// If the player got a positive ReelTime draw, select the speed that the slot
+// reels will initially move at.
static void ReelTime_DestroySprites(struct Task *task)
{
sSlotMachine->reelTimeSpinsUsed = 0;
sSlotMachine->reelTimeSpinsLeft = sSlotMachine->reelTimeDraw;
gSpriteCoordOffsetX = 0;
SetGpuReg(REG_OFFSET_BG1HOFS, 0);
- sSlotMachine->reelIncrement = 8;
+ sSlotMachine->reelSpeed = REEL_NORMAL_SPEED;
DestroyReelTimePikachuSprite();
DestroyReelTimeMachineSprites();
DestroyReelTimeShadowSprites();
@@ -3291,19 +3781,20 @@ static void ReelTime_DestroySprites(struct Task *task)
else
{
CreateDigitalDisplayScene(DIG_DISPLAY_REEL_TIME);
- task->data[1] = SlowReelSpeed();
- task->data[2] = 0;
+ task->tReelSpeed = ReelTimeSpeed();
+ task->tTimer3 = 0;
task->data[3] = 0;
- task->tState++;
+ task->tState++; // RT_TASK_SET_REEL_SPEED
}
}
-static void ReelTime_SetReelIncrement(struct Task *task)
+// Slow the slot reels down until they match the selected speed.
+static void ReelTime_SetReelSpeed(struct Task *task)
{
- if (sSlotMachine->reelIncrement == task->data[1])
- task->tState++;
- else if (sSlotMachine->reelPixelOffsets[0] % REEL_SYMBOL_HEIGHT == 0 && (++task->data[2]& 0x07) == 0)
- sSlotMachine->reelIncrement >>= 1;
+ if (sSlotMachine->reelSpeed == task->tReelSpeed)
+ task->tState++; // RT_TASK_END_SUCCESS
+ else if (sSlotMachine->reelPixelOffsets[0] % REEL_SYMBOL_HEIGHT == 0 && (++task->tTimer3 & 0x07) == 0)
+ sSlotMachine->reelSpeed >>= 1;
}
static void ReelTime_EndSuccess(struct Task *task)
@@ -3320,9 +3811,9 @@ static void ReelTime_ExplodeMachine(struct Task *task)
CreateReelTimeExplosionSprite();
gSprites[sSlotMachine->reelTimeShadowSpriteIds[0]].invisible = TRUE;
StartSpriteAnimIfDifferent(&gSprites[sSlotMachine->reelTimePikachuSpriteId], 5);
- task->tState++;
+ task->tState++; // RT_TASK_WAIT_EXPLODE
task->data[4] = 4;
- task->data[5] = 0;
+ task->tTimer1 = 0;
StopMapMusic();
PlayFanfare(MUS_TOO_BAD);
PlaySE(SE_M_EXPLOSION);
@@ -3332,9 +3823,9 @@ static void ReelTime_WaitExplode(struct Task *task)
{
gSpriteCoordOffsetY = task->data[4];
SetGpuReg(REG_OFFSET_BG1VOFS, task->data[4]);
- if (task->data[5] & 0x01)
+ if (task->tTimer1 & 0x01)
task->data[4] = -task->data[4];
- if ((++task->data[5] & 0x1f) == 0)
+ if ((++task->tTimer1 & 0x1f) == 0)
task->data[4] >>= 1;
if (task->data[4] == 0)
{
@@ -3343,8 +3834,8 @@ static void ReelTime_WaitExplode(struct Task *task)
CreateBrokenReelTimeMachineSprite();
CreateReelTimeSmokeSprite();
gSprites[sSlotMachine->reelTimeShadowSpriteIds[0]].invisible = FALSE;
- task->tState++;
- task->data[5] = 0;
+ task->tState++; // RT_TASK_WAIT_SMOKE
+ task->tTimer1 = 0;
}
}
@@ -3354,7 +3845,7 @@ static void ReelTime_WaitSmoke(struct Task *task)
SetGpuReg(REG_OFFSET_BG1VOFS, 0);
if (IsReelTimeSmokeAnimFinished())
{
- task->tState++;
+ task->tState++; // RT_TASK_CLOSE_WINDOW_FAILURE
DestroyReelTimeSmokeSprite();
}
}
@@ -3392,28 +3883,33 @@ static void ClearReelTimeWindowTilemap(s16 a0)
}
#undef tState
+#undef tReelSpeed
+#undef tRtReelSpeed
+#undef tTimer2
+#undef tTimer1
+#undef tExplodeChecks
#define tState data[0]
// Info Box is the screen shown when Select is pressed
static void OpenInfoBox(u8 digDisplayId)
{
- u8 taskId = CreateTask(RunInfoBoxActions, 1);
+ u8 taskId = CreateTask(Task_InfoBox, 1);
gTasks[taskId].data[1] = digDisplayId;
- RunInfoBoxActions(taskId);
+ Task_InfoBox(taskId);
}
static bool8 IsInfoBoxClosed(void)
{
- if (FindTaskIdByFunc(RunInfoBoxActions) == TASK_NONE)
+ if (FindTaskIdByFunc(Task_InfoBox) == TASK_NONE)
return TRUE;
else
return FALSE;
}
-static void RunInfoBoxActions(u8 taskId)
+static void Task_InfoBox(u8 taskId)
{
- sInfoBoxActions[gTasks[taskId].tState](&gTasks[taskId]);
+ sInfoBoxTasks[gTasks[taskId].tState](&gTasks[taskId]);
}
static void InfoBox_FadeIn(struct Task *task)
@@ -3422,7 +3918,7 @@ static void InfoBox_FadeIn(struct Task *task)
task->tState++;
}
-static void InfoBox_WaitForFade(struct Task *task)
+static void InfoBox_WaitFade(struct Task *task)
{
if (!gPaletteFade.active)
task->tState++;
@@ -3446,7 +3942,7 @@ static void InfoBox_AddText(struct Task *task)
task->tState++;
}
-static void InfoBox_AwaitPlayerInput(struct Task *task)
+static void InfoBox_WaitInput(struct Task *task)
{
if (JOY_NEW(B_BUTTON | SELECT_BUTTON))
{
@@ -3474,14 +3970,14 @@ static void InfoBox_CreateDigitalDisplay(struct Task *task)
static void InfoBox_LoadPikaPowerMeter(struct Task *task)
{
- LoadPikaPowerMeter(sSlotMachine->pikaPower);
+ LoadPikaPowerMeter(sSlotMachine->pikaPowerBolts);
BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB(0, 0, 0));
task->tState++;
}
static void InfoBox_FreeTask(struct Task *task)
{
- DestroyTask(FindTaskIdByFunc(RunInfoBoxActions));
+ DestroyTask(FindTaskIdByFunc(Task_InfoBox));
}
#undef tState
@@ -3572,7 +4068,7 @@ static bool8 IsDigitalDisplayAnimFinished(void)
static void Task_DigitalDisplay(u8 taskId)
{
- sDigitalDisplayActions[gTasks[taskId].data[0]](&gTasks[taskId]);
+ sDigitalDisplayTasks[gTasks[taskId].data[0]](&gTasks[taskId]);
}
static void DigitalDisplay_Idle(struct Task *task)
@@ -3601,8 +4097,8 @@ static void SpriteCB_ReelSymbol(struct Sprite *sprite)
{
sprite->data[2] = sSlotMachine->reelPixelOffsets[sprite->data[0]] + sprite->data[1];
sprite->data[2] %= 120;
- sprite->y = sSlotMachine->reelPixelOffsetsWhileStopping[sprite->data[0]] + 28 + sprite->data[2];
- sprite->sheetTileStart = GetSpriteTileStartByTag(GetTagAtRest(sprite->data[0], sprite->data[2] / 24));
+ sprite->y = sSlotMachine->reelShockOffsets[sprite->data[0]] + 28 + sprite->data[2];
+ sprite->sheetTileStart = GetSpriteTileStartByTag(GetSymbolAtRest(sprite->data[0], sprite->data[2] / 24));
SetSpriteSheetFrameTileNum(sprite);
}
@@ -3773,7 +4269,7 @@ static void SpriteCB_ReelTimeNumbers(struct Sprite *sprite)
s16 r0 = (u16)(sSlotMachine->reeltimePixelOffset + sprite->data[7]);
r0 %= 40;
sprite->y = r0 + 59;
- StartSpriteAnimIfDifferent(sprite, GetNearbyReelTimeTag(r0 / 20));
+ StartSpriteAnimIfDifferent(sprite, GetReelTimeSymbol(r0 / 20));
}
static void CreateReelTimeShadowSprites(void)
@@ -4720,90 +5216,92 @@ static void AllocDigitalDisplayGfx(void)
sImageTable_DigitalDisplay_DPad[1].size = 0x180;
}
-static const u8 sReelSymbolTileTags[NUM_REELS][SYMBOLS_PER_REEL] =
+static const u8 sReelSymbols[NUM_REELS][SYMBOLS_PER_REEL] =
{
[LEFT_REEL] = {
- GFXTAG_7_RED,
- GFXTAG_CHERRY,
- GFXTAG_AZURILL,
- GFXTAG_REPLAY,
- GFXTAG_POWER,
- GFXTAG_LOTAD,
- GFXTAG_7_BLUE,
- GFXTAG_LOTAD,
- GFXTAG_CHERRY,
- GFXTAG_POWER,
- GFXTAG_REPLAY,
- GFXTAG_AZURILL,
- GFXTAG_7_RED,
- GFXTAG_POWER,
- GFXTAG_LOTAD,
- GFXTAG_REPLAY,
- GFXTAG_AZURILL,
- GFXTAG_7_BLUE,
- GFXTAG_POWER,
- GFXTAG_LOTAD,
- GFXTAG_REPLAY
+ SYMBOL_7_RED,
+ SYMBOL_CHERRY,
+ SYMBOL_AZURILL,
+ SYMBOL_REPLAY,
+ SYMBOL_POWER,
+ SYMBOL_LOTAD,
+ SYMBOL_7_BLUE,
+ SYMBOL_LOTAD,
+ SYMBOL_CHERRY,
+ SYMBOL_POWER,
+ SYMBOL_REPLAY,
+ SYMBOL_AZURILL,
+ SYMBOL_7_RED,
+ SYMBOL_POWER,
+ SYMBOL_LOTAD,
+ SYMBOL_REPLAY,
+ SYMBOL_AZURILL,
+ SYMBOL_7_BLUE,
+ SYMBOL_POWER,
+ SYMBOL_LOTAD,
+ SYMBOL_REPLAY
},
[MIDDLE_REEL] = {
- GFXTAG_7_RED,
- GFXTAG_CHERRY,
- GFXTAG_REPLAY,
- GFXTAG_LOTAD,
- GFXTAG_AZURILL,
- GFXTAG_CHERRY,
- GFXTAG_REPLAY,
- GFXTAG_POWER,
- GFXTAG_POWER,
- GFXTAG_LOTAD,
- GFXTAG_7_BLUE,
- GFXTAG_LOTAD,
- GFXTAG_REPLAY,
- GFXTAG_CHERRY,
- GFXTAG_AZURILL,
- GFXTAG_LOTAD,
- GFXTAG_REPLAY,
- GFXTAG_CHERRY,
- GFXTAG_LOTAD,
- GFXTAG_REPLAY,
- GFXTAG_CHERRY
+ SYMBOL_7_RED,
+ SYMBOL_CHERRY,
+ SYMBOL_REPLAY,
+ SYMBOL_LOTAD,
+ SYMBOL_AZURILL,
+ SYMBOL_CHERRY,
+ SYMBOL_REPLAY,
+ SYMBOL_POWER,
+ SYMBOL_POWER,
+ SYMBOL_LOTAD,
+ SYMBOL_7_BLUE,
+ SYMBOL_LOTAD,
+ SYMBOL_REPLAY,
+ SYMBOL_CHERRY,
+ SYMBOL_AZURILL,
+ SYMBOL_LOTAD,
+ SYMBOL_REPLAY,
+ SYMBOL_CHERRY,
+ SYMBOL_LOTAD,
+ SYMBOL_REPLAY,
+ SYMBOL_CHERRY
},
[RIGHT_REEL] = {
- GFXTAG_7_RED,
- GFXTAG_POWER,
- GFXTAG_7_BLUE,
- GFXTAG_REPLAY,
- GFXTAG_LOTAD,
- GFXTAG_AZURILL,
- GFXTAG_REPLAY,
- GFXTAG_LOTAD,
- GFXTAG_POWER,
- GFXTAG_AZURILL,
- GFXTAG_REPLAY,
- GFXTAG_LOTAD,
- GFXTAG_AZURILL,
- GFXTAG_POWER,
- GFXTAG_REPLAY,
- GFXTAG_LOTAD,
- GFXTAG_AZURILL,
- GFXTAG_POWER,
- GFXTAG_REPLAY,
- GFXTAG_LOTAD,
- GFXTAG_CHERRY
+ SYMBOL_7_RED,
+ SYMBOL_POWER,
+ SYMBOL_7_BLUE,
+ SYMBOL_REPLAY,
+ SYMBOL_LOTAD,
+ SYMBOL_AZURILL,
+ SYMBOL_REPLAY,
+ SYMBOL_LOTAD,
+ SYMBOL_POWER,
+ SYMBOL_AZURILL,
+ SYMBOL_REPLAY,
+ SYMBOL_LOTAD,
+ SYMBOL_AZURILL,
+ SYMBOL_POWER,
+ SYMBOL_REPLAY,
+ SYMBOL_LOTAD,
+ SYMBOL_AZURILL,
+ SYMBOL_POWER,
+ SYMBOL_REPLAY,
+ SYMBOL_LOTAD,
+ SYMBOL_CHERRY
},
};
-static const u8 sReelTimeTags[] = {
+static const u8 sReelTimeSymbols[] = {
1, 0, 5, 4, 3, 2
};
+// Column 0: Normal game
+// Column 1: Lucky game
static const s16 sInitialReelPositions[NUM_REELS][2] = {
[LEFT_REEL] = {0, 6},
[MIDDLE_REEL] = {0, 10},
[RIGHT_REEL] = {0, 2}
};
-static const u8 sLuckyRoundProbabilities[NUM_SLOT_MACHINE_IDS][MAX_BET] = {
+static const u8 sSpecialDrawOdds[NUM_SLOT_MACHINE_IDS][MAX_BET] = {
[SLOT_MACHINE_UNLUCKIEST] = {1, 1, 12},
[SLOT_MACHINE_UNLUCKIER] = {1, 1, 14},
[SLOT_MACHINE_UNLUCKY] = {2, 2, 14},
@@ -4812,8 +5310,9 @@ static const u8 sLuckyRoundProbabilities[NUM_SLOT_MACHINE_IDS][MAX_BET] = {
[SLOT_MACHINE_LUCKIEST] = {3, 3, 16}
};
-static const u8 sLuckyFlagProbabilities_Top3[][NUM_SLOT_MACHINE_IDS] = {
- { // Probabilities for LUCKY_BIAS_777
+static const u8 sBiasProbabilities_Special[][NUM_SLOT_MACHINE_IDS] = {
+ {
+ // Probabilities for BIAS_STRAIGHT_7
[SLOT_MACHINE_UNLUCKIEST] = 25,
[SLOT_MACHINE_UNLUCKIER] = 25,
[SLOT_MACHINE_UNLUCKY] = 30,
@@ -4821,7 +5320,8 @@ static const u8 sLuckyFlagProbabilities_Top3[][NUM_SLOT_MACHINE_IDS] = {
[SLOT_MACHINE_LUCKIER] = 40,
[SLOT_MACHINE_LUCKIEST] = 50
},
- { // Probabilities for LUCKY_BIAS_REELTIME
+ {
+ // Probabilities for BIAS_REELTIME
[SLOT_MACHINE_UNLUCKIEST] = 25,
[SLOT_MACHINE_UNLUCKIER] = 25,
[SLOT_MACHINE_UNLUCKY] = 30,
@@ -4829,7 +5329,8 @@ static const u8 sLuckyFlagProbabilities_Top3[][NUM_SLOT_MACHINE_IDS] = {
[SLOT_MACHINE_LUCKIER] = 35,
[SLOT_MACHINE_LUCKIEST] = 35
},
- { // Probabilities for LUCKY_BIAS_MIXED_777
+ {
+ // Probabilities for BIAS_MIXED_7
[SLOT_MACHINE_UNLUCKIEST] = 25,
[SLOT_MACHINE_UNLUCKIER] = 25,
[SLOT_MACHINE_UNLUCKY] = 30,
@@ -4839,8 +5340,9 @@ static const u8 sLuckyFlagProbabilities_Top3[][NUM_SLOT_MACHINE_IDS] = {
}
};
-static const u8 sLuckyFlagProbabilities_NotTop3[][NUM_SLOT_MACHINE_IDS] = {
- { // Probabilities for LUCKY_BIAS_POWER
+static const u8 sBiasProbabilities_Regular[][NUM_SLOT_MACHINE_IDS] = {
+ {
+ // Probabilities for BIAS_POWER
[SLOT_MACHINE_UNLUCKIEST] = 20,
[SLOT_MACHINE_UNLUCKIER] = 25,
[SLOT_MACHINE_UNLUCKY] = 25,
@@ -4848,7 +5350,8 @@ static const u8 sLuckyFlagProbabilities_NotTop3[][NUM_SLOT_MACHINE_IDS] = {
[SLOT_MACHINE_LUCKIER] = 25,
[SLOT_MACHINE_LUCKIEST] = 25
},
- { // Probabilities for LUCKY_BIAS_AZURILL
+ {
+ // Probabilities for BIAS_AZURILL
[SLOT_MACHINE_UNLUCKIEST] = 12,
[SLOT_MACHINE_UNLUCKIER] = 15,
[SLOT_MACHINE_UNLUCKY] = 15,
@@ -4856,7 +5359,8 @@ static const u8 sLuckyFlagProbabilities_NotTop3[][NUM_SLOT_MACHINE_IDS] = {
[SLOT_MACHINE_LUCKIER] = 19,
[SLOT_MACHINE_LUCKIEST] = 22
},
- { // Probabilities for LUCKY_BIAS_LOTAD
+ {
+ // Probabilities for BIAS_LOTAD
[SLOT_MACHINE_UNLUCKIEST] = 25,
[SLOT_MACHINE_UNLUCKIER] = 25,
[SLOT_MACHINE_UNLUCKY] = 25,
@@ -4864,7 +5368,8 @@ static const u8 sLuckyFlagProbabilities_NotTop3[][NUM_SLOT_MACHINE_IDS] = {
[SLOT_MACHINE_LUCKIER] = 30,
[SLOT_MACHINE_LUCKIEST] = 40
},
- { // Probabilities for LUCKY_BIAS_CHERRY
+ {
+ // Probabilities for BIAS_CHERRY
[SLOT_MACHINE_UNLUCKIEST] = 25,
[SLOT_MACHINE_UNLUCKIER] = 25,
[SLOT_MACHINE_UNLUCKY] = 20,
@@ -4872,7 +5377,8 @@ static const u8 sLuckyFlagProbabilities_NotTop3[][NUM_SLOT_MACHINE_IDS] = {
[SLOT_MACHINE_LUCKIER] = 15,
[SLOT_MACHINE_LUCKIEST] = 15
},
- { // Probabilities for LUCKY_BIAS_REPLAY
+ {
+ // Probabilities for BIAS_REPLAY
[SLOT_MACHINE_UNLUCKIEST] = 40,
[SLOT_MACHINE_UNLUCKIER] = 40,
[SLOT_MACHINE_UNLUCKY] = 35,
@@ -4882,29 +5388,61 @@ static const u8 sLuckyFlagProbabilities_NotTop3[][NUM_SLOT_MACHINE_IDS] = {
}
};
-static const u8 sReeltimeProbabilities_UnluckyGame[][17] = {
- {243, 243, 243, 80, 80, 80, 80, 40, 40, 40, 40, 40, 40, 5, 5, 5, 5},
- { 5, 5, 5, 150, 150, 150, 150, 130, 130, 130, 130, 130, 130, 100, 100, 100, 5},
- { 4, 4, 4, 20, 20, 20, 20, 80, 80, 80, 80, 80, 80, 100, 100, 100, 40},
- { 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 45, 45, 45, 100},
- { 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 100},
- { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6}
+// INTENTION:
+// As you get more Power bolts, the odds of getting higher yields (3+ spins)
+// increases modestly. There's a high chance of getting at least 1 spin, which
+// will clear your Power bolts.
+//
+// NOTE: The way these probabilities are drawn significantly skews the odds
+// toward drawing 0 spins:
+//
+// | Up to N bolts | Prob intended | Prob actual |
+// |---------------|---------------|-------------|
+// | 2 | 94% | 99% |
+// | 6 | 31% | 57% |
+// | 12 | 16% | 44% |
+// | 15 | 2% | 31% |
+// | 16 | 2% | 31% |
+static const u8 sReelTimeProbabilities_NormalGame[][17] = {
+ {243, 243, 243, 80, 80, 80, 80, 40, 40, 40, 40, 40, 40, 5, 5, 5, 5}, // 0 spins
+ { 5, 5, 5, 150, 150, 150, 150, 130, 130, 130, 130, 130, 130, 100, 100, 100, 5}, // 1 spin
+ { 4, 4, 4, 20, 20, 20, 20, 80, 80, 80, 80, 80, 80, 100, 100, 100, 40}, // 2 spins
+ { 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 45, 45, 45, 100}, // 3 spins
+ { 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 100}, // 4 spins
+ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6} // 5 spins
};
+// INTENTION:
+// As you get more Power bolts, the odds of getting higher yields (3+ spins)
+// increases substantially. There is always a high chance of getting no spins,
+// which lets you keep your Power bolts.
+//
+// NOTE: The way these probabilities are drawn significantly skews the odds
+// toward drawing 0 spins:
+//
+// | Up to N bolts | Prob intended | Prob actual |
+// |---------------|---------------|-------------|
+// | 2 | 94% | 99% |
+// | 6 | 78% | 96% |
+// | 12 | 63% | 88% |
+// | 15 | 27% | 58% |
+// | 16 | 2% | 33% |
static const u8 sReelTimeProbabilities_LuckyGame[][17] = {
- { 243, 243, 243, 200, 200, 200, 200, 160, 160, 160, 160, 160, 160, 70, 70, 70, 5},
- { 5, 5, 5, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 2, 2, 2, 6},
- { 4, 4, 4, 25, 25, 25, 25, 30, 30, 30, 30, 30, 30, 40, 40, 40, 35},
- { 2, 2, 2, 3, 3, 3, 3, 30, 30, 30, 30, 30, 30, 100, 100, 100, 50},
- { 1, 1, 1, 2, 2, 2, 2, 30, 30, 30, 30, 30, 30, 40, 40, 40, 100},
- { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 60}
+ { 243, 243, 243, 200, 200, 200, 200, 160, 160, 160, 160, 160, 160, 70, 70, 70, 5}, // 0 spins
+ { 5, 5, 5, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 2, 2, 2, 6}, // 1 spin
+ { 4, 4, 4, 25, 25, 25, 25, 30, 30, 30, 30, 30, 30, 40, 40, 40, 35}, // 2 spins
+ { 2, 2, 2, 3, 3, 3, 3, 30, 30, 30, 30, 30, 30, 100, 100, 100, 50}, // 3 spins
+ { 1, 1, 1, 2, 2, 2, 2, 30, 30, 30, 30, 30, 30, 40, 40, 40, 100}, // 4 spins
+ { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 60} // 5 spins
};
static const u16 sReelTimeExplodeProbability[] = {
128, 175, 200, 225, 256
};
-static const u16 sReelIncrementTable[][2] = {
+// Column 0: Probability of half-speed
+// Column 1: Base probability of quarter-speed
+static const u16 sReelTimeSpeed_Probabilities[][2] = {
{10, 5},
{10, 10},
{10, 15},
@@ -4912,55 +5450,62 @@ static const u16 sReelIncrementTable[][2] = {
{10, 35}
};
-static const u16 sReelTimeBonusIncrementTable[] = {
+// Boosted odds of quarter speed during ReelTime
+static const u16 sQuarterSpeed_ProbabilityBoost[] = {
0, 5, 10, 15, 20
};
-// tentative name
-static const u8 sBiasTags[] = {
- GFXTAG_REPLAY, GFXTAG_CHERRY, GFXTAG_LOTAD, GFXTAG_AZURILL, GFXTAG_POWER, GFXTAG_7_RED, GFXTAG_7_RED, GFXTAG_7_RED
+static const u8 sBiasSymbols[] = {
+ SYMBOL_REPLAY, // BIAS_REPLAY
+ SYMBOL_CHERRY, // BIAS_CHERRY
+ SYMBOL_LOTAD, // BIAS_LOTAD
+ SYMBOL_AZURILL, // BIAS_AZURILL
+ SYMBOL_POWER, // BIAS_POWER
+ SYMBOL_7_RED, // BIAS_REELTIME
+ SYMBOL_7_RED, // BIAS_MIXED_7
+ SYMBOL_7_RED // BIAS_STRAIGHT_7
};
-static const u16 sLuckyFlagSettings_Top3[] = {
- LUCKY_BIAS_777, LUCKY_BIAS_REELTIME, LUCKY_BIAS_MIXED_777
+static const u16 sBiasesSpecial[] = {
+ BIAS_STRAIGHT_7, BIAS_REELTIME, BIAS_MIXED_7
};
-static const u16 sLuckyFlagSettings_NotTop3[] = {
- LUCKY_BIAS_POWER, LUCKY_BIAS_AZURILL, LUCKY_BIAS_LOTAD, LUCKY_BIAS_CHERRY, LUCKY_BIAS_REPLAY
+static const u16 sBiasesRegular[] = {
+ BIAS_POWER, BIAS_AZURILL, BIAS_LOTAD, BIAS_CHERRY, BIAS_REPLAY
};
-static const u8 sSymToMatch[] = {
- [GFXTAG_7_RED] = MATCHED_777_RED,
- [GFXTAG_7_BLUE] = MATCHED_777_BLUE,
- [GFXTAG_AZURILL] = MATCHED_AZURILL,
- [GFXTAG_LOTAD] = MATCHED_LOTAD,
- [GFXTAG_CHERRY] = MATCHED_1CHERRY,
- [GFXTAG_POWER] = MATCHED_POWER,
- [GFXTAG_REPLAY] = MATCHED_REPLAY
+static const u8 sSymbolToMatch[] = {
+ [SYMBOL_7_RED] = MATCH_RED_7,
+ [SYMBOL_7_BLUE] = MATCH_BLUE_7,
+ [SYMBOL_AZURILL] = MATCH_AZURILL,
+ [SYMBOL_LOTAD] = MATCH_LOTAD,
+ [SYMBOL_CHERRY] = MATCH_CHERRY,
+ [SYMBOL_POWER] = MATCH_POWER,
+ [SYMBOL_REPLAY] = MATCH_REPLAY
};
static const u16 sSlotMatchFlags[] = {
- [MATCHED_1CHERRY] = 1 << MATCHED_1CHERRY,
- [MATCHED_2CHERRY] = 1 << MATCHED_2CHERRY,
- [MATCHED_REPLAY] = 1 << MATCHED_REPLAY,
- [MATCHED_LOTAD] = 1 << MATCHED_LOTAD,
- [MATCHED_AZURILL] = 1 << MATCHED_AZURILL,
- [MATCHED_POWER] = 1 << MATCHED_POWER,
- [MATCHED_777_MIXED] = 1 << MATCHED_777_MIXED,
- [MATCHED_777_RED] = 1 << MATCHED_777_RED,
- [MATCHED_777_BLUE] = 1 << MATCHED_777_BLUE
+ [MATCH_CHERRY] = 1 << MATCH_CHERRY,
+ [MATCH_TOPBOT_CHERRY] = 1 << MATCH_TOPBOT_CHERRY,
+ [MATCH_REPLAY] = 1 << MATCH_REPLAY,
+ [MATCH_LOTAD] = 1 << MATCH_LOTAD,
+ [MATCH_AZURILL] = 1 << MATCH_AZURILL,
+ [MATCH_POWER] = 1 << MATCH_POWER,
+ [MATCH_MIXED_7] = 1 << MATCH_MIXED_7,
+ [MATCH_RED_7] = 1 << MATCH_RED_7,
+ [MATCH_BLUE_7] = 1 << MATCH_BLUE_7
};
static const u16 sSlotPayouts[] = {
- [MATCHED_1CHERRY] = 2,
- [MATCHED_2CHERRY] = 4,
- [MATCHED_REPLAY] = 0,
- [MATCHED_LOTAD] = 6,
- [MATCHED_AZURILL] = 12,
- [MATCHED_POWER] = 3,
- [MATCHED_777_MIXED] = 90,
- [MATCHED_777_RED] = 300,
- [MATCHED_777_BLUE] = 300
+ [MATCH_CHERRY] = 2,
+ [MATCH_TOPBOT_CHERRY] = 4,
+ [MATCH_REPLAY] = 0,
+ [MATCH_LOTAD] = 6,
+ [MATCH_AZURILL] = 12,
+ [MATCH_POWER] = 3,
+ [MATCH_MIXED_7] = 90,
+ [MATCH_RED_7] = 300,
+ [MATCH_BLUE_7] = 300
};
static const s16 sDigitalDisplay_SpriteCoords[][2] = {
@@ -7154,18 +7699,18 @@ static const struct SpriteSheet sSlotMachineSpriteSheets[22] =
static const u8 *const sReelBackground_Tilemap = gSlotMachineReelBackground_Tilemap;
-static const u16 sUnused[] =
+static const u16 sUnusedColors[] =
{
- 0x6F7B,
- 0x6968,
- 0x36AB,
- 0x7FFF,
- 0x5750,
- 0x7EC0,
- 0x02BA,
- 0x02BA,
- 0x01FD,
- 0x01FD,
+ RGB(27, 27, 27),
+ RGB(8, 11, 26),
+ RGB(11, 21, 13),
+ RGB(31, 31, 31),
+ RGB(16, 26, 21),
+ RGB(0, 22, 31),
+ RGB(26, 21, 0),
+ RGB(26, 21, 0),
+ RGB(29, 15, 0),
+ RGB(29, 15, 0),
};
// The Bet 2 and 3 match line palettes are duplicated unnecessarily
@@ -7203,8 +7748,8 @@ static const u8 sMatchLinePalOffsets[NUM_MATCH_LINES] = {
static const u8 sBetToMatchLineIds[MAX_BET][2] =
{
{MATCH_MIDDLE_ROW, MATCH_MIDDLE_ROW}, // Bet 1
- {MATCH_TOP_ROW, MATCH_BOTTOM_ROW}, // Bet 2
- {MATCH_NWSE_DIAG, MATCH_NESW_DIAG}, // Bet 3
+ {MATCH_TOP_ROW, MATCH_BOTTOM_ROW}, // Bet 2
+ {MATCH_NWSE_DIAG, MATCH_NESW_DIAG}, // Bet 3
};
static const u8 sMatchLinesPerBet[MAX_BET] = { 1, 2, 2 };
@@ -7234,7 +7779,10 @@ static const u16 *const sPokeballShiningPalTable[] =
};
static const u16 *const sDigitalDisplay_Pal = gSlotMachineDigitalDisplay_Pal;
-static const u16 sUnkPalette[] = INCBIN_U16("graphics/slot_machine/85A8524.bin");
+static const u16 sUnkPalette[16] = {
+ [1] = RGB_WHITEALPHA,
+ [3] = RGB(8, 8, 8),
+};
static const struct SpritePalette sSlotMachineSpritePalettes[] =
{
diff --git a/src/starter_choose.c b/src/starter_choose.c
index ca393c4d81..81a88e7714 100644
--- a/src/starter_choose.c
+++ b/src/starter_choose.c
@@ -53,17 +53,17 @@ static u16 sStarterLabelWindowId;
const u16 gBirchBagGrassPal[][16] =
{
- INCBIN_U16("graphics/misc/birch_bag.gbapal"),
- INCBIN_U16("graphics/misc/birch_grass.gbapal"),
+ INCBIN_U16("graphics/starter_choose/birch_bag.gbapal"),
+ INCBIN_U16("graphics/starter_choose/birch_grass.gbapal"),
};
-static const u16 sPokeballSelection_Pal[] = INCBIN_U16("graphics/misc/pokeball_selection.gbapal");
-static const u16 sStarterCircle_Pal[] = INCBIN_U16("graphics/misc/starter_circle.gbapal");
-const u32 gBirchBagTilemap[] = INCBIN_U32("graphics/misc/birch_bag_map.bin.lz");
-const u32 gBirchGrassTilemap[] = INCBIN_U32("graphics/misc/birch_grass_map.bin.lz");
-const u32 gBirchHelpGfx[] = INCBIN_U32("graphics/misc/birch_help.4bpp.lz"); // Birch bag and grass combined
-const u32 gPokeballSelection_Gfx[] = INCBIN_U32("graphics/misc/pokeball_selection.4bpp.lz");
-static const u32 sStarterCircle_Gfx[] = INCBIN_U32("graphics/misc/starter_circle.4bpp.lz");
+static const u16 sPokeballSelection_Pal[] = INCBIN_U16("graphics/starter_choose/pokeball_selection.gbapal");
+static const u16 sStarterCircle_Pal[] = INCBIN_U16("graphics/starter_choose/starter_circle.gbapal");
+const u32 gBirchBagTilemap[] = INCBIN_U32("graphics/starter_choose/birch_bag.bin.lz");
+const u32 gBirchGrassTilemap[] = INCBIN_U32("graphics/starter_choose/birch_grass.bin.lz");
+const u32 gBirchHelpGfx[] = INCBIN_U32("graphics/starter_choose/birch_help.4bpp.lz"); // Birch bag and grass combined
+const u32 gPokeballSelection_Gfx[] = INCBIN_U32("graphics/starter_choose/pokeball_selection.4bpp.lz");
+static const u32 sStarterCircle_Gfx[] = INCBIN_U32("graphics/starter_choose/starter_circle.4bpp.lz");
static const struct WindowTemplate sWindowTemplates[] =
{
diff --git a/src/tileset_anims.c b/src/tileset_anims.c
index 71f8044f9f..3676006a6a 100644
--- a/src/tileset_anims.c
+++ b/src/tileset_anims.c
@@ -632,45 +632,45 @@ void InitTilesetAnim_Building(void)
static void TilesetAnim_General(u16 timer)
{
if (timer % 16 == 0)
- QueueAnimTiles_General_Flower(timer >> 4);
+ QueueAnimTiles_General_Flower(timer / 16);
if (timer % 16 == 1)
- QueueAnimTiles_General_Water(timer >> 4);
+ QueueAnimTiles_General_Water(timer / 16);
if (timer % 16 == 2)
- QueueAnimTiles_General_SandWaterEdge(timer >> 4);
+ QueueAnimTiles_General_SandWaterEdge(timer / 16);
if (timer % 16 == 3)
- QueueAnimTiles_General_Waterfall(timer >> 4);
+ QueueAnimTiles_General_Waterfall(timer / 16);
if (timer % 16 == 4)
- QueueAnimTiles_General_LandWaterEdge(timer >> 4);
+ QueueAnimTiles_General_LandWaterEdge(timer / 16);
}
static void TilesetAnim_Building(u16 timer)
{
if (timer % 8 == 0)
- QueueAnimTiles_Building_TVTurnedOn(timer >> 3);
+ QueueAnimTiles_Building_TVTurnedOn(timer / 8);
}
static void QueueAnimTiles_General_Flower(u16 timer)
{
- u16 i = timer % 4;
- AppendTilesetAnimToBuffer(gTilesetAnims_General_Flower[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(508)), 0x80);
+ u16 i = timer % ARRAY_COUNT(gTilesetAnims_General_Flower);
+ AppendTilesetAnimToBuffer(gTilesetAnims_General_Flower[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(508)), 4 * TILE_SIZE_4BPP);
}
static void QueueAnimTiles_General_Water(u16 timer)
{
- u8 i = timer % 8;
- AppendTilesetAnimToBuffer(gTilesetAnims_General_Water[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(432)), 0x3C0);
+ u8 i = timer % ARRAY_COUNT(gTilesetAnims_General_Water);
+ AppendTilesetAnimToBuffer(gTilesetAnims_General_Water[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(432)), 30 * TILE_SIZE_4BPP);
}
static void QueueAnimTiles_General_SandWaterEdge(u16 timer)
{
- u16 i = timer % 8;
- AppendTilesetAnimToBuffer(gTilesetAnims_General_SandWaterEdge[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(464)), 0x140);
+ u16 i = timer % ARRAY_COUNT(gTilesetAnims_General_SandWaterEdge);
+ AppendTilesetAnimToBuffer(gTilesetAnims_General_SandWaterEdge[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(464)), 10 * TILE_SIZE_4BPP);
}
static void QueueAnimTiles_General_Waterfall(u16 timer)
{
- u16 i = timer % 4;
- AppendTilesetAnimToBuffer(gTilesetAnims_General_Waterfall[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(496)), 0xc0);
+ u16 i = timer % ARRAY_COUNT(gTilesetAnims_General_Waterfall);
+ AppendTilesetAnimToBuffer(gTilesetAnims_General_Waterfall[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(496)), 6 * TILE_SIZE_4BPP);
}
void InitTilesetAnim_Petalburg(void)
@@ -838,336 +838,336 @@ static void TilesetAnim_Rustboro(u16 timer)
{
if (timer % 8 == 0)
{
- QueueAnimTiles_Rustboro_WindyWater(timer >> 3, 0);
- QueueAnimTiles_Rustboro_Fountain(timer >> 3);
+ QueueAnimTiles_Rustboro_WindyWater(timer / 8, 0);
+ QueueAnimTiles_Rustboro_Fountain(timer / 8);
}
if (timer % 8 == 1)
- QueueAnimTiles_Rustboro_WindyWater(timer >> 3, 1);
+ QueueAnimTiles_Rustboro_WindyWater(timer / 8, 1);
if (timer % 8 == 2)
- QueueAnimTiles_Rustboro_WindyWater(timer >> 3, 2);
+ QueueAnimTiles_Rustboro_WindyWater(timer / 8, 2);
if (timer % 8 == 3)
- QueueAnimTiles_Rustboro_WindyWater(timer >> 3, 3);
+ QueueAnimTiles_Rustboro_WindyWater(timer / 8, 3);
if (timer % 8 == 4)
- QueueAnimTiles_Rustboro_WindyWater(timer >> 3, 4);
+ QueueAnimTiles_Rustboro_WindyWater(timer / 8, 4);
if (timer % 8 == 5)
- QueueAnimTiles_Rustboro_WindyWater(timer >> 3, 5);
+ QueueAnimTiles_Rustboro_WindyWater(timer / 8, 5);
if (timer % 8 == 6)
- QueueAnimTiles_Rustboro_WindyWater(timer >> 3, 6);
+ QueueAnimTiles_Rustboro_WindyWater(timer / 8, 6);
if (timer % 8 == 7)
- QueueAnimTiles_Rustboro_WindyWater(timer >> 3, 7);
+ QueueAnimTiles_Rustboro_WindyWater(timer / 8, 7);
}
static void TilesetAnim_Dewford(u16 timer)
{
if (timer % 8 == 0)
- QueueAnimTiles_Dewford_Flag(timer >> 3);
+ QueueAnimTiles_Dewford_Flag(timer / 8);
}
static void TilesetAnim_Slateport(u16 timer)
{
if (timer % 16 == 0)
- QueueAnimTiles_Slateport_Balloons(timer >> 4);
+ QueueAnimTiles_Slateport_Balloons(timer / 16);
}
static void TilesetAnim_Mauville(u16 timer)
{
if (timer % 8 == 0)
- QueueAnimTiles_Mauville_Flowers(timer >> 3, 0);
+ QueueAnimTiles_Mauville_Flowers(timer / 8, 0);
if (timer % 8 == 1)
- QueueAnimTiles_Mauville_Flowers(timer >> 3, 1);
+ QueueAnimTiles_Mauville_Flowers(timer / 8, 1);
if (timer % 8 == 2)
- QueueAnimTiles_Mauville_Flowers(timer >> 3, 2);
+ QueueAnimTiles_Mauville_Flowers(timer / 8, 2);
if (timer % 8 == 3)
- QueueAnimTiles_Mauville_Flowers(timer >> 3, 3);
+ QueueAnimTiles_Mauville_Flowers(timer / 8, 3);
if (timer % 8 == 4)
- QueueAnimTiles_Mauville_Flowers(timer >> 3, 4);
+ QueueAnimTiles_Mauville_Flowers(timer / 8, 4);
if (timer % 8 == 5)
- QueueAnimTiles_Mauville_Flowers(timer >> 3, 5);
+ QueueAnimTiles_Mauville_Flowers(timer / 8, 5);
if (timer % 8 == 6)
- QueueAnimTiles_Mauville_Flowers(timer >> 3, 6);
+ QueueAnimTiles_Mauville_Flowers(timer / 8, 6);
if (timer % 8 == 7)
- QueueAnimTiles_Mauville_Flowers(timer >> 3, 7);
+ QueueAnimTiles_Mauville_Flowers(timer / 8, 7);
}
static void TilesetAnim_Lavaridge(u16 timer)
{
if (timer % 16 == 0)
- QueueAnimTiles_Lavaridge_Steam(timer >> 4);
+ QueueAnimTiles_Lavaridge_Steam(timer / 16);
if (timer % 16 == 1)
- QueueAnimTiles_Lavaridge_Lava(timer >> 4);
+ QueueAnimTiles_Lavaridge_Lava(timer / 16);
}
static void TilesetAnim_EverGrande(u16 timer)
{
if (timer % 8 == 0)
- QueueAnimTiles_EverGrande_Flowers(timer >> 3, 0);
+ QueueAnimTiles_EverGrande_Flowers(timer / 8, 0);
if (timer % 8 == 1)
- QueueAnimTiles_EverGrande_Flowers(timer >> 3, 1);
+ QueueAnimTiles_EverGrande_Flowers(timer / 8, 1);
if (timer % 8 == 2)
- QueueAnimTiles_EverGrande_Flowers(timer >> 3, 2);
+ QueueAnimTiles_EverGrande_Flowers(timer / 8, 2);
if (timer % 8 == 3)
- QueueAnimTiles_EverGrande_Flowers(timer >> 3, 3);
+ QueueAnimTiles_EverGrande_Flowers(timer / 8, 3);
if (timer % 8 == 4)
- QueueAnimTiles_EverGrande_Flowers(timer >> 3, 4);
+ QueueAnimTiles_EverGrande_Flowers(timer / 8, 4);
if (timer % 8 == 5)
- QueueAnimTiles_EverGrande_Flowers(timer >> 3, 5);
+ QueueAnimTiles_EverGrande_Flowers(timer / 8, 5);
if (timer % 8 == 6)
- QueueAnimTiles_EverGrande_Flowers(timer >> 3, 6);
+ QueueAnimTiles_EverGrande_Flowers(timer / 8, 6);
if (timer % 8 == 7)
- QueueAnimTiles_EverGrande_Flowers(timer >> 3, 7);
+ QueueAnimTiles_EverGrande_Flowers(timer / 8, 7);
}
static void TilesetAnim_Pacifidlog(u16 timer)
{
if (timer % 16 == 0)
- QueueAnimTiles_Pacifidlog_LogBridges(timer >> 4);
+ QueueAnimTiles_Pacifidlog_LogBridges(timer / 16);
if (timer % 16 == 1)
- QueueAnimTiles_Pacifidlog_WaterCurrents(timer >> 4);
+ QueueAnimTiles_Pacifidlog_WaterCurrents(timer / 16);
}
static void TilesetAnim_Sootopolis(u16 timer)
{
if (timer % 16 == 0)
- QueueAnimTiles_Sootopolis_StormyWater(timer >> 4);
+ QueueAnimTiles_Sootopolis_StormyWater(timer / 16);
}
static void TilesetAnim_Underwater(u16 timer)
{
if (timer % 16 == 0)
- QueueAnimTiles_Underwater_Seaweed(timer >> 4);
+ QueueAnimTiles_Underwater_Seaweed(timer / 16);
}
static void TilesetAnim_Cave(u16 timer)
{
if (timer % 16 == 1)
- QueueAnimTiles_Cave_Lava(timer >> 4);
+ QueueAnimTiles_Cave_Lava(timer / 16);
}
static void TilesetAnim_BattleFrontierOutsideWest(u16 timer)
{
if (timer % 8 == 0)
- QueueAnimTiles_BattleFrontierOutsideWest_Flag(timer >> 3);
+ QueueAnimTiles_BattleFrontierOutsideWest_Flag(timer / 8);
}
static void TilesetAnim_BattleFrontierOutsideEast(u16 timer)
{
if (timer % 8 == 0)
- QueueAnimTiles_BattleFrontierOutsideEast_Flag(timer >> 3);
+ QueueAnimTiles_BattleFrontierOutsideEast_Flag(timer / 8);
}
static void QueueAnimTiles_General_LandWaterEdge(u16 timer)
{
- u16 i = timer % 4;
- AppendTilesetAnimToBuffer(gTilesetAnims_General_LandWaterEdge[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(480)), 0x140);
+ u16 i = timer % ARRAY_COUNT(gTilesetAnims_General_LandWaterEdge);
+ AppendTilesetAnimToBuffer(gTilesetAnims_General_LandWaterEdge[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(480)), 10 * TILE_SIZE_4BPP);
}
static void QueueAnimTiles_Lavaridge_Steam(u8 timer)
{
- u8 i = timer % 4;
- AppendTilesetAnimToBuffer(gTilesetAnims_Lavaridge_Steam[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 288)), 0x80);
+ u8 i = timer % ARRAY_COUNT(gTilesetAnims_Lavaridge_Steam);
+ AppendTilesetAnimToBuffer(gTilesetAnims_Lavaridge_Steam[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 288)), 4 * TILE_SIZE_4BPP);
- i = (timer + 2) % 4;
- AppendTilesetAnimToBuffer(gTilesetAnims_Lavaridge_Steam[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 292)), 0x80);
+ i = (timer + 2) % (int)ARRAY_COUNT(gTilesetAnims_Lavaridge_Steam);
+ AppendTilesetAnimToBuffer(gTilesetAnims_Lavaridge_Steam[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 292)), 4 * TILE_SIZE_4BPP);
}
static void QueueAnimTiles_Pacifidlog_LogBridges(u8 timer)
{
- u8 i = timer % 4;
- AppendTilesetAnimToBuffer(gTilesetAnims_Pacifidlog_LogBridges[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 464)), 0x3C0);
+ u8 i = timer % ARRAY_COUNT(gTilesetAnims_Pacifidlog_LogBridges);
+ AppendTilesetAnimToBuffer(gTilesetAnims_Pacifidlog_LogBridges[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 464)), 30 * TILE_SIZE_4BPP);
}
static void QueueAnimTiles_Underwater_Seaweed(u8 timer)
{
- u8 i = timer % 4;
- AppendTilesetAnimToBuffer(gTilesetAnims_Underwater_Seaweed[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 496)), 0x80);
+ u8 i = timer % ARRAY_COUNT(gTilesetAnims_Underwater_Seaweed);
+ AppendTilesetAnimToBuffer(gTilesetAnims_Underwater_Seaweed[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 496)), 4 * TILE_SIZE_4BPP);
}
static void QueueAnimTiles_Pacifidlog_WaterCurrents(u8 timer)
{
- u8 i = timer % 8;
- AppendTilesetAnimToBuffer(gTilesetAnims_Pacifidlog_WaterCurrents[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 496)), 0x100);
+ u8 i = timer % ARRAY_COUNT(gTilesetAnims_Pacifidlog_WaterCurrents);
+ AppendTilesetAnimToBuffer(gTilesetAnims_Pacifidlog_WaterCurrents[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 496)), 8 * TILE_SIZE_4BPP);
}
static void QueueAnimTiles_Mauville_Flowers(u16 timer_div, u8 timer_mod)
{
timer_div -= timer_mod;
- if (timer_div < 12) // almost certainly a typo
+ if (timer_div < min(ARRAY_COUNT(gTilesetAnims_Mauville_Flower1), ARRAY_COUNT(gTilesetAnims_Mauville_Flower2)))
{
- timer_div %= 12;
- AppendTilesetAnimToBuffer(gTilesetAnims_Mauville_Flower1[timer_div], gTilesetAnims_Mauville_Flower1_VDests[timer_mod], 0x80);
- AppendTilesetAnimToBuffer(gTilesetAnims_Mauville_Flower2[timer_div], gTilesetAnims_Mauville_Flower2_VDests[timer_mod], 0x80);
+ timer_div %= min(ARRAY_COUNT(gTilesetAnims_Mauville_Flower1), ARRAY_COUNT(gTilesetAnims_Mauville_Flower2));
+ AppendTilesetAnimToBuffer(gTilesetAnims_Mauville_Flower1[timer_div], gTilesetAnims_Mauville_Flower1_VDests[timer_mod], 4 * TILE_SIZE_4BPP);
+ AppendTilesetAnimToBuffer(gTilesetAnims_Mauville_Flower2[timer_div], gTilesetAnims_Mauville_Flower2_VDests[timer_mod], 4 * TILE_SIZE_4BPP);
}
else
{
- timer_div %= 4;
- AppendTilesetAnimToBuffer(gTilesetAnims_Mauville_Flower1_B[timer_div], gTilesetAnims_Mauville_Flower1_VDests[timer_mod], 0x80);
- AppendTilesetAnimToBuffer(gTilesetAnims_Mauville_Flower2_B[timer_div], gTilesetAnims_Mauville_Flower2_VDests[timer_mod], 0x80);
+ timer_div %= min(ARRAY_COUNT(gTilesetAnims_Mauville_Flower1_B), ARRAY_COUNT(gTilesetAnims_Mauville_Flower2_B));
+ AppendTilesetAnimToBuffer(gTilesetAnims_Mauville_Flower1_B[timer_div], gTilesetAnims_Mauville_Flower1_VDests[timer_mod], 4 * TILE_SIZE_4BPP);
+ AppendTilesetAnimToBuffer(gTilesetAnims_Mauville_Flower2_B[timer_div], gTilesetAnims_Mauville_Flower2_VDests[timer_mod], 4 * TILE_SIZE_4BPP);
}
}
static void QueueAnimTiles_Rustboro_WindyWater(u16 timer_div, u8 timer_mod)
{
timer_div -= timer_mod;
- timer_div %= 8;
+ timer_div %= ARRAY_COUNT(gTilesetAnims_Rustboro_WindyWater);
if (gTilesetAnims_Rustboro_WindyWater[timer_div])
- AppendTilesetAnimToBuffer(gTilesetAnims_Rustboro_WindyWater[timer_div], gTilesetAnims_Rustboro_WindyWater_VDests[timer_mod], 0x80);
+ AppendTilesetAnimToBuffer(gTilesetAnims_Rustboro_WindyWater[timer_div], gTilesetAnims_Rustboro_WindyWater_VDests[timer_mod], 4 * TILE_SIZE_4BPP);
}
static void QueueAnimTiles_Rustboro_Fountain(u16 timer)
{
- u16 i = timer % 2;
- AppendTilesetAnimToBuffer(gTilesetAnims_Rustboro_Fountain[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 448)), 0x80);
+ u16 i = timer % ARRAY_COUNT(gTilesetAnims_Rustboro_Fountain);
+ AppendTilesetAnimToBuffer(gTilesetAnims_Rustboro_Fountain[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 448)), 4 * TILE_SIZE_4BPP);
}
static void QueueAnimTiles_Lavaridge_Lava(u16 timer)
{
- u16 i = timer % 4;
- AppendTilesetAnimToBuffer(gTilesetAnims_Lavaridge_Cave_Lava[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 160)), 0x80);
+ u16 i = timer % ARRAY_COUNT(gTilesetAnims_Lavaridge_Cave_Lava);
+ AppendTilesetAnimToBuffer(gTilesetAnims_Lavaridge_Cave_Lava[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 160)), 4 * TILE_SIZE_4BPP);
}
static void QueueAnimTiles_EverGrande_Flowers(u16 timer_div, u8 timer_mod)
{
timer_div -= timer_mod;
- timer_div %= 8;
+ timer_div %= ARRAY_COUNT(gTilesetAnims_EverGrande_Flowers);
- AppendTilesetAnimToBuffer(gTilesetAnims_EverGrande_Flowers[timer_div], gTilesetAnims_EverGrande_VDests[timer_mod], 0x80);
+ AppendTilesetAnimToBuffer(gTilesetAnims_EverGrande_Flowers[timer_div], gTilesetAnims_EverGrande_VDests[timer_mod], 4 * TILE_SIZE_4BPP);
}
static void QueueAnimTiles_Cave_Lava(u16 timer)
{
- u16 i = timer % 4;
- AppendTilesetAnimToBuffer(gTilesetAnims_Lavaridge_Cave_Lava[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 416)), 0x80);
+ u16 i = timer % ARRAY_COUNT(gTilesetAnims_Lavaridge_Cave_Lava);
+ AppendTilesetAnimToBuffer(gTilesetAnims_Lavaridge_Cave_Lava[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 416)), 4 * TILE_SIZE_4BPP);
}
static void QueueAnimTiles_Dewford_Flag(u16 timer)
{
- u16 id = timer % 4;
- AppendTilesetAnimToBuffer(gTilesetAnims_Dewford_Flag[id], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 170)), 0xC0);
+ u16 i = timer % ARRAY_COUNT(gTilesetAnims_Dewford_Flag);
+ AppendTilesetAnimToBuffer(gTilesetAnims_Dewford_Flag[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 170)), 6 * TILE_SIZE_4BPP);
}
static void QueueAnimTiles_BattleFrontierOutsideWest_Flag(u16 timer)
{
- u16 i = timer % 4;
- AppendTilesetAnimToBuffer(gTilesetAnims_BattleFrontierOutsideWest_Flag[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 218)), 0xC0);
+ u16 i = timer % ARRAY_COUNT(gTilesetAnims_BattleFrontierOutsideWest_Flag);
+ AppendTilesetAnimToBuffer(gTilesetAnims_BattleFrontierOutsideWest_Flag[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 218)), 6 * TILE_SIZE_4BPP);
}
static void QueueAnimTiles_BattleFrontierOutsideEast_Flag(u16 timer)
{
- u16 i = timer % 4;
- AppendTilesetAnimToBuffer(gTilesetAnims_BattleFrontierOutsideEast_Flag[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 218)), 0xC0);
+ u16 i = timer % ARRAY_COUNT(gTilesetAnims_BattleFrontierOutsideEast_Flag);
+ AppendTilesetAnimToBuffer(gTilesetAnims_BattleFrontierOutsideEast_Flag[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 218)), 6 * TILE_SIZE_4BPP);
}
static void QueueAnimTiles_Slateport_Balloons(u16 timer)
{
- u16 i = timer % 4;
- AppendTilesetAnimToBuffer(gTilesetAnims_Slateport_Balloons[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 224)), 0x80);
+ u16 i = timer % ARRAY_COUNT(gTilesetAnims_Slateport_Balloons);
+ AppendTilesetAnimToBuffer(gTilesetAnims_Slateport_Balloons[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 224)), 4 * TILE_SIZE_4BPP);
}
static void TilesetAnim_MauvilleGym(u16 timer)
{
if (timer % 2 == 0)
- QueueAnimTiles_MauvilleGym_ElectricGates(timer >> 1);
+ QueueAnimTiles_MauvilleGym_ElectricGates(timer / 2);
}
static void TilesetAnim_SootopolisGym(u16 timer)
{
if (timer % 8 == 0)
- QueueAnimTiles_SootopolisGym_Waterfalls(timer >> 3);
+ QueueAnimTiles_SootopolisGym_Waterfalls(timer / 8);
}
static void TilesetAnim_EliteFour(u16 timer)
{
if (timer % 64 == 1)
- QueueAnimTiles_EliteFour_GroundLights(timer >> 6);
+ QueueAnimTiles_EliteFour_GroundLights(timer / 64);
if (timer % 8 == 1)
- QueueAnimTiles_EliteFour_WallLights(timer >> 3);
+ QueueAnimTiles_EliteFour_WallLights(timer / 8);
}
static void TilesetAnim_BikeShop(u16 timer)
{
if (timer % 4 == 0)
- QueueAnimTiles_BikeShop_BlinkingLights(timer >> 2);
+ QueueAnimTiles_BikeShop_BlinkingLights(timer / 4);
}
static void TilesetAnim_BattlePyramid(u16 timer)
{
if (timer % 8 == 0)
{
- QueueAnimTiles_BattlePyramid_Torch(timer >> 3);
- QueueAnimTiles_BattlePyramid_StatueShadow(timer >> 3);
+ QueueAnimTiles_BattlePyramid_Torch(timer / 8);
+ QueueAnimTiles_BattlePyramid_StatueShadow(timer / 8);
}
}
static void TilesetAnim_BattleDome(u16 timer)
{
if (timer % 4 == 0)
- BlendAnimPalette_BattleDome_FloorLights(timer >> 2);
+ BlendAnimPalette_BattleDome_FloorLights(timer / 4);
}
static void TilesetAnim_BattleDome2(u16 timer)
{
if (timer % 4 == 0)
- BlendAnimPalette_BattleDome_FloorLightsNoBlend(timer >> 2);
+ BlendAnimPalette_BattleDome_FloorLightsNoBlend(timer / 4);
}
static void QueueAnimTiles_Building_TVTurnedOn(u16 timer)
{
- u16 i = timer % 2;
- AppendTilesetAnimToBuffer(gTilesetAnims_Building_TvTurnedOn[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(496)), 0x80);
+ u16 i = timer % ARRAY_COUNT(gTilesetAnims_Building_TvTurnedOn);
+ AppendTilesetAnimToBuffer(gTilesetAnims_Building_TvTurnedOn[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(496)), 4 * TILE_SIZE_4BPP);
}
static void QueueAnimTiles_SootopolisGym_Waterfalls(u16 timer)
{
- u16 i = timer % 3;
- AppendTilesetAnimToBuffer(gTilesetAnims_SootopolisGym_SideWaterfall[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 496)), 0x180);
- AppendTilesetAnimToBuffer(gTilesetAnims_SootopolisGym_FrontWaterfall[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 464)), 0x280);
+ u16 i = timer % min(ARRAY_COUNT(gTilesetAnims_SootopolisGym_SideWaterfall), ARRAY_COUNT(gTilesetAnims_SootopolisGym_FrontWaterfall));
+ AppendTilesetAnimToBuffer(gTilesetAnims_SootopolisGym_SideWaterfall[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 496)), 12 * TILE_SIZE_4BPP);
+ AppendTilesetAnimToBuffer(gTilesetAnims_SootopolisGym_FrontWaterfall[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 464)), 20 * TILE_SIZE_4BPP);
}
static void QueueAnimTiles_EliteFour_WallLights(u16 timer)
{
- u16 i = timer % 4;
- AppendTilesetAnimToBuffer(gTilesetAnims_EliteFour_WallLights[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 504)), 0x20);
+ u16 i = timer % ARRAY_COUNT(gTilesetAnims_EliteFour_WallLights);
+ AppendTilesetAnimToBuffer(gTilesetAnims_EliteFour_WallLights[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 504)), 1 * TILE_SIZE_4BPP);
}
static void QueueAnimTiles_EliteFour_GroundLights(u16 timer)
{
- u16 i = timer % 2;
- AppendTilesetAnimToBuffer(gTilesetAnims_EliteFour_FloorLight[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 480)), 0x80);
+ u16 i = timer % ARRAY_COUNT(gTilesetAnims_EliteFour_FloorLight);
+ AppendTilesetAnimToBuffer(gTilesetAnims_EliteFour_FloorLight[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 480)), 4 * TILE_SIZE_4BPP);
}
static void QueueAnimTiles_MauvilleGym_ElectricGates(u16 timer)
{
- u16 i = timer % 2;
- AppendTilesetAnimToBuffer(gTilesetAnims_MauvilleGym_ElectricGates[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 144)), 0x200);
+ u16 i = timer % ARRAY_COUNT(gTilesetAnims_MauvilleGym_ElectricGates);
+ AppendTilesetAnimToBuffer(gTilesetAnims_MauvilleGym_ElectricGates[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 144)), 16 * TILE_SIZE_4BPP);
}
static void QueueAnimTiles_BikeShop_BlinkingLights(u16 timer)
{
- u16 i = timer % 2;
- AppendTilesetAnimToBuffer(gTilesetAnims_BikeShop_BlinkingLights[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 496)), 0x120);
+ u16 i = timer % ARRAY_COUNT(gTilesetAnims_BikeShop_BlinkingLights);
+ AppendTilesetAnimToBuffer(gTilesetAnims_BikeShop_BlinkingLights[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 496)), 9 * TILE_SIZE_4BPP);
}
static void QueueAnimTiles_Sootopolis_StormyWater(u16 timer)
{
- u16 i = timer % 8;
- AppendTilesetAnimToBuffer(gTilesetAnims_Sootopolis_StormyWater[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 240)), 0xc00);
+ u16 i = timer % ARRAY_COUNT(gTilesetAnims_Sootopolis_StormyWater);
+ AppendTilesetAnimToBuffer(gTilesetAnims_Sootopolis_StormyWater[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 240)), 96 * TILE_SIZE_4BPP);
}
static void QueueAnimTiles_BattlePyramid_Torch(u16 timer)
{
- u16 i = timer % 3;
- AppendTilesetAnimToBuffer(gTilesetAnims_BattlePyramid_Torch[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 151)), 0x100);
+ u16 i = timer % ARRAY_COUNT(gTilesetAnims_BattlePyramid_Torch);
+ AppendTilesetAnimToBuffer(gTilesetAnims_BattlePyramid_Torch[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 151)), 8 * TILE_SIZE_4BPP);
}
static void QueueAnimTiles_BattlePyramid_StatueShadow(u16 timer)
{
- u16 i = timer % 3;
- AppendTilesetAnimToBuffer(gTilesetAnims_BattlePyramid_StatueShadow[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 135)), 0x100);
+ u16 i = timer % ARRAY_COUNT(gTilesetAnims_BattlePyramid_StatueShadow);
+ AppendTilesetAnimToBuffer(gTilesetAnims_BattlePyramid_StatueShadow[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(NUM_TILES_IN_PRIMARY + 135)), 8 * TILE_SIZE_4BPP);
}
static void BlendAnimPalette_BattleDome_FloorLights(u16 timer)
{
- CpuCopy16(gTilesetAnims_BattleDomeFloorLightPals[timer % 4], gPlttBufferUnfaded + 0x80, 32);
+ CpuCopy16(gTilesetAnims_BattleDomeFloorLightPals[timer % ARRAY_COUNT(gTilesetAnims_BattleDomeFloorLightPals)], &gPlttBufferUnfaded[0x80], 32);
BlendPalette(0x80, 16, gPaletteFade.y, gPaletteFade.blendColor & 0x7FFF);
if ((u8)FindTaskIdByFunc(Task_BattleTransition_Intro) != TASK_NONE)
{
@@ -1178,7 +1178,7 @@ static void BlendAnimPalette_BattleDome_FloorLights(u16 timer)
static void BlendAnimPalette_BattleDome_FloorLightsNoBlend(u16 timer)
{
- CpuCopy16(gTilesetAnims_BattleDomeFloorLightPals[timer % 4], gPlttBufferUnfaded + 0x80, 32);
+ CpuCopy16(gTilesetAnims_BattleDomeFloorLightPals[timer % ARRAY_COUNT(gTilesetAnims_BattleDomeFloorLightPals)], &gPlttBufferUnfaded[0x80], 32);
if ((u8)FindTaskIdByFunc(Task_BattleTransition_Intro) == TASK_NONE)
{
BlendPalette(0x80, 16, gPaletteFade.y, gPaletteFade.blendColor & 0x7FFF);
diff --git a/src/title_screen.c b/src/title_screen.c
index 93e01327c2..d64ee6024f 100644
--- a/src/title_screen.c
+++ b/src/title_screen.c
@@ -52,7 +52,7 @@ static void SpriteCB_PressStartCopyrightBanner(struct Sprite *sprite);
static void SpriteCB_PokemonLogoShine(struct Sprite *sprite);
// const rom data
-static const u16 sUnusedUnknownPal[] = INCBIN_U16("graphics/title_screen/unk_853EF78.gbapal");
+static const u16 sUnusedUnknownPal[] = INCBIN_U16("graphics/title_screen/unused.gbapal");
static const u32 sTitleScreenRayquazaGfx[] = INCBIN_U32("graphics/title_screen/rayquaza.4bpp.lz");
static const u32 sTitleScreenRayquazaTilemap[] = INCBIN_U32("graphics/title_screen/rayquaza.bin.lz");
diff --git a/src/trade.c b/src/trade.c
index ba07b9291b..4d3ab49956 100644
--- a/src/trade.c
+++ b/src/trade.c
@@ -44,7 +44,6 @@
#include "util.h"
#include "window.h"
#include "constants/contest.h"
-#include "constants/easy_chat.h"
#include "constants/items.h"
#include "constants/moves.h"
#include "constants/region_map_sections.h"
@@ -1391,7 +1390,7 @@ static void TradeMenuProcessInput(void)
DrawTextBorderOuter(1, 1, 14);
FillWindowPixelBuffer(1, PIXEL_FILL(1));
PrintMenuTable(1, ARRAY_COUNT(sSelectTradeMonActions), sSelectTradeMonActions);
- InitMenuInUpperLeftCornerNormal(1, 2, 0);
+ InitMenuInUpperLeftCornerNormal(1, ARRAY_COUNT(sSelectTradeMonActions), 0);
PutWindowTilemap(1);
CopyWindowToVram(1, COPYWIN_FULL);
sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_SELECTED_MON;
@@ -4524,7 +4523,8 @@ static void _CreateInGameTradePokemon(u8 whichPlayerMon, u8 whichInGameTrade)
CalculateMonStats(&gEnemyParty[0]);
}
-static void SetInGameTradeMail(struct Mail *mail, const struct InGameTrade *trade) {
+static void SetInGameTradeMail(struct Mail *mail, const struct InGameTrade *trade)
+{
s32 i;
for (i = 0; i < MAIL_WORDS_COUNT; i++)
diff --git a/src/trader.c b/src/trader.c
index 1d4424e751..040ee695b3 100644
--- a/src/trader.c
+++ b/src/trader.c
@@ -15,7 +15,7 @@
#include "task.h"
#include "script_menu.h"
-static const u8 * const sDefaultTraderNames[] =
+static const u8 * const sDefaultTraderNames[NUM_TRADER_ITEMS] =
{
gText_Tristan,
gText_Philip,
@@ -23,7 +23,7 @@ static const u8 * const sDefaultTraderNames[] =
gText_Roberto,
};
-static const u8 sDefaultTraderDecorations[] =
+static const u8 sDefaultTraderDecorations[NUM_TRADER_ITEMS] =
{
DECOR_DUSKULL_DOLL,
DECOR_BALL_CUSHION,
@@ -39,7 +39,7 @@ void TraderSetup(void)
trader->id = MAUVILLE_MAN_TRADER;
trader->alreadyTraded = FALSE;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < NUM_TRADER_ITEMS; i++)
{
StringCopy(trader->playerNames[i], sDefaultTraderNames[i]);
trader->decorations[i] = sDefaultTraderDecorations[i];
@@ -53,15 +53,25 @@ void Trader_ResetFlag(void)
trader->alreadyTraded = FALSE;
}
+#define tWindowId data[3]
+
void CreateAvailableDecorationsMenu(u8 taskId)
{
u8 i;
s16 * data = gTasks[taskId].data;
struct MauvilleOldManTrader *trader = &gSaveBlock1Ptr->oldMan.trader;
- struct WindowTemplate windowTemplate = {0, 1, 1, 10, 10, 15, 1};
+ struct WindowTemplate windowTemplate = {
+ .bg = 0,
+ .tilemapLeft = 1,
+ .tilemapTop = 1,
+ .width = 10,
+ .height = 10,
+ .paletteNum = 15,
+ .baseBlock = 1
+ };
s32 windowWidth = GetStringWidth(FONT_NORMAL, gText_Exit, 0);
s32 fiveMarksWidth = GetStringWidth(FONT_NORMAL, gText_FiveMarks, 0);
- for (i = 0; i < 4; i++)
+ for (i = 0; i < NUM_TRADER_ITEMS; i++)
{
s32 curWidth;
if (trader->decorations[i] > NUM_DECORATIONS)
@@ -72,17 +82,17 @@ void CreateAvailableDecorationsMenu(u8 taskId)
windowWidth = curWidth;
}
windowTemplate.width = ConvertPixelWidthToTileWidth(windowWidth);
- data[3] = AddWindow(&windowTemplate);
- DrawStdFrameWithCustomTileAndPalette(data[3], FALSE, 0x214, 14);
- for (i = 0; i < 4; i++)
+ tWindowId = AddWindow(&windowTemplate);
+ DrawStdFrameWithCustomTileAndPalette(tWindowId, FALSE, 0x214, 14);
+ for (i = 0; i < NUM_TRADER_ITEMS; i++)
{
if (trader->decorations[i] > NUM_DECORATIONS)
- AddTextPrinterParameterized(data[3], FONT_NORMAL, gText_FiveMarks, 8, 16 * i + 1, 255, NULL);
+ AddTextPrinterParameterized(tWindowId, FONT_NORMAL, gText_FiveMarks, 8, 16 * i + 1, TEXT_SKIP_DRAW, NULL);
else
- AddTextPrinterParameterized(data[3], FONT_NORMAL, gDecorations[trader->decorations[i]].name, 8, 16 * i + 1, 255, NULL);
+ AddTextPrinterParameterized(tWindowId, FONT_NORMAL, gDecorations[trader->decorations[i]].name, 8, 16 * i + 1, TEXT_SKIP_DRAW, NULL);
}
- AddTextPrinterParameterized(data[3], FONT_NORMAL, gText_Exit, 8, 16 * i + 1, 255, NULL);
- InitMenuInUpperLeftCornerNormal(data[3], 5, 0);
+ AddTextPrinterParameterized(tWindowId, FONT_NORMAL, gText_Exit, 8, 16 * i + 1, TEXT_SKIP_DRAW, NULL);
+ InitMenuInUpperLeftCornerNormal(tWindowId, NUM_TRADER_ITEMS + 1, 0);
ScheduleBgCopyTilemapToVram(0);
}
@@ -90,17 +100,13 @@ void Task_BufferDecorSelectionAndCloseWindow(u8 taskId, u8 decorationId)
{
s16 * data = gTasks[taskId].data;
if (decorationId > NUM_DECORATIONS)
- {
gSpecialVar_0x8004 = 0xFFFF;
- }
else
- {
gSpecialVar_0x8004 = decorationId;
- }
- ClearStdWindowAndFrameToTransparent(data[3], FALSE);
- ClearWindowTilemap(data[3]);
- RemoveWindow(data[3]);
+ ClearStdWindowAndFrameToTransparent(tWindowId, FALSE);
+ ClearWindowTilemap(tWindowId);
+ RemoveWindow(tWindowId);
ScheduleBgCopyTilemapToVram(0);
DestroyTask(taskId);
EnableBothScriptContexts();
@@ -116,7 +122,7 @@ void Task_HandleGetDecorationMenuInput(u8 taskId)
case MENU_NOTHING_CHOSEN:
break;
case MENU_B_PRESSED:
- case 4:
+ case NUM_TRADER_ITEMS: // EXIT
PlaySE(SE_SELECT);
Task_BufferDecorSelectionAndCloseWindow(taskId, 0);
break;
@@ -140,7 +146,7 @@ void DoesPlayerHaveNoDecorations(void)
{
u8 i;
- for (i = 0; i < 8; i++)
+ for (i = 0; i < DECORCAT_COUNT; i++)
{
if (GetNumOwnedDecorationsInCategory(i))
{
diff --git a/src/trainer_hill.c b/src/trainer_hill.c
index ac02ca5910..93c4632ceb 100644
--- a/src/trainer_hill.c
+++ b/src/trainer_hill.c
@@ -29,7 +29,6 @@
#include "constants/layouts.h"
#include "constants/moves.h"
#include "constants/trainers.h"
-#include "constants/easy_chat.h"
#include "constants/trainer_hill.h"
#include "constants/trainer_types.h"
@@ -200,7 +199,7 @@ static const u16 *const *const sPrizeListSets[] =
sPrizeLists2
};
-static const u16 sEReader_Pal[] = INCBIN_U16("graphics/misc/trainer_hill_ereader.gbapal");
+static const u16 sEReader_Pal[] = INCBIN_U16("graphics/trainer_hill/ereader.gbapal");
static const u8 sRecordWinColors[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY};
static const struct TrHillTag *const sDataPerTag[] =
@@ -678,9 +677,9 @@ static u16 GetMetatileForFloor(u8 floorId, u32 x, u32 y, u32 stride) // stride i
impassable = (sHillData->floors[floorId].display.collisionData[y] >> (15 - x) & 1);
metatile = sHillData->floors[floorId].display.metatileData[stride * y + x] + NUM_METATILES_IN_PRIMARY;
- elevation = 3 << METATILE_ELEVATION_SHIFT;
+ elevation = 3 << MAPGRID_ELEVATION_SHIFT;
- return ((impassable << METATILE_COLLISION_SHIFT) & METATILE_COLLISION_MASK) | elevation | (metatile & METATILE_ID_MASK);
+ return ((impassable << MAPGRID_COLLISION_SHIFT) & MAPGRID_COLLISION_MASK) | elevation | (metatile & MAPGRID_METATILE_ID_MASK);
}
void GenerateTrainerHillFloorLayout(u16 *mapArg)
diff --git a/src/trainer_see.c b/src/trainer_see.c
index ce06c5e9ce..dc6c3b9177 100644
--- a/src/trainer_see.c
+++ b/src/trainer_see.c
@@ -59,9 +59,9 @@ bool8 gTrainerApproachedPlayer;
EWRAM_DATA u8 gApproachingTrainerId = 0;
// const rom data
-static const u8 sEmotion_ExclamationMarkGfx[] = INCBIN_U8("graphics/misc/emotion_exclamation.4bpp");
-static const u8 sEmotion_QuestionMarkGfx[] = INCBIN_U8("graphics/misc/emotion_question.4bpp");
-static const u8 sEmotion_HeartGfx[] = INCBIN_U8("graphics/misc/emotion_heart.4bpp");
+static const u8 sEmotion_ExclamationMarkGfx[] = INCBIN_U8("graphics/field_effects/pics/emotion_exclamation.4bpp");
+static const u8 sEmotion_QuestionMarkGfx[] = INCBIN_U8("graphics/field_effects/pics/emotion_question.4bpp");
+static const u8 sEmotion_HeartGfx[] = INCBIN_U8("graphics/field_effects/pics/emotion_heart.4bpp");
static u8 (*const sDirectionalApproachDistanceFuncs[])(struct ObjectEvent *trainerObj, s16 range, s16 x, s16 y) =
{
@@ -367,8 +367,6 @@ static u8 GetTrainerApproachDistanceEast(struct ObjectEvent *trainerObj, s16 ran
return 0;
}
-#define COLLISION_MASK (~1)
-
static u8 CheckPathBetweenTrainerAndPlayer(struct ObjectEvent *trainerObj, u8 approachDistance, u8 direction)
{
s16 x, y;
@@ -385,8 +383,9 @@ static u8 CheckPathBetweenTrainerAndPlayer(struct ObjectEvent *trainerObj, u8 ap
MoveCoords(direction, &x, &y);
for (i = 0; i < approachDistance - 1; i++, MoveCoords(direction, &x, &y))
{
+ // Check for collisions on approach, ignoring the "out of range" collision for regular movement
collision = GetCollisionFlagsAtCoords(trainerObj, x, y, direction);
- if (collision != 0 && (collision & COLLISION_MASK))
+ if (collision != 0 && (collision & ~(1 << (COLLISION_OUTSIDE_RANGE - 1))))
return 0;
}
diff --git a/src/tv.c b/src/tv.c
index 6a91f05ec6..332d7e8c33 100644
--- a/src/tv.c
+++ b/src/tv.c
@@ -852,7 +852,7 @@ void UpdateTVScreensOnMap(int width, int height)
}
}
-static void SetTVMetatilesOnMap(int width, int height, u16 tileId)
+static void SetTVMetatilesOnMap(int width, int height, u16 metatileId)
{
int x;
int y;
@@ -862,7 +862,7 @@ static void SetTVMetatilesOnMap(int width, int height, u16 tileId)
for (x = 0; x < width; x++)
{
if (MapGridGetMetatileBehaviorAt(x, y) == MB_TELEVISION)
- MapGridSetMetatileIdAt(x, y, tileId | METATILE_COLLISION_MASK);
+ MapGridSetMetatileIdAt(x, y, metatileId | MAPGRID_COLLISION_MASK);
}
}
}
diff --git a/src/union_room_chat.c b/src/union_room_chat.c
index 22268ef4ac..9890bc1f88 100755
--- a/src/union_room_chat.c
+++ b/src/union_room_chat.c
@@ -2987,7 +2987,7 @@ static void ShowKeyboardSwapMenu(void)
{
FillWindowPixelBuffer(3, PIXEL_FILL(1));
DrawTextBorderOuter(3, 1, 13);
- PrintMenuActionTextsAtPos(3, FONT_SHORT, 8, 1, 14, 5, sKeyboardPageTitleTexts);
+ PrintMenuActionTextsAtPos(3, FONT_SHORT, 8, 1, 14, ARRAY_COUNT(sKeyboardPageTitleTexts), sKeyboardPageTitleTexts);
InitMenuNormal(3, FONT_SHORT, 0, 1, 14, 5, GetCurrentKeyboardPage());
PutWindowTilemap(3);
}
diff --git a/src/wallclock.c b/src/wallclock.c
index 759b1d11ff..5e0fae3a13 100644
--- a/src/wallclock.c
+++ b/src/wallclock.c
@@ -41,6 +41,8 @@ static void SpriteCB_HourHand(struct Sprite *sprite);
static void SpriteCB_PMIndicator(struct Sprite *sprite);
static void SpriteCB_AMIndicator(struct Sprite *sprite);
+#define sTaskId data[0]
+
#define tMinuteHandAngle data[0]
#define tHourHandAngle data[1]
#define tHours data[2]
@@ -696,21 +698,21 @@ void CB2_StartWallClock(void)
gTasks[taskId].tHourHandAngle = 300;
spriteId = CreateSprite(&sSpriteTemplate_MinuteHand, 120, 80, 1);
- gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].sTaskId = taskId;
gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;
gSprites[spriteId].oam.matrixNum = 0;
spriteId = CreateSprite(&sSpriteTemplate_HourHand, 120, 80, 0);
- gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].sTaskId = taskId;
gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;
gSprites[spriteId].oam.matrixNum = 1;
spriteId = CreateSprite(&sSpriteTemplate_PM, 120, 80, 2);
- gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].sTaskId = taskId;
gSprites[spriteId].data[1] = 45;
spriteId = CreateSprite(&sSpriteTemplate_AM, 120, 80, 2);
- gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].sTaskId = taskId;
gSprites[spriteId].data[1] = 90;
WallClockInit();
@@ -744,21 +746,21 @@ void CB2_ViewWallClock(void)
}
spriteId = CreateSprite(&sSpriteTemplate_MinuteHand, 120, 80, 1);
- gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].sTaskId = taskId;
gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;
gSprites[spriteId].oam.matrixNum = 0;
spriteId = CreateSprite(&sSpriteTemplate_HourHand, 120, 80, 0);
- gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].sTaskId = taskId;
gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;
gSprites[spriteId].oam.matrixNum = 1;
spriteId = CreateSprite(&sSpriteTemplate_PM, 120, 80, 2);
- gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].sTaskId = taskId;
gSprites[spriteId].data[1] = angle1;
spriteId = CreateSprite(&sSpriteTemplate_AM, 120, 80, 2);
- gSprites[spriteId].data[0] = taskId;
+ gSprites[spriteId].sTaskId = taskId;
gSprites[spriteId].data[1] = angle2;
WallClockInit();
@@ -1015,7 +1017,7 @@ static void InitClockWithRtc(u8 taskId)
static void SpriteCB_MinuteHand(struct Sprite *sprite)
{
- u16 angle = gTasks[sprite->data[0]].tMinuteHandAngle;
+ u16 angle = gTasks[sprite->sTaskId].tMinuteHandAngle;
s16 sin = Sin2(angle) / 16;
s16 cos = Cos2(angle) / 16;
u16 x, y;
@@ -1035,7 +1037,7 @@ static void SpriteCB_MinuteHand(struct Sprite *sprite)
static void SpriteCB_HourHand(struct Sprite *sprite)
{
- u16 angle = gTasks[sprite->data[0]].tHourHandAngle;
+ u16 angle = gTasks[sprite->sTaskId].tHourHandAngle;
s16 sin = Sin2(angle) / 16;
s16 cos = Cos2(angle) / 16;
u16 x, y;
@@ -1053,58 +1055,44 @@ static void SpriteCB_HourHand(struct Sprite *sprite)
sprite->y2 = y;
}
+#define sAngle data[1]
+
static void SpriteCB_PMIndicator(struct Sprite *sprite)
{
- if (gTasks[sprite->data[0]].tPeriod != PERIOD_AM)
+ if (gTasks[sprite->sTaskId].tPeriod != PERIOD_AM)
{
- if (sprite->data[1] >= 60 && sprite->data[1] < 90)
- {
- sprite->data[1] += 5;
- }
- if (sprite->data[1] < 60)
- {
- sprite->data[1]++;
- }
+ if (sprite->sAngle >= 60 && sprite->sAngle < 90)
+ sprite->sAngle += 5;
+ if (sprite->sAngle < 60)
+ sprite->sAngle++;
}
else
{
- if (sprite->data[1] >= 46 && sprite->data[1] < 76)
- {
- sprite->data[1] -= 5;
- }
- if (sprite->data[1] > 75)
- {
- sprite->data[1]--;
- }
+ if (sprite->sAngle >= 46 && sprite->sAngle < 76)
+ sprite->sAngle -= 5;
+ if (sprite->sAngle > 75)
+ sprite->sAngle--;
}
- sprite->x2 = Cos2(sprite->data[1]) * 30 / 0x1000;
- sprite->y2 = Sin2(sprite->data[1]) * 30 / 0x1000;
+ sprite->x2 = Cos2(sprite->sAngle) * 30 / 0x1000;
+ sprite->y2 = Sin2(sprite->sAngle) * 30 / 0x1000;
}
static void SpriteCB_AMIndicator(struct Sprite *sprite)
{
- if (gTasks[sprite->data[0]].tPeriod != PERIOD_AM)
+ if (gTasks[sprite->sTaskId].tPeriod != PERIOD_AM)
{
- if (sprite->data[1] >= 105 && sprite->data[1] < 135)
- {
- sprite->data[1] += 5;
- }
- if (sprite->data[1] < 105)
- {
- sprite->data[1]++;
- }
+ if (sprite->sAngle >= 105 && sprite->sAngle < 135)
+ sprite->sAngle += 5;
+ if (sprite->sAngle < 105)
+ sprite->sAngle++;
}
else
{
- if (sprite->data[1] >= 91 && sprite->data[1] < 121)
- {
- sprite->data[1] -= 5;
- }
- if (sprite->data[1] > 120)
- {
- sprite->data[1]--;
- }
+ if (sprite->sAngle >= 91 && sprite->sAngle < 121)
+ sprite->sAngle -= 5;
+ if (sprite->sAngle > 120)
+ sprite->sAngle--;
}
- sprite->x2 = Cos2(sprite->data[1]) * 30 / 0x1000;
- sprite->y2 = Sin2(sprite->data[1]) * 30 / 0x1000;
+ sprite->x2 = Cos2(sprite->sAngle) * 30 / 0x1000;
+ sprite->y2 = Sin2(sprite->sAngle) * 30 / 0x1000;
}
diff --git a/src/wild_encounter.c b/src/wild_encounter.c
index 5e4b06d924..663577a2fc 100644
--- a/src/wild_encounter.c
+++ b/src/wild_encounter.c
@@ -47,6 +47,8 @@ enum {
#define WILD_CHECK_REPEL (1 << 0)
#define WILD_CHECK_KEEN_EYE (1 << 1)
+#define HEADER_NONE 0xFFFF
+
static u16 FeebasRandom(void);
static void FeebasSeedRng(u16 seed);
static bool8 IsWildLevelAllowedByRepel(u8 level);
@@ -176,6 +178,7 @@ static void FeebasSeedRng(u16 seed)
sFeebasRngValue = seed;
}
+// LAND_WILD_COUNT
static u8 ChooseWildMonIndex_Land(void)
{
u8 rand = Random() % ENCOUNTER_CHANCE_LAND_MONS_TOTAL;
@@ -206,6 +209,7 @@ static u8 ChooseWildMonIndex_Land(void)
return 11;
}
+// ROCK_WILD_COUNT / WATER_WILD_COUNT
static u8 ChooseWildMonIndex_WaterRock(void)
{
u8 rand = Random() % ENCOUNTER_CHANCE_WATER_MONS_TOTAL;
@@ -222,6 +226,7 @@ static u8 ChooseWildMonIndex_WaterRock(void)
return 4;
}
+// FISH_WILD_COUNT
static u8 ChooseWildMonIndex_Fishing(u8 rod)
{
u8 wildMonIndex = 0;
@@ -314,7 +319,7 @@ static u16 GetCurrentMapWildMonHeaderId(void)
gSaveBlock1Ptr->location.mapNum == MAP_NUM(ALTERING_CAVE))
{
u16 alteringCaveId = VarGet(VAR_ALTERING_CAVE_WILD_SET);
- if (alteringCaveId > 8)
+ if (alteringCaveId >= NUM_ALTERING_CAVE_TABLES)
alteringCaveId = 0;
i += alteringCaveId;
@@ -324,7 +329,7 @@ static u16 GetCurrentMapWildMonHeaderId(void)
}
}
- return -1;
+ return HEADER_NONE;
}
static u8 PickWildMonNature(void)
@@ -571,7 +576,7 @@ bool8 StandardWildEncounter(u16 currMetaTileBehavior, u16 previousMetaTileBehavi
return FALSE;
headerId = GetCurrentMapWildMonHeaderId();
- if (headerId == 0xFFFF)
+ if (headerId == HEADER_NONE)
{
if (gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_WILD_MONS)
{
@@ -703,7 +708,7 @@ void RockSmashWildEncounter(void)
{
u16 headerId = GetCurrentMapWildMonHeaderId();
- if (headerId != 0xFFFF)
+ if (headerId != HEADER_NONE)
{
const struct WildPokemonInfo *wildPokemonInfo = gWildMonHeaders[headerId].rockSmashMonsInfo;
@@ -735,7 +740,7 @@ bool8 SweetScentWildEncounter(void)
PlayerGetDestCoords(&x, &y);
headerId = GetCurrentMapWildMonHeaderId();
- if (headerId == 0xFFFF)
+ if (headerId == HEADER_NONE)
{
if (gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_WILD_MONS)
{
@@ -805,7 +810,7 @@ bool8 DoesCurrentMapHaveFishingMons(void)
{
u16 headerId = GetCurrentMapWildMonHeaderId();
- if (headerId != 0xFFFF && gWildMonHeaders[headerId].fishingMonsInfo != NULL)
+ if (headerId != HEADER_NONE && gWildMonHeaders[headerId].fishingMonsInfo != NULL)
return TRUE;
else
return FALSE;
@@ -840,7 +845,7 @@ u16 GetLocalWildMon(bool8 *isWaterMon)
*isWaterMon = FALSE;
headerId = GetCurrentMapWildMonHeaderId();
- if (headerId == 0xFFFF)
+ if (headerId == HEADER_NONE)
return SPECIES_NONE;
landMonsInfo = gWildMonHeaders[headerId].landMonsInfo;
waterMonsInfo = gWildMonHeaders[headerId].waterMonsInfo;
@@ -872,7 +877,7 @@ u16 GetLocalWaterMon(void)
{
u16 headerId = GetCurrentMapWildMonHeaderId();
- if (headerId != 0xFFFF)
+ if (headerId != HEADER_NONE)
{
const struct WildPokemonInfo *waterMonsInfo = gWildMonHeaders[headerId].waterMonsInfo;
diff --git a/src/wireless_communication_status_screen.c b/src/wireless_communication_status_screen.c
index ffb86488aa..1fbd83fcda 100644
--- a/src/wireless_communication_status_screen.c
+++ b/src/wireless_communication_status_screen.c
@@ -51,9 +51,9 @@ static void Task_WirelessCommunicationScreen(u8);
static void WCSS_AddTextPrinterParameterized(u8, u8, const u8 *, u8, u8, u8);
static bool32 UpdateCommunicationCounts(u32 *, u32 *, u32 *, u8);
-static const u16 sBgTiles_Pal[] = INCBIN_U16("graphics/interface/wireless_info_screen.gbapal");
-static const u32 sBgTiles_Gfx[] = INCBIN_U32("graphics/interface/wireless_info_screen.4bpp.lz");
-static const u32 sBgTiles_Tilemap[] = INCBIN_U32("graphics/interface/wireless_info_screen.bin.lz");
+static const u16 sBgTiles_Pal[] = INCBIN_U16("graphics/link/wireless_info_screen.gbapal");
+static const u32 sBgTiles_Gfx[] = INCBIN_U32("graphics/link/wireless_info_screen.4bpp.lz");
+static const u32 sBgTiles_Tilemap[] = INCBIN_U32("graphics/link/wireless_info_screen.bin.lz");
static const struct BgTemplate sBgTemplates[] = {
{
diff --git a/sym_bss.txt b/sym_bss.txt
index 75da960bf9..3a23e74789 100644
--- a/sym_bss.txt
+++ b/sym_bss.txt
@@ -55,6 +55,7 @@
.include "src/ereader_helpers.o"
.include "src/faraway_island.o"
.include "src/m4a_1.o"
+ .include "data/sound_data.o"
.include "src/agb_flash.o"
.include "src/siirtc.o"
.include "*libgcc.a:dp-bit.o"
diff --git a/tools/aif2pcm/main.c b/tools/aif2pcm/main.c
index 3dad6fcf80..720db1acae 100644
--- a/tools/aif2pcm/main.c
+++ b/tools/aif2pcm/main.c
@@ -51,8 +51,12 @@ do \
typedef struct {
unsigned long num_samples;
- uint8_t *samples;
+ union {
+ uint8_t *samples8;
+ uint16_t *samples16;
+ };
uint8_t midi_note;
+ uint8_t sample_size;
bool has_loop;
unsigned long loop_offset;
double sample_rate;
@@ -208,11 +212,11 @@ void read_aif(struct Bytes *aif, AifData *aif_data)
num_sample_frames |= (aif->data[pos++] << 8);
num_sample_frames |= (uint8_t)aif->data[pos++];
- short sample_size = (aif->data[pos++] << 8);
- sample_size |= (uint8_t)aif->data[pos++];
- if (sample_size != 8)
+ aif_data->sample_size = (aif->data[pos++] << 8);
+ aif_data->sample_size |= (uint8_t)aif->data[pos++];
+ if (aif_data->sample_size != 8 && aif_data->sample_size != 16)
{
- FATAL_ERROR("sampleSize (%d) in the COMM Chunk must be 8!\n", sample_size);
+ FATAL_ERROR("sampleSize (%d) in the COMM Chunk must be 8 or 16!\n", aif_data->sample_size);
}
double sample_rate = ieee754_read_extended((uint8_t*)(aif->data + pos));
@@ -295,11 +299,28 @@ void read_aif(struct Bytes *aif, AifData *aif_data)
pos += 8;
unsigned long num_samples = chunk_size - 8;
- uint8_t *sample_data = (uint8_t *)malloc(num_samples * sizeof(uint8_t));
- memcpy(sample_data, &aif->data[pos], num_samples);
-
- aif_data->samples = sample_data;
- aif_data->real_num_samples = num_samples;
+ if (aif_data->sample_size == 8)
+ {
+ uint8_t *sample_data = (uint8_t *)malloc(num_samples * sizeof(uint8_t));
+ memcpy(sample_data, &aif->data[pos], num_samples);
+
+ aif_data->samples8 = sample_data;
+ aif_data->real_num_samples = num_samples;
+ }
+ else
+ {
+ uint16_t *sample_data = (uint16_t *)malloc(num_samples * sizeof(uint16_t));
+ uint16_t *sample_data_swapped = (uint16_t *)malloc(num_samples * sizeof(uint16_t));
+ memcpy(sample_data, &aif->data[pos], num_samples);
+ for (long unsigned i = 0; i < num_samples; i++)
+ {
+ sample_data_swapped[i] = __builtin_bswap16(sample_data[i]);
+ }
+
+ aif_data->samples16 = sample_data_swapped;
+ aif_data->real_num_samples = num_samples;
+ free(sample_data);
+ }
pos += chunk_size - 8;
}
else
@@ -550,8 +571,21 @@ do { \
void aif2pcm(const char *aif_filename, const char *pcm_filename, bool compress)
{
struct Bytes *aif = read_bytearray(aif_filename);
- AifData aif_data = {0,0,0,0,0,0,0};
+ AifData aif_data = {0};
read_aif(aif, &aif_data);
+
+ // Convert 16-bit to 8-bit if necessary
+ if (aif_data.sample_size == 16)
+ {
+ aif_data.real_num_samples /= 2;
+ uint8_t *converted_samples = malloc(aif_data.real_num_samples * sizeof(uint8_t));
+ for (unsigned long i = 0; i < aif_data.real_num_samples; i++)
+ {
+ converted_samples[i] = aif_data.samples16[i] >> 8;
+ }
+ free(aif_data.samples16);
+ aif_data.samples8 = converted_samples;
+ }
int header_size = 0x10;
struct Bytes *pcm;
@@ -560,7 +594,7 @@ void aif2pcm(const char *aif_filename, const char *pcm_filename, bool compress)
if (compress)
{
struct Bytes *input = malloc(sizeof(struct Bytes));
- input->data = aif_data.samples;
+ input->data = aif_data.samples8;
input->length = aif_data.real_num_samples;
pcm = delta_compress(input);
free(input);
@@ -568,7 +602,7 @@ void aif2pcm(const char *aif_filename, const char *pcm_filename, bool compress)
else
{
pcm = malloc(sizeof(struct Bytes));
- pcm->data = aif_data.samples;
+ pcm->data = aif_data.samples8;
pcm->length = aif_data.real_num_samples;
}
output.length = header_size + pcm->length;
@@ -591,7 +625,7 @@ void aif2pcm(const char *aif_filename, const char *pcm_filename, bool compress)
free(aif);
free(pcm);
free(output.data);
- free(aif_data.samples);
+ free(aif_data.samples8);
}
// Reads a .pcm file containing an array of 8-bit samples and produces an .aif file.
@@ -631,8 +665,8 @@ void pcm2aif(const char *pcm_filename, const char *aif_filename, uint32_t base_n
pcm->data += 0x10;
}
- aif_data->samples = malloc(pcm->length);
- memcpy(aif_data->samples, pcm->data, pcm->length);
+ aif_data->samples8 = malloc(pcm->length);
+ memcpy(aif_data->samples8, pcm->data, pcm->length);
struct Bytes *aif = malloc(sizeof(struct Bytes));
aif->length = 54 + 60 + pcm->length;
@@ -819,14 +853,14 @@ void pcm2aif(const char *pcm_filename, const char *aif_filename, uint32_t base_n
// Sound Data Chunk soundData
for (unsigned int i = 0; i < aif_data->loop_offset; i++)
{
- aif->data[pos++] = aif_data->samples[i];
+ aif->data[pos++] = aif_data->samples8[i];
}
int j = 0;
for (unsigned int i = aif_data->loop_offset; i < pcm->length; i++)
{
int pcm_index = aif_data->loop_offset + (j++ % (pcm->length - aif_data->loop_offset));
- aif->data[pos++] = aif_data->samples[pcm_index];
+ aif->data[pos++] = aif_data->samples8[pcm_index];
}
aif->length = pos;
diff --git a/tools/mapjson/mapjson.cpp b/tools/mapjson/mapjson.cpp
index d767b469e9..3eab98f2be 100644
--- a/tools/mapjson/mapjson.cpp
+++ b/tools/mapjson/mapjson.cpp
@@ -230,7 +230,7 @@ string generate_map_events_text(Json map_data) {
text << bgs_label << ":\n";
for (auto &bg_event : map_data["bg_events"].array_items()) {
if (bg_event["type"] == "sign") {
- text << "\tbg_event "
+ text << "\tbg_sign_event "
<< bg_event["x"].int_value() << ", "
<< bg_event["y"].int_value() << ", "
<< bg_event["elevation"].int_value() << ", "