begin arm_proxy.c

This commit is contained in:
theo3 2021-02-19 00:47:22 -08:00
parent 71ae3b07ea
commit ce06f7dbb7
33 changed files with 1438 additions and 1457 deletions

View File

@ -83,6 +83,7 @@ NODEP := 1
endif
#$(C_BUILDDIR)/need_interworking_file_name.o: CFLAGS += -mthumb-interwork
$(C_BUILDDIR)/code_08016DF8.o: CFLAGS += -mthumb-interwork
C_SRCS := $(wildcard $(C_SUBDIR)/*.c $(C_SUBDIR)/*/*.c)
C_OBJS := $(patsubst $(C_SUBDIR)/%.c,$(C_BUILDDIR)/%.o,$(C_SRCS))

View File

@ -1,6 +1,6 @@
# The Legend of Zelda: The Minish Cap
**Progress:** [⬛⬛⬛⬛⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜] 22%
**Progress:** [⬛⬛⬛⬛⬛⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜] 25%
```diff
- WARNING! -

File diff suppressed because it is too large Load Diff

View File

@ -463,7 +463,9 @@ _080AF706:
str r1, [r0, #0x2c]
_080AF70A:
bx lr
_080AF70C:
thumb_func_start ply_fine
ply_fine: @ 0x080AF70C
push {r4, r5, lr}
adds r5, r1, #0
ldr r4, [r5, #0x20]
@ -542,7 +544,9 @@ sub_080AF77A: @ 0x080AF77A
ldrb r3, [r2]
b _080AF75E
.align 2, 0
_080AF784:
thumb_func_start ply_goto
ply_goto:
push {lr}
_080AF786:
ldr r2, [r1, #0x40]
@ -573,9 +577,9 @@ ply_patt: @ 0x080AF7A4
ldrb r2, [r1, #2]
adds r2, #1
strb r2, [r1, #2]
b _080AF784
b ply_goto
_080AF7BC:
b _080AF70C
b ply_fine
.align 2, 0
thumb_func_start ply_pend

View File

@ -0,0 +1,50 @@
.syntax unified
push {r4, r5, r6, r7, lr}
adds r4, r0, #0
ldr r2, _08017758 @ =gUnk_03003C70
movs r0, #0x80
lsls r0, r0, #1
adds r7, r2, r0
movs r5, #0x41
rsbs r5, r5, #0
ldr r6, _0801775C @ =gUnk_02018EA0
b _08017766
.align 2, 0
_08017758: .4byte gUnk_03003C70
_0801775C: .4byte gUnk_02018EA0
_08017760:
adds r2, #0x10
cmp r7, r2
bls _0801779A
_08017766:
ldr r0, [r2, #8]
cmp r4, r0
bne _08017760
adds r3, r4, #0
adds r3, #0x29
ldrb r1, [r3]
movs r0, #0x40
ands r0, r1
cmp r0, #0
beq _08017760
adds r0, r5, #0
ands r0, r1
strb r0, [r3]
movs r0, #0
str r0, [r2, #8]
ldr r1, [r2]
ldr r0, [r2, #4]
str r0, [r1, #4]
ldr r1, [r2, #4]
ldr r0, [r2]
str r0, [r1]
ldr r0, [r6]
cmp r2, r0
bne _0801779A
ldr r0, [r2, #4]
str r0, [r6]
_0801779A:
pop {r4, r5, r6, r7}
pop {r0}
bx r0
.syntax divided

View File

@ -0,0 +1,130 @@
.syntax unified
push {r4, r5, lr}
mov ip, r0
ldrb r0, [r0, #9]
lsls r0, r0, #3
ldr r1, _08017410 @ =gUnk_08126DA8
adds r3, r0, r1
ldrb r0, [r3]
cmp r0, #0xff
bne _080173CE
ldrb r2, [r3, #2]
ldr r1, _08017414 @ =gUnk_08126ED8
ldrb r0, [r3, #1]
lsls r0, r0, #2
adds r0, r0, r1
ldr r3, [r0]
mov r0, ip
adds r0, #0x68
ldrb r0, [r0]
subs r0, r0, r2
lsls r0, r0, #3
adds r3, r3, r0
_080173CE:
ldrb r0, [r3]
movs r1, #0xf
ands r1, r0
lsls r0, r0, #4
orrs r0, r1
mov r1, ip
strb r0, [r1, #0x1a]
ldrb r1, [r3, #1]
mov r0, ip
adds r0, #0x44
strb r1, [r0]
ldrb r1, [r3, #3]
subs r0, #4
strb r1, [r0]
ldrb r0, [r3, #4]
mov r1, ip
adds r1, #0x3f
strb r0, [r1]
ldrb r0, [r3, #5]
mov r2, ip
strh r0, [r2, #0x12]
ldrh r1, [r3, #6]
cmp r1, #0
bne _0801741C
ldr r2, _08017418 @ =gPlayerEntity
adds r0, r2, #0
adds r0, #0x60
ldrh r1, [r0]
mov r0, ip
adds r0, #0x60
strh r1, [r0]
adds r5, r2, #0
b _08017428
.align 2, 0
_08017410: .4byte gUnk_08126DA8
_08017414: .4byte gUnk_08126ED8
_08017418: .4byte gPlayerEntity
_0801741C:
ldr r0, _0801749C @ =0x000003FF
ands r0, r1
mov r1, ip
adds r1, #0x60
strh r0, [r1]
ldr r5, _080174A0 @ =gPlayerEntity
_08017428:
mov r3, ip
ldrb r0, [r3, #0x14]
cmp r0, #0
bne _08017438
ldrb r1, [r5, #0x14]
movs r0, #6
ands r0, r1
strb r0, [r3, #0x14]
_08017438:
adds r0, r5, #0
adds r0, #0x38
ldrb r1, [r0]
mov r0, ip
adds r0, #0x38
strb r1, [r0]
ldrb r1, [r5, #0x19]
lsrs r1, r1, #6
lsls r1, r1, #6
mov r0, ip
ldrb r3, [r0, #0x19]
movs r2, #0x3f
adds r0, r2, #0
ands r0, r3
orrs r0, r1
mov r1, ip
strb r0, [r1, #0x19]
adds r0, r5, #0
adds r0, #0x29
ldrb r1, [r0]
lsls r1, r1, #0x1d
mov r4, ip
adds r4, #0x29
lsrs r1, r1, #0x1d
ldrb r3, [r4]
movs r0, #8
rsbs r0, r0, #0
ands r0, r3
orrs r0, r1
strb r0, [r4]
ldrb r0, [r5, #0x1b]
lsrs r0, r0, #6
lsls r0, r0, #6
mov r3, ip
ldrb r1, [r3, #0x1b]
ands r2, r1
orrs r2, r0
strb r2, [r3, #0x1b]
mov r2, ip
adds r2, #0x45
movs r1, #1
movs r0, #1
strb r0, [r2]
ldrb r0, [r3, #0x10]
orrs r1, r0
strb r1, [r3, #0x10]
pop {r4, r5}
pop {r0}
bx r0
.align 2, 0
_0801749C: .4byte 0x000003FF
_080174A0: .4byte gPlayerEntity
.syntax divided

View File

@ -0,0 +1,90 @@
.syntax unified
push {r4, lr}
adds r4, r0, #0
adds r0, #0x45
ldrb r1, [r0]
movs r0, #0x7f
ands r0, r1
cmp r0, #0
beq _08017550
ldr r0, _080175D8 @ =gUnk_020342F8
subs r1, #1
bl ReadBit
cmp r0, #0
bne _08017550
bl DeleteThisEntity
_08017550:
ldrb r0, [r4, #0xc]
cmp r0, #0
bne _08017566
ldrb r1, [r4, #0x10]
movs r0, #1
ands r0, r1
cmp r0, #0
bne _08017566
adds r0, r4, #0
bl sub_0806EC78
_08017566:
adds r0, r4, #0
bl sub_0805E3B0
cmp r0, #0
bne _08017584
ldr r2, _080175DC @ =gNPCFunctions
ldrb r1, [r4, #9]
lsls r0, r1, #1
adds r0, r0, r1
lsls r0, r0, #2
adds r0, r0, r2
ldr r1, [r0]
adds r0, r4, #0
bl _call_via_r1
_08017584:
ldr r0, [r4, #4]
cmp r0, #0
beq _080175D2
ldr r2, _080175DC @ =gNPCFunctions
ldrb r1, [r4, #9]
lsls r0, r1, #1
adds r0, r0, r1
lsls r0, r0, #2
adds r2, #4
adds r0, r0, r2
ldr r1, [r0]
cmp r1, #0
beq _080175A4
adds r0, r4, #0
bl _call_via_r1
_080175A4:
adds r0, r4, #0
adds r0, #0x45
ldrb r1, [r0]
movs r0, #0x7f
ands r0, r1
cmp r0, #0
beq _080175CC
ldr r2, _080175E0 @ =gUnk_02031EC0
lsls r0, r1, #4
subs r0, #0x10
adds r2, r0, r2
ldr r3, _080175E4 @ =gRoomControls
ldrh r0, [r4, #0x2e]
ldrh r1, [r3, #6]
subs r0, r0, r1
strh r0, [r2, #4]
ldrh r0, [r4, #0x32]
ldrh r1, [r3, #8]
subs r0, r0, r1
strh r0, [r2, #6]
_080175CC:
adds r0, r4, #0
bl sub_0800404C
_080175D2:
pop {r4}
pop {r0}
bx r0
.align 2, 0
_080175D8: .4byte gUnk_020342F8
_080175DC: .4byte gNPCFunctions
_080175E0: .4byte gUnk_02031EC0
_080175E4: .4byte gRoomControls
.syntax divided

View File

@ -0,0 +1,68 @@
.syntax unified
push {r4, lr}
adds r4, r0, #0
adds r3, r4, #0
adds r3, #0x29
ldrb r1, [r3]
movs r0, #0x40
ands r0, r1
cmp r0, #0
beq _08017682
_0801767E:
movs r0, #1
b _080176DE
_08017682:
ldr r2, _080176C0 @ =gUnk_03003C70
movs r0, #0x80
lsls r0, r0, #1
adds r1, r2, r0
cmp r1, r2
bls _080176DC
_0801768E:
ldr r0, [r2, #8]
cmp r0, #0
bne _080176D6
str r4, [r2, #8]
strb r0, [r2, #0xc]
ldrb r0, [r3]
movs r1, #0x40
orrs r0, r1
strb r0, [r3]
ldr r3, _080176C4 @ =gUnk_02018EA0
ldr r1, [r3]
ldrb r0, [r1, #0xc]
cmp r0, #0
beq _080176C8
_080176AA:
ldr r1, [r1, #4]
ldrb r0, [r1, #0xc]
cmp r0, #0
bne _080176AA
str r1, [r2, #4]
ldr r0, [r1]
str r0, [r2]
str r2, [r0, #4]
str r2, [r1]
b _0801767E
.align 2, 0
_080176C0: .4byte gUnk_03003C70
_080176C4: .4byte gUnk_02018EA0
_080176C8:
str r1, [r2, #4]
ldr r0, [r1]
str r0, [r2]
str r2, [r0, #4]
str r2, [r1]
str r2, [r3]
b _0801767E
_080176D6:
adds r2, #0x10
cmp r1, r2
bhi _0801768E
_080176DC:
movs r0, #0
_080176DE:
pop {r4}
pop {r1}
bx r1
.syntax divided

View File

@ -0,0 +1,54 @@
.syntax unified
push {lr}
adds r2, r0, #0
adds r0, #0x29
ldrb r1, [r0]
movs r0, #0x40
ands r0, r1
cmp r0, #0
beq _08017720
movs r0, #1
b _0801773A
_080176F8:
str r2, [r3, #8]
movs r0, #1
strb r0, [r3, #0xc]
adds r2, #0x29
ldrb r0, [r2]
movs r1, #0x40
orrs r0, r1
strb r0, [r2]
ldr r2, _0801771C @ =gUnk_02018EA0
ldr r0, [r2]
str r0, [r3, #4]
ldr r1, [r0]
str r1, [r3]
str r3, [r1, #4]
str r3, [r0]
str r3, [r2]
movs r0, #1
b _0801773A
.align 2, 0
_0801771C: .4byte gUnk_02018EA0
_08017720:
ldr r3, _08017740 @ =gUnk_03003C70
movs r0, #0x80
lsls r0, r0, #1
adds r1, r3, r0
cmp r1, r3
bls _08017738
_0801772C:
ldr r0, [r3, #8]
cmp r0, #0
beq _080176F8
adds r3, #0x10
cmp r1, r3
bhi _0801772C
_08017738:
movs r0, #0
_0801773A:
pop {r1}
bx r1
.align 2, 0
_08017740: .4byte gUnk_03003C70
.syntax divided

View File

@ -0,0 +1,95 @@
.syntax unified
push {r4, r5, r6, lr}
mov ip, r0
adds r5, r1, #0
adds r0, #0x38
adds r1, #0x38
ldrb r2, [r0]
ldrb r0, [r1]
ands r0, r2
cmp r0, #0
beq _08017848
mov r0, ip
ldr r3, [r0, #0x48]
ldr r4, [r5, #0x48]
ldrb r1, [r3, #6]
ldrb r0, [r4, #6]
adds r2, r1, r0
mov r1, ip
movs r6, #0x2e
ldrsh r0, [r1, r6]
movs r6, #0x2e
ldrsh r1, [r5, r6]
subs r0, r0, r1
movs r1, #0
ldrsb r1, [r3, r1]
adds r0, r0, r1
movs r1, #0
ldrsb r1, [r4, r1]
subs r0, r0, r1
adds r0, r0, r2
lsls r1, r2, #1
cmp r0, r1
bhi _08017848
ldrb r1, [r3, #7]
ldrb r0, [r4, #7]
adds r2, r1, r0
mov r1, ip
movs r6, #0x32
ldrsh r0, [r1, r6]
movs r6, #0x32
ldrsh r1, [r5, r6]
subs r0, r0, r1
movs r1, #1
ldrsb r1, [r3, r1]
adds r0, r0, r1
movs r1, #1
ldrsb r1, [r4, r1]
subs r0, r0, r1
adds r0, r0, r2
lsls r1, r2, #1
cmp r0, r1
bhi _08017848
mov r0, ip
adds r0, #0x3c
ldrb r1, [r0]
movs r6, #0x10
adds r0, r6, #0
ands r0, r1
movs r2, #5
cmp r0, #0
beq _0801781A
ldrb r2, [r3, #8]
_0801781A:
adds r0, r5, #0
adds r0, #0x3c
ldrb r1, [r0]
adds r0, r6, #0
ands r0, r1
cmp r0, #0
beq _0801782E
ldrb r0, [r4, #8]
adds r2, r2, r0
b _08017830
_0801782E:
adds r2, #5
_08017830:
mov r1, ip
movs r3, #0x36
ldrsh r0, [r1, r3]
movs r6, #0x36
ldrsh r1, [r5, r6]
subs r0, r0, r1
adds r0, r0, r2
lsls r1, r2, #1
cmp r0, r1
bhi _08017848
movs r0, #1
b _0801784A
_08017848:
movs r0, #0
_0801784A:
pop {r4, r5, r6}
pop {r1}
bx r1
.syntax divided

View File

@ -4,14 +4,44 @@
.section .rodata
.align 2
gUnk_089FB770:: @ 089FB770
.incbin "baserom.gba", 0x9FB770, 0x0000010
gUnk_089FB780:: @ 089FB780
.incbin "baserom.gba", 0x9FB780, 0x0000F44
gUnk_089FC6C4:: @ 089FC6C4
.incbin "baserom.gba", 0x9FC6C4, 0x0000090
@ replacing .incbin "baserom.gba", 0x009fc6c4, 0x90
.4byte ply_fine
.4byte ply_goto
.4byte ply_patt
.4byte ply_pend
.4byte ply_rept
.4byte ply_fine
.4byte ply_fine
.4byte ply_fine
.4byte ply_fine
.4byte ply_prio
.4byte ply_tempo
.4byte ply_keysh
.4byte ply_voice
.4byte ply_vol
.4byte ply_pan
.4byte ply_bend
.4byte ply_bendr
.4byte ply_lfos
.4byte ply_lfodl
.4byte ply_mod
.4byte ply_modt
.4byte ply_fine
.4byte ply_fine
.4byte ply_tune
.4byte ply_fine
.4byte ply_fine
.4byte ply_fine
.4byte ply_port
.4byte ply_fine
.4byte ply_endtie
.4byte SampleFreqSet
.4byte TrackStop
.4byte FadeOutBody
.4byte TrkVolPitSet
.4byte RealClearChain
.4byte SoundMainBTM
gUnk_089FC754:: @ 089FC754
.incbin "baserom.gba", 0x9FC754, 0x00000B4
@ -38,7 +68,19 @@ gUnk_089FC938:: @ 089FC938
.incbin "baserom.gba", 0x9FC938, 0x0000034
gUnk_089FC96C:: @ 089FC96C
.incbin "baserom.gba", 0x9FC96C, 0x0000030
@ replacing .incbin "baserom.gba", 0x009fc96c, 0x30
.4byte ply_xxx
.4byte ply_xwave
.4byte ply_xtype
.4byte ply_xxx
.4byte ply_xatta
.4byte ply_xdeca
.4byte ply_xsust
.4byte ply_xrele
.4byte ply_xiecv
.4byte ply_xiecl
.4byte ply_xleng
.4byte ply_xswee
gUnk_089FC99C:: @ 089FC99C
.incbin "baserom.gba", 0x9FC99C, 0x0000060

11
data/sprite_table.s Normal file
View File

@ -0,0 +1,11 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.section .rodata
.align 2
gUnk_089FB770:: @ 089FB770
.byte 00, 0x0d, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00
gUnk_089FB780:: @ 089FB780
.incbin "baserom.gba", 0x9FB780, 0x0000F44

243
include/audio.h Normal file
View File

@ -0,0 +1,243 @@
typedef enum {
NONE,
BGM_CASTLE_TOURNAMENT,
BGM_VAATI_MOTIF,
BGM_TITLE_SCREEN,
BGM_CASTLE_MOTIF,
BGM_ELEMENT_GET,
BGM_FAIRY_FOUNTAIN,
BGM_FILE_SELECT,
BGM_INTRO_CUTSCENE,
BGM_CREDITS,
BGM_GAMEOVER,
BGM_SAVING_ZELDA,
BGM_LTTP_TITLE,
BGM_VAATI_THEME,
BGM_EZLO_THEME,
BGM_STORY,
BGM_FESTIVAL_APPROACH,
BGM_BEAT_VAATI,
BGM_BEANSTALK = 0x13,
BGM_HOUSE,
BGM_CUCCO_MINIGAME,
BGM_SYRUP_THEME,
BGM_DUNGEON,
BGM_ELEMENT_THEME,
BGM_HYRULE_FIELD,
BGM_HYRULE_CASTLE,
BGM_HYRULE_CASTLE_NOINTRO,
BGM_MINISH_VILLAGE,
BGM_MINISH_WOODS,
BGM_CRENEL_STORM,
BGM_CASTOR_WILDS,
BGM_HYRULE_TOWN,
BGM_ROYAL_VALLEY,
BGM_CLOUD_TOPS,
BGM_DARK_HYRULE_CASTLE,
BGM_SECRET_CASTLE_ENTRANCE,
BGM_DEEPWOOD_SHRINE,
BGM_CAVE_OF_FLAMES,
BGM_FORTRESS_OF_WINDS,
BGM_TEMPLE_OF_DROPLETS,
BGM_PALACE_OF_WINDS,
BGM_EZLO_STORY,
BGM_ROYAL_CRYPT,
BGM_ELEMENTAL_SANCTUARY,
BGM_FIGHT_THEME,
BGM_BOSS_THEME,
BGM_VAATI_REBORN,
BGM_VAATI_TRANSFIGURED,
BGM_CASTLE_COLLAPSE,
BGM_VAATI_WRATH,
BGM_FIGHT_THEME2,
BGM_DIGGING_CAVE,
BGM_SWIFTBLADE_DOJO,
BGM_MINISH_CAP,
BGM_MT_CRENEL,
BGM_PICORI_FESTIVAL,
BGM_LOST_WOODS,
BGM_FAIRY_FOUNTAIN2,
BGM_WIND_RUINS,
BGM_LEARN_SCROLL = 0x5E,
BGM_EZLO_GET,
SFX_BEEP = 0x64,
SFX_TEXTBOX_OPEN,
SFX_TEXTBOX_CLOSE,
SFX_TEXTBOX_NEXT,
SFX_TEXTBOX_SWAP,
SFX_TEXTBOX_CHOICE,
SFX_TEXTBOX_SELECT,
SFX_6B,
SFX_MENU_CANCEL,
SFX_MENU_ERROR,
SFX_RUPEE_BOUNCE,
SFX_RUPEE_GET,
SFX_HEART_BOUNCE,
SFX_HEART_GET,
SFX_SECRET,
SFX_SECRET_BIG,
SFX_METAL_CLINK,
SFX_PLY_VO1,
SFX_PLY_VO2,
SFX_PLY_VO3,
SFX_PLY_VO4,
SFX_PLY_VO5,
SFX_PLY_VO6,
SFX_PLY_VO7,
SFX_PLY_JUMP,
SFX_PLY_LAND,
SFX_7E,
SFX_PLY_LIFT,
SFX_80,
SFX_81,
SFX_82,
SFX_WATER_WALK,
SFX_WATER_SPLASH,
SFX_FALL_HOLE,
SFX_86,
SFX_PLY_DIE,
SFX_88,
SFX_BARREL_RELEASE,
SFX_BARREL_ENTER,
SFX_BARREL_ROLL,
SFX_BARREL_ROLL_STOP,
SFX_VO_EZLO1,
SFX_VO_EZLO2,
SFX_VO_EZLO3,
SFX_VO_EZLO4,
SFX_VO_EZLO5,
SFX_VO_EZLO6,
SFX_VO_EZLO7,
SFX_VO_ZELDA1,
SFX_VO_ZELDA2,
SFX_VO_ZELDA3,
SFX_VO_ZELDA4,
SFX_VO_ZELDA5,
SFX_VO_ZELDA6,
SFX_VO_ZELDA7,
SFX_9B,
SFX_9C,
SFX_9D,
SFX_9E,
SFX_9F,
SFX_A0,
SFX_VO_TINGLE1,
SFX_VO_TINGLE2,
SFX_VO_KING1,
SFX_VO_KING2,
SFX_VO_KING3,
SFX_VO_KING4,
SFX_VO_KING5,
SFX_A8,
SFX_A9,
SFX_AA,
SFX_SPIRITS_RELEASE,
SFX_AC,
SFX_VO_BEEDLE,
SFX_AE,
SFX_AF,
SFX_B0,
SFX_VO_MINISH1,
SFX_VO_MINISH2,
SFX_VO_MINISH3,
SFX_VO_MINISH4,
SFX_REM_SLEEP = 0xCC,
SFX_TASK_COMPLETE,
SFX_KEY_APPEAR,
SFX_CF,
SFX_D0,
SFX_VO_DOG,
SFX_VO_CAT,
SFX_VO_EPONA,
SFX_VO_COW,
SFX_VO_CUCCO_CALL,
SFX_VO_CHEEP,
SFX_ITEM_SWORD_CHARGE,
SFX_ITEM_SWORD_CHARGE_FINISH,
SFX_D9,
SFX_DA,
SFX_VO_STURGEON,
SFX_HAMMER1,
SFX_HAMMER2,
SFX_HAMMER3,
SFX_HAMMER4,
SFX_HAMMER5,
SFX_HAMMER6,
SFX_CUCCO_MINIGAME_BELL,
SFX_E3,
SFX_E4,
SFX_BUTTON_DEPRESS,
SFX_THUD_HEAVY,
SFX_WIND1,
SFX_WIND2,
SFX_WIND3,
SFX_SUMMON = 0xF4,
SFX_F5,
SFX_EVAPORATE,
SFX_APPARATE,
SFX_F8,
SFX_TELEPORTER,
SFX_ITEM_BOMB_EXPLODE = 0xFD,
SFX_HIT,
SFX_ITEM_SHIELD_BOUNCE = 0x118,
SFX_ITEM_GLOVES_KNOCKBACK,
SFX_EM_ARMOS_ON,
SFX_EM_MOBLIN_SPEAR = 0x11E,
SFX_LOW_HEALTH,
SFX_CHARGING_UP,
SFX_STAIRS,
SFX_BOSS_HIT = 0x127,
SFX_BOSS_DIE,
SFX_BOSS_EXPLODE,
SFX_ITEM_LANTERN_ON = 0x13D,
SFX_ITEM_LANTERN_OFF,
SFX_ITEM_SWORD_BEAM,
SFX_140,
SFX_HEART_CONTAINER_SPAWN,
SFX_SPARKLES,
SFX_PLY_SHRINKING = 0x16F,
SFX_PLY_GROW,
SFX_LAVA_TILE_STEP = 0x17B,
SFX_LAVA_TILE_WOBBLE,
SFX_LAVA_TILE_SINK,
SFX_LAVA_TILE_FLIP,
SFX_LAVA_TILE_LAND,
SFX_STAIRS_ASCEND = 0x187,
SFX_STAIRS_DESCEND,
SFX_ICE_BLOCK_SLIDE = 0x1B1,
SFX_ICE_BLOCK_STOP,
SFX_ICE_BLOCK_MELT,
SFX_VO_GORON1 = 0x1B7,
SFX_VO_GORON2,
SFX_VO_GORON3,
SFX_VO_GORON4,
SFX_EM_DEKUSCRUB_HIT,
SFX_ELEMENT_PLACE = 0x1CD,
SFX_ELEMENT_FLOAT,
SFX_ELEMENT_CHARGE,
SFX_1D0,
SFX_ELEMENT_INFUSE,
SFX_VO_CUCCO1 = 0x1D6,
SFX_VO_CUCCO2,
SFX_VO_CUCCO3,
SFX_VO_CUCCO4,
SFX_VO_CUCCO5,
} Sound;

View File

@ -19,9 +19,23 @@ typedef struct {
} EntityType;
typedef struct {
u8 unknown[8];
s8 offset_x;
s8 offset_y;
u8 unk2[4];
u8 width;
u8 height;
} BoundingBox;
typedef struct {
s8 offset_x;
s8 offset_y;
u8 unknown[4];
u8 width;
u8 height;
u8 depth;
u8 unknown2[3];
} BoundingBox3D;
typedef struct Entity {
/*0x00*/ struct Entity* prev;
/*0x04*/ struct Entity* next;

View File

@ -209,7 +209,7 @@ extern u32 sub_0807953C(void);
extern void sub_080AE068(Entity*);
extern u32 sub_0800445C(Entity*);
extern void sub_0807A108(void);
extern void sub_0801766C(Entity*);
extern u32 sub_0801766C(Entity*);
extern void sub_08004168(Entity*);
extern u32 sub_08052638(u32);
extern void InitDMA(void);

View File

@ -46,7 +46,7 @@ enum {
};
typedef struct {
u8 interruptFlag;
vu8 interruptFlag;
u8 field_0x1;
u8 screen;
u8 funcIndex;

View File

@ -191,4 +191,7 @@ extern void sub_0805DE38(Entity*);
extern void sub_0805E0A8(Entity*);
extern void sub_0805E0FC();
void (*const gManagerFunctions[58])();
#endif

View File

@ -172,4 +172,7 @@ extern void NPC58_Head(Entity*);
extern u32 UpdateFuseInteraction(Entity*);
void (*const gNPCFunctions[128][3])(Entity*);
#endif

View File

@ -199,4 +199,6 @@ extern void ObjectBF(Entity*);
extern void EnemyItem(Entity*);
extern void ObjectC1(Entity*);
void (*const gObjectFunctions[194])(Entity*);
#endif

View File

@ -67,7 +67,8 @@ typedef struct {
/*0x94*/ u32 field_0x94;
/*0x98*/ u16 field_0x98;
/*0x9a*/ u16 field_0x9a;
/*0x9c*/ u32 field_0x9c[3];
/*0x9c*/ u32 field_0x9c;
/*0xa0*/ u8 field_0xa0[8];
/*0xa8*/ u8 field_0xa8;
/*0xa9*/ u8 field_0xa9;
/*0xaa*/ u8 field_0xaa;
@ -78,26 +79,26 @@ typedef struct {
typedef struct {
u8 walletType;
u8 heartPieces;
u8 health;
u8 maxHealth;
u8 bombCount;
u8 arrowCount;
u8 bombBagType;
u8 quiverType;
u8 filler[4];
u8 itemOnA;
u8 itemOnB;
u8 filler2[10];
u16 rupees;
u16 field_0x1a;
u8 field_0x1c;
u8 field_0x1d;
u8 field_0x1e;
u8 field_0x1f;
u16 field_0x20;
u8 filler4[4];
/*0x00*/ u8 walletType;
/*0x01*/ u8 heartPieces;
/*0x02*/ u8 health;
/*0x03*/ u8 maxHealth;
/*0x04*/ u8 bombCount;
/*0x05*/ u8 arrowCount;
/*0x06*/ u8 bombBagType;
/*0x07*/ u8 quiverType;
/*0x08*/ u8 filler[4];
/*0x0c*/ u8 itemOnA;
/*0x0d*/ u8 itemOnB;
/*0x0e*/ u8 bottles[4];
/*0x12*/ u8 floorType;
/*0x13*/ u8 filler3[5];
/*0x18*/ u16 rupees;
/*0x1a*/ u16 field_0x1a;
/*0x1c*/ u16 field_0x1c;
/*0x1e*/ u16 field_0x1e;
/*0x20*/ u16 field_0x20;
/*0x22*/ u8 filler4[4];
} Stats;
typedef struct {
@ -109,6 +110,8 @@ typedef struct {
/*0xf*/ u8 field_0xf;
} ItemBehavior;
extern void (*const gPlayerItemFunctions[])(Entity*);
extern u8 gBombBagSizes[];
extern u8 gQuiverSizes[];

View File

@ -44,7 +44,7 @@ typedef struct {
extern struct_02000010 gUnk_02000010;
typedef struct {
u32 frameCount; // regular frame count? does anything reset it?
s32 frameCount; // regular frame count? does anything reset it?
u8 field_0x4[0x4];
bool8 transitioningOut;
u8 transitionType; // transition when changing areas

View File

@ -301,6 +301,7 @@ SECTIONS {
/* C source compiled with interworking */
asm/code_08016B30.o(.text);
asm/updateBackgroundRegisters.o(.text);
src/code_08016DF8.o(.text);
asm/code_08016DF8.o(.text);
/* C source compiled without interworking */
asm/code_08018500.o(.text);
@ -1030,6 +1031,7 @@ SECTIONS {
src/intro.o(.rodata);
data/data_081320FC.o(.rodata);
data/strings.o(.rodata);
data/sprite_table.o(.rodata);
data/data_089FC6C4.o(.rodata);
} >rom

547
src/arm_proxy.c Normal file
View File

@ -0,0 +1,547 @@
#include "global.h"
#include "audio.h"
#include "main.h"
#include "player.h"
#include "structures.h"
#include "save.h"
#include "textbox.h"
#include "functions.h"
#include "object.h"
#include "manager.h"
#include "npc.h"
extern u8 gUnk_03003DE0;
extern u8 gUnk_03000C30;
extern u16* gUnk_02025EB0;
extern u16* gUnk_0200B650;
extern u8 gUnk_02000070;
extern u8 gUnk_03003DF0[];
extern u8 gUnk_03003BE0;
extern Entity* gUnk_03004040[3];
extern u8 gUnk_020342F8;
extern u8 gUnk_03003DB8;
extern void gUnk_030059F0(void);
extern void sub_080ADD70();
extern void sub_0801C25C();
extern void sub_08016C3C();
extern void sub_08016DF8();
extern void sub_0804FF98();
extern u32 sub_0805E3B0();
extern void sub_08016FF4();
extern void sub_08070680();
extern void sub_080171F0();
extern void sub_08078FB0();
extern void sub_0800404C();
extern void sub_0807A050();
extern u32 sub_08079B24();
extern void sub_08079708();
extern void CreateSparkle();
extern void sub_080028E0(Entity*);
extern void sub_08078180(void);
extern void sub_0807B0C8(void);
extern void sub_0807A8D8(Entity*);
extern void sub_08077FEC(u32);
extern void sub_080173A4(Entity*);
extern void sub_080A2838(Entity*);
extern u32 ReadBit(void*, u32);
extern void sub_0806EC78(Entity*);
typedef struct {
u8 unk0;
u8 unk1;
u8 unk2;
u8 unk3;
u8 unk4;
u8 unk5;
u16 unk6;
} ItemFrame;
extern ItemFrame gUnk_08126DA8[];
extern ItemFrame* gUnk_08126ED8[3];
typedef struct {
u16 unk0;
u16 unk1;
u16 x;
u16 y;
} NPCStruct;
extern NPCStruct gUnk_02031EC0[100];
typedef struct {
u8 unk0;
u8 unk1;
u8 unk2;
u8 unk3;
u8 freezeTime;
u8 unk9;
} EntityHandler;
extern EntityHandler gUnk_03003DC0;
typedef struct {
void* last;
void* first;
void* node;
u8 flags;
} LinkedList2;
extern LinkedList2 gUnk_03003C70[16];
extern LinkedList2* gUnk_02018EA0;
void sub_08016DF8(void) {
if (gUnk_03003DE0 != 0) {
u8* buf = &gUnk_03000C30;
s32 i = gUnk_03003DE0;
gUnk_03003DE0 = 0;
do {
switch (*buf) {
case 0:
DmaCopy32(3, *(u32*)(buf + 4), *(u32*)(buf + 8), *(u16*)(buf + 2));
break;
case 1:
LZ77UnCompVram(*(void**)(buf + 4), *(u8**)(buf + 8));
break;
case 2:
DmaFill32(3, *(u32*)(buf + 4), *(u32*)(buf + 8), *(u16*)(buf + 2));
break;
}
buf += 12;
i--;
} while (0 < i);
}
}
void sub_08016E78(void) {
gUnk_03001000.interruptFlag = 0;
VBlankIntrWait();
do {
} while (gUnk_03001000.interruptFlag == 0);
sub_080ADD70();
sub_0801C25C();
sub_08016C3C();
sub_08016DF8();
if (gUnk_02000070) {
gUnk_02000070 = 0;
if (gUnk_02025EB0 != NULL) {
// sizeof(BGBuffer) = 0x800, what are we omitting?
DmaCopy32(3, &gBG1Buffer, VRAM + (*gUnk_02025EB0 & 0x1f00) * 8, 0x5C0);
}
if (gUnk_0200B650 != NULL) {
DmaCopy32(3, &gBG2Buffer, VRAM + (*gUnk_0200B650 & 0x1f00) * 8, 0x5C0);
}
}
sub_0804FF98();
}
void sub_08016F28(Entity* this) {
if (gSave.stats.floorType != 0)
gPlayerState.flags.all |= 0x4000;
else
gPlayerState.flags.all &= ~0x4000;
if (sub_0805E3B0(this) == 0) {
if ((gPlayerState.flags.all & 0x80000) != 0) {
sub_08077B20();
if ((gPlayerState.flags.all & 0x200000) != 0) {
gPlayerState.playerAction = 0x18;
gPlayerState.flags.all &= 0xfff7ffff;
gPlayerState.hurtBlinkSpeed = 0xf0;
this->flags |= 0x80;
} else {
this->flags &= 0x7f;
gPlayerState.field_0xa8 = 0xf;
}
}
sub_08016FF4(this);
sub_08070680(this);
if ((this->height.WORD == 0) && (this->action == 1 || this->action == 9)) {
sub_08008790(this, 8);
}
sub_080171F0();
}
sub_08078FB0(this);
sub_0800404C(this);
sub_0807A050();
}
void sub_08016FF4(Entity* this) {
u32 temp;
gUnk_0200AF00.filler25[10] = 0;
gUnk_0200AF00.filler25[8] = 0;
gUnk_0200AF00.filler25[9] = 0;
if ((gPlayerEntity.bitfield & 0x80) && (gPlayerEntity.hurtBlinkTime > 0))
PlaySFX(SFX_86);
gPlayerState.flags.all &= ~(0x2000000 | 0x200);
if (gPlayerState.flags.all & 0x400)
ResetPlayer();
if ((gPlayerState.flags.all & 0x400000) && !gPlayerState.field_0xa0[0])
sub_0807A108();
if (sub_08079B24() == 0)
sub_08079708(this);
gUnk_03003DF0[0] = 0;
if (gPlayerState.field_0x27[0] != 0)
gPlayerState.field_0x27[0]--;
gPlayerState.field_0xa9 = gPlayerState.field_0xa8;
gPlayerState.field_0xa8 = 0;
if (gPlayerState.field_0x40[0x4a] != 0) {
gPlayerState.field_0x40[0x4a]--;
return;
}
if ((gPlayerState.field_0x8b != 0) || (gTextBox.doTextBox & 0x7f))
return;
gRoomVars.unk2 = gTextBox.doTextBox & 0x7f;
temp = gSave.stats.maxHealth / 4;
if (temp > 24)
temp = 24;
if (temp < 8)
temp = 8;
if (gSave.stats.health <= temp) {
gRoomVars.unk2 = 1;
if ((gUnk_0200AF00.filler0[1] == 0) && gScreenTransition.frameCount % 90 == 0) {
EnqueueSFX(SFX_LOW_HEALTH);
}
}
if (gSave.stats.filler[2] == 0) {
gSave.stats.field_0x1c = 0;
} else if ((gSave.stats.field_0x1c == 0) || --gSave.stats.field_0x1c == 0) {
gSave.stats.filler[2] = 0;
PlaySFX(SFX_ICE_BLOCK_MELT);
}
if (gSave.stats.filler[3] == 0) {
gSave.stats.field_0x1e = 0;
} else if ((gSave.stats.field_0x1e == 0) || (--gSave.stats.field_0x1e == 0)) {
gSave.stats.filler[3] = 0;
PlaySFX(SFX_140);
} else if ((gSave.stats.field_0x1e & 0xf) == 0) {
CreateSparkle(this);
}
if (gSave.stats.floorType == 0) {
gSave.stats.field_0x20 = 0;
} else if ((gSave.stats.field_0x20 == 0) || --gSave.stats.field_0x20 == 0) {
gSave.stats.floorType = 0;
} else if ((gSave.stats.field_0x20 & 0x3f) == 0) {
// lava or water splash FX
CreateFx(this, 0x55 + gSave.stats.floorType, 0);
}
}
void sub_080171F0(void) {
if (gPlayerState.field_0x1a[0] != 0)
ResetPlayer();
if (gPlayerState.field_0x14 != 0)
gPlayerState.field_0x14--;
if (gPlayerEntity.field_0x7a.HWORD != 0)
gPlayerEntity.field_0x7a.HWORD--;
gPlayerEntity.bitfield &= ~0x80;
if (gPlayerEntity.action != 0x14)
gPlayerState.flags.all = (gPlayerState.flags.all & ~0x10000) | (0x8000 * (gPlayerState.flags.all & 2));
gPlayerState.flags.all &= ~2;
sub_080028E0(&gPlayerEntity);
if (gPlayerState.flags.all & 0x400000)
gUnk_0200AF00.filler25[10] = 1;
sub_08078180();
gPlayerState.field_0x7 &= ~0x80;
gPlayerState.field_0xa &= 0xf;
gPlayerState.keepFacing &= ~0x80;
gPlayerState.field_0x1a[0] = 0;
gPlayerState.field_0x80 = 0;
gPlayerState.field_0xaa = 0;
_DmaZero(&gUnk_03003BE0, 0x8c);
gPlayerEntity.spriteOffsetY = gPlayerState.field_0x3f;
gPlayerState.field_0x3f = 0;
sub_0807B0C8();
if (gPlayerState.flags.all & 0x400000)
gUnk_03004040[0]->spriteOffsetY = gUnk_03004040[1]->spriteOffsetY = gUnk_03004040[2]->spriteOffsetY = 0;
if (gPlayerEntity.action == 0x1d)
gPlayerState.flags.all |= 0x20000000;
else
gPlayerState.flags.all &= ~0x20000000;
sub_0807A8D8(&gPlayerEntity);
if (gPlayerState.jumpStatus & 0xc0)
gPlayerEntity.hurtBlinkTime = 0xfe;
if (gPlayerEntity.action != 0x17) {
sub_08077FEC(gPlayerEntity.action);
}
}
void sub_08017338(Entity *this) {
if (!(this->flags & 1) && !this->action && !this->previousActionFlag)
sub_080173A4(this);
if (!sub_0805E3B0(this)) {
gPlayerItemFunctions[this->entityType.subtype](this);
this->bitfield &= ~0x80;
if (this->hurtBlinkTime != 0) {
if (this->hurtBlinkTime > 0)
this->hurtBlinkTime--;
else
this->hurtBlinkTime++;
}
}
sub_0800404C(this);
}
// tiny regalloc
NONMATCH("asm/non_matching/sub_080173A4.inc", void sub_080173A4(Entity* this)) {
ItemFrame* entry;
entry = &gUnk_08126DA8[this->entityType.subtype];
if (entry->unk0 == 0xff) {
u32 temp = entry->unk2;
ItemFrame* temp2 = gUnk_08126ED8[entry->unk1];
entry = &temp2[this->field_0x68.HALF.LO - temp];
}
this->palette.raw = ((entry->unk0 & 0xf) << 4) | entry->unk0;
this->field_0x44 = entry->unk1;
this->field_0x40 = entry->unk3;
this->damageType = entry->unk4;
this->spriteIndex = entry->unk5;
if (entry->unk6 == 0)
this->spriteVramOffset = gPlayerEntity.spriteVramOffset;
else
this->spriteVramOffset = entry->unk6 & 0x3ff;
if (this->animationState == 0)
this->animationState = gPlayerEntity.animationState & 6;
this->collisionLayer = gPlayerEntity.collisionLayer;
this->spriteRendering.b3 = gPlayerEntity.spriteRendering.b3;
this->spritePriority.b0 = gPlayerEntity.spritePriority.b0;
this->spriteOrientation.flipY = gPlayerEntity.spriteOrientation.flipY;
this->currentHealth = 1;
this->flags |= 1;
}
END_NONMATCH
void sub_080174A4(Entity* this) {
int iVar1;
if (((this->flags & 1) == 0) && (this->action == 0)) {
sub_080A2838(this);
}
if (this->hurtBlinkTime != 0) {
this->hurtBlinkTime++;
}
if (!sub_0805E3B0(this)) {
gObjectFunctions[this->entityType.subtype](this);
this->bitfield &= ~0x80;
}
sub_0800404C(this);
}
void sub_08017508(Entity* this) {
if (!sub_0805E3B0(this))
gManagerFunctions[this->entityType.subtype](this);
}
// regalloc
NONMATCH("asm/non_matching/sub_08017530.inc", void sub_08017530(Entity* this)) {
if ((this->currentHealth & 0x7f) &&
!ReadBit(&gUnk_020342F8, this->currentHealth - 1)) {
DeleteThisEntity();
}
if ((this->action == 0) && ((this->flags & 1) == 0)) {
sub_0806EC78(this);
}
if (!sub_0805E3B0(this)) {
gNPCFunctions[this->entityType.subtype][0](this);
}
if (this->next != NULL) {
if (gNPCFunctions[this->entityType.subtype][1] != NULL) {
gNPCFunctions[this->entityType.subtype][1](this);
}
if ((this->currentHealth & 0x7f) != 0) {
u32 temp = this->currentHealth & 0x7f;
gUnk_02031EC0[temp * 2 - 2].x = this->x.HALF.HI - gRoomControls.roomOriginX;
gUnk_02031EC0[temp * 2 - 2].y = this->y.HALF.HI - gRoomControls.roomOriginY;
}
sub_0800404C(this);
}
}
END_NONMATCH
void sub_080175E8(void) {
gUnk_03003DB8 = 0;
}
void sub_080175F4(void) {
u32 flags;
u32 temp;
void (*func)(void);
temp = gUnk_03003DC0.unk0;
if (gUnk_03003DC0.unk0 <= gUnk_03003DC0.unk1)
temp = gUnk_03003DC0.unk1;
if (temp != 0)
return;
func = &gUnk_030059F0;
if (gPlayerState.field_0x8b != 0) {
u32 temp = gPlayerEntity.flags;
gPlayerEntity.flags &= 0x7f;
func();
gPlayerEntity.flags = temp;
} else {
func();
}
}
void sub_08017640(void) {
_DmaZero(&gUnk_03003C70,0x100);
gUnk_02018EA0 = (LinkedList2*)&gUnk_03003C70[0].last;
gUnk_03003C70[0].last = &gUnk_03003C70[0].last;
gUnk_03003C70[0].first = &gUnk_03003C70[0].last;
gUnk_03003C70[0].node = &gPlayerEntity;
}
// Loop declaration seems wrong
NONMATCH("asm/non_matching/sub_0801766C.inc", u32 sub_0801766C(Entity* this)) {
u32 uVar1;
LinkedList2* puVar3;
LinkedList2* puVar2;
LinkedList2* pLVar2;
LinkedList2* i;
u8* pbVar4;
if (this->spritePriority.b2 != 0) {
return 1;
} else {
for (i = &gUnk_03003C70[0]; i < &gUnk_03003C70[16]; ++i) {
if (i->node == NULL) {
i->node = this;
i->flags = 0;
this->spritePriority.b2 = 1;
pLVar2 = gUnk_02018EA0;
if (gUnk_02018EA0->flags != 0) {
do {
pLVar2 = pLVar2->first;
} while (pLVar2->flags != 0);
i->first = pLVar2;
puVar3 = pLVar2->last;
i->last = puVar3;
puVar3->first = i;
pLVar2->last = i;
} else {
i->first = gUnk_02018EA0;
puVar2 = gUnk_02018EA0->last;
i->last = puVar2;
puVar2->first = i;
gUnk_02018EA0->last = i;
gUnk_02018EA0 = i;
}
return 1;
}
}
return 0;
}
}
END_NONMATCH
// same loop issue
NONMATCH("asm/non_matching/sub_080176E4.inc", u32 sub_080176E4(Entity* this)) {
u32 uVar1;
LinkedList2* j;
LinkedList2* i;
u8* pbVar4;
if (this->spritePriority.b2 != 0) {
return 1;
} else {
for (i = &gUnk_03003C70[0]; i < &gUnk_03003C70[16]; ++i) {
if (i->node == NULL) {
i->node = this;
i->flags = 1;
this->spritePriority.b2 = 1;
i->first = gUnk_02018EA0;
j = gUnk_02018EA0->last;
i->last = j;
j->first = i;
gUnk_02018EA0->last = i;
gUnk_02018EA0 = i;
return 1;
}
}
return 0;
}
}
END_NONMATCH
// you guessed it
NONMATCH("asm/non_matching/sub_08016DF8.inc", void sub_08017744(Entity* this)) {
LinkedList2* i;
for (i = &gUnk_03003C70[0]; i < &gUnk_03003C70[16]; ++i) {
if (i->node == this) {
if (this->spritePriority.b2 != 0) {
this->spritePriority.b2 = 0;
i->node = NULL;
((LinkedList2*)i->last)->first = i->first;
((LinkedList2*)i->first)->last = i->last;
if (i != gUnk_02018EA0)
return;
gUnk_02018EA0 = i->first;
}
}
}
}
END_NONMATCH
// regalloc
NONMATCH("asm/non_matching/sub_080177A0.inc", bool32 sub_080177A0(Entity* this, Entity* that)) {
u32 this_d;
u32 depth;
if ((that->collisionLayer & this->collisionLayer) != 0) {
BoundingBox* bb_this = this->boundingBox;
BoundingBox* bb_that = that->boundingBox;
u32 this_w = bb_this->width;
u32 that_w = bb_that->width;
if ((((this->x.HALF.HI - that->x.HALF.HI) + bb_this->offset_x) - bb_that->offset_x) + this_w + that_w <= (this_w + that_w) * 2) {
u32 this_h = bb_this->height;
u32 that_h = bb_that->height;
if ((((this->y.HALF.HI - that->y.HALF.HI) + bb_this->offset_y) - bb_that->offset_y) + this_h + that_h <= (this_h + that_h) * 2) {
if ((this->field_0x3c & 0x10) != 0)
this_d = ((BoundingBox3D*)bb_this)->depth;
else
this_d = 5;
if ((that->field_0x3c & 0x10) != 0)
depth = this_d + ((BoundingBox3D*)bb_that)->depth;
else
depth = this_d + 5;
if ((this->height.HALF.HI - that->height.HALF.HI) + depth <= depth * 2)
return TRUE;
}
}
}
return FALSE;
}
END_NONMATCH
bool32 sub_08017850(Entity* this) {
if (sub_08079F8C())
return sub_080177A0(this, &gPlayerEntity);
return FALSE;
}

View File

@ -82,19 +82,19 @@ u32 SetBottleContents(u32 itemID, u32 bottleIndex) {
if (bottleIndex > 3) {
bottleIndex = 0;
if (gSave.stats.filler2[0] != 0x20) {
if (gSave.stats.bottles[0] != 0x20) {
do {
bottleIndex++;
if (bottleIndex > 3) {
return bottleIndex;
}
} while (gSave.stats.filler2[bottleIndex] != 0x20);
} while (gSave.stats.bottles[bottleIndex] != 0x20);
}
if (bottleIndex > 3) {
return bottleIndex;
}
}
gSave.stats.filler2[bottleIndex] = itemID;
gSave.stats.bottles[bottleIndex] = itemID;
return bottleIndex;
}
@ -134,13 +134,13 @@ u32 sub_080544C8(u32 arg0) {
}
u32 sub_080544DC(u32 arg0) {
if (arg0 == gSave.stats.filler2[0]) {
if (arg0 == gSave.stats.bottles[0]) {
return 1;
} else if (arg0 == gSave.stats.filler2[1]) {
} else if (arg0 == gSave.stats.bottles[1]) {
return 2;
} else if (arg0 == gSave.stats.filler2[2]) {
} else if (arg0 == gSave.stats.bottles[2]) {
return 3;
} else if (arg0 == gSave.stats.filler2[3]) {
} else if (arg0 == gSave.stats.bottles[3]) {
return 4;
} else {
return 0;

View File

@ -101,7 +101,7 @@ void sub_0805ECEC(int param_1, u32 param_2, u32 param_3, u32 param_4) {
}
void sub_0805ED14(u32 param_1) {
gPlayerState.field_0x9c[0] = param_1;
gPlayerState.field_0x9c = param_1;
gPlayerState.field_0x98 = 0;
gPlayerState.field_0x9a = 0;
}

View File

@ -185,16 +185,16 @@ const u16 gUnk_080CB79C[] = {
};
const BoundingBox gUnk_080CB7A4 = { 0x00, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x08, 0x06 };
const BoundingBox gUnk_080CB7AC = { 0x00, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x06, 0x04 };
const BoundingBox gUnk_080CB7B4 = { 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x06, 0x04 };
const BoundingBox gUnk_080CB7A4 = { 0x00, -9, 0x00, 0x00, 0x00, 0x00, 0x08, 0x06 };
const BoundingBox gUnk_080CB7AC = { 0x00, -5, 0x00, 0x00, 0x00, 0x00, 0x06, 0x04 };
const BoundingBox gUnk_080CB7B4 = { 0x00, -1, 0x00, 0x00, 0x00, 0x00, 0x06, 0x04 };
const BoundingBox gUnk_080CB7BC = { 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x06, 0x08 };
const BoundingBox gUnk_080CB7C4 = { 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0c };
const BoundingBox gUnk_080CB7CC = { 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08 };
const BoundingBox gUnk_080CB7D4 = { 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04 };
const BoundingBox gUnk_080CB7DC = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04 };
const BoundingBox gUnk_080CB7E4 = { 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08 };
const BoundingBox gUnk_080CB7EC = { 0x00, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0c };
const BoundingBox gUnk_080CB7E4 = { 0x00, -8, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08 };
const BoundingBox gUnk_080CB7EC = { 0x00, -12, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0c };
const BoundingBox *const gUnk_080CB7F4[] = {
&gUnk_080CB7A4,
@ -214,10 +214,10 @@ const BoundingBox *const gUnk_080CB7F4[] = {
const BoundingBox gUnk_080CB824 = { 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08 };
const BoundingBox gUnk_080CB82C = { 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08 };
const BoundingBox gUnk_080CB834 = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08 };
const BoundingBox gUnk_080CB83C = { 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08 };
const BoundingBox gUnk_080CB844 = { 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x08 };
const BoundingBox gUnk_080CB84C = { 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08 };
const BoundingBox gUnk_080CB854 = { 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08 };
const BoundingBox gUnk_080CB83C = { -8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08 };
const BoundingBox gUnk_080CB844 = { -12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x08 };
const BoundingBox gUnk_080CB84C = { -8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08 };
const BoundingBox gUnk_080CB854 = { -4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08 };
const BoundingBox gUnk_080CB85C = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08 };
const BoundingBox gUnk_080CB864 = { 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08 };
const BoundingBox gUnk_080CB86C = { 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x08 };

View File

@ -305,8 +305,8 @@ void sub_0802C058(Entity* this, u32 param_2) {
}
bool32 sub_0802C06C(Entity* this) {
u32 x = this->x.HALF.HI + (s8)this->boundingBox->unknown[0];
u32 y = this->y.HALF.HI + (s8)this->boundingBox->unknown[1];
u32 x = this->x.HALF.HI + this->boundingBox->offset_x;
u32 y = this->y.HALF.HI + this->boundingBox->offset_y;
u32 xdiff = gUnk_080CD45C[(this->direction >> 2) + 0];
u32 ydiff = gUnk_080CD45C[(this->direction >> 2) + 1];
@ -330,8 +330,8 @@ bool32 sub_0802C0E8(Entity* this) {
return TRUE;
} else {
const s8* ptr = &gUnk_080CD45C[this->direction >> 2];
s32 x = this->x.HALF.HI + (s8)this->boundingBox->unknown[0] + ptr[0] * 6;
s32 y = this->y.HALF.HI + (s8)this->boundingBox->unknown[1] + ptr[1] * 6;
s32 x = this->x.HALF.HI + this->boundingBox->offset_x + ptr[0] * 6;
s32 y = this->y.HALF.HI + this->boundingBox->offset_y + ptr[1] * 6;
Entity* ent = this->collisionLayer == 2 ? &gUnk_0200D654 : &gUnk_02027EB4;
u32 ret = FALSE;

View File

@ -203,10 +203,10 @@ void sub_08028528(Entity* this) {
} else {
sub_080288C0(this);
box = gUnk_080CC944[this->animationState >> 1];
this->boundingBox->unknown[0] = box->unknown[0];
this->boundingBox->unknown[1] = box->unknown[1];
this->boundingBox->unknown[6] = box->unknown[6];
this->boundingBox->unknown[7] = box->unknown[7];
this->boundingBox->offset_x = box->offset_x;
this->boundingBox->offset_y = box->offset_y;
this->boundingBox->width = box->width;
this->boundingBox->height = box->height;
if (this->field_0x7a.HALF.LO != 0) {
this->field_0x7a.HALF.LO = 0;
@ -365,10 +365,10 @@ void sub_08028858(Entity* this) {
sub_080288C0(this);
box = gUnk_080CC944[this->animationState >> 1];
this->boundingBox->unknown[0] = box->unknown[0];
this->boundingBox->unknown[1] = box->unknown[1];
this->boundingBox->unknown[6] = box->unknown[6];
this->boundingBox->unknown[7] = box->unknown[7];
this->boundingBox->offset_x = box->offset_x;
this->boundingBox->offset_y = box->offset_y;
this->boundingBox->width = box->width;
this->boundingBox->height = box->height;
if (this->field_0x82.HALF.LO == 0) {
this->nonPlanarMovement = 0;

View File

@ -36,7 +36,7 @@ void sub_08033564(Entity* this) {
this->flags &= 0x7f;
this->field_0x7c.HALF.LO = 0x27c;
gPlayerState.flags.all |= 0x4000;
gSave.stats.filler2[4] = this->entityType.form + 1;
gSave.stats.floorType = this->entityType.form + 1;
gSave.stats.field_0x20 = 600;
if (this->entityType.form == 0) {
break;

View File

@ -5,7 +5,7 @@
extern void DeleteThisEntity();
extern void sub_08078CD0(Entity*);
extern void sub_08018FA0(Entity*);
extern void sub_0801766C(Entity*);
extern u32 sub_0801766C(Entity*);
extern void sub_08018F6C(Entity*);
extern void (*const gUnk_080B3DD0[])(Entity*);

View File

@ -30,8 +30,8 @@ void MineralWaterSource_Init(Entity* this) {
this->entityType.parameter = unknownParameters->field_0x00;
this->field_0x40 = unknownParameters->field_0x03;
this->boundingBox->unknown[6] = unknownParameters->field_0x01;
this->boundingBox->unknown[7] = unknownParameters->field_0x02;
this->boundingBox->width = unknownParameters->field_0x01;
this->boundingBox->height = unknownParameters->field_0x02;
this->flags |= 0x80;

View File

@ -234,10 +234,10 @@ void sub_0808F498(Entity* this) {
this->action = 1;
this->actionDelay = 64;
var0 = this->entityType.parameter != 0 ? 44 : 43;
this->x.HALF.HI -= this->parent->boundingBox->unknown[6];
this->x.HALF.HI += (s32)Random() % (this->parent->boundingBox->unknown[6] * 2);
this->y.HALF.HI -= this->parent->boundingBox->unknown[7];
this->y.HALF.HI += (s32)Random() % (this->parent->boundingBox->unknown[7] * 2);
this->x.HALF.HI -= this->parent->boundingBox->width;
this->x.HALF.HI += (s32)Random() % (this->parent->boundingBox->width * 2);
this->y.HALF.HI -= this->parent->boundingBox->height;
this->y.HALF.HI += (s32)Random() % (this->parent->boundingBox->height * 2);
sub_0801D2B4(this, var0);
InitializeAnimation(this, 4);
}

View File

@ -5236,7 +5236,7 @@ void sub_0804EEBC(void) {
LoadRoomEntityList(&gUnk_080F5848);
}
}
if (gSave.stats.filler2[5] == 0) {
if (gSave.stats.filler3[0] == 0) {
LoadRoomEntityList(&gUnk_080F5788);
}
}