mirror of https://github.com/zeldaret/tmc.git
Decompile FourElements
This commit is contained in:
parent
3fddf8f070
commit
bc4d9b6076
|
@ -1,370 +0,0 @@
|
|||
.include "asm/macros.inc"
|
||||
|
||||
.include "constants/constants.inc"
|
||||
|
||||
.syntax unified
|
||||
|
||||
.text
|
||||
|
||||
|
||||
thumb_func_start FourElements
|
||||
FourElements: @ 0x080A01C0
|
||||
push {r4, lr}
|
||||
adds r4, r0, #0
|
||||
ldr r1, _080A01DC @ =gUnk_08124898
|
||||
ldrb r0, [r4, #0xc]
|
||||
lsls r0, r0, #2
|
||||
adds r0, r0, r1
|
||||
ldr r1, [r0]
|
||||
adds r0, r4, #0
|
||||
bl _call_via_r1
|
||||
adds r0, r4, #0
|
||||
bl sub_08080CB4
|
||||
pop {r4, pc}
|
||||
.align 2, 0
|
||||
_080A01DC: .4byte gUnk_08124898
|
||||
|
||||
thumb_func_start sub_080A01E0
|
||||
sub_080A01E0: @ 0x080A01E0
|
||||
push {r4, lr}
|
||||
adds r4, r0, #0
|
||||
movs r2, #1
|
||||
movs r3, #1
|
||||
strb r3, [r4, #0xc]
|
||||
ldrb r1, [r4, #0x18]
|
||||
movs r0, #4
|
||||
rsbs r0, r0, #0
|
||||
ands r0, r1
|
||||
orrs r0, r2
|
||||
strb r0, [r4, #0x18]
|
||||
adds r2, r4, #0
|
||||
adds r2, #0x29
|
||||
ldrb r1, [r2]
|
||||
movs r0, #0x39
|
||||
rsbs r0, r0, #0
|
||||
ands r0, r1
|
||||
movs r1, #0x10
|
||||
orrs r0, r1
|
||||
strb r0, [r2]
|
||||
ldrb r1, [r4, #0x19]
|
||||
movs r0, #0x3f
|
||||
ands r0, r1
|
||||
movs r1, #0x40
|
||||
orrs r0, r1
|
||||
strb r0, [r4, #0x19]
|
||||
ldr r0, _080A027C @ =gHitbox_6
|
||||
str r0, [r4, #0x48]
|
||||
ldr r0, _080A0280 @ =0x0000FF40
|
||||
strh r0, [r4, #0x36]
|
||||
adds r1, r4, #0
|
||||
adds r1, #0x6a
|
||||
movs r0, #0x40
|
||||
strb r0, [r1]
|
||||
ldrb r0, [r4, #0xa]
|
||||
cmp r0, #0x43
|
||||
bgt _080A0246
|
||||
cmp r0, #0x42
|
||||
bge _080A0246
|
||||
cmp r0, #0x40
|
||||
beq _080A0246
|
||||
cmp r0, #0x41
|
||||
bne _080A0246
|
||||
ldr r2, _080A0284 @ =gScreen
|
||||
ldrh r1, [r2]
|
||||
ldr r0, _080A0288 @ =0x0000FDFF
|
||||
ands r0, r1
|
||||
strh r0, [r2]
|
||||
adds r0, r4, #0
|
||||
adds r0, #0x38
|
||||
strb r3, [r0]
|
||||
_080A0246:
|
||||
ldr r0, _080A028C @ =script_PlayerGetElement
|
||||
bl StartPlayerScript
|
||||
ldr r1, _080A0284 @ =gScreen
|
||||
adds r2, r1, #0
|
||||
adds r2, #0x66
|
||||
movs r0, #0xc8
|
||||
lsls r0, r0, #3
|
||||
strh r0, [r2]
|
||||
adds r1, #0x68
|
||||
movs r0, #0x80
|
||||
lsls r0, r0, #5
|
||||
strh r0, [r1]
|
||||
bl sub_0805BC4C
|
||||
ldrb r2, [r4, #0xa]
|
||||
subs r2, #0x40
|
||||
adds r0, r4, #0
|
||||
movs r1, #0xad
|
||||
movs r3, #0
|
||||
bl CreateObjectWithParent
|
||||
cmp r0, #0
|
||||
beq _080A027A
|
||||
str r4, [r0, #0x50]
|
||||
str r0, [r4, #0x54]
|
||||
_080A027A:
|
||||
pop {r4, pc}
|
||||
.align 2, 0
|
||||
_080A027C: .4byte gHitbox_6
|
||||
_080A0280: .4byte 0x0000FF40
|
||||
_080A0284: .4byte gScreen
|
||||
_080A0288: .4byte 0x0000FDFF
|
||||
_080A028C: .4byte script_PlayerGetElement
|
||||
|
||||
thumb_func_start sub_080A0290
|
||||
sub_080A0290: @ 0x080A0290
|
||||
push {r4, r5, lr}
|
||||
adds r4, r0, #0
|
||||
ldr r5, _080A02BC @ =gActiveScriptInfo
|
||||
ldr r0, [r5]
|
||||
movs r1, #4
|
||||
ands r0, r1
|
||||
cmp r0, #0
|
||||
beq _080A02CA
|
||||
adds r0, r4, #0
|
||||
bl sub_080A0424
|
||||
ldrh r2, [r4, #0x36]
|
||||
movs r0, #0x36
|
||||
ldrsh r1, [r4, r0]
|
||||
movs r0, #8
|
||||
rsbs r0, r0, #0
|
||||
cmp r1, r0
|
||||
bge _080A02C0
|
||||
adds r0, r2, #1
|
||||
strh r0, [r4, #0x36]
|
||||
b _080A02CA
|
||||
.align 2, 0
|
||||
_080A02BC: .4byte gActiveScriptInfo
|
||||
_080A02C0:
|
||||
movs r1, #2
|
||||
strb r1, [r4, #0xc]
|
||||
ldr r0, [r5]
|
||||
orrs r0, r1
|
||||
str r0, [r5]
|
||||
_080A02CA:
|
||||
pop {r4, r5, pc}
|
||||
|
||||
thumb_func_start sub_080A02CC
|
||||
sub_080A02CC: @ 0x080A02CC
|
||||
push {r4, lr}
|
||||
adds r4, r0, #0
|
||||
bl sub_080A0424
|
||||
adds r0, r4, #0
|
||||
bl sub_080A0444
|
||||
adds r0, r4, #0
|
||||
bl IsCollidingPlayer
|
||||
cmp r0, #0
|
||||
beq _080A0342
|
||||
ldr r0, [r4, #0x54]
|
||||
bl DeleteEntity
|
||||
ldrb r1, [r4, #0x18]
|
||||
movs r0, #4
|
||||
rsbs r0, r0, #0
|
||||
ands r0, r1
|
||||
strb r0, [r4, #0x18]
|
||||
movs r2, #0
|
||||
movs r0, #3
|
||||
strb r0, [r4, #0xc]
|
||||
movs r0, #0x2d
|
||||
strb r0, [r4, #0xe]
|
||||
ldr r0, _080A0344 @ =gScreen
|
||||
adds r3, r0, #0
|
||||
adds r3, #0x66
|
||||
movs r1, #0xc8
|
||||
lsls r1, r1, #3
|
||||
strh r1, [r3]
|
||||
adds r0, #0x68
|
||||
strh r2, [r0]
|
||||
ldrb r0, [r4, #0xa]
|
||||
movs r1, #0
|
||||
movs r2, #1
|
||||
bl sub_080A7C18
|
||||
adds r0, r4, #0
|
||||
movs r1, #1
|
||||
bl sub_0808C650
|
||||
movs r0, #6
|
||||
movs r1, #2
|
||||
bl SetFade
|
||||
movs r0, #0xf8
|
||||
bl SoundReq
|
||||
movs r0, #0xa4
|
||||
lsls r0, r0, #1
|
||||
bl SoundReq
|
||||
movs r0, #5
|
||||
bl SoundReq
|
||||
ldr r0, _080A0348 @ =0x80110000
|
||||
bl SoundReq
|
||||
_080A0342:
|
||||
pop {r4, pc}
|
||||
.align 2, 0
|
||||
_080A0344: .4byte gScreen
|
||||
_080A0348: .4byte 0x80110000
|
||||
|
||||
thumb_func_start sub_080A034C
|
||||
sub_080A034C: @ 0x080A034C
|
||||
push {r4, lr}
|
||||
adds r4, r0, #0
|
||||
ldrb r0, [r4, #0xe]
|
||||
cmp r0, #0
|
||||
beq _080A0378
|
||||
adds r0, r4, #0
|
||||
bl sub_080A0424
|
||||
ldrb r0, [r4, #0xe]
|
||||
subs r0, #1
|
||||
strb r0, [r4, #0xe]
|
||||
lsls r0, r0, #0x18
|
||||
cmp r0, #0
|
||||
bne _080A038C
|
||||
ldr r0, _080A0374 @ =gPlayerEntity
|
||||
movs r1, #0
|
||||
bl SetDefaultPriority
|
||||
b _080A038C
|
||||
.align 2, 0
|
||||
_080A0374: .4byte gPlayerEntity
|
||||
_080A0378:
|
||||
movs r0, #0
|
||||
movs r1, #0x3c
|
||||
bl RequestPriorityDuration
|
||||
bl sub_0808C67C
|
||||
cmp r0, #0
|
||||
beq _080A038C
|
||||
movs r0, #4
|
||||
strb r0, [r4, #0xc]
|
||||
_080A038C:
|
||||
pop {r4, pc}
|
||||
.align 2, 0
|
||||
|
||||
thumb_func_start sub_080A0390
|
||||
sub_080A0390: @ 0x080A0390
|
||||
push {r4, lr}
|
||||
adds r4, r0, #0
|
||||
movs r0, #0
|
||||
movs r1, #0x3c
|
||||
bl RequestPriorityDuration
|
||||
ldr r0, _080A03B4 @ =gFadeControl
|
||||
ldrb r0, [r0]
|
||||
cmp r0, #0
|
||||
bne _080A03B2
|
||||
movs r0, #5
|
||||
strb r0, [r4, #0xc]
|
||||
adds r1, r4, #0
|
||||
adds r1, #0x68
|
||||
movs r0, #0xd2
|
||||
lsls r0, r0, #1
|
||||
strh r0, [r1]
|
||||
_080A03B2:
|
||||
pop {r4, pc}
|
||||
.align 2, 0
|
||||
_080A03B4: .4byte gFadeControl
|
||||
|
||||
thumb_func_start sub_080A03B8
|
||||
sub_080A03B8: @ 0x080A03B8
|
||||
push {r4, lr}
|
||||
adds r4, r0, #0
|
||||
movs r0, #0
|
||||
movs r1, #0xa
|
||||
bl RequestPriorityDuration
|
||||
adds r1, r4, #0
|
||||
adds r1, #0x68
|
||||
ldrh r0, [r1]
|
||||
subs r0, #1
|
||||
strh r0, [r1]
|
||||
lsls r0, r0, #0x10
|
||||
cmp r0, #0
|
||||
bne _080A03E4
|
||||
movs r0, #6
|
||||
strb r0, [r4, #0xc]
|
||||
ldrb r0, [r4, #0xa]
|
||||
bl sub_0805429C
|
||||
adds r1, r4, #0
|
||||
bl MessageNoOverlap
|
||||
_080A03E4:
|
||||
pop {r4, pc}
|
||||
.align 2, 0
|
||||
|
||||
thumb_func_start sub_080A03E8
|
||||
sub_080A03E8: @ 0x080A03E8
|
||||
push {lr}
|
||||
movs r0, #0
|
||||
movs r1, #0xa
|
||||
bl RequestPriorityDuration
|
||||
ldr r0, _080A041C @ =gMessage
|
||||
ldrb r1, [r0]
|
||||
movs r0, #0x7f
|
||||
ands r0, r1
|
||||
cmp r0, #0
|
||||
bne _080A041A
|
||||
movs r0, #0x5a
|
||||
bl SetPriorityTimer
|
||||
ldr r0, _080A0420 @ =gPlayerState
|
||||
adds r0, #0x8b
|
||||
movs r1, #1
|
||||
strb r1, [r0]
|
||||
bl sub_0807DF50
|
||||
movs r0, #0
|
||||
bl SetRoomFlag
|
||||
bl DeleteThisEntity
|
||||
_080A041A:
|
||||
pop {pc}
|
||||
.align 2, 0
|
||||
_080A041C: .4byte gMessage
|
||||
_080A0420: .4byte gPlayerState
|
||||
|
||||
thumb_func_start sub_080A0424
|
||||
sub_080A0424: @ 0x080A0424
|
||||
push {lr}
|
||||
adds r1, r0, #0
|
||||
adds r1, #0x6a
|
||||
ldrb r0, [r1]
|
||||
subs r0, #1
|
||||
strb r0, [r1]
|
||||
lsls r0, r0, #0x18
|
||||
cmp r0, #0
|
||||
bne _080A0442
|
||||
movs r0, #0x40
|
||||
strb r0, [r1]
|
||||
movs r0, #0xbc
|
||||
lsls r0, r0, #1
|
||||
bl SoundReq
|
||||
_080A0442:
|
||||
pop {pc}
|
||||
|
||||
thumb_func_start sub_080A0444
|
||||
sub_080A0444: @ 0x080A0444
|
||||
ldr r3, _080A0460 @ =gUnk_081248B4
|
||||
ldrb r1, [r0, #0xf]
|
||||
adds r2, r1, #1
|
||||
strb r2, [r0, #0xf]
|
||||
lsls r1, r1, #0x18
|
||||
lsrs r1, r1, #0x1b
|
||||
movs r2, #7
|
||||
ands r1, r2
|
||||
adds r1, r1, r3
|
||||
ldrb r1, [r1]
|
||||
lsls r1, r1, #0x18
|
||||
asrs r1, r1, #0x18
|
||||
strh r1, [r0, #0x36]
|
||||
bx lr
|
||||
.align 2, 0
|
||||
_080A0460: .4byte gUnk_081248B4
|
||||
|
||||
thumb_func_start sub_080A0464
|
||||
sub_080A0464: @ 0x080A0464
|
||||
push {r4, r5, lr}
|
||||
adds r4, r0, #0
|
||||
adds r5, r1, #0
|
||||
movs r0, #6
|
||||
movs r1, #0xac
|
||||
movs r2, #6
|
||||
bl FindEntityByID
|
||||
cmp r0, #0
|
||||
beq _080A048A
|
||||
movs r1, #0x2e
|
||||
ldrsh r2, [r0, r1]
|
||||
movs r1, #0x32
|
||||
ldrsh r3, [r0, r1]
|
||||
adds r3, #0x18
|
||||
adds r0, r4, #0
|
||||
adds r1, r5, #0
|
||||
bl sub_0807DEDC
|
||||
_080A048A:
|
||||
pop {r4, r5, pc}
|
|
@ -45362,11 +45362,6 @@
|
|||
"size": 24,
|
||||
"type": "animation"
|
||||
},
|
||||
{
|
||||
"path": "fourElements/gUnk_081248B4.bin",
|
||||
"start": 1198260,
|
||||
"size": 8
|
||||
},
|
||||
{
|
||||
"path": "animations/gSpriteAnimations_ObjectAF_0.bin",
|
||||
"start": 1198288,
|
||||
|
|
|
@ -1,17 +0,0 @@
|
|||
.include "asm/macros.inc"
|
||||
.include "constants/constants.inc"
|
||||
|
||||
.section .rodata
|
||||
.align 2
|
||||
|
||||
gUnk_08124898:: @ 08124898
|
||||
.4byte sub_080A01E0
|
||||
.4byte sub_080A0290
|
||||
.4byte sub_080A02CC
|
||||
.4byte sub_080A034C
|
||||
.4byte sub_080A0390
|
||||
.4byte sub_080A03B8
|
||||
.4byte sub_080A03E8
|
||||
|
||||
gUnk_081248B4:: @ 081248B4
|
||||
.incbin "fourElements/gUnk_081248B4.bin"
|
|
@ -398,7 +398,7 @@ void ObjectA8();
|
|||
void ObjectA9(Entity*);
|
||||
void WaterfallOpening(Entity*);
|
||||
void ObjectAB(Entity*);
|
||||
void FourElements(Entity*);
|
||||
void FourElements();
|
||||
void ObjectAD(Entity*);
|
||||
void FloatingBlock(Entity*);
|
||||
void ObjectAF(Entity*);
|
||||
|
|
|
@ -819,7 +819,7 @@ SECTIONS {
|
|||
asm/object/objectA9.o(.text);
|
||||
asm/object/waterfallOpening.o(.text);
|
||||
asm/object/objectAB.o(.text);
|
||||
asm/object/fourElements.o(.text);
|
||||
src/object/fourElements.o(.text);
|
||||
asm/object/objectAD.o(.text);
|
||||
src/object/floatingBlock.o(.text);
|
||||
src/object/objectAF.o(.text);
|
||||
|
@ -1574,7 +1574,7 @@ SECTIONS {
|
|||
data/const/object/waterfallOpening.o(.rodata);
|
||||
data/const/object/objectAB.o(.rodata);
|
||||
data/animations/object/objectAB.o(.rodata);
|
||||
data/const/object/fourElements.o(.rodata);
|
||||
src/object/fourElements.o(.rodata);
|
||||
data/const/object/objectAD.o(.rodata);
|
||||
data/const/object/objectAF.o(.rodata);
|
||||
data/animations/object/objectAF.o(.rodata);
|
||||
|
|
|
@ -0,0 +1,170 @@
|
|||
/**
|
||||
* @file fourElements.c
|
||||
* @ingroup Objects
|
||||
*
|
||||
* @brief Four Elements object
|
||||
*/
|
||||
|
||||
#define NENT_DEPRECATED
|
||||
#include "global.h"
|
||||
#include "object.h"
|
||||
#include "functions.h"
|
||||
#include "hitbox.h"
|
||||
#include "screen.h"
|
||||
#include "message.h"
|
||||
|
||||
typedef struct {
|
||||
/*0x00*/ Entity base;
|
||||
/*0x68*/ u16 unk_68;
|
||||
/*0x6a*/ u8 unk_6a;
|
||||
} FourElementsEntity;
|
||||
|
||||
extern u32 sub_0805429C(u32);
|
||||
extern void sub_0807DF50(void);
|
||||
|
||||
extern u16 script_PlayerGetElement[];
|
||||
|
||||
void FourElements_Init(FourElementsEntity*);
|
||||
void FourElements_Action1(FourElementsEntity*);
|
||||
void FourElements_Action2(FourElementsEntity*);
|
||||
void FourElements_Action3(FourElementsEntity*);
|
||||
void FourElements_Action4(FourElementsEntity*);
|
||||
void FourElements_Action5(FourElementsEntity*);
|
||||
void FourElements_Action6(FourElementsEntity*);
|
||||
void sub_080A0424(FourElementsEntity*);
|
||||
void sub_080A0444(FourElementsEntity*);
|
||||
|
||||
void FourElements(FourElementsEntity* this) {
|
||||
static void (*const FourElements_Actions[])(FourElementsEntity*) = {
|
||||
FourElements_Init, FourElements_Action1, FourElements_Action2, FourElements_Action3,
|
||||
FourElements_Action4, FourElements_Action5, FourElements_Action6,
|
||||
};
|
||||
FourElements_Actions[super->action](this);
|
||||
sub_08080CB4(super);
|
||||
}
|
||||
|
||||
void FourElements_Init(FourElementsEntity* this) {
|
||||
Entity* objectAD;
|
||||
super->action = 1;
|
||||
super->spriteSettings.draw = 1;
|
||||
super->spritePriority.b1 = 2;
|
||||
super->spriteRendering.b3 = 1;
|
||||
super->hitbox = (Hitbox*)&gHitbox_6;
|
||||
super->z.HALF.HI = 0xff40;
|
||||
this->unk_6a = 0x40;
|
||||
switch (super->type) {
|
||||
case 0x41:
|
||||
gScreen.lcd.displayControl &= 0xfdff;
|
||||
super->collisionLayer = 1;
|
||||
break;
|
||||
case 0x40:
|
||||
case 0x42:
|
||||
case 0x43:
|
||||
break;
|
||||
}
|
||||
StartPlayerScript(script_PlayerGetElement);
|
||||
gScreen.controls.layerFXControl = 0x640;
|
||||
gScreen.controls.alphaBlend = 0x1000;
|
||||
sub_0805BC4C();
|
||||
objectAD = CreateObjectWithParent(super, OBJECT_AD, super->type - 0x40, 0);
|
||||
if (objectAD != NULL) {
|
||||
objectAD->parent = super;
|
||||
super->child = objectAD;
|
||||
}
|
||||
}
|
||||
|
||||
void FourElements_Action1(FourElementsEntity* this) {
|
||||
if ((gActiveScriptInfo.syncFlags & 4) != 0) {
|
||||
sub_080A0424(this);
|
||||
if (super->z.HALF.HI < -8) {
|
||||
super->z.HALF.HI++;
|
||||
} else {
|
||||
super->action = 2;
|
||||
gActiveScriptInfo.syncFlags |= 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void FourElements_Action2(FourElementsEntity* this) {
|
||||
sub_080A0424(this);
|
||||
sub_080A0444(this);
|
||||
if (IsCollidingPlayer(super)) {
|
||||
DeleteEntity(super->child);
|
||||
super->spriteSettings.draw = 0;
|
||||
super->action = 3;
|
||||
super->actionDelay = 0x2d;
|
||||
gScreen.controls.layerFXControl = 0x640;
|
||||
gScreen.controls.alphaBlend = 0;
|
||||
sub_080A7C18(super->type, 0, 1);
|
||||
sub_0808C650(super, 1);
|
||||
SetFade(6, 2);
|
||||
SoundReq(SFX_F8);
|
||||
SoundReq(SFX_148);
|
||||
SoundReq(BGM_ELEMENT_GET);
|
||||
SoundReq(SONG_BGM_0);
|
||||
}
|
||||
}
|
||||
|
||||
void FourElements_Action3(FourElementsEntity* this) {
|
||||
if (super->actionDelay != 0) {
|
||||
sub_080A0424(this);
|
||||
if (--super->actionDelay == 0) {
|
||||
SetDefaultPriority(&gPlayerEntity, 0);
|
||||
}
|
||||
} else {
|
||||
RequestPriorityDuration(NULL, 0x3c);
|
||||
if (sub_0808C67C()) {
|
||||
super->action = 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void FourElements_Action4(FourElementsEntity* this) {
|
||||
RequestPriorityDuration(NULL, 0x3c);
|
||||
if (gFadeControl.active == 0) {
|
||||
super->action = 5;
|
||||
this->unk_68 = 0x1a4;
|
||||
}
|
||||
}
|
||||
|
||||
void FourElements_Action5(FourElementsEntity* this) {
|
||||
u32 index;
|
||||
RequestPriorityDuration(NULL, 10);
|
||||
if (--this->unk_68 == 0) {
|
||||
super->action = 6;
|
||||
index = sub_0805429C(super->type);
|
||||
MessageNoOverlap(index, super);
|
||||
}
|
||||
}
|
||||
|
||||
void FourElements_Action6(FourElementsEntity* this) {
|
||||
RequestPriorityDuration(NULL, 10);
|
||||
if ((gMessage.doTextBox & 0x7f) == 0) {
|
||||
SetPriorityTimer(0x5a);
|
||||
gPlayerState.controlMode = 1;
|
||||
sub_0807DF50();
|
||||
SetRoomFlag(0);
|
||||
DeleteThisEntity();
|
||||
}
|
||||
}
|
||||
|
||||
void sub_080A0424(FourElementsEntity* this) {
|
||||
if (--this->unk_6a == 0) {
|
||||
this->unk_6a = 0x40;
|
||||
SoundReq(SFX_178);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_080A0444(FourElementsEntity* this) {
|
||||
static const u8 gUnk_081248B4[] = {
|
||||
249, 248, 247, 246, 245, 246, 247, 248,
|
||||
};
|
||||
super->z.HALF.HI = gUnk_081248B4[(super->field_0xf++ >> 3) & 7] << 0x18 >> 0x18;
|
||||
}
|
||||
|
||||
void sub_080A0464(FourElementsEntity* this, ScriptExecutionContext* context) {
|
||||
Entity* element = FindEntityByID(6, FOUR_ELEMENTS, 6);
|
||||
if (element != NULL) {
|
||||
sub_0807DEDC(super, context, element->x.HALF.HI, element->y.HALF.HI + 0x18);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue