- decompile slime and fireball guy

- continue percy decompile
- move entity function definitions to entity header
This commit is contained in:
Behemoth 2020-08-24 18:39:40 +02:00
parent 30137c802f
commit 73497fd8c2
22 changed files with 438 additions and 988 deletions

View File

@ -1,283 +0,0 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.syntax unified
.text
thumb_func_start FireballGuy
FireballGuy: @ 0x08045394
push {lr}
ldr r1, _080453A0 @ =gUnk_080D17E8
bl EnemyFunctionHandler
pop {pc}
.align 2, 0
_080453A0: .4byte gUnk_080D17E8
thumb_func_start sub_080453A4
sub_080453A4: @ 0x080453A4
push {lr}
ldr r2, _080453B8 @ =gUnk_080D1800
ldrb r1, [r0, #0xc]
lsls r1, r1, #2
adds r1, r1, r2
ldr r1, [r1]
bl _call_via_r1
pop {pc}
.align 2, 0
_080453B8: .4byte gUnk_080D1800
thumb_func_start sub_080453BC
sub_080453BC: @ 0x080453BC
push {lr}
adds r2, r0, #0
adds r0, #0x45
ldrb r1, [r0]
cmp r1, #0
beq _080453D6
adds r0, #0x3f
ldrb r0, [r0]
cmp r0, r1
beq _080453D6
movs r0, #2
strb r0, [r2, #0xc]
b _080453DE
_080453D6:
ldr r1, _080453E0 @ =gUnk_080D17E8
adds r0, r2, #0
bl sub_0804AA30
_080453DE:
pop {pc}
.align 2, 0
_080453E0: .4byte gUnk_080D17E8
thumb_func_start nullsub_172
nullsub_172: @ 0x080453E4
bx lr
.align 2, 0
thumb_func_start sub_080453E8
sub_080453E8: @ 0x080453E8
push {r4, lr}
adds r4, r0, #0
movs r1, #0
movs r2, #1
movs r0, #1
strb r0, [r4, #0xc]
strb r1, [r4, #0xe]
ldrb r1, [r4, #0x18]
subs r0, #5
ands r0, r1
orrs r0, r2
strb r0, [r4, #0x18]
movs r0, #0x80
strh r0, [r4, #0x24]
adds r0, r4, #0
adds r0, #0x45
ldrb r1, [r0]
adds r0, #0x3f
strb r1, [r0]
adds r2, r4, #0
adds r2, #0x3c
ldrb r1, [r2]
movs r0, #0x10
orrs r0, r1
strb r0, [r2]
adds r0, r4, #0
bl sub_0804A720
adds r0, r4, #0
movs r1, #0
bl InitializeAnimation
adds r0, r4, #0
bl sub_08045524
pop {r4, pc}
thumb_func_start sub_08045430
sub_08045430: @ 0x08045430
push {r4, lr}
adds r4, r0, #0
bl sub_080AEFE0
adds r0, r4, #0
bl GetNextFrame
movs r1, #0xc0
lsls r1, r1, #5
adds r0, r4, #0
bl sub_08003FC4
cmp r0, #0
bne _08045452
adds r0, r4, #0
bl sub_08045524
_08045452:
pop {r4, pc}
thumb_func_start sub_08045454
sub_08045454: @ 0x08045454
push {r4, r5, r6, r7, lr}
mov r7, sb
mov r6, r8
push {r6, r7}
sub sp, #0x10
mov r8, r0
ldr r1, _08045518 @ =gUnk_080D180C
ldrb r0, [r0, #0xa]
adds r0, r0, r1
ldrb r7, [r0]
movs r0, #0x48
subs r0, r0, r7
ldr r1, _0804551C @ =gEntCount
ldrb r1, [r1]
cmp r0, r1
ble _0804550C
cmp r7, #0
beq _0804548E
mov r4, sp
adds r5, r7, #0
_0804547C:
mov r0, r8
ldrb r1, [r0, #0xa]
movs r0, #0x59
bl CreateEnemy
stm r4!, {r0}
subs r5, #1
cmp r5, #0
bne _0804547C
_0804548E:
ldr r2, _08045520 @ =gUnk_080D1810
mov sb, r2
movs r5, #0
cmp r5, r7
bge _080454EE
_08045498:
lsls r0, r5, #2
add r0, sp
ldr r6, [r0]
adds r4, r5, #1
adds r0, r4, #0
adds r1, r7, #0
bl __modsi3
lsls r0, r0, #2
add r0, sp
ldr r0, [r0]
str r0, [r6, #0x54]
adds r0, r5, r7
subs r0, #1
adds r1, r7, #0
bl __modsi3
lsls r0, r0, #2
add r0, sp
ldr r0, [r0]
str r0, [r6, #0x50]
movs r1, #0
movs r0, #1
strb r0, [r6, #0xb]
strh r1, [r6, #0x36]
adds r1, r6, #0
adds r1, #0x3d
movs r0, #0xf0
strb r0, [r1]
mov r0, sb
movs r2, #0
ldrsb r2, [r0, r2]
movs r3, #1
ldrsb r3, [r0, r3]
mov r0, r8
adds r1, r6, #0
bl sub_08045178
movs r2, #2
add sb, r2
adds r5, r4, #0
cmp r5, r7
blt _08045498
_080454EE:
mov r0, r8
movs r1, #2
movs r2, #0
bl CreateFx
adds r6, r0, #0
cmp r6, #0
beq _08045506
mov r0, r8
adds r1, r6, #0
bl CopyPosition
_08045506:
mov r0, r8
bl DeleteEntity
_0804550C:
add sp, #0x10
pop {r3, r4}
mov r8, r3
mov sb, r4
pop {r4, r5, r6, r7, pc}
.align 2, 0
_08045518: .4byte gUnk_080D180C
_0804551C: .4byte gEntCount
_08045520: .4byte gUnk_080D1810
thumb_func_start sub_08045524
sub_08045524: @ 0x08045524
push {r4, r5, lr}
adds r5, r0, #0
movs r0, #0xe0
lsls r0, r0, #9
str r0, [r5, #0x20]
adds r0, r5, #0
movs r1, #1
movs r2, #8
bl sub_0804A024
adds r4, r0, #0
cmp r4, #0xff
beq _08045556
bl Random
movs r1, #3
ands r1, r0
cmp r1, #0
bne _08045556
bl Random
movs r1, #3
ands r0, r1
strb r0, [r5, #0xe]
b _08045596
_08045556:
ldrb r0, [r5, #0xe]
cmp r0, #0
beq _08045562
subs r0, #1
strb r0, [r5, #0xe]
b _080455A8
_08045562:
bl Random
movs r1, #3
ands r0, r1
strb r0, [r5, #0xe]
adds r0, r5, #0
bl sub_08049FA0
cmp r0, #0
bne _0804559E
bl Random
movs r1, #3
ands r1, r0
cmp r1, #0
beq _0804559E
adds r0, r5, #0
bl sub_08049EE4
adds r4, r0, #0
bl Random
movs r1, #8
ands r0, r1
adds r0, #0xfc
adds r4, r4, r0
_08045596:
movs r0, #0x18
ands r4, r0
strb r4, [r5, #0x15]
b _080455A8
_0804559E:
bl Random
movs r1, #0x18
ands r0, r1
strb r0, [r5, #0x15]
_080455A8:
pop {r4, r5, pc}
.align 2, 0

View File

@ -1,221 +0,0 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.syntax unified
.text
thumb_func_start MiniSlime
MiniSlime: @ 0x08045200
push {r4, lr}
adds r4, r0, #0
ldr r1, _0804521C @ =gUnk_080D17C0
bl EnemyFunctionHandler
movs r3, #8
rsbs r3, r3, #0
adds r0, r4, #0
movs r1, #0
movs r2, #1
bl SetChildOffset
pop {r4, pc}
.align 2, 0
_0804521C: .4byte gUnk_080D17C0
thumb_func_start sub_08045220
sub_08045220: @ 0x08045220
push {lr}
ldr r2, _08045234 @ =gUnk_080D17D8
ldrb r1, [r0, #0xc]
lsls r1, r1, #2
adds r1, r1, r2
ldr r1, [r1]
bl _call_via_r1
pop {pc}
.align 2, 0
_08045234: .4byte gUnk_080D17D8
thumb_func_start sub_08045238
sub_08045238: @ 0x08045238
push {r4, lr}
adds r4, r0, #0
adds r0, #0x43
ldrb r0, [r0]
cmp r0, #0
beq _0804524C
adds r0, r4, #0
movs r1, #0x1c
bl sub_0804A9FC
_0804524C:
ldr r1, _08045258 @ =gUnk_080D17C0
adds r0, r4, #0
bl sub_0804AA30
pop {r4, pc}
.align 2, 0
_08045258: .4byte gUnk_080D17C0
thumb_func_start sub_0804525C
sub_0804525C: @ 0x0804525C
push {r4, lr}
adds r4, r0, #0
ldr r3, [r4, #0x50]
cmp r4, r3
beq _08045298
cmp r3, #0
beq _08045298
adds r2, r4, #0
adds r2, #0x6c
ldrb r1, [r2]
movs r0, #0x7f
ands r0, r1
strb r0, [r2]
ldr r1, [r4, #0x50]
ldr r0, [r4, #0x54]
str r0, [r1, #0x54]
ldr r1, [r4, #0x54]
ldr r0, [r4, #0x50]
str r0, [r1, #0x50]
adds r0, r4, #0
adds r0, #0x6d
ldrb r1, [r0]
movs r0, #0x40
ands r0, r1
cmp r0, #0
beq _08045298
adds r0, r4, #0
adds r1, r3, #0
bl ReplaceMonitoredEntity
_08045298:
adds r0, r4, #0
bl sub_0804A7D4
pop {r4, pc}
thumb_func_start nullsub_22
nullsub_22: @ 0x080452A0
bx lr
.align 2, 0
thumb_func_start sub_080452A4
sub_080452A4: @ 0x080452A4
push {r4, r5, lr}
adds r4, r0, #0
movs r2, #1
movs r5, #1
strb r5, [r4, #0xc]
ldrb r1, [r4, #0x18]
movs r0, #4
rsbs r0, r0, #0
ands r0, r1
orrs r0, r2
strb r0, [r4, #0x18]
movs r0, #0x80
lsls r0, r0, #1
strh r0, [r4, #0x24]
adds r0, r4, #0
bl sub_0804A720
adds r0, r4, #0
movs r1, #6
bl InitializeAnimation
ldrb r0, [r4, #0xb]
cmp r0, #0
beq _080452DC
movs r0, #2
strb r0, [r4, #0xc]
strb r5, [r4, #0xe]
b _080452E2
_080452DC:
adds r0, r4, #0
bl sub_080452E4
_080452E2:
pop {r4, r5, pc}
thumb_func_start sub_080452E4
sub_080452E4: @ 0x080452E4
push {r4, lr}
adds r4, r0, #0
movs r0, #2
strb r0, [r4, #0xc]
bl Random
movs r1, #0x1f
ands r0, r1
adds r0, #1
strb r0, [r4, #0xe]
pop {r4, pc}
.align 2, 0
thumb_func_start sub_080452FC
sub_080452FC: @ 0x080452FC
push {r4, r5, lr}
adds r5, r0, #0
bl GetNextFrame
ldrb r0, [r5, #0xe]
subs r0, #1
strb r0, [r5, #0xe]
lsls r0, r0, #0x18
cmp r0, #0
bne _08045370
movs r4, #3
strb r4, [r5, #0xc]
movs r0, #1
strb r0, [r5, #0xe]
movs r1, #0x24
ldrsh r0, [r5, r1]
cmp r0, #0
ble _08045330
movs r0, #0x80
lsls r0, r0, #5
movs r2, #0x24
ldrsh r1, [r5, r2]
bl sub_0806FA04
lsrs r0, r0, #8
strb r0, [r5, #0xe]
_08045330:
adds r0, r5, #0
bl sub_08049FA0
cmp r0, #0
bne _08045360
bl Random
ands r0, r4
cmp r0, #0
beq _08045360
adds r0, r5, #0
bl sub_08049EE4
adds r4, r0, #0
bl Random
movs r1, #8
ands r0, r1
adds r0, #0xfc
adds r4, r4, r0
movs r0, #0x18
ands r4, r0
strb r4, [r5, #0x15]
b _08045370
_08045360:
bl Random
movs r1, #0x18
ands r0, r1
strb r0, [r5, #0x15]
adds r0, r5, #0
bl sub_08045374
_08045370:
pop {r4, r5, pc}
.align 2, 0
thumb_func_start sub_08045374
sub_08045374: @ 0x08045374
push {r4, lr}
adds r4, r0, #0
bl sub_080AEF88
adds r0, r4, #0
bl GetNextFrame
ldrb r0, [r4, #0xe]
subs r0, #1
strb r0, [r4, #0xe]
lsls r0, r0, #0x18
cmp r0, #0
bne _08045392
movs r0, #1
strb r0, [r4, #0xc]
_08045392:
pop {r4, pc}

View File

@ -1,109 +0,0 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.syntax unified
.text
push {r4, r5, r6, r7, lr}
mov r7, sb
mov r6, r8
push {r6, r7}
sub sp, #0x10
mov r8, r0
ldr r1, _0804516C @ =gUnk_080D16D0
ldrb r0, [r0, #0xa]
adds r0, r0, r1
ldrb r7, [r0]
movs r0, #0x48
subs r0, r0, r7
ldr r1, _08045170 @ =gEntCount
ldrb r1, [r1]
cmp r0, r1
ble _08045160
cmp r7, #0
beq _080450E2
mov r4, sp
adds r5, r7, #0
_080450D0:
mov r0, r8
ldrb r1, [r0, #0xa]
movs r0, #0x57
bl CreateEnemy
stm r4!, {r0}
subs r5, #1
cmp r5, #0
bne _080450D0
_080450E2:
ldr r2, _08045174 @ =gUnk_080D16D4
mov sb, r2
movs r5, #0
cmp r5, r7
bge _08045142
_080450EC:
lsls r0, r5, #2
add r0, sp
ldr r6, [r0]
adds r4, r5, #1
adds r0, r4, #0
adds r1, r7, #0
bl __modsi3
lsls r0, r0, #2
add r0, sp
ldr r0, [r0]
str r0, [r6, #0x54]
adds r0, r5, r7
subs r0, #1
adds r1, r7, #0
bl __modsi3
lsls r0, r0, #2
add r0, sp
ldr r0, [r0]
str r0, [r6, #0x50]
movs r1, #0
movs r0, #1
strb r0, [r6, #0xb]
strh r1, [r6, #0x36]
adds r1, r6, #0
adds r1, #0x3d
movs r0, #0xf0
strb r0, [r1]
mov r0, sb
movs r2, #0
ldrsb r2, [r0, r2]
movs r3, #1
ldrsb r3, [r0, r3]
mov r0, r8
adds r1, r6, #0
bl sub_08045178
movs r2, #2
add sb, r2
adds r5, r4, #0
cmp r5, r7
blt _080450EC
_08045142:
mov r0, r8
movs r1, #2
movs r2, #0
bl CreateFx
adds r6, r0, #0
cmp r6, #0
beq _0804515A
mov r0, r8
adds r1, r6, #0
bl CopyPosition
_0804515A:
mov r0, r8
bl DeleteEntity
_08045160:
add sp, #0x10
pop {r3, r4}
mov r8, r3
mov sb, r4
pop {r4, r5, r6, r7, pc}
.align 2, 0
_0804516C: .4byte gUnk_080D16D0
_08045170: .4byte gEntCount
_08045174: .4byte gUnk_080D16D4
.syntax divided

View File

@ -6,152 +6,6 @@
.text
thumb_func_start sub_0806B41C
sub_0806B41C: @ 0x0806B41C
push {r4, lr}
adds r4, r0, #0
ldrb r0, [r4, #0xc]
cmp r0, #1
beq _0806B470
cmp r0, #1
bgt _0806B430
cmp r0, #0
beq _0806B436
b _0806B4EC
_0806B430:
cmp r0, #2
beq _0806B4DE
b _0806B4EC
_0806B436:
ldr r1, _0806B46C @ =gUnk_08112E1C
adds r0, r4, #0
bl LoadExtraSpriteData
cmp r0, #0
beq _0806B4EC
movs r2, #1
movs r0, #1
strb r0, [r4, #0xc]
ldrb r1, [r4, #0x18]
subs r0, #5
ands r0, r1
orrs r0, r2
strb r0, [r4, #0x18]
ldrb r0, [r4, #0xb]
cmp r0, #2
bne _0806B462
adds r0, r4, #0
movs r1, #0x25
movs r2, #0
bl CreateFx
_0806B462:
adds r0, r4, #0
bl sub_0807DD50
b _0806B4EC
.align 2, 0
_0806B46C: .4byte gUnk_08112E1C
_0806B470:
adds r2, r4, #0
adds r2, #0x39
movs r1, #0
ldrsb r1, [r2, r1]
cmp r1, #2
bne _0806B4D4
movs r0, #0
strb r1, [r4, #0xc]
strb r0, [r2]
ldr r1, _0806B4C8 @ =gPlayerEntity
adds r0, r4, #0
bl GetFacingDirection
bl sub_0806F5A4
adds r1, r0, #0
adds r1, #4
adds r0, r4, #0
bl InitializeAnimation
adds r0, r4, #0
bl sub_08002632
ldr r1, _0806B4CC @ =gUnk_08001A7C
lsls r0, r0, #2
adds r0, r0, r1
ldr r3, [r0]
adds r0, r4, #0
adds r0, #0x68
ldrb r0, [r0]
cmp r0, #0x21
bne _0806B4B2
adds r3, #6
_0806B4B2:
ldrh r1, [r3]
ldrh r2, [r3, #2]
ldrh r3, [r3, #4]
adds r0, r4, #0
bl sub_0801DFB4
ldr r0, _0806B4D0 @ =gPlayerState
adds r0, #0x8b
movs r1, #3
strb r1, [r0]
b _0806B4EC
.align 2, 0
_0806B4C8: .4byte gPlayerEntity
_0806B4CC: .4byte gUnk_08001A7C
_0806B4D0: .4byte gPlayerState
_0806B4D4:
adds r0, r4, #0
movs r1, #0
bl sub_0807DD94
b _0806B4EC
_0806B4DE:
adds r0, r4, #0
bl UpdateFuseInteraction
cmp r0, #0
beq _0806B4EC
movs r0, #1
strb r0, [r4, #0xc]
_0806B4EC:
pop {r4, pc}
.align 2, 0
thumb_func_start sub_0806B4F0
sub_0806B4F0: @ 0x0806B4F0
push {lr}
ldrb r1, [r0, #0xb]
lsls r1, r1, #3
ldr r2, _0806B500 @ =gUnk_08112E2C
adds r1, r1, r2
bl ShowNPCDialogue
pop {pc}
.align 2, 0
_0806B500: .4byte gUnk_08112E2C
thumb_func_start sub_0806B504
sub_0806B504: @ 0x0806B504
push {r4, r5, lr}
adds r5, r0, #0
movs r4, #1
movs r0, #0x21
bl CheckKinstoneFused
cmp r0, #0
beq _0806B518
movs r4, #3
b _0806B52A
_0806B518:
movs r0, #0x86
bl CheckLocalFlag
cmp r0, #0
bne _0806B52A
movs r4, #0
movs r0, #0x86
bl SetLocalFlag
_0806B52A:
ldr r0, _0806B53C @ =gUnk_08112E54
lsls r1, r4, #1
adds r1, r1, r0
ldrh r0, [r1]
adds r1, r5, #0
bl TextboxNoOverlap
pop {r4, r5, pc}
.align 2, 0
_0806B53C: .4byte gUnk_08112E54
thumb_func_start sub_0806B540
sub_0806B540: @ 0x0806B540
push {r4, lr}

View File

@ -1,81 +0,0 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.syntax unified
.text
thumb_func_start sub_08045178
sub_08045178: @ 0x08045178
push {r4, r5, r6, lr}
adds r4, r1, #0
adds r5, r2, #0
adds r6, r3, #0
cmp r4, #0
beq _080451C6
bl sub_0804A4E4
adds r0, r4, #0
adds r1, r5, #0
adds r2, r6, #0
bl sub_080002CC
cmp r0, #0
bne _080451C6
movs r1, #0x2e
ldrsh r0, [r4, r1]
adds r2, r0, r5
cmp r2, #0
blt _080451AE
ldr r0, _080451C8 @ =gRoomControls
ldrh r1, [r0, #6]
ldrh r0, [r0, #0x1e]
adds r1, r1, r0
cmp r2, r1
bge _080451AE
strh r2, [r4, #0x2e]
_080451AE:
movs r1, #0x32
ldrsh r0, [r4, r1]
adds r2, r0, r6
cmp r2, #0
blt _080451C6
ldr r0, _080451C8 @ =gRoomControls
ldrh r1, [r0, #8]
ldrh r0, [r0, #0x20]
adds r1, r1, r0
cmp r2, r1
bge _080451C6
strh r2, [r4, #0x32]
_080451C6:
pop {r4, r5, r6, pc}
.align 2, 0
_080451C8: .4byte gRoomControls
thumb_func_start sub_080451CC
sub_080451CC: @ 0x080451CC
ldrb r3, [r0, #0x10]
movs r2, #0xfe
ands r2, r3
strb r2, [r1, #0x10]
ldr r2, [r0, #0x2c]
str r2, [r1, #0x2c]
ldr r2, [r0, #0x30]
str r2, [r1, #0x30]
ldr r2, [r0, #0x34]
str r2, [r1, #0x34]
adds r0, #0x68
adds r1, #0x68
ldrb r2, [r0, #4]
strb r2, [r1, #4]
ldrb r2, [r0, #5]
strb r2, [r1, #5]
ldrb r2, [r0, #6]
strb r2, [r1, #6]
ldrb r2, [r0, #7]
strb r2, [r1, #7]
ldrh r2, [r0, #8]
strh r2, [r1, #8]
ldrh r0, [r0, #0xa]
strh r0, [r1, #0xa]
bx lr
.align 2, 0

36
asm/sub_080451CC.s Normal file
View File

@ -0,0 +1,36 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.syntax unified
.text
thumb_func_start sub_080451CC
sub_080451CC: @ 0x080451CC
ldrb r3, [r0, #0x10]
movs r2, #0xfe
ands r2, r3
strb r2, [r1, #0x10]
ldr r2, [r0, #0x2c]
str r2, [r1, #0x2c]
ldr r2, [r0, #0x30]
str r2, [r1, #0x30]
ldr r2, [r0, #0x34]
str r2, [r1, #0x34]
adds r0, #0x68
adds r1, #0x68
ldrb r2, [r0, #4]
strb r2, [r1, #4]
ldrb r2, [r0, #5]
strb r2, [r1, #5]
ldrb r2, [r0, #6]
strb r2, [r1, #6]
ldrb r2, [r0, #7]
strb r2, [r1, #7]
ldrh r2, [r0, #8]
strh r2, [r1, #8]
ldrh r0, [r0, #0xa]
strh r0, [r1, #0xa]
bx lr
.align 2, 0

View File

@ -167,7 +167,10 @@ extern void SetSpriteSubEntryOffsetData2(Entity*, u32, u32);
extern u32 GetFacingDirection(Entity*, Entity*);
extern void DeleteThisEntity();
extern void DeleteThisEntity(void);
extern void CopyPosition(Entity*, Entity*);
extern void DeleteEntity(Entity*);
extern void PositionRelative(Entity*, Entity*, s32, s32);
extern Entity gUnk_03003DA0;

View File

@ -27,8 +27,10 @@ typedef struct {
u8 screenShakeMagnitude;
u8 unk7;
u16 screenShakeTime;
u16 filler2[6];
u8 filler3[4];
u16 filler2[3];
u16 width;
u16 height;
u8 filler3[6];
union SplitWord bg3OffsetX;
union SplitWord bg3OffsetY;
Entity* cameraTarget;

View File

@ -418,9 +418,9 @@ SECTIONS {
asm/dust.o(.text);
asm/vaatiBall.o(.text);
src/enemy/slime.o(.text);
asm/slime.o(.text);
asm/miniSlime.o(.text);
asm/fireballGuy.o(.text);
asm/sub_080451CC.o(.text);
src/enemy/miniSlime.o(.text);
src/enemy/fireballGuy.o(.text);
src/enemy/miniFireballGuy.o(.text);
asm/enemy5A.o(.text);
asm/businessScrubPrologue.o(.text);

View File

@ -1,9 +1,6 @@
#include "global.h"
#include "entity.h"
extern Entity* CreateObject();
extern void CopyPosition();
Entity* CreateObjectWithParent(Entity* parentEnt, u32 subtype, u32 param1, u32 param2) {
Entity* ent;

121
src/enemy/fireballGuy.c Normal file
View File

@ -0,0 +1,121 @@
#include "global.h"
#include "entity.h"
#include "functions.h"
typedef struct {
s8 h, v;
} PACKED PosOffset;
extern void sub_08045524(Entity*);
void sub_08045178(Entity*, Entity*, int, int);
extern void (*const gUnk_080D17E8[])(Entity*);
extern void (*const gUnk_080D1800[])(Entity*);
extern u8 gUnk_080D180C[4]; // Entity count per form
extern PosOffset gUnk_080D1810[4];
extern u8 gEntCount;
void FireballGuy(Entity* this) {
EnemyFunctionHandler(this, gUnk_080D17E8);
}
void sub_080453A4(Entity* this) {
gUnk_080D1800[this->action](this);
}
void sub_080453BC(Entity* this) {
if (this->currentHealth && this->cutsceneBeh.HALF.LO != this->currentHealth) {
this->action = 2;
} else {
sub_0804AA30(this, gUnk_080D17E8);
}
}
void nullsub_172(void) {
}
void sub_080453E8(Entity* this) {
this->action = 1;
this->actionDelay = 0;
this->spriteSettings.b.draw = 1;
this->nonPlanarMovement = 0x80;
this->cutsceneBeh.HALF.LO = this->currentHealth;
this->field_0x3c |= 0x10;
sub_0804A720(this);
InitializeAnimation(this, 0);
sub_08045524(this);
}
void sub_08045430(Entity* this) {
sub_080AEFE0(this);
GetNextFrame(this);
if (sub_08003FC4(this, 0x1800) == 0)
sub_08045524(this);
}
/* Split FireballGuy into new ones */
void sub_08045454(Entity* this) {
Entity* entities[4];
Entity* ent;
s32 count, i;
PosOffset* off;
u32 tmp;
/* Can we create enough new entities? */
count = gUnk_080D180C[this->entityType.form];
if (72 - count <= gEntCount)
return;
/* Create 2-5 new MiniFireballGuy */
for (i = 0; i < count; i++)
entities[i] = CreateEnemy(0x59, this->entityType.form);
off = gUnk_080D1810;
for (i = 0; i < count; i++) {
ent = entities[i];
ent->attachedEntity = entities[(i + 1) % count];
ent->parent = entities[(i + count - 1) % count];
tmp = 0;
ent->entityType.parameter = 1;
ent->height.HALF.HI = tmp;
ent->hurtBlinkTime = -0x10;
/* Set MiniFireballGuy offset relative to killed slime. */
sub_08045178(this, ent, off->h, off->v);
off++;
}
ent = CreateFx(this, 2, 0);
if (ent)
CopyPosition(this, ent);
DeleteEntity(this);
}
u32 sub_0804A024(Entity*, u32, u32);
void sub_08045524(Entity *this) {
u32 tmp, tmp1, tmp2;
this->field_0x20 = 0x1c000;
tmp = sub_0804A024(this,1,8);
if (tmp != 0xff && (Random() & 3) == 0) {
this->actionDelay = Random() & 3;
this->direction = tmp & 0x18;
} else {
if (this->actionDelay) {
this->actionDelay--;
return;
}
this->actionDelay = Random() & 3;
if (sub_08049FA0(this) == 0 && (Random() & 3)) {
tmp1 = sub_08049EE4(this);
tmp2 = Random() & 8;
tmp2 += 0xfc;
this->direction = (tmp1 + tmp2) & 0x18;
} else {
this->direction = Random() & 0x18;
}
}
}

95
src/enemy/miniSlime.c Normal file
View File

@ -0,0 +1,95 @@
#include "global.h"
#include "entity.h"
#include "room.h"
#include "functions.h"
void sub_08045374(Entity*);
extern u32 sub_0806FA04(u32, u32);
extern void sub_0804A720();
extern void sub_080452E4();
extern void sub_0804A9FC();
extern void sub_0804AA30();
extern void ReplaceMonitoredEntity(Entity*, Entity*);
extern void sub_0804A7D4(Entity*);
extern void (*const gUnk_080D17C0[])(Entity*);
extern void (*const gUnk_080D17D8[])(Entity*);
void MiniSlime(Entity* this) {
EnemyFunctionHandler(this, gUnk_080D17C0);
SetChildOffset(this, 0, 1, -8);
}
void sub_08045220(Entity* this) {
gUnk_080D17D8[this->action](this);
}
void sub_08045238(Entity* this) {
if (this->field_0x43)
sub_0804A9FC(this, 0x1c);
sub_0804AA30(this, gUnk_080D17C0);
}
void sub_0804525C(Entity* this) {
Entity* parent = this->parent;
if (this != parent && parent) {
this->field_0x6c.HALF.LO &= 0x7f;
this->parent->attachedEntity = this->attachedEntity;
this->attachedEntity->parent = this->parent;
if (this->field_0x6c.HALF.HI & 0x40)
ReplaceMonitoredEntity(this, parent);
}
sub_0804A7D4(this);
}
void nullsub_22(void) {
}
void sub_080452A4(Entity* this) {
this->action = 1;
this->spriteSettings.b.draw = 1;
this->nonPlanarMovement = 0x100;
sub_0804A720(this);
InitializeAnimation(this, 6);
if (this->entityType.parameter) {
this->action = 2;
this->actionDelay = 1;
} else {
sub_080452E4(this);
}
}
void sub_080452E4(Entity* this) {
this->action = 2;
this->actionDelay = (Random() & 0x1f) + 1;
}
void sub_080452FC(Entity *this) {
u32 cVar2, bVar3;
GetNextFrame(this);
if (--this->actionDelay == 0) {
this->action = 3;
this->actionDelay = 1;
if (0 < this->nonPlanarMovement)
this->actionDelay = sub_0806FA04(0x1000, this->nonPlanarMovement) >> 0x8;
if (sub_08049FA0(this) == 0 && (Random() & 3)) {
cVar2 = sub_08049EE4(this);
bVar3 = Random() & 8;
bVar3 += 0xfc;
this->direction = (cVar2 + bVar3) & 0x18;
} else {
this->direction = Random() & 0x18;
sub_08045374(this);
}
}
}
void sub_08045374(Entity* this) {
sub_080AEF88(this);
GetNextFrame(this);
if (--this->actionDelay == 0)
this->action = 1;
}

View File

@ -1,5 +1,7 @@
#include "global.h"
#include "entity.h"
#include "room.h"
#include "functions.h"
typedef struct {
void* field_0x0;
@ -7,28 +9,31 @@ typedef struct {
u8 freezeTime;
} EntityHandler;
extern void EnemyFunctionHandler(Entity*, void*);
extern void SetChildOffset(Entity*, u32, u32, u32);
extern void sub_0804AA30(Entity*, void*);
typedef struct {
s8 h, v;
} PACKED PosOffset;
void sub_08044FF8(Entity*);
void sub_08045178(Entity*, Entity*, int, int);
extern void sub_0804A9FC(Entity*, u32);
extern void sub_0804A720(Entity*);
extern void sub_08044FF8(Entity*);
extern u32 Random(void);
extern u32 sub_0806FA04(u32, u32);
extern u32 sub_08049FA0(Entity*);
extern u32 sub_08049EE4(Entity*);
extern u32 sub_080AEF88(void);
extern void sub_0804A4E4(Entity*, Entity*);
extern u32 sub_080002CC(Entity*, s32, s32);
extern void (*gUnk_080D16BC[])(Entity*);
extern void (*gUnk_080D16A4[])(Entity*);
extern void (*const gUnk_080D16BC[])(Entity*);
extern void (*const gUnk_080D16A4[])(Entity*);
extern u8 gUnk_080D16D0[4]; // Entity count per form
extern PosOffset gUnk_080D16D4[4];
extern u8 gUnk_080D16D0;
extern u8 gEntCount;
extern EntityHandler gUnk_03003DB8;
void Slime(Entity* this)
{
EnemyFunctionHandler(this, &gUnk_080D16A4);
void Slime(Entity* this) {
EnemyFunctionHandler(this, gUnk_080D16A4);
SetChildOffset(this, 0, 1, -12);
}
@ -40,7 +45,7 @@ void sub_08044F88(Entity* this) {
if ((this->currentHealth != 0) && (this->cutsceneBeh.HALF.LO != this->currentHealth)) {
this->action = 4;
} else {
sub_0804AA30(this, &gUnk_080D16A4);
sub_0804AA30(this, gUnk_080D16A4);
}
if (this->field_0x43 != 0) {
@ -61,32 +66,21 @@ void sub_08044FC8(Entity* this) {
}
void sub_08044FF8(Entity* this) {
u32 bVar1;
this->action = 2;
bVar1 = Random();
this->actionDelay = (bVar1 & 31) + 30;
this->actionDelay = (Random() & 31) + 30;
this->cutsceneBeh.HALF.LO = this->currentHealth;
}
void sub_08045018(Entity* this) {
u32 cVar1;
u32 param3;
u32 iVar3;
u32 randValue;
GetNextFrame(this);
param3 = this->actionDelay -= 1;
if (param3 == 0) {
if (--this->actionDelay == 0) {
this->action = 3;
this->actionDelay = 1;
if (0 < this->nonPlanarMovement) {
this->actionDelay = sub_0806FA04(4096, this->nonPlanarMovement) >> 8;
}
iVar3 = sub_08049FA0(this);
if ((iVar3 == 0) && (randValue = Random(), (randValue & 3) != 0)) {
cVar1 = sub_08049EE4(this);
this->direction = (cVar1 + 0xfc + (Random() & 8)) & 24;
if (sub_08049FA0(this) == 0 && (Random() & 3)) {
this->direction = (sub_08049EE4(this) + 0xfc + (Random() & 8)) & 24;
return;
}
this->direction = Random() & 24;
@ -94,74 +88,65 @@ void sub_08045018(Entity* this) {
}
void sub_08045088(Entity* this) {
u8 bVar1;
sub_080AEF88();
sub_080AEF88(this);
GetNextFrame(this);
bVar1 = this->actionDelay -= 1;
if (bVar1 == 0) {
if (--this->actionDelay == 0) {
this->action = 1;
}
}
#ifdef NON_MATCHING
void sub_080450A8(Entity* this)
{
u8 bVar1;
u32 uVar2;
s32 iVar3;
s32 iVar4;
Entity* pEVar5;
Entity** ppEVar6;
s32 dividend;
u32 uVar7;
Entity* local_r6_72;
u32 divisor;
u8* pcVar8;
Entity* local_2c[4];
ppEVar6 = local_2c;
bVar1 = (&gUnk_080D16D0)[(this->entityType).form];
divisor = (u32)bVar1;
if ((int)gUnk_03003DB8.entityCount < (int)(72 - divisor)) {
uVar7 = divisor;
if (bVar1 != 0) {
do {
uVar2 = CreateEnemy(87, this->entityType.form);
*ppEVar6 = uVar2;
ppEVar6 = ppEVar6 + 1;
uVar7 = uVar7 - 1;
} while (uVar7 != 0);
}
pcVar8 = "\x06";
iVar4 = 0;
if (bVar1 != 0) {
do {
local_r6_72 = local_2c[iVar4];
dividend = iVar4 + 1;
iVar3 = Div(dividend, divisor);
local_r6_72->attachedEntity = local_2c[iVar3];
iVar4 = Div(iVar4 + divisor + -1, divisor);
local_r6_72->parent = local_2c[iVar4];
(local_r6_72->entityType).parameter = 1;
local_r6_72->height.WORD = 0;
local_r6_72->hurtBlinkTime = 240;
sub_08045178(this, local_r6_72, *pcVar8, pcVar8[1]);
pcVar8 = pcVar8 + 2;
iVar4 = dividend;
} while (dividend < divisor);
}
pEVar5 = CreateFx(this, 2, 0);
if (pEVar5 != NULL) {
CopyPosition(this, pEVar5);
}
DeleteEnemy(this);
}
}
#else
NAKED
/* Split slime into new ones */
void sub_080450A8(Entity* this) {
asm(".include \"asm/non_matching/slime/sub_080450A8.inc\"");
Entity* entities[4];
Entity* ent;
s32 count, i;
PosOffset* off;
/* Can we create enough new entities? */
count = gUnk_080D16D0[this->entityType.form];
if (72 - count <= gEntCount)
return;
/* Create 2-4 new MiniSlime */
for (i = 0; i < count; i++)
entities[i] = CreateEnemy(0x57, this->entityType.form);
off = gUnk_080D16D4;
for (i = 0; i < count; i++) {
ent = entities[i];
ent->attachedEntity = entities[(i + 1) % count];
ent->parent = entities[(i + count - 1) % count];
ent->entityType.parameter = 1;
ent->height.HALF.HI = 0;
ent->hurtBlinkTime = -0x10;
/* Set MiniSlime offset relative to killed slime. */
sub_08045178(this, ent, off->h, off->v);
off++;
}
ent = CreateFx(this, 2, 0);
if (ent)
CopyPosition(this, ent);
DeleteEntity(this);
}
void sub_08045178(Entity* this, Entity* child, int h, int v) {
int x, y;
if (child == NULL)
return;
sub_0804A4E4(this, child);
if (sub_080002CC(child, h, v))
return;
x = child->x.HALF.HI + h;
if (0 <= x && x < (gRoomControls.roomOriginX + gRoomControls.width))
child->x.HALF.HI = x;
y = child->y.HALF.HI + v;
if (0 <= y && y < (gRoomControls.roomOriginY + gRoomControls.height))
child->y.HALF.HI = y;
}
#endif

View File

@ -84,24 +84,12 @@ void sub_0806b2b4(Entity* this) {
TextboxNoOverlap(gUnk_08112D50[index], this);
}
void Librari_Fusion(Entity *this)
{
if (this->action == 0) {
this->action++;
this->spriteSettings.b.draw = TRUE;
InitAnimationForceUpdate(this, 9);
}
else {
UpdateAnimationSingleFrame(this);
}
void Librari_Fusion(Entity* this) {
if (this->action == 0) {
this->action++;
this->spriteSettings.b.draw = TRUE;
InitAnimationForceUpdate(this, 9);
} else {
UpdateAnimationSingleFrame(this);
}
}
void Percy_Head(Entity *this) // ???
{
SetExtraSpriteFrame(this, 0, (this->frameSpriteSettings & 0x3f) + 0x13);
SetExtraSpriteFrame(this, 1, (this->frames.all & 0x7f) + 0xb);
SetExtraSpriteFrame(this, 2, this->frameIndex);
SetSpriteSubEntryOffsetData1(this, 2, 1);
SetSpriteSubEntryOffsetData2(this, 2, 0);
sub_0807000C(this);
}

View File

@ -3,12 +3,28 @@
#include "npc.h"
#include "textbox.h"
#include "functions.h"
#include "flags.h"
extern void sub_0806B41C(Entity*);
void sub_0806B3CC(Entity*);
extern void sub_0806B3CC(Entity*);
extern u32 sub_08002632(Entity*);
extern void sub_0801DFB4(Entity*, u32, u32, u32);
extern u16* gUnk_08001A7C[40];
extern u16 gUnk_08112E54[4];
extern Dialog gUnk_08112E2C[5];
extern SpriteLoadData gUnk_08112E1C;
void Percy_Head(Entity* this) {
SetExtraSpriteFrame(this, 0, (this->frameSpriteSettings & 0x3f) + 0x13);
SetExtraSpriteFrame(this, 1, (this->frames.all & 0x7f) + 0xb);
SetExtraSpriteFrame(this, 2, this->frameIndex);
SetSpriteSubEntryOffsetData1(this, 2, 1);
SetSpriteSubEntryOffsetData2(this, 2, 0);
sub_0807000C(this);
}
void Percy(Entity* this) {
if ((this->flags & 2) != 0) {
sub_0806B41C(this);
@ -17,20 +33,75 @@ void Percy(Entity* this) {
}
}
void sub_0806B3CC(Entity *this)
{
if (this->action == 0) {
if (!LoadExtraSpriteData(this, &gUnk_08112E1C)) {
return;
void sub_0806B3CC(Entity* this) {
if (this->action == 0) {
if (!LoadExtraSpriteData(this, &gUnk_08112E1C)) {
return;
}
this->action = 1;
InitializeAnimation(this, 0);
sub_08078778(this);
}
this->action = 1;
InitializeAnimation(this, 0);
sub_08078778(this);
}
GetNextFrame(this);
if (this->interactType != 0) {
this->interactType = 0;
TextboxNoOverlapFollow(0);
}
sub_0806ED78(this);
GetNextFrame(this);
if (this->interactType != 0) {
this->interactType = 0;
TextboxNoOverlapFollow(0);
}
sub_0806ED78(this);
}
void sub_0806B41C(Entity* this) {
u16* tmp;
u32 idx;
switch (this->action) {
case 0:
if (LoadExtraSpriteData(this, &gUnk_08112E1C)) {
this->action = 1;
this->spriteSettings.b.draw = 1;
if (this->entityType.parameter == 2) {
CreateFx(this, 0x25, 0);
}
sub_0807DD50(this);
}
break;
case 1:
if (this->interactType == 2) {
this->action = 2;
this->interactType = 0;
InitializeAnimation(this, sub_0806F5A4(GetFacingDirection(this, &gPlayerEntity)) + 4);
idx = sub_08002632(this);
tmp = gUnk_08001A7C[idx];
if (this->field_0x68.HALF.LO == 33)
tmp += 3;
sub_0801DFB4(this, tmp[0], tmp[1], tmp[2]);
gPlayerState.field_0x8b = 3;
} else {
sub_0807DD94(this, 0);
}
break;
case 2:
if (UpdateFuseInteraction(this)) {
this->action = 1;
}
break;
}
}
void sub_0806B4F0(Entity* this) {
ShowNPCDialogue(this, &gUnk_08112E2C[this->entityType.parameter]);
}
void sub_0806B504(Entity* this) {
int idx;
idx = 1;
if (CheckKinstoneFused(0x21)) {
idx = 3;
} else if (!CheckLocalFlag(0x86)) {
idx = 0;
SetLocalFlag(0x86);
}
TextboxNoOverlap(gUnk_08112E54[idx], this);
}

View File

@ -20,7 +20,7 @@ void sub_0808F658(Entity* this) {
this->direction = 8;
this->nonPlanarMovement = gUnk_08121EB0[(this->entityType).form];
this->field_0x78.HWORD = gRoomControls.roomOriginX - 0x60;
this->field_0x7a.HWORD = gRoomControls.roomOriginX + gRoomControls.filler2[3] + 0x60;
this->field_0x7a.HWORD = gRoomControls.roomOriginX + gRoomControls.width + 0x60;
this->animationState = 0;
this->x.HALF.HI += (Random() & 0xf) << 4;
this->actionDelay = 0;

View File

@ -1,11 +1,9 @@
#include "global.h"
#include "entity.h"
extern void CopyPosition();
extern void sub_08086A6C();
extern s32 sub_080044EC();
extern void sub_080AEF88();
extern void DeleteThisEntity();
extern u32 Random(void);
extern void (*gUnk_081206C4[99])(Entity*);

View File

@ -7,7 +7,6 @@ extern u32 sub_080041A0(Entity*, Entity*, u32, u32);
void sub_08099ECC(Entity*);
extern void sub_0805E4E0(Entity*, u32);
extern void sub_0805B390(u32);
extern void CopyPosition(Entity*, Entity*);
extern void (*const gUnk_081237F8[])(Entity*);

View File

@ -5,7 +5,6 @@
extern BoundingBox gUnk_080FD168;
extern void SetTile(u32, u32, u32);
extern void CopyPosition(Entity*, Entity*);
void Object9E(Entity *this)
{

View File

@ -2,8 +2,6 @@
#include "entity.h"
extern void sub_080A0640(Entity*);
extern void PositionRelative(Entity*, Entity*, s32, s32);
extern void CopyPosition(Entity*, Entity*);
extern void (*const gUnk_081248C4[])(Entity*);

View File

@ -2,9 +2,7 @@
#include "entity.h"
extern u32 Random(void);
extern void CopyPosition(Entity*, Entity*);
extern void sub_0806F69C(Entity*);
extern void DeleteEntity(Entity*);
extern void (*const gUnk_08121060[])(Entity*);
extern void (*const gUnk_08121070[])(Entity*);

View File

@ -2057,7 +2057,7 @@ extern EntityData gUnk_080DE4C8;
void sub_0804CBB0(void) {
if ((gPlayerEntity.y.HALF.HI - gRoomControls.roomOriginY) < (gRoomControls.filler2[4] >> 1)) {
if ((gPlayerEntity.y.HALF.HI - gRoomControls.roomOriginY) < (gRoomControls.height >> 1)) {
if (!CheckLocalFlag(0x17)) {
LoadRoomEntityList(&gUnk_080DE4C8);
}