Merge and split game

This commit is contained in:
octorock
2022-03-02 21:03:41 +01:00
parent 5efe982847
commit 052bacdbad
19 changed files with 1683 additions and 2445 deletions
-1712
View File
File diff suppressed because it is too large Load Diff
-207
View File
@@ -1,207 +0,0 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.syntax unified
.text
thumb_func_start sub_0805488C
sub_0805488C: @ 0x0805488C
push {r4, lr}
ldr r4, _080548DC @ =gUnk_02032EC0
ldrb r1, [r4, #3]
lsls r0, r1, #2
adds r0, r0, r1
lsls r0, r0, #2
ldr r1, _080548E0 @ =gUnk_080FE320
adds r0, r0, r1
ldr r2, _080548E4 @ =gMenu
ldrb r1, [r0]
movs r3, #0
strb r1, [r2]
ldrb r1, [r0, #1]
strb r1, [r2, #3]
ldrb r1, [r4, #3]
strb r1, [r2, #4]
str r0, [r2, #0xc]
ldrb r0, [r2, #5]
adds r0, #1
strb r0, [r2, #5]
strb r3, [r2, #6]
movs r0, #0x96
lsls r0, r0, #1
strh r0, [r2, #8]
movs r0, #0
bl DispReset
ldrb r0, [r4, #3]
movs r1, #1
bl sub_08054974
bl sub_0806F364
movs r0, #0xff
bl ClearRoomFlag
bl sub_080548E8
pop {r4, pc}
.align 2, 0
_080548DC: .4byte gUnk_02032EC0
_080548E0: .4byte gUnk_080FE320
_080548E4: .4byte gMenu
thumb_func_start sub_080548E8
sub_080548E8: @ 0x080548E8
push {lr}
ldr r1, _08054918 @ =gUnk_080FE2AC
ldr r0, _0805491C @ =gMenu
ldrb r0, [r0]
lsls r0, r0, #2
adds r0, r0, r1
ldr r0, [r0]
bl _call_via_r0
bl FlushSprites
bl UpdateEntities
bl DrawEntities
bl CopyOAM
bl UpdateScroll
bl UpdateBgAnim
bl UpdateScrollVram
pop {pc}
.align 2, 0
_08054918: .4byte gUnk_080FE2AC
_0805491C: .4byte gMenu
thumb_func_start sub_08054920
sub_08054920: @ 0x08054920
push {lr}
bl MessageInitialize
bl sub_0806F38C
ldr r1, _08054948 @ =gUnk_080C9CBC
ldr r0, _0805494C @ =gFuseInfo
ldrb r0, [r0, #3]
lsls r0, r0, #3
adds r0, r0, r1
ldrb r0, [r0, #7]
cmp r0, #0
beq _08054954
ldr r0, _08054950 @ =gUnk_02032EC0
ldrb r1, [r0, #3]
movs r0, #0xa
bl MenuFadeIn
b _08054962
.align 2, 0
_08054948: .4byte gUnk_080C9CBC
_0805494C: .4byte gFuseInfo
_08054950: .4byte gUnk_02032EC0
_08054954:
ldr r1, _08054964 @ =gUnk_02032EC0
movs r0, #3
strb r0, [r1]
movs r0, #7
movs r1, #0x10
bl SetFade
_08054962:
pop {pc}
.align 2, 0
_08054964: .4byte gUnk_02032EC0
thumb_func_start sub_08054968
sub_08054968: @ 0x08054968
ldr r1, _08054970 @ =gMenu
movs r0, #2
strb r0, [r1, #5]
bx lr
.align 2, 0
_08054970: .4byte gMenu
thumb_func_start sub_08054974
sub_08054974: @ 0x08054974
push {r4, r5, r6, lr}
adds r5, r1, #0
lsls r1, r0, #2
adds r1, r1, r0
lsls r1, r1, #2
ldr r0, _080549B0 @ =gUnk_080FE320
adds r6, r1, r0
ldrb r0, [r6, #2]
ldrb r1, [r6, #3]
bl SetCurrentRoomPropertyList
ldr r4, _080549B4 @ =gRoomControls
ldrb r0, [r6, #2]
strb r0, [r4, #4]
ldrb r0, [r6, #3]
strb r0, [r4, #5]
bl LoadGfxGroups
ldrb r0, [r4, #4]
bl GetFlagBankOffset
ldr r1, _080549B8 @ =gArea
strh r0, [r1, #4]
cmp r5, #0
beq _080549BC
ldrb r0, [r6, #2]
ldrb r1, [r6, #3]
bl LoadAuxiliaryRoom
b _080549CE
.align 2, 0
_080549B0: .4byte gUnk_080FE320
_080549B4: .4byte gRoomControls
_080549B8: .4byte gArea
_080549BC:
ldrb r0, [r6, #2]
ldrb r1, [r6, #3]
bl sub_08052FF4
bl sub_0807C740
ldr r1, _08054A00 @ =gUpdateVisibleTiles
movs r0, #1
strb r0, [r1]
_080549CE:
ldr r2, _08054A04 @ =gScreen
ldrh r1, [r2]
ldr r0, _08054A08 @ =0x00001FFF
ands r0, r1
strh r0, [r2]
ldr r1, _08054A0C @ =gRoomControls
ldrh r0, [r6, #4]
ldrh r2, [r1, #6]
adds r0, r0, r2
strh r0, [r1, #0xa]
ldrh r0, [r6, #6]
ldrh r2, [r1, #8]
adds r0, r0, r2
strh r0, [r1, #0xc]
ldrb r0, [r6, #2]
cmp r0, #2
bne _080549F4
bl TryLoadPrologueHyruleTown
_080549F4:
ldr r0, _08054A10 @ =gUnk_02032EC0
ldrb r0, [r0, #3]
bl sub_08018710
pop {r4, r5, r6, pc}
.align 2, 0
_08054A00: .4byte gUpdateVisibleTiles
_08054A04: .4byte gScreen
_08054A08: .4byte 0x00001FFF
_08054A0C: .4byte gRoomControls
_08054A10: .4byte gUnk_02032EC0
thumb_func_start sub_08054A14
sub_08054A14: @ 0x08054A14
push {lr}
lsls r1, r0, #2
adds r1, r1, r0
lsls r1, r1, #2
ldr r0, _08054A38 @ =gUnk_080FE320
adds r2, r1, r0
ldrb r0, [r2, #0x11]
cmp r0, #0xd
bhi _08054A34
ldr r1, _08054A3C @ =gLocalFlagBanks
lsls r0, r0, #1
adds r0, r0, r1
ldrh r0, [r0]
ldrh r1, [r2, #0x12]
bl SetLocalFlagByBank
_08054A34:
pop {pc}
.align 2, 0
_08054A38: .4byte gUnk_080FE320
_08054A3C: .4byte gLocalFlagBanks
-40
View File
@@ -1,40 +0,0 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.syntax unified
.text
thumb_func_start ModArrows
ModArrows: @ 0x08054330
push {lr}
adds r3, r0, #0
ldr r1, _08054354 @ =gSave
adds r0, r1, #0
adds r0, #0xad
ldrb r0, [r0]
adds r3, r3, r0
ldr r2, _08054358 @ =gQuiverSizes
adds r0, r1, #0
adds r0, #0xaf
ldrb r0, [r0]
adds r0, r0, r2
ldrb r2, [r0]
cmp r3, #0
bge _0805435C
movs r3, #0
b _08054362
.align 2, 0
_08054354: .4byte gSave
_08054358: .4byte gQuiverSizes
_0805435C:
cmp r2, r3
bge _08054362
adds r3, r2, #0
_08054362:
adds r0, r1, #0
adds r0, #0xad
strb r3, [r0]
pop {pc}
.align 2, 0
-40
View File
@@ -1,40 +0,0 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.syntax unified
.text
thumb_func_start ModBombs
ModBombs: @ 0x080542F4
push {lr}
adds r3, r0, #0
ldr r1, _08054318 @ =gSave
adds r0, r1, #0
adds r0, #0xac
ldrb r0, [r0]
adds r3, r3, r0
ldr r2, _0805431C @ =gBombBagSizes
adds r0, r1, #0
adds r0, #0xae
ldrb r0, [r0]
adds r0, r0, r2
ldrb r2, [r0]
cmp r3, #0
bge _08054320
movs r3, #0
b _08054326
.align 2, 0
_08054318: .4byte gSave
_0805431C: .4byte gBombBagSizes
_08054320:
cmp r2, r3
bge _08054326
adds r3, r2, #0
_08054326:
adds r0, r1, #0
adds r0, #0xac
strb r3, [r0]
pop {pc}
.align 2, 0
@@ -15,7 +15,7 @@ _08087CC6:
adds r0, #0x81
ldrb r0, [r0]
rsbs r0, r0, #0
bl sub_080542C0
bl ModShells
bl Random
movs r1, #0x7f
ands r1, r0
@@ -141,7 +141,7 @@ _08088332:
adds r0, #0x81
ldrb r0, [r0]
rsbs r0, r0, #0
bl sub_080542C0
bl ModShells
bl Random
movs r1, #0x7f
ands r1, r0
+314
View File
@@ -0,0 +1,314 @@
.syntax unified
push {r4, r5, r6, r7, lr}
mov r7, r8
push {r7}
adds r6, r0, #0
adds r7, r1, #0
bl GetInventoryValue
adds r5, r0, #0
lsls r1, r6, #3
ldr r0, _08054010 @ =gItemMetaData
adds r4, r1, r0
cmp r5, #0
bne _08054014
ldrh r0, [r4, #4]
mov r8, r0
b _08054018
.align 2, 0
_08054010: .4byte gItemMetaData
_08054014:
ldrh r2, [r4, #6]
mov r8, r2
_08054018:
adds r0, r6, #0
bl ItemIsBottle
cmp r0, #0
bne _08054034
adds r0, r6, #0
bl PutItemOnSlot
cmp r5, #0
bne _08054034
adds r0, r6, #0
movs r1, #1
bl SetInventoryValue
_08054034:
ldrb r0, [r4, #1]
cmp r0, #0x12
bls _0805403C
b _0805427C
_0805403C:
lsls r0, r0, #2
ldr r1, _08054048 @ =_0805404C
adds r0, r0, r1
ldr r0, [r0]
mov pc, r0
.align 2, 0
_08054048: .4byte _0805404C
_0805404C: @ jump table
.4byte _0805427C @ case 0
.4byte _08054098 @ case 1
.4byte _080540A6 @ case 2
.4byte _080540C0 @ case 3
.4byte _08054104 @ case 4
.4byte _0805414C @ case 5
.4byte _08054154 @ case 6
.4byte _08054194 @ case 7
.4byte _080541B6 @ case 8
.4byte _080541F0 @ case 9
.4byte _08054212 @ case 10
.4byte _080541F8 @ case 11
.4byte _08054238 @ case 12
.4byte _08054174 @ case 13
.4byte _08054240 @ case 14
.4byte _0805425C @ case 15
.4byte _08054264 @ case 16
.4byte _080541B0 @ case 17
.4byte _0805417C @ case 18
_08054098:
ldrb r0, [r4, #2]
bl ModHealth
movs r0, #0x71
bl SoundReq
b _0805427C
_080540A6:
ldr r0, _080540BC @ =gUnk_080FD5A8
ldrb r1, [r4, #2]
lsls r1, r1, #1
adds r1, r1, r0
ldrh r0, [r1]
bl ModRupees
movs r0, #0x6f
bl SoundReq
b _0805427C
.align 2, 0
_080540BC: .4byte gUnk_080FD5A8
_080540C0:
movs r5, #0
movs r4, #0x1c
b _080540CA
_080540C6:
adds r4, r1, #1
adds r5, #1
_080540CA:
cmp r5, #3
bls _080540D0
b _0805427C
_080540D0:
adds r0, r4, #0
bl GetInventoryValue
adds r1, r4, #0
cmp r0, #0
bne _080540C6
adds r6, r4, #0
ldr r0, _08054100 @ =gSave
adds r0, #0xb6
adds r1, r5, r0
ldrb r0, [r1]
cmp r0, #0
bne _080540EE
movs r0, #0x20
strb r0, [r1]
_080540EE:
adds r0, r6, #0
movs r1, #1
bl SetInventoryValue
adds r0, r6, #0
bl PutItemOnSlot
b _0805427C
.align 2, 0
_08054100: .4byte gSave
_08054104:
movs r5, #0
ldr r0, _08054144 @ =gSave
adds r2, r0, #0
adds r2, #0xb6
ldrb r1, [r2]
adds r3, r0, #0
cmp r1, #0x20
beq _08054126
adds r1, r2, #0
_08054116:
adds r5, #1
cmp r5, #3
bls _0805411E
b _0805427C
_0805411E:
adds r0, r5, r1
ldrb r0, [r0]
cmp r0, #0x20
bne _08054116
_08054126:
cmp r5, #3
bls _0805412C
b _0805427C
_0805412C:
adds r0, r3, #0
adds r0, #0xb6
adds r0, r5, r0
strb r6, [r0]
adds r0, r6, #0
movs r1, #1
bl SetInventoryValue
ldr r0, _08054148 @ =0x00000109
bl SoundReq
b _0805427C
.align 2, 0
_08054144: .4byte gSave
_08054148: .4byte 0x00000109
_0805414C:
movs r0, #1
bl sub_080526F8
b _0805424E
_08054154:
ldr r1, _08054168 @ =gSave
ldr r0, _0805416C @ =gArea
ldr r2, _08054170 @ =0x0000046C
adds r1, r1, r2
ldrb r0, [r0, #3]
adds r1, r1, r0
ldrb r0, [r1]
ldrb r2, [r4, #2]
orrs r0, r2
b _0805427A
.align 2, 0
_08054168: .4byte gSave
_0805416C: .4byte gArea
_08054170: .4byte 0x0000046C
_08054174:
movs r0, #0x72
bl sub_0801E738
b _0805427C
_0805417C:
cmp r6, #0xb
bne _0805418A
movs r0, #0xc
movs r1, #0
bl SetInventoryValue
b _080541B0
_0805418A:
movs r0, #0xb
movs r1, #0
bl SetInventoryValue
b _080541B0
_08054194:
cmp r6, #7
bne _080541A2
movs r0, #8
movs r1, #0
bl SetInventoryValue
b _080541AA
_080541A2:
movs r0, #7
movs r1, #0
bl SetInventoryValue
_080541AA:
movs r0, #0x63
bl ModBombs
_080541B0:
bl LoadItemGfx
b _0805427C
_080541B6:
cmp r5, #0
bne _080541CA
movs r0, #7
movs r1, #1
bl SetInventoryValue
movs r0, #7
bl PutItemOnSlot
b _080541E2
_080541CA:
ldr r0, _080541EC @ =gSave
adds r1, r0, #0
adds r1, #0xae
ldrb r0, [r1]
adds r0, #1
strb r0, [r1]
lsls r0, r0, #0x18
lsrs r0, r0, #0x18
cmp r0, #3
bls _080541E2
movs r0, #3
strb r0, [r1]
_080541E2:
movs r0, #0x63
bl ModBombs
b _0805427C
.align 2, 0
_080541EC: .4byte gSave
_080541F0:
ldrb r0, [r4, #2]
bl ModBombs
b _0805424E
_080541F8:
movs r0, #0x66
bl GetInventoryValue
cmp r0, #0
bne _0805420A
movs r0, #0x66
movs r1, #1
bl SetInventoryValue
_0805420A:
movs r0, #0x63
bl ModArrows
b _080541B0
_08054212:
ldr r0, _08054234 @ =gSave
adds r1, r0, #0
adds r1, #0xaf
ldrb r0, [r1]
adds r0, #1
strb r0, [r1]
lsls r0, r0, #0x18
lsrs r0, r0, #0x18
cmp r0, #3
bls _0805422A
movs r0, #3
strb r0, [r1]
_0805422A:
movs r0, #0x63
bl ModArrows
b _0805427C
.align 2, 0
_08054234: .4byte gSave
_08054238:
ldrb r0, [r4, #2]
bl ModArrows
b _0805424E
_08054240:
movs r0, #0x3f
movs r1, #1
bl SetInventoryValue
adds r0, r7, #0
bl ModShells
_0805424E:
ldr r0, _08054258 @ =0x00000103
bl SoundReq
b _0805427C
.align 2, 0
_08054258: .4byte 0x00000103
_0805425C:
adds r0, r7, #0
bl sub_0801E738
b _0805427C
_08054264:
ldr r0, _08054284 @ =gSave
adds r1, r0, #0
adds r1, #0xa8
ldrb r0, [r1]
adds r0, #1
strb r0, [r1]
lsls r0, r0, #0x18
lsrs r0, r0, #0x18
cmp r0, #3
bls _0805427C
movs r0, #3
_0805427A:
strb r0, [r1]
_0805427C:
mov r0, r8
pop {r3}
mov r8, r3
pop {r4, r5, r6, r7, pc}
.align 2, 0
_08054284: .4byte gSave
.syntax divided
+72
View File
@@ -0,0 +1,72 @@
.syntax unified
push {r4, lr}
ldr r1, _080537DC @ =gMenu
movs r2, #0
movs r3, #1
strb r3, [r1, #6]
movs r4, #0
movs r0, #0x78
strh r0, [r1, #8]
movs r0, #0x1e
strh r0, [r1, #0xa]
strb r4, [r1, #0x10]
ldr r0, _080537E0 @ =gUnk_02032EC0
strb r3, [r0, #6]
ldr r0, _080537E4 @ =gMapBottom
str r2, [r0]
ldr r0, _080537E8 @ =gMapTop
str r2, [r0]
ldr r0, _080537EC @ =gRoomControls
str r2, [r0, #0x30]
strh r2, [r0, #0xc]
strh r2, [r0, #0xa]
bl sub_0801B170
movs r0, #0
bl DispReset
ldr r2, _080537F0 @ =gScreen
movs r0, #0x99
lsls r0, r0, #6
strh r0, [r2]
adds r1, r2, #0
adds r1, #0x66
ldr r0, _080537F4 @ =0x00002244
strh r0, [r1]
adds r1, #2
movs r0, #0x80
lsls r0, r0, #5
strh r0, [r1]
subs r1, #8
movs r0, #0x1f
strh r0, [r1]
adds r1, #2
movs r0, #0x3f
strh r0, [r1]
subs r1, #0xa
movs r0, #0xf0
strh r0, [r1]
adds r1, #4
movs r0, #0x60
strh r0, [r1]
ldr r0, _080537F8 @ =0x00001C4E
strh r0, [r2, #0x14]
ldr r0, _080537FC @ =0x00001DC1
strh r0, [r2, #0x20]
movs r0, #0xf
bl SoundReq
bl ResetSystemPriority
movs r1, #0x80
lsls r1, r1, #1
movs r0, #5
bl SetFade
pop {r4, pc}
.align 2, 0
_080537DC: .4byte gMenu
_080537E0: .4byte gUnk_02032EC0
_080537E4: .4byte gMapBottom
_080537E8: .4byte gMapTop
_080537EC: .4byte gRoomControls
_080537F0: .4byte gScreen
_080537F4: .4byte 0x00002244
_080537F8: .4byte 0x00001C4E
_080537FC: .4byte 0x00001DC1
.syntax divided
+67
View File
@@ -0,0 +1,67 @@
.syntax unified
push {r4, r5, lr}
ldr r0, _0805387C @ =gFadeControl
ldrb r0, [r0]
cmp r0, #0
bne _0805387A
ldr r1, _08053880 @ =gMenu
ldrb r5, [r1, #0x10]
lsls r4, r5, #1
adds r4, r4, r5
lsls r4, r4, #2
ldr r0, _08053884 @ =gUnk_080FCCB4
adds r4, r4, r0
ldrh r0, [r4, #8]
movs r2, #0
strh r0, [r1, #8]
movs r0, #0x1e
strh r0, [r1, #0xa]
ldrb r0, [r1, #0x10]
adds r0, #1
strb r0, [r1, #0x10]
ldrb r0, [r1, #6]
adds r0, #1
strb r0, [r1, #6]
strb r2, [r1, #7]
adds r0, r5, #0
adds r0, #0x8a
bl LoadPaletteGroup
adds r0, r5, #0
adds r0, #0x3a
bl LoadGfxGroup
ldr r0, _08053888 @ =gBG1Buffer
movs r1, #0x80
lsls r1, r1, #4
bl MemClear
ldr r0, _0805388C @ =0x00000F01
adds r5, r5, r0
ldr r1, [r4]
adds r0, r5, #0
bl sub_0805F46C
ldr r2, _08053890 @ =gScreen
movs r0, #1
strh r0, [r2, #0x1a]
adds r1, r2, #0
adds r1, #0x68
movs r0, #0x10
strh r0, [r1]
ldrh r1, [r4, #4]
adds r0, r2, #0
adds r0, #0x58
strh r1, [r0]
ldrh r1, [r4, #6]
adds r0, #4
strh r1, [r0]
ldrh r1, [r4, #0xa]
movs r0, #4
bl SetFade
_0805387A:
pop {r4, r5, pc}
.align 2, 0
_0805387C: .4byte gFadeControl
_08053880: .4byte gMenu
_08053884: .4byte gUnk_080FCCB4
_08053888: .4byte gBG1Buffer
_0805388C: .4byte 0x00000F01
_08053890: .4byte gScreen
.syntax divided
+57
View File
@@ -0,0 +1,57 @@
.syntax unified
push {r4, lr}
ldr r0, _080538B4 @ =gFadeControl
ldrb r0, [r0]
cmp r0, #0
bne _080538F8
ldr r1, _080538B8 @ =gMenu
ldrh r0, [r1, #8]
subs r0, #1
strh r0, [r1, #8]
ldrh r0, [r1, #0xa]
adds r4, r1, #0
cmp r0, #0
beq _080538BC
subs r0, #1
strh r0, [r4, #0xa]
b _080538E4
.align 2, 0
_080538B4: .4byte gFadeControl
_080538B8: .4byte gMenu
_080538BC:
ldr r0, _080538FC @ =gRoomTransition
ldr r0, [r0]
movs r1, #1
ands r0, r1
cmp r0, #0
bne _080538E4
ldrb r1, [r4, #7]
cmp r1, #0xf
bhi _080538E4
adds r1, #1
strb r1, [r4, #7]
lsls r1, r1, #0x18
ldr r3, _08053900 @ =gScreen
lsrs r2, r1, #0x10
lsrs r1, r1, #0x19
movs r0, #0x10
subs r0, r0, r1
orrs r2, r0
adds r3, #0x68
strh r2, [r3]
_080538E4:
ldrh r0, [r4, #8]
cmp r0, #0
bne _080538F8
ldrb r0, [r4, #6]
adds r0, #1
strb r0, [r4, #6]
movs r0, #5
movs r1, #8
bl SetFade
_080538F8:
pop {r4, pc}
.align 2, 0
_080538FC: .4byte gRoomTransition
_08053900: .4byte gScreen
.syntax divided
+57
View File
@@ -0,0 +1,57 @@
.syntax unified
push {r4, lr}
ldr r0, _08053924 @ =gFadeControl
ldrb r0, [r0]
cmp r0, #0
bne _08053968
ldr r1, _08053928 @ =gMenu
ldrh r0, [r1, #8]
subs r0, #1
strh r0, [r1, #8]
ldrh r0, [r1, #0xa]
adds r4, r1, #0
cmp r0, #0
beq _0805392C
subs r0, #1
strh r0, [r4, #0xa]
b _08053954
.align 2, 0
_08053924: .4byte gFadeControl
_08053928: .4byte gMenu
_0805392C:
ldr r0, _0805396C @ =gRoomTransition
ldr r0, [r0]
movs r1, #1
ands r0, r1
cmp r0, #0
bne _08053954
ldrb r1, [r4, #7]
cmp r1, #0xf
bhi _08053954
adds r1, #1
strb r1, [r4, #7]
lsls r1, r1, #0x18
ldr r3, _08053970 @ =gScreen
lsrs r2, r1, #0x10
lsrs r1, r1, #0x19
movs r0, #0x10
subs r0, r0, r1
orrs r2, r0
adds r3, #0x68
strh r2, [r3]
_08053954:
ldrh r0, [r4, #8]
cmp r0, #0
bne _08053968
ldrb r0, [r4, #6]
adds r0, #1
strb r0, [r4, #6]
movs r0, #5
movs r1, #1
bl SetFade
_08053968:
pop {r4, pc}
.align 2, 0
_0805396C: .4byte gRoomTransition
_08053970: .4byte gScreen
.syntax divided
+47
View File
@@ -0,0 +1,47 @@
.syntax unified
push {r4, r5, r6, lr}
ldr r6, _08053D20 @ =gMenu
ldrb r4, [r6, #3]
lsls r4, r4, #4
ldr r0, _08053D24 @ =gUnk_080FCF04
adds r4, r4, r0
adds r0, r4, #0
adds r0, #8
str r0, [r6, #0xc]
ldr r0, [r4]
bl LoadRoomEntityList
ldrb r0, [r4, #4]
ldrb r1, [r4, #5]
movs r2, #1
bl GetRoomProperty
bl LoadRoomEntityList
ldrb r0, [r4, #4]
ldrb r1, [r4, #5]
movs r2, #2
bl GetRoomProperty
bl LoadRoomEntityList
movs r5, #1
strb r5, [r6, #6]
ldr r2, _08053D28 @ =gScreen
ldrh r1, [r2]
ldr r0, _08053D2C @ =0x0000FEFF
ands r0, r1
strh r0, [r2]
ldr r0, _08053D30 @ =gUpdateVisibleTiles
strb r5, [r0]
movs r0, #4
movs r1, #0x10
bl SetFade
ldrb r0, [r4, #5]
cmp r0, #0x1d
bne _08053D1E
strh r5, [r6, #0xa]
_08053D1E:
pop {r4, r5, r6, pc}
.align 2, 0
_08053D20: .4byte gMenu
_08053D24: .4byte gUnk_080FCF04
_08053D28: .4byte gScreen
_08053D2C: .4byte 0x0000FEFF
_08053D30: .4byte gUpdateVisibleTiles
.syntax divided
+40
View File
@@ -0,0 +1,40 @@
.syntax unified
push {r4, lr}
ldr r4, _080548DC @ =gUnk_02032EC0
ldrb r1, [r4, #3]
lsls r0, r1, #2
adds r0, r0, r1
lsls r0, r0, #2
ldr r1, _080548E0 @ =gUnk_080FE320
adds r0, r0, r1
ldr r2, _080548E4 @ =gMenu
ldrb r1, [r0]
movs r3, #0
strb r1, [r2]
ldrb r1, [r0, #1]
strb r1, [r2, #3]
ldrb r1, [r4, #3]
strb r1, [r2, #4]
str r0, [r2, #0xc]
ldrb r0, [r2, #5]
adds r0, #1
strb r0, [r2, #5]
strb r3, [r2, #6]
movs r0, #0x96
lsls r0, r0, #1
strh r0, [r2, #8]
movs r0, #0
bl DispReset
ldrb r0, [r4, #3]
movs r1, #1
bl sub_08054974
bl sub_0806F364
movs r0, #0xff
bl ClearRoomFlag
bl sub_080548E8
pop {r4, pc}
.align 2, 0
_080548DC: .4byte gUnk_02032EC0
_080548E0: .4byte gUnk_080FE320
_080548E4: .4byte gMenu
.syntax divided
+33
View File
@@ -0,0 +1,33 @@
.syntax unified
push {lr}
bl MessageInitialize
bl sub_0806F38C
ldr r1, _08054948 @ =gUnk_080C9CBC
ldr r0, _0805494C @ =gFuseInfo
ldrb r0, [r0, #3]
lsls r0, r0, #3
adds r0, r0, r1
ldrb r0, [r0, #7]
cmp r0, #0
beq _08054954
ldr r0, _08054950 @ =gUnk_02032EC0
ldrb r1, [r0, #3]
movs r0, #0xa
bl MenuFadeIn
b _08054962
.align 2, 0
_08054948: .4byte gUnk_080C9CBC
_0805494C: .4byte gFuseInfo
_08054950: .4byte gUnk_02032EC0
_08054954:
ldr r1, _08054964 @ =gUnk_02032EC0
movs r0, #3
strb r0, [r1]
movs r0, #7
movs r1, #0x10
bl SetFade
_08054962:
pop {pc}
.align 2, 0
_08054964: .4byte gUnk_02032EC0
.syntax divided
+70
View File
@@ -0,0 +1,70 @@
.syntax unified
push {r4, r5, r6, lr}
adds r5, r1, #0
lsls r1, r0, #2
adds r1, r1, r0
lsls r1, r1, #2
ldr r0, _080549B0 @ =gUnk_080FE320
adds r6, r1, r0
ldrb r0, [r6, #2]
ldrb r1, [r6, #3]
bl SetCurrentRoomPropertyList
ldr r4, _080549B4 @ =gRoomControls
ldrb r0, [r6, #2]
strb r0, [r4, #4]
ldrb r0, [r6, #3]
strb r0, [r4, #5]
bl LoadGfxGroups
ldrb r0, [r4, #4]
bl GetFlagBankOffset
ldr r1, _080549B8 @ =gArea
strh r0, [r1, #4]
cmp r5, #0
beq _080549BC
ldrb r0, [r6, #2]
ldrb r1, [r6, #3]
bl LoadAuxiliaryRoom
b _080549CE
.align 2, 0
_080549B0: .4byte gUnk_080FE320
_080549B4: .4byte gRoomControls
_080549B8: .4byte gArea
_080549BC:
ldrb r0, [r6, #2]
ldrb r1, [r6, #3]
bl sub_08052FF4
bl sub_0807C740
ldr r1, _08054A00 @ =gUpdateVisibleTiles
movs r0, #1
strb r0, [r1]
_080549CE:
ldr r2, _08054A04 @ =gScreen
ldrh r1, [r2]
ldr r0, _08054A08 @ =0x00001FFF
ands r0, r1
strh r0, [r2]
ldr r1, _08054A0C @ =gRoomControls
ldrh r0, [r6, #4]
ldrh r2, [r1, #6]
adds r0, r0, r2
strh r0, [r1, #0xa]
ldrh r0, [r6, #6]
ldrh r2, [r1, #8]
adds r0, r0, r2
strh r0, [r1, #0xc]
ldrb r0, [r6, #2]
cmp r0, #2
bne _080549F4
bl TryLoadPrologueHyruleTown
_080549F4:
ldr r0, _08054A10 @ =gUnk_02032EC0
ldrb r0, [r0, #3]
bl sub_08018710
pop {r4, r5, r6, pc}
.align 2, 0
_08054A00: .4byte gUpdateVisibleTiles
_08054A04: .4byte gScreen
_08054A08: .4byte 0x00001FFF
_08054A0C: .4byte gRoomControls
_08054A10: .4byte gUnk_02032EC0
.syntax divided
+22
View File
@@ -0,0 +1,22 @@
.syntax unified
push {lr}
lsls r1, r0, #2
adds r1, r1, r0
lsls r1, r1, #2
ldr r0, _08054A38 @ =gUnk_080FE320
adds r2, r1, r0
ldrb r0, [r2, #0x11]
cmp r0, #0xd
bhi _08054A34
ldr r1, _08054A3C @ =gLocalFlagBanks
lsls r0, r0, #1
adds r0, r0, r1
ldrh r0, [r0]
ldrh r1, [r2, #0x12]
bl SetLocalFlagByBank
_08054A34:
pop {pc}
.align 2, 0
_08054A38: .4byte gUnk_080FE320
_08054A3C: .4byte gLocalFlagBanks
.syntax divided
+1 -16
View File
@@ -436,11 +436,6 @@ SECTIONS {
src/fade.o(.text);
src/fileselect.o(.text);
src/game.o(.text);
asm/code_080526F8.o(.text);
asm/modBombs.o(.text);
asm/modArrows.o(.text);
src/code_0805436C.o(.text);
asm/code_0805436C.o(.text); /* game.c */
src/playerItem/playerItemLantern.o(.text);
src/subtask.o(.text);
src/sub_08055E08.o(.text);
@@ -619,17 +614,7 @@ SECTIONS {
src/item/itemGustJar.o(.text);
src/item/itemMoleMitts.o(.text);
src/item/itemJarEmpty.o(.text);
asm/playerUtils.o(.text);
src/respawnPlayer.o(.text);
src/code_08077B98.o(.text);
asm/code_08077B98.o(.text);
src/code_08078778.o(.text);
asm/code_08078778.o(.text);
src/sub_0807B820.o(.text);
asm/code_0807B9B8.o(.text);
src/sub_0807CA18.o(.text);
asm/getInventoryValue.o(.text);
asm/code_0807CAA0.o(.text); /* playerUtils.c */
src/playerUtils.o(.text);
src/flags.o(.text);
src/save.o(.text);
src/screenTilemap.o(.text);
-403
View File
@@ -1,403 +0,0 @@
#include "global.h"
#include "player.h"
#include "room.h"
#include "menu.h"
#include "area.h"
#include "common.h"
#include "save.h"
#include "item.h"
#include "object.h"
#include "enemy.h"
#include "droptables.h"
#include "itemMetaData.h"
extern u8 gUnk_0200AF13;
extern u8 gUnk_0200AF14;
extern u8 gUnk_080FE1C6[];
/*{
0u,
0x1u,
0x2u,
0x3u,
0x4u,
0x5u,
0x6u,
0x7u,
0x8u,
0x9u,
0x8u,
0x9u,
0xau,
0xau,
0xbu,
0xcu,
0xdu,
0xeu,
0xfu,
0x8u,
0xfu,
0x1u,
0x8u,
};
*/
extern void (*const gUnk_080FE2A0[])(void);
void ForceEquipItem(u32, u32);
extern void sub_0807CAA0(u32, u32);
/*
Returns the slot the item is equipped in.
0: A
1: B
2: Not equipped
*/
extern u8 gUnk_080FE1DD[];
u32 IsItemEquipped(u32 itemID) {
u32 itemSlot;
if (itemID == gSave.stats.itemButtons[SLOT_A])
itemSlot = 0;
else if (itemID == gSave.stats.itemButtons[SLOT_B])
itemSlot = 1;
else
itemSlot = 2;
return itemSlot;
}
void PutItemOnSlot(u32 itemID) {
u32 itemSlot;
u32 itemID2 = itemID;
if (itemID2 < 0x47) {
sub_0807CAA0(0, 1);
}
if (itemID2 - 1 < 0x1f) {
itemSlot = 2;
if (gSave.stats.itemButtons[SLOT_A] == 0) {
itemSlot = 0;
} else if (gSave.stats.itemButtons[SLOT_B] == 0) {
itemSlot = 1;
}
if (itemSlot == 2) {
u32 temp = gItemMetaData[itemID2].menuSlot;
if (temp == gItemMetaData[gSave.stats.itemButtons[SLOT_A]].menuSlot) {
itemSlot = 0;
} else {
if (temp == gItemMetaData[gSave.stats.itemButtons[SLOT_B]].menuSlot) {
itemSlot = 1;
}
}
if (itemSlot == 2) {
return;
}
}
ForceEquipItem(itemID2, itemSlot);
}
}
void ForceEquipItem(u32 itemID, u32 itemSlot) {
u32 otherItem;
u32 otherItemIndex;
u32 replacedItem;
if ((itemID - 1 < 0x1f) && (itemSlot < 2)) {
otherItemIndex = itemSlot == 0;
replacedItem = gSave.stats.itemButtons[itemSlot];
otherItem = gSave.stats.itemButtons[otherItemIndex];
if (gItemMetaData[otherItem].menuSlot == gItemMetaData[itemID].menuSlot) {
otherItem = replacedItem;
}
gSave.stats.itemButtons[itemSlot] = itemID;
gSave.stats.itemButtons[otherItemIndex] = otherItem;
gUnk_0200AF00.filler0[0x13] = 0x7f;
gUnk_0200AF00.filler0[0x14] = 0x7f;
}
}
u32 SetBottleContents(u32 itemID, u32 bottleIndex) {
if (bottleIndex > 3) {
bottleIndex = 0;
if (gSave.stats.bottles[0] != 0x20) {
do {
bottleIndex++;
if (bottleIndex > 3) {
return bottleIndex;
}
} while (gSave.stats.bottles[bottleIndex] != 0x20);
}
if (bottleIndex > 3) {
return bottleIndex;
}
}
gSave.stats.bottles[bottleIndex] = itemID;
return bottleIndex;
}
bool32 ItemIsSword(u32 item) {
switch (item) {
case ITEM_SMITH_SWORD:
case ITEM_GREEN_SWORD:
case ITEM_RED_SWORD:
case ITEM_BLUE_SWORD:
case ITEM_FOURSWORD:
return TRUE;
default:
return FALSE;
}
}
bool32 ItemIsShield(u32 id) {
switch (id) {
case 13:
case 14:
return 1;
default:
return 0;
}
}
bool32 ItemIsBottle(u32 id) {
switch (id) {
case 28:
case 29:
case 30:
case 31:
return 1;
default:
return 0;
}
}
u32 GetBottleContaining(u32 id) {
if (id == gSave.stats.bottles[0]) {
return 1;
} else if (id == gSave.stats.bottles[1]) {
return 2;
} else if (id == gSave.stats.bottles[2]) {
return 3;
} else if (id == gSave.stats.bottles[3]) {
return 4;
} else {
return 0;
}
}
void sub_08054524(void) {
u32 bVar1;
bVar1 = gArea.locationIndex;
if (gArea.locationIndex == 0) {
bVar1 = gRoomTransition.player_status.field_0x24[0xa];
}
if (bVar1 > 0x16) {
bVar1 = 0;
}
bVar1 = gUnk_080FE1C6[bVar1];
MemCopy(&gAreaDroptables[bVar1], &gRoomVars.currentAreaDroptable, 0x20);
}
void sub_08054564(void) {
gRoomVars.field_0x2 = 1;
}
void sub_08054570(void) {
gRoomVars.field_0x2 = 0;
}
extern void sub_08000F14(s16*, const s16*, const s16*, const s16*);
extern u32 sub_08000F2C(s16*, const s16*, const s16*, const s16*);
u32 CreateItemDrop(Entity* arg0, u32 itemID, u32 itemParameter);
u32 CreateRandomItemDrop(Entity* arg0, u32 arg1) {
extern const u8 gUnk_080FE1B4[] /* = {
ITEM_NONE, ITEM_RUPEE1, ITEM_RUPEE5, ITEM_RUPEE20, ITEM_HEART, ITEM_FAIRY,
ITEM_BOMBS5, ITEM_ARROWS5, ITEM_SHELLS, ITEM_KINSTONE_GREEN, ITEM_KINSTONE_BLUE, ITEM_KINSTONE_RED,
ITEM_ENEMY_BEETLE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE,
}*/;
int r0, r1, rand, summOdds, item;
u32 r3;
const Droptable *ptr2, *ptr3, *ptr4;
Droptable droptable;
r3 = arg1;
if (gRoomVars.field_0x2 != 1) {
ptr2 = &gDroptableModifiers[DROPTABLE_NONE];
ptr4 = NULL;
switch (r3) {
case 1 ... 12:
ptr4 = &gEnemyDroptables[r3];
break;
#ifndef EU
case 24:
case 25:
r0 = gRoomVars.unk2;
ptr4 = &gUnk_0800191C[0];
if (r0) {
ptr4++;
}
break;
#endif
case 16 ... 23:
#ifdef EU
case 24:
#endif
ptr2 = &gObjectDroptables[r3 - 16];
case 15:
ptr4 = &gRoomVars.currentAreaDroptable;
break;
case 0:
default:
break;
}
if (ptr4 != 0) {
if ((r1 = gSave.stats.picolyteType) == 0) {
// nop
ptr3 = &gDroptableModifiers[DROPTABLE_NONE];
} else {
#ifdef EU
ptr3 = &gEnemyDroptables[r1 + 9];
#else
ptr3 = &gEnemyDroptables[r1 + 6];
#endif
}
// vector addition, s0 = ptr4 + ptr2 + ptr3
sub_08000F14(droptable.a, ptr4->a, ptr2->a, ptr3->a);
if (gSave.stats.health <= 8) {
droptable.s.hearts += 5;
}
if (gSave.stats.bombCount == 0) {
droptable.s.bombs += 3;
}
if (gSave.stats.arrowCount == 0) {
droptable.s.arrows += 3;
}
if (gSave.stats.rupees <= 10) {
droptable.s.rupee5 += 1;
}
ptr2 = &gDroptableModifiers[DROPTABLE_NONE];
r0 = gSave.stats.hasAllFigurines;
ptr3 = &gDroptableModifiers[DROPTABLE_NONE];
// don't drop shells anymore
if (r0 != 0) {
ptr2 = &gDroptableModifiers[DROPTABLE_NO_SHELLS];
}
// don't drop kinstones anymore
if (gSave.didAllFusions != 0) {
ptr3 = &gDroptableModifiers[DROPTABLE_NO_KINSTONES];
}
// vector addition, s0 = s0 + ptr2 + ptr3
// resulting values are clamped to be >= 0
// returns sum over s0
summOdds = sub_08000F2C(droptable.a, droptable.a, ptr2->a, ptr3->a);
rand = Random();
item = (rand >> 0x18);
item &= 0xF;
rand = rand % summOdds;
{
u32 r3;
for (r3 = 0, r1 = 0; r3 < 0x10; r3++, item = (item + 1) & 0xF) {
if ((r1 += droptable.a[item]) > rand) {
break;
}
}
}
r1 = gUnk_080FE1B4[item];
if (r1 != ITEM_NONE) {
return CreateItemDrop(arg0, r1, 0);
}
}
}
return ITEM_NONE;
}
u32 CreateItemDrop(Entity* arg0, u32 itemID, u32 itemParameter) {
u32 adjustedParam = itemParameter;
Entity* itemEntity;
switch (itemID) {
case ITEM_ENEMY_BEETLE:
if (!GetInventoryValue(ITEM_SMITH_SWORD)) {
return ITEM_NONE;
}
break;
case ITEM_BOMBS5:
if (!GetInventoryValue(ITEM_BOMBBAG)) {
return ITEM_NONE;
}
break;
case ITEM_ARROWS5:
if (!GetInventoryValue(ITEM_BOW)) {
return ITEM_NONE;
}
break;
case ITEM_SHELLS: {
if (!GetInventoryValue(ITEM_EARTH_ELEMENT)) {
return ITEM_NONE;
}
if (itemParameter == 0) {
adjustedParam = 1;
}
break;
}
case ITEM_KINSTONE:
case ITEM_KINSTONE_GREEN ... ITEM_KINSTONE_RED: {
u32 rand;
if (GetInventoryValue(ITEM_KINSTONE_BAG) == 0) {
return ITEM_NONE;
}
if (3 < gRoomVars.filler1[0]) {
return ITEM_NONE;
}
if (itemID != ITEM_KINSTONE) {
adjustedParam = itemID - ITEM_KINSTONE_GREEN;
rand = (Random() & 0x3f);
adjustedParam = gUnk_080FE1DD[(rand + adjustedParam * 0x40)];
if (adjustedParam == 0) {
itemID = ITEM_NONE;
} else {
itemID = ITEM_KINSTONE;
}
}
break;
}
}
if (itemID != ITEM_NONE) {
if (itemID != ITEM_ENEMY_BEETLE) {
itemEntity = CreateObject(GROUND_ITEM, itemID, adjustedParam);
if (itemEntity != NULL) {
if (arg0 == &gPlayerEntity) {
itemEntity->actionDelay = 1;
} else {
itemEntity->actionDelay = 0;
}
if (arg0->kind == OBJECT) {
if (arg0->id == 99) {
arg0->child = itemEntity;
} else if (arg0->id == 0x1e) {
itemEntity->direction = arg0->animationState << 3 | 0x80;
itemEntity->speed = 0xc0;
itemEntity->zVelocity = Q_16_16(1.5);
}
}
CopyPosition(arg0, itemEntity);
}
} else {
itemEntity = CreateEnemy(BEETLE, 0);
if (itemEntity != NULL) {
itemEntity->x.HALF.HI = arg0->x.HALF.HI;
itemEntity->y.HALF.HI = arg0->y.HALF.HI;
itemEntity->collisionLayer = arg0->collisionLayer;
UpdateSpriteForCollisionLayer(itemEntity);
}
}
}
return itemID;
}
void Subtask_WorldEvent(void) {
#if !(defined(DEMO_USA) || defined(DEMO_JP))
gUnk_080FE2A0[gMenu.menuType]();
#endif
}
+900 -24
View File
@@ -6,24 +6,30 @@
*/
#include "global.h"
#include "asm.h"
#include "sound.h"
#include "screen.h"
#include "entity.h"
#include "player.h"
#include "room.h"
#include "main.h"
#include "flags.h"
#include "save.h"
#include "common.h"
#include "fileselect.h"
#include "menu.h"
#include "functions.h"
#include "area.h"
#include "message.h"
#include "asm.h"
#include "common.h"
#include "droptables.h"
#include "enemy.h"
#include "entity.h"
#include "fileselect.h"
#include "flags.h"
#include "functions.h"
#include "game.h"
#include "item.h"
#include "itemMetaData.h"
#include "main.h"
#include "menu.h"
#include "message.h"
#include "object.h"
#include "player.h"
#include "room.h"
#include "save.h"
#include "screen.h"
#include "sound.h"
#include "subtask.h"
#include "itemMetaData.h"
#include "player.h"
// Game task
@@ -197,6 +203,68 @@ typedef struct {
} CutsceneData;
static const CutsceneData sCutsceneData[];
extern u8 gUnk_0200AF13;
extern u8 gUnk_0200AF14;
extern u8 gUnk_080FE1C6[];
extern void (*const gUnk_080FE2AC[])(void);
/** @see Item */
void ForceEquipItem(u32, u32);
extern void SetInventoryValue(u32, u32);
extern u8 gUnk_080FE1DD[];
extern void (*const gUnk_080FE2A0[])(void);
extern void (*const gUnk_080FCBB4[])(void);
extern const EntityData gUnk_080FCB94[];
void sub_08052004(void);
extern void (*const gUnk_080FCCFC[])(void);
extern void (*const gUnk_080FCD38[])(void);
extern const EntityData gUnk_080FCC54[];
void sub_08051FF0(void);
extern void (*const gUnk_080FCD40[])(void);
extern const EntityData gUnk_080FCBC4[];
void sub_08051F78(void);
extern const EntityData gUnk_080FCC14[];
extern void DeleteAllEntities(void);
extern void (*const gUnk_080FCDD4[])(void);
extern const EntityData gUnk_080FCD84[];
extern void (*const gUnk_080FCEB0[])(void);
extern const EntityData gUnk_080FCDE0[];
extern void (*const gUnk_080FCEEC[])(void);
extern const EntityData gUnk_080FCEBC[];
extern void (*const gUnk_080FCEF8[])(void);
extern void (*const gUnk_080FCFA4[])(void);
extern void* GetRoomProperty(u32, u32, u32);
extern void (*const gUnk_080FD108[])(void);
extern const EntityData* gUnk_080FCFB8[];
extern void (*const gUnk_080FD138[])(void);
extern const u16 gUnk_080FD964[];
void GameTask(void) {
static GameState* const sStates[] = {
GameTask_Transition,
@@ -586,7 +654,7 @@ static void AuxCutscene_Exit(void) {
}
}
void sub_08051F78(u32 a1, u32 a2, u32 a3, u32 a4) {
void sub_08051F78(void) {
u32 idx = gUnk_02032EC0.field_0x3;
const CutsceneData* p = &sCutsceneData[idx];
sub_08051F9C(p->area, p->room, p->x, p->y);
@@ -931,24 +999,24 @@ static void InitializePlayer(void) {
pl->z.HALF.HI = -0xc0;
break;
case PL_SPAWN_STEP_IN:
gPlayerState.field_0x34[4] = 16;
gPlayerState.field_0x38 = 16;
pl->direction = Direction8FromAnimationState(gRoomTransition.player_status.start_anim);
case PL_SPAWN_WALKING:
pl->speed = 224;
break;
case PL_SPAWN_STAIRS_ASCEND:
case PL_SPAWN_STAIRS_DESCEND:
gPlayerState.field_0x34[4] = 1;
gPlayerState.field_0x34[5] = gRoomTransition.player_status.spawn_type;
gPlayerState.field_0x38 = 1;
gPlayerState.field_0x39 = gRoomTransition.player_status.spawn_type;
break;
case PL_SPAWN_PARACHUTE_FORWARD:
gPlayerState.field_0x34[4] = 1;
gPlayerState.field_0x38 = 1;
break;
case PL_SPAWN_PARACHUTE_UP:
gPlayerState.field_0x34[4] = 3;
gPlayerState.field_0x38 = 3;
break;
case PL_SPAWN_FAST_TRAVEL:
gPlayerState.field_0x34[4] = 4;
gPlayerState.field_0x38 = 4;
}
pl->kind = PLAYER;
@@ -1716,11 +1784,11 @@ static void ResetTmpFlags(void) {
if (!CheckGlobalFlag(WATERBEAN_PUT))
ClearGlobalFlag(WATERBEAN_OUT);
if (!GetInventoryValue(0x40u))
if (!GetInventoryValue(ITEM_EARTH_ELEMENT))
ClearGlobalFlag(LV1_CLEAR);
if (!GetInventoryValue(0x41u))
if (!GetInventoryValue(ITEM_FIRE_ELEMENT))
ClearGlobalFlag(LV2_CLEAR);
if (!GetInventoryValue(0x42u))
if (!GetInventoryValue(ITEM_WATER_ELEMENT))
ClearGlobalFlag(LV4_CLEAR);
}
@@ -1730,3 +1798,811 @@ static void ClearFlagArray(const u16* p) {
for (i = p; i[0] != 0xFFFF; i += 2)
ClearLocalFlagByBank(i[0], i[1]);
}
void CutsceneMain_Init(void) {
gUnk_080FCBB4[gMenu.overlayType]();
}
void sub_080535AC(void) {
gMenu.overlayType = 1;
gMenu.transitionTimer = 0x78;
gUnk_02032EC0.field_0x6 = 1;
gUpdateVisibleTiles = 1;
gScreen.lcd.displayControl &= 0xfeff;
LoadRoomEntityList((EntityData*)gUnk_080FCB94);
SetFade(6, 8);
}
void sub_080535F4(void) {
if (gFadeControl.active == 0) {
ResetSystemPriority();
gMenu.overlayType = 2;
}
}
void nullsub_481(void) {
}
void sub_08053618(void) {
gMenu.transitionTimer--;
if (gMenu.transitionTimer == 0) {
sub_08052004();
}
}
void sub_08053634(void) {
gUnk_02032EC0.nextToLoad = 3;
MessageInitialize();
}
void sub_08053648(void) {
Entity* obj = CreateObject(SMOKE, 0, 0);
if (obj != NULL) {
obj->x.HALF.HI = gRoomControls.origin_x + 0x2d0;
obj->y.HALF.HI = gRoomControls.origin_y + 0x148;
}
}
void sub_0805367C(void) {
gMenu.overlayType++;
}
void sub_0805368C(void) {
Entity* entity = FindEntityByID(OBJECT, HOUSE_DOOR_INT, 6);
if (entity != NULL) {
DeleteEntity(entity);
SoundReq(SFX_F0);
}
}
void sub_080536A8(void) {
sub_080A71C4(5, 5, 4, 0x10);
}
void sub_080536B8(void) {
sub_080A71C4(5, 3, 4, 4);
SetFade(5, 0x100);
}
void sub_080536D4(void) {
gUnk_080FCCFC[gMenu.overlayType]();
}
void sub_080536F0(void) {
gUnk_080FCD38[gMenu.overlayType]();
}
void sub_0805370C(void) {
gMenu.overlayType++;
gUpdateVisibleTiles = 1;
sub_08051FF0();
LoadRoomEntityList((EntityData*)gUnk_080FCC54);
SetFade(4, 0x10);
}
void sub_0805373C(void) {
gUnk_080FCD40[gMenu.overlayType]();
}
ASM_FUNC("asm/non_matching/game/sub_08053758.inc", void sub_08053758())
ASM_FUNC("asm/non_matching/game/sub_08053800.inc", void sub_08053800())
ASM_FUNC("asm/non_matching/game/sub_08053894.inc", void sub_08053894())
ASM_FUNC("asm/non_matching/game/sub_08053904.inc", void sub_08053904())
void sub_08053974(void) {
if (gFadeControl.active == 0) {
InitFade();
DispReset(1);
SetBGDefaults();
sub_08051F78();
LoadRoomEntityList((EntityData*)&gUnk_080FCBC4);
SetFade(5, 0x100);
gMenu.overlayType++;
}
}
void nullsub_482(void) {
}
void sub_080539BC(void) {
SetBGDefaults();
DeleteAllEntities();
sub_08051F9C(0x22, 0x11, 0, 0);
sub_0804B0B0(0x22, 0x11);
LoadRoomEntityList((EntityData*)&gUnk_080FCC14);
gMenu.overlayType++;
}
void sub_080539F4(void) {
if (gFadeControl.active == 0) {
DispReset(1);
gMenu.overlayType++;
gMenu.transitionTimer = 0x3c;
}
}
void sub_08053A1C(void) {
gMenu.transitionTimer--;
if (gMenu.transitionTimer == 0) {
gMenu.overlayType++;
gMenu.transitionTimer = 8;
MessageFromTarget(0xf07);
gMessage.textWindowPosX = 1;
gMessage.textWindowPosY = 8;
SetFade(4, 8);
}
}
void sub_08053A5C(void) {
if (((gMessage.doTextBox & 0x7f) == 0) && --gMenu.transitionTimer == 0) {
gMenu.overlayType++;
SetFade(5, 8);
}
}
void sub_08053A90(void) {
if (gFadeControl.active == 0) {
gUnk_02032EC0.nextToLoad = 3;
SetBGDefaults();
}
}
void sub_08053AB0(void) {
gUnk_080FCDD4[gMenu.overlayType]();
}
void sub_08053ACC(void) {
gMenu.overlayType++;
gUpdateVisibleTiles = 1;
sub_08051FF0();
LoadRoomEntityList((EntityData*)&gUnk_080FCD84);
SetFade(5, 0x100);
}
void sub_08053B00(void) {
gMenu.overlayType++;
}
void sub_08053B10(void) {
if (CheckRoomFlag(1)) {
gMenu.menuType++;
DispReset(1);
SetFade(4, 0x100);
}
}
void sub_08053B3C(void) {
sub_080A71C4(5, 4, 5, 0x100);
SetFade(5, 0x100);
}
void sub_08053B58(void) {
gUnk_080FCEB0[gMenu.overlayType]();
}
void sub_08053B74(void) {
gMenu.overlayType++;
gUpdateVisibleTiles = 1;
LoadRoomEntityList((EntityData*)&gUnk_080FCDE0);
ResetSystemPriority();
ResetEntityPriority();
SetFade(5, 0x100);
}
void sub_08053BAC(void) {
gMenu.overlayType++;
}
void sub_08053BBC(void) {
if (CheckRoomFlag(0)) {
gMenu.menuType++;
DispReset(1);
SetFade(4, 0x100);
}
}
void sub_08053BE8(void) {
sub_080A71C4(5, 2, 5, 0x100);
SetFade(5, 0x100);
}
void sub_08053C04(void) {
gUnk_080FCEEC[gMenu.overlayType]();
}
void sub_08053C20(void) {
gMenu.overlayType = 1;
gMenu.transitionTimer = 0x78;
gUpdateVisibleTiles = 1;
sub_08051FF0();
sub_0805B4D0(4);
LoadRoomEntityList((EntityData*)&gUnk_080FCEBC);
SetFade(4, 0x10);
SoundReq(BGM_FIGHT_THEME2);
}
void nullsub_483(void) {
}
void sub_08053C60(void) {
SetFade(5, 2);
SoundReq(SFX_SUMMON);
SoundReq(SONG_STOP_BGM);
SetTask(3);
}
void sub_08053C84(void) {
gMenu.overlayType = 2;
}
void CutsceneMain_Exit(void) {
gUnk_080FCEF8[gMenu.field_0x3]();
}
void sub_08053CAC(void) {
gUnk_080FCFA4[gMenu.overlayType]();
}
ASM_FUNC("asm/non_matching/game/sub_08053CC8.inc", void sub_08053CC8())
void sub_08053D34(void) {
if (gMenu.field_0xa != 0) {
gMenu.field_0xa = 0;
if (CheckLocalFlagByBank(0x680, 0x3d)) {
SetTileType(0x74, 0xc4, 1);
}
if (CheckLocalFlagByBank(0x680, 0x3e)) {
SetTileType(0x74, 0xcc, 1);
}
}
if (gFadeControl.active == 0) {
gMenu.transitionTimer = 0x78;
gMenu.overlayType++;
}
}
void sub_08053D90(void) {
gMenu.transitionTimer--;
if (gMenu.transitionTimer == 0) {
gMenu.overlayType++;
SetFadeInverted(0x10);
}
}
void sub_08053DB4(void) {
if (gFadeControl.active == 0) {
u8* ptr = gMenu.field_0xc;
sub_08052FF4(gMenu.field_0xc[4], gMenu.field_0xc[5]);
sub_0807C740();
gUpdateVisibleTiles = 1;
gRoomControls.scroll_x = (s8)ptr[6] + gRoomControls.scroll_x;
gRoomControls.scroll_y = (s8)ptr[7] + gRoomControls.scroll_y;
LoadRoomEntityList(*(EntityData**)ptr);
LoadRoomEntityList((EntityData*)GetRoomProperty(ptr[4], ptr[5], 1));
LoadRoomEntityList((EntityData*)GetRoomProperty(ptr[4], ptr[5], 2));
gMenu.transitionTimer = 0x78;
gMenu.overlayType++;
SetFadeInverted(0x10);
}
}
void sub_08053E30(void) {
if ((gFadeControl.active == 0) && --gMenu.transitionTimer == 0) {
gMenu.menuType++;
}
}
void sub_08053E58(void) {
gUnk_080FD108[gMenu.overlayType]();
}
void sub_08053E74(void) {
const EntityData** ptr = gUnk_080FCFB8;
gMenu.field_0xc = (u8*)ptr;
LoadRoomEntityList((EntityData*)ptr[0]);
gMenu.transitionTimer = 0x78;
gMenu.field_0xa = 0x3c;
gMenu.overlayType++;
gScreen.lcd.displayControl &= 0xfeff;
gUpdateVisibleTiles = 1;
SetMinPriority(1);
SetFade(4, 8);
}
void sub_08053EC4(void) {
EntityData** data;
if ((gFadeControl.active == 0) && (--gMenu.field_0xa == 0)) {
data = (EntityData**)(gMenu.field_0xc + 4);
gMenu.field_0xc += 0xc;
LoadRoomEntityList(*data);
gMenu.overlayType++;
}
}
void sub_08053EFC(void) {
if (--gMenu.transitionTimer == 0) {
gMenu.overlayType++;
SetFadeInverted(8);
}
}
void sub_08053F20(void) {
u8* ptr;
if (gFadeControl.active == 0) {
DeleteAllEntities();
ptr = gMenu.field_0xc;
sub_08052FF4(gMenu.field_0xc[8], gMenu.field_0xc[9]);
sub_0807C740();
gUpdateVisibleTiles = 1;
gRoomControls.scroll_x = (s8)ptr[10] + gRoomControls.scroll_x;
gRoomControls.scroll_y = (s8)ptr[0xb] + gRoomControls.scroll_y;
LoadRoomEntityList(*(EntityData**)ptr);
gMenu.transitionTimer = 0x78;
gMenu.field_0xa = 0x3c;
gMenu.overlayType++;
SetFadeInverted(8);
}
}
void sub_08053F88(void) {
if ((gFadeControl.active == 0) && --gMenu.transitionTimer == 0) {
gMenu.menuType++;
ResetEntityPriority();
}
}
void CutsceneMain_Update(void) {
gUnk_080FD138[gMenu.field_0x3]();
}
u32 GetSaleItemConfirmMessageID(u32 item) {
const u16* ptr = &gUnk_080FD964[item * 4];
return ptr[2];
}
s32 GetItemPrice(u32 item) {
const u16* ptr = &gUnk_080FD964[item * 4];
return ptr[0];
}
ASM_FUNC("asm/non_matching/game/GiveItem.inc", void GiveItem(u32 a, u32 b))
// TODO Adapt ItemMetaData struct
void sub_08054288(s32 param_1) {
const ItemMetaData* ptr1 = gItemMetaData;
u16* ptr = (u16*)&((ptr1)[param_1]);
MessageFromTarget(ptr[3]);
}
u32 sub_0805429C(s32 param_1) {
const ItemMetaData* ptr1 = gItemMetaData;
u16* ptr = (u16*)&((ptr1)[param_1]);
return ptr[2];
}
u32 sub_080542AC(u32 param_1) {
const ItemMetaData* ptr1 = gItemMetaData;
u8* ptr = (u8*)&((ptr1)[param_1]);
return ptr[3] & 1;
}
void ModShells(s32 shells) {
if (shells == 0) {
shells = 1;
}
shells += gSave.stats.shells;
if (shells < 0) {
shells = 0;
} else if (999 < shells) {
shells = 999;
}
gSave.stats.shells = shells;
}
void ModBombs(s32 bombs) {
s32 bombCount = bombs;
s32 bagSize;
bombCount += gSave.stats.bombCount;
bagSize = gBombBagSizes[gSave.stats.bombBagType];
if (bombCount < 0) {
bombCount = 0;
} else if (bagSize < bombCount) {
bombCount = bagSize;
}
gSave.stats.bombCount = bombCount;
}
void ModArrows(s32 arrows) {
s32 quiverSize;
s32 arrowCount = arrows;
arrowCount += gSave.stats.arrowCount;
quiverSize = gQuiverSizes[gSave.stats.quiverType];
if (arrowCount < 0) {
arrowCount = 0;
} else if (quiverSize < arrowCount) {
arrowCount = quiverSize;
}
gSave.stats.arrowCount = arrowCount;
}
/**
* @brief Returns the slot the item is equipped in.
*
* 0: A
* 1: B
* 2: Not equipped
*/
u32 IsItemEquipped(u32 itemID) {
u32 itemSlot;
if (itemID == gSave.stats.itemButtons[SLOT_A])
itemSlot = 0;
else if (itemID == gSave.stats.itemButtons[SLOT_B])
itemSlot = 1;
else
itemSlot = 2;
return itemSlot;
}
void PutItemOnSlot(u32 itemID) {
u32 itemSlot;
u32 itemID2 = itemID;
if (itemID2 < 0x47) {
SetInventoryValue(0, 1);
}
if (itemID2 - 1 < 0x1f) {
itemSlot = 2;
if (gSave.stats.itemButtons[SLOT_A] == 0) {
itemSlot = 0;
} else if (gSave.stats.itemButtons[SLOT_B] == 0) {
itemSlot = 1;
}
if (itemSlot == 2) {
u32 temp = gItemMetaData[itemID2].menuSlot;
if (temp == gItemMetaData[gSave.stats.itemButtons[SLOT_A]].menuSlot) {
itemSlot = 0;
} else {
if (temp == gItemMetaData[gSave.stats.itemButtons[SLOT_B]].menuSlot) {
itemSlot = 1;
}
}
if (itemSlot == 2) {
return;
}
}
ForceEquipItem(itemID2, itemSlot);
}
}
void ForceEquipItem(u32 itemID, u32 itemSlot) {
u32 otherItem;
u32 otherItemIndex;
u32 replacedItem;
if ((itemID - 1 < 0x1f) && (itemSlot < 2)) {
otherItemIndex = itemSlot == 0;
replacedItem = gSave.stats.itemButtons[itemSlot];
otherItem = gSave.stats.itemButtons[otherItemIndex];
if (gItemMetaData[otherItem].menuSlot == gItemMetaData[itemID].menuSlot) {
otherItem = replacedItem;
}
gSave.stats.itemButtons[itemSlot] = itemID;
gSave.stats.itemButtons[otherItemIndex] = otherItem;
gUnk_0200AF00.filler0[0x13] = 0x7f;
gUnk_0200AF00.filler0[0x14] = 0x7f;
}
}
u32 SetBottleContents(u32 itemID, u32 bottleIndex) {
if (bottleIndex > 3) {
bottleIndex = 0;
if (gSave.stats.bottles[0] != 0x20) {
do {
bottleIndex++;
if (bottleIndex > 3) {
return bottleIndex;
}
} while (gSave.stats.bottles[bottleIndex] != 0x20);
}
if (bottleIndex > 3) {
return bottleIndex;
}
}
gSave.stats.bottles[bottleIndex] = itemID;
return bottleIndex;
}
bool32 ItemIsSword(u32 item) {
switch (item) {
case ITEM_SMITH_SWORD:
case ITEM_GREEN_SWORD:
case ITEM_RED_SWORD:
case ITEM_BLUE_SWORD:
case ITEM_FOURSWORD:
return TRUE;
default:
return FALSE;
}
}
bool32 ItemIsShield(u32 id) {
switch (id) {
case 13:
case 14:
return 1;
default:
return 0;
}
}
bool32 ItemIsBottle(u32 id) {
switch (id) {
case 28:
case 29:
case 30:
case 31:
return 1;
default:
return 0;
}
}
u32 GetBottleContaining(u32 id) {
if (id == gSave.stats.bottles[0]) {
return 1;
} else if (id == gSave.stats.bottles[1]) {
return 2;
} else if (id == gSave.stats.bottles[2]) {
return 3;
} else if (id == gSave.stats.bottles[3]) {
return 4;
} else {
return 0;
}
}
void sub_08054524(void) {
u32 bVar1;
bVar1 = gArea.locationIndex;
if (gArea.locationIndex == 0) {
bVar1 = gRoomTransition.player_status.field_0x24[0xa];
}
if (bVar1 > 0x16) {
bVar1 = 0;
}
bVar1 = gUnk_080FE1C6[bVar1];
MemCopy(&gAreaDroptables[bVar1], &gRoomVars.currentAreaDroptable, 0x20);
}
void sub_08054564(void) {
gRoomVars.field_0x2 = 1;
}
void sub_08054570(void) {
gRoomVars.field_0x2 = 0;
}
extern void sub_08000F14(s16*, const s16*, const s16*, const s16*);
extern u32 sub_08000F2C(s16*, const s16*, const s16*, const s16*);
u32 CreateItemDrop(Entity* arg0, u32 itemID, u32 itemParameter);
u32 CreateRandomItemDrop(Entity* arg0, u32 arg1) {
extern const u8 gUnk_080FE1B4[] /* = {
ITEM_NONE, ITEM_RUPEE1, ITEM_RUPEE5, ITEM_RUPEE20, ITEM_HEART, ITEM_FAIRY,
ITEM_BOMBS5, ITEM_ARROWS5, ITEM_SHELLS, ITEM_KINSTONE_GREEN, ITEM_KINSTONE_BLUE, ITEM_KINSTONE_RED,
ITEM_ENEMY_BEETLE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE,
}*/;
int r0, r1, rand, summOdds, item;
u32 r3;
const Droptable *ptr2, *ptr3, *ptr4;
Droptable droptable;
r3 = arg1;
if (gRoomVars.field_0x2 != 1) {
ptr2 = &gDroptableModifiers[DROPTABLE_NONE];
ptr4 = NULL;
switch (r3) {
case 1 ... 12:
ptr4 = &gEnemyDroptables[r3];
break;
#ifndef EU
case 24:
case 25:
r0 = gRoomVars.unk2;
ptr4 = &gUnk_0800191C[0];
if (r0) {
ptr4++;
}
break;
#endif
case 16 ... 23:
#ifdef EU
case 24:
#endif
ptr2 = &gObjectDroptables[r3 - 16];
case 15:
ptr4 = &gRoomVars.currentAreaDroptable;
break;
case 0:
default:
break;
}
if (ptr4 != 0) {
if ((r1 = gSave.stats.picolyteType) == 0) {
// nop
ptr3 = &gDroptableModifiers[DROPTABLE_NONE];
} else {
#ifdef EU
ptr3 = &gEnemyDroptables[r1 + 9];
#else
ptr3 = &gEnemyDroptables[r1 + 6];
#endif
}
// vector addition, s0 = ptr4 + ptr2 + ptr3
sub_08000F14(droptable.a, ptr4->a, ptr2->a, ptr3->a);
if (gSave.stats.health <= 8) {
droptable.s.hearts += 5;
}
if (gSave.stats.bombCount == 0) {
droptable.s.bombs += 3;
}
if (gSave.stats.arrowCount == 0) {
droptable.s.arrows += 3;
}
if (gSave.stats.rupees <= 10) {
droptable.s.rupee5 += 1;
}
ptr2 = &gDroptableModifiers[DROPTABLE_NONE];
r0 = gSave.stats.hasAllFigurines;
ptr3 = &gDroptableModifiers[DROPTABLE_NONE];
// don't drop shells anymore
if (r0 != 0) {
ptr2 = &gDroptableModifiers[DROPTABLE_NO_SHELLS];
}
// don't drop kinstones anymore
if (gSave.didAllFusions != 0) {
ptr3 = &gDroptableModifiers[DROPTABLE_NO_KINSTONES];
}
// vector addition, s0 = s0 + ptr2 + ptr3
// resulting values are clamped to be >= 0
// returns sum over s0
summOdds = sub_08000F2C(droptable.a, droptable.a, ptr2->a, ptr3->a);
rand = Random();
item = (rand >> 0x18);
item &= 0xF;
rand = rand % summOdds;
{
u32 r3;
for (r3 = 0, r1 = 0; r3 < 0x10; r3++, item = (item + 1) & 0xF) {
if ((r1 += droptable.a[item]) > rand) {
break;
}
}
}
r1 = gUnk_080FE1B4[item];
if (r1 != ITEM_NONE) {
return CreateItemDrop(arg0, r1, 0);
}
}
}
return ITEM_NONE;
}
u32 CreateItemDrop(Entity* arg0, u32 itemID, u32 itemParameter) {
u32 adjustedParam = itemParameter;
Entity* itemEntity;
switch (itemID) {
case ITEM_ENEMY_BEETLE:
if (!GetInventoryValue(ITEM_SMITH_SWORD)) {
return ITEM_NONE;
}
break;
case ITEM_BOMBS5:
if (!GetInventoryValue(ITEM_BOMBBAG)) {
return ITEM_NONE;
}
break;
case ITEM_ARROWS5:
if (!GetInventoryValue(ITEM_BOW)) {
return ITEM_NONE;
}
break;
case ITEM_SHELLS: {
if (!GetInventoryValue(ITEM_EARTH_ELEMENT)) {
return ITEM_NONE;
}
if (itemParameter == 0) {
adjustedParam = 1;
}
break;
}
case ITEM_KINSTONE:
case ITEM_KINSTONE_GREEN ... ITEM_KINSTONE_RED: {
u32 rand;
if (GetInventoryValue(ITEM_KINSTONE_BAG) == 0) {
return ITEM_NONE;
}
if (3 < gRoomVars.filler1[0]) {
return ITEM_NONE;
}
if (itemID != ITEM_KINSTONE) {
adjustedParam = itemID - ITEM_KINSTONE_GREEN;
rand = (Random() & 0x3f);
adjustedParam = gUnk_080FE1DD[(rand + adjustedParam * 0x40)];
if (adjustedParam == 0) {
itemID = ITEM_NONE;
} else {
itemID = ITEM_KINSTONE;
}
}
break;
}
}
if (itemID != ITEM_NONE) {
if (itemID != ITEM_ENEMY_BEETLE) {
itemEntity = CreateObject(GROUND_ITEM, itemID, adjustedParam);
if (itemEntity != NULL) {
if (arg0 == &gPlayerEntity) {
itemEntity->actionDelay = 1;
} else {
itemEntity->actionDelay = 0;
}
if (arg0->kind == OBJECT) {
if (arg0->id == 99) {
arg0->child = itemEntity;
} else if (arg0->id == 0x1e) {
itemEntity->direction = arg0->animationState << 3 | 0x80;
itemEntity->speed = 0xc0;
itemEntity->zVelocity = Q_16_16(1.5);
}
}
CopyPosition(arg0, itemEntity);
}
} else {
itemEntity = CreateEnemy(BEETLE, 0);
if (itemEntity != NULL) {
itemEntity->x.HALF.HI = arg0->x.HALF.HI;
itemEntity->y.HALF.HI = arg0->y.HALF.HI;
itemEntity->collisionLayer = arg0->collisionLayer;
UpdateSpriteForCollisionLayer(itemEntity);
}
}
}
return itemID;
}
void Subtask_WorldEvent(void) {
#if !(defined(DEMO_USA) || defined(DEMO_JP))
gUnk_080FE2A0[gMenu.menuType]();
#endif
}
ASM_FUNC("asm/non_matching/game/sub_0805488C.inc", void sub_0805488C())
void sub_080548E8(void) {
gUnk_080FE2AC[gMenu.field_0x0]();
FlushSprites();
UpdateEntities();
DrawEntities();
CopyOAM();
UpdateScroll();
UpdateBgAnim();
UpdateScrollVram();
}
ASM_FUNC("asm/non_matching/game/sub_08054920.inc", void sub_08054920())
void sub_08054968(void) {
gMenu.menuType = 2;
}
ASM_FUNC("asm/non_matching/game/sub_08054974.inc", void sub_08054974())
ASM_FUNC("asm/non_matching/game/sub_08054A14.inc", void sub_08054A14())
+1 -1
View File
@@ -40,7 +40,7 @@ typedef struct {
#endif
} FigurineDeviceEntity;
extern void sub_080542C0(s32);
extern void ModShells(s32);
extern u8 gUnk_020227F0;
typedef struct {
u32 unk_0;