Merge pull request #788 from kazblox/master

Fix NONMATCHINGs and actual English Debug support
This commit is contained in:
GriffinR 2020-08-19 01:04:35 -04:00 committed by GitHub
commit 5d6e7a31da
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
63 changed files with 2182 additions and 8522 deletions

View File

@ -38,9 +38,9 @@ To set up the repository:
cd ../pokeruby
To build **pokeruby.gba** and confirm it matches the official ROM image:
To build Pokémon Ruby:
make
make ruby
To build Pokémon Sapphire:
@ -50,6 +50,15 @@ The above two commands will build the English v1.0 version of the respective tit
make ruby_rev2
To also build debug targets (only v1.0 is currently supported), run either of the following:
make ruby_debug
make sapphire_debug
To compare between official ROM images for each target:
make (target) COMPARE=1
## Notes
* If the base tools are not found on macOS in new Terminal sessions after the first successful build, run `echo "if [ -f ~/.bashrc ]; then . ~/.bashrc; fi" >> ~/.bash_profile` once to prevent the issue from occurring again. Verify that the `devkitarm-rules` package is installed as well; if not, install it by running `sudo dkp-pacman -S devkitarm-rules`.
@ -57,33 +66,28 @@ The above two commands will build the English v1.0 version of the respective tit
* If the repository was previously set up using Cygwin, delete the `.exe` files in the subfolders of the `tools` folder except for `agbcc` and try building again. [Learn the differences between MSYS2 and Cygwin.](https://github.com/msys2/msys2/wiki/How-does-MSYS2-differ-from-Cygwin)
## Notes about the German language ROMs
This repository also supports the German versions of Ruby and Sapphire. However, due to major differences in scripts, text, and graphics, a special configuration needs to be set up before compilation and torn down after.
This repository also supports the "first edition" German versions of Ruby and Sapphire. However, due to major differences in scripts, text, and graphics, a special configuration needs to be set up before compilation and torn down after.
To set up the repository:
make clean
sh de_before.sh
To compile the German ROMs:
To compile the "first edition" German ROMs:
make ruby_de
make sapphire_de
To compile the leaked Debug ROM (German):
To compile their debug equivalents:
make ruby_de_debug
make sapphire_de_debug
To restore the repository (**MUST BE DONE BEFORE ATTEMPTING TO BUILD ANY ENGLISH LANGUAGE ROM**):
make clean
sh de_after.sh
# Guidance
To build **pokeruby.gba** with your changes:
make COMPARE=0
## Parallel builds
See [the GNU docs](https://www.gnu.org/software/make/manual/html_node/Parallel.html) and [this Stack Exchange thread](https://unix.stackexchange.com/questions/208568) for more information.

View File

@ -38,8 +38,8 @@ GBAFIX := tools/gbafix/gbafix$(EXE)
MAPJSON := tools/mapjson/mapjson$(EXE)
JSONPROC := tools/jsonproc/jsonproc$(EXE)
ASFLAGS := -mcpu=arm7tdmi -I include --defsym $(GAME_VERSION)=1 --defsym REVISION=$(GAME_REVISION) --defsym DEBUG_TRANSLATE=$(DEBUG_TRANSLATE) --defsym $(GAME_LANGUAGE)=1 --defsym DEBUG=$(DEBUG) --defsym MODERN=$(MODERN)
CPPFLAGS := -iquote include -Werror -Wno-trigraphs -D $(GAME_VERSION) -D REVISION=$(GAME_REVISION) -D $(GAME_LANGUAGE) -DDEBUG_TRANSLATE=$(DEBUG_TRANSLATE) -D DEBUG=$(DEBUG) -D MODERN=$(MODERN)
ASFLAGS := -mcpu=arm7tdmi -I include --defsym $(GAME_VERSION)=1 --defsym REVISION=$(GAME_REVISION) --defsym DEBUG_FIX=$(DEBUG_FIX) --defsym $(GAME_LANGUAGE)=1 --defsym DEBUG=$(DEBUG) --defsym MODERN=$(MODERN)
CPPFLAGS := -iquote include -Werror -Wno-trigraphs -D $(GAME_VERSION) -D REVISION=$(GAME_REVISION) -D $(GAME_LANGUAGE) -D=DEBUG_FIX$(DEBUG_FIX) -D DEBUG=$(DEBUG) -D MODERN=$(MODERN)
ifeq ($(MODERN),0)
CPPFLAGS += -I tools/agbcc/include -nostdinc -undef
CC1FLAGS := -mthumb-interwork -Wimplicit -Wparentheses -Wunused -Werror -O2 -fhex-asm
@ -105,8 +105,7 @@ endif
#### Main Rules ####
ALL_BUILDS := ruby ruby_rev1 ruby_rev2 sapphire sapphire_rev1 sapphire_rev2 ruby_de sapphire_de ruby_de_debug
ALL_BUILDS := ruby ruby_rev1 ruby_rev2 sapphire sapphire_rev1 sapphire_rev2 ruby_de sapphire_de ruby_de_debug ruby_en_debug
ALL_BUILDS := ruby ruby_debug ruby_rev1 ruby_rev2 sapphire sapphire_debug sapphire_rev1 sapphire_rev2 ruby_de ruby_de_debug sapphire_de sapphire_de_debug
MODERN_BUILDS := $(ALL_BUILDS:%=%_modern)
# Available targets
@ -217,39 +216,45 @@ $(BUILD_DIR)/%.o: %.s $$(ASM_DEP)
$(AS) $(ASFLAGS) $< -o $@
# "friendly" target names for convenience sake
ruby: ; @$(MAKE) GAME_VERSION=RUBY
ruby_rev1: ; @$(MAKE) GAME_VERSION=RUBY GAME_REVISION=1
ruby_rev2: ; @$(MAKE) GAME_VERSION=RUBY GAME_REVISION=2
sapphire: ; @$(MAKE) GAME_VERSION=SAPPHIRE
sapphire_rev1: ; @$(MAKE) GAME_VERSION=SAPPHIRE GAME_REVISION=1
sapphire_rev2: ; @$(MAKE) GAME_VERSION=SAPPHIRE GAME_REVISION=2
ruby_de: ; @$(MAKE) GAME_VERSION=RUBY GAME_LANGUAGE=GERMAN
sapphire_de: ; @$(MAKE) GAME_VERSION=SAPPHIRE GAME_LANGUAGE=GERMAN
ruby_de_debug: ; @$(MAKE) GAME_VERSION=RUBY GAME_LANGUAGE=GERMAN DEBUG=1
ruby: ; @$(MAKE) GAME_VERSION=RUBY
ruby_debug: ; @$(MAKE) GAME_VERSION=RUBY DEBUG=1
ruby_rev1: ; @$(MAKE) GAME_VERSION=RUBY GAME_REVISION=1
ruby_rev2: ; @$(MAKE) GAME_VERSION=RUBY GAME_REVISION=2
sapphire: ; @$(MAKE) GAME_VERSION=SAPPHIRE
sapphire_debug: ; @$(MAKE) GAME_VERSION=SAPPHIRE DEBUG=1
sapphire_rev1: ; @$(MAKE) GAME_VERSION=SAPPHIRE GAME_REVISION=1
sapphire_rev2: ; @$(MAKE) GAME_VERSION=SAPPHIRE GAME_REVISION=2
ruby_de: ; @$(MAKE) GAME_VERSION=RUBY GAME_LANGUAGE=GERMAN
ruby_de_debug: ; @$(MAKE) GAME_VERSION=RUBY GAME_LANGUAGE=GERMAN DEBUG=1
sapphire_de: ; @$(MAKE) GAME_VERSION=SAPPHIRE GAME_LANGUAGE=GERMAN
sapphire_de_debug: ; @$(MAKE) GAME_VERSION=SAPPHIRE GAME_LANGUAGE=GERMAN DEBUG=1
modern: ; @$(MAKE) GAME_VERSION=RUBY MODERN=1
ruby_modern: ; @$(MAKE) GAME_VERSION=RUBY MODERN=1
ruby_rev1_modern: ; @$(MAKE) GAME_VERSION=RUBY GAME_REVISION=1 MODERN=1
ruby_rev2_modern: ; @$(MAKE) GAME_VERSION=RUBY GAME_REVISION=2 MODERN=1
sapphire_modern: ; @$(MAKE) GAME_VERSION=SAPPHIRE MODERN=1
sapphire_rev1_modern: ; @$(MAKE) GAME_VERSION=SAPPHIRE GAME_REVISION=1 MODERN=1
sapphire_rev2_modern: ; @$(MAKE) GAME_VERSION=SAPPHIRE GAME_REVISION=2 MODERN=1
ruby_de_modern: ; @$(MAKE) GAME_VERSION=RUBY GAME_LANGUAGE=GERMAN MODERN=1
sapphire_de_modern: ; @$(MAKE) GAME_VERSION=SAPPHIRE GAME_LANGUAGE=GERMAN MODERN=1
ruby_de_debug_modern: ; @$(MAKE) GAME_VERSION=RUBY GAME_LANGUAGE=GERMAN DEBUG=1 MODERN=1
modern: ; @$(MAKE) GAME_VERSION=RUBY MODERN=1
ruby_modern: ; @$(MAKE) GAME_VERSION=RUBY MODERN=1
ruby_debug_modern: ; @$(MAKE) GAME_VERSION=RUBY DEBUG=1 MODERN=1
ruby_rev1_modern: ; @$(MAKE) GAME_VERSION=RUBY GAME_REVISION=1 MODERN=1
ruby_rev2_modern: ; @$(MAKE) GAME_VERSION=RUBY GAME_REVISION=2 MODERN=1
sapphire_modern: ; @$(MAKE) GAME_VERSION=SAPPHIRE MODERN=1
sappphire_debug_modern: ; @$(MAKE) GAME_VERSION=SAPPHIRE DEBUG=1 MODERN=1
sapphire_rev1_modern: ; @$(MAKE) GAME_VERSION=SAPPHIRE GAME_REVISION=1 MODERN=1
sapphire_rev2_modern: ; @$(MAKE) GAME_VERSION=SAPPHIRE GAME_REVISION=2 MODERN=1
ruby_de_modern: ; @$(MAKE) GAME_VERSION=RUBY GAME_LANGUAGE=GERMAN MODERN=1
ruby_de_debug_modern: ; @$(MAKE) GAME_VERSION=RUBY GAME_LANGUAGE=GERMAN DEBUG=1 MODERN=1
sapphire_de_modern: ; @$(MAKE) GAME_VERSION=SAPPHIRE GAME_LANGUAGE=GERMAN MODERN=1
sapphire_de_debug_modern: ; @$(MAKE) GAME_VERSION=SAPPHIRE GAME_LANGUAGE=GERMAN DEBUG=1 MODERN=1
ruby_en_debug: ; @$(MAKE) GAME_VERSION=RUBY DEBUG=1 DEBUG_TRANSLATE=1
compare_ruby: ; @$(MAKE) GAME_VERSION=RUBY COMPARE=1
compare_ruby_rev1: ; @$(MAKE) GAME_VERSION=RUBY GAME_REVISION=1 COMPARE=1
compare_ruby_rev2: ; @$(MAKE) GAME_VERSION=RUBY GAME_REVISION=2 COMPARE=1
compare_sapphire: ; @$(MAKE) GAME_VERSION=SAPPHIRE COMPARE=1
compare_sapphire_rev1: ; @$(MAKE) GAME_VERSION=SAPPHIRE GAME_REVISION=1 COMPARE=1
compare_sapphire_rev2: ; @$(MAKE) GAME_VERSION=SAPPHIRE GAME_REVISION=2 COMPARE=1
compare_ruby_de: ; @$(MAKE) GAME_VERSION=RUBY GAME_LANGUAGE=GERMAN COMPARE=1
compare_sapphire_de: ; @$(MAKE) GAME_VERSION=SAPPHIRE GAME_LANGUAGE=GERMAN COMPARE=1
compare_ruby_de_debug: ; @$(MAKE) GAME_VERSION=RUBY GAME_LANGUAGE=GERMAN DEBUG=1 COMPARE=1
compare_ruby_en_debug: ; @$(MAKE) GAME_VERSION=RUBY DEBUG=1 DEBUG_TRANSLATE=1 COMPARE=1
compare_ruby: ; @$(MAKE) GAME_VERSION=RUBY COMPARE=1
compare_ruby_debug: ; @$(MAKE) GAME_VERSION=RUBY DEBUG=1 COMPARE=1
compare_ruby_rev1: ; @$(MAKE) GAME_VERSION=RUBY GAME_REVISION=1 COMPARE=1
compare_ruby_rev2: ; @$(MAKE) GAME_VERSION=RUBY GAME_REVISION=2 COMPARE=1
compare_sapphire: ; @$(MAKE) GAME_VERSION=SAPPHIRE COMPARE=1
compare_sapphire_debug: ; @$(MAKE) GAME_VERSION=SAPPHIRE DEBUG=1 COMPARE=1
compare_sapphire_rev1: ; @$(MAKE) GAME_VERSION=SAPPHIRE GAME_REVISION=1 COMPARE=1
compare_sapphire_rev2: ; @$(MAKE) GAME_VERSION=SAPPHIRE GAME_REVISION=2 COMPARE=1
compare_ruby_de: ; @$(MAKE) GAME_VERSION=RUBY GAME_LANGUAGE=GERMAN COMPARE=1
compare_ruby_de_debug: ; @$(MAKE) GAME_VERSION=RUBY GAME_LANGUAGE=GERMAN DEBUG=1 COMPARE=1
compare_sapphire_de: ; @$(MAKE) GAME_VERSION=SAPPHIRE GAME_LANGUAGE=GERMAN COMPARE=1
compare_sapphire_de_debug: ; @$(MAKE) GAME_VERSION=SAPPHIRE GAME_LANGUAGE=GERMAN DEBUG=1 COMPARE=1
#### Graphics Rules ####

View File

@ -6,8 +6,8 @@ GAME_REVISION ?= 0
GAME_LANGUAGE ?= ENGLISH
DEBUG ?= 0
MODERN ?= 0
DEBUG_TRANSLATE ?= 0
COMPARE ?= 0
DEBUG_FIX ?= 0
COMPARE ?= 0
# For gbafix
MAKER_CODE := 01
@ -55,8 +55,8 @@ else
endif
endif
# Debug translations (always nonmatching)
ifeq ($(DEBUG_TRANSLATE),1)
# Debug fixes (always nonmatching)
ifeq ($(DEBUG_FIX), 1)
COMPARE := 0
DEBUG = 1
endif
@ -64,9 +64,8 @@ endif
# Debug
ifeq ($(DEBUG), 1)
BUILD_NAME := $(BUILD_NAME)_debug
ifeq ($(GAME_LANGUAGE), ENGLISH)
COMPARE := 0
DEBUG_TRANSLATE := 1
ifeq ($(DEBUG_FIX), 1)
BUILD_NAME := $(BUILD_NAME)_fixed
endif
endif

View File

@ -104,11 +104,16 @@ gUnknown_Debug_821F5AC::
.byte 0x09, 0x14, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x0a, 0x00, 0x14, 0x00, 0x00, 0x14, 0x14, 0x00, 0x0b, 0x00, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x0c, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00
.byte 0x0d, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x0e, 0x14, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
.ifdef ENGLISH
Str_821F624:: @ 0x821F624
.string "$"
.else @ GERMAN
Str_821F624:: @ 0x821F624
.string "$"
.endif @ GERMAN
.if DEBUG_TRANSLATE
.if DEBUG_FIX
@ TODO: GERMAN translations
str_821F631:: @ 0x821F631
.string "JUNICHI$"
.string "STEVEN LOW$"
@ -119,16 +124,18 @@ Str_821F649:: @ 0x821F649
.string "TETSUJI$"
debug_unk_0b::
@ 0x821F64D
.string "  ON$"
.string " "
@ 0x821F652
Str_821F64D::
.string "ON$"
Str_821F652::
.string "OFF$"
@ 0x821F655
Str_821F655::
.string "MONO$"
@ 0x821F65A
Str_821F65A::
.string "STEREO$"
@ 0x821F65F
@ -139,8 +146,7 @@ debug_unk_0b::
@ 0x821F66D
.string "Connection error$"
.else @ !DEBUG_TRANSLATE
.else @ !DEBUG_FIX
str_821F631:: @ 0x821F631
.string "$"
.string "$"
@ -151,16 +157,18 @@ Str_821F649:: @ 0x821F649
.string "$"
debug_unk_0b::
@ 0x821F64D
.string "  $"
.string " "
@ 0x821F652
Str_821F64D::
.string "$"
Str_821F652::
.string "$"
@ 0x821F655
Str_821F655::
.string "$"
@ 0x821F65A
Str_821F65A::
.string "$"
@ 0x821F65F
@ -172,7 +180,7 @@ debug_unk_0b::
@ 0x821F66D
.string "$"
.endif @ !DEBUG_TRANSLATE
.endif @ !DEBUG_FIX
@ 0x821f675
.byte 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00
@ -191,7 +199,8 @@ gUnknown_Debug_821F680::
gUnknown_Debug_821F798::
.byte 0xc0, 0x03, 0x00, 0x00, 0xd6, 0x03, 0x00, 0x00, 0x40, 0x04, 0x00, 0x00, 0x56, 0x04, 0x00, 0x00, 0xc0, 0x0b, 0x00, 0x00, 0xd6, 0x0b, 0x00, 0x00, 0x40, 0x0c, 0x00, 0x00, 0x56, 0x0c, 0x00, 0x00
.if DEBUG_TRANSLATE
.if DEBUG_FIX
@ TODO: GERMAN translations
Str_821F7B8:: @ 0x821F7B8
.string "HEIGHT$"
@ -210,7 +219,7 @@ Str_821F7EA:: @ 0x821F7EA
gUnknown_Debug_821F7F3::
.string "Would you like to save?$"
.else @ !DEBUG_TRANSLATE
.else @ !DEBUG_FIX
Str_821F7B8:: @ 0x821F7B8
.string " $"
@ -229,7 +238,7 @@ Str_821F7EA:: @ 0x821F7EA
@ 0x821F7F3
gUnknown_Debug_821F7F3::
.string "$"
.endif @ DEBUG_TRANSLATE
.endif @ !DEBUG_FIX
.endif @ DEBUG

View File

@ -17,8 +17,20 @@
.section .rodata
.ifdef ENGLISH
.set unkConstant, 2
.else @ GERMAN
.set unkConstant, 4
.endif @ GERMAN
.ifdef SAPPHIRE
.set versionMask, 0x100
.else @ RUBY
.set versionMask, 0x80
.endif @ RUBY
gUnknown_Debug_845DAE1::
me_checkcompat gUnknown_Debug_845DAE1, 0x4, 0x4, 0x4, 0x80
me_checkcompat gUnknown_Debug_845DAE1, unkConstant, unkConstant, 0x4, versionMask
me_crc 0x0, _0845DAFF, _0845DAFFEnd
_0845DAFF:
me_initramscript MAP_PETALBURG_CITY_GYM, 0x1, _845DB56, _845DB56End
@ -26,15 +38,15 @@ _0845DAFF:
me_runscript _0845DD0D
me_end
.if DEBUG_TRANSLATE
.ifdef ENGLISH
_0845DB16:
.string "Run and visit your DAD in the\n"
.string "PETALBURG CITY GYM.$"
.else
.string "Go see your father at the GYM in\n"
.string "PETALBURG.$"
.else @ GERMAN
_0845DB16:
.string "Lauf und besuche deinen Vater in der\n"
.string "ARENA von BLÜTENBURG CITY.$"
.endif
.endif @ GERMAN
_845DB56:
setvaddress _845DB56
checkitem ITEM_EON_TICKET, 0x1
@ -70,22 +82,22 @@ _0845DBB5:
release
end
.if DEBUG_TRANSLATE
.ifdef ENGLISH
_0845DBBE:
.string "DAD: {PLAYER}! Nice to see you!\n"
.string "Here is a Letter for you, {PLAYER}.$"
.string "DAD: {PLAYER}! Good to see you!\n"
.string "There's a letter here for you, {PLAYER}.$"
_0845DC00:
.string "DAD: I'm not sure. It could be a\n"
.string "TICKET for a Ferry.\p"
.string "You should go to LILYCOVE CITY and\n"
.string "ask about it there.$"
.string "DAD: It appears to be a ferry TICKET,\n"
.string "but I've never seen one like it before.\p"
.string "You should visit LILYCOVE and ask\n"
.string "about it there.$"
_0845DC94:
.string "DAD: {PLAYER}, the KEY ITEMS pocket\n"
.string "in your BAG is full.\p"
.string "Store some of your KEY ITEMS in\n"
.string "the PC and come back later.$"
.else @ !DEBUG_TRANSLATE
.string "DAD: {PLAYER}, the KEY ITEMS POCKET in\n"
.string "your BAG is full.\p"
.string "Move some key items for safekeeping\n"
.string "in your PC, then come see me.$"
.else @ GERMAN
_0845DBBE:
.string "VATER: {PLAYER}! Schön, dich zu sehen!\n"
.string "Hier ist ein Brief für dich, {PLAYER}.$"
@ -100,7 +112,7 @@ _0845DC94:
.string "deines BEUTELS ist voll.\p"
.string "Lagere einige deiner Basis-Items in\n"
.string "deinem PC und komm dann wieder.$"
.endif @ !DEBUG_TRANSLATE
.endif @ GERMAN
_845DB56End:
.size _845DB56, _845DB56End - _845DB56
@ -132,26 +144,25 @@ _0845DD5B:
setmysteryeventstatus 0x3
end
.if DEBUG_TRANSLATE
.ifdef ENGLISH
_0845DD63:
.string "This GIFT can only be used\n"
.string "once.$"
.string "This EVENT may be played only once.$"
_0845DD95:
.string "The KEY ITEMS pocket is full.$"
.else
.string "Your BAG's KEY ITEMS POCKET is full.$"
.else @ GERMAN
_0845DD63:
.string "Dieses GESCHEHEN kann nur einmal\n"
.string "gespielt werden.$"
_0845DD95:
.string "Deine BASIS-TASCHE ist voll.$"
.endif
.endif @ GERMAN
_0845DAFFEnd:
.size _0845DAFF, _0845DAFFEnd - _0845DAFF
gUnknown_Debug_845DAE1End::
gUnknown_Debug_845DDB2::
me_checkcompat gUnknown_Debug_845DDB2, 4, 4, 4, 0x80
me_checkcompat gUnknown_Debug_845DDB2, unkConstant, unkConstant, 0x4, versionMask
me_checksum 0x0, _0845DDD0, _0845DDD0End
_0845DDD0:
me_setenigmaberry gUnknown_Debug_845DDD6
@ -164,7 +175,7 @@ _0845DDD0End:
gUnknown_Debug_845DDB2End::
gUnknown_Debug_845E306::
me_checkcompat gUnknown_Debug_845E306, 0x4, 0x4, 0x4, 0x80
me_checkcompat gUnknown_Debug_845E306, unkConstant, unkConstant, 0x4, versionMask
me_runscript _0845E329
me_setmsg 0x2, _0845E34F
me_setmsg 0x3, _0845E387
@ -183,16 +194,15 @@ _0845E34C:
setmysteryeventstatus 0x3
end
.if DEBUG_TRANSLATE
.ifdef ENGLISH
_0845E34F:
.string "A POKéMON was added to {PLAYER}'s\n"
.string "team.$"
.string "A POKéMON was added to the\n"
.string "player's party.$"
_0845E387:
.string "Your team is full.\n"
.string "No more POKéMON can be added to your\l"
.string "team.$"
.else
.string "The player's party is full.\n"
.string "A POKéMON couldn't be added.$"
.else @ GERMAN
_0845E34F:
.string "Ein POKéMON wurde in das Team des\n"
.string "Spielers aufgenommen.$"
@ -201,10 +211,10 @@ _0845E387:
.string "Das Team des Spielers ist vollständig.\n"
.string "Es kann kein weiteres POKéMON\l"
.string "aufgenommen werden.$"
.endif
.endif @ GERMAN
gUnknown_Debug_845E3E0::
me_checkcompat gUnknown_Debug_845E3E0, 0x4, 0x4, 0x4, 0x80
me_checkcompat gUnknown_Debug_845E3E0, unkConstant, unkConstant, 0x4, versionMask
me_crc 0x0, _0845E3FE, _0845E3FEEnd
_0845E3FE:
me_giveribbon 0x0, 0x1
@ -214,7 +224,7 @@ _0845E3FEEnd:
gUnknown_Debug_845E3E0End::
gUnknown_Debug_845E402::
me_checkcompat gUnknown_Debug_845E402, 0x4, 0x4, 0x4, 0x80
me_checkcompat gUnknown_Debug_845E402, unkConstant, unkConstant, 0x4, versionMask
me_crc 0x0, _0845E420, _0845E420End
_0845E420:
me_givenationaldex
@ -224,7 +234,7 @@ _0845E420End:
gUnknown_Debug_845E402End::
gUnknown_Debug_845E422::
me_checkcompat gUnknown_Debug_845E422, 0x4, 0x4, 0x4, 0x80
me_checkcompat gUnknown_Debug_845E422, unkConstant, unkConstant, 0x4, versionMask
me_crc 0x0, _0845E440, _0845E440End
_0845E440:
me_addrareword 0x1
@ -234,7 +244,7 @@ _0845E440End:
gUnknown_Debug_845E422End::
gUnknown_Debug_845E443::
me_checkcompat gUnknown_Debug_845E443, 0x4, 0x4, 0x4, 0x80
me_checkcompat gUnknown_Debug_845E443, unkConstant, unkConstant, 0x4, versionMask
me_crc 0x0, _0845E461, _0845E461End
_0845E461:
me_givepokemon gUnknown_Debug_845E467
@ -250,7 +260,7 @@ _0845E461End:
gUnknown_Debug_845E443End::
gUnknown_Debug_845E4EF::
me_checkcompat gUnknown_Debug_845E4EF, 0x4, 0x4, 0x4, 0x80
me_checkcompat gUnknown_Debug_845E4EF, unkConstant, unkConstant, 0x4, versionMask
me_addtrainer gUnknown_Debug_845E506
me_end
@ -259,13 +269,13 @@ gUnknown_Debug_845E506::
gUnknown_Debug_845E4EFEnd::
gUnknown_Debug_845E606::
me_checkcompat gUnknown_Debug_845E606, 0x4, 0x4, 0x4, 0x80
me_checkcompat gUnknown_Debug_845E606, unkConstant, unkConstant, 0x4, versionMask
me_enableresetrtc
me_end
gUnknown_Debug_845E606End::
gUnknown_Debug_845E619::
me_checkcompat gUnknown_Debug_845E619, 0x4, 0x4, 0x4, 0x80
me_checkcompat gUnknown_Debug_845E619, unkConstant, unkConstant, 0x4, versionMask
me_checksum 0x0, _0845E637, _0845E637End
_0845E637:
me_initramscript MAP_PETALBURG_CITY_GYM, 0x1, _0845E683, _0845E683End
@ -273,16 +283,15 @@ _0845E637:
me_setstatus 0x2
me_end
.if DEBUG_TRANSLATE
.ifdef ENGLISH
_0845E64C:
.string "Visit your DAD in the PETALBURG\n"
.string "CITY GYM.$"
.else
.string "Go see your dad at the\n"
.string "PETALBURG GYM.$"
.else @ GERMAN
_0845E64C:
.string "Besuche deinen Vater in der ARENA\n"
.string "von BLÜTENBURG CITY.$"
.endif
.endif @ GERMAN
_0845E683:
setvaddress _0845E683
@ -305,17 +314,17 @@ _0845E683:
_0845E6BF:
gotoram
.if DEBUG_TRANSLATE
.ifdef ENGLISH
_0845E6C0:
.string "DAD: Hi, {PLAYER}!\p"
.string "I have just received this rare\n"
.string "BERRY. You can have it!$"
.else
.string "I just received a rare BERRY.\n"
.string "I'd like you to have it.$"
.else @ GERMAN
_0845E6C0:
.string "VATER: Hi, {PLAYER}!\p"
.string "Ich habe gerade diese seltene BEERE\n"
.string "erhalten. Ich schenke sie dir!$"
.endif
.endif @GERMAN
_0845E637End:
.size _0845E637, _0845E637End - _0845E637
@ -324,7 +333,7 @@ _0845E683End:
gUnknown_Debug_845E619End::
gUnknown_Debug_845E712::
me_checkcompat gUnknown_Debug_845E712, 0x4, 0x4, 0x4, 0x80
me_checkcompat gUnknown_Debug_845E712, unkConstant, unkConstant, 0x4, versionMask
me_crc 0x0, _0845E730, _0845E730End
_0845E730:
me_runscript _0845E736
@ -345,26 +354,26 @@ _0845E755:
setmysteryeventstatus 0x3
end
.if DEBUG_TRANSLATE
.ifdef ENGLISH
_0845E75D:
.string "{STR_VAR_1} was handed over.$"
.string "{STR_VAR_1} was received!$"
_0845E771:
.string "There is no room for {STR_VAR_1}\n"
.string "available...$"
.else
.string "There was no room to accept\n"
.string "{STR_VAR_1}...$"
.else @ GERMAN
_0845E75D:
.string "{STR_VAR_1} wurde übergeben.$"
_0845E771:
.string "Es ist kein Platz für {STR_VAR_1}\n"
.string "vorhanden...$"
.endif
.endif @ GERMAN
_0845E730End:
.size _0845E730, _0845E730End - _0845E730
gUnknown_Debug_845E712End::
gUnknown_Debug_845E797::
me_checkcompat gUnknown_Debug_845E797, 0x4, 0x4, 0x4, 0x80
me_checkcompat gUnknown_Debug_845E797, unkConstant, unkConstant, 0x4, versionMask
me_crc 0x0, gUnknown_Debug_845E7B5, gUnknown_Debug_845E7B5End
gUnknown_Debug_845E7B5::
me_setrecordmixinggift 0x1, 0x3, ITEM_POTION

View File

@ -73,13 +73,14 @@ gSpriteTemplate_83BBC88:: @ 83BBC88
spr_template 1, 56006, gOamData_83BBC34, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, sub_809CB74
.if DEBUG
.if DEBUG_TRANSLATE
.if DEBUG_FIX
gUnknown_Debug_0x83E6268:: @ 0x83E6268
@ TODO: translations
.string "SET$"
.else
.else @ !DEBUG_FIX
gUnknown_Debug_0x83E6268:: @ 0x83E6268
.string "$"
.endif
.endif @ !DEBUG_FIX
.endif
.align 2

View File

@ -130,8 +130,8 @@ struct ProtectStruct
u32 free : 4;
/*field3*/
u32 field3 : 8;
u32 physicalDmg;
u32 specialDmg;
s32 physicalDmg;
s32 specialDmg;
u8 physicalBattlerId;
u8 specialBattlerId;
u16 fieldE;
@ -139,15 +139,14 @@ struct ProtectStruct
struct SpecialStatus
{
u8 statLowered:1;
u8 lightningRodRedirected:1;
u8 restoredBattlerSprite: 1;
u8 intimidatedMon:1;
u8 traced:1;
u8 ppNotAffectedByPressure:1;
u8 flag40:1;
u8 focusBanded:1;
u8 field1[3];
u32 statLowered:1;
u32 lightningRodRedirected:1;
u32 restoredBattlerSprite: 1;
u32 intimidatedMon:1;
u32 traced:1;
u32 ppNotAffectedByPressure:1;
u32 flag40:1;
u32 focusBanded:1;
s32 dmg;
s32 physicalDmg;
s32 specialDmg;

View File

@ -5,11 +5,11 @@
// Ruby/Sapphire and Emerald do not have these asserts while Fire Red
// still has them in the ROM. This is because the developers forgot
// to define NDEBUG before release, however this has been changed as
// Ruby's actual debug build does not use the AGBPrint features.
// Ruby's actual debug builds do not use the AGBPrint features.
// To note, Ruby/Sapphire likely did not use AGBPrint. This is because
// the german debug ROM of Ruby did not have any uses of AGBPrint and
// the assert commands but instead a "crash" screen. This config exists
// the debug ROMs of Ruby did not have any uses of AGBPrint and the
// assert commands but instead a "crash" screen. This config exists
// for convenience for the user of pokeruby and NOT because it is
// authoritative. These additions are for user convenience based on
// officially recommended SDK practices for debugging and is therefore
@ -55,15 +55,8 @@
#define UNITS_METRIC
#endif
// An option to use translations/encoding fixes for the Debug menus.
// Selected by default for custom English debug roms.
#ifndef DEBUG_TRANSLATE
#if ENGLISH && DEBUG
#define DEBUG_TRANSLATE 1
#else
#define DEBUG_TRANSLATE 0
#endif
#endif
// An option to use fuller translations for debug ROMs.
// #define DEBUG_FIX 1 // Unsupported languages default to English text.
// Fixed in Emerald.
// #define BUGFIX_SETMONIVS

View File

@ -13,7 +13,7 @@ extern struct BackupMapLayout gUnknown_03004870;
struct MapHeader *mapconnection_get_mapheader(struct MapConnection *connection);
int GetMapBorderIdAt(int x, int y);
int CanCameraMoveInDirection(int direction);
u32 GetBehaviorByMetatileId(u16 metatile);
u16 GetBehaviorByMetatileId(u16 metatile);
void MapGridSetMetatileEntryAt(int, int, u16);
void not_trainer_hill_battle_pyramid(void);
@ -31,7 +31,7 @@ u32 MapGridGetMetatileIdAt(int, int);
u32 MapGridGetMetatileBehaviorAt(int x, int y); // return: (u8|u16|int) args: (int|s16|s32)
u8 MapGridGetMetatileLayerTypeAt(int, int);
void MapGridSetMetatileIdAt(int, int, u16);
u32 GetBehaviorByMetatileId(u16 metatile);
u16 GetBehaviorByMetatileId(u16 metatile);
void save_serialize_map(void);
void sub_8056670();
bool8 CameraMove(int, int);

View File

@ -22,12 +22,13 @@
#endif
// For debug menu translations.
// DTR("こんにちは", "Hello") will expand to "Hello" with DEBUG_TRANSLATE,
// DTR("こんにちは", "Hello") will expand to "Hello" with DEBUG_FIX,
// or "こんにちは" if not.
// The KANA macro will wrap Japanese text with encoding markers to
// prevent mojibake while they are being translated.
#if DEBUG_TRANSLATE
// TODO: Support multiple languages.
#if DEBUG_FIX
#define DTR(japanese, english) _(english)
#define KANA(txt) _("{JPN}" txt "{ENG}")
#else

View File

@ -3317,6 +3317,8 @@ extern struct BattleAnimBackground gBattleAnimBackgroundImage_16[];
extern struct BattleAnimBackground gBattleAnimBackgroundImage_17[];
extern struct BattleAnimBackground gBattleAnimBackgroundImage_20[];
extern struct BattleAnimBackground gBattleAnimBackgroundImage_21[];
extern struct BattleAnimBackground gBattleAnimBackgroundImage_Surf[];
extern struct BattleAnimBackground gBattleAnimBackgroundImageMuddyWater_Pal[];
extern struct BattleAnimBackground gBattleAnimBackgroundPalette_00[];
extern struct BattleAnimBackground gBattleAnimBackgroundPalette_02[];
extern struct BattleAnimBackground gBattleAnimBackgroundPalette_03[];
@ -3331,6 +3333,7 @@ extern struct BattleAnimBackground gBattleAnimBackgroundPalette_17[];
extern struct BattleAnimBackground gBattleAnimBackgroundPalette_18[];
extern struct BattleAnimBackground gBattleAnimBackgroundPalette_20[];
extern struct BattleAnimBackground gBattleAnimBackgroundPalette_21[];
extern struct BattleAnimBackground gBattleAnimBackgroundPalette_Surf[];
extern struct BattleAnimBackground gBattleAnimBackgroundPalette_22[];
extern struct BattleAnimBackground gBattleAnimBackgroundPalette_24[];
extern struct BattleAnimBackground gBattleAnimBackgroundTilemap_00[];
@ -3429,6 +3432,10 @@ extern const u8 Tiles_D129AC[];
extern const u8 gAreaUnknownTiles[];
extern const u16 gAreaUnknownPalette[];
extern const u8 gUnknown_08E70968[];
extern const u8 gUnknown_08E70C38[];
extern const u8 gUnknown_08E70F0C[];
extern const u8 gUnknown_08E964B8[];
extern const u8 gUnknown_08E8096C[];
@ -3439,4 +3446,6 @@ extern const u8 gRouletteCreditTiles[];
extern const u8 gRouletteNumbersTiles[];
extern const u8 gRouletteMultiplierTiles[];
extern const u8 gDecoration10000_Gfx[];
#endif // GUARD_GRAPHICS_H

View File

@ -64,7 +64,7 @@ void InitFlashTimer(void);
void DoSoftReset(void);
void ClearPokemonCrySongs(void);
extern const char BuildDateTime[];
extern const u8 BuildDateTime[];
extern s8 gPcmDmaCounter;
#endif // GUARD_MAIN_H

View File

@ -7,7 +7,7 @@ void RemoveMoney(u32 *, u32);
void GetMoneyAmountText(u8 *buffer, u32 arg1, u8 arg2);
void PrintMoneyAmount(u32 arg0, u8 arg1, u8 x, u8 y);
void sub_80B7AEC(u32, u8 right, u8 top);
void Draw10000Sprite(u8, u8, int);
void Draw10000Sprite(u8, u8, s32);
void UpdateMoneyWindow(u32, u8, u8);
void OpenMoneyWindow(u32, u8, u8);
void CloseMoneyWindow(u8, u8);

View File

@ -509,8 +509,8 @@ void BoxMonRestorePP(struct BoxPokemon *);
bool8 HealStatusConditions(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId);
u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit);
#if DEBUG
#if DEBUG && !(ENGLISH && REVISION == 0)
void Nakamura_NakaGenderTest_RecalcStats(struct Pokemon *);
#endif // DEBUG
#endif
#endif // GUARD_POKEMON_H

View File

@ -13,7 +13,20 @@ void debug_sub_8075DB4(struct BattleTowerEReaderTrainer *ereaderTrainer, const u
bool8 debug_sub_8075C30(void);
#if DEBUG
extern u32 gUnknown_Debug_03004BD0;
#if (ENGLISH && REVISION == 0)
#define TYPE u8
#else
#define TYPE u32
#endif
extern TYPE gUnknown_Debug_03004BD0;
// TODO: see if this is in rev1+
#if (ENGLISH && REVISION == 0)
extern TYPE gUnknown_Debug_Murakawa2;
#endif
#undef TYPE
#endif // DEBUG
#endif // GUARD_START_MENU_H

1
ruby_debug.sha1 Normal file
View File

@ -0,0 +1 @@
1d03a9128288a7076f6b4517e7602b29f76218a1 pokeruby_debug.gba

1
sapphire_de_debug.sha1 Normal file
View File

@ -0,0 +1 @@
261bec8dbd7159790cd5126bd47df5b5cef61ac1 pokesapphire_de_debug.gba

1
sapphire_debug.sha1 Normal file
View File

@ -0,0 +1 @@
e96e268b802aaa3e9215afeada21a2498dd2a9c5 pokesapphire_debug.gba

View File

@ -730,215 +730,55 @@ static void sub_80E0620(u8 taskId)
}
}
// static void sub_80E079C(struct Task *task)
// {
// int var0, var1;
// s16 var2;
// s16 i, j;
// var2 = task->data[5] - task->data[4];
// if (var2 != 0)
// {
// var0 = task->data[13] / var2;
// var1 = task->data[6];
// for (i = 0; i < task->data[4]; i++)
// {
// gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = task->data[10] - (i - 159);
// }
// for (i = task->data[4]; i <= task->data[5]; i++)
// {
// if (i >= 0)
// {
// gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = (var1 - i) + task->data[10];
// }
// var1 += var0;
// }
// for (j = i; j < task->data[7]; j++)
// {
// if (j >= 0)
// {
// gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][j] = (task->data[10] + 159) - j;
// }
// }
// }
// else
// {
// for (i = 0; i < 112; i++)
// {
// gScanlineEffectRegBuffers[0][i] = task->data[10] + 159 - i;
// gScanlineEffectRegBuffers[1][i] = task->data[10] + 159 - i;
// }
// }
// }
NAKED
static void sub_80E079C(struct Task *task)
{
asm(".syntax unified\n\
push {r4-r7,lr}\n\
mov r7, r8\n\
push {r7}\n\
adds r6, r0, 0\n\
ldrh r0, [r6, 0x12]\n\
ldrh r4, [r6, 0x10]\n\
subs r0, r4\n\
lsls r0, 16\n\
asrs r1, r0, 16\n\
cmp r1, 0\n\
beq _080E0890\n\
movs r2, 0x22\n\
ldrsh r0, [r6, r2]\n\
bl __divsi3\n\
mov r8, r0\n\
movs r3, 0x14\n\
ldrsh r0, [r6, r3]\n\
lsls r5, r0, 8\n\
lsls r0, r4, 16\n\
movs r4, 0\n\
cmp r0, 0\n\
ble _080E07FC\n\
ldr r0, _080E0888 @ =gScanlineEffectRegBuffers\n\
mov r12, r0\n\
ldr r7, _080E088C @ =gScanlineEffect\n\
_080E07D0:\n\
lsls r2, r4, 16\n\
asrs r2, 16\n\
lsls r3, r2, 1\n\
ldrb r1, [r7, 0x14]\n\
lsls r0, r1, 4\n\
subs r0, r1\n\
lsls r0, 7\n\
adds r3, r0\n\
add r3, r12\n\
adds r1, r2, 0\n\
subs r1, 0x9F\n\
ldrh r0, [r6, 0x1C]\n\
subs r0, r1\n\
strh r0, [r3]\n\
adds r2, 0x1\n\
lsls r2, 16\n\
lsrs r4, r2, 16\n\
asrs r2, 16\n\
movs r1, 0x10\n\
ldrsh r0, [r6, r1]\n\
cmp r2, r0\n\
blt _080E07D0\n\
_080E07FC:\n\
ldrh r4, [r6, 0x10]\n\
lsls r3, r4, 16\n\
asrs r1, r3, 16\n\
movs r2, 0x12\n\
ldrsh r0, [r6, r2]\n\
cmp r1, r0\n\
bgt _080E0846\n\
ldr r0, _080E0888 @ =gScanlineEffectRegBuffers\n\
mov r12, r0\n\
ldr r7, _080E088C @ =gScanlineEffect\n\
_080E0810:\n\
asrs r4, r3, 16\n\
cmp r4, 0\n\
blt _080E0832\n\
asrs r1, r5, 8\n\
subs r1, r4\n\
lsls r3, r4, 1\n\
ldrb r2, [r7, 0x14]\n\
lsls r0, r2, 4\n\
subs r0, r2\n\
lsls r0, 7\n\
adds r3, r0\n\
add r3, r12\n\
lsls r1, 16\n\
asrs r1, 16\n\
ldrh r2, [r6, 0x1C]\n\
adds r1, r2\n\
strh r1, [r3]\n\
_080E0832:\n\
add r5, r8\n\
adds r0, r4, 0x1\n\
lsls r0, 16\n\
lsrs r4, r0, 16\n\
lsls r3, r4, 16\n\
asrs r1, r3, 16\n\
movs r2, 0x12\n\
ldrsh r0, [r6, r2]\n\
cmp r1, r0\n\
ble _080E0810\n\
_080E0846:\n\
movs r3, 0x1C\n\
ldrsh r0, [r6, r3]\n\
adds r0, 0x9F\n\
lsls r2, r4, 16\n\
asrs r1, r2, 16\n\
subs r5, r0, r1\n\
movs r3, 0x16\n\
ldrsh r0, [r6, r3]\n\
cmp r1, r0\n\
bge _080E08BE\n\
ldr r7, _080E0888 @ =gScanlineEffectRegBuffers\n\
ldr r4, _080E088C @ =gScanlineEffect\n\
_080E085E:\n\
asrs r3, r2, 16\n\
cmp r3, 0\n\
blt _080E0876\n\
lsls r2, r3, 1\n\
ldrb r1, [r4, 0x14]\n\
lsls r0, r1, 4\n\
subs r0, r1\n\
lsls r0, 7\n\
adds r2, r0\n\
adds r2, r7\n\
strh r5, [r2]\n\
subs r5, 0x1\n\
_080E0876:\n\
adds r0, r3, 0x1\n\
lsls r2, r0, 16\n\
asrs r1, r2, 16\n\
movs r3, 0x16\n\
ldrsh r0, [r6, r3]\n\
cmp r1, r0\n\
blt _080E085E\n\
b _080E08BE\n\
.align 2, 0\n\
_080E0888: .4byte gScanlineEffectRegBuffers\n\
_080E088C: .4byte gScanlineEffect\n\
_080E0890:\n\
movs r1, 0x1C\n\
ldrsh r0, [r6, r1]\n\
adds r5, r0, 0\n\
adds r5, 0x9F\n\
movs r4, 0\n\
ldr r3, _080E08C8 @ =gScanlineEffectRegBuffers\n\
movs r2, 0xF0\n\
lsls r2, 3\n\
adds r6, r3, r2\n\
_080E08A2:\n\
lsls r0, r4, 16\n\
asrs r0, 16\n\
lsls r2, r0, 1\n\
adds r1, r2, r3\n\
strh r5, [r1]\n\
adds r2, r6\n\
strh r5, [r2]\n\
subs r5, 0x1\n\
adds r0, 0x1\n\
lsls r0, 16\n\
lsrs r4, r0, 16\n\
asrs r0, 16\n\
cmp r0, 0x6F\n\
ble _080E08A2\n\
_080E08BE:\n\
pop {r3}\n\
mov r8, r3\n\
pop {r4-r7}\n\
pop {r0}\n\
bx r0\n\
.align 2, 0\n\
_080E08C8: .4byte gScanlineEffectRegBuffers\n\
.syntax divided\n");
int var0, var1;
s16 var2;
s16 i;
int var4;
var2 = task->data[5] - task->data[4];
if (var2 != 0)
{
var0 = task->data[13] / var2;
var1 = task->data[6] << 8;
for (i = 0; i < task->data[4]; i++)
{
gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = task->data[10] - (i - 159);
}
for (i = task->data[4]; i <= task->data[5]; i++)
{
if (i >= 0)
{
s16 var3 = (var1 >> 8) - i;
gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = var3 + task->data[10];
}
var1 += var0;
}
var4 = task->data[10] - (i - 159);
for (i = i; i < task->data[7]; i++)
{
if (i >= 0)
{
gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = var4;
var4--;
}
}
}
else
{
var4 = task->data[10] + 159;
for (i = 0; i < 112; i++)
{
gScanlineEffectRegBuffers[0][i] = var4;
gScanlineEffectRegBuffers[1][i] = var4;
var4--;
}
}
}
static void sub_80E08CC(u8 priority)

View File

@ -2330,195 +2330,59 @@ void sub_80DB330(struct Sprite *sprite)
}
}
#ifdef NONMATCHING
void sub_80DB374(struct Sprite *sprite)
{
// NONMATCHING - Functionally equivalent - slight register swap at end
u32 matrixNum;
int t1, t3;
s16 t2;
int t1, t2;
switch (sprite->data[0])
{
case 0:
if (!gBattleAnimArgs[0])
{
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0);
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1);
}
else
{
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 0);
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 1);
}
case 0:
if (!gBattleAnimArgs[0])
{
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0);
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1);
}
else
{
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 0);
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 1);
}
sprite->data[1] = 512;
sprite->data[1] = 512;
sub_8078FDC(sprite, 0, 256, sprite->data[1], 0);
sprite->data[0]++;
break;
case 1:
if (sprite->data[2] <= 11)
sprite->data[1] -= 40;
else
sprite->data[1] += 40;
sub_8078FDC(sprite, 0, 256, sprite->data[1], 0);
++sprite->data[0];
break;
case 1:
if (sprite->data[2] <= 11)
{
sprite->data[1] -= 40;
}
else
{
sprite->data[1] += 40;
}
sprite->data[2]++;
++sprite->data[2];
sub_8078FDC(sprite, 0, 256, sprite->data[1], 0);
sub_8078FDC(sprite, 0, 256, sprite->data[1], 0);
matrixNum = sprite->oam.matrixNum;
matrixNum = sprite->oam.matrixNum;
t1 = 15616;
t2 = t1 / gOamMatrices[matrixNum].d + 1;
t1 = 15616;
t2 = gOamMatrices[matrixNum].d;
t3 = t1 / t2 + 1;
if (t2 > 128)
t2 = 128;
if (t3 > 128)
{
t3 = 128;
}
t2 = (64 - t2) / 2;
sprite->pos2.y = t2;
/* NONMATCHING
* compiles to:
* asr r0, r0, #0x1
strh r0, [r5, #0x26]
* needed:
* asrs r1, r0, 1
* strh r1, [r5, 0x26] */
sprite->pos2.y = (64 - t3) / 2;
if (sprite->data[2] == 24)
{
sub_8079098(sprite);
DestroyAnimSprite(sprite);
}
if (sprite->data[2] == 24)
{
sub_8079098(sprite);
DestroyAnimSprite(sprite);
}
break;
}
}
#else
NAKED
void sub_80DB374(struct Sprite *sprite)
{
asm_unified("push {r4,r5,lr}\n\
sub sp, 0x4\n\
adds r5, r0, 0\n\
movs r1, 0x2E\n\
ldrsh r0, [r5, r1]\n\
cmp r0, 0\n\
beq _080DB388\n\
cmp r0, 0x1\n\
beq _080DB3E0\n\
b _080DB44C\n\
_080DB388:\n\
ldr r0, _080DB398 @ =gBattleAnimArgs\n\
movs r2, 0\n\
ldrsh r0, [r0, r2]\n\
cmp r0, 0\n\
bne _080DB3A0\n\
ldr r4, _080DB39C @ =gBattleAnimAttacker\n\
b _080DB3A2\n\
.align 2, 0\n\
_080DB398: .4byte gBattleAnimArgs\n\
_080DB39C: .4byte gBattleAnimAttacker\n\
_080DB3A0:\n\
ldr r4, _080DB3DC @ =gBattleAnimTarget\n\
_080DB3A2:\n\
ldrb r0, [r4]\n\
movs r1, 0\n\
bl GetBattlerSpriteCoord\n\
lsls r0, 24\n\
lsrs r0, 24\n\
strh r0, [r5, 0x20]\n\
ldrb r0, [r4]\n\
movs r1, 0x1\n\
bl GetBattlerSpriteCoord\n\
lsls r0, 24\n\
lsrs r0, 24\n\
strh r0, [r5, 0x22]\n\
movs r0, 0\n\
movs r3, 0x80\n\
lsls r3, 2\n\
strh r3, [r5, 0x30]\n\
movs r2, 0x80\n\
lsls r2, 1\n\
str r0, [sp]\n\
adds r0, r5, 0\n\
movs r1, 0\n\
bl sub_8078FDC\n\
ldrh r0, [r5, 0x2E]\n\
adds r0, 0x1\n\
strh r0, [r5, 0x2E]\n\
b _080DB44C\n\
.align 2, 0\n\
_080DB3DC: .4byte gBattleAnimTarget\n\
_080DB3E0:\n\
movs r1, 0x32\n\
ldrsh r0, [r5, r1]\n\
cmp r0, 0xB\n\
bgt _080DB3EE\n\
ldrh r0, [r5, 0x30]\n\
subs r0, 0x28\n\
b _080DB3F2\n\
_080DB3EE:\n\
ldrh r0, [r5, 0x30]\n\
adds r0, 0x28\n\
_080DB3F2:\n\
strh r0, [r5, 0x30]\n\
ldrh r0, [r5, 0x32]\n\
adds r0, 0x1\n\
movs r1, 0\n\
strh r0, [r5, 0x32]\n\
movs r2, 0x80\n\
lsls r2, 1\n\
movs r0, 0x30\n\
ldrsh r3, [r5, r0]\n\
str r1, [sp]\n\
adds r0, r5, 0\n\
bl sub_8078FDC\n\
ldrb r1, [r5, 0x3]\n\
lsls r1, 26\n\
lsrs r1, 27\n\
movs r0, 0xF4\n\
lsls r0, 6\n\
ldr r2, _080DB454 @ =gOamMatrices\n\
lsls r1, 3\n\
adds r1, r2\n\
movs r2, 0x6\n\
ldrsh r1, [r1, r2]\n\
bl __divsi3\n\
adds r1, r0, 0x1\n\
cmp r1, 0x80\n\
ble _080DB42C\n\
movs r1, 0x80\n\
_080DB42C:\n\
movs r0, 0x40\n\
subs r0, r1\n\
lsrs r1, r0, 31\n\
adds r0, r1\n\
asrs r1, r0, 1\n\
strh r1, [r5, 0x26]\n\
movs r1, 0x32\n\
ldrsh r0, [r5, r1]\n\
cmp r0, 0x18\n\
bne _080DB44C\n\
adds r0, r5, 0\n\
bl sub_8079098\n\
adds r0, r5, 0\n\
bl DestroyAnimSprite\n\
_080DB44C:\n\
add sp, 0x4\n\
pop {r4,r5}\n\
pop {r0}\n\
bx r0\n\
.align 2, 0\n\
_080DB454: .4byte gOamMatrices\n");
}
#endif
void sub_80DB458(struct Sprite *sprite)
{

File diff suppressed because it is too large Load Diff

View File

@ -1042,17 +1042,14 @@ static void sub_80DC3F4(u8 taskId)
}
}
#ifdef NONMATCHING
void sub_80DC4F4(u8 taskId)
{
s16 spriteId;
u8 matrixNum;
register u8 matrixNum2 asm("r6");
s16 matrixNum;
struct Task *task = &gTasks[taskId];
matrixNum = AllocOamMatrix();
matrixNum2 = matrixNum;
if (matrixNum2 == 0xFF)
if (matrixNum == 0xFF)
{
DestroyAnimVisualTask(taskId);
return;
@ -1068,7 +1065,7 @@ void sub_80DC4F4(u8 taskId)
gSprites[spriteId].callback = SpriteCallbackDummy;
gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_DOUBLE;
gSprites[spriteId].oam.matrixNum = matrixNum2;
gSprites[spriteId].oam.matrixNum = matrixNum;
gSprites[spriteId].affineAnimPaused = 1;
gSprites[spriteId].subpriority++;
obj_id_set_rotscale(spriteId, 256, 256, 0);
@ -1079,132 +1076,6 @@ void sub_80DC4F4(u8 taskId)
task->data[15] = spriteId;
task->func = sub_80DC5F4;
}
#else
NAKED
void sub_80DC4F4(u8 taskId)
{
asm(".syntax unified\n\
push {r4-r7,lr}\n\
mov r7, r10\n\
mov r6, r9\n\
mov r5, r8\n\
push {r5-r7}\n\
lsls r0, 24\n\
lsrs r4, r0, 24\n\
mov r8, r4\n\
lsls r0, r4, 2\n\
adds r0, r4\n\
lsls r0, 3\n\
ldr r1, _080DC528 @ =gTasks\n\
adds r7, r0, r1\n\
bl AllocOamMatrix\n\
lsls r0, 24\n\
lsrs r5, r0, 24\n\
mov r10, r5\n\
adds r6, r5, 0\n\
cmp r6, 0xFF\n\
bne _080DC52C\n\
adds r0, r4, 0\n\
bl DestroyAnimVisualTask\n\
b _080DC5D6\n\
.align 2, 0\n\
_080DC528: .4byte gTasks\n\
_080DC52C:\n\
ldr r1, _080DC550 @ =gBattleAnimArgs\n\
ldrb r0, [r1]\n\
bl duplicate_obj_of_side_rel2move_in_transparent_mode\n\
lsls r0, 16\n\
lsrs r1, r0, 16\n\
mov r9, r1\n\
asrs r0, 16\n\
cmp r0, 0\n\
bge _080DC554\n\
adds r0, r5, 0\n\
bl FreeOamMatrix\n\
mov r0, r8\n\
bl DestroyAnimVisualTask\n\
b _080DC5D6\n\
.align 2, 0\n\
_080DC550: .4byte gBattleAnimArgs\n\
_080DC554:\n\
ldr r2, _080DC5E4 @ =gSprites\n\
lsls r4, r0, 4\n\
adds r4, r0\n\
lsls r4, 2\n\
adds r0, r2, 0\n\
adds r0, 0x1C\n\
adds r0, r4, r0\n\
ldr r1, _080DC5E8 @ =SpriteCallbackDummy\n\
str r1, [r0]\n\
adds r4, r2\n\
ldrb r0, [r4, 0x1]\n\
movs r1, 0x3\n\
orrs r0, r1\n\
strb r0, [r4, 0x1]\n\
movs r0, 0x1F\n\
ands r6, r0\n\
lsls r2, r6, 1\n\
ldrb r1, [r4, 0x3]\n\
movs r0, 0x3F\n\
negs r0, r0\n\
ands r0, r1\n\
orrs r0, r2\n\
strb r0, [r4, 0x3]\n\
adds r2, r4, 0\n\
adds r2, 0x2C\n\
ldrb r0, [r2]\n\
movs r1, 0x80\n\
orrs r0, r1\n\
strb r0, [r2]\n\
adds r1, r4, 0\n\
adds r1, 0x43\n\
ldrb r0, [r1]\n\
adds r0, 0x1\n\
strb r0, [r1]\n\
mov r1, r9\n\
lsls r0, r1, 24\n\
lsrs r0, 24\n\
movs r2, 0x80\n\
lsls r2, 1\n\
adds r1, r2, 0\n\
movs r3, 0\n\
bl obj_id_set_rotscale\n\
ldrb r3, [r4, 0x1]\n\
lsrs r1, r3, 6\n\
ldrb r2, [r4, 0x3]\n\
lsrs r2, 6\n\
lsls r3, 30\n\
lsrs r3, 30\n\
adds r0, r4, 0\n\
bl CalcCenterToCornerVec\n\
ldr r1, _080DC5EC @ =gBattleAnimArgs\n\
ldrb r0, [r1]\n\
bl GetAnimBattlerSpriteId\n\
lsls r0, 24\n\
lsrs r0, 24\n\
strh r0, [r7, 0x22]\n\
mov r0, r10\n\
strh r0, [r7, 0x24]\n\
mov r1, r9\n\
strh r1, [r7, 0x26]\n\
ldr r0, _080DC5F0 @ =sub_80DC5F4\n\
str r0, [r7]\n\
_080DC5D6:\n\
pop {r3-r5}\n\
mov r8, r3\n\
mov r9, r4\n\
mov r10, r5\n\
pop {r4-r7}\n\
pop {r0}\n\
bx r0\n\
.align 2, 0\n\
_080DC5E4: .4byte gSprites\n\
_080DC5E8: .4byte SpriteCallbackDummy\n\
_080DC5EC: .4byte gBattleAnimArgs\n\
_080DC5F0: .4byte sub_80DC5F4\n\
.syntax divided\n");
}
#endif // NONMATCHING
void sub_80DC5F4(u8 taskId)
{

File diff suppressed because it is too large Load Diff

View File

@ -246,10 +246,7 @@ static const BattleAICmdFunc sBattleAICmdTable[] =
BattleAICmd_if_not_taunted, // 0x5D
};
#ifdef NONMATCHING
static
#endif
const u16 sDiscouragedPowerfulMoveEffects[] =
static const u16 sDiscouragedPowerfulMoveEffects[] =
{
EFFECT_EXPLOSION,
EFFECT_DREAM_EATER,
@ -337,7 +334,7 @@ void BattleAI_SetupAIData(void)
AI_THINKING_STRUCT->aiFlags = 0x20000000;
else if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE)
AI_THINKING_STRUCT->aiFlags = 0x80000000;
#ifdef GERMAN
#if GERMAN || (ENGLISH && DEBUG && REVISION == 0)
else if (gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER) || gTrainerBattleOpponent == SECRET_BASE_OPPONENT)
AI_THINKING_STRUCT->aiFlags = 7;
#endif
@ -945,18 +942,19 @@ static void BattleAICmd_get_move_power(void)
gAIScriptPtr += 1;
}
#ifdef NONMATCHING
static void BattleAICmd_is_most_powerful_move(void)
{
int i, j;
s32 damages[MAX_MON_MOVES];
s32 i, checkedMove;
s32 moveDmgs[MAX_MON_MOVES];
for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++)
{
if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect == sDiscouragedPowerfulMoveEffects[i])
break;
}
if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power > 1
&& sDiscouragedPowerfulMoveEffects[i] == 0xFFFF)
&& sDiscouragedPowerfulMoveEffects[i] == 0xFFFF)
{
gDynamicBasePower = 0;
eDynamicMoveType = 0;
@ -964,294 +962,49 @@ static void BattleAICmd_is_most_powerful_move(void)
gMoveResultFlags = 0;
gCritMultiplier = 1;
for (i = 0; i < MAX_MON_MOVES; i++)
for (checkedMove = 0; checkedMove < MAX_MON_MOVES; checkedMove++)
{
for (j = 0; sDiscouragedPowerfulMoveEffects[j] != 0xFFFF; j++)
{ // _08108276
if (gBattleMoves[gBattleMons[gBattlerAttacker].moves[i]].effect == sDiscouragedPowerfulMoveEffects[j])
for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++)
{
if (gBattleMoves[gBattleMons[gBattlerAttacker].moves[checkedMove]].effect == sDiscouragedPowerfulMoveEffects[i])
break;
}
// _081082BA
if (gBattleMons[gBattlerAttacker].moves[i]
&& sDiscouragedPowerfulMoveEffects[j] == 0xFFFF
&& gBattleMoves[gBattleMons[gBattlerAttacker].moves[i]].power > 1)
if (gBattleMons[gBattlerAttacker].moves[checkedMove] != MOVE_NONE
&& sDiscouragedPowerfulMoveEffects[i] == 0xFFFF
&& gBattleMoves[gBattleMons[gBattlerAttacker].moves[checkedMove]].power > 1)
{
gCurrentMove = gBattleMons[gBattlerAttacker].moves[i];
gCurrentMove = gBattleMons[gBattlerAttacker].moves[checkedMove];
AI_CalcDmg(gBattlerAttacker, gBattlerTarget);
TypeCalc(gCurrentMove, gBattlerAttacker, gBattlerTarget);
damages[i] = (gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[i]) / 100;
if (damages[i] == 0) // moves always do at least 1 damage.
damages[i] = 1;
moveDmgs[checkedMove] = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[checkedMove] / 100;
if (moveDmgs[checkedMove] == 0)
moveDmgs[checkedMove] = 1;
}
else
{
damages[i] = 0;
moveDmgs[checkedMove] = 0;
}
}
for (i = 0; i < MAX_MON_MOVES; i++)
if (damages[i] > damages[AI_THINKING_STRUCT->movesetIndex])
for (checkedMove = 0; checkedMove < MAX_MON_MOVES; checkedMove++)
{
if (moveDmgs[checkedMove] > moveDmgs[AI_THINKING_STRUCT->movesetIndex])
break;
}
if (i == MAX_MON_MOVES)
AI_THINKING_STRUCT->funcResult = 2;
if (checkedMove == MAX_MON_MOVES)
AI_THINKING_STRUCT->funcResult = 2; // Is the most powerful.
else
AI_THINKING_STRUCT->funcResult = 1;
AI_THINKING_STRUCT->funcResult = 1; // Not the most powerful.
}
else
{
AI_THINKING_STRUCT->funcResult = 0;
AI_THINKING_STRUCT->funcResult = 0; // Highly discouraged in terms of power.
}
gAIScriptPtr += 1;
gAIScriptPtr++;
}
#else
NAKED
static void BattleAICmd_is_most_powerful_move(void)
{
asm(".syntax unified\n\
push {r4-r7,lr}\n\
mov r7, r10\n\
mov r6, r9\n\
mov r5, r8\n\
push {r5-r7}\n\
sub sp, 0x14\n\
movs r3, 0\n\
ldr r0, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\
ldrh r1, [r0]\n\
ldr r4, _0810832C @ =0x0000ffff\n\
ldr r6, _08108330 @ =gBattleMoves\n\
ldr r5, _08108334 @ =gSharedMem + 0x16800\n\
cmp r1, r4\n\
beq _0810822E\n\
ldrh r1, [r5, 0x2]\n\
lsls r0, r1, 1\n\
adds r0, r1\n\
lsls r0, 2\n\
adds r0, r6\n\
ldrb r2, [r0]\n\
ldr r1, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\
_0810821E:\n\
ldrh r0, [r1]\n\
cmp r2, r0\n\
beq _0810822E\n\
adds r1, 0x2\n\
adds r3, 0x1\n\
ldrh r0, [r1]\n\
cmp r0, r4\n\
bne _0810821E\n\
_0810822E:\n\
ldrh r0, [r5, 0x2]\n\
lsls r1, r0, 1\n\
adds r1, r0\n\
lsls r1, 2\n\
adds r1, r6\n\
ldrb r0, [r1, 0x1]\n\
cmp r0, 0x1\n\
bhi _08108240\n\
b _081083B2\n\
_08108240:\n\
lsls r0, r3, 1\n\
ldr r1, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\
adds r0, r1\n\
ldrh r3, [r0]\n\
ldr r0, _0810832C @ =0x0000ffff\n\
cmp r3, r0\n\
beq _08108250\n\
b _081083B2\n\
_08108250:\n\
ldr r0, _08108338 @ =gDynamicBasePower\n\
movs r1, 0\n\
strh r1, [r0]\n\
ldr r2, _0810833C @ =0xfffff81c\n\
adds r0, r5, r2\n\
strb r1, [r0]\n\
adds r2, 0x3\n\
adds r0, r5, r2\n\
movs r2, 0x1\n\
strb r2, [r0]\n\
ldr r0, _08108340 @ =gMoveResultFlags\n\
strb r1, [r0]\n\
ldr r0, _08108344 @ =gCritMultiplier\n\
strb r2, [r0]\n\
movs r6, 0\n\
mov r9, r3\n\
ldr r0, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\
ldrh r0, [r0]\n\
str r0, [sp, 0x10]\n\
_08108276:\n\
movs r3, 0\n\
ldr r5, _08108348 @ =gBattleMons\n\
lsls r4, r6, 1\n\
ldr r7, _0810834C @ =gBattlerAttacker\n\
lsls r1, r6, 2\n\
mov r8, r1\n\
adds r2, r6, 0x1\n\
mov r10, r2\n\
ldr r0, [sp, 0x10]\n\
cmp r0, r9\n\
beq _081082BA\n\
ldr r2, _08108330 @ =gBattleMoves\n\
ldrb r1, [r7]\n\
movs r0, 0x58\n\
muls r0, r1\n\
adds r0, r4, r0\n\
adds r1, r5, 0\n\
adds r1, 0xC\n\
adds r0, r1\n\
ldrh r1, [r0]\n\
lsls r0, r1, 1\n\
adds r0, r1\n\
lsls r0, 2\n\
adds r0, r2\n\
ldrb r2, [r0]\n\
ldr r1, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\
_081082AA:\n\
ldrh r0, [r1]\n\
cmp r2, r0\n\
beq _081082BA\n\
adds r1, 0x2\n\
adds r3, 0x1\n\
ldrh r0, [r1]\n\
cmp r0, r9\n\
bne _081082AA\n\
_081082BA:\n\
ldrb r1, [r7]\n\
movs r0, 0x58\n\
muls r0, r1\n\
adds r0, r4, r0\n\
adds r1, r5, 0\n\
adds r1, 0xC\n\
adds r1, r0, r1\n\
ldrh r0, [r1]\n\
cmp r0, 0\n\
beq _0810835C\n\
lsls r0, r3, 1\n\
ldr r2, _08108328 @ =sDiscouragedPowerfulMoveEffects\n\
adds r0, r2\n\
ldrh r0, [r0]\n\
cmp r0, r9\n\
bne _0810835C\n\
ldr r0, _08108330 @ =gBattleMoves\n\
ldrh r2, [r1]\n\
lsls r1, r2, 1\n\
adds r1, r2\n\
lsls r1, 2\n\
adds r1, r0\n\
ldrb r0, [r1, 0x1]\n\
cmp r0, 0x1\n\
bls _0810835C\n\
ldr r5, _08108350 @ =gCurrentMove\n\
strh r2, [r5]\n\
ldrb r0, [r7]\n\
ldr r4, _08108354 @ =gBattlerTarget\n\
ldrb r1, [r4]\n\
bl AI_CalcDmg\n\
ldrh r0, [r5]\n\
ldrb r1, [r7]\n\
ldrb r2, [r4]\n\
bl TypeCalc\n\
mov r4, sp\n\
add r4, r8\n\
ldr r2, _08108358 @ =gBattleMoveDamage\n\
ldr r0, _08108334 @ =gSharedMem + 0x16800\n\
adds r0, 0x18\n\
adds r0, r6, r0\n\
ldrb r1, [r0]\n\
ldr r0, [r2]\n\
muls r0, r1\n\
movs r1, 0x64\n\
bl __divsi3\n\
str r0, [r4]\n\
cmp r0, 0\n\
bne _08108364\n\
movs r0, 0x1\n\
str r0, [r4]\n\
b _08108364\n\
.align 2, 0\n\
_08108328: .4byte sDiscouragedPowerfulMoveEffects\n\
_0810832C: .4byte 0x0000ffff\n\
_08108330: .4byte gBattleMoves\n\
_08108334: .4byte gSharedMem + 0x16800\n\
_08108338: .4byte gDynamicBasePower\n\
_0810833C: .4byte 0xfffff81c\n\
_08108340: .4byte gMoveResultFlags\n\
_08108344: .4byte gCritMultiplier\n\
_08108348: .4byte gBattleMons\n\
_0810834C: .4byte gBattlerAttacker\n\
_08108350: .4byte gCurrentMove\n\
_08108354: .4byte gBattlerTarget\n\
_08108358: .4byte gBattleMoveDamage\n\
_0810835C:\n\
mov r1, sp\n\
add r1, r8\n\
movs r0, 0\n\
str r0, [r1]\n\
_08108364:\n\
mov r6, r10\n\
cmp r6, 0x3\n\
ble _08108276\n\
movs r6, 0\n\
ldr r1, _081083A4 @ =gSharedMem + 0x16800\n\
ldrb r0, [r1, 0x1]\n\
lsls r0, 2\n\
add r0, sp\n\
ldr r2, [sp]\n\
ldr r0, [r0]\n\
adds r5, r1, 0\n\
ldr r4, _081083A8 @ =gAIScriptPtr\n\
cmp r2, r0\n\
bgt _0810839A\n\
adds r3, r5, 0\n\
mov r2, sp\n\
_08108384:\n\
adds r2, 0x4\n\
adds r6, 0x1\n\
cmp r6, 0x3\n\
bgt _0810839A\n\
ldrb r0, [r3, 0x1]\n\
lsls r0, 2\n\
add r0, sp\n\
ldr r1, [r2]\n\
ldr r0, [r0]\n\
cmp r1, r0\n\
ble _08108384\n\
_0810839A:\n\
cmp r6, 0x4\n\
bne _081083AC\n\
movs r0, 0x2\n\
str r0, [r5, 0x8]\n\
b _081083B8\n\
.align 2, 0\n\
_081083A4: .4byte gSharedMem + 0x16800\n\
_081083A8: .4byte gAIScriptPtr\n\
_081083AC:\n\
movs r0, 0x1\n\
str r0, [r5, 0x8]\n\
b _081083B8\n\
_081083B2:\n\
movs r0, 0\n\
str r0, [r5, 0x8]\n\
ldr r4, _081083D0 @ =gAIScriptPtr\n\
_081083B8:\n\
ldr r0, [r4]\n\
adds r0, 0x1\n\
str r0, [r4]\n\
add sp, 0x14\n\
pop {r3-r5}\n\
mov r8, r3\n\
mov r9, r4\n\
mov r10, r5\n\
pop {r4-r7}\n\
pop {r0}\n\
bx r0\n\
.align 2, 0\n\
_081083D0: .4byte gAIScriptPtr\n\
.syntax divided\n");
}
#endif // NONMATCHING
static void BattleAICmd_get_move(void)
{

View File

@ -47,263 +47,60 @@ static bool8 ShouldSwitchIfPerishSong(void)
return FALSE;
}
#ifdef NONMATCHING
static bool8 ShouldSwitchIfWonderGuard(void)
{
u8 opposingBattler;
u8 moveFlags;
s32 i, j;
u16 move;
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
if(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
return FALSE;
if (gBattleMons[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)].ability != ABILITY_WONDER_GUARD)
return FALSE;
// check if pokemon has a super effective move
opposingBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);
for (i = 0; i < 4; i++)
if (gBattleMons[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)].ability == ABILITY_WONDER_GUARD)
{
u16 move = gBattleMons[gActiveBattler].moves[i];
if (move == MOVE_NONE)
continue;
moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability);
if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE)
return FALSE;
}
// find a pokemon in the party that has a super effective move
for (i = 0; i < 6; i++)
{
if (GetMonData(&gEnemyParty[i], MON_DATA_HP) == 0
|| GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_NONE
|| GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_EGG
|| i == gBattlerPartyIndexes[gActiveBattler])
continue;
GetMonData(&gEnemyParty[i], MON_DATA_SPECIES); // unused return value
GetMonData(&gEnemyParty[i], MON_DATA_ALT_ABILITY); // unused return value
opposingBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);
for (j = 0; j < 4; j++)
// Check if Pokemon has a super effective move.
for (opposingBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT), i = 0; i < MAX_MON_MOVES; ++i)
{
u16 move = GetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j);
move = gBattleMons[gActiveBattler].moves[i];
if (move == MOVE_NONE)
continue;
moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability);
if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE && (Random() % 3) < 2)
if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE)
return FALSE;
}
// Find a Pokemon in the party that has a super effective move.
for (i = 0; i < PARTY_SIZE; ++i)
{
if (GetMonData(&gEnemyParty[i], MON_DATA_HP) == 0)
continue;
if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_NONE)
continue;
if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2) == SPECIES_EGG)
continue;
if (i == gBattlerPartyIndexes[gActiveBattler])
continue;
GetMonData(&gEnemyParty[i], MON_DATA_SPECIES); // Unused return value.
GetMonData(&gEnemyParty[i], MON_DATA_ALT_ABILITY); // Unused return value.
for (opposingBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT), j = 0; j < MAX_MON_MOVES; ++j)
{
// we found a mon
ewram160C8arr(GetBattlerPosition(gActiveBattler)) = i; // gBattleStruct->AI_monToSwitchIntoId[GetBattlerPosition(gActiveBattler)] = i;
BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);
return TRUE;
move = GetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j);
if (move == MOVE_NONE)
continue;
moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability);
if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE && Random() % 3 < 2)
{
// We found a mon.
ewram160C8arr(GetBattlerPosition(gActiveBattler)) = i; // gBattleStruct->AI_monToSwitchIntoId[GetBattlerPosition(gActiveBattler)] = i;
BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);
return TRUE;
}
}
}
}
return FALSE; // at this point there is not a single pokemon in the party that has a super effective move against a pokemon with wonder guard
return FALSE; // There is not a single Pokemon in the party that has a super effective move against a mon with Wonder Guard.
}
#else
NAKED
static bool8 ShouldSwitchIfWonderGuard(void)
{
asm(".syntax unified\n\
push {r4-r7,lr}\n\
mov r7, r9\n\
mov r6, r8\n\
push {r6,r7}\n\
ldr r0, _0803606C @ =gBattleTypeFlags\n\
ldrh r1, [r0]\n\
movs r0, 0x1\n\
ands r0, r1\n\
cmp r0, 0\n\
beq _080360A0\n\
b _080361C8\n\
.align 2, 0\n\
_0803606C: .4byte gBattleTypeFlags\n\
_08036070:\n\
ldr r0, _08036094 @ =gActiveBattler\n\
ldrb r0, [r0]\n\
bl GetBattlerPosition\n\
ldr r1, _08036098 @ =gSharedMem\n\
lsls r0, 24\n\
lsrs r0, 25\n\
ldr r2, _0803609C @ =0x000160c8\n\
adds r0, r2\n\
adds r0, r1\n\
strb r6, [r0]\n\
movs r0, 0x1\n\
movs r1, 0x2\n\
movs r2, 0\n\
bl BtlController_EmitTwoReturnValues\n\
movs r0, 0x1\n\
b _080361CA\n\
.align 2, 0\n\
_08036094: .4byte gActiveBattler\n\
_08036098: .4byte gSharedMem\n\
_0803609C: .4byte 0x000160c8\n\
_080360A0:\n\
ldr r4, _080361D8 @ =gBattleMons\n\
movs r0, 0\n\
bl GetBattlerAtPosition\n\
lsls r0, 24\n\
lsrs r0, 24\n\
movs r1, 0x58\n\
muls r0, r1\n\
adds r0, r4\n\
adds r0, 0x20\n\
ldrb r0, [r0]\n\
cmp r0, 0x19\n\
beq _080360BC\n\
b _080361C8\n\
_080360BC:\n\
movs r0, 0\n\
bl GetBattlerAtPosition\n\
lsls r0, 24\n\
lsrs r2, r0, 24\n\
movs r6, 0\n\
adds r7, r4, 0\n\
movs r5, 0x58\n\
adds r0, r2, 0\n\
muls r0, r5\n\
adds r4, r0, r7\n\
movs r3, 0x20\n\
adds r3, r4\n\
mov r8, r3\n\
_080360D8:\n\
lsls r1, r6, 1\n\
ldr r0, _080361DC @ =gActiveBattler\n\
ldrb r0, [r0]\n\
muls r0, r5\n\
adds r1, r0\n\
adds r0, r7, 0\n\
adds r0, 0xC\n\
adds r1, r0\n\
ldrh r0, [r1]\n\
cmp r0, 0\n\
beq _08036104\n\
ldrh r1, [r4]\n\
mov r3, r8\n\
ldrb r2, [r3]\n\
bl AI_TypeCalc\n\
lsls r0, 24\n\
lsrs r1, r0, 24\n\
movs r0, 0x2\n\
ands r1, r0\n\
cmp r1, 0\n\
bne _080361C8\n\
_08036104:\n\
adds r6, 0x1\n\
cmp r6, 0x3\n\
ble _080360D8\n\
movs r6, 0\n\
ldr r0, _080361E0 @ =gEnemyParty\n\
mov r9, r0\n\
_08036110:\n\
movs r0, 0x64\n\
adds r5, r6, 0\n\
muls r5, r0\n\
mov r2, r9\n\
adds r4, r5, r2\n\
adds r0, r4, 0\n\
movs r1, 0x39\n\
bl GetMonData\n\
cmp r0, 0\n\
beq _080361C2\n\
adds r0, r4, 0\n\
movs r1, 0x41\n\
bl GetMonData\n\
cmp r0, 0\n\
beq _080361C2\n\
adds r0, r4, 0\n\
movs r1, 0x41\n\
bl GetMonData\n\
movs r1, 0xCE\n\
lsls r1, 1\n\
cmp r0, r1\n\
beq _080361C2\n\
ldr r1, _080361E4 @ =gBattlerPartyIndexes\n\
ldr r0, _080361DC @ =gActiveBattler\n\
ldrb r0, [r0]\n\
lsls r0, 1\n\
adds r0, r1\n\
ldrh r0, [r0]\n\
cmp r6, r0\n\
beq _080361C2\n\
adds r0, r4, 0\n\
movs r1, 0xB\n\
bl GetMonData\n\
adds r0, r4, 0\n\
movs r1, 0x2E\n\
bl GetMonData\n\
movs r0, 0\n\
bl GetBattlerAtPosition\n\
lsls r0, 24\n\
lsrs r2, r0, 24\n\
movs r4, 0\n\
mov r8, r5\n\
ldr r1, _080361D8 @ =gBattleMons\n\
movs r0, 0x58\n\
muls r0, r2\n\
adds r5, r0, r1\n\
adds r7, r5, 0\n\
adds r7, 0x20\n\
_0803617C:\n\
adds r1, r4, 0\n\
adds r1, 0xD\n\
mov r0, r8\n\
add r0, r9\n\
bl GetMonData\n\
lsls r0, 16\n\
lsrs r0, 16\n\
cmp r0, 0\n\
beq _080361BC\n\
ldrh r1, [r5]\n\
ldrb r2, [r7]\n\
bl AI_TypeCalc\n\
lsls r0, 24\n\
lsrs r1, r0, 24\n\
movs r0, 0x2\n\
ands r1, r0\n\
cmp r1, 0\n\
beq _080361BC\n\
bl Random\n\
lsls r0, 16\n\
lsrs r0, 16\n\
movs r1, 0x3\n\
bl __umodsi3\n\
lsls r0, 16\n\
lsrs r0, 16\n\
cmp r0, 0x1\n\
bhi _080361BC\n\
b _08036070\n\
_080361BC:\n\
adds r4, 0x1\n\
cmp r4, 0x3\n\
ble _0803617C\n\
_080361C2:\n\
adds r6, 0x1\n\
cmp r6, 0x5\n\
ble _08036110\n\
_080361C8:\n\
movs r0, 0\n\
_080361CA:\n\
pop {r3,r4}\n\
mov r8, r3\n\
mov r9, r4\n\
pop {r4-r7}\n\
pop {r1}\n\
bx r1\n\
.align 2, 0\n\
_080361D8: .4byte gBattleMons\n\
_080361DC: .4byte gActiveBattler\n\
_080361E0: .4byte gEnemyParty\n\
_080361E4: .4byte gBattlerPartyIndexes\n\
.syntax divided\n");
}
#endif // NONMATCHING
static bool8 FindMonThatAbsorbsOpponentsMove(void)
{

View File

@ -1479,7 +1479,7 @@ void LaunchBattleAnimation(const u8 *const moveAnims[], u16 move, u8 isMoveAnim)
UpdateOamPriorityInAllHealthboxes(0);
for (i = 0; i < 4; i++)
{
if (GetBattlerSide(i) != 0)
if (GetBattlerSide(i) != B_SIDE_PLAYER)
gAnimSpeciesByBanks[i] = GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES);
else
gAnimSpeciesByBanks[i] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES);
@ -1793,7 +1793,7 @@ static void ScriptCmd_end(void)
if (!continuousAnim) // may have been used for debug?
{
m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 256);
if (IsContest() == 0)
if (!IsContest())
{
UpdateBattlerSpritePriorities();
UpdateOamPriorityInAllHealthboxes(1);
@ -1838,7 +1838,7 @@ static void ScriptCmd_monbg(void)
{
identity = GetBattlerPosition(bank);
identity += 0xFF;
if (identity <= 1 || IsContest() != 0)
if (identity <= 1 || IsContest())
toBG_2 = 0;
else
toBG_2 = 1;
@ -1870,7 +1870,7 @@ static void ScriptCmd_monbg(void)
{
identity = GetBattlerPosition(bank);
identity += 0xFF;
if (identity <= 1 || IsContest() != 0)
if (identity <= 1 || IsContest())
toBG_2 = 0;
else
toBG_2 = 1;
@ -1940,7 +1940,7 @@ void MoveBattlerSpriteToBG(u8 bank, u8 toBG_2)
spriteId = gBattlerSpriteIds[bank];
gBattle_BG1_X = -(gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x) + 32;
if (IsContest() != 0 && IsSpeciesNotUnown(EWRAM_19348[0]) != 0)
if (IsContest() && IsSpeciesNotUnown(EWRAM_19348[0]) != 0)
gBattle_BG1_X--;
gBattle_BG1_Y = -(gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y) + 32;
gSprites[gBattlerSpriteIds[bank]].invisible = TRUE;
@ -1951,12 +1951,12 @@ void MoveBattlerSpriteToBG(u8 bank, u8 toBG_2)
LoadPalette(gPlttBufferUnfaded + 0x100 + bank * 16, s.unk8 * 16, 32);
DmaCopy32Defvars(3, gPlttBufferUnfaded + 0x100 + bank * 16, (u16 *)PLTT + s.unk8 * 16, 32);
if (IsContest() != 0)
if (IsContest())
r2 = 0;
else
r2 = GetBattlerPosition(bank);
sub_80E4EF8(0, 0, r2, s.unk8, (u32)s.unk0, (((s32)s.unk4 - VRAM) / 2048), REG_BG1CNT_BITFIELD.charBaseBlock);
if (IsContest() != 0)
if (IsContest())
sub_8076380();
}
else
@ -2040,7 +2040,7 @@ void sub_8076464(u8 a)
struct UnknownStruct2 s;
sub_8078914(&s);
if (a == 0 || IsContest() != 0)
if (a == 0 || IsContest())
{
DmaFill32Large(3, 0, s.unk0, 0x2000, 0x1000);
pointlessZero = 0; // is there a stubbed out Dma macro here that left the 0 load in?
@ -2128,7 +2128,7 @@ static void sub_807672C(u8 taskId)
{
identity = GetBattlerPosition(gTasks[taskId].data[2]);
identity += 0xFF;
if (identity <= 1 || IsContest() != 0)
if (identity <= 1 || IsContest())
to_BG2 = 0;
else
to_BG2 = 1;
@ -2172,7 +2172,7 @@ static void ScriptCmd_monbg_22(void)
{
identity = GetBattlerPosition(bank);
identity += 0xFF;
if (identity <= 1 || IsContest() != 0)
if (identity <= 1 || IsContest())
r1 = 0;
else
r1 = 1;
@ -2185,7 +2185,7 @@ static void ScriptCmd_monbg_22(void)
{
identity = GetBattlerPosition(bank);
identity += 0xFF;
if (identity <= 1 || IsContest() != 0)
if (identity <= 1 || IsContest())
r1 = 0;
else
r1 = 1;
@ -2240,7 +2240,7 @@ static void sub_80769A4(u8 taskId)
bank = gTasks[taskId].data[2];
identity = GetBattlerPosition(bank);
identity += 0xFF;
if (identity <= 1 || IsContest() != 0)
if (identity <= 1 || IsContest())
toBG_2 = 0;
else
toBG_2 = 1;
@ -2400,7 +2400,7 @@ static void ScriptCmd_fadetobgfromset(void)
if (IsContest())
gTasks[taskId].tBackgroundId = bg3;
else if (GetBattlerSide(gBattleAnimTarget) == 0)
else if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
gTasks[taskId].tBackgroundId = bg2;
else
gTasks[taskId].tBackgroundId = bg1;
@ -2524,188 +2524,60 @@ static void ScriptCmd_changebg(void)
sBattleAnimScriptPtr++;
}
//Weird control flow
/*
s8 BattleAnimAdjustPanning(s8 a)
s8 BattleAnimAdjustPanning(s8 pan)
{
if (!IsContest() && (EWRAM_17810[gBattleAnimAttacker].unk0 & 0x10))
{
a = GetBattlerSide(gBattleAnimAttacker) ? SOUND_PAN_ATTACKER : SOUND_PAN_TARGET;
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
pan = SOUND_PAN_TARGET;
else
pan = SOUND_PAN_ATTACKER_NEG;
}
else if (IsContest())
{
if (gBattleAnimAttacker != gBattleAnimTarget || gBattleAnimAttacker != 2 || pan != SOUND_PAN_TARGET)
pan *= -1;
}
else if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
{
if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
{
if (pan == SOUND_PAN_TARGET)
pan = SOUND_PAN_ATTACKER_NEG;
else if (pan != SOUND_PAN_ATTACKER_NEG)
pan *= -1;
}
}
else if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_OPPONENT)
{
if (pan == SOUND_PAN_ATTACKER_NEG)
pan = SOUND_PAN_TARGET;
}
//_08076FDC
else
{
if (IsContest())
{
if (gBattleAnimAttacker == gBattleAnimTarget && gBattleAnimAttacker == 2
&& a == SOUND_PAN_TARGET)
{
//jump to _0807707A
if (a < SOUND_PAN_ATTACKER_NEG)
a = SOUND_PAN_ATTACKER;
return a;
}
}
//_08077004
else
{
if (GetBattlerSide(gBattleAnimAttacker) == 0)
{
if (GetBattlerSide(gBattleAnimTarget) == 0)
}
//_08077042
else
{
}
//_0807706C
}
pan *= -1;
}
//_0807706E
}
*/
NAKED
s8 BattleAnimAdjustPanning(s8 a)
{
asm(".syntax unified\n\
push {r4,lr}\n\
lsls r0, 24\n\
lsrs r4, r0, 24\n\
bl IsContest\n\
lsls r0, 24\n\
cmp r0, 0\n\
bne _08076FDC\n\
ldr r0, _08076FD4 @ =gBattleAnimAttacker\n\
ldrb r2, [r0]\n\
lsls r0, r2, 1\n\
adds r0, r2\n\
lsls r0, 2\n\
ldr r1, _08076FD8 @ =gSharedMem + 0x17810\n\
adds r0, r1\n\
ldrb r1, [r0]\n\
movs r0, 0x10\n\
ands r0, r1\n\
cmp r0, 0\n\
beq _08076FDC\n\
adds r0, r2, 0\n\
bl GetBattlerSide\n\
lsls r0, 24\n\
movs r4, 0xC0\n\
cmp r0, 0\n\
beq _0807706E\n\
movs r4, 0x3F\n\
b _0807706E\n\
.align 2, 0\n\
_08076FD4: .4byte gBattleAnimAttacker\n\
_08076FD8: .4byte gSharedMem + 0x17810\n\
_08076FDC:\n\
bl IsContest\n\
lsls r0, 24\n\
cmp r0, 0\n\
beq _08077004\n\
ldr r0, _08076FFC @ =gBattleAnimAttacker\n\
ldr r1, _08077000 @ =gBattleAnimTarget\n\
ldrb r0, [r0]\n\
ldrb r1, [r1]\n\
cmp r0, r1\n\
bne _08077068\n\
cmp r0, 0x2\n\
bne _08077068\n\
cmp r4, 0x3F\n\
beq _0807707A\n\
b _08077068\n\
.align 2, 0\n\
_08076FFC: .4byte gBattleAnimAttacker\n\
_08077000: .4byte gBattleAnimTarget\n\
_08077004:\n\
ldr r0, _0807702C @ =gBattleAnimAttacker\n\
ldrb r0, [r0]\n\
bl GetBattlerSide\n\
lsls r0, 24\n\
cmp r0, 0\n\
bne _08077042\n\
ldr r0, _08077030 @ =gBattleAnimTarget\n\
ldrb r0, [r0]\n\
bl GetBattlerSide\n\
lsls r0, 24\n\
cmp r0, 0\n\
bne _0807706E\n\
lsls r0, r4, 24\n\
asrs r1, r0, 24\n\
cmp r1, 0x3F\n\
bne _08077034\n\
movs r4, 0xC0\n\
b _0807706E\n\
.align 2, 0\n\
_0807702C: .4byte gBattleAnimAttacker\n\
_08077030: .4byte gBattleAnimTarget\n\
_08077034:\n\
movs r0, 0x40\n\
negs r0, r0\n\
cmp r1, r0\n\
beq _0807706E\n\
negs r0, r1\n\
lsls r0, 24\n\
b _0807706C\n\
_08077042:\n\
ldr r0, _08077064 @ =gBattleAnimTarget\n\
ldrb r0, [r0]\n\
bl GetBattlerSide\n\
lsls r0, 24\n\
lsrs r0, 24\n\
cmp r0, 0x1\n\
bne _08077068\n\
lsls r0, r4, 24\n\
asrs r0, 24\n\
movs r1, 0x40\n\
negs r1, r1\n\
cmp r0, r1\n\
bne _0807706E\n\
movs r4, 0x3F\n\
b _0807706E\n\
.align 2, 0\n\
_08077064: .4byte gBattleAnimTarget\n\
_08077068:\n\
lsls r0, r4, 24\n\
negs r0, r0\n\
_0807706C:\n\
lsrs r4, r0, 24\n\
_0807706E:\n\
lsls r0, r4, 24\n\
asrs r0, 24\n\
cmp r0, 0x3F\n\
ble _0807707A\n\
movs r4, 0x3F\n\
b _08077088\n\
_0807707A:\n\
lsls r0, r4, 24\n\
asrs r0, 24\n\
movs r1, 0x40\n\
negs r1, r1\n\
cmp r0, r1\n\
bge _08077088\n\
movs r4, 0xC0\n\
_08077088:\n\
lsls r0, r4, 24\n\
asrs r0, 24\n\
pop {r4}\n\
pop {r1}\n\
bx r1\n\
.syntax divided\n");
if (pan > SOUND_PAN_TARGET)
pan = SOUND_PAN_TARGET;
else if (pan < SOUND_PAN_ATTACKER_NEG)
pan = SOUND_PAN_ATTACKER_NEG;
return pan;
}
s8 BattleAnimAdjustPanning2(s8 pan)
{
if (!IsContest() && (EWRAM_17810[gBattleAnimAttacker].unk0 & 0x10))
{
if (GetBattlerSide(gBattleAnimAttacker) != 0)
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
pan = SOUND_PAN_TARGET;
else
pan = SOUND_PAN_ATTACKER;
}
else
{
if (GetBattlerSide(gBattleAnimAttacker) != 0 || IsContest() != 0)
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER || IsContest())
pan = -pan;
}
return pan;

View File

@ -1272,18 +1272,14 @@ static void sub_81407B8(struct Sprite *sprite)
sprite->callback = sub_81407F4;
}
#ifdef NONMATCHING
// there is some weird typing going on with var0 and var1.
static void sub_81407F4(struct Sprite *sprite)
{
s16 var0, var1;
var0 = sprite->data[0] + 0x800;
var1 = sprite->data[1] + 0x680;
s16 var0 = sprite->data[0] + 0x800;
s16 var1 = sprite->data[1] + 0x680;
sprite->pos2.x -= var1 >> 8;
sprite->pos2.y += var0 >> 8;
sprite->data[0] = var0 & 0xFF;
sprite->data[1] = var1 & 0xFF;
sprite->data[0] = (sprite->data[0] + 0x800) & 0xFF;
sprite->data[1] = (sprite->data[1] + 0x680) & 0xFF;
if (sprite->pos1.y + sprite->pos2.y > 160
|| sprite->pos1.x + sprite->pos2.x < -8)
@ -1294,74 +1290,6 @@ static void sub_81407F4(struct Sprite *sprite)
UpdateOamPriorityInAllHealthboxes(1);
}
}
#else
NAKED
static void sub_81407F4(struct Sprite *sprite)
{
asm(".syntax unified\n\
push {r4,lr}\n\
adds r4, r0, 0\n\
movs r0, 0x80\n\
lsls r0, 4\n\
adds r2, r0, 0\n\
ldrh r1, [r4, 0x2E]\n\
adds r2, r1\n\
movs r0, 0xD0\n\
lsls r0, 3\n\
adds r3, r0, 0\n\
ldrh r1, [r4, 0x30]\n\
adds r3, r1\n\
lsls r1, r3, 16\n\
asrs r1, 24\n\
ldrh r0, [r4, 0x24]\n\
subs r0, r1\n\
strh r0, [r4, 0x24]\n\
lsls r0, r2, 16\n\
asrs r0, 24\n\
ldrh r1, [r4, 0x26]\n\
adds r0, r1\n\
strh r0, [r4, 0x26]\n\
movs r0, 0xFF\n\
ands r2, r0\n\
strh r2, [r4, 0x2E]\n\
ands r3, r0\n\
strh r3, [r4, 0x30]\n\
movs r2, 0x22\n\
ldrsh r0, [r4, r2]\n\
movs r2, 0x26\n\
ldrsh r1, [r4, r2]\n\
adds r0, r1\n\
cmp r0, 0xA0\n\
bgt _0814084A\n\
movs r1, 0x20\n\
ldrsh r0, [r4, r1]\n\
movs r2, 0x24\n\
ldrsh r1, [r4, r2]\n\
adds r0, r1\n\
movs r1, 0x8\n\
negs r1, r1\n\
cmp r0, r1\n\
bge _0814085E\n\
_0814084A:\n\
movs r0, 0\n\
strh r0, [r4, 0x2E]\n\
ldr r0, _08140864 @ =sub_81405C8\n\
str r0, [r4, 0x1C]\n\
ldr r1, _08140868 @ =gDoingBattleAnim\n\
movs r0, 0\n\
strb r0, [r1]\n\
movs r0, 0x1\n\
bl UpdateOamPriorityInAllHealthboxes\n\
_0814085E:\n\
pop {r4}\n\
pop {r0}\n\
bx r0\n\
.align 2, 0\n\
_08140864: .4byte sub_81405C8\n\
_08140868: .4byte gDoingBattleAnim\n\
.syntax divided\n");
}
#endif // NONMATCHING
u8 AnimateBallOpenParticles(u8 x, u8 y, u8 priority, u8 subpriority, u8 ballIndex)
{

View File

@ -1387,7 +1387,6 @@ void sub_802DA9C(u8 taskId)
gTasks[taskId].func = sub_802DB6C;
}
#ifdef NONMATCHING
void sub_802DB6C(u8 taskId)
{
if (gTasks[taskId].data[10] < 13)
@ -1396,209 +1395,49 @@ void sub_802DB6C(u8 taskId)
}
else
{
u8 r9 = gTasks[taskId].data[0];
s32 r10 = gTasks[taskId].data[1]; //s16?
u8 r7 = gTasks[taskId].data[2];
s16 r4;
u8 monId = gTasks[taskId].data[0];
s16 gainedExp = gTasks[taskId].data[1];
u8 battlerId = gTasks[taskId].data[2];
s16 newExpPoints;
r4 = sub_8045C78(r7, gHealthboxSpriteIds[r7], 1, 0);
sub_8043DFC(gHealthboxSpriteIds[r7]);
if (r4 == -1)
newExpPoints = sub_8045C78(battlerId, gHealthboxSpriteIds[battlerId], 1, 0);
sub_8043DFC(gHealthboxSpriteIds[battlerId]);
if (newExpPoints == -1)
{
struct Pokemon *pkmn;
u8 r4;
u32 sp4;
u16 r0;
u32 sp0;
u8 level;
s32 currExp;
u16 species;
s32 expOnNextLvl;
m4aSongNumStop(SE_EXP);
pkmn = &gPlayerParty[r9];
r4 = GetMonData(pkmn, MON_DATA_LEVEL);
sp4 = GetMonData(pkmn, MON_DATA_EXP);
r0 = GetMonData(pkmn, MON_DATA_SPECIES);
sp0 = gExperienceTables[gBaseStats[r0].growthRate][r4 + 1];
if (sp4 + r10 >= sp0)
{
u8 r5;
u32 asdf;
level = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL);
currExp = GetMonData(&gPlayerParty[monId], MON_DATA_EXP);
species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES);
expOnNextLvl = gExperienceTables[gBaseStats[species].growthRate][level + 1];
SetMonData(pkmn, MON_DATA_EXP, &sp0);
CalculateMonStats(pkmn);
//r10 -= sp0 - sp4;
asdf = sp0 - sp4;
//asdf = r10 - (sp0 - sp4);
r10 -= asdf;
r5 = gActiveBattler;
gActiveBattler = r7;
BtlController_EmitTwoReturnValues(1, 11, r10);
gActiveBattler = r5;
if (currExp + gainedExp >= expOnNextLvl)
{
u8 savedActiveBattler;
SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &expOnNextLvl);
CalculateMonStats(&gPlayerParty[monId]);
gainedExp -= expOnNextLvl - currExp;
savedActiveBattler = gActiveBattler;
gActiveBattler = battlerId;
BtlController_EmitTwoReturnValues(1, 11, gainedExp);
gActiveBattler = savedActiveBattler;
gTasks[taskId].func = sub_802DCB0;
}
else
{
//u32 asdf = sp4 + r10;
sp4 += r10;
SetMonData(pkmn, MON_DATA_EXP, &sp4);
gBattlerControllerFuncs[r7] = sub_802D90C;
currExp += gainedExp;
SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &currExp);
gBattlerControllerFuncs[battlerId] = sub_802D90C;
DestroyTask(taskId);
}
}
}
}
#else
NAKED
void sub_802DB6C(u8 taskId)
{
asm_unified("push {r4-r7,lr}\n\
mov r7, r10\n\
mov r6, r9\n\
mov r5, r8\n\
push {r5-r7}\n\
sub sp, 0x8\n\
lsls r0, 24\n\
lsrs r0, 24\n\
mov r8, r0\n\
ldr r1, _0802DB98 @ =gTasks\n\
lsls r0, 2\n\
add r0, r8\n\
lsls r0, 3\n\
adds r6, r0, r1\n\
ldrh r1, [r6, 0x1C]\n\
movs r2, 0x1C\n\
ldrsh r0, [r6, r2]\n\
cmp r0, 0xC\n\
bgt _0802DB9C\n\
adds r0, r1, 0x1\n\
strh r0, [r6, 0x1C]\n\
b _0802DC98\n\
.align 2, 0\n\
_0802DB98: .4byte gTasks\n\
_0802DB9C:\n\
ldrb r0, [r6, 0x8]\n\
mov r9, r0\n\
ldrh r2, [r6, 0xA]\n\
mov r10, r2\n\
ldrb r7, [r6, 0xC]\n\
ldr r5, _0802DC64 @ =gHealthboxSpriteIds\n\
adds r5, r7, r5\n\
ldrb r1, [r5]\n\
adds r0, r7, 0\n\
movs r2, 0x1\n\
movs r3, 0\n\
bl sub_8045C78\n\
adds r4, r0, 0\n\
lsls r4, 16\n\
lsrs r4, 16\n\
ldrb r0, [r5]\n\
bl sub_8043DFC\n\
lsls r4, 16\n\
asrs r4, 16\n\
movs r0, 0x1\n\
negs r0, r0\n\
cmp r4, r0\n\
bne _0802DC98\n\
movs r0, 0x21\n\
bl m4aSongNumStop\n\
movs r0, 0x64\n\
mov r1, r9\n\
muls r1, r0\n\
ldr r0, _0802DC68 @ =gPlayerParty\n\
adds r5, r1, r0\n\
adds r0, r5, 0\n\
movs r1, 0x38\n\
bl GetMonData\n\
adds r4, r0, 0\n\
lsls r4, 24\n\
lsrs r4, 24\n\
adds r0, r5, 0\n\
movs r1, 0x19\n\
bl GetMonData\n\
str r0, [sp, 0x4]\n\
adds r0, r5, 0\n\
movs r1, 0xB\n\
bl GetMonData\n\
lsls r0, 16\n\
lsrs r0, 16\n\
ldr r3, _0802DC6C @ =gExperienceTables\n\
adds r4, 0x1\n\
lsls r4, 2\n\
ldr r2, _0802DC70 @ =gBaseStats\n\
lsls r1, r0, 3\n\
subs r1, r0\n\
lsls r1, 2\n\
adds r1, r2\n\
ldrb r1, [r1, 0x13]\n\
movs r0, 0xCA\n\
lsls r0, 1\n\
muls r0, r1\n\
adds r4, r0\n\
adds r4, r3\n\
ldr r1, [r4]\n\
str r1, [sp]\n\
mov r2, r10\n\
lsls r0, r2, 16\n\
asrs r4, r0, 16\n\
ldr r0, [sp, 0x4]\n\
adds r0, r4\n\
cmp r0, r1\n\
blt _0802DC7C\n\
adds r0, r5, 0\n\
movs r1, 0x19\n\
mov r2, sp\n\
bl SetMonData\n\
adds r0, r5, 0\n\
bl CalculateMonStats\n\
ldr r2, [sp]\n\
add r0, sp, 0x4\n\
ldrh r0, [r0]\n\
subs r2, r0\n\
subs r2, r4, r2\n\
ldr r4, _0802DC74 @ =gActiveBattler\n\
ldrb r5, [r4]\n\
strb r7, [r4]\n\
lsls r2, 16\n\
lsrs r2, 16\n\
movs r0, 0x1\n\
movs r1, 0xB\n\
bl BtlController_EmitTwoReturnValues\n\
strb r5, [r4]\n\
ldr r0, _0802DC78 @ =sub_802DCB0\n\
str r0, [r6]\n\
b _0802DC98\n\
.align 2, 0\n\
_0802DC64: .4byte gHealthboxSpriteIds\n\
_0802DC68: .4byte gPlayerParty\n\
_0802DC6C: .4byte gExperienceTables\n\
_0802DC70: .4byte gBaseStats\n\
_0802DC74: .4byte gActiveBattler\n\
_0802DC78: .4byte sub_802DCB0\n\
_0802DC7C:\n\
str r0, [sp, 0x4]\n\
add r2, sp, 0x4\n\
adds r0, r5, 0\n\
movs r1, 0x19\n\
bl SetMonData\n\
ldr r1, _0802DCA8 @ =gBattlerControllerFuncs\n\
lsls r0, r7, 2\n\
adds r0, r1\n\
ldr r1, _0802DCAC @ =sub_802D90C\n\
str r1, [r0]\n\
mov r0, r8\n\
bl DestroyTask\n\
_0802DC98:\n\
add sp, 0x8\n\
pop {r3-r5}\n\
mov r8, r3\n\
mov r9, r4\n\
mov r10, r5\n\
pop {r4-r7}\n\
pop {r0}\n\
bx r0\n\
.align 2, 0\n\
_0802DCA8: .4byte gBattlerControllerFuncs\n\
_0802DCAC: .4byte sub_802D90C\n");
}
#endif
void sub_802DCB0(u8 taskId)
{

View File

@ -1382,7 +1382,7 @@ void debug_sub_8011EA0(u8);
void debug_sub_8012294(void);
void debug_sub_80123D8(u8);
void debug_sub_8012540(void);
void debug_nullsub_3(void);
void debug_ShowCurrentAnimAudioOptions(void);
void debug_sub_80125A0(void);
void debug_sub_80125E4(void);
void debug_sub_8012628(void);
@ -1482,7 +1482,7 @@ void debug_sub_80108B8(void)
debug_sub_8012294();
debug_sub_80123D8(gUnknown_Debug_030043A4 * 5);
debug_sub_8012540();
debug_nullsub_3();
debug_ShowCurrentAnimAudioOptions();
gUnknown_Debug_030043A8 = 0;
debug_sub_80125A0();
if (gUnknown_Debug_2023A76[0][0x22] == 8)
@ -1616,7 +1616,7 @@ void debug_sub_8010CAC(void)
gSaveBlock2.optionsBattleSceneOff = (r5 & 1);
gSaveBlock2.optionsSound = (r5 & 2) >> 1;
SetPokemonCryStereo(gSaveBlock2.optionsSound);
debug_nullsub_3();
debug_ShowCurrentAnimAudioOptions();
}
}
if (gMain.newKeysRaw == START_BUTTON)
@ -1694,7 +1694,7 @@ void debug_sub_8010CAC(void)
debug_sub_8011E5C();
debug_sub_8011E74();
debug_sub_8012540();
debug_nullsub_3();
debug_ShowCurrentAnimAudioOptions();
debug_sub_80123D8(gUnknown_Debug_030043A4 * 5);
break;
case 32:
@ -1702,7 +1702,7 @@ void debug_sub_8010CAC(void)
debug_sub_8011E5C();
debug_sub_8011E74();
debug_sub_8012540();
debug_nullsub_3();
debug_ShowCurrentAnimAudioOptions();
debug_sub_80123D8(gUnknown_Debug_030043A4 * 5);
break;
case 33:
@ -1755,7 +1755,7 @@ void debug_sub_8010CAC(void)
debug_sub_8011E5C();
debug_sub_8011E74();
debug_sub_8012540();
debug_nullsub_3();
debug_ShowCurrentAnimAudioOptions();
debug_sub_80123D8(gUnknown_Debug_030043A4 * 5);
break;
case 32:
@ -1763,7 +1763,7 @@ void debug_sub_8010CAC(void)
debug_sub_8011E5C();
debug_sub_8011E74();
debug_sub_8012540();
debug_nullsub_3();
debug_ShowCurrentAnimAudioOptions();
debug_sub_80123D8(gUnknown_Debug_030043A4 * 5);
break;
case 33:
@ -2218,7 +2218,12 @@ void debug_sub_8011EA0(u8 a)
case 15:
case 20:
case 25:
// TODO: check other revisions
#if (ENGLISH && REVISION == 0)
debug_sub_8010A7C(0, 8);
#else
debug_sub_8010A7C(0, 20);
#endif
Text_InitWindow(
&gUnknown_Debug_03004370,
gBattleTextBuff1,
@ -2227,6 +2232,8 @@ void debug_sub_8011EA0(u8 a)
gUnknown_Debug_821F424[a][2]);
Text_PrintWindow8002F44(&gUnknown_Debug_03004370);
ConvertIntToDecimalStringN(gBattleTextBuff1, gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a], 2, 3);
// TODO: check other revisions
#if !(ENGLISH && REVISION == 0)
Text_InitWindow(
&gUnknown_Debug_03004370,
gBattleTextBuff1,
@ -2235,6 +2242,7 @@ void debug_sub_8011EA0(u8 a)
0);
Text_PrintWindow8002F44(&gUnknown_Debug_03004370);
gBattleTextBuff1[0] = EOS;
#endif
StringAppend(gBattleTextBuff1, gSpeciesNames[gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a]]);
Text_InitWindow(
&gUnknown_Debug_03004370,
@ -2266,7 +2274,12 @@ void debug_sub_8011EA0(u8 a)
case 17:
case 22:
case 27:
// TODO: check other revisions
#if (ENGLISH && REVISION == 0)
debug_sub_8010A7C(0, 11);
#else
debug_sub_8010A7C(0, 24);
#endif
Text_InitWindow(
&gUnknown_Debug_03004370,
gBattleTextBuff1,
@ -2275,6 +2288,8 @@ void debug_sub_8011EA0(u8 a)
gUnknown_Debug_821F424[a][2]);
Text_PrintWindow8002F44(&gUnknown_Debug_03004370);
ConvertIntToDecimalStringN(gBattleTextBuff1, gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a], 2, 3);
// TODO: check other revisions
#if !(ENGLISH && REVISION == 0)
Text_InitWindow(
&gUnknown_Debug_03004370,
gBattleTextBuff1,
@ -2283,6 +2298,7 @@ void debug_sub_8011EA0(u8 a)
0);
Text_PrintWindow8002F44(&gUnknown_Debug_03004370);
gBattleTextBuff1[0] = EOS;
#endif
if (gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a] != 0)
StringAppend(gBattleTextBuff1, ItemId_GetName(gUnknown_Debug_2023A76[gUnknown_Debug_03004360][a]));
else
@ -2301,7 +2317,12 @@ void debug_sub_8011EA0(u8 a)
case 19:
case 24:
case 29:
// TODO: check other revisions
#if (ENGLISH && REVISION == 0)
debug_sub_8010A7C(0, 2);
#else
debug_sub_8010A7C(0, 4);
#endif
Text_InitWindow(
&gUnknown_Debug_03004370,
gBattleTextBuff1,
@ -2374,7 +2395,12 @@ void debug_sub_8012294(void)
if (r5 < 30)
{
// TODO: check other revisions
#if (ENGLISH && REVISION == 0)
debug_sub_8010A7C(0, 10);
#else
debug_sub_8010A7C(0, 24);
#endif
Text_InitWindow(
&gUnknown_Debug_03004370,
gBattleTextBuff1,
@ -2383,6 +2409,8 @@ void debug_sub_8012294(void)
gUnknown_Debug_821F564[gUnknown_Debug_030043A8][2]);
Text_PrintWindow8002F44(&gUnknown_Debug_03004370);
ConvertIntToDecimalStringN(gBattleTextBuff1, gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r5 / 5][gUnknown_Debug_030043A8], 2, 3);
// TODO: check other revisions
#if !(ENGLISH && REVISION == 0)
Text_InitWindow(
&gUnknown_Debug_03004370,
gBattleTextBuff1,
@ -2391,6 +2419,7 @@ void debug_sub_8012294(void)
0);
Text_PrintWindow8002F44(&gUnknown_Debug_03004370);
gBattleTextBuff1[0] = EOS;
#endif
StringAppend(gBattleTextBuff1, gMoveNames[gUnknown_Debug_2023B02[gUnknown_Debug_03004360][r5 / 5][gUnknown_Debug_030043A8]]);
Text_InitWindow(
&gUnknown_Debug_03004370,
@ -2408,7 +2437,12 @@ void debug_sub_80123D8(u8 a)
{
if (a < 30)
{
// TODO: check other revisions
#if (ENGLISH && REVISION == 0)
debug_sub_8010A7C(0, 7);
#else
debug_sub_8010A7C(0, 18);
#endif
Text_InitWindow(
&gUnknown_Debug_03004370,
gBattleTextBuff1,
@ -2424,7 +2458,12 @@ void debug_sub_80123D8(u8 a)
gUnknown_Debug_821F58C[1],
gUnknown_Debug_821F58C[2]);
Text_PrintWindow8002F44(&gUnknown_Debug_03004370);
// TODO: check other revisions
#if (ENGLISH && REVISION == 0)
debug_sub_8010A7C(0, 7);
#else
debug_sub_8010A7C(0, 18);
#endif
Text_InitWindow(
&gUnknown_Debug_03004370,
gBattleTextBuff1,
@ -2473,8 +2512,50 @@ void debug_sub_8012540(void)
Text_PrintWindow8002F44(&gUnknown_Debug_03004370);
}
void debug_nullsub_3(void)
// TODO: check other revisions
#if (ENGLISH && REVISION == 0)
extern const u8 Str_821F64D[];
extern const u8 Str_821F652[];
extern const u8 Str_821F655[];
extern const u8 Str_821F65A[];
#endif
void debug_ShowCurrentAnimAudioOptions(void)
{
// TODO: check other revisions
#if (ENGLISH && REVISION == 0)
if (gSaveBlock2.optionsBattleSceneOff)
Text_InitWindow(
&gUnknown_Debug_03004370,
Str_821F652,
418,
gUnknown_Debug_03004360 * 32 + 21,
0);
else
Text_InitWindow(
&gUnknown_Debug_03004370,
Str_821F64D,
418,
gUnknown_Debug_03004360 * 32 + 21,
0);
Text_PrintWindow8002F44(&gUnknown_Debug_03004370);
if (gSaveBlock2.optionsSound)
Text_InitWindow(
&gUnknown_Debug_03004370,
Str_821F65A,
422,
gUnknown_Debug_03004360 * 32 + 24,
0);
else
Text_InitWindow(
&gUnknown_Debug_03004370,
Str_821F655,
422,
gUnknown_Debug_03004360 * 32 + 24,
0);
Text_PrintWindow8002F44(&gUnknown_Debug_03004370);
#endif
}
extern const u32 gUnknown_Debug_821F680[][0x23];

File diff suppressed because it is too large Load Diff

View File

@ -3277,7 +3277,7 @@ void debug_sub_80524BC(void)
}
// Partially fixes the clipping on longer names.
#if DEBUG_TRANSLATE && DEBUG
#if DEBUG_FIX
# define BLENDER_DEBUG_BERRY_LEN 12
#else
# define BLENDER_DEBUG_BERRY_LEN 6

View File

@ -101,40 +101,18 @@ static void ContestPaintingPrintCaption(u8 arg0, u8 arg1);
static void ContestPaintingInitBG(void);
static void ContestPaintingInitVars(u8 arg0);
static void VBlankCB_ContestPainting(void);
void sub_8106B90(); //should be static
static void sub_8106B90(u8 *a, u16 *b, u16 *c);
static void sub_8107090(u8 arg0, u8 arg1);
NAKED
void sub_8106630(u32 arg0)
void sub_8106630(u32 contestWinnerId)
{
asm(".syntax unified\n\
push {r4-r7,lr}\n\
ldr r2, _0810665C @ =gSharedMem + 0x15DE0\n\
subs r4, r2, 0x2\n\
subs r5, r2, 0x1\n\
ldr r3, _08106660 @ =gSaveBlock1\n\
subs r0, 0x1\n\
lsls r1, r0, 5\n\
adds r1, r3\n\
ldr r3, _08106664 @ =0x00002dfc\n\
adds r1, r3\n\
ldm r1!, {r3,r6,r7}\n\
stm r2!, {r3,r6,r7}\n\
ldm r1!, {r3,r6,r7}\n\
stm r2!, {r3,r6,r7}\n\
ldm r1!, {r6,r7}\n\
stm r2!, {r6,r7}\n\
strb r0, [r4]\n\
movs r0, 0\n\
strb r0, [r5]\n\
pop {r4-r7}\n\
pop {r0}\n\
bx r0\n\
.align 2, 0\n\
_0810665C: .4byte gSharedMem + 0x15DE0\n\
_08106660: .4byte gSaveBlock1\n\
_08106664: .4byte 0x00002dfc\n\
.syntax divided\n");
// probably fakematching
struct ContestWinner *ptr1 = (struct ContestWinner*)&ewram15DE0; // TODO: resolve messy struct duplicates
u8 *ptr2 = (u8*)&ewram15DDE;
u8 *ptr3 = (u8*)&ewram15DDF;
*ptr1 = gSaveBlock1.contestWinners[contestWinnerId - 1];
*ptr2 = contestWinnerId - 1;
*ptr3 = 0;
}
void CB2_ContestPainting(void)
@ -346,7 +324,7 @@ static void sub_8106AC4(u16 species, u8 arg1)
species,
(u32)gUnknown_03005E8C->personality
);
sub_8106B90(gUnknown_081FAF4C[1], gUnknown_03005E90, gUnknown_03005E10);
sub_8106B90((u8*)gUnknown_081FAF4C[1], (u16*)gUnknown_03005E90, (u16*)gUnknown_03005E10);
}
else
{
@ -359,18 +337,26 @@ static void sub_8106AC4(u16 species, u8 arg1)
species,
(u32)gUnknown_03005E8C->personality
);
sub_8106B90(gUnknown_081FAF4C[0], gUnknown_03005E90, gUnknown_03005E10);
sub_8106B90((u8*)gUnknown_081FAF4C[0], (u16*)gUnknown_03005E90, (u16*)gUnknown_03005E10);
}
}
#ifdef NONMATCHING
void sub_8106B90(u8 a[][8][8][4], u16 b[], u16 c[][8][8][8])
static void sub_8106B90(u8 *a, u16 *b, u16 *c)
{
u16 i;
u16 j;
u16 k;
u16 l;
/*
Raw arithmetics are required to match this function.
At least it's the first known way to match it. The extreme
sensitivity of this match and Game Freak proving to not have
been a fan of C's advanced array features, preferring to
calculate dimensions manually (as seen in other functions),
tell that it may have been this way in the original code.
*/
for (i = 0; i < 8; i++)
{
for (j = 0; j < 8; j++)
@ -379,128 +365,38 @@ void sub_8106B90(u8 a[][8][8][4], u16 b[], u16 c[][8][8][8])
{
for (l = 0; l < 8; l++)
{
//u8 *arr = a[i][j][k];
//u8 r1 = arr[l / 2];
u8 r1 = a[i][j][k][l / 2];
/*
Parenthesis/group hack absolutely required to match regalloc. Remove any
unneeded parentheses and the function gets thrown off. See the comments
in CopyWallpaperTilemap for documentation on a similar behavior.
*/
u8 temp = ((u8*)a + ((((i << 3) + j) << 5) + (k << 2) + (l >> 1)))[0];
/*
The shifts have to be there to match r0 and r2's order in one instruction:
add r5, r2, r0
This also makes agbcc's expression order parsing even more super sensitive
and obscene when it comes to parentheses affecting regalloc regardless if
unnecessary, requiring j must be placed in the front to match, or else
regalloc breaks again and does this a few instructions above:
add r0, r3, r7 <- regswap
*/
if (l & 1)
r1 /= 16;
temp /= 16;
else
r1 %= 16;
//_08106BEA
if (r1 == 0)
c[i][k][j][l] = 0x8000;
temp %= 16;
// Same order as above needs to be written here, or else this happens:
// add r0, r7, r1 <- regswap
if (temp == 0)
((u16*)c + (((i << 3) + k) << 6) + ((j << 3)+l))[0] = 0x8000;
else
c[i][k][j][l] = b[r1];
((u16*)c + (((i << 3) + k) << 6) + ((j << 3)+l))[0] = b[temp];
}
}
}
}
}
#else
NAKED
void sub_8106B90()
{
asm(".syntax unified\n\
push {r4-r7,lr}\n\
mov r7, r10\n\
mov r6, r9\n\
mov r5, r8\n\
push {r5-r7}\n\
sub sp, 0xC\n\
mov r10, r0\n\
mov r9, r1\n\
str r2, [sp]\n\
movs r0, 0\n\
_08106BA4:\n\
movs r3, 0\n\
adds r1, r0, 0x1\n\
str r1, [sp, 0x4]\n\
lsls r0, 3\n\
str r0, [sp, 0x8]\n\
_08106BAE:\n\
movs r1, 0\n\
adds r2, r3, 0x1\n\
mov r8, r2\n\
ldr r7, [sp, 0x8]\n\
adds r0, r7, r3\n\
lsls r0, 5\n\
mov r12, r0\n\
lsls r4, r3, 3\n\
_08106BBE:\n\
movs r3, 0\n\
lsls r0, r1, 2\n\
adds r6, r1, 0x1\n\
mov r2, r12\n\
adds r5, r2, r0\n\
ldr r7, [sp, 0x8]\n\
adds r0, r7, r1\n\
lsls r0, 7\n\
ldr r1, [sp]\n\
adds r2, r0, r1\n\
_08106BD2:\n\
lsrs r0, r3, 1\n\
adds r0, r5, r0\n\
add r0, r10\n\
ldrb r1, [r0]\n\
movs r0, 0x1\n\
ands r0, r3\n\
cmp r0, 0\n\
beq _08106BE6\n\
lsrs r1, 4\n\
b _08106BEA\n\
_08106BE6:\n\
movs r0, 0xF\n\
ands r1, r0\n\
_08106BEA:\n\
cmp r1, 0\n\
bne _08106BFC\n\
adds r0, r4, r3\n\
lsls r0, 1\n\
adds r0, r2\n\
movs r7, 0x80\n\
lsls r7, 8\n\
adds r1, r7, 0\n\
b _08106C08\n\
_08106BFC:\n\
adds r0, r4, r3\n\
lsls r0, 1\n\
adds r0, r2\n\
lsls r1, 1\n\
add r1, r9\n\
ldrh r1, [r1]\n\
_08106C08:\n\
strh r1, [r0]\n\
adds r0, r3, 0x1\n\
lsls r0, 16\n\
lsrs r3, r0, 16\n\
cmp r3, 0x7\n\
bls _08106BD2\n\
lsls r0, r6, 16\n\
lsrs r1, r0, 16\n\
cmp r1, 0x7\n\
bls _08106BBE\n\
mov r1, r8\n\
lsls r0, r1, 16\n\
lsrs r3, r0, 16\n\
cmp r3, 0x7\n\
bls _08106BAE\n\
ldr r2, [sp, 0x4]\n\
lsls r0, r2, 16\n\
lsrs r0, 16\n\
cmp r0, 0x7\n\
bls _08106BA4\n\
add sp, 0xC\n\
pop {r3-r5}\n\
mov r8, r3\n\
mov r9, r4\n\
mov r10, r5\n\
pop {r4-r7}\n\
pop {r0}\n\
bx r0\n\
.syntax divided\n");
}
#endif
static void sub_8106C40(u8 arg0, u8 arg1)
{

View File

@ -10,10 +10,10 @@ const u8 gMonBackPic_CircledQuestionMark[] = INCBIN_U8("graphics/pokemon/circled
const u16 gMonPalette_CircledQuestionMark[] = INCBIN_U16("graphics/pokemon/circled_question_mark/normal.gbapal.lz");
const u16 gMonShinyPalette_CircledQuestionMark[] = INCBIN_U16("graphics/pokemon/circled_question_mark/shiny.gbapal.lz");
// The test menu debug battle tileset. This uses the old Crystal charmap and
// rendering method (it uses tiles instead of text).
// Oddly, the English version is in Japanese and the German version is in English.
#if DEBUG_TRANSLATE || GERMAN
// The test menu debug battle tileset. This uses the old Crystal
// charmap and rendering method (it uses tiles instead of text).
// The non-English releases use translated graphics.
#if DEBUG_FIX || !ENGLISH
const u8 gDebugBattleCharmap_Gfx_lz[] = INCBIN_U8("graphics/debug/debug_battle_charmap_en.4bpp.lz");
const u8 gDebugBattleCharmap_Tilemap_lz[] = INCBIN_U8("graphics/debug/debug_battle_charmap_en.bin.lz");
const u8 gDebugBattleCharmap_Pal_lz[] = INCBIN_U8("graphics/debug/debug_battle_charmap_en.gbapal.lz");

View File

@ -42,10 +42,10 @@ const u8 Text_39B28B[] = _("10000 steps");
const u8 Text_39B297[] = _("MOVE TUTOR");
const u8 Text_39B2A2[] = _("Breed an egg");
const u8 Text_39B2AF[] = _("Long name");
#ifdef GERMAN
const u8 Text_39B2B9[] = _("Delete {POKEBLOCK}");
#if (ENGLISH && !DEBUG_FIX)
const u8 Text_39B2B9[] = _("ポロックけす");
#else
const u8 Text_39B2B9[] = DTR("ポロックけす", "Delete {POKEBLOCK}");
const u8 Text_39B2B9[] = _("Delete {POKEBLOCK}");
#endif
const struct MenuAction gMoriDebugMenuActions[] =

View File

@ -100,7 +100,9 @@ static bool8 TopMenu_HandleJoypad(void)
if (gMain.newKeys & A_BUTTON)
{
MenuFunc func = sNakamuraTopMenuActions[Menu_GetCursorPos()].func;
#if !(ENGLISH && REVISION == 0)
Menu_DestroyCursor();
#endif
return func();
}
@ -739,6 +741,17 @@ static bool8 GiveAllDecorations(void)
// FISHING POINTS (Feebas)
// =======================================================
#if (ENGLISH && REVISION == 0)
static const u8 Str_843E58D[] = _(
"つりばしょ R119\n"
" Y1\n"
" Y2\n"
" Y3\n"
"エンカウントばしょ\n"
"\n"
"\n"
"じぶんのまえ");
#else
static const u8 Str_843E58D[] = _(
"Fishing location R119\n"
" Y1\n"
@ -748,6 +761,7 @@ static const u8 Str_843E58D[] = _(
"\n"
"\n"
"front of you");
#endif
static u16 FishingPoints_CountFishingTilesInMapThird(u8 a0)
{
@ -974,7 +988,13 @@ static void NakaGenderTest_AdjustLevel(u8 i, s8 dirn)
if (sNakaGenderTestData[i].level < 1)
sNakaGenderTestData[i].level = 100;
SetMonData(gPlayerParty + i, MON_DATA_EXP, gExperienceTables[gBaseStats[sNakaGenderTestData[i].species].growthRate] + sNakaGenderTestData[i].level);
// TODO: check other revisions
#if (ENGLISH && REVISION == 0)
CalculateMonStats(gPlayerParty + i);
#else
// Same function, but without the Shedninja specific code.
Nakamura_NakaGenderTest_RecalcStats(gPlayerParty + i);
#endif
}
}
@ -1266,6 +1286,7 @@ static u8 SetPokeblock_CalcColor(u8 * dest, struct Pokeblock * pokeblock)
}
}
if (pkblk[firstNonzeroFlavor] >= pkblk[lastNonzeroFlavor])
// Suspiciously looks like a temp could've been here.
lastNonzeroFlavor = firstNonzeroFlavor;
if (lastNonzeroFlavor == 0)

View File

@ -104,8 +104,13 @@ bool8 debug_sub_808F414(void)
}
}
#if (ENGLISH && REVISION == 0)
const u8 gUnknown_Debug_083C4980[] = _("ひみつがたを すぐみれるように ひだりキーで\n"
"データタイプを へんこうしますか? きりかえ");
#else
const u8 gUnknown_Debug_083C4980[] = _("Want to change data type{CLEAR_TO 143}Press Left\n"
"to see secret type now{CLEAR_TO 143}to switch");
#endif
const u8 gUnknown_Debug_083C49CA[] = _("Choose the TV data you wish to\n"
"create to check a transmission。");
@ -470,6 +475,11 @@ void debug_sub_808FA88(u8 a0, u8 a1)
u8 leadMonIndex = GetLeadMonIndex();
u8 channel;
// This is garbage.
#define GF_ACCESS(x) ((struct x*)(&(gSaveBlock1.tvShows[a0])))
#define TERU_ACCESS(x) show->x
#define DECLARE_TERU_POINTER TVShow * show = gSaveBlock1.tvShows + a0
gSaveBlock1.tvShows[a0].common.kind = a1;
gSaveBlock1.tvShows[a0].common.active = TRUE;
for (i = 0; i < 0x22; i++)
@ -480,34 +490,31 @@ void debug_sub_808FA88(u8 a0, u8 a1)
{
case 2:
case 4:
sub_80BE160(gSaveBlock1.tvShows + a0);
sub_80BE160(&gSaveBlock1.tvShows[a0]);
break;
case 3:
sub_80BE138(gSaveBlock1.tvShows + a0);
sub_80BE138(&gSaveBlock1.tvShows[a0]);
break;
}
#if (ENGLISH && REVISION == 0)
switch (a1)
{
case TVSHOW_FAN_CLUB_LETTER:
case TVSHOW_RECENT_HAPPENINGS:
{
TVShow * show = gSaveBlock1.tvShows + a0;
show->fanclubLetter.species = SPECIES_BULBASAUR;
StringCopy(gSaveBlock1.tvShows[a0].fanclubLetter.playerName, gSaveBlock2.playerName);
show->fanclubLetter.language = GAME_LANGUAGE;
GF_ACCESS(TVShowFanClubLetter)->species = SPECIES_BULBASAUR;
StringCopy(GF_ACCESS(TVShowFanClubLetter)->playerName, gSaveBlock2.playerName);
GF_ACCESS(TVShowFanClubLetter)->language = GAME_LANGUAGE;
break;
}
case TVSHOW_PKMN_FAN_CLUB_OPINIONS:
{
TVShow * show = gSaveBlock1.tvShows + a0;
show->fanclubOpinions.var02 = 1;
StringCopy(gSaveBlock1.tvShows[a0].fanclubOpinions.playerName, gSaveBlock2.playerName);
GetMonData(gPlayerParty + leadMonIndex, MON_DATA_NICKNAME, gSaveBlock1.tvShows[a0].fanclubOpinions.var10);
show->fanclubOpinions.language = GAME_LANGUAGE;
show->fanclubOpinions.var0E = GetMonData(gPlayerParty + leadMonIndex, MON_DATA_LANGUAGE);
GF_ACCESS(TVShowFanclubOpinions)->var02 = 1;
StringCopy(GF_ACCESS(TVShowFanclubOpinions)->playerName, gSaveBlock2.playerName);
GetMonData(&gPlayerParty[leadMonIndex], MON_DATA_NICKNAME, GF_ACCESS(TVShowFanclubOpinions)->var10);
GF_ACCESS(TVShowFanclubOpinions)->language = GAME_LANGUAGE;
GF_ACCESS(TVShowFanclubOpinions)->var0E = GetMonData(&gPlayerParty[leadMonIndex], MON_DATA_LANGUAGE);
break;
}
case TVSHOW_UNKN_SHOWTYPE_04:
@ -516,120 +523,222 @@ void debug_sub_808FA88(u8 a0, u8 a1)
}
case TVSHOW_NAME_RATER_SHOW:
{
u16 species = GetMonData(gPlayerParty + leadMonIndex, MON_DATA_SPECIES);
TVShow * show = gSaveBlock1.tvShows + a0;
show->nameRaterShow.species = species;
show->nameRaterShow.var1C = 1;
StringCopy(gSaveBlock1.tvShows[a0].nameRaterShow.trainerName, gSaveBlock2.playerName);
GetMonData(gPlayerParty + leadMonIndex, MON_DATA_NICKNAME, gSaveBlock1.tvShows[a0].nameRaterShow.pokemonName);
show->nameRaterShow.language = GAME_LANGUAGE;
show->nameRaterShow.pokemonNameLanguage = GetMonData(gPlayerParty + leadMonIndex, MON_DATA_LANGUAGE);
GF_ACCESS(TVShowNameRaterShow)->species = GetMonData(&gPlayerParty[leadMonIndex], MON_DATA_SPECIES);
GF_ACCESS(TVShowNameRaterShow)->var1C = 1;
StringCopy(GF_ACCESS(TVShowNameRaterShow)->trainerName, gSaveBlock2.playerName);
GetMonData(&gPlayerParty[leadMonIndex], MON_DATA_NICKNAME, GF_ACCESS(TVShowNameRaterShow)->pokemonName);
GF_ACCESS(TVShowNameRaterShow)->language = GAME_LANGUAGE;
GF_ACCESS(TVShowNameRaterShow)->pokemonNameLanguage = GetMonData(&gPlayerParty[leadMonIndex], MON_DATA_LANGUAGE);
break;
}
case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE:
{
TVShow * show = gSaveBlock1.tvShows + a0;
show->bravoTrainer.species = SPECIES_BULBASAUR;
StringCopy(gSaveBlock1.tvShows[a0].bravoTrainer.playerName, gSaveBlock2.playerName);
GetMonData(gPlayerParty + leadMonIndex, MON_DATA_NICKNAME, gSaveBlock1.tvShows[a0].bravoTrainer.pokemonNickname);
show->bravoTrainer.language = GAME_LANGUAGE;
show->bravoTrainer.var1f = GetMonData(gPlayerParty + leadMonIndex, MON_DATA_LANGUAGE);
GF_ACCESS(TVShowBravoTrainerPokemonProfiles)->species = SPECIES_BULBASAUR;
StringCopy(GF_ACCESS(TVShowBravoTrainerPokemonProfiles)->playerName, gSaveBlock2.playerName);
GetMonData(&gPlayerParty[leadMonIndex], MON_DATA_NICKNAME, GF_ACCESS(TVShowBravoTrainerPokemonProfiles)->pokemonNickname);
GF_ACCESS(TVShowBravoTrainerPokemonProfiles)->language = GAME_LANGUAGE;
GF_ACCESS(TVShowBravoTrainerPokemonProfiles)->var1f = GetMonData(&gPlayerParty[leadMonIndex], MON_DATA_LANGUAGE);
break;
}
case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE:
{
TVShow * show = gSaveBlock1.tvShows + a0;
show->bravoTrainerTower.species = SPECIES_BULBASAUR;
show->bravoTrainerTower.defeatedSpecies = SPECIES_BULBASAUR;
StringCopy(gSaveBlock1.tvShows[a0].bravoTrainerTower.trainerName, gSaveBlock2.playerName);
StringCopy(gSaveBlock1.tvShows[a0].bravoTrainerTower.enemyTrainerName, gSaveBlock2.playerName);
show->bravoTrainerTower.language = GAME_LANGUAGE;
GF_ACCESS(TVShowBravoTrainerBattleTowerSpotlight)->species = SPECIES_BULBASAUR;
GF_ACCESS(TVShowBravoTrainerBattleTowerSpotlight)->defeatedSpecies = SPECIES_BULBASAUR;
StringCopy(GF_ACCESS(TVShowBravoTrainerBattleTowerSpotlight)->trainerName, gSaveBlock2.playerName);
StringCopy(GF_ACCESS(TVShowBravoTrainerBattleTowerSpotlight)->enemyTrainerName, gSaveBlock2.playerName);
GF_ACCESS(TVShowBravoTrainerBattleTowerSpotlight)->language = GAME_LANGUAGE;
break;
}
case TVSHOW_MASS_OUTBREAK:
{
TVShow * show = gSaveBlock1.tvShows + a0;
show->massOutbreak.species = SPECIES_BULBASAUR;
show->massOutbreak.daysLeft = 1;
GF_ACCESS(TVShowMassOutbreak)->species = SPECIES_BULBASAUR;
GF_ACCESS(TVShowMassOutbreak)->daysLeft = 1;
break;
}
case TVSHOW_POKEMON_TODAY_CAUGHT:
{
TVShow * show = gSaveBlock1.tvShows + a0;
u8 gUnknown_Debug_083C4C64[] = _("TERUKUN");
u8 gUnknown_Debug_083C4C6C[] = _("TERUTERUDA");
show->pokemonToday.var12 = 255;
StringCopy(show->pokemonToday.playerName, gUnknown_Debug_083C4C64);
StringCopy(show->pokemonToday.nickname, gUnknown_Debug_083C4C6C);
show->pokemonToday.ball = ITEM_PREMIER_BALL;
show->pokemonToday.species = SPECIES_WIGGLYTUFF;
show->pokemonToday.language = GAME_LANGUAGE;
show->pokemonToday.language2 = GAME_LANGUAGE;
GF_ACCESS(TVShowPokemonToday)->species = SPECIES_BULBASAUR;
StringCopy(GF_ACCESS(TVShowPokemonToday)->playerName, gSaveBlock2.playerName);
GetMonData(&gPlayerParty[leadMonIndex], MON_DATA_NICKNAME, GF_ACCESS(TVShowPokemonToday)->nickname);
GF_ACCESS(TVShowPokemonToday)->language = GAME_LANGUAGE;
GF_ACCESS(TVShowPokemonToday)->language2 = GetMonData(&gPlayerParty[leadMonIndex], MON_DATA_LANGUAGE);
break;
}
case TVSHOW_SMART_SHOPPER:
{
TVShow * show = gSaveBlock1.tvShows + a0;
u8 gUnknown_Debug_083C4C64[] = _("TERUKUN");
int ii;
for (ii = 0; ii < 3; ii++)
show->smartshopperShow.itemAmounts[ii] = 254;
show->smartshopperShow.priceReduced = TRUE;
show->smartshopperShow.shopLocation = 40;
for (ii = 0; ii < 3; ii++)
show->smartshopperShow.itemIds[ii] = ITEM_ENERGY_POWDER;
StringCopy(show->smartshopperShow.playerName, gUnknown_Debug_083C4C64);
show->smartshopperShow.language = GAME_LANGUAGE;
StringCopy(GF_ACCESS(TVShowSmartShopper)->playerName, gSaveBlock2.playerName);
GF_ACCESS(TVShowSmartShopper)->language = GAME_LANGUAGE;
break;
}
case TVSHOW_POKEMON_TODAY_FAILED:
{
TVShow * show = gSaveBlock1.tvShows + a0;
u8 gUnknown_Debug_083C4C64[] = _("TERUKUN");
show->pokemonTodayFailed.species = SPECIES_WIGGLYTUFF;
show->pokemonTodayFailed.species2 = SPECIES_WIGGLYTUFF;
show->pokemonTodayFailed.var12 = 3;
show->pokemonTodayFailed.var10 = 0xff;
show->pokemonTodayFailed.var11 = 1;
StringCopy(show->pokemonTodayFailed.playerName, gUnknown_Debug_083C4C64);
show->pokemonTodayFailed.language = GAME_LANGUAGE;
GF_ACCESS(TVShowPokemonTodayFailed)->species = SPECIES_BULBASAUR;
GF_ACCESS(TVShowPokemonTodayFailed)->species2 = SPECIES_BULBASAUR;
StringCopy(GF_ACCESS(TVShowPokemonTodayFailed)->playerName, gSaveBlock2.playerName);
GF_ACCESS(TVShowPokemonTodayFailed)->language = GAME_LANGUAGE;
break;
}
case TVSHOW_FISHING_ADVICE:
{
TVShow * show = gSaveBlock1.tvShows + a0;
u8 gUnknown_Debug_083C4C64[] = _("TERUKUN");
show->pokemonAngler.var02 = 0xff;
show->pokemonAngler.var03 = 0;
show->pokemonAngler.var04 = 40;
StringCopy(show->pokemonAngler.playerName, gUnknown_Debug_083C4C64);
show->pokemonAngler.language = GAME_LANGUAGE;
GF_ACCESS(TVShowPokemonAngler)->var04 = SPECIES_BULBASAUR;
StringCopy(GF_ACCESS(TVShowPokemonAngler)->playerName, gSaveBlock2.playerName);
GF_ACCESS(TVShowPokemonAngler)->language = GAME_LANGUAGE;
break;
}
case TVSHOW_WORLD_OF_MASTERS:
{
TVShow * show = gSaveBlock1.tvShows + a0;
u8 gUnknown_Debug_083C4C64[] = _("TERUKUN");
show->worldOfMasters.var02 = 0xffff;
show->worldOfMasters.var06 = 0xffff;
show->worldOfMasters.var04 = 40;
show->worldOfMasters.var08 = 40;
show->worldOfMasters.var0a = 3;
StringCopy(show->worldOfMasters.playerName, gUnknown_Debug_083C4C64);
show->worldOfMasters.language = GAME_LANGUAGE;
GF_ACCESS(TVShowWorldOfMasters)->var04 = SPECIES_BULBASAUR;
GF_ACCESS(TVShowWorldOfMasters)->var08 = SPECIES_BULBASAUR;
StringCopy(GF_ACCESS(TVShowWorldOfMasters)->playerName, gSaveBlock2.playerName);
GF_ACCESS(TVShowWorldOfMasters)->language = GAME_LANGUAGE;
break;
}
}
#else
// Murakawa must have really hated working with GF code. He devised his own, less complicated
// access method after US rev0. Also, this iteration of the code has his self inserts: TERUKUN,
// TERU, and TERUDA. Who all love Wigglytuff.
switch (a1)
{
case TVSHOW_FAN_CLUB_LETTER:
case TVSHOW_RECENT_HAPPENINGS:
{
DECLARE_TERU_POINTER;
GF_ACCESS(TVShowFanClubLetter)->species = SPECIES_BULBASAUR; // Yet he didn't change Game Freak's lines.
StringCopy(GF_ACCESS(TVShowFanClubLetter)->playerName, gSaveBlock2.playerName);
TERU_ACCESS(fanclubLetter).language = GAME_LANGUAGE;
break;
}
case TVSHOW_PKMN_FAN_CLUB_OPINIONS:
{
DECLARE_TERU_POINTER;
GF_ACCESS(TVShowFanclubOpinions)->var02 = 1;
StringCopy(GF_ACCESS(TVShowFanclubOpinions)->playerName, gSaveBlock2.playerName);
GetMonData(&gPlayerParty[leadMonIndex], MON_DATA_NICKNAME, GF_ACCESS(TVShowFanclubOpinions)->var10);
TERU_ACCESS(fanclubOpinions).language = GAME_LANGUAGE;
TERU_ACCESS(fanclubOpinions).var0E = GetMonData(&gPlayerParty[leadMonIndex], MON_DATA_LANGUAGE);
break;
}
case TVSHOW_UNKN_SHOWTYPE_04:
{
break;
}
case TVSHOW_NAME_RATER_SHOW:
{
u16 species = GetMonData(&gPlayerParty[leadMonIndex], MON_DATA_SPECIES);
DECLARE_TERU_POINTER;
GF_ACCESS(TVShowNameRaterShow)->species = species;
GF_ACCESS(TVShowNameRaterShow)->var1C = 1;
StringCopy(GF_ACCESS(TVShowNameRaterShow)->trainerName, gSaveBlock2.playerName);
GetMonData(&gPlayerParty[leadMonIndex], MON_DATA_NICKNAME, GF_ACCESS(TVShowNameRaterShow)->pokemonName);
TERU_ACCESS(nameRaterShow).language = GAME_LANGUAGE;
TERU_ACCESS(nameRaterShow).pokemonNameLanguage = GetMonData(&gPlayerParty[leadMonIndex], MON_DATA_LANGUAGE);
break;
}
case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE:
{
DECLARE_TERU_POINTER;
GF_ACCESS(TVShowBravoTrainerPokemonProfiles)->species = SPECIES_BULBASAUR;
StringCopy(GF_ACCESS(TVShowBravoTrainerPokemonProfiles)->playerName, gSaveBlock2.playerName);
GetMonData(&gPlayerParty[leadMonIndex], MON_DATA_NICKNAME, GF_ACCESS(TVShowBravoTrainerPokemonProfiles)->pokemonNickname);
TERU_ACCESS(bravoTrainer).language = GAME_LANGUAGE;
TERU_ACCESS(bravoTrainer).var1f = GetMonData(&gPlayerParty[leadMonIndex], MON_DATA_LANGUAGE);
break;
}
case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE:
{
DECLARE_TERU_POINTER;
GF_ACCESS(TVShowBravoTrainerBattleTowerSpotlight)->species = SPECIES_BULBASAUR;
GF_ACCESS(TVShowBravoTrainerBattleTowerSpotlight)->defeatedSpecies = SPECIES_BULBASAUR;
StringCopy(GF_ACCESS(TVShowBravoTrainerBattleTowerSpotlight)->trainerName, gSaveBlock2.playerName);
StringCopy(GF_ACCESS(TVShowBravoTrainerBattleTowerSpotlight)->enemyTrainerName, gSaveBlock2.playerName);
TERU_ACCESS(bravoTrainerTower).language = GAME_LANGUAGE;
break;
}
case TVSHOW_MASS_OUTBREAK:
{
GF_ACCESS(TVShowMassOutbreak)->species = SPECIES_BULBASAUR;
GF_ACCESS(TVShowMassOutbreak)->daysLeft = 1;
break;
}
case TVSHOW_POKEMON_TODAY_CAUGHT:
{
DECLARE_TERU_POINTER;
u8 gUnknown_Debug_083C4C64[] = _("TERUKUN");
u8 gUnknown_Debug_083C4C6C[] = _("TERUTERUDA");
TERU_ACCESS(pokemonToday).var12 = 255;
StringCopy(TERU_ACCESS(pokemonToday).playerName, gUnknown_Debug_083C4C64);
StringCopy(TERU_ACCESS(pokemonToday).nickname, gUnknown_Debug_083C4C6C);
TERU_ACCESS(pokemonToday).ball = ITEM_PREMIER_BALL;
TERU_ACCESS(pokemonToday).species = SPECIES_WIGGLYTUFF;
TERU_ACCESS(pokemonToday).language = GAME_LANGUAGE;
TERU_ACCESS(pokemonToday).language2 = GAME_LANGUAGE;
break;
}
case TVSHOW_SMART_SHOPPER:
{
DECLARE_TERU_POINTER;
u8 gUnknown_Debug_083C4C64[] = _("TERUKUN");
int ii;
for (ii = 0; ii < 3; ii++)
TERU_ACCESS(smartshopperShow).itemAmounts[ii] = 254;
TERU_ACCESS(smartshopperShow).priceReduced = TRUE;
TERU_ACCESS(smartshopperShow).shopLocation = 40;
for (ii = 0; ii < 3; ii++)
TERU_ACCESS(smartshopperShow).itemIds[ii] = ITEM_ENERGY_POWDER;
StringCopy(TERU_ACCESS(smartshopperShow).playerName, gUnknown_Debug_083C4C64);
TERU_ACCESS(smartshopperShow).language = GAME_LANGUAGE;
break;
}
case TVSHOW_POKEMON_TODAY_FAILED:
{
DECLARE_TERU_POINTER;
u8 gUnknown_Debug_083C4C64[] = _("TERUKUN");
TERU_ACCESS(pokemonTodayFailed).species = SPECIES_WIGGLYTUFF;
TERU_ACCESS(pokemonTodayFailed).species2 = SPECIES_WIGGLYTUFF;
TERU_ACCESS(pokemonTodayFailed).var12 = 3;
TERU_ACCESS(pokemonTodayFailed).var10 = 0xff;
TERU_ACCESS(pokemonTodayFailed).var11 = 1;
StringCopy(TERU_ACCESS(pokemonTodayFailed).playerName, gUnknown_Debug_083C4C64);
TERU_ACCESS(pokemonTodayFailed).language = GAME_LANGUAGE;
break;
}
case TVSHOW_FISHING_ADVICE:
{
DECLARE_TERU_POINTER;
u8 gUnknown_Debug_083C4C64[] = _("TERUKUN");
TERU_ACCESS(pokemonAngler).var02 = 0xff;
TERU_ACCESS(pokemonAngler).var03 = 0;
TERU_ACCESS(pokemonAngler).var04 = 40;
StringCopy(TERU_ACCESS(pokemonAngler).playerName, gUnknown_Debug_083C4C64);
TERU_ACCESS(pokemonAngler).language = GAME_LANGUAGE;
break;
}
case TVSHOW_WORLD_OF_MASTERS:
{
DECLARE_TERU_POINTER;
u8 gUnknown_Debug_083C4C64[] = _("TERUKUN");
TERU_ACCESS(worldOfMasters).var02 = 0xffff;
TERU_ACCESS(worldOfMasters).var06 = 0xffff;
TERU_ACCESS(worldOfMasters).var04 = 40;
TERU_ACCESS(worldOfMasters).var08 = 40;
TERU_ACCESS(worldOfMasters).var0a = 3;
StringCopy(TERU_ACCESS(worldOfMasters).playerName, gUnknown_Debug_083C4C64);
TERU_ACCESS(worldOfMasters).language = GAME_LANGUAGE;
break;
}
}
#endif
}
bool8 debug_sub_808FEBC(void)

View File

@ -51,7 +51,8 @@ extern void Debug_SetUpFieldMove_Cut(void);
extern void Debug_SetUpFieldMove_SecretPower(void);
void debug_sub_8076BB4(u8);
void debug_sub_8077CF4(u8 x, u8 y);
void DebugMenu_DisplayBuildDate(u8 x, u8 y);
void DebugMenu_DisplayContinuousDate(u8 x, u8 y);
u8 DebugMenu_807706C(void);
u8 DebugMenu_807709C(void);
void DebugMenu_807719C(void);
@ -133,7 +134,9 @@ u8 DebugMenu_EndSequenceDemo(void);
u8 DebugMenu_RandomNumberTest(void);
u8 DebugMenu_MeTooBackupMan(void);
u8 DebugMenu_OpenMurakawa(void);
#if !(ENGLISH && REVISION == 0)
u8 DebugMenu_OpenKiwa(void);
#endif
u8 DebugMenu_8076CBC(void);
u8 DebugMenu_8076CC0(void);
u8 DebugMenu_8076CD4(void);
@ -204,7 +207,9 @@ const u8 Str_839B972[] = _("End sequence demo");
const u8 Str_839B984[] = _("Random number test");
const u8 Str_839B997[] = _("Me-too BackupMan");
const u8 Str_839B9A8[] = _("MURAKAWA");
#if !(ENGLISH && REVISION == 0)
const u8 Str_839B9B1[] = _("KINA(FONT)");
#endif
const struct MenuAction gDebug0x839B9BC[] =
{
@ -260,18 +265,34 @@ const struct MenuAction gDebug0x839B9BC[] =
{ Str_839B984, DebugMenu_RandomNumberTest },
{ Str_839B997, DebugMenu_MeTooBackupMan },
{ Str_839B9A8, DebugMenu_OpenMurakawa },
#if !(ENGLISH && REVISION == 0)
{ Str_839B9B1, DebugMenu_OpenKiwa },
#endif
};
#if (ENGLISH && REVISION == 0)
const u8 gUnknown_Debug_839BB64[] =
{
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x0e, 0x1f, 0x12, 0x13, 0x00, 0x08, 0x09, 0x0a, 0x1e, 0x10, 0x24, 0x0f, 0x00, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00,
0x1c, 0x1d, 0x14, 0x20, 0x21, 0x22, 0x23, 0x00, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x00, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x00, 0x11, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
#else
const u8 gUnknown_Debug_839BB64[] =
{
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x0e, 0x1f, 0x12, 0x13, 0x00, 0x08, 0x09, 0x0a, 0x1e, 0x10, 0x24, 0x0f, 0x00, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00,
0x1c, 0x1d, 0x14, 0x20, 0x21, 0x22, 0x23, 0x00, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x00, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x00, 0x11, 0x33, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00,
};
#endif
const u8 gUnknown_Debug_0839BBA4[] = _("Debugging Version");
const u8 gUnknown_Debug_0839BBB6[] = _("{VERSION} Version");
const u8 gUnknown_Debug_0839BBC1[] = _("Normal RTC compatible");
#if ENGLISH
const u8 gDebugCreatedString[] = _("Created");
const u8 gDebugContinuousString[] = _("Continuous play\n"
"available from");
#else
const u8 gDebugRomString[] = _("Debugging Version");
#endif
const u8 gDebugVersionString[] = _("{VERSION} Version");
const u8 gDebugRTCString[] = _("Normal RTC compatible");
const u8 gTestMenu_TestMenuHeaderText[] = DTR("か の じっけん", "TEST MENU"); // 科の実験 (Test section)
const u8 gTestMenu_Test2Text[] = DTR("じっけん2", "Test2");
@ -345,6 +366,7 @@ extern const u8 Str_839BD4C[];
static u8 gUnknown_030006B8;
#ifndef ENGLISH
struct DebugBuildDateInfo {
s32 max;
s32 digitMultiplier;
@ -353,6 +375,7 @@ struct DebugBuildDateInfo {
};
static const struct DebugBuildDateInfo *gDebugBuildDate;
#endif
static u8 gUnknown_030006C0;
static u8 gUnknown_030006C1;
static const u8 * gUnknown_030006C4;
@ -382,10 +405,17 @@ void debug_sub_8076B4C(void)
// Initializes test menu
void debug_sub_8076B68(void)
{
Menu_PrintText(gUnknown_Debug_0839BBB6, 1, 1);
Menu_PrintText(gUnknown_Debug_0839BBC1, 1, 3);
Menu_PrintText(gUnknown_Debug_0839BBA4, 1, 9);
debug_sub_8077CF4(4, 11);
Menu_PrintText(gDebugVersionString, 1, 1);
Menu_PrintText(gDebugRTCString, 1, 3);
#if ENGLISH
Menu_PrintText(gDebugCreatedString, 1, 7);
DebugMenu_DisplayBuildDate(3, 9);
Menu_PrintText(gDebugContinuousString, 1, 12);
DebugMenu_DisplayContinuousDate(3, 16);
#else
Menu_PrintText(gDebugRomString, 1, 9);
DebugMenu_DisplayBuildDate(4, 11);
#endif
debug_sub_8076AC8(0);
CreateTask(debug_sub_8076BB4, 1);
}
@ -699,6 +729,9 @@ void DebugMenu_8077048(void)
u8 DebugMenu_807706C(void)
{
#if (ENGLISH && REVISION == 0)
gUnknown_Debug_Murakawa2 = 1;
#endif
InitMenuWindow(&gMenuTextWindowTemplate);
DebugMenu_8077004();
DebugMenu_807719C();
@ -710,6 +743,8 @@ u8 DebugMenu_807706C(void)
u8 DebugMenu_807709C(void)
{
u8 actionRet;
if (gMain.newKeys & DPAD_UP)
{
PlaySE(SE_SELECT);
@ -743,11 +778,21 @@ u8 DebugMenu_807709C(void)
if (gMain.newKeys & A_BUTTON)
{
PlaySE(SE_SELECT);
return gDebug0x839B9BC[gUnknown_030006C4[gUnknown_030006C0]].func();
actionRet = gDebug0x839B9BC[gUnknown_030006C4[gUnknown_030006C0]].func();
// TODO: see if this is in rev1+
#if (ENGLISH && REVISION == 0)
if (actionRet == 1)
gUnknown_Debug_Murakawa2 = 0;
#endif
return actionRet;
}
if (gMain.newKeys & (B_BUTTON | START_BUTTON))
{
CloseMenu();
// TODO: see if this is in rev1+
#if (ENGLISH && REVISION == 0)
gUnknown_Debug_Murakawa2 = 0;
#endif
return TRUE;
}
return FALSE;
@ -1389,15 +1434,47 @@ u8 DebugMenu_8077C14(void)
const u8 Str_839BFDC[] = DTR(" じかん ふん びょう", " HOURS MINUTES SECONDS");
#if ENGLISH
const u8 ContinousDateTime[] = "2002 08 01 20:25";
#else
static const struct DebugBuildDateInfo gDebugBuildDateInfo[] = {
{ 99, 10, 2, 23 },
{ 99, 10, 2, 26 }
};
#endif
// Parses the version code in a highly inefficient and unsafe way.
void DebugMenu_ConvertBuildDate(const char *buildDateStr, u8 *out)
void DebugMenu_ConvertBuildDate(const u8 *buildDateStr, u8 *out)
{
int i;
s32 i;
#if ENGLISH
u16 year;
u16 month;
u16 day;
u16 hour;
u16 minutes;
for (year = 0, i = 0; i < 2; i++)
{
year *= 10;
year += (buildDateStr[i+2] - '0');
}
month = (buildDateStr[5] - '0') * 10 + (buildDateStr[6] - '0');
day = (buildDateStr[8] - '0') * 10 + (buildDateStr[9] - '0');
hour = (buildDateStr[11] - '0') * 10 + (buildDateStr[12] - '0');
minutes = (buildDateStr[14] - '0') * 10 + (buildDateStr[15] - '0');
out = ConvertIntToDecimalStringN(out, year, STR_CONV_MODE_LEADING_ZEROS, 2);
*out++ = CHAR_SLASH;
out = ConvertIntToDecimalStringN(out, month, STR_CONV_MODE_LEADING_ZEROS, 2);
*out++ = CHAR_SLASH;
out = ConvertIntToDecimalStringN(out, day, STR_CONV_MODE_LEADING_ZEROS, 2);
*out++ = CHAR_SPACE;
out = ConvertIntToDecimalStringN(out, hour, STR_CONV_MODE_LEADING_ZEROS, 2);
*out++ = CHAR_COLON;
out = ConvertIntToDecimalStringN(out, minutes, STR_CONV_MODE_LEADING_ZEROS, 2);
#else
// Prevents register allocation swap
// Intended: r7 = out, r6 = gDebugBuildDate->numDigits
// Observed: r6 = out, r7 = gDebugBuildDate->numDigits
@ -1408,8 +1485,8 @@ void DebugMenu_ConvertBuildDate(const char *buildDateStr, u8 *out)
*out++ = CHAR_SPACE;
for (i = 0; i < 2; i++, gDebugBuildDate++)
{
int j;
int mul;
s32 j;
s32 mul;
u32 date = 0;
for (mul = gDebugBuildDate->digitMultiplier, j = 0; j < gDebugBuildDate->numDigits; j++, mul /= 10)
date += (buildDateStr[gDebugBuildDate->offset + j] - '0') * mul;
@ -1421,14 +1498,23 @@ void DebugMenu_ConvertBuildDate(const char *buildDateStr, u8 *out)
if (out[0] > 0xf6) // prevent special characters
out[0] = 0xf6;
out[1] = EOS;
#endif
}
void debug_sub_8077CF4(u8 x, u8 y)
void DebugMenu_DisplayBuildDate(u8 x, u8 y)
{
DebugMenu_ConvertBuildDate(BuildDateTime, gStringVar4);
Menu_PrintText(gStringVar4, x, y);
}
#if ENGLISH
void DebugMenu_DisplayContinuousDate(u8 x, u8 y)
{
DebugMenu_ConvertBuildDate(ContinousDateTime, gStringVar4);
Menu_PrintText(gStringVar4, x, y);
}
#endif
void DebugMenu_8077D24(const struct MenuAction *menuAction, u8 width, u8 itemCount)
{
Menu_EraseScreen();
@ -2591,14 +2677,22 @@ u8 DebugMenu_PTime(void)
return TRUE;
}
#if (ENGLISH && REVISION == 0)
const u8 gDebug0x839C60C[] = _("switch DISP mode");
#else
const u8 gDebug0x839C60C[] = _("Set FLASH ERR");
#endif
void DebugMenu_8079058(u8 taskId)
{
switch (gTasks[taskId].data[0])
{
case 0:
#if (ENGLISH && REVISION == 0)
gUnknown_Debug_Murakawa2 = 1;
#else
gUnknown_Debug_03004BD0 = 0;
#endif
Menu_DisplayDialogueFrame();
gTasks[taskId].data[0]++;
break;
@ -2619,6 +2713,9 @@ void DebugMenu_8079058(u8 taskId)
gUnknown_Debug_03004BD0 = 0;
break;
}
#if (ENGLISH && REVISION == 0)
gUnknown_Debug_Murakawa2 = 0;
#endif
Menu_EraseScreen();
ScriptContext2_Disable();
DestroyTask(taskId);
@ -2634,13 +2731,17 @@ u8 DebugMenu_OpenMurakawa(void)
return TRUE;
}
const u8 Str_839C61A[] = _("abcde; abcde: ABCDE; ABCDE:\p"
"Tableaux des verbes du 2{SUPER_E} groupe.\p"
"La1{SUPER_RE} chose à apprendre c'est de lire.\p"
"Tableaux des verbes du 1{SUPER_ER} groupe.\p"
"“あいうえおかきくけコさしすせそたちつてとな”\n"
"<にぬネのはひふへほマみむめもやゆよらりるれろわャッ>\p"
"をんゃゅょアイウエオカキクケサシスルレロワ,");
#if !(ENGLISH && REVISION == 0)
const u8 Str_839C61A[] = _(
#if GERMAN
"abcde; abcde: ABCDE; ABCDE:\p"
#endif
"Tableaux des verbes du 2{SUPER_E} groupe.\p"
"La1{SUPER_RE} chose à apprendre c'est de lire.\p"
"Tableaux des verbes du 1{SUPER_ER} groupe.\p"
"“あいうえおかきくけコさしすせそたちつてとな”\n"
"<にぬネのはひふへほマみむめもやゆよらりるれろわャッ>\p"
"をんゃゅょアイウエオカキクケサシスルレロワ,");
void DebugMenu_8079110(u8 taskId)
{
@ -2672,5 +2773,6 @@ u8 DebugMenu_OpenKiwa(void)
ScriptContext2_Enable();
// return TRUE;
}
#endif
#endif

View File

@ -439,37 +439,37 @@ void debug_sub_8090C44(void)
Menu_PrintText(eTayaLuckyNumber.charbuf, 1, 3);
}
#ifdef NONMATCHING
// mayday mayday
bool8 debug_sub_8090C88(void)
{
bool8 r8 = TRUE;
if (gMain.newKeys & DPAD_LEFT && eTayaLuckyNumber.digit != 0)
{
eTayaLuckyNumber.digit--;
}
else if (gMain.newKeys & DPAD_RIGHT && eTayaLuckyNumber.digit < 4)
{
eTayaLuckyNumber.digit++;
}
else
do
{
if (gMain.newKeys & DPAD_LEFT && eTayaLuckyNumber.digit != 0)
{
eTayaLuckyNumber.digit--;
break;
}
if (gMain.newKeys & DPAD_RIGHT && eTayaLuckyNumber.digit < 4)
{
eTayaLuckyNumber.digit++;
break;
}
if (gMain.newAndRepeatedKeys & DPAD_UP)
{
u8 r4;
eTayaLuckyNumber.tempLuckyId = eTayaLuckyNumber.curLuckyId;
eTayaLuckyNumber.charbuf0 = 10000;
eTayaLuckyNumber.digitDeltaMagnitude = 10000;
for (r4 = 0; r4 < eTayaLuckyNumber.digit; r4++)
eTayaLuckyNumber.charbuf0 /= 10;
eTayaLuckyNumber.tempLuckyId += eTayaLuckyNumber.charbuf0;
eTayaLuckyNumber.digitDeltaMagnitude /= 10;
eTayaLuckyNumber.tempLuckyId += eTayaLuckyNumber.digitDeltaMagnitude;
if (eTayaLuckyNumber.tempLuckyId > 0xFFFF)
eTayaLuckyNumber.tempLuckyId = 0xFFFF;
if (eTayaLuckyNumber.curLuckyId != eTayaLuckyNumber.tempLuckyId)
{
eTayaLuckyNumber.curLuckyId = eTayaLuckyNumber.tempLuckyId;
goto check;
break;
}
}
if (gMain.newAndRepeatedKeys & DPAD_DOWN)
@ -477,16 +477,16 @@ bool8 debug_sub_8090C88(void)
u8 r4;
eTayaLuckyNumber.tempLuckyId = eTayaLuckyNumber.curLuckyId;
eTayaLuckyNumber.charbuf0 = 10000;
eTayaLuckyNumber.digitDeltaMagnitude = 10000;
for (r4 = 0; r4 < eTayaLuckyNumber.digit; r4++)
eTayaLuckyNumber.charbuf0 /= 10;
eTayaLuckyNumber.tempLuckyId -= eTayaLuckyNumber.charbuf0;
eTayaLuckyNumber.digitDeltaMagnitude /= 10;
eTayaLuckyNumber.tempLuckyId -= eTayaLuckyNumber.digitDeltaMagnitude;
if (eTayaLuckyNumber.tempLuckyId < 0)
eTayaLuckyNumber.tempLuckyId = 0;
if (eTayaLuckyNumber.curLuckyId != eTayaLuckyNumber.tempLuckyId)
{
eTayaLuckyNumber.curLuckyId = eTayaLuckyNumber.tempLuckyId;
goto check;
break;
}
}
if (gMain.newKeys & B_BUTTON)
@ -501,193 +501,12 @@ bool8 debug_sub_8090C88(void)
return TRUE;
}
r8 = FALSE;
}
} while (0);
check:
if (r8)
debug_sub_8090C44();
return FALSE;
}
#else
NAKED bool8 debug_sub_8090C88(void)
{
asm("\tpush\t{r4, r5, r6, r7, lr}\n"
"\tmov\tr7, r8\n"
"\tpush\t{r7}\n"
"\tadd\tsp, sp, #0xfffffffc\n"
"\tmov\tr0, #0x1\n"
"\tmov\tr8, r0\n"
"\tldr\tr2, ._59 @ gMain\n"
"\tldrh\tr1, [r2, #0x2e]\n"
"\tmov\tr0, #0x20\n"
"\tand\tr0, r0, r1\n"
"\tadd\tr3, r2, #0\n"
"\tcmp\tr0, #0\n"
"\tbeq\t._57\t@cond_branch\n"
"\tldr\tr1, ._59 + 4 @ gSharedMem\n"
"\tldrb\tr0, [r1]\n"
"\tcmp\tr0, #0\n"
"\tbeq\t._57\t@cond_branch\n"
"\tsub\tr0, r0, #0x1\n"
"\tstrb\tr0, [r1]\n"
"\tb\t._62\n"
"._60:\n"
"\t.align\t2, 0\n"
"._59:\n"
"\t.word\tgMain\n"
"\t.word\tgSharedMem\n"
"._67:\n"
"\tadd\tr0, r0, #0x1\n"
"\tstrb\tr0, [r1]\n"
"\tb\t._62\n"
"._77:\n"
"\tstrh\tr1, [r7, #0x8]\n"
"\tb\t._62\n"
"._79:\n"
"\tldr\tr0, ._64 @ gSharedMem\n"
"\tldrh\tr0, [r0, #0x8]\n"
"\tbl\tSetLotteryNumber16_Unused\n"
"._78:\n"
"\tbl\tCloseMenu\n"
"\tmov\tr0, #0x1\n"
"\tb\t._63\n"
"._65:\n"
"\t.align\t2, 0\n"
"._64:\n"
"\t.word\tgSharedMem\n"
"._57:\n"
"\tldrh\tr1, [r3, #0x2e]\n"
"\tmov\tr0, #0x10\n"
"\tand\tr0, r0, r1\n"
"\tcmp\tr0, #0\n"
"\tbeq\t._66\t@cond_branch\n"
"\tldr\tr1, ._81 @ gSharedMem\n"
"\tldrb\tr0, [r1]\n"
"\tcmp\tr0, #0x3\n"
"\tbls\t._67\t@cond_branch\n"
"._66:\n"
"\tldrh\tr1, [r3, #0x30]\n"
"\tmov\tr0, #0x40\n"
"\tand\tr0, r0, r1\n"
"\tcmp\tr0, #0\n"
"\tbeq\t._68\t@cond_branch\n"
"\tldr\tr0, ._81 @ gSharedMem\n"
"\tldrh\tr1, [r0, #0x8]\n"
"\tstr\tr1, [r0, #0xc]\n"
"\tldr\tr1, ._81 + 4 @ 0x2710\n"
"\tstrh\tr1, [r0, #0x10]\n"
"\tmov\tr4, #0x0\n"
"\tldrb\tr1, [r0]\n"
"\tadd\tr7, r0, #0\n"
"\tcmp\tr4, r1\n"
"\tbcs\t._69\t@cond_branch\n"
"\tadd\tr5, r7, #0\n"
"\tadd\tr6, r1, #0\n"
"._70:\n"
"\tldrh\tr0, [r5, #0x10]\n"
"\tmov\tr1, #0xa\n"
"\tstr\tr3, [sp]\n"
"\tbl\t__udivsi3\n"
"\tstrh\tr0, [r5, #0x10]\n"
"\tadd\tr0, r4, #1\n"
"\tlsl\tr0, r0, #0x18\n"
"\tlsr\tr4, r0, #0x18\n"
"\tldr\tr3, [sp]\n"
"\tcmp\tr4, r6\n"
"\tbcc\t._70\t@cond_branch\n"
"._69:\n"
"\tldrh\tr1, [r7, #0x10]\n"
"\tldr\tr0, [r7, #0xc]\n"
"\tadd\tr0, r0, r1\n"
"\tstr\tr0, [r7, #0xc]\n"
"\tldr\tr1, ._81 + 8 @ 0xffff\n"
"\tcmp\tr0, r1\n"
"\tble\t._71\t@cond_branch\n"
"\tstr\tr1, [r7, #0xc]\n"
"._71:\n"
"\tldrh\tr0, [r7, #0x8]\n"
"\tldr\tr1, [r7, #0xc]\n"
"\tcmp\tr0, r1\n"
"\tbne\t._77\t@cond_branch\n"
"._68:\n"
"\tldrh\tr1, [r3, #0x30]\n"
"\tmov\tr0, #0x80\n"
"\tand\tr0, r0, r1\n"
"\tcmp\tr0, #0\n"
"\tbeq\t._73\t@cond_branch\n"
"\tldr\tr0, ._81 @ gSharedMem\n"
"\tldrh\tr1, [r0, #0x8]\n"
"\tstr\tr1, [r0, #0xc]\n"
"\tldr\tr1, ._81 + 4 @ 0x2710\n"
"\tstrh\tr1, [r0, #0x10]\n"
"\tmov\tr4, #0x0\n"
"\tldrb\tr1, [r0]\n"
"\tadd\tr7, r0, #0\n"
"\tcmp\tr4, r1\n"
"\tbcs\t._74\t@cond_branch\n"
"\tadd\tr5, r7, #0\n"
"\tadd\tr6, r1, #0\n"
"._75:\n"
"\tldrh\tr0, [r5, #0x10]\n"
"\tmov\tr1, #0xa\n"
"\tstr\tr3, [sp]\n"
"\tbl\t__udivsi3\n"
"\tstrh\tr0, [r5, #0x10]\n"
"\tadd\tr0, r4, #1\n"
"\tlsl\tr0, r0, #0x18\n"
"\tlsr\tr4, r0, #0x18\n"
"\tldr\tr3, [sp]\n"
"\tcmp\tr4, r6\n"
"\tbcc\t._75\t@cond_branch\n"
"._74:\n"
"\tadd\tr2, r7, #0\n"
"\tldrh\tr1, [r2, #0x10]\n"
"\tldr\tr0, [r2, #0xc]\n"
"\tsub\tr0, r0, r1\n"
"\tstr\tr0, [r2, #0xc]\n"
"\tcmp\tr0, #0\n"
"\tbge\t._76\t@cond_branch\n"
"\tmov\tr0, #0x0\n"
"\tstr\tr0, [r2, #0xc]\n"
"._76:\n"
"\tldrh\tr0, [r2, #0x8]\n"
"\tldr\tr1, [r2, #0xc]\n"
"\tcmp\tr0, r1\n"
"\tbne\t._77\t@cond_branch\n"
"._73:\n"
"\tldrh\tr2, [r3, #0x2e]\n"
"\tmov\tr0, #0x2\n"
"\tand\tr0, r0, r2\n"
"\tcmp\tr0, #0\n"
"\tbne\t._78\t@cond_branch\n"
"\tmov\tr0, #0x1\n"
"\tand\tr0, r0, r2\n"
"\tcmp\tr0, #0\n"
"\tbne\t._79\t@cond_branch\n"
"\tmov\tr0, #0x0\n"
"\tmov\tr8, r0\n"
"._62:\n"
"\tmov\tr0, r8\n"
"\tcmp\tr0, #0\n"
"\tbeq\t._80\t@cond_branch\n"
"\tbl\tdebug_sub_8090C44\n"
"._80:\n"
"\tmov\tr0, #0x0\n"
"._63:\n"
"\tadd\tsp, sp, #0x4\n"
"\tpop\t{r3}\n"
"\tmov\tr8, r3\n"
"\tpop\t{r4, r5, r6, r7}\n"
"\tpop\t{r1}\n"
"\tbx\tr1\n"
"._82:\n"
"\t.align\t2, 0\n"
"._81:\n"
"\t.word\tgSharedMem\n"
"\t.word\t0x2710\n"
"\t.word\t0xffff");
}
#endif // NONMATCHING
bool8 TayaDebugMenu_PKMNLottery(void)
{

View File

@ -245,12 +245,21 @@ static const struct MenuAction sMenuActions_TopMenu[] = {
{sString_ControlWORK, ControlWorks},
};
#if (ENGLISH && REVISION == 0)
static const u8 sString_ContestMenuTitle[] = _("コンテスト");
static const u8 sString_Contest_PokemonNo[] = _("ポケモンナンバー");
static const u8 sString_Contest_Personality[] = _("こせいらんすう");
static const u8 sString_Contest_Type[] = _("コンテストしゅるい");
static const u8 sString_Contest_PokeArt[] = _("ひょうじ");
#else
static const u8 sString_ContestMenuTitle[] = _("Contest");
static const u8 sString_Contest_PokemonNo[] = _("Pokémon No.");
static const u8 sString_Contest_Personality[] = _("ID rnd. digit");
static const u8 sString_Contest_Type[] = _("Contest Type");
static const u8 sString_Contest_PokeArt[] = _("Poké Art");
#endif
static const struct MenuAction sMenuActions_ContestPicTest[] = {
{sString_Contest_PokemonNo, DummyMenuAction},
@ -259,12 +268,21 @@ static const struct MenuAction sMenuActions_ContestPicTest[] = {
{sString_Contest_PokeArt, ContestGraphics_Show}
};
#if (ENGLISH && REVISION == 0)
static const u8 sString_Contest_ArtMuseumTitle[] = _("びじゅつかん");
static const u8 sString_Contest_ArtMuseum_PokemonNo[] = _("ポケモンナンバー");
static const u8 sString_Contest_ArtMuseum_Personality[] = _("こせいらんすう");
static const u8 sString_Contest_ArtMuseum_Type[] = _("タイトルしゅるい");
static const u8 sString_Contest_ArtMuseum_PokeArt[] = _("ひょうじ");
#else
static const u8 sString_Contest_ArtMuseumTitle[] = _("Art Mus.");
static const u8 sString_Contest_ArtMuseum_PokemonNo[] = _("Pokémon No.");
static const u8 sString_Contest_ArtMuseum_Personality[] = _("ID rnd. digit");
static const u8 sString_Contest_ArtMuseum_Type[] = _("Title Type");
static const u8 sString_Contest_ArtMuseum_PokeArt[] = _("Poké Art");
#endif
static const struct MenuAction sMenuActions_ArtMuseumPicTest[] = {
{sString_Contest_ArtMuseum_PokemonNo, DummyMenuAction},
@ -273,12 +291,21 @@ static const struct MenuAction sMenuActions_ArtMuseumPicTest[] = {
{sString_Contest_ArtMuseum_PokeArt, MuseumGraphics_Show}
};
#if (ENGLISH && REVISION == 0)
static const u8 sString_Contest_PreviewTitle[] = _("プレビュー");
static const u8 sString_Contest_Preview_PokemonNo[] = _("ポケモンナンバー");
static const u8 sString_Contest_Preview_Personality[] = _("こせいらんすう");
static const u8 sString_Contest_Preview_Type[] = _("しゅるい");
static const u8 sString_Contest_Preview_PokeArt[] = _("ひょうじ");
#else
static const u8 sString_Contest_PreviewTitle[] = _("Preview");
static const u8 sString_Contest_Preview_PokemonNo[] = _("Pokémon No.");
static const u8 sString_Contest_Preview_Personality[] = _("ID rnd. digit");
static const u8 sString_Contest_Preview_Type[] = _("Type");
static const u8 sString_Contest_Preview_PokeArt[] = _("Poké Art");
#endif
static const struct MenuAction sMenuActions_PreviewPicTest[] = {
{sString_Contest_Preview_PokemonNo, DummyMenuAction},
@ -287,10 +314,19 @@ static const struct MenuAction sMenuActions_PreviewPicTest[] = {
{sString_Contest_Preview_PokeArt, PreviewGraphics_Show}
};
#if (ENGLISH && REVISION == 0)
static const u8 sString_TrickRelated[] = _("カラクリかんれん");
#else
static const u8 sString_TrickRelated[] = _("Trick related");
#endif
static const u8 sString_TrickRelated_Level[] = _("Level");
#if (ENGLISH && REVISION == 0)
static const u8 sString_TrickRelated_TrickMaster[] = _("MASTER");
#else
static const u8 sString_TrickRelated_TrickMaster[] = _("Trick Master");
#endif
static const struct MenuAction sMenuActions_TrickRelated[] = {
{sString_TrickRelated_Level, TrickRelated_Level_InitSubmenu},
@ -1841,6 +1877,17 @@ static const u16 gUnknown_Debug_083C478E[][9] = {
{VAR_TEMP_9, VAR_TEMP_A, VAR_TEMP_B, VAR_TEMP_C, VAR_TEMP_D, VAR_TEMP_E, VAR_TEMP_F}
};
#if (ENGLISH && REVISION == 0)
static const u8 gUnknown_Debug_083C47B2[] = _("レベル");
static const u8 gUnknown_Debug_083C47B8[] = _("シーン1");
static const u8 gUnknown_Debug_083C47BF[] = _("シーン2");
static const u8 gUnknown_Debug_083C47C6[] = _("シーン3");
static const u8 gUnknown_Debug_083C47CD[] = _("シーン4");
static const u8 gUnknown_Debug_083C47D4[] = _("シーン5");
static const u8 gUnknown_Debug_083C47DB[] = _("シーン6");
static const u8 gUnknown_Debug_083C47E2[] = _("シーン7");
static const u8 gUnknown_Debug_083C47E9[] = _("シーン8");
#else
static const u8 gUnknown_Debug_083C47B2[] = _("Level");
static const u8 gUnknown_Debug_083C47B8[] = _("Scene1");
static const u8 gUnknown_Debug_083C47BF[] = _("Scene2");
@ -1850,6 +1897,7 @@ static const u8 gUnknown_Debug_083C47D4[] = _("Scene5");
static const u8 gUnknown_Debug_083C47DB[] = _("Scene6");
static const u8 gUnknown_Debug_083C47E2[] = _("Scene7");
static const u8 gUnknown_Debug_083C47E9[] = _("Scene8");
#endif
static const struct MenuAction gUnknown_Debug_083C47F0[] = {
{gUnknown_Debug_083C47B8, DummyMenuAction},
@ -1862,7 +1910,11 @@ static const struct MenuAction gUnknown_Debug_083C47F0[] = {
{gUnknown_Debug_083C47E9, DummyMenuAction}
};
#if (ENGLISH && REVISION == 0)
static const u8 gUnknown_Debug_083C4830[] = _("カラクリだいおう");
#else
static const u8 gUnknown_Debug_083C4830[] = _("Trick Master");
#endif
static const u8 gUnknown_Debug_083C483D[] = _("Hidden MASTER");
static const u8 gUnknown_Debug_083C484B[] = _("Inside the HOUSE");
@ -1878,8 +1930,13 @@ static const struct MenuAction gUnknown_Debug_083C4888[] = {
{gUnknown_Debug_083C4876, DummyMenuAction}
};
#if (ENGLISH && REVISION == 0)
static const u8 sDummyNickname[] = _("ポケモンめい");
static const u8 sDummyTrainerName[] = _("ブリーダーめい");
#else
static const u8 sDummyNickname[] = _("PMNICKNAME");
static const u8 sDummyTrainerName[] = _("BREEDER");
#endif
bool8 InitTomomichiDebugWindow(void)
{

View File

@ -1812,6 +1812,15 @@ const struct WatanabeDebugMenuItem gUnknown_Debug_083F8698[] = {
{gUnknown_Debug_083F868F, {.type3 = 0x6}}
};
#if (ENGLISH && REVISION == 0)
const u8 gUnknown_Debug_083F86C8[] = _("ふつう");
const u8 gUnknown_Debug_083F86CC[] = _("ねむり");
const u8 gUnknown_Debug_083F86D0[] = _("どく");
const u8 gUnknown_Debug_083F86D4[] = _("やけど");
const u8 gUnknown_Debug_083F86D8[] = _("こおり");
const u8 gUnknown_Debug_083F86DC[] = _("まひ");
const u8 gUnknown_Debug_083F86E0[] = _("どくどく");
#else
const u8 gUnknown_Debug_083F86C8[] = _("ーーー");
const u8 gUnknown_Debug_083F86CC[] = _("SLP");
const u8 gUnknown_Debug_083F86D0[] = _("PSN");
@ -1819,6 +1828,7 @@ const u8 gUnknown_Debug_083F86D4[] = _("BRN");
const u8 gUnknown_Debug_083F86D8[] = _("FRZ");
const u8 gUnknown_Debug_083F86DC[] = _("PAR");
const u8 gUnknown_Debug_083F86E0[] = _("PSN2");
#endif
const struct WatanabeDebugMenuItem gUnknown_Debug_083F86E8[] = {
{gUnknown_Debug_083F86C8, {.type3 = 0x0}},
@ -1830,8 +1840,13 @@ const struct WatanabeDebugMenuItem gUnknown_Debug_083F86E8[] = {
{gUnknown_Debug_083F86E0, {.type3 = 0x80}}
};
#if (ENGLISH && REVISION == 0)
const u8 gUnknown_Debug_083F8720[] = _("ポケモンを てもちに くわえました");
const u8 gUnknown_Debug_083F872A[] = _("ポケモンを ボックスに くわえました");
#else
const u8 gUnknown_Debug_083F8720[] = _("PKMN{RIGHT_ARROW}LIST");
const u8 gUnknown_Debug_083F872A[] = _("PKMN{RIGHT_ARROW}BOX");
#endif
void InitCreatePokemon(void)
{
u8 sp04[] = _("Create POKéMON LR:Shift START:Add");
@ -2196,7 +2211,11 @@ void debug_80C5FFC(void)
{
u32 ivs;
u8 sp10[] = DTR("たまご", "EGG");
#if (ENGLISH && REVISION == 0)
u8 sp14[] = _("デバッグポケ1");
#else
u8 sp14[] = _("DebugーG");
#endif
u8 one;
u16 ff;

View File

@ -2403,8 +2403,6 @@ bool8 sub_80FFBDC(u16 metatileBehavior, const struct Decoration *decoration)
return FALSE;
}
// When behaviorBy is set, it is masked by 0xf000. This is the step that fails to match when built.
#ifdef NONMATCHING
bool8 sub_80FFC24(u8 taskId, const struct Decoration *decoration)
{
u8 i;
@ -2536,540 +2534,6 @@ bool8 sub_80FFC24(u8 taskId, const struct Decoration *decoration)
}
return TRUE;
}
#else
NAKED
bool8 sub_80FFC24(u8 taskId, const struct Decoration *decoration)
{
asm(".syntax unified\n"
"\tpush {r4-r7,lr}\n"
"\tmov r7, r10\n"
"\tmov r6, r9\n"
"\tmov r5, r8\n"
"\tpush {r5-r7}\n"
"\tsub sp, 0x24\n"
"\tstr r1, [sp]\n"
"\tlsls r0, 24\n"
"\tlsrs r0, 24\n"
"\tmov r10, r0\n"
"\tldr r1, _080FFC60 @ =gTasks\n"
"\tlsls r0, 2\n"
"\tadd r0, r10\n"
"\tlsls r0, 3\n"
"\tadds r0, r1\n"
"\tldrb r2, [r0, 0x14]\n"
"\tstr r2, [sp, 0x4]\n"
"\tldrb r0, [r0, 0x12]\n"
"\tstr r0, [sp, 0x8]\n"
"\tldr r3, [sp]\n"
"\tldrb r0, [r3, 0x11]\n"
"\tadds r2, r1, 0\n"
"\tcmp r0, 0x4\n"
"\tbls _080FFC56\n"
"\tb _08100024\n"
"_080FFC56:\n"
"\tlsls r0, 2\n"
"\tldr r1, _080FFC64 @ =_080FFC68\n"
"\tadds r0, r1\n"
"\tldr r0, [r0]\n"
"\tmov pc, r0\n"
"\t.align 2, 0\n"
"_080FFC60: .4byte gTasks\n"
"_080FFC64: .4byte _080FFC68\n"
"\t.align 2, 0\n"
"_080FFC68:\n"
"\t.4byte _080FFC7C\n"
"\t.4byte _080FFC7C\n"
"\t.4byte _080FFD68\n"
"\t.4byte _080FFF1C\n"
"\t.4byte _080FFFA0\n"
"_080FFC7C:\n"
"\tmovs r6, 0\n"
"\tldr r0, [sp, 0x4]\n"
"\tcmp r6, r0\n"
"\tbcc _080FFC86\n"
"\tb _08100024\n"
"_080FFC86:\n"
"\tmov r1, r10\n"
"\tlsls r1, 2\n"
"\tstr r1, [sp, 0x1C]\n"
"_080FFC8C:\n"
"\tmov r2, r10\n"
"\tlsls r0, r2, 2\n"
"\tadd r0, r10\n"
"\tlsls r0, 3\n"
"\tldr r3, _080FFD64 @ =gTasks\n"
"\tadds r0, r3\n"
"\tldrh r0, [r0, 0xA]\n"
"\tsubs r0, r6\n"
"\tlsls r0, 16\n"
"\tlsrs r0, 16\n"
"\tmov r9, r0\n"
"\tmovs r7, 0\n"
"\tadds r6, 0x1\n"
"\tstr r6, [sp, 0x14]\n"
"\tldr r0, [sp, 0x8]\n"
"\tcmp r7, r0\n"
"\tbcs _080FFD56\n"
"\tmov r1, r9\n"
"\tlsls r1, 16\n"
"\tstr r1, [sp, 0xC]\n"
"\tasrs r1, 16\n"
"\tmov r9, r1\n"
"_080FFCB8:\n"
"\tldr r0, [sp, 0x1C]\n"
"\tadd r0, r10\n"
"\tlsls r0, 3\n"
"\tldr r2, _080FFD64 @ =gTasks\n"
"\tadds r0, r2\n"
"\tldrh r0, [r0, 0x8]\n"
"\tadds r0, r7\n"
"\tlsls r0, 16\n"
"\tmov r8, r0\n"
"\tasrs r6, r0, 16\n"
"\tadds r0, r6, 0\n"
"\tmov r1, r9\n"
"\tbl MapGridGetMetatileBehaviorAt\n"
"\tlsls r0, 24\n"
"\tlsrs r4, r0, 24\n"
"\tldr r3, [sp, 0x4]\n"
"\tldr r1, [sp, 0x14]\n"
"\tsubs r0, r3, r1\n"
"\tldr r2, [sp, 0x8]\n"
"\tadds r1, r0, 0\n"
"\tmuls r1, r2\n"
"\tadds r1, r7\n"
"\tldr r3, [sp]\n"
"\tldr r0, [r3, 0x1C]\n"
"\tlsls r1, 1\n"
"\tadds r1, r0\n"
"\tmovs r2, 0x80\n"
"\tlsls r2, 2\n"
"\tadds r0, r2, 0\n"
"\tldrh r1, [r1]\n"
"\tadds r0, r1\n"
"\tlsls r0, 16\n"
"\tlsrs r0, 16\n"
"\tbl GetBehaviorByMetatileId\n"
"\tmovs r3, 0xF0\n"
"\tlsls r3, 8\n"
"\tadds r1, r3, 0\n"
"\tadds r5, r1, 0\n"
"\tands r5, r0\n"
"\tadds r0, r4, 0\n"
"\tldr r1, [sp]\n"
"\tbl sub_80FFBDC\n"
"\tlsls r0, 24\n"
"\tcmp r0, 0\n"
"\tbne _080FFD1A\n"
"\tb _080FFFF4\n"
"_080FFD1A:\n"
"\tmov r0, r10\n"
"\tadds r1, r6, 0\n"
"\tmov r2, r9\n"
"\tadds r3, r5, 0\n"
"\tbl sub_80FFB94\n"
"\tlsls r0, 24\n"
"\tcmp r0, 0\n"
"\tbne _080FFD2E\n"
"\tb _080FFFF4\n"
"_080FFD2E:\n"
"\tmov r1, r8\n"
"\tlsrs r0, r1, 16\n"
"\tldr r2, [sp, 0xC]\n"
"\tlsrs r1, r2, 16\n"
"\tmovs r2, 0\n"
"\tbl GetObjectEventIdByXYZ\n"
"\tlsls r0, 24\n"
"\tlsrs r4, r0, 24\n"
"\tcmp r4, 0\n"
"\tbeq _080FFD4A\n"
"\tcmp r4, 0x10\n"
"\tbeq _080FFD4A\n"
"\tb _080FFFF4\n"
"_080FFD4A:\n"
"\tadds r0, r7, 0x1\n"
"\tlsls r0, 24\n"
"\tlsrs r7, r0, 24\n"
"\tldr r3, [sp, 0x8]\n"
"\tcmp r7, r3\n"
"\tbcc _080FFCB8\n"
"_080FFD56:\n"
"\tldr r1, [sp, 0x14]\n"
"\tlsls r0, r1, 24\n"
"\tlsrs r6, r0, 24\n"
"\tldr r2, [sp, 0x4]\n"
"\tcmp r6, r2\n"
"\tbcc _080FFC8C\n"
"\tb _08100024\n"
"\t.align 2, 0\n"
"_080FFD64: .4byte gTasks\n"
"_080FFD68:\n"
"\tmovs r6, 0\n"
"\tmov r3, r10\n"
"\tlsls r3, 2\n"
"\tstr r3, [sp, 0x1C]\n"
"\tldr r0, [sp, 0x4]\n"
"\tsubs r0, 0x1\n"
"\tstr r0, [sp, 0x18]\n"
"\tcmp r6, r0\n"
"\tbge _080FFE54\n"
"\tadds r0, r3, 0\n"
"\tadd r0, r10\n"
"\tlsls r0, 3\n"
"\tstr r0, [sp, 0x10]\n"
"_080FFD82:\n"
"\tldr r1, [sp, 0x10]\n"
"\tadds r0, r1, r2\n"
"\tldrh r0, [r0, 0xA]\n"
"\tsubs r0, r6\n"
"\tlsls r0, 16\n"
"\tlsrs r0, 16\n"
"\tmov r9, r0\n"
"\tmovs r7, 0\n"
"\tadds r6, 0x1\n"
"\tstr r6, [sp, 0x14]\n"
"\tldr r3, [sp, 0x8]\n"
"\tcmp r7, r3\n"
"\tbcs _080FFE48\n"
"\tlsls r0, 16\n"
"\tstr r0, [sp, 0x20]\n"
"_080FFDA0:\n"
"\tldr r1, [sp, 0x10]\n"
"\tadds r0, r1, r2\n"
"\tldrh r0, [r0, 0x8]\n"
"\tadds r0, r7\n"
"\tlsls r0, 16\n"
"\tmov r8, r0\n"
"\tasrs r6, r0, 16\n"
"\tmov r2, r9\n"
"\tlsls r1, r2, 16\n"
"\tadds r0, r6, 0\n"
"\tasrs r1, 16\n"
"\tbl MapGridGetMetatileBehaviorAt\n"
"\tlsls r0, 24\n"
"\tlsrs r4, r0, 24\n"
"\tldr r3, [sp, 0x4]\n"
"\tldr r1, [sp, 0x14]\n"
"\tsubs r0, r3, r1\n"
"\tldr r2, [sp, 0x8]\n"
"\tadds r1, r0, 0\n"
"\tmuls r1, r2\n"
"\tadds r1, r7\n"
"\tldr r3, [sp]\n"
"\tldr r0, [r3, 0x1C]\n"
"\tlsls r1, 1\n"
"\tadds r1, r0\n"
"\tmovs r2, 0x80\n"
"\tlsls r2, 2\n"
"\tadds r0, r2, 0\n"
"\tldrh r1, [r1]\n"
"\tadds r0, r1\n"
"\tlsls r0, 16\n"
"\tlsrs r0, 16\n"
"\tbl GetBehaviorByMetatileId\n"
"\tmovs r3, 0xF0\n"
"\tlsls r3, 8\n"
"\tadds r1, r3, 0\n"
"\tadds r5, r1, 0\n"
"\tands r5, r0\n"
"\tadds r0, r4, 0\n"
"\tbl MetatileBehavior_IsNormal\n"
"\tlsls r0, 24\n"
"\tcmp r0, 0\n"
"\tbne _080FFE0C\n"
"\tadds r0, r4, 0\n"
"\tadds r1, r5, 0\n"
"\tbl sub_80FFB6C\n"
"\tlsls r0, 24\n"
"\tcmp r0, 0\n"
"\tbne _080FFE0C\n"
"\tb _080FFFF4\n"
"_080FFE0C:\n"
"\tmov r0, r10\n"
"\tadds r1, r6, 0\n"
"\tldr r3, [sp, 0x20]\n"
"\tasrs r2, r3, 16\n"
"\tadds r3, r5, 0\n"
"\tbl sub_80FFB94\n"
"\tlsls r0, 24\n"
"\tcmp r0, 0\n"
"\tbne _080FFE22\n"
"\tb _080FFFF4\n"
"_080FFE22:\n"
"\tmov r1, r8\n"
"\tlsrs r0, r1, 16\n"
"\tldr r2, [sp, 0x20]\n"
"\tlsrs r1, r2, 16\n"
"\tmovs r2, 0\n"
"\tbl GetObjectEventIdByXYZ\n"
"\tlsls r0, 24\n"
"\tlsrs r0, 24\n"
"\tcmp r0, 0x10\n"
"\tbeq _080FFE3A\n"
"\tb _080FFFF4\n"
"_080FFE3A:\n"
"\tadds r0, r7, 0x1\n"
"\tlsls r0, 24\n"
"\tlsrs r7, r0, 24\n"
"\tldr r2, _080FFF18 @ =gTasks\n"
"\tldr r3, [sp, 0x8]\n"
"\tcmp r7, r3\n"
"\tbcc _080FFDA0\n"
"_080FFE48:\n"
"\tldr r1, [sp, 0x14]\n"
"\tlsls r0, r1, 24\n"
"\tlsrs r6, r0, 24\n"
"\tldr r3, [sp, 0x18]\n"
"\tcmp r6, r3\n"
"\tblt _080FFD82\n"
"_080FFE54:\n"
"\tldr r0, [sp, 0x1C]\n"
"\tadd r0, r10\n"
"\tlsls r0, 3\n"
"\tadds r0, r2\n"
"\tldrh r0, [r0, 0xA]\n"
"\tldr r1, [sp, 0x4]\n"
"\tsubs r0, r1\n"
"\tadds r0, 0x1\n"
"\tlsls r0, 16\n"
"\tlsrs r0, 16\n"
"\tmov r9, r0\n"
"\tmovs r7, 0\n"
"\tldr r3, [sp, 0x8]\n"
"\tcmp r7, r3\n"
"\tbcc _080FFE74\n"
"\tb _08100024\n"
"_080FFE74:\n"
"\tlsls r0, 16\n"
"\tstr r0, [sp, 0x20]\n"
"_080FFE78:\n"
"\tldr r0, [sp, 0x1C]\n"
"\tadd r0, r10\n"
"\tlsls r0, 3\n"
"\tldr r1, _080FFF18 @ =gTasks\n"
"\tadds r0, r1\n"
"\tldrh r0, [r0, 0x8]\n"
"\tadds r0, r7\n"
"\tlsls r0, 16\n"
"\tmov r8, r0\n"
"\tasrs r6, r0, 16\n"
"\tmov r2, r9\n"
"\tlsls r1, r2, 16\n"
"\tadds r0, r6, 0\n"
"\tasrs r1, 16\n"
"\tbl MapGridGetMetatileBehaviorAt\n"
"\tlsls r0, 24\n"
"\tlsrs r4, r0, 24\n"
"\tldr r3, [sp]\n"
"\tldr r0, [r3, 0x1C]\n"
"\tlsls r1, r7, 1\n"
"\tadds r1, r0\n"
"\tmovs r2, 0x80\n"
"\tlsls r2, 2\n"
"\tadds r0, r2, 0\n"
"\tldrh r1, [r1]\n"
"\tadds r0, r1\n"
"\tlsls r0, 16\n"
"\tlsrs r0, 16\n"
"\tbl GetBehaviorByMetatileId\n"
"\tmovs r3, 0xF0\n"
"\tlsls r3, 8\n"
"\tadds r1, r3, 0\n"
"\tadds r5, r1, 0\n"
"\tands r5, r0\n"
"\tadds r0, r4, 0\n"
"\tbl MetatileBehavior_IsNormal\n"
"\tlsls r0, 24\n"
"\tcmp r0, 0\n"
"\tbne _080FFEDA\n"
"\tadds r0, r4, 0\n"
"\tbl MetatileBehavior_IsSecretBaseNorthWall\n"
"\tlsls r0, 24\n"
"\tcmp r0, 0\n"
"\tbne _080FFEDA\n"
"\tb _080FFFF4\n"
"_080FFEDA:\n"
"\tmov r0, r10\n"
"\tadds r1, r6, 0\n"
"\tldr r3, [sp, 0x20]\n"
"\tasrs r2, r3, 16\n"
"\tadds r3, r5, 0\n"
"\tbl sub_80FFB94\n"
"\tlsls r0, 24\n"
"\tcmp r0, 0\n"
"\tbne _080FFEF0\n"
"\tb _080FFFF4\n"
"_080FFEF0:\n"
"\tmov r1, r8\n"
"\tlsrs r0, r1, 16\n"
"\tldr r2, [sp, 0x20]\n"
"\tlsrs r1, r2, 16\n"
"\tmovs r2, 0\n"
"\tbl GetObjectEventIdByXYZ\n"
"\tlsls r0, 24\n"
"\tlsrs r4, r0, 24\n"
"\tcmp r4, 0\n"
"\tbeq _080FFF0A\n"
"\tcmp r4, 0x10\n"
"\tbne _080FFFF4\n"
"_080FFF0A:\n"
"\tadds r0, r7, 0x1\n"
"\tlsls r0, 24\n"
"\tlsrs r7, r0, 24\n"
"\tldr r3, [sp, 0x8]\n"
"\tcmp r7, r3\n"
"\tbcc _080FFE78\n"
"\tb _08100024\n"
"\t.align 2, 0\n"
"_080FFF18: .4byte gTasks\n"
"_080FFF1C:\n"
"\tmovs r6, 0\n"
"\tldr r0, [sp, 0x4]\n"
"\tcmp r6, r0\n"
"\tbcc _080FFF26\n"
"\tb _08100024\n"
"_080FFF26:\n"
"\tmov r1, r10\n"
"\tlsls r0, r1, 2\n"
"\tadd r0, r10\n"
"\tlsls r1, r0, 3\n"
"\tldr r2, _080FFF9C @ =gTasks\n"
"\tadds r0, r1, r2\n"
"\tldrh r0, [r0, 0xA]\n"
"\tsubs r0, r6\n"
"\tlsls r0, 16\n"
"\tlsrs r0, 16\n"
"\tmov r9, r0\n"
"\tmovs r7, 0\n"
"\tldr r3, [sp, 0x8]\n"
"\tcmp r7, r3\n"
"\tbcs _080FFF8C\n"
"\tadds r0, r2, 0\n"
"\tadds r1, r0\n"
"\tmov r8, r1\n"
"\tmov r1, r9\n"
"\tlsls r0, r1, 16\n"
"\tasrs r5, r0, 16\n"
"_080FFF50:\n"
"\tmov r2, r8\n"
"\tldrh r0, [r2, 0x8]\n"
"\tadds r0, r7\n"
"\tlsls r0, 16\n"
"\tasrs r4, r0, 16\n"
"\tadds r0, r4, 0\n"
"\tadds r1, r5, 0\n"
"\tbl MapGridGetMetatileBehaviorAt\n"
"\tlsls r0, 24\n"
"\tlsrs r0, 24\n"
"\tbl MetatileBehavior_IsSecretBaseNorthWall\n"
"\tlsls r0, 24\n"
"\tcmp r0, 0\n"
"\tbeq _080FFFF4\n"
"\tadds r0, r4, 0\n"
"\tadds r1, r5, 0x1\n"
"\tbl MapGridGetMetatileIdAt\n"
"\tmovs r1, 0xA3\n"
"\tlsls r1, 2\n"
"\tcmp r0, r1\n"
"\tbeq _080FFFF4\n"
"\tadds r0, r7, 0x1\n"
"\tlsls r0, 24\n"
"\tlsrs r7, r0, 24\n"
"\tldr r3, [sp, 0x8]\n"
"\tcmp r7, r3\n"
"\tbcc _080FFF50\n"
"_080FFF8C:\n"
"\tadds r0, r6, 0x1\n"
"\tlsls r0, 24\n"
"\tlsrs r6, r0, 24\n"
"\tldr r0, [sp, 0x4]\n"
"\tcmp r6, r0\n"
"\tbcc _080FFF26\n"
"\tb _08100024\n"
"\t.align 2, 0\n"
"_080FFF9C: .4byte gTasks\n"
"_080FFFA0:\n"
"\tmov r3, r10\n"
"\tlsls r1, r3, 2\n"
"\tadds r0, r1, r3\n"
"\tlsls r0, 3\n"
"\tadds r0, r2\n"
"\tldrh r0, [r0, 0xA]\n"
"\tmov r9, r0\n"
"\tmovs r7, 0\n"
"\tstr r1, [sp, 0x1C]\n"
"\tldr r0, [sp, 0x8]\n"
"\tcmp r7, r0\n"
"\tbcs _08100024\n"
"\tadds r6, r2, 0\n"
"\tmov r1, r9\n"
"\tlsls r1, 16\n"
"\tstr r1, [sp, 0x20]\n"
"_080FFFC0:\n"
"\tldr r0, [sp, 0x1C]\n"
"\tadd r0, r10\n"
"\tlsls r0, 3\n"
"\tadds r0, r6\n"
"\tldrh r0, [r0, 0x8]\n"
"\tadds r0, r7\n"
"\tlsls r0, 16\n"
"\tlsrs r5, r0, 16\n"
"\tasrs r0, 16\n"
"\tmov r2, r9\n"
"\tlsls r1, r2, 16\n"
"\tasrs r1, 16\n"
"\tbl MapGridGetMetatileBehaviorAt\n"
"\tlsls r0, 24\n"
"\tlsrs r4, r0, 24\n"
"\tldr r3, [sp]\n"
"\tldrb r0, [r3, 0x12]\n"
"\tcmp r0, 0x5\n"
"\tbne _080FFFF8\n"
"_080FFFE8:\n"
"\tadds r0, r4, 0\n"
"\tbl MetatileBehavior_IsLargeMatCenter\n"
"\tlsls r0, 24\n"
"\tcmp r0, 0\n"
"\tbne _08100004\n"
"_080FFFF4:\n"
"\tmovs r0, 0\n"
"\tb _08100026\n"
"_080FFFF8:\n"
"\tadds r0, r4, 0\n"
"\tbl MetatileBehavior_IsSecretBaseLargeMatEdge\n"
"\tlsls r0, 24\n"
"\tcmp r0, 0\n"
"\tbeq _080FFFE8\n"
"_08100004:\n"
"\tadds r0, r5, 0\n"
"\tldr r2, [sp, 0x20]\n"
"\tlsrs r1, r2, 16\n"
"\tmovs r2, 0\n"
"\tbl GetObjectEventIdByXYZ\n"
"\tlsls r0, 24\n"
"\tlsrs r0, 24\n"
"\tcmp r0, 0x10\n"
"\tbne _080FFFF4\n"
"\tadds r0, r7, 0x1\n"
"\tlsls r0, 24\n"
"\tlsrs r7, r0, 24\n"
"\tldr r3, [sp, 0x8]\n"
"\tcmp r7, r3\n"
"\tbcc _080FFFC0\n"
"_08100024:\n"
"\tmovs r0, 0x1\n"
"_08100026:\n"
"\tadd sp, 0x24\n"
"\tpop {r3-r5}\n"
"\tmov r8, r3\n"
"\tmov r9, r4\n"
"\tmov r10, r5\n"
"\tpop {r4-r7}\n"
"\tpop {r1}\n"
"\tbx r1\n"
".syntax divided\n");
}
#endif
void sub_8100038(u8 taskId)
{
@ -3967,131 +3431,42 @@ void sub_81013B8(u8 a0, u8 a1, u8 a2, u8 a3)
}
}
#ifdef NONMATCHING
void sub_8101460(u8 taskId)
{
u8 i;
u8 xOff;
u8 yOff;
u8 var1;
u32 var2;
gUnknown_02039234 = 0;
if (sub_8101340(taskId) != TRUE)
{
for (i=0; i<ewram_1f000.size; i++)
for (i = 0; i < ewram_1f000.size; i++)
{
if (ewram_1f000.items[i] == 0) // This is using the wrong register!
var1 = ewram_1f000.items[i];
if (var1 != 0)
{
continue;
}
sub_8101118(ewram_1f000.items[i], gUnknown_020391B4);
if (sub_8101200(taskId, i, gUnknown_020391B4) == TRUE)
{
gUnknown_020391B4[0].decorId = i;
gUnknown_02039234++;
break;
sub_8101118(var1, gUnknown_020391B4);
if (sub_8101200(taskId, i, gUnknown_020391B4) == TRUE)
{
gUnknown_020391B4[0].decorId = i;
gUnknown_02039234++;
break;
}
}
}
if (gUnknown_02039234 != 0)
{
xOff = ewram_1f000.pos[gUnknown_020391B4[0].decorId] >> 4;
yOff = ewram_1f000.pos[gUnknown_020391B4[0].decorId] & 0xf;
sub_81013B8(xOff, yOff - gUnknown_020391B4[0].height + 1, xOff + gUnknown_020391B4[0].width - 1, yOff);
var1 = yOff - gUnknown_020391B4[0].height + 1;
var2 = gUnknown_020391B4[0].width + xOff - 1;
sub_81013B8(xOff, var1, var2, yOff);
}
}
}
#else
NAKED
void sub_8101460(u8 taskId)
{
asm(".syntax unified\n"
"\tpush {r4-r7,lr}\n"
"\tlsls r0, 24\n"
"\tlsrs r6, r0, 24\n"
"\tldr r4, _081014B8 @ =gUnknown_02039234\n"
"\tmovs r0, 0\n"
"\tstrb r0, [r4]\n"
"\tadds r0, r6, 0\n"
"\tbl sub_8101340\n"
"\tlsls r0, 24\n"
"\tlsrs r0, 24\n"
"\tcmp r0, 0x1\n"
"\tbeq _08101504\n"
"\tmovs r5, 0\n"
"\tldr r0, _081014BC @ =ewram_1f000\n"
"\tldrb r1, [r0, 0x8]\n"
"\tcmp r5, r1\n"
"\tbcs _081014D2\n"
"\tadds r7, r4, 0\n"
"_08101486:\n"
"\tldr r0, [r0]\n"
"\tadds r0, r5\n"
"\tldrb r1, [r0] @ compiler incorrectly uses r0 for this and the next instruction\n"
"\tcmp r1, 0\n"
"\tbeq _081014C4\n"
"\tldr r4, _081014C0 @ =gUnknown_020391B4\n"
"\tadds r0, r1, 0\n"
"\tadds r1, r4, 0\n"
"\tbl sub_8101118\n"
"\tadds r0, r6, 0\n"
"\tadds r1, r5, 0\n"
"\tadds r2, r4, 0\n"
"\tbl sub_8101200\n"
"\tlsls r0, 24\n"
"\tlsrs r0, 24\n"
"\tcmp r0, 0x1\n"
"\tbne _081014C4\n"
"\tstrb r5, [r4]\n"
"\tldrb r0, [r7]\n"
"\tadds r0, 0x1\n"
"\tstrb r0, [r7]\n"
"\tb _081014D2\n"
"\t.align 2, 0\n"
"_081014B8: .4byte gUnknown_02039234\n"
"_081014BC: .4byte 0x201f000\n"
"_081014C0: .4byte gUnknown_020391B4\n"
"_081014C4:\n"
"\tadds r0, r5, 0x1\n"
"\tlsls r0, 24\n"
"\tlsrs r5, r0, 24\n"
"\tldr r0, _0810150C @ =ewram_1f000\n"
"\tldrb r1, [r0, 0x8]\n"
"\tcmp r5, r1\n"
"\tbcc _08101486\n"
"_081014D2:\n"
"\tldr r0, _08101510 @ =gUnknown_02039234\n"
"\tldrb r0, [r0]\n"
"\tcmp r0, 0\n"
"\tbeq _08101504\n"
"\tldr r0, _0810150C @ =ewram_1f000\n"
"\tldr r2, _08101514 @ =gUnknown_020391B4\n"
"\tldrb r1, [r2]\n"
"\tldr r0, [r0, 0x4]\n"
"\tadds r0, r1\n"
"\tldrb r1, [r0]\n"
"\tlsrs r0, r1, 4\n"
"\tmovs r3, 0xF\n"
"\tands r3, r1\n"
"\tldrb r1, [r2, 0x2]\n"
"\tsubs r1, r3, r1\n"
"\tadds r1, 0x1\n"
"\tlsls r1, 24\n"
"\tlsrs r1, 24\n"
"\tldrb r2, [r2, 0x1]\n"
"\tadds r2, r0\n"
"\tsubs r2, 0x1\n"
"\tlsls r2, 24\n"
"\tlsrs r2, 24\n"
"\tbl sub_81013B8\n"
"_08101504:\n"
"\tpop {r4-r7}\n"
"\tpop {r0}\n"
"\tbx r0\n"
"\t.align 2, 0\n"
"_0810150C: .4byte 0x201f000\n"
"_08101510: .4byte gUnknown_02039234\n"
"_08101514: .4byte gUnknown_020391B4\n"
".syntax divided\n");
}
#endif
void sub_8101518(u8 taskId)
{

View File

@ -681,24 +681,16 @@ void SetPlayerAvatarTransitionFlags(u16 a)
static void DoPlayerAvatarTransition(void)
{
u8 i;
u32 flags = gPlayerAvatar.unk1;
u8 flags = gPlayerAvatar.unk1;
if (flags != 0)
{
for (i = 0; i < 8; i++, flags >>= 1)
for (i = 0; i < ARRAY_COUNT(gUnknown_0830FC14); i++, flags >>= 1)
{
#ifdef NONMATCHING
if (flags & 1)
{
gUnknown_0830FC14[i](&gObjectEvents[gPlayerAvatar.objectEventId]);
}
#else
if (flags & 1)
{
register void (*const *funcs)(struct ObjectEvent *) asm("r0") = gUnknown_0830FC14;
funcs[i](&gObjectEvents[gPlayerAvatar.objectEventId]);
}
#endif
}
gPlayerAvatar.unk1 = 0;
}

View File

@ -147,46 +147,46 @@ void ResetFieldTasksArgs(void)
}
}
const struct MetatileOffset gUnknown_08376384[][2] = {
{{ 0, 0, METATILE_ID(Pacifidlog, HalfSubmergedLogs_Vertical0)}, { 0, 1, METATILE_ID(Pacifidlog, HalfSubmergedLogs_Vertical1)}},
{{ 0, -1, METATILE_ID(Pacifidlog, HalfSubmergedLogs_Vertical0)}, { 0, 0, METATILE_ID(Pacifidlog, HalfSubmergedLogs_Vertical1)}},
{{ 0, 0, METATILE_ID(Pacifidlog, HalfSubmergedLogs_Horizontal0)}, { 1, 0, METATILE_ID(Pacifidlog, HalfSubmergedLogs_Horizontal1)}},
{{ -1, 0, METATILE_ID(Pacifidlog, HalfSubmergedLogs_Horizontal0)}, { 0, 0, METATILE_ID(Pacifidlog, HalfSubmergedLogs_Horizontal1)}}
const struct MetatileOffset gUnknown_08376384[] = {
{ 0, 0, METATILE_ID(Pacifidlog, HalfSubmergedLogs_Vertical0)}, {0, 1, METATILE_ID(Pacifidlog, HalfSubmergedLogs_Vertical1)},
{ 0, -1, METATILE_ID(Pacifidlog, HalfSubmergedLogs_Vertical0)}, {0, 0, METATILE_ID(Pacifidlog, HalfSubmergedLogs_Vertical1)},
{ 0, 0, METATILE_ID(Pacifidlog, HalfSubmergedLogs_Horizontal0)}, {1, 0, METATILE_ID(Pacifidlog, HalfSubmergedLogs_Horizontal1)},
{-1, 0, METATILE_ID(Pacifidlog, HalfSubmergedLogs_Horizontal0)}, {0, 0, METATILE_ID(Pacifidlog, HalfSubmergedLogs_Horizontal1)}
};
const struct MetatileOffset gUnknown_083763A4[][2] = {
{{ 0, 0, METATILE_ID(Pacifidlog, SubmergedLogs_Vertical0)}, { 0, 1, METATILE_ID(Pacifidlog, SubmergedLogs_Vertical1)}},
{{ 0, -1, METATILE_ID(Pacifidlog, SubmergedLogs_Vertical0)}, { 0, 0, METATILE_ID(Pacifidlog, SubmergedLogs_Vertical1)}},
{{ 0, 0, METATILE_ID(Pacifidlog, SubmergedLogs_Horizontal0)}, { 1, 0, METATILE_ID(Pacifidlog, SubmergedLogs_Horizontal1)}},
{{ -1, 0, METATILE_ID(Pacifidlog, SubmergedLogs_Horizontal0)}, { 0, 0, METATILE_ID(Pacifidlog, SubmergedLogs_Horizontal1)}}
const struct MetatileOffset gUnknown_083763A4[] = {
{ 0, 0, METATILE_ID(Pacifidlog, SubmergedLogs_Vertical0)}, {0, 1, METATILE_ID(Pacifidlog, SubmergedLogs_Vertical1)},
{ 0, -1, METATILE_ID(Pacifidlog, SubmergedLogs_Vertical0)}, {0, 0, METATILE_ID(Pacifidlog, SubmergedLogs_Vertical1)},
{ 0, 0, METATILE_ID(Pacifidlog, SubmergedLogs_Horizontal0)}, {1, 0, METATILE_ID(Pacifidlog, SubmergedLogs_Horizontal1)},
{-1, 0, METATILE_ID(Pacifidlog, SubmergedLogs_Horizontal0)}, {0, 0, METATILE_ID(Pacifidlog, SubmergedLogs_Horizontal1)}
};
const struct MetatileOffset gUnknown_083763C4[][2] = {
{{ 0, 0, METATILE_ID(Pacifidlog, FloatingLogs_Vertical0)}, { 0, 1, METATILE_ID(Pacifidlog, FloatingLogs_Vertical1)}},
{{ 0, -1, METATILE_ID(Pacifidlog, FloatingLogs_Vertical0)}, { 0, 0, METATILE_ID(Pacifidlog, FloatingLogs_Vertical1)}},
{{ 0, 0, METATILE_ID(Pacifidlog, FloatingLogs_Horizontal0)}, { 1, 0, METATILE_ID(Pacifidlog, FloatingLogs_Horizontal1)}},
{{ -1, 0, METATILE_ID(Pacifidlog, FloatingLogs_Horizontal0)}, { 0, 0, METATILE_ID(Pacifidlog, FloatingLogs_Horizontal1)}}
const struct MetatileOffset gUnknown_083763C4[] = {
{ 0, 0, METATILE_ID(Pacifidlog, FloatingLogs_Vertical0)}, {0, 1, METATILE_ID(Pacifidlog, FloatingLogs_Vertical1)},
{ 0, -1, METATILE_ID(Pacifidlog, FloatingLogs_Vertical0)}, {0, 0, METATILE_ID(Pacifidlog, FloatingLogs_Vertical1)},
{ 0, 0, METATILE_ID(Pacifidlog, FloatingLogs_Horizontal0)}, {1, 0, METATILE_ID(Pacifidlog, FloatingLogs_Horizontal1)},
{-1, 0, METATILE_ID(Pacifidlog, FloatingLogs_Horizontal0)}, {0, 0, METATILE_ID(Pacifidlog, FloatingLogs_Horizontal1)}
};
void DummyPerStepCallback(u8 taskId) {}
const struct MetatileOffset *sub_80695E0(const struct MetatileOffset a0[][2], s8 a1)
const struct MetatileOffset *sub_80695E0(const struct MetatileOffset *a0, u16 a1)
{
if (MetatileBehavior_IsPacifidlogVerticalLog1(a1))
{
return a0[0];
return &a0[0 * 2];
}
else if (MetatileBehavior_IsPacifidlogVerticalLog2(a1))
{
return a0[1];
return &a0[1 * 2];
}
else if (MetatileBehavior_IsPacifidlogHorizontalLog1(a1))
{
return a0[2];
return &a0[2 * 2];
}
else if (MetatileBehavior_IsPacifidlogHorizontalLog2(a1))
{
return a0[3];
return &a0[3 * 2];
}
else
{
@ -194,95 +194,23 @@ const struct MetatileOffset *sub_80695E0(const struct MetatileOffset a0[][2], s8
}
}
#ifdef NONMATCHING
void sub_8069638(const struct MetatileOffset offsets[][2], s16 x, s16 y, bool32 flag)
void sub_8069638(const struct MetatileOffset *offsets, s16 x, s16 y, bool32 flag)
{
const struct MetatileOffset *offsetData = sub_80695E0(offsets, MapGridGetMetatileBehaviorAt(x, y));
const struct MetatileOffset *offsetdata2 = offsetData;
if (offsetData != NULL)
offsets = sub_80695E0(offsets, MapGridGetMetatileBehaviorAt(x, y));
if (offsets)
{
MapGridSetMetatileIdAt(x + offsetData[0].x, y + offsetData[0].y, offsetData[0].tileId);
MapGridSetMetatileIdAt(x + offsets[0].x, y + offsets[0].y, offsets[0].tileId);
if (flag)
{
CurrentMapDrawMetatileAt(x + offsetData[0].x, y + offsetData[0].y);
CurrentMapDrawMetatileAt(x + offsets[0].x, y + offsets[0].y);
}
MapGridSetMetatileIdAt(x + offsetdata2[1].x, y + offsetdata2[1].y, offsetdata2[1].tileId);
MapGridSetMetatileIdAt(x + offsets[1].x, y + offsets[1].y, offsets[1].tileId);
if (flag)
{
CurrentMapDrawMetatileAt(x + offsetdata2[1].x, y + offsetdata2[1].y);
CurrentMapDrawMetatileAt(x + offsets[1].x, y + offsets[1].y);
}
}
}
#else
NAKED
void sub_8069638(const struct MetatileOffset offsets[][2], s16 x, s16 y, bool32 flag)
{
asm_unified("\tpush {r4-r7,lr}\n"
"\tmov r7, r8\n"
"\tpush {r7}\n"
"\tadds r5, r0, 0\n"
"\tmov r8, r3\n"
"\tlsls r1, 16\n"
"\tasrs r6, r1, 16\n"
"\tlsls r2, 16\n"
"\tasrs r7, r2, 16\n"
"\tadds r0, r6, 0\n"
"\tadds r1, r7, 0\n"
"\tbl MapGridGetMetatileBehaviorAt\n"
"\tadds r1, r0, 0\n"
"\tlsls r1, 16\n"
"\tlsrs r1, 16\n"
"\tadds r0, r5, 0\n"
"\tbl sub_80695E0\n"
"\tadds r4, r0, 0\n"
"\tadds r5, r4, 0\n"
"\tcmp r4, 0\n"
"\tbeq _080696B6\n"
"\tmovs r0, 0\n"
"\tldrsb r0, [r4, r0]\n"
"\tadds r0, r6, r0\n"
"\tmovs r1, 0x1\n"
"\tldrsb r1, [r4, r1]\n"
"\tadds r1, r7, r1\n"
"\tldrh r2, [r4, 0x2]\n"
"\tbl MapGridSetMetatileIdAt\n"
"\tmov r0, r8\n"
"\tcmp r0, 0\n"
"\tbeq _0806968E\n"
"\tmovs r0, 0\n"
"\tldrsb r0, [r4, r0]\n"
"\tadds r0, r6, r0\n"
"\tmovs r1, 0x1\n"
"\tldrsb r1, [r4, r1]\n"
"\tadds r1, r7, r1\n"
"\tbl CurrentMapDrawMetatileAt\n"
"_0806968E:\n"
"\tmovs r0, 0x4\n"
"\tldrsb r0, [r5, r0]\n"
"\tadds r0, r6, r0\n"
"\tmovs r1, 0x5\n"
"\tldrsb r1, [r5, r1]\n"
"\tadds r1, r7, r1\n"
"\tldrh r2, [r5, 0x6]\n"
"\tbl MapGridSetMetatileIdAt\n"
"\tmov r0, r8\n"
"\tcmp r0, 0\n"
"\tbeq _080696B6\n"
"\tmovs r0, 0x4\n"
"\tldrsb r0, [r5, r0]\n"
"\tadds r0, r6, r0\n"
"\tmovs r1, 0x5\n"
"\tldrsb r1, [r5, r1]\n"
"\tadds r1, r7, r1\n"
"\tbl CurrentMapDrawMetatileAt\n"
"_080696B6:\n"
"\tpop {r3}\n"
"\tmov r8, r3\n"
"\tpop {r4-r7}\n"
"\tpop {r0}\n"
"\tbx r0");
}
#endif
void sub_80696C0(s16 x, s16 y, bool32 flag)
{

View File

@ -460,7 +460,7 @@ void MapGridSetMetatileEntryAt(int x, int y, u16 metatile)
}
}
u32 GetBehaviorByMetatileId(u16 metatile)
u16 GetBehaviorByMetatileId(u16 metatile)
{
u16 *attributes;
if (metatile < NUM_METATILES_IN_PRIMARY)

View File

@ -26,7 +26,7 @@ const struct FlashSetupInfo MX29L010 =
0 // appears to be unused
},
{ 3, 1 }, // wait state setup data
#if defined(GERMAN) && defined(SAPPHIRE)
#if (GERMAN && SAPPHIRE && !DEBUG) // OK, why !DEBUG?
{ { 0xBF, 0xD4 } } // ID
#else
{ { 0xC2, 0x09 } } // ID

View File

@ -27,12 +27,11 @@ static void IntrDummy(void);
const u8 gGameVersion = GAME_VERSION;
const u8 gGameLanguage = GAME_LANGUAGE;
// The debug menu expects this exact format. With the English build string, it
// will overflow on the title debug menu, outputting '9999ィ'.
#if defined(GERMAN) || DEBUG
const char BuildDateTime[] = "$Name: debug-Euro-2003-05-09-A $";
#elif defined(ENGLISH)
const char BuildDateTime[] = "2002 10 15 20:34";
// International versions of the debug menu use a different format.
#if defined(ENGLISH)
const u8 BuildDateTime[] = "2002 10 15 20:34";
#elif defined(GERMAN)
const u8 BuildDateTime[] = "$Name: debug-Euro-2003-05-09-A $";
#endif
const IntrFunc gIntrTableTemplate[] =

View File

@ -707,9 +707,6 @@ static void Task_BardSong(u8 taskId)
struct MauvilleManBard *bard = &gSaveBlock1.mauvilleMan.bard;
u8 *str = gStringVar4 + task->tCharIndex;
u16 wordLen = 0;
// Can't get it to match without hacking
u32 temp;
register s16 zero asm("r1");
while (*str != CHAR_SPACE
&& *str != CHAR_NEWLINE
@ -723,17 +720,20 @@ static void Task_BardSong(u8 taskId)
gUnknown_020388BC = MACRO1(bard->songLyrics[task->tCurrWord]);
else
gUnknown_020388BC = MACRO1(bard->temporaryLyrics[task->tCurrWord]);
temp = gUnknown_03005DA0.var04 / wordLen;
zero = 0;
gUnknown_03005DA0.var04 = temp;
gUnknown_03005DA0.var04 /= wordLen;
if (gUnknown_03005DA0.var04 <= 0)
gUnknown_03005DA0.var04 = 1;
task->tCurrWord++;
if (task->data[2] == 0)
{
task->tState = 3;
task->data[1] = 0;
}
else
{
task->tState = 5;
task->data[1] = zero;
task->data[1] = 0;
}
}
break;
case 5:

View File

@ -176,8 +176,32 @@ void sub_80B7AEC(u32 arg0, u8 right, u8 top)
#endif
}
#ifdef NONMATCHING
void Draw10000Sprite(u8 var1, u8 var2, s32 var3)
{
// 2D/3D array manipulation off the wazoo.
// Converting to 2D/3D array casts makes it match less!
u16 i;
CpuFastSet(
(void*)&gDecoration10000_Gfx[var3 * 0x100],
(void*)(VRAM + 0x8000 + (var2 * 0x3c0) + ((var1 + 1) * 0x20)),
32);
CpuFastSet(
(void*)&gDecoration10000_Gfx[var3 * 0x100 + 0x80],
(void*)(VRAM + 0x8000 + ((var2 + 1) * 0x3c0) + ((var1 + 1) * 0x20)),
32);
for (i = 0; i < 4; i++)
{
u32 base = var2 * 0x20 + var1 + i;
((u16 *)(VRAM + 0xF800))[base] = var2 * 0x1e + 1 + var1 + (u16)-4096;
((u16 *)(VRAM + 0xF840))[base] = (var2 + 1) * 0x1e + 1 + var1 + (u16)-4096;
};
}
#else
NAKED
void Draw10000Sprite(u8 var1, u8 var2, int var3)
void Draw10000Sprite(u8 var1, u8 var2, s32 var3)
{
asm(".syntax unified\n\
push {r4-r7,lr}\n\
@ -269,6 +293,7 @@ _080B7BE4: .4byte 0x0600f800\n\
_080B7BE8: .4byte 0x0600f840\n\
.syntax divided\n");
}
#endif
void UpdateMoneyWindow(u32 amount, u8 x, u8 y)
{

View File

@ -1764,6 +1764,8 @@ void CalculateMonStats(struct Pokemon *mon)
}
#if DEBUG
// TODO: check other revisions
#if !(ENGLISH && REVISION == 0)
void Nakamura_NakaGenderTest_RecalcStats(struct Pokemon *mon)
{
s32 currentHP = GetMonData(mon, MON_DATA_HP, NULL);
@ -1809,6 +1811,7 @@ void Nakamura_NakaGenderTest_RecalcStats(struct Pokemon *mon)
SetMonData(mon, MON_DATA_HP, &currentHP);
}
#endif
#endif
void ExpandBoxMon(const struct BoxPokemon *src, struct Pokemon *dest)
{

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1661,16 +1661,31 @@ void Task_Roulette_0(u8 taskid)
#if DEBUG
#if (ENGLISH && REVISION == 0)
static const u8 gUnknown_Debug_0842510D[] = _("コインの かず STARTで きめて\nAーp1 Bーm1 R:Lー×10");
#else
static const u8 gUnknown_Debug_0842510D[] = _("Set COIN and Press START\nAーp1 Bーm1 R:Lー×10");
#endif
void debug_sub_812CDE4(u8 taskId)
{
#if (ENGLISH && REVISION == 0)
u8 coinText[] = {0xFD, 0x02, 0xFF};
#endif
if (gMain.newKeys & A_BUTTON)
{
gTasks[taskId].data[13]++;
if (gTasks[taskId].data[13] == 10000)
gTasks[taskId].data[13] = 0;
ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4);
#if (ENGLISH && REVISION == 0)
StringExpandPlaceholders(gStringVar4, coinText);
Menu_PrintText(gStringVar4, 2, 1);
#else
StringExpandPlaceholders(gStringVar4, gOtherText_Coins);
MenuPrint_RightAligned(gStringVar4, 9, 1);
#endif
}
else if (gMain.newKeys & B_BUTTON)
{
@ -1678,8 +1693,13 @@ void debug_sub_812CDE4(u8 taskId)
if (gTasks[taskId].data[13] == -1)
gTasks[taskId].data[13] = 9999;
ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4);
#if (ENGLISH && REVISION == 0)
StringExpandPlaceholders(gStringVar4, coinText);
Menu_PrintText(gStringVar4, 2, 1);
#else
StringExpandPlaceholders(gStringVar4, gOtherText_Coins);
MenuPrint_RightAligned(gStringVar4, 9, 1);
#endif
}
else if (gMain.newKeys & R_BUTTON)
{
@ -1687,8 +1707,13 @@ void debug_sub_812CDE4(u8 taskId)
if (gTasks[taskId].data[13] > 9999)
gTasks[taskId].data[13] -= 9999;
ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4);
#if (ENGLISH && REVISION == 0)
StringExpandPlaceholders(gStringVar4, coinText);
Menu_PrintText(gStringVar4, 2, 1);
#else
StringExpandPlaceholders(gStringVar4, gOtherText_Coins);
MenuPrint_RightAligned(gStringVar4, 9, 1);
#endif
}
else if (gMain.newKeys & L_BUTTON)
{
@ -1696,16 +1721,26 @@ void debug_sub_812CDE4(u8 taskId)
if (gTasks[taskId].data[13] < 0)
gTasks[taskId].data[13] += 9999;
ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4);
#if (ENGLISH && REVISION == 0)
StringExpandPlaceholders(gStringVar4, coinText);
Menu_PrintText(gStringVar4, 2, 1);
#else
StringExpandPlaceholders(gStringVar4, gOtherText_Coins);
MenuPrint_RightAligned(gStringVar4, 9, 1);
#endif
}
else if (gMain.newKeys & START_BUTTON)
{
gSaveBlock1.coins = gTasks[taskId].data[13];
gTasks[taskId].func = Task_Roulette_0;
ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4);
#if (ENGLISH && REVISION == 0)
StringExpandPlaceholders(gStringVar4, coinText);
Menu_PrintText(gStringVar4, 2, 1);
#else
StringExpandPlaceholders(gStringVar4, gOtherText_Coins);
MenuPrint_RightAligned(gStringVar4, 9, 1);
#endif
unk_2039560 = 0;
}
else if (gMain.newKeys & SELECT_BUTTON)
@ -1713,22 +1748,30 @@ void debug_sub_812CDE4(u8 taskId)
gSaveBlock1.coins = gTasks[taskId].data[13];
gTasks[taskId].func = Task_Roulette_0;
ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4);
#if (ENGLISH && REVISION == 0)
StringExpandPlaceholders(gStringVar4, coinText);
Menu_PrintText(gStringVar4, 2, 1);
#else
StringExpandPlaceholders(gStringVar4, gOtherText_Coins);
MenuPrint_RightAligned(gStringVar4, 9, 1);
#endif
unk_2039560 = 1;
}
}
void debug_sub_812CFE8(u8 taskId)
{
static const u8 gUnknown_Debug_0842510D[] = _("Set COIN and Press START\nAーp1 Bーm1 R:Lー×10");
gTasks[taskId].data[13] = gSaveBlock1.coins;
if (Random() & 1)
gSpecialVar_0x8004 |= 128;
ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].data[13], 1, 4);
StringExpandPlaceholders(gStringVar4, gOtherText_Coins);
Menu_DrawStdWindowFrame(0, 0, 9, 3);
#if (ENGLISH && REVISION == 0)
Menu_PrintText(gStringVar4, 2, 1);
#else
MenuPrint_RightAligned(gStringVar4, 9, 1);
#endif
Menu_DrawStdWindowFrame(0, 14, 29, 19);
Menu_PrintText(gUnknown_Debug_0842510D, 1, 15);
gTasks[taskId].func = debug_sub_812CDE4;

View File

@ -1626,32 +1626,33 @@ void sub_81193D4(struct Sprite *sprite)
eRoulette->var38 = sprite;
}
#ifdef NONMATCHING
void sub_811952C(struct Sprite *sprite)
{
u8 i;
u8 z;
u16 o;
u8 h = 0; // r10 (sp+12)
u8 j = 5; // r9 (r9)
u8 p = 0; // sp+12 (sp+16)
u8 s[10] = {}; // sp+0 (sp+0)
u16 t = Random(); // sp+16 (r10)
u8 h = 0;
u8 j = 5;
u8 p = 0;
u8 i = 0;
u8 val;
u8 s[10] = {};
u16 rand = Random();
eRoulette->var7D = 1;
eRoulette->var7D = 1;
eRoulette->var03_5 = TRUE;
eRoulette->var03_6 = FALSE;
eRoulette->var7E = 255;
eRoulette->var88 = sprite->data[3];
eRoulette->var98 = 0.0f;
eRoulette->var8C = gUnknown_083F8DF4[eRoulette->var04_0].var1C;
o = (eRoulette->var04_0 * 30 + 33) + (1 - eRoulette->var03_0) * 15;
eRoulette->var7E = 0xFF;
eRoulette->var88 = sprite->data[3];
eRoulette->var98 = 0.0f;
eRoulette->var8C = gUnknown_083F8DF4[eRoulette->var04_0].var1C;
o = (eRoulette->var04_0 * 30 + 33) + (0x1 - eRoulette->var03_0) * 15;
for (i = 0; i < 4; i++)
{
if (o < sprite->data[3] && sprite->data[3] <= o + 90)
{
sprite->data[0] = i << 1;
eRoulette->var03_0 = i & 1;
sprite->data[0] = i / 2;
eRoulette->var03_0 = i % 2;
break;
}
if (i == 3)
@ -1662,358 +1663,52 @@ void sub_811952C(struct Sprite *sprite)
}
o += 90;
}
if (eRoulette->var03_0)
{
if (sprite->data[0])
{
PlayCry1(SPECIES_TAILLOW, -63);
}
else
{
PlayCry1(SPECIES_TAILLOW, 63);
}
}
else
{
PlayCry1(SPECIES_SHROOMISH, -63);
}
i = 2;
val = 2;
z = (eRoulette->var7F + 2) % 12;
if (eRoulette->var03_0 == 1 && eRoulette->var04_0 == 1)
j += 6;
else
j += i;
for (; i < j; i++)
j += val;
for (i = val; i < j; i++)
{
if (!(eRoulette->var08 & gUnknown_083F8D90[z].var04))
{
s[h++] = i;
if (!p && (gUnknown_083F8D90[z].var04 & gUnknown_083F8C00[eRoulette->var1B[eRoulette->var1A_0]].var00))
{
if (p == 0 && (gUnknown_083F8D90[z].var04 & gUnknown_083F8C00[eRoulette->var1B[eRoulette->var1A_0]].var0C))
p = i;
}
}
z = (z + 1) % 12;
z = (z + 1) % 0xC;
}
if ((eRoulette->var03_0 + 1) & eRoulette->var02)
{
if (p && (t & 0xFF) < 192)
{
if (p && (rand & 0xFF) < 0xc0)
sprite->data[7] = p;
}
else
{
sprite->data[7] = s[t % h];
}
sprite->data[7] = s[rand % h];
}
else
{
sprite->data[7] = s[t % h];
sprite->data[7] = s[rand % h];
}
sprite->callback = sub_8118CEC;
}
#else
NAKED
void sub_811952C(struct Sprite *sprite)
{
asm_unified("push {r4-r7,lr}\n"
"\tmov r7, r10\n"
"\tmov r6, r9\n"
"\tmov r5, r8\n"
"\tpush {r5-r7}\n"
"\tsub sp, 20\n"
"\tmov r8, r0\n"
"\tmovs r0, 0\n"
"\tmov r10, r0\n"
"\tmovs r1, 5\n"
"\tmov r9, r1\n"
"\tmovs r2, 0\n"
"\tstr r2, [sp, 12]\n"
"\tmov r0, sp\n"
"\tmovs r1, 0\n"
"\tmovs r2, 10\n"
"\tbl memset\n"
"\tbl Random\n"
"\tlsls r0, 16\n"
"\tlsrs r0, 16\n"
"\tstr r0, [sp, 16]\n"
"\tldr r7, _08119610 @ =gSharedMem + 0x19000\n"
"\tadds r0, r7, 0\n"
"\tadds r0, 125\n"
"\tmovs r6, 1\n"
"\tstrb r6, [r0]\n"
"\tldrb r4, [r7, 3]\n"
"\tmovs r0, 32\n"
"\torrs r4, r0\n"
"\tmovs r0, 65\n"
"\tnegs r0, r0\n"
"\tands r4, r0\n"
"\tstrb r4, [r7, 3]\n"
"\tadds r1, r7, 0\n"
"\tadds r1, 126\n"
"\tmovs r0, 255\n"
"\tstrb r0, [r1]\n"
"\tadds r5, r7, 0\n"
"\tadds r5, 136\n"
"\tmov r3, r8\n"
"\tmovs r1, 52\n"
"\tldrsh r0, [r3, r1]\n"
"\tbl __floatsisf\n"
"\tstr r0, [r5]\n"
"\tadds r1, r7, 0\n"
"\tadds r1, 152\n"
"\tldr r0, _08119614 @ =0\n"
"\tstr r0, [r1]\n"
"\tadds r3, r7, 0\n"
"\tadds r3, 140\n"
"\tldr r2, _08119618 @ =gUnknown_083F8DF4\n"
"\tldrb r0, [r7, 4]\n"
"\tlsls r0, 30\n"
"\tlsrs r1, r0, 25\n"
"\tadds r2, 28\n"
"\tadds r1, r2\n"
"\tldr r1, [r1]\n"
"\tstr r1, [r3]\n"
"\tlsrs r0, 30\n"
"\tlsls r1, r0, 4\n"
"\tsubs r1, r0\n"
"\tlsls r1, 1\n"
"\tadds r1, 33\n"
"\tlsls r4, 27\n"
"\tlsrs r4, 27\n"
"\tsubs r6, r4\n"
"\tlsls r0, r6, 4\n"
"\tsubs r0, r6\n"
"\tadds r1, r0\n"
"\tlsls r1, 16\n"
"\tlsrs r1, 16\n"
"\tmov r5, r10\n"
"\tmov r3, r8\n"
"\tmovs r0, 52\n"
"\tldrsh r2, [r3, r0]\n"
"_081195C8:\n"
"\tcmp r1, r2\n"
"\tbge _081195D4\n"
"\tadds r0, r1, 0\n"
"\tadds r0, 90\n"
"\tcmp r2, r0\n"
"\tble _08119638\n"
"_081195D4:\n"
"\tcmp r5, 3\n"
"\tbeq _0811961C\n"
"\tadds r0, r1, 0\n"
"\tadds r0, 90\n"
"\tlsls r0, 16\n"
"\tlsrs r1, r0, 16\n"
"\tadds r0, r5, 1\n"
"\tlsls r0, 24\n"
"\tlsrs r5, r0, 24\n"
"\tcmp r5, 3\n"
"\tbls _081195C8\n"
"_081195EA:\n"
"\tldr r0, _08119610 @ =gSharedMem + 0x19000\n"
"\tldrb r1, [r0, 3]\n"
"\tmovs r0, 31\n"
"\tands r0, r1\n"
"\tcmp r0, 0\n"
"\tbeq _08119664\n"
"\tmov r1, r8\n"
"\tmovs r2, 46\n"
"\tldrsh r0, [r1, r2]\n"
"\tcmp r0, 0\n"
"\tbeq _08119658\n"
"\tmovs r0, 152\n"
"\tlsls r0, 1\n"
"\tmovs r1, 63\n"
"\tnegs r1, r1\n"
"\tbl PlayCry1\n"
"\tb _08119670\n"
"\t.align 2, 0\n"
"_08119610: .4byte gSharedMem + 0x19000\n"
"_08119614: .4byte 0\n"
"_08119618: .4byte gUnknown_083F8DF4\n"
"_0811961C:\n"
"\tmovs r0, 1\n"
"\tmov r3, r8\n"
"\tstrh r0, [r3, 46]\n"
"\tldr r2, _08119634 @ =gSharedMem + 0x19000\n"
"\tldrb r1, [r2, 3]\n"
"\tsubs r0, 33\n"
"\tands r0, r1\n"
"\tmovs r1, 1\n"
"\torrs r0, r1\n"
"\tstrb r0, [r2, 3]\n"
"\tb _081195EA\n"
"\t.align 2, 0\n"
"_08119634: .4byte gSharedMem + 0x19000\n"
"_08119638:\n"
"\tlsrs r0, r5, 1\n"
"\tmov r1, r8\n"
"\tstrh r0, [r1, 46]\n"
"\tldr r3, _08119654 @ =gSharedMem + 0x19000\n"
"\tmovs r1, 1\n"
"\tands r1, r5\n"
"\tldrb r2, [r3, 3]\n"
"\tmovs r0, 32\n"
"\tnegs r0, r0\n"
"\tands r0, r2\n"
"\torrs r0, r1\n"
"\tstrb r0, [r3, 3]\n"
"\tb _081195EA\n"
"\t.align 2, 0\n"
"_08119654: .4byte gSharedMem + 0x19000\n"
"_08119658:\n"
"\tmovs r0, 152\n"
"\tlsls r0, 1\n"
"\tmovs r1, 63\n"
"\tbl PlayCry1\n"
"\tb _08119670\n"
"_08119664:\n"
"\tmovs r0, 153\n"
"\tlsls r0, 1\n"
"\tmovs r1, 63\n"
"\tnegs r1, r1\n"
"\tbl PlayCry1\n"
"_08119670:\n"
"\tmovs r5, 2\n"
"\tldr r4, _081196A0 @ =gSharedMem + 0x19000\n"
"\tadds r0, r4, 0\n"
"\tadds r0, 127\n"
"\tldrb r0, [r0]\n"
"\tadds r0, 2\n"
"\tmovs r1, 12\n"
"\tbl __modsi3\n"
"\tlsls r0, 24\n"
"\tlsrs r3, r0, 24\n"
"\tldrb r1, [r4, 3]\n"
"\tmovs r0, 31\n"
"\tands r0, r1\n"
"\tcmp r0, 1\n"
"\tbne _081196A4\n"
"\tldrb r1, [r4, 4]\n"
"\tmovs r0, 3\n"
"\tands r0, r1\n"
"\tcmp r0, 1\n"
"\tbne _081196A4\n"
"\tmov r0, r9\n"
"\tadds r0, 6\n"
"\tb _081196A8\n"
"\t.align 2, 0\n"
"_081196A0: .4byte gSharedMem + 0x19000\n"
"_081196A4:\n"
"\tmov r2, r9\n"
"\tadds r0, r2, r5\n"
"_081196A8:\n"
"\tlsls r0, 24\n"
"\tlsrs r0, 24\n"
"\tmov r9, r0\n"
"\tcmp r5, r9\n"
"\tbcs _0811970E\n"
"\tldr r6, _08119734 @ =gSharedMem + 0x19000\n"
"\tldr r7, _08119738 @ =gUnknown_083F8C00 + 12\n"
"_081196B6:\n"
"\tlsls r0, r3, 3\n"
"\tldr r1, _0811973C @ =gUnknown_083F8D90 + 4\n"
"\tadds r0, r1\n"
"\tldr r1, [r6, 8]\n"
"\tldr r2, [r0]\n"
"\tands r1, r2\n"
"\tcmp r1, 0\n"
"\tbne _081196F8\n"
"\tmov r0, r10\n"
"\tadds r1, r0, 1\n"
"\tlsls r1, 24\n"
"\tlsrs r1, 24\n"
"\tmov r10, r1\n"
"\tadd r0, sp\n"
"\tstrb r5, [r0]\n"
"\tldr r0, [sp, 12]\n"
"\tcmp r0, 0\n"
"\tbne _081196F8\n"
"\tldrb r0, [r6, 26]\n"
"\tlsls r0, 28\n"
"\tlsrs r0, 28\n"
"\tldr r1, _08119740 @ =gSharedMem + 0x1901b\n"
"\tadds r0, r1\n"
"\tldrb r1, [r0]\n"
"\tlsls r0, r1, 2\n"
"\tadds r0, r1\n"
"\tlsls r0, 2\n"
"\tadds r0, r7\n"
"\tldr r0, [r0]\n"
"\tands r2, r0\n"
"\tcmp r2, 0\n"
"\tbeq _081196F8\n"
"\tstr r5, [sp, 12]\n"
"_081196F8:\n"
"\tadds r0, r3, 1\n"
"\tmovs r1, 12\n"
"\tbl __modsi3\n"
"\tlsls r0, 24\n"
"\tlsrs r3, r0, 24\n"
"\tadds r0, r5, 1\n"
"\tlsls r0, 24\n"
"\tlsrs r5, r0, 24\n"
"\tcmp r5, r9\n"
"\tbcc _081196B6\n"
"_0811970E:\n"
"\tldrb r0, [r4, 3]\n"
"\tlsls r0, 27\n"
"\tlsrs r0, 27\n"
"\tadds r0, 1\n"
"\tldrb r1, [r4, 2]\n"
"\tands r0, r1\n"
"\tcmp r0, 0\n"
"\tbeq _08119756\n"
"\tldr r2, [sp, 12]\n"
"\tcmp r2, 0\n"
"\tbeq _08119744\n"
"\tmovs r0, 255\n"
"\tldr r3, [sp, 16]\n"
"\tands r0, r3\n"
"\tcmp r0, 191\n"
"\tbhi _08119744\n"
"\tmov r0, r8\n"
"\tstrh r2, [r0, 60]\n"
"\tb _08119766\n"
"\t.align 2, 0\n"
"_08119734: .4byte gSharedMem + 0x19000\n"
"_08119738: .4byte gUnknown_083F8C00 + 12\n"
"_0811973C: .4byte gUnknown_083F8D90 + 4\n"
"_08119740: .4byte gSharedMem + 0x1901b\n"
"_08119744:\n"
"\tldr r0, [sp, 16]\n"
"\tmov r1, r10\n"
"\tbl __modsi3\n"
"\tadd r0, sp\n"
"\tldrb r0, [r0]\n"
"\tmov r1, r8\n"
"\tstrh r0, [r1, 60]\n"
"\tb _08119766\n"
"_08119756:\n"
"\tldr r0, [sp, 16]\n"
"\tmov r1, r10\n"
"\tbl __modsi3\n"
"\tadd r0, sp\n"
"\tldrb r0, [r0]\n"
"\tmov r2, r8\n"
"\tstrh r0, [r2, 60]\n"
"_08119766:\n"
"\tldr r3, _0811977C @ =sub_8118CEC\n"
"\tmov r0, r8\n"
"\tstr r3, [r0, 28]\n"
"\tadd sp, 20\n"
"\tpop {r3-r5}\n"
"\tmov r8, r3\n"
"\tmov r9, r4\n"
"\tmov r10, r5\n"
"\tpop {r4-r7}\n"
"\tpop {r0}\n"
"\tbx r0\n"
"\t.align 2, 0\n"
"_0811977C: .4byte sub_8118CEC");
}
#endif
const u16 gUnknown_083FA61E[] = {
BLDALPHA_BLEND( 7, 9),

View File

@ -738,7 +738,7 @@ u8 Save_WriteDataInternal(u8 saveType)
return 0;
}
#if DEBUG
#if (DEBUG && GERMAN)
extern u32 gUnknown_Debug_03004BD0;
#endif
@ -749,7 +749,7 @@ u8 Save_WriteData(u8 saveType) // TrySave
Save_WriteDataInternal(saveType);
if (!gDamagedSaveSectors
#if DEBUG
#if (DEBUG && GERMAN)
&& gUnknown_Debug_03004BD0 == 0
#endif
)

View File

@ -155,7 +155,7 @@ static void CB2_WipeSave(void)
gSaveFailedClockInfo[0] = TRUE;
#if DEBUG
#if (DEBUG && !(ENGLISH && REVISION == 0))
if (gUnknown_Debug_03004BD0 != 0)
gDamagedSaveSectors = 1;
#endif
@ -277,7 +277,7 @@ static bool8 IsSectorNonEmpty(u16 sector)
ReadFlash(sector, 0, ptr, 4096);
#if DEBUG // Don't verify the sector wipe?
#if (DEBUG && !(ENGLISH && REVISION == 0)) // Don't verify the sector wipe?
for (i = 0; i < 0x400; i++, ptr++)
;
return gUnknown_Debug_03004BD0;

View File

@ -872,7 +872,11 @@ void sub_80BC6B0(u8 taskId)
Menu_PrintText(gOtherText_Exit, 18, 2 * n + 2);
DestroyVerticalScrollIndicator(BOTTOM_ARROW);
if (n != 7)
Menu_BlankWindowRect(18, ((n << 25) + (1 << 26)) >> 24, 28, 18); // the shifts are needed to match
{
n++;
n--;
Menu_BlankWindowRect(18, n * 2 + 4, 28, 18);
}
}
else
{

View File

@ -5677,7 +5677,7 @@ void debug_sub_811B310(void)
PRINT_NUMBER(eSlotMachine->unk6C, 10, 5);
PRINT_NUMBER(eSlotMachine->unk10, 10, 7);
#if DEBUG_TRANSLATE
#if DEBUG_FIX
#define OFFSET 24 // wider window
#else
#define OFFSET 20
@ -5785,7 +5785,7 @@ static void debug_sub_811B654(u8 taskId)
switch (task->data[0])
{
case 0:
#if DEBUG_TRANSLATE
#if DEBUG_FIX
Menu_DrawStdWindowFrame(0, 0, 28, 19); // wider window
#else
Menu_DrawStdWindowFrame(0, 0, 24, 19);

View File

@ -6,6 +6,7 @@
#include "constants/songs.h"
#include "sound.h"
#include "string_util.h"
#include "start_menu.h"
enum
{
@ -2078,7 +2079,7 @@ static u8 sub_8002FA0(struct Window *win, const u8 *text)
static u8 PrintNextChar(struct Window *win)
{
u8 c = win->text[win->textIndex++];
u32 c = win->text[win->textIndex++];
// Handle special control characters
switch (c)
@ -2106,6 +2107,12 @@ static u8 PrintNextChar(struct Window *win)
return HandleExtCtrlCode(win);
}
// TODO: see if this is in rev1+
#if (DEBUG && ENGLISH && REVISION == 0)
// Code related to the Murakawa task.
if ((gUnknown_Debug_03004BD0) && (!gUnknown_Debug_Murakawa2))
c = win->textMode + CHAR_0;
#endif
sPrintGlyphFuncs[win->textMode](win, c);
return 1;
}

View File

@ -454,46 +454,38 @@ const u8 gTradeMonSpriteCoords[][2] = {
{23, 18} // CANCEL
};
const u8 gTradeLevelDisplayCoords[2][6][2] = {
{
// Your party
{5, 4},
{12, 4},
{5, 9},
{12, 9},
{5, 14},
{12, 14},
},
{
// Friend's party
{20, 4},
{27, 4},
{20, 9},
{27, 9},
{20, 14},
{27, 14}
}
const u8 gTradeLevelDisplayCoords[][2] = {
// Your party
{5, 4},
{12, 4},
{5, 9},
{12, 9},
{5, 14},
{12, 14},
// Friend's party
{20, 4},
{27, 4},
{20, 9},
{27, 9},
{20, 14},
{27, 14}
};
const u8 gTradeMonBoxCoords[2][6][2] = {
{
// Your party
{1, 3},
{8, 3},
{1, 8},
{8, 8},
{1, 13},
{8, 13},
},
{
// Friend's party
{16, 3},
{23, 3},
{16, 8},
{23, 8},
{16, 13},
{23, 13}
}
const u8 gTradeMonBoxCoords[][2] = {
// Your party
{1, 3},
{8, 3},
{1, 8},
{8, 8},
{1, 13},
{8, 13},
// Friend's party
{16, 3},
{23, 3},
{16, 8},
{23, 8},
{16, 13},
{23, 13}
};
const u8 gTradeUnknownSpriteCoords[][2][2] = {
@ -3054,71 +3046,15 @@ void sub_804A51C(u8 a0, u8 a1, u8 a2, u8 a3, u8 a4, u8 a5)
#endif
}
// simple nonmatching, supposedly from a CSE optimization
#ifdef NONMATCHING
static void sub_804A6DC(u8 whichParty)
{
int i;
for (i = 0; i < gUnknown_03004824->partyCounts[whichParty]; i ++)
for (i = 0; i < gUnknown_03004824->partyCounts[whichParty]; i++)
{
sub_804A51C(whichParty, i, gTradeLevelDisplayCoords[whichParty][i][0], gTradeLevelDisplayCoords[whichParty][i][1], gTradeMonBoxCoords[whichParty][i][0], gTradeMonBoxCoords[whichParty][i][1]);
int loc = i + whichParty * 6;
sub_804A51C(whichParty, i, gTradeLevelDisplayCoords[loc][0], gTradeLevelDisplayCoords[loc][1], gTradeMonBoxCoords[loc][0], gTradeMonBoxCoords[loc][1]);
}
}
#else
NAKED
static void sub_804A6DC(u8 whichParty)
{
asm_unified("\tpush {r4-r7,lr}\n"
"\tsub sp, 0x8\n"
"\tlsls r0, 24\n"
"\tlsrs r6, r0, 24\n"
"\tmovs r7, 0\n"
"\tldr r0, _0804A734 @ =gUnknown_03004824\n"
"\tldr r0, [r0]\n"
"\tadds r0, 0x42\n"
"\tadds r0, r6\n"
"\tldrb r0, [r0]\n"
"\tcmp r7, r0\n"
"\tbge _0804A72C\n"
"\tlsls r0, r6, 1\n"
"\tadds r0, r6\n"
"\tldr r1, _0804A738 @ =gTradeLevelDisplayCoords\n"
"\tlsls r0, 2\n"
"\tadds r5, r0, r1\n"
"\tldr r1, _0804A73C @ =gTradeMonBoxCoords\n"
"\tadds r4, r0, r1\n"
"_0804A702:\n"
"\tlsls r1, r7, 24\n"
"\tlsrs r1, 24\n"
"\tldrb r2, [r5]\n"
"\tldrb r3, [r5, 0x1]\n"
"\tldrb r0, [r4]\n"
"\tstr r0, [sp]\n"
"\tldrb r0, [r4, 0x1]\n"
"\tstr r0, [sp, 0x4]\n"
"\tadds r0, r6, 0\n"
"\tbl sub_804A51C\n"
"\tadds r5, 0x2\n"
"\tadds r4, 0x2\n"
"\tadds r7, 0x1\n"
"\tldr r0, _0804A734 @ =gUnknown_03004824\n"
"\tldr r0, [r0]\n"
"\tadds r0, 0x42\n"
"\tadds r0, r6\n"
"\tldrb r0, [r0]\n"
"\tcmp r7, r0\n"
"\tblt _0804A702\n"
"_0804A72C:\n"
"\tadd sp, 0x8\n"
"\tpop {r4-r7}\n"
"\tpop {r0}\n"
"\tbx r0\n"
"\t.align 2, 0\n"
"_0804A734: .4byte gUnknown_03004824\n"
"_0804A738: .4byte gTradeLevelDisplayCoords\n"
"_0804A73C: .4byte gTradeMonBoxCoords");
}
#endif
static void sub_804A740(u8 whichParty)
{
@ -3495,68 +3431,31 @@ static void sub_804B128(void)
REG_BG2Y = dest.dy;
}
// register swap with volatile, wtf !how
#ifdef NONMATCHING
static void sub_804B1BC(void)
{
REG_BG1VOFS = gUnknown_03004828->bg1vofs, REG_BG1HOFS = gUnknown_03004828->bg1hofs;
//temp = ;
//asm(""::"r"(gUnknown_03004828->bg2vofs));
if (REG_DISPCNT % 8 == 0)
u16 dispcnt;
REG_BG1VOFS = gUnknown_03004828->bg1vofs;
REG_BG1HOFS = gUnknown_03004828->bg1hofs;
/*
A u16 cast allows for REG_DISPCNT storage to be swapped.
This is required for the function to match.
You can see this less obfuscated in FireRed and Emerald,
since they use gflib's GPU manager for this instead.
*/
dispcnt = (*(u16 *)REG_ADDR_DISPCNT);
if ((dispcnt & 7) == DISPCNT_MODE_0)
{
REG_BG2VOFS = gUnknown_03004828->bg2vofs, REG_BG2HOFS = gUnknown_03004828->bg2hofs;
REG_BG2VOFS = gUnknown_03004828->bg2vofs;
REG_BG2HOFS = gUnknown_03004828->bg2hofs;
}
else
{
sub_804B128();
}
}
#else
NAKED static void sub_804B1BC(void)
{
asm_unified("\tpush {lr}\n"
"\tldr r1, _0804B1FC @ =REG_BG1VOFS\n"
"\tldr r0, _0804B200 @ =gUnknown_03004828\n"
"\tldr r2, [r0]\n"
"\tmovs r3, 0x88\n"
"\tlsls r3, 1\n"
"\tadds r0, r2, r3\n"
"\tldrh r0, [r0]\n"
"\tstrh r0, [r1]\n"
"\tsubs r1, 0x2\n"
"\tadds r3, 0x2\n"
"\tadds r0, r2, r3\n"
"\tldrh r0, [r0]\n"
"\tstrh r0, [r1]\n"
"\tmovs r0, 0x80\n"
"\tlsls r0, 19\n"
"\tldrh r0, [r0]\n"
"\tmovs r1, 0x7\n"
"\tands r0, r1\n"
"\tcmp r0, 0\n"
"\tbne _0804B208\n"
"\tldr r1, _0804B204 @ =REG_BG2VOFS\n"
"\tadds r3, 0x2\n"
"\tadds r0, r2, r3\n"
"\tldrh r0, [r0]\n"
"\tstrh r0, [r1]\n"
"\tsubs r1, 0x2\n"
"\tadds r3, 0x2\n"
"\tadds r0, r2, r3\n"
"\tldrh r0, [r0]\n"
"\tstrh r0, [r1]\n"
"\tb _0804B20C\n"
"\t.align 2, 0\n"
"_0804B1FC: .4byte REG_BG1VOFS\n"
"_0804B200: .4byte gUnknown_03004828\n"
"_0804B204: .4byte REG_BG2VOFS\n"
"_0804B208:\n"
"\tbl sub_804B128\n"
"_0804B20C:\n"
"\tpop {r0}\n"
"\tbx r0");
}
#endif
static void sub_804B210(void)
{

View File

@ -816,19 +816,12 @@ bool8 TrainerCard_InitFlipAnimation(struct Task *task)
return FALSE;
}
/*
bool8 TrainerCard_ScaleDownFlipAnimation(struct Task *task)
{
u32 r7;
u16 r9;
u32 r6;
u32 r5;
u32 r4;
u32 r10;
u32 sp0;
s16 i;
u32 r4, r5, r10, r7, r6, var_24, r9, var;
ewram0_2.var_4 = 0;
ewram0_2.var_4 = FALSE;
task->data[1] += 3;
if (task->data[1] > 79)
task->data[1] = 79;
@ -837,183 +830,33 @@ bool8 TrainerCard_ScaleDownFlipAnimation(struct Task *task)
r9 = 160 - r7;
r4 = r9 - r7;
r6 = -r7 << 16;
r5 = (160 << 16) / r4;
r5 -= 1 << 16;
r10 = r5 * r4 + r6;
sp0 = r5 / r4;
r5 = 0xA00000 / r4;
r5 += 0xFFFF0000;
var_24 = r6 + r5 * r4;
r10 = r5 / r4;
r5 *= 2;
for (i = 0; i < r7; i++)
for (i = 0; i < r7;
// WHAT?!
gScanlineEffectRegBuffers[0][i] = (u32)-i + -4,
i++);
for (; i < (s16)r9; i++)
{
gScanlineEffectRegBuffers.filler0[i] = -4 - (u32)i;
}
//_08093B74
for (; i < r9; i++)
{
u16 var = r6 >> 16;
var = r6 >> 16;
r6 += r5;
r5 -= sp0;
gScanlineEffectRegBuffers.filler0[i] = -4 + var;
r5 -= r10;
gScanlineEffectRegBuffers[0][i] = var + -4;
}
for (; i < 160; i++)
gScanlineEffectRegBuffers.filler0[i] = -4 + (u16)(r10 >> 16);
ewram0_2.var_4 = 1;
if (task->data[1] > 0x4A)
task->data[0]++;
return FALSE;
}
*/
for (var = var_24 >> 16; i < 160;
// WHAT?!
gScanlineEffectRegBuffers[0][i] = var + -4,
i++);
NAKED
bool8 TrainerCard_ScaleDownFlipAnimation(struct Task *task)
{
asm(".syntax unified\n\
push {r4-r7,lr}\n\
mov r7, r10\n\
mov r6, r9\n\
mov r5, r8\n\
push {r5-r7}\n\
sub sp, 0x4\n\
mov r8, r0\n\
ldr r1, _08093BFC @ =gSharedMem\n\
movs r0, 0\n\
strb r0, [r1, 0x4]\n\
mov r2, r8\n\
ldrh r0, [r2, 0xA]\n\
adds r0, 0x3\n\
strh r0, [r2, 0xA]\n\
lsls r0, 16\n\
asrs r0, 16\n\
cmp r0, 0x4F\n\
ble _08093B18\n\
movs r0, 0x4F\n\
strh r0, [r2, 0xA]\n\
_08093B18:\n\
mov r4, r8\n\
movs r0, 0xA\n\
ldrsh r7, [r4, r0]\n\
movs r0, 0xA0\n\
subs r0, r7\n\
mov r9, r0\n\
subs r4, r0, r7\n\
negs r0, r7\n\
lsls r6, r0, 16\n\
movs r0, 0xA0\n\
lsls r0, 16\n\
adds r1, r4, 0\n\
bl __udivsi3\n\
adds r5, r0, 0\n\
ldr r1, _08093C00 @ =0xffff0000\n\
adds r5, r1\n\
adds r0, r5, 0\n\
muls r0, r4\n\
adds r0, r6\n\
mov r10, r0\n\
adds r0, r5, 0\n\
adds r1, r4, 0\n\
bl __udivsi3\n\
str r0, [sp]\n\
lsls r5, 1\n\
movs r3, 0\n\
cmp r3, r7\n\
bcs _08093B74\n\
ldr r2, _08093C04 @ =gScanlineEffectRegBuffers\n\
mov r12, r2\n\
ldr r0, _08093C08 @ =0x0000fffc\n\
adds r4, r0, 0\n\
_08093B5C:\n\
lsls r0, r3, 16\n\
asrs r0, 16\n\
lsls r1, r0, 1\n\
add r1, r12\n\
subs r2, r4, r0\n\
strh r2, [r1]\n\
adds r0, 0x1\n\
lsls r0, 16\n\
lsrs r3, r0, 16\n\
asrs r0, 16\n\
cmp r0, r7\n\
bcc _08093B5C\n\
_08093B74:\n\
lsls r2, r3, 16\n\
mov r1, r9\n\
lsls r0, r1, 16\n\
asrs r1, r0, 16\n\
mov r4, r10\n\
lsrs r7, r4, 16\n\
cmp r2, r0\n\
bge _08093BAE\n\
ldr r0, _08093C04 @ =gScanlineEffectRegBuffers\n\
mov r9, r0\n\
ldr r4, _08093C08 @ =0x0000fffc\n\
mov r12, r4\n\
adds r4, r1, 0\n\
_08093B8E:\n\
lsrs r1, r6, 16\n\
adds r6, r5\n\
ldr r0, [sp]\n\
subs r5, r0\n\
asrs r2, 16\n\
lsls r0, r2, 1\n\
add r0, r9\n\
add r1, r12\n\
strh r1, [r0]\n\
adds r2, 0x1\n\
lsls r2, 16\n\
lsrs r3, r2, 16\n\
lsls r2, r3, 16\n\
asrs r0, r2, 16\n\
cmp r0, r4\n\
blt _08093B8E\n\
_08093BAE:\n\
adds r1, r7, 0\n\
lsls r0, r3, 16\n\
asrs r0, 16\n\
cmp r0, 0x9F\n\
bgt _08093BD4\n\
ldr r4, _08093C04 @ =gScanlineEffectRegBuffers\n\
ldr r0, _08093C08 @ =0x0000fffc\n\
adds r2, r1, r0\n\
_08093BBE:\n\
lsls r1, r3, 16\n\
asrs r1, 16\n\
lsls r0, r1, 1\n\
adds r0, r4\n\
strh r2, [r0]\n\
adds r1, 0x1\n\
lsls r1, 16\n\
lsrs r3, r1, 16\n\
asrs r1, 16\n\
cmp r1, 0x9F\n\
ble _08093BBE\n\
_08093BD4:\n\
movs r0, 0x1\n\
ldr r1, _08093BFC @ =gSharedMem\n\
strb r0, [r1, 0x4]\n\
mov r2, r8\n\
movs r4, 0xA\n\
ldrsh r0, [r2, r4]\n\
cmp r0, 0x4A\n\
ble _08093BEA\n\
ldrh r0, [r2, 0x8]\n\
adds r0, 0x1\n\
strh r0, [r2, 0x8]\n\
_08093BEA:\n\
movs r0, 0\n\
add sp, 0x4\n\
pop {r3-r5}\n\
mov r8, r3\n\
mov r9, r4\n\
mov r10, r5\n\
pop {r4-r7}\n\
pop {r1}\n\
bx r1\n\
.align 2, 0\n\
_08093BFC: .4byte gSharedMem\n\
_08093C00: .4byte 0xffff0000\n\
_08093C04: .4byte gScanlineEffectRegBuffers\n\
_08093C08: .4byte 0x0000fffc\n\
.syntax divided\n");
ewram0_2.var_4 = TRUE;
if (task->data[1] > 74)
task->data[0]++;
return FALSE;
}
bool8 TrainerCard_SwitchToNewSide(struct Task *task)
@ -1028,154 +871,47 @@ bool8 TrainerCard_SwitchToNewSide(struct Task *task)
return TRUE;
}
NAKED
bool8 TrainerCard_ScaleUpFlipAnimation(struct Task *task)
{
asm(".syntax unified\n\
push {r4-r7,lr}\n\
mov r7, r10\n\
mov r6, r9\n\
mov r5, r8\n\
push {r5-r7}\n\
sub sp, 0x4\n\
mov r8, r0\n\
ldr r1, _08093D40 @ =gSharedMem\n\
movs r2, 0\n\
strb r2, [r1, 0x4]\n\
ldrh r0, [r0, 0xA]\n\
subs r0, 0x3\n\
mov r3, r8\n\
strh r0, [r3, 0xA]\n\
lsls r0, 16\n\
cmp r0, 0\n\
bgt _08093C5C\n\
strh r2, [r3, 0xA]\n\
_08093C5C:\n\
mov r4, r8\n\
movs r0, 0xA\n\
ldrsh r7, [r4, r0]\n\
movs r0, 0xA0\n\
subs r0, r7\n\
mov r9, r0\n\
subs r4, r0, r7\n\
negs r0, r7\n\
lsls r6, r0, 16\n\
movs r0, 0xA0\n\
lsls r0, 16\n\
adds r1, r4, 0\n\
bl __udivsi3\n\
adds r5, r0, 0\n\
ldr r1, _08093D44 @ =0xffff0000\n\
adds r5, r1\n\
adds r0, r5, 0\n\
muls r0, r4\n\
adds r0, r6\n\
mov r10, r0\n\
adds r0, r5, 0\n\
adds r1, r4, 0\n\
bl __udivsi3\n\
str r0, [sp]\n\
lsrs r5, 1\n\
movs r3, 0\n\
cmp r3, r7\n\
bcs _08093CB8\n\
ldr r2, _08093D48 @ =gScanlineEffectRegBuffers\n\
mov r12, r2\n\
ldr r0, _08093D4C @ =0x0000fffc\n\
adds r4, r0, 0\n\
_08093CA0:\n\
lsls r0, r3, 16\n\
asrs r0, 16\n\
lsls r1, r0, 1\n\
add r1, r12\n\
subs r2, r4, r0\n\
strh r2, [r1]\n\
adds r0, 0x1\n\
lsls r0, 16\n\
lsrs r3, r0, 16\n\
asrs r0, 16\n\
cmp r0, r7\n\
bcc _08093CA0\n\
_08093CB8:\n\
lsls r2, r3, 16\n\
mov r1, r9\n\
lsls r0, r1, 16\n\
asrs r1, r0, 16\n\
mov r4, r10\n\
lsrs r7, r4, 16\n\
cmp r2, r0\n\
bge _08093CF2\n\
ldr r0, _08093D48 @ =gScanlineEffectRegBuffers\n\
mov r9, r0\n\
ldr r3, _08093D4C @ =0x0000fffc\n\
mov r12, r3\n\
adds r4, r1, 0\n\
_08093CD2:\n\
lsrs r1, r6, 16\n\
adds r6, r5\n\
ldr r0, [sp]\n\
adds r5, r0\n\
asrs r2, 16\n\
lsls r0, r2, 1\n\
add r0, r9\n\
add r1, r12\n\
strh r1, [r0]\n\
adds r2, 0x1\n\
lsls r2, 16\n\
lsrs r3, r2, 16\n\
lsls r2, r3, 16\n\
asrs r0, r2, 16\n\
cmp r0, r4\n\
blt _08093CD2\n\
_08093CF2:\n\
adds r1, r7, 0\n\
lsls r0, r3, 16\n\
asrs r0, 16\n\
cmp r0, 0x9F\n\
bgt _08093D18\n\
ldr r4, _08093D48 @ =gScanlineEffectRegBuffers\n\
ldr r0, _08093D4C @ =0x0000fffc\n\
adds r2, r1, r0\n\
_08093D02:\n\
lsls r1, r3, 16\n\
asrs r1, 16\n\
lsls r0, r1, 1\n\
adds r0, r4\n\
strh r2, [r0]\n\
adds r1, 0x1\n\
lsls r1, 16\n\
lsrs r3, r1, 16\n\
asrs r1, 16\n\
cmp r1, 0x9F\n\
ble _08093D02\n\
_08093D18:\n\
movs r0, 0x1\n\
ldr r1, _08093D40 @ =gSharedMem\n\
strb r0, [r1, 0x4]\n\
mov r2, r8\n\
movs r3, 0xA\n\
ldrsh r0, [r2, r3]\n\
cmp r0, 0\n\
bgt _08093D2E\n\
ldrh r0, [r2, 0x8]\n\
adds r0, 0x1\n\
strh r0, [r2, 0x8]\n\
_08093D2E:\n\
movs r0, 0\n\
add sp, 0x4\n\
pop {r3-r5}\n\
mov r8, r3\n\
mov r9, r4\n\
mov r10, r5\n\
pop {r4-r7}\n\
pop {r1}\n\
bx r1\n\
.align 2, 0\n\
_08093D40: .4byte gSharedMem\n\
_08093D44: .4byte 0xffff0000\n\
_08093D48: .4byte gScanlineEffectRegBuffers\n\
_08093D4C: .4byte 0x0000fffc\n\
.syntax divided\n");
s16 i;
u32 r4, r5, r10, r7, r6, var_24, r9, var;
ewram0_2.var_4 = FALSE;
task->data[1] -= 3;
if (task->data[1] <= 0)
task->data[1] = 0;
r7 = task->data[1];
r9 = 160 - r7;
r4 = r9 - r7;
r6 = -r7 << 16;
r5 = 0xA00000 / r4;
r5 += 0xFFFF0000;
var_24 = r6 + r5 * r4;
r10 = r5 / r4;
r5 /= 2;
for (i = 0; i < r7;
// WHAT?!
gScanlineEffectRegBuffers[0][i] = (u32)-i + -4,
i++);
for (; i < (s16)r9; i++)
{
var = r6 >> 16;
r6 += r5;
r5 += r10;
gScanlineEffectRegBuffers[0][i] = var + -4;
}
for (var = var_24 >> 16; i < 160;
// WHAT?!
gScanlineEffectRegBuffers[0][i] = var + -4,
i++);
ewram0_2.var_4 = TRUE;
if (task->data[1] <= 0)
task->data[0]++;
return FALSE;
}
bool8 TrainerCard_FinishFlipAnimation(struct Task *task)

View File

@ -40,7 +40,7 @@ static const u8 gUnknown_0840612C[] = {
0, 4, 3, 2, 1
};
static const u8 *const sContextStatNames[] = {
static const u8 *const sContestStatNames[] = {
OtherText_Coolness,
OtherText_Toughness,
OtherText_Smartness,
@ -683,12 +683,19 @@ static void Pokeblock_MenuWindowTextPrint(const u8 *message)
Menu_PrintText(message, 1, 17);
}
#ifdef NONMATCHING
static void Pokeblock_BufferEnhancedStatText(u8 *dest, u8 statID, s16 a2)
void Pokeblock_BufferEnhancedStatText(u8 *dest, u8 statId, s16 enhanced)
{
if (a2 != 0)
if (enhanced)
{
StringCopy(dest, sContextStatNames[statID]);
// This is a joke.
if (enhanced > 0)
enhanced = 0;
if (enhanced < 0)
// matches, but can also be a variety of values too
{ u8 unk = -unk; } // see water.c for a similar behavior
StringCopy(dest, sContestStatNames[statId]);
StringAppend(dest, gOtherText_WasEnhanced);
}
else
@ -696,49 +703,6 @@ static void Pokeblock_BufferEnhancedStatText(u8 *dest, u8 statID, s16 a2)
StringCopy(dest, gOtherText_NothingChanged);
}
}
#else
NAKED
static void Pokeblock_BufferEnhancedStatText(u8 *dest, u8 a1, s16 a2)
{
asm_unified("\tpush {r4,lr}\n"
"\tadds r4, r0, 0\n"
"\tlsls r1, 24\n"
"\tlsrs r3, r1, 24\n"
"\tlsls r2, 16\n"
"\tlsrs r0, r2, 16\n"
"\tasrs r2, 16\n"
"\tcmp r2, 0\n"
"\tbeq _08136DFC\n"
"\tcmp r2, 0\n"
"\tble _08136DD8\n"
"\tmovs r0, 0\n"
"_08136DD8:\n"
"\tlsls r0, 16\n"
"\tldr r1, _08136DF4 @ =sContextStatNames\n"
"\tlsls r0, r3, 2\n"
"\tadds r0, r1\n"
"\tldr r1, [r0]\n"
"\tadds r0, r4, 0\n"
"\tbl StringCopy\n"
"\tldr r1, _08136DF8 @ =gOtherText_WasEnhanced\n"
"\tadds r0, r4, 0\n"
"\tbl StringAppend\n"
"\tb _08136E04\n"
"\t.align 2, 0\n"
"_08136DF4: .4byte sContextStatNames\n"
"_08136DF8: .4byte gOtherText_WasEnhanced\n"
"_08136DFC:\n"
"\tldr r1, _08136E0C @ =gOtherText_NothingChanged\n"
"\tadds r0, r4, 0\n"
"\tbl StringCopy\n"
"_08136E04:\n"
"\tpop {r4}\n"
"\tpop {r0}\n"
"\tbx r0\n"
"\t.align 2, 0\n"
"_08136E0C: .4byte gOtherText_NothingChanged");
}
#endif
static void Pokeblock_GetMonContestStats(struct Pokemon *pokemon, u8 *data)
{

View File

@ -152,10 +152,6 @@ void DoBgAffineSet(struct BgAffineDstData *dest, u32 texX, u32 texY, s16 scrX, s
BgAffineSet(&src, dest, 1);
}
#ifdef NONMATCHING
// Functionally equivalent.
// Only the two yflip loops don't match.
void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output)
{
u8 x, y;
@ -170,27 +166,22 @@ void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output)
for (x = 0; x < w; x++)
{
int tile = (*tilemap & 0x3ff) * 32;
u16 tile = (*tilemap & 0x3ff) * 32;
int attr = *tilemap & 0xc00;
if (attr == 0)
{
void *src = tiles + tile;
void *dest = output;
int length = 32;
DmaCopy32(3, src, dest, length);
DmaCopy32Defvars(3, tiles + tile, output, 32);
}
else if (attr == 0x800) // yflip
{
for (i = 0; i < 8; i++)
{
void *src = tiles;
void *dest = output;
int length = 4;
// this is likely wrong, but makes it closer to matching
src += tile + (7 - i) * 4;
dest += i * 4;
DmaCopy32(3, src, dest, length);
u8 requiredForMatching = 0;
++requiredForMatching;
--requiredForMatching;
DmaCopy32Defvars(3, tile + (7 - i) * 4 + tiles, output + i * 4, 4);
}
}
else // xflip
@ -200,26 +191,22 @@ void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output)
for (j = 0; j < 4; j++)
{
u8 i2 = i * 4;
xflip[i2 + (3-j)] = (tiles[tile + i2 + j] & 0xf) << 4;
xflip[i2 + (3-j)] |= tiles[tile + i2 + j] >> 4;
xflip[i2 + (3 - j)] = (tiles[tile + i2 + j] & 0xf) << 4;
xflip[i2 + (3 - j)] |= tiles[tile + i2 + j] >> 4;
}
}
if (*tilemap & 0x800) // yflip
{
for (i = 0; i < 8; i++)
{
void *src = xflip + (7-i) * 4;
void *dest = output + i*4;
int length = 4;
DmaCopy32(3, src, dest, length);
++tile;
--tile;
DmaCopy32Defvars(3, (7 - i) * 4 + xflip, output + i * 4, 4);
}
}
else
{
void *src = xflip;
void *dest = output;
int length = 32;
DmaCopy32(3, src, dest, length);
DmaCopy32Defvars(3, xflip, output, 32);
}
}
tilemap++;
@ -229,253 +216,6 @@ void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output)
}
}
#else
NAKED void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output)
{
asm("\n"
" .syntax unified\n"
" push {r4-r7,lr}\n"
" mov r7, r10\n"
" mov r6, r9\n"
" mov r5, r8\n"
" push {r5-r7}\n"
" sub sp, 0x3C\n"
" str r2, [sp, 0x20]\n"
" adds r4, r3, 0\n"
" ldr r7, [sp, 0x5C]\n"
" lsls r0, 24\n"
" lsls r1, 24\n"
" ldr r2, _08041008 @ =gSpriteDimensions\n"
" lsrs r1, 23\n"
" lsrs r0, 21\n"
" adds r1, r0\n"
" adds r0, r2, 0x1\n"
" adds r0, r1, r0\n"
" ldrb r0, [r0]\n"
" str r0, [sp, 0x24]\n"
" adds r1, r2\n"
" ldrb r1, [r1]\n"
" str r1, [sp, 0x28]\n"
" movs r1, 0\n"
" cmp r1, r0\n"
" bcc _08040FB4\n"
" b _08041136\n"
"_08040FB4:\n"
" movs r0, 0x20\n"
" ldr r2, [sp, 0x28]\n"
" subs r0, r2\n"
" lsls r0, 1\n"
" str r0, [sp, 0x2C]\n"
"_08040FBE:\n"
" movs r2, 0\n"
" adds r1, 0x1\n"
" str r1, [sp, 0x34]\n"
" ldr r3, [sp, 0x28]\n"
" cmp r2, r3\n"
" bcc _08040FCC\n"
" b _08041124\n"
"_08040FCC:\n"
" ldr r0, _0804100C @ =0x040000d4\n"
" mov r8, r0\n"
"_08040FD0:\n"
" ldrh r1, [r4]\n"
" ldr r0, _08041010 @ =0x000003ff\n"
" ands r0, r1\n"
" lsls r0, 5\n"
" mov r12, r0\n"
" movs r0, 0xC0\n"
" lsls r0, 4\n"
" ands r0, r1\n"
" mov r3, sp\n"
" strh r1, [r3, 0x38]\n"
" cmp r0, 0\n"
" bne _08041018\n"
" ldr r0, [sp, 0x20]\n"
" add r0, r12\n"
" mov r1, r8\n"
" str r0, [r1]\n"
" str r7, [r1, 0x4]\n"
" ldr r3, _08041014 @ =0x84000008\n"
" str r3, [r1, 0x8]\n"
" ldr r0, [r1, 0x8]\n"
" adds r4, 0x2\n"
" str r4, [sp, 0x30]\n"
" adds r7, 0x20\n"
" mov r10, r7\n"
" adds r2, 0x1\n"
" mov r9, r2\n"
" b _08041112\n"
" .align 2, 0\n"
"_08041008: .4byte gSpriteDimensions\n"
"_0804100C: .4byte 0x040000d4\n"
"_08041010: .4byte 0x000003ff\n"
"_08041014: .4byte 0x84000008\n"
"_08041018:\n"
" movs r1, 0x80\n"
" lsls r1, 4\n"
" cmp r0, r1\n"
" bne _08041068\n"
" movs r3, 0\n"
" adds r4, 0x2\n"
" str r4, [sp, 0x30]\n"
" movs r0, 0x20\n"
" adds r0, r7\n"
" mov r10, r0\n"
" adds r2, 0x1\n"
" mov r9, r2\n"
" ldr r4, _08041060 @ =0x040000d4\n"
" ldr r6, _08041064 @ =0x84000001\n"
" movs r5, 0x7\n"
"_08041036:\n"
" lsls r2, r3, 24\n"
" asrs r2, 24\n"
" subs r0, r5, r2\n"
" lsls r0, 2\n"
" add r0, r12\n"
" ldr r1, [sp, 0x20]\n"
" adds r0, r1, r0\n"
" lsls r1, r2, 2\n"
" adds r1, r7, r1\n"
" str r0, [r4]\n"
" str r1, [r4, 0x4]\n"
" str r6, [r4, 0x8]\n"
" ldr r0, [r4, 0x8]\n"
" adds r2, 0x1\n"
" lsls r2, 24\n"
" lsrs r3, r2, 24\n"
" asrs r2, 24\n"
" cmp r2, 0x7\n"
" ble _08041036\n"
" b _08041112\n"
" .align 2, 0\n"
"_08041060: .4byte 0x040000d4\n"
"_08041064: .4byte 0x84000001\n"
"_08041068:\n"
" movs r3, 0\n"
" adds r4, 0x2\n"
" str r4, [sp, 0x30]\n"
" movs r0, 0x20\n"
" adds r0, r7\n"
" mov r10, r0\n"
" adds r2, 0x1\n"
" mov r9, r2\n"
"_08041078:\n"
" movs r2, 0\n"
" lsls r4, r3, 24\n"
" lsls r0, r4, 2\n"
" lsrs r0, 24\n"
" adds r6, r0, 0x3\n"
" mov r1, r12\n"
" adds r5, r1, r0\n"
"_08041086:\n"
" lsls r1, r2, 24\n"
" asrs r1, 24\n"
" subs r0, r6, r1\n"
" mov r2, sp\n"
" adds r3, r2, r0\n"
" adds r0, r5, r1\n"
" ldr r2, [sp, 0x20]\n"
" adds r0, r2, r0\n"
" ldrb r2, [r0]\n"
" movs r0, 0xF\n"
" ands r0, r2\n"
" lsls r0, 4\n"
" lsrs r2, 4\n"
" orrs r0, r2\n"
" strb r0, [r3]\n"
" adds r1, 0x1\n"
" lsls r1, 24\n"
" lsrs r2, r1, 24\n"
" asrs r1, 24\n"
" cmp r1, 0x3\n"
" ble _08041086\n"
" movs r3, 0x80\n"
" lsls r3, 17\n"
" adds r0, r4, r3\n"
" lsrs r3, r0, 24\n"
" asrs r0, 24\n"
" cmp r0, 0x7\n"
" ble _08041078\n"
" movs r0, 0x80\n"
" lsls r0, 4\n"
" mov r1, sp\n"
" ldrh r1, [r1, 0x38]\n"
" ands r0, r1\n"
" cmp r0, 0\n"
" beq _08041104\n"
" movs r3, 0\n"
" ldr r4, _080410FC @ =0x040000d4\n"
" ldr r6, _08041100 @ =0x84000001\n"
" movs r5, 0x7\n"
"_080410D4:\n"
" lsls r1, r3, 24\n"
" asrs r1, 24\n"
" subs r0, r5, r1\n"
" lsls r0, 2\n"
" mov r3, sp\n"
" adds r2, r3, r0\n"
" lsls r0, r1, 2\n"
" adds r0, r7, r0\n"
" str r2, [r4]\n"
" str r0, [r4, 0x4]\n"
" str r6, [r4, 0x8]\n"
" ldr r0, [r4, 0x8]\n"
" adds r1, 0x1\n"
" lsls r1, 24\n"
" lsrs r3, r1, 24\n"
" asrs r1, 24\n"
" cmp r1, 0x7\n"
" ble _080410D4\n"
" b _08041112\n"
" .align 2, 0\n"
"_080410FC: .4byte 0x040000d4\n"
"_08041100: .4byte 0x84000001\n"
"_08041104:\n"
" mov r0, sp\n"
" mov r1, r8\n"
" str r0, [r1]\n"
" str r7, [r1, 0x4]\n"
" ldr r2, _08041148 @ =0x84000008\n"
" str r2, [r1, 0x8]\n"
" ldr r0, [r1, 0x8]\n"
"_08041112:\n"
" ldr r4, [sp, 0x30]\n"
" mov r7, r10\n"
" mov r3, r9\n"
" lsls r0, r3, 24\n"
" lsrs r2, r0, 24\n"
" ldr r0, [sp, 0x28]\n"
" cmp r2, r0\n"
" bcs _08041124\n"
" b _08040FD0\n"
"_08041124:\n"
" ldr r1, [sp, 0x2C]\n"
" adds r4, r1\n"
" ldr r2, [sp, 0x34]\n"
" lsls r0, r2, 24\n"
" lsrs r1, r0, 24\n"
" ldr r3, [sp, 0x24]\n"
" cmp r1, r3\n"
" bcs _08041136\n"
" b _08040FBE\n"
"_08041136:\n"
" add sp, 0x3C\n"
" pop {r3-r5}\n"
" mov r8, r3\n"
" mov r9, r4\n"
" mov r10, r5\n"
" pop {r4-r7}\n"
" pop {r0}\n"
" bx r0\n"
" .align 2, 0\n"
"_08041148: .4byte 0x84000008\n"
" .syntax divided\n"
);
}
#endif
int CountTrailingZeroBits(u32 value)
{
u8 i;

View File

@ -6,12 +6,12 @@
// main.c
#if DEBUG
/*. += 0x18;*/
#if (DEBUG && ENGLISH && REVISION == 0)
. += 0x8;
#endif
SYMBOL(gKeyRepeatStartDelay, 4)
SYMBOL(gLinkTransferringData, 4)
#if DEBUG
#if (DEBUG && !(ENGLISH && REVISION == 0))
. += 0x8;
#endif
SYMBOL(gMain, 1088)
@ -197,6 +197,10 @@ SYMBOL(gMenuCallback, 4)
#if DEBUG
SYMBOL(gUnknown_Debug_03004BD0, 4)
// TODO: see if this is in rev1+
#if (ENGLISH && REVISION == 0)
SYMBOL(gUnknown_Debug_Murakawa2, 4)
#endif
#endif
// sound.c
@ -204,8 +208,12 @@ SYMBOL(gDisableMusic, 4)
#if DEBUG
unk_debug_common_2 = .;
#if (ENGLISH && REVISION == 0)
. += 0x4;
#else
. += 0x8;
#endif
#endif
// battle_anim.c
SYMBOL(gSoundAnimFramesToWait, 4)