decomp vaati macro eye

This commit is contained in:
Henny022p 2021-05-28 10:25:35 +02:00
parent 0d98d00c01
commit dbfb827bd3
5 changed files with 308 additions and 674 deletions

View File

@ -1,631 +0,0 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.syntax unified
.text
thumb_func_start VaatiEyesMacro
VaatiEyesMacro: @ 0x0802EC6C
push {r4, r5, lr}
adds r4, r0, #0
ldr r5, _0802EC94 @ =gUnk_080CDE34
bl GetNextFunction
lsls r0, r0, #2
adds r0, r0, r5
ldr r1, [r0]
adds r0, r4, #0
bl _call_via_r1
movs r3, #0x10
rsbs r3, r3, #0
adds r0, r4, #0
movs r1, #0
movs r2, #1
bl SetChildOffset
pop {r4, r5, pc}
.align 2, 0
_0802EC94: .4byte gUnk_080CDE34
thumb_func_start sub_0802EC98
sub_0802EC98: @ 0x0802EC98
push {r4, lr}
adds r4, r0, #0
ldr r1, _0802ECBC @ =gUnk_080CDE4C
ldrb r0, [r4, #0xa]
lsls r0, r0, #2
adds r0, r0, r1
ldr r1, [r0]
adds r0, r4, #0
bl _call_via_r1
ldrb r0, [r4, #0xa]
cmp r0, #1
bhi _0802ECB8
adds r0, r4, #0
bl sub_0802EF90
_0802ECB8:
pop {r4, pc}
.align 2, 0
_0802ECBC: .4byte gUnk_080CDE4C
thumb_func_start sub_0802ECC0
sub_0802ECC0: @ 0x0802ECC0
push {r4, r5, r6, lr}
adds r4, r0, #0
ldrb r0, [r4, #0xa]
cmp r0, #0
bne _0802ED2A
adds r0, r4, #0
adds r0, #0x45
ldrb r1, [r0]
adds r5, r0, #0
ldr r3, _0802ED00 @ =gScreenTransition
cmp r1, #0
bne _0802ECEE
adds r2, r3, #0
adds r2, #0x39
adds r0, r3, #0
adds r0, #0x3c
ldrb r0, [r0]
adds r0, #2
movs r1, #1
lsls r1, r0
ldrb r0, [r2]
bics r0, r1
strb r0, [r2]
_0802ECEE:
ldr r0, _0802ED04 @ =gRoomControls
ldrb r0, [r0, #5]
cmp r0, #0
bne _0802ED08
ldrb r1, [r5]
adds r0, r3, #0
adds r0, #0x3a
b _0802ED0E
.align 2, 0
_0802ED00: .4byte gScreenTransition
_0802ED04: .4byte gRoomControls
_0802ED08:
ldrb r1, [r5]
adds r0, r3, #0
adds r0, #0x3b
_0802ED0E:
strb r1, [r0]
adds r6, r4, #0
adds r6, #0x79
ldrb r0, [r6]
ldrb r1, [r5]
cmp r0, r1
beq _0802ED24
movs r0, #0xbd
lsls r0, r0, #1
bl EnqueueSFX
_0802ED24:
ldrb r0, [r5]
strb r0, [r6]
b _0802ED52
_0802ED2A:
cmp r0, #1
bne _0802ED52
adds r1, r4, #0
adds r1, #0x3d
movs r0, #0
ldrsb r0, [r1, r0]
cmp r0, #0
ble _0802ED3E
rsbs r0, r0, #0
strb r0, [r1]
_0802ED3E:
adds r5, r4, #0
adds r5, #0x45
ldrb r0, [r5]
cmp r0, #0xff
beq _0802ED4E
movs r0, #0xe5
bl EnqueueSFX
_0802ED4E:
movs r0, #0xff
strb r0, [r5]
_0802ED52:
adds r0, r4, #0
adds r0, #0x43
ldrb r0, [r0]
cmp r0, #0
beq _0802ED64
adds r0, r4, #0
movs r1, #0x1c
bl sub_0804A9FC
_0802ED64:
ldr r1, _0802ED70 @ =gUnk_080CDE34
adds r0, r4, #0
bl sub_0804AA30
pop {r4, r5, r6, pc}
.align 2, 0
_0802ED70: .4byte gUnk_080CDE34
thumb_func_start sub_0802ED74
sub_0802ED74: @ 0x0802ED74
push {lr}
ldr r2, _0802ED88 @ =gUnk_080CDE5C
ldrb r1, [r0, #0xc]
lsls r1, r1, #2
adds r1, r1, r2
ldr r1, [r1]
bl _call_via_r1
pop {pc}
.align 2, 0
_0802ED88: .4byte gUnk_080CDE5C
thumb_func_start sub_0802ED8C
sub_0802ED8C: @ 0x0802ED8C
push {r4, lr}
adds r4, r0, #0
ldr r0, _0802EDD0 @ =gEntCount
ldrb r0, [r0]
cmp r0, #0x46
bhi _0802EE0A
bl GetEmptyManager
adds r1, r0, #0
cmp r1, #0
beq _0802EE0A
movs r0, #9
strb r0, [r1, #8]
movs r0, #0x34
strb r0, [r1, #9]
str r4, [r1, #0x14]
adds r0, r1, #0
movs r1, #8
bl AppendEntityToList
movs r0, #0x25
movs r1, #2
bl CreateEnemy
str r4, [r0, #0x50]
movs r0, #1
strb r0, [r4, #0xc]
ldr r0, _0802EDD4 @ =gRoomControls
ldrb r0, [r0, #5]
cmp r0, #0
bne _0802EDDC
ldr r0, _0802EDD8 @ =gScreenTransition
adds r0, #0x3a
b _0802EDE0
.align 2, 0
_0802EDD0: .4byte gEntCount
_0802EDD4: .4byte gRoomControls
_0802EDD8: .4byte gScreenTransition
_0802EDDC:
ldr r0, _0802EE0C @ =gScreenTransition
adds r0, #0x3b
_0802EDE0:
ldrb r0, [r0]
adds r1, r4, #0
adds r1, #0x45
strb r0, [r1]
adds r1, #0x34
strb r0, [r1]
bl Random
adds r1, r4, #0
adds r1, #0x78
strb r0, [r1]
adds r0, r4, #0
bl sub_0802EFB8
adds r0, r4, #0
movs r1, #0
bl InitializeAnimation
adds r0, r4, #0
bl sub_0802EF58
_0802EE0A:
pop {r4, pc}
.align 2, 0
_0802EE0C: .4byte gScreenTransition
thumb_func_start sub_0802EE10
sub_0802EE10: @ 0x0802EE10
push {r4, lr}
adds r4, r0, #0
bl sub_0802F04C
adds r0, r4, #0
bl GetNextFrame
pop {r4, pc}
thumb_func_start sub_0802EE20
sub_0802EE20: @ 0x0802EE20
push {lr}
ldr r2, _0802EE34 @ =gUnk_080CDE64
ldrb r1, [r0, #0xc]
lsls r1, r1, #2
adds r1, r1, r2
ldr r1, [r1]
bl _call_via_r1
pop {pc}
.align 2, 0
_0802EE34: .4byte gUnk_080CDE64
thumb_func_start sub_0802EE38
sub_0802EE38: @ 0x0802EE38
push {r4, r5, lr}
adds r5, r0, #0
ldr r0, _0802EE84 @ =gEntCount
ldrb r0, [r0]
cmp r0, #0x46
bhi _0802EE82
movs r0, #0x25
movs r1, #3
bl CreateEnemy
str r5, [r0, #0x50]
movs r0, #1
strb r0, [r5, #0xc]
bl Random
adds r4, r0, #0
movs r1, #3
ands r0, r1
adds r0, #1
strb r0, [r5, #0xe]
bl Random
lsrs r0, r0, #8
adds r1, r5, #0
adds r1, #0x78
strb r0, [r1]
ldr r1, _0802EE88 @ =gUnk_080CDE6C
lsrs r4, r4, #0x10
movs r0, #3
ands r4, r0
adds r4, r4, r1
ldrb r0, [r4]
strb r0, [r5, #0x15]
adds r0, r5, #0
movs r1, #1
bl InitializeAnimation
_0802EE82:
pop {r4, r5, pc}
.align 2, 0
_0802EE84: .4byte gEntCount
_0802EE88: .4byte gUnk_080CDE6C
thumb_func_start sub_0802EE8C
sub_0802EE8C: @ 0x0802EE8C
push {r4, lr}
adds r4, r0, #0
ldr r0, [r4, #0x50]
ldr r2, [r0, #4]
cmp r2, #0
bne _0802EEA8
ldrb r0, [r4, #0x10]
movs r1, #0x7f
ands r1, r0
strb r1, [r4, #0x10]
adds r0, r4, #0
adds r0, #0x45
strb r2, [r0]
b _0802EEB4
_0802EEA8:
adds r0, r4, #0
bl sub_0802F04C
adds r0, r4, #0
bl GetNextFrame
_0802EEB4:
pop {r4, pc}
.align 2, 0
thumb_func_start sub_0802EEB8
sub_0802EEB8: @ 0x0802EEB8
push {r4, lr}
adds r4, r0, #0
ldr r0, [r4, #0x50]
ldr r0, [r0, #4]
cmp r0, #0
bne _0802EEC8
bl DeleteThisEntity
_0802EEC8:
ldrb r0, [r4, #0xc]
cmp r0, #0
bne _0802EED6
movs r0, #1
strb r0, [r4, #0xc]
movs r0, #0xff
strb r0, [r4, #0x14]
_0802EED6:
ldr r0, [r4, #0x50]
adds r1, r4, #0
bl CopyPositionAndSpriteOffset
ldr r1, _0802EF14 @ =gPlayerEntity
adds r0, r4, #0
bl GetFacingDirection
adds r0, #1
movs r1, #0x1e
ands r0, r1
ldr r1, _0802EF18 @ =gUnk_080CDE70
adds r0, r0, r1
ldrb r2, [r0]
ldrb r1, [r4, #0x1e]
cmp r2, r1
beq _0802EF00
ldrb r0, [r0, #1]
cmp r0, r1
beq _0802EF00
strb r2, [r4, #0x1e]
_0802EF00:
ldrh r0, [r4, #0x32]
adds r0, #1
strh r0, [r4, #0x32]
adds r1, r4, #0
adds r1, #0x63
ldrb r0, [r1]
subs r0, #1
strb r0, [r1]
pop {r4, pc}
.align 2, 0
_0802EF14: .4byte gPlayerEntity
_0802EF18: .4byte gUnk_080CDE70
thumb_func_start sub_0802EF1C
sub_0802EF1C: @ 0x0802EF1C
push {r4, lr}
adds r4, r0, #0
ldr r0, [r4, #0x50]
ldr r0, [r0, #4]
cmp r0, #0
bne _0802EF2C
bl DeleteThisEntity
_0802EF2C:
ldrb r0, [r4, #0xc]
cmp r0, #0
bne _0802EF4A
movs r0, #1
strb r0, [r4, #0xc]
movs r0, #0x11
strb r0, [r4, #0x1e]
adds r2, r4, #0
adds r2, #0x29
ldrb r1, [r2]
subs r0, #0x19
ands r0, r1
movs r1, #6
orrs r0, r1
strb r0, [r2]
_0802EF4A:
ldr r0, [r4, #0x50]
adds r1, r4, #0
bl CopyPositionAndSpriteOffset
movs r0, #0
strh r0, [r4, #0x36]
pop {r4, pc}
thumb_func_start sub_0802EF58
sub_0802EF58: @ 0x0802EF58
push {r4, r5, r6, lr}
adds r6, r0, #0
movs r5, #0
_0802EF5E:
movs r0, #0x25
movs r1, #1
bl CreateEnemy
adds r4, r0, #0
cmp r4, #0
beq _0802EF86
strb r5, [r4, #0xb]
adds r1, r4, #0
adds r1, #0x38
movs r0, #1
strb r0, [r1]
str r6, [r4, #0x50]
adds r0, r4, #0
bl UpdateSpriteForCollisionLayer
adds r0, r6, #0
adds r1, r4, #0
bl CopyPosition
_0802EF86:
adds r5, #1
cmp r5, #6
bls _0802EF5E
pop {r4, r5, r6, pc}
.align 2, 0
thumb_func_start sub_0802EF90
sub_0802EF90: @ 0x0802EF90
push {r4, lr}
ldr r4, _0802EFB4 @ =gUnk_080CDE90
adds r3, r0, #0
adds r3, #0x78
ldrb r1, [r3]
adds r2, r1, #1
strb r2, [r3]
lsls r1, r1, #0x18
lsrs r1, r1, #0x1b
movs r2, #7
ands r1, r2
adds r1, r1, r4
ldrb r1, [r1]
lsls r1, r1, #0x18
asrs r1, r1, #0x18
strh r1, [r0, #0x36]
pop {r4, pc}
.align 2, 0
_0802EFB4: .4byte gUnk_080CDE90
thumb_func_start sub_0802EFB8
sub_0802EFB8: @ 0x0802EFB8
push {r4, r5, r6, r7, lr}
adds r4, r0, #0
bl Random
adds r6, r0, #0
lsrs r0, r6, #0x10
movs r1, #3
ands r0, r1
cmp r0, #0
beq _0802EFD2
movs r5, #0x18
ands r5, r6
b _0802EFE0
_0802EFD2:
ldr r0, _0802F01C @ =gPlayerEntity
adds r1, r4, #0
bl GetFacingDirection
adds r5, r0, #4
movs r0, #0x18
ands r5, r0
_0802EFE0:
movs r1, #0x2e
ldrsh r0, [r4, r1]
ldr r2, _0802F020 @ =gRoomControls
ldrh r1, [r2, #6]
subs r0, r0, r1
asrs r0, r0, #4
movs r3, #0x3f
ands r0, r3
movs r7, #0x32
ldrsh r1, [r4, r7]
ldrh r2, [r2, #8]
subs r1, r1, r2
asrs r1, r1, #4
ands r1, r3
lsls r1, r1, #6
orrs r0, r1
ldr r2, _0802F024 @ =gUnk_080B4488
lsrs r1, r5, #2
adds r1, r1, r2
movs r2, #0
ldrsh r1, [r1, r2]
adds r0, r0, r1
movs r1, #1
bl sub_080002E0
cmp r0, #0
beq _0802F028
movs r0, #0xff
strb r0, [r4, #0x15]
b _0802F044
.align 2, 0
_0802F01C: .4byte gPlayerEntity
_0802F020: .4byte gRoomControls
_0802F024: .4byte gUnk_080B4488
_0802F028:
movs r1, #3
adds r0, r6, #0
ands r0, r1
adds r0, #1
strb r0, [r4, #0xe]
strb r5, [r4, #0x15]
ldr r2, _0802F048 @ =gUnk_080CDE98
lsrs r0, r6, #0x18
movs r1, #3
ands r0, r1
lsls r0, r0, #1
adds r0, r0, r2
ldrh r0, [r0]
strh r0, [r4, #0x24]
_0802F044:
pop {r4, r5, r6, r7, pc}
.align 2, 0
_0802F048: .4byte gUnk_080CDE98
thumb_func_start sub_0802F04C
sub_0802F04C: @ 0x0802F04C
push {r4, r5, r6, lr}
adds r4, r0, #0
movs r0, #0x2e
ldrsh r5, [r4, r0]
movs r1, #0x32
ldrsh r6, [r4, r1]
adds r0, r4, #0
bl ProcessMovement
cmp r0, #0
bne _0802F06A
adds r0, r4, #0
bl sub_0802EFB8
b _0802F112
_0802F06A:
ldrb r0, [r4, #0x15]
lsrs r0, r0, #3
cmp r0, #1
beq _0802F098
cmp r0, #1
bgt _0802F07C
cmp r0, #0
beq _0802F082
b _0802F0DC
_0802F07C:
cmp r0, #2
beq _0802F0AE
b _0802F0DC
_0802F082:
movs r2, #0xf
adds r0, r6, #0
ands r0, r2
cmp r0, #8
ble _0802F102
ldrh r1, [r4, #0x32]
adds r0, r2, #0
ands r0, r1
cmp r0, #8
bgt _0802F102
b _0802F0C2
_0802F098:
movs r2, #0xf
adds r0, r5, #0
ands r0, r2
cmp r0, #7
bgt _0802F102
ldrh r1, [r4, #0x2e]
adds r0, r2, #0
ands r0, r1
cmp r0, #7
ble _0802F102
b _0802F0F0
_0802F0AE:
movs r2, #0xf
adds r0, r6, #0
ands r0, r2
cmp r0, #7
bgt _0802F102
ldrh r1, [r4, #0x32]
adds r0, r2, #0
ands r0, r1
cmp r0, #7
ble _0802F102
_0802F0C2:
ldrb r0, [r4, #0xe]
subs r0, #1
strb r0, [r4, #0xe]
movs r1, #0x32
ldrsh r0, [r4, r1]
ldr r1, _0802F0D8 @ =0x0000FFF0
ands r0, r1
adds r6, r0, #0
adds r6, #8
b _0802F102
.align 2, 0
_0802F0D8: .4byte 0x0000FFF0
_0802F0DC:
movs r2, #0xf
adds r0, r5, #0
ands r0, r2
cmp r0, #8
ble _0802F102
ldrh r1, [r4, #0x2e]
adds r0, r2, #0
ands r0, r1
cmp r0, #8
bgt _0802F102
_0802F0F0:
ldrb r0, [r4, #0xe]
subs r0, #1
strb r0, [r4, #0xe]
movs r1, #0x2e
ldrsh r0, [r4, r1]
ldr r1, _0802F114 @ =0x0000FFF0
ands r0, r1
adds r5, r0, #0
adds r5, #8
_0802F102:
ldrb r0, [r4, #0xe]
cmp r0, #0
bne _0802F112
strh r5, [r4, #0x2e]
strh r6, [r4, #0x32]
adds r0, r4, #0
bl sub_0802EFB8
_0802F112:
pop {r4, r5, r6, pc}
.align 2, 0
_0802F114: .4byte 0x0000FFF0

View File

@ -1,39 +0,0 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.section .rodata
.align 2
gUnk_080CDE34:: @ 080CDE34
.4byte sub_0802EC98
.4byte sub_0802ECC0
.4byte sub_08001324
.4byte sub_0804A7D4
.4byte sub_08001242
.4byte sub_0802EC98
gUnk_080CDE4C:: @ 080CDE4C
.4byte sub_0802ED74
.4byte sub_0802EE20
.4byte sub_0802EEB8
.4byte sub_0802EF1C
gUnk_080CDE5C:: @ 080CDE5C
.4byte sub_0802ED8C
.4byte sub_0802EE10
gUnk_080CDE64:: @ 080CDE64
.4byte sub_0802EE38
.4byte sub_0802EE8C
gUnk_080CDE6C:: @ 080CDE6C
.incbin "baserom.gba", 0x0CDE6C, 0x0000004
gUnk_080CDE70:: @ 080CDE70
.incbin "baserom.gba", 0x0CDE70, 0x0000020
gUnk_080CDE90:: @ 080CDE90
.incbin "baserom.gba", 0x0CDE90, 0x0000008
gUnk_080CDE98:: @ 080CDE98
.incbin "baserom.gba", 0x0CDE98, 0x0000008

View File

@ -53,7 +53,8 @@ typedef struct {
u8 field_0x24[0x14];
u8 field_0x38;
u8 field_0x39;
u16 field_0x3a;
u8 field_0x3a;
u8 field_0x3b;
u8 field_0x3c;
u8 field_0x3d;
u16 field_0x3e;

View File

@ -376,7 +376,7 @@ SECTIONS {
src/enemy/bobomb.o(.text);
src/enemy/wallMaster2.o(.text);
asm/gleerok.o(.text);
asm/vaatiEyesMacro.o(.text);
src/enemy/vaatiEyesMacro.o(.text);
src/enemy/tektite.o(.text);
asm/wizzrobeWind.o(.text);
asm/wizzrobeFire.o(.text);
@ -1056,7 +1056,7 @@ SECTIONS {
src/enemy/wallMaster2.o(.rodata);
data/const/enemy/gleerok.o(.rodata);
data/animations/enemy/gleerok.o(.rodata);
data/const/enemy/vaatiEyesMacro.o(.rodata);
src/enemy/vaatiEyesMacro.o(.rodata);
data/animations/enemy/vaatiEyesMacro.o(.rodata);
data/const/enemy/tektite.o(.rodata);
data/animations/enemy/tektite.o(.rodata);
@ -1115,7 +1115,8 @@ SECTIONS {
data/animations/enemy/mazaalBracelet.o(.rodata);
data/const/enemy/takkuri.o(.rodata);
data/const/enemy/bowMoblin.o(.rodata);
data/animations/enemy/bowMoblin.o(.rodata); src/enemy/lakitu.o(.rodata);
data/animations/enemy/bowMoblin.o(.rodata);
src/enemy/lakitu.o(.rodata);
data/animations/enemy/lakitu.o(.rodata);
src/enemy/lakituCloud.o(.rodata);
data/const/enemy/enemy49.o(.rodata);

302
src/enemy/vaatiEyesMacro.c Normal file
View File

@ -0,0 +1,302 @@
#include "global.h"
#include "enemy.h"
#include "audio.h"
#include "random.h"
#include "functions.h"
extern u32 sub_080002E0(u32, u32);
extern s16 gUnk_080B4488[];
void sub_0802EC98(Entity*);
void sub_0802ECC0(Entity*);
void sub_0802ED74(Entity*);
void sub_0802EE20(Entity*);
void sub_0802EEB8(Entity*);
void sub_0802EF1C(Entity*);
void sub_0802ED8C(Entity*);
void sub_0802EE10(Entity*);
void sub_0802EE38(Entity*);
void sub_0802EE8C(Entity*);
void sub_0802EF90(Entity*);
void sub_0802EFB8(Entity*);
void sub_0802EF58(Entity*);
void sub_0802F04C(Entity*);
void (*const gUnk_080CDE34[])(Entity*) = {
sub_0802EC98, sub_0802ECC0, sub_08001324, sub_0804A7D4, sub_08001242, sub_0802EC98,
};
void (*const gUnk_080CDE4C[])(Entity*) = {
sub_0802ED74,
sub_0802EE20,
sub_0802EEB8,
sub_0802EF1C,
};
void (*const gUnk_080CDE5C[])(Entity*) = {
sub_0802ED8C,
sub_0802EE10,
};
void (*const gUnk_080CDE64[])(Entity*) = {
sub_0802EE38,
sub_0802EE8C,
};
const u8 gUnk_080CDE6C[] = { 0, 8, 0x18, 0 };
const u8 gUnk_080CDE70[] = {
9, 9, 8, 9, 8, 8, 8, 7, 7, 7, 6, 7, 6, 6, 6, 5, 5, 5, 12, 5, 12, 12, 12, 11, 11, 11, 10, 11, 10, 10, 10, 9,
};
const s8 gUnk_080CDE90[] = { -2, -3, -4, -5, -6, -5, -4, -3 };
const u16 gUnk_080CDE98[] = { 0xc0, 0x100, 0x140, 0x180 };
extern u8 gEntCount;
void VaatiEyesMacro(Entity* this) {
gUnk_080CDE34[GetNextFunction(this)](this);
SetChildOffset(this, 0, 1, -0x10);
}
void sub_0802EC98(Entity* this) {
gUnk_080CDE4C[this->type](this);
if (this->type < 2) {
sub_0802EF90(this);
}
}
void sub_0802ECC0(Entity* this) {
if (this->type == 0) {
if (this->currentHealth == 0) {
gScreenTransition.field_0x39 &= ~(1 << (gScreenTransition.field_0x3c + 2));
}
if (gRoomControls.roomID == 0) {
gScreenTransition.field_0x3a = this->currentHealth;
} else {
gScreenTransition.field_0x3b = this->currentHealth;
}
if (this->field_0x78.HALF.HI != this->currentHealth) {
EnqueueSFX(SFX_17A);
}
this->field_0x78.HALF.HI = this->currentHealth;
} else {
if (this->type == 1) {
if (0 < this->iframes) {
this->iframes *= -1;
}
if (this->currentHealth != 0xff) {
EnqueueSFX(SFX_BUTTON_DEPRESS);
}
this->currentHealth = 0xff;
}
}
if (this->field_0x43 != 0) {
sub_0804A9FC(this, 0x1c);
}
sub_0804AA30(this, gUnk_080CDE34);
}
void sub_0802ED74(Entity* this) {
gUnk_080CDE5C[this->action](this);
}
void sub_0802ED8C(Entity* this) {
Manager* manager;
Entity* enemy;
if ((gEntCount < 0x47) && (manager = GetEmptyManager(), manager != NULL)) {
manager->type = 9;
manager->subtype = 0x34;
manager->parent = (Manager*)this;
AppendEntityToList((Entity*)manager, 8);
enemy = CreateEnemy(VAATI_EYES_MACRO, 2);
enemy->parent = this;
this->action = 1;
if (gRoomControls.roomID == 0) {
this->field_0x78.HALF.HI = this->currentHealth = gScreenTransition.field_0x3a;
} else {
this->field_0x78.HALF.HI = this->currentHealth = gScreenTransition.field_0x3b;
}
this->field_0x78.HALF.LO = Random();
sub_0802EFB8(this);
InitializeAnimation(this, 0);
sub_0802EF58(this);
}
}
void sub_0802EE10(Entity* this) {
sub_0802F04C(this);
GetNextFrame(this);
}
void sub_0802EE20(Entity* this) {
gUnk_080CDE64[this->action](this);
}
void sub_0802EE38(Entity* this) {
Entity* entity;
u32 rand;
if (gEntCount < 0x47) {
entity = CreateEnemy(VAATI_EYES_MACRO, 3);
entity->parent = this;
this->action = 1;
rand = Random();
this->actionDelay = (rand & 3) + 1;
this->field_0x78.HALF.LO = Random() >> 8;
this->direction = gUnk_080CDE6C[rand >> 0x10 & 3];
InitializeAnimation(this, 1);
}
}
void sub_0802EE8C(Entity* this) {
if (this->parent->next == NULL) {
this->flags &= 0x7f;
this->currentHealth = 0;
} else {
sub_0802F04C(this);
GetNextFrame(this);
}
}
typedef struct xy {
u8 x;
u8 y;
} xy;
void sub_0802EEB8(Entity* this) {
u32 uVar2;
xy* temp;
if (this->parent->next == NULL) {
DeleteThisEntity();
}
if (this->action == 0) {
this->action = 1;
this->animationState = 0xff;
}
CopyPositionAndSpriteOffset(this->parent, this);
uVar2 = (GetFacingDirection(this, &gPlayerEntity) + 1) & 0x1e;
temp = (xy*)&gUnk_080CDE70[uVar2];
if (temp->x != this->frameIndex) {
if (temp->y != this->frameIndex) {
this->frameIndex = temp->x;
}
}
this->y.HALF.HI++;
this->spriteOffsetY -= 1;
}
void sub_0802EF1C(Entity* this) {
if (this->parent->next == NULL) {
DeleteThisEntity();
}
if (this->action == 0) {
this->action = 1;
this->frameIndex = 0x11;
this->spritePriority.b0 = 6;
}
CopyPositionAndSpriteOffset(this->parent, this);
this->height.HALF.HI = 0;
}
void sub_0802EF58(Entity* this) {
Entity* entity;
u32 i;
for (i = 0; i < 7; i++) {
entity = CreateEnemy(VAATI_EYES_MACRO, 1);
if (entity != NULL) {
entity->type2 = i;
entity->collisionLayer = 1;
entity->parent = this;
UpdateSpriteForCollisionLayer(entity);
CopyPosition(this, entity);
}
}
}
void sub_0802EF90(Entity* this) {
this->height.HALF.HI = gUnk_080CDE90[this->field_0x78.HALF.LO++ >> 3 & 7];
}
void sub_0802EFB8(Entity* this) {
u32 uVar1;
u32 rand;
u32 uVar3;
int iVar4;
rand = Random();
if ((rand >> 0x10 & 3) != 0) {
uVar1 = rand & 0x18;
} else {
uVar3 = GetFacingDirection(&gPlayerEntity, this);
uVar1 = (uVar3 + 4) & 0x18;
}
iVar4 = sub_080002E0(TILE(this->x.HALF.HI, this->y.HALF.HI) + gUnk_080B4488[((uVar1) >> 3)], 1);
if (iVar4 != 0) {
this->direction = 0xff;
} else {
this->actionDelay = (rand & 3) + 1;
this->direction = (uVar1 & 0x18);
this->speed = gUnk_080CDE98[rand >> 0x18 & 3];
}
}
void sub_0802F04C(Entity* this) {
s32 oldX;
s32 oldY;
oldX = this->x.HALF.HI;
oldY = this->y.HALF.HI;
if (ProcessMovement(this) == 0) {
sub_0802EFB8(this);
return;
}
switch (this->direction >> 3) {
case 0:
if (((oldY & 0xf) > 8) && ((this->y.HALF.HI & 0xf) < 9)) {
this->actionDelay--;
oldY = (this->y.HALF.HI & 0xfff0) + 8;
}
if (this->actionDelay == 0) {
this->x.HALF.HI = oldX;
this->y.HALF.HI = oldY;
} else {
return;
}
break;
case 1:
if (((oldX & 0xf) < 8) && ((this->x.HALF.HI & 0xf) >= 8)) {
this->actionDelay--;
oldX = (this->x.HALF.HI & 0xfff0) + 8;
}
if (this->actionDelay == 0) {
this->x.HALF.HI = oldX;
this->y.HALF.HI = oldY;
} else {
return;
}
break;
case 2:
if (((oldY & 0xf) < 8) && ((this->y.HALF.HI & 0xf) >= 8)) {
this->actionDelay--;
oldY = (this->y.HALF.HI & 0xfff0) + 8;
}
if (this->actionDelay == 0) {
this->x.HALF.HI = oldX;
this->y.HALF.HI = oldY;
} else {
return;
}
break;
default:
if (((oldX & 0xf) >= 9) && ((this->x.HALF.HI & 0xf) < 9)) {
this->actionDelay--;
oldX = (this->x.HALF.HI & 0xfff0) + 8;
}
if (this->actionDelay == 0) {
this->x.HALF.HI = oldX;
this->y.HALF.HI = oldY;
} else {
return;
}
break;
}
sub_0802EFB8(this);
}