Decompile the rest of rem

This commit is contained in:
Tal Hayon 2022-03-05 01:00:53 +02:00
parent 6206ff831a
commit a9479d5cf2
6 changed files with 180 additions and 485 deletions

View File

@ -1,235 +0,0 @@
.syntax unified
push {r4, lr}
sub sp, #8
adds r4, r0, #0
ldr r1, _0806A694 @ =gUnk_08112294
mov r0, sp
movs r2, #8
bl memcpy
ldrb r3, [r4, #0xc]
cmp r3, #1
beq _0806A6BE
cmp r3, #1
bgt _0806A698
cmp r3, #0
beq _0806A6A0
b _0806A82A
.align 2, 0
_0806A694: .4byte gUnk_08112294
_0806A698:
cmp r3, #2
bne _0806A69E
b _0806A824
_0806A69E:
b _0806A82A
_0806A6A0:
movs r0, #1
strb r0, [r4, #0xc]
adds r2, r4, #0
adds r2, #0x29
ldrb r1, [r2]
subs r0, #9
ands r0, r1
movs r1, #6
orrs r0, r1
strb r0, [r2]
adds r0, r4, #0
movs r1, #0x13
bl InitializeAnimation
b _0806A82A
_0806A6BE:
ldr r0, _0806A6E0 @ =gActiveScriptInfo
ldr r0, [r0]
movs r1, #0x80
lsls r1, r1, #1
ands r0, r1
cmp r0, #0
beq _0806A6E4
movs r0, #0
movs r1, #2
strb r1, [r4, #0xc]
adds r1, r4, #0
adds r1, #0x63
strb r0, [r1]
subs r1, #1
strb r0, [r1]
b _0806A82A
.align 2, 0
_0806A6E0: .4byte gActiveScriptInfo
_0806A6E4:
ldr r0, [r4, #0x50]
adds r0, #0x58
ldrb r0, [r0]
cmp r0, #9
bne _0806A7C8
adds r2, r4, #0
adds r2, #0x29
ldrb r0, [r2]
movs r1, #8
rsbs r1, r1, #0
ands r1, r0
movs r0, #3
orrs r1, r0
strb r1, [r2]
ldrb r2, [r4, #0xe]
cmp r2, #0
bne _0806A724
bl Random
adds r2, r0, #0
movs r1, #7
ands r0, r1
strb r0, [r4, #0xe]
lsrs r0, r2, #8
movs r1, #7
ands r0, r1
add r0, sp
ldrb r1, [r0]
adds r0, r4, #0
adds r0, #0x68
strb r1, [r0]
b _0806A75A
_0806A724:
ldr r0, _0806A780 @ =gRoomTransition
ldr r0, [r0]
movs r1, #3
ands r0, r1
cmp r0, #0
bne _0806A75A
subs r0, r2, #1
strb r0, [r4, #0xe]
adds r2, r4, #0
adds r2, #0x62
movs r0, #0
ldrsb r0, [r2, r0]
adds r1, r4, #0
adds r1, #0x68
cmp r0, #0
bgt _0806A746
strb r3, [r1]
_0806A746:
movs r0, #0
ldrsb r0, [r2, r0]
cmp r0, #0xf
ble _0806A752
movs r0, #0xff
strb r0, [r1]
_0806A752:
ldrb r0, [r1]
ldrb r1, [r2]
adds r0, r0, r1
strb r0, [r2]
_0806A75A:
ldrb r2, [r4, #0xf]
cmp r2, #0
bne _0806A784
bl Random
adds r2, r0, #0
movs r1, #7
ands r0, r1
strb r0, [r4, #0xf]
lsrs r0, r2, #8
movs r1, #7
ands r0, r1
add r0, sp
ldrb r1, [r0]
adds r0, r4, #0
adds r0, #0x69
strb r1, [r0]
b _0806A82A
.align 2, 0
_0806A780: .4byte gRoomTransition
_0806A784:
ldr r0, _0806A7C4 @ =gRoomTransition
ldr r0, [r0]
lsrs r0, r0, #4
movs r1, #3
ands r0, r1
cmp r0, #0
bne _0806A82A
subs r0, r2, #1
strb r0, [r4, #0xf]
adds r3, r4, #0
adds r3, #0x63
movs r0, #0
ldrsb r0, [r3, r0]
adds r2, r4, #0
adds r2, #0x69
cmp r0, #0
blt _0806A7AA
movs r0, #0xff
strb r0, [r2]
_0806A7AA:
movs r1, #0
ldrsb r1, [r3, r1]
movs r0, #8
rsbs r0, r0, #0
cmp r1, r0
bgt _0806A7BA
movs r0, #1
strb r0, [r2]
_0806A7BA:
ldrb r0, [r2]
ldrb r1, [r3]
adds r0, r0, r1
strb r0, [r3]
b _0806A82A
.align 2, 0
_0806A7C4: .4byte gRoomTransition
_0806A7C8:
adds r2, r4, #0
adds r2, #0x29
ldrb r0, [r2]
movs r1, #8
rsbs r1, r1, #0
ands r1, r0
movs r0, #6
orrs r1, r0
strb r1, [r2]
adds r1, r4, #0
adds r1, #0x62
ldrb r0, [r1]
movs r2, #0
ldrsb r2, [r1, r2]
cmp r2, #0
beq _0806A7FE
cmp r2, #0
ble _0806A7F0
subs r0, #1
strb r0, [r1]
_0806A7F0:
ldrb r2, [r1]
movs r0, #0
ldrsb r0, [r1, r0]
cmp r0, #0
bge _0806A7FE
adds r0, r2, #1
strb r0, [r1]
_0806A7FE:
adds r1, r4, #0
adds r1, #0x63
ldrb r0, [r1]
movs r2, #0
ldrsb r2, [r1, r2]
cmp r2, #0
beq _0806A82A
cmp r2, #0
ble _0806A814
subs r0, #1
strb r0, [r1]
_0806A814:
ldrb r2, [r1]
movs r0, #0
ldrsb r0, [r1, r0]
cmp r0, #0
bge _0806A82A
adds r0, r2, #1
strb r0, [r1]
b _0806A82A
_0806A824:
adds r0, r4, #0
bl GetNextFrame
_0806A82A:
add sp, #8
pop {r4, pc}
.align 2, 0
.syntax divided

View File

@ -1,153 +0,0 @@
.syntax unified
push {r4, r5, r6, r7, lr}
mov r7, r8
push {r7}
adds r6, r0, #0
adds r5, r1, #0
ldrb r0, [r5, #0x18]
cmp r0, #1
beq _0806AB38
cmp r0, #1
bgt _0806AA6A
cmp r0, #0
beq _0806AA70
b _0806AB64
_0806AA6A:
cmp r0, #2
beq _0806AB5C
b _0806AB64
_0806AA70:
str r0, [r5, #0x14]
movs r0, #0x8f
bl CheckLocalFlag
cmp r0, #0
bne _0806AA84
ldr r2, _0806AA80 @ =gUnk_081122A8
b _0806AA9A
.align 2, 0
_0806AA80: .4byte gUnk_081122A8
_0806AA84:
movs r0, #0x15
bl GetInventoryValue
cmp r0, #0
bne _0806AA98
ldr r2, _0806AA94 @ =gUnk_081122B0
b _0806AA9A
.align 2, 0
_0806AA94: .4byte gUnk_081122B0
_0806AA98:
ldr r2, _0806AAD0 @ =gUnk_081122B8
_0806AA9A:
ldr r1, _0806AAD4 @ =gRoomVars
ldr r0, [r1, #0x68]
lsls r0, r0, #1
adds r0, r0, r2
ldrh r7, [r0]
mov r8, r1
mov r4, r8
ldr r0, [r4, #0x68]
adds r0, #1
str r0, [r4, #0x68]
cmp r0, #2
bls _0806AAB6
movs r0, #0
str r0, [r4, #0x68]
_0806AAB6:
adds r0, r7, #0
adds r1, r6, #0
bl MessageNoOverlap
ldr r0, [r5, #4]
cmp r0, #1
beq _0806AAEE
cmp r0, #1
blo _0806AAD8
cmp r0, #2
beq _0806AB02
b _0806AB1C
.align 2, 0
_0806AAD0: .4byte gUnk_081122B8
_0806AAD4: .4byte gRoomVars
_0806AAD8:
adds r0, r4, #0
adds r0, #0xac
str r6, [r0]
adds r0, r6, #0
movs r1, #7
bl PrependEntityToList
movs r0, #0xc0
lsls r0, r0, #9
str r0, [r6, #0x20]
b _0806AB1C
_0806AAEE:
adds r0, r4, #0
adds r0, #0xac
ldr r0, [r0]
movs r1, #7
bl FindNextDuplicateID
adds r1, r0, #0
adds r0, r4, #0
adds r0, #0xb0
b _0806AB14
_0806AB02:
mov r0, r8
adds r0, #0xb0
ldr r0, [r0]
movs r1, #7
bl FindNextDuplicateID
adds r1, r0, #0
mov r0, r8
adds r0, #0xb4
_0806AB14:
str r1, [r0]
movs r0, #0xc0
lsls r0, r0, #9
str r0, [r1, #0x20]
_0806AB1C:
ldr r0, _0806AB34 @ =0x0000441E
cmp r7, r0
bne _0806AB2C
movs r0, #0x8f
bl SetLocalFlag
movs r0, #1
str r0, [r5, #0x14]
_0806AB2C:
movs r0, #1
strb r0, [r5, #0x18]
b _0806AB64
.align 2, 0
_0806AB34: .4byte 0x0000441E
_0806AB38:
ldr r0, _0806AB58 @ =gRoomVars
ldr r1, [r5, #4]
lsls r1, r1, #2
adds r0, #0xac
adds r1, r1, r0
ldr r1, [r1]
movs r2, #0x36
ldrsh r0, [r1, r2]
cmp r0, #0
blt _0806AB64
movs r0, #0xc0
lsls r0, r0, #9
str r0, [r1, #0x20]
movs r0, #2
strb r0, [r5, #0x18]
b _0806AB64
.align 2, 0
_0806AB58: .4byte gRoomVars
_0806AB5C:
movs r1, #0x36
ldrsh r0, [r6, r1]
cmp r0, #0
bge _0806AB6A
_0806AB64:
ldr r1, _0806AB70 @ =gActiveScriptInfo
movs r0, #0
strb r0, [r1, #6]
_0806AB6A:
pop {r3}
mov r8, r3
pop {r4, r5, r6, r7, pc}
.align 2, 0
_0806AB70: .4byte gActiveScriptInfo
.syntax divided

View File

@ -39028,36 +39028,6 @@
"size": 22,
"type": "animation"
},
{
"path": "rem/gUnk_08112294.bin",
"start": 1122964,
"size": 8
},
{
"path": "rem/gUnk_0811229C.bin",
"start": 1122972,
"size": 4
},
{
"path": "rem/gUnk_081122A0.bin",
"start": 1122976,
"size": 8
},
{
"path": "rem/gUnk_081122A8.bin",
"start": 1122984,
"size": 8
},
{
"path": "rem/gUnk_081122B0.bin",
"start": 1122992,
"size": 8
},
{
"path": "rem/gUnk_081122B8.bin",
"start": 1123000,
"size": 8
},
{
"path": "animations/gSpriteAnimations_TownMinish_0.bin",
"start": 1125480,

View File

@ -1,40 +0,0 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.section .rodata
.align 2
gUnk_08112260:: @ 08112260
.4byte sub_0806a370
.4byte sub_0806A5E8
.4byte sub_0806A630
.4byte sub_0806A674
.4byte sub_0806A830
.4byte sub_0806A890
gUnk_08112278:: @ 08112278
.4byte sub_0806A3D8
.4byte sub_0806A410
.4byte sub_0806A458
.4byte sub_0806A4CC
.4byte sub_0806A550
.4byte nullsub_503
.4byte sub_0806A5C0
gUnk_08112294:: @ 08112294
.incbin "rem/gUnk_08112294.bin"
gUnk_0811229C:: @ 0811229C
.incbin "rem/gUnk_0811229C.bin"
gUnk_081122A0:: @ 081122A0
.incbin "rem/gUnk_081122A0.bin"
gUnk_081122A8:: @ 081122A8
.incbin "rem/gUnk_081122A8.bin"
gUnk_081122B0:: @ 081122B0
.incbin "rem/gUnk_081122B0.bin"
gUnk_081122B8:: @ 081122B8
.incbin "rem/gUnk_081122B8.bin"

View File

@ -1256,7 +1256,7 @@ SECTIONS {
data/animations/npc/dog.o(.rodata);
data/const/npc/syrup.o(.rodata);
data/animations/npc/syrup.o(.rodata);
data/const/npc/rem.o(.rodata);
src/npc/rem.o(.rodata);
data/animations/npc/rem.o(.rodata);
data/const/npc/townMinish.o(.rodata);
data/animations/npc/townMinish.o(.rodata);

View File

@ -1,57 +1,66 @@
#include "functions.h"
#include "npc.h"
#include "item.h"
extern void sub_0806A8C8(Entity*);
extern void (*gUnk_08112260[])(Entity*);
extern void (*gUnk_08112278[])(Entity*);
extern void script_Rem;
extern u32 gUnk_0811229C;
extern void sub_0807F950(Entity* this, ScriptExecutionContext* context);
extern u8 gUnk_081122A0[];
void sub_0806A9B0(Entity*, ScriptExecutionContext*);
void sub_0806A914(Entity* this);
void sub_0806a370(Entity* this);
void sub_0806A5E8(Entity* this);
void sub_0806A630(Entity* this);
void sub_0806A674(Entity* this);
void sub_0806A830(Entity* this);
void sub_0806A890(Entity* this);
void sub_0806A3D8(Entity* this);
void sub_0806A410(Entity* this);
void sub_0806A458(Entity* this);
void sub_0806A4CC(Entity* this);
void sub_0806A550(Entity* this);
void nullsub_503(Entity* this);
void sub_0806A5C0(Entity* this);
void Rem(Entity* this) {
gUnk_08112260[this->type](this);
static void (*const typeFuncs[])(Entity*) = {
sub_0806a370, sub_0806A5E8, sub_0806A630, sub_0806A674, sub_0806A830, sub_0806A890,
};
typeFuncs[this->type](this);
}
void sub_0806a370(Entity* this) {
u8* pbVar1;
static void (*const actionFuncs[])(Entity*) = {
sub_0806A3D8, sub_0806A410, sub_0806A458, sub_0806A4CC, sub_0806A550, nullsub_503, sub_0806A5C0,
};
gUnk_08112278[this->action](this);
actionFuncs[this->action](this);
ExecuteScriptForEntity(this, NULL);
HandleEntity0x82Actions(this);
UpdateAnimationSingleFrame(this);
sub_0806ED78(this);
if (this->animIndex == 0xf) {
pbVar1 = &this->frame;
if (*pbVar1 == 1) {
*pbVar1 = 0;
if (this->frame == 1) {
this->frame = 0;
SoundReq(SFX_218);
}
if (*pbVar1 == 2) {
*pbVar1 = 0;
if (this->frame == 2) {
this->frame = 0;
SoundReq(SFX_219);
}
}
}
void sub_0806A3D8(Entity* this) {
ScriptExecutionContext* uVar1;
this->action = 1;
this->actionDelay = 0xb4;
SetDefaultPriority(this, PRIO_MESSAGE);
sub_0806A8C8(this);
uVar1 = StartCutscene(this, &script_Rem);
*(ScriptExecutionContext**)&this->cutsceneBeh = uVar1;
*(ScriptExecutionContext**)&this->cutsceneBeh = StartCutscene(this, &script_Rem);
sub_0807DD94(this, NULL);
}
@ -59,7 +68,7 @@ void sub_0806A410(Entity* this) {
switch (this->subAction) {
case 0:
if (--this->actionDelay == 0) {
this->subAction = this->subAction + 1;
this->subAction++;
InitializeAnimation(this, 8);
}
break;
@ -143,7 +152,7 @@ void sub_0806A550(Entity* this) {
}
}
void nullsub_503(void) {
void nullsub_503(Entity* this) {
}
void sub_0806A5C0(Entity* this) {
@ -181,7 +190,88 @@ void sub_0806A630(Entity* this) {
}
}
ASM_FUNC("asm/non_matching/rem/sub_0806A674.inc", void sub_0806A674(Entity* this))
void sub_0806A674(Entity* this) {
static const u8 gUnk_08112294[] = { 0, -1, 0, 1, 0, -1, 0, 1 };
u32 rand;
u8 auStack16[8];
memcpy(auStack16, &gUnk_08112294, 8);
switch (this->action) {
case 0:
this->action = 1;
this->spritePriority.b0 = 6;
InitializeAnimation(this, 0x13);
break;
case 1:
if ((gActiveScriptInfo.syncFlags & 0x100) != 0) {
this->action = 2;
this->spriteOffsetY = 0;
this->spriteOffsetX = 0;
} else {
if (this->parent->animIndex == 9) {
this->spritePriority.b0 = 3;
if (this->actionDelay == 0) {
rand = Random();
this->actionDelay = rand & 7;
this->field_0x68.HALF.LO = auStack16[rand >> 8 & 7];
} else if ((gRoomTransition.frameCount & 3U) == 0) {
this->actionDelay--;
if ((s8)this->spriteOffsetX < 1) {
this->field_0x68.HALF.LO = 1;
}
if (0xf < (s8)this->spriteOffsetX) {
this->field_0x68.HALF.LO = -1;
}
this->spriteOffsetX += this->field_0x68.HALF.LO;
}
if (this->field_0xf == 0) {
rand = Random();
this->field_0xf = rand & 7;
this->field_0x68.HALF.HI = auStack16[rand >> 8 & 7];
} else if (((u32)gRoomTransition.frameCount >> 4 & 3) == 0) {
this->field_0xf--;
if (-1 < this->spriteOffsetY) {
this->field_0x68.HALF.HI = -1;
}
if (this->spriteOffsetY <= -8) {
this->field_0x68.HALF.HI = 1;
}
this->spriteOffsetY += this->field_0x68.HALF.HI;
}
} else {
this->spritePriority.b0 = 6;
if ((s8)this->spriteOffsetX != 0) {
if (0 < (s8)this->spriteOffsetX) {
this->spriteOffsetX--;
}
if ((s8)this->spriteOffsetX < 0) {
this->spriteOffsetX++;
}
}
if (this->spriteOffsetY != 0) {
if (0 < this->spriteOffsetY) {
this->spriteOffsetY--;
}
if (this->spriteOffsetY < 0) {
this->spriteOffsetY++;
}
}
}
}
break;
case 2:
GetNextFrame(this);
break;
}
}
void sub_0806A830(Entity* this) {
Entity* npc;
@ -239,6 +329,7 @@ void sub_0806A914(Entity* this) {
}
void sub_0806A93C(Entity* this) {
static const u8 gUnk_0811229C[] = { 0, 6, 10, 16 };
sub_08078778(this);
sub_08078850(this, 0, 0, &gUnk_0811229C);
}
@ -266,6 +357,7 @@ void sub_0806A96C(Entity* this, ScriptExecutionContext* context) {
}
void sub_0806A9B0(Entity* this, ScriptExecutionContext* context) {
static const u8 gUnk_081122A0[] = { 60, 100, 200, 60, 100, 200, 80, 80 };
this->action = 2;
this->subAction = 0;
this->actionDelay = gUnk_081122A0[Random() & 7];
@ -290,7 +382,7 @@ void sub_0806AA18(Entity* this) {
u32 index;
if (this->field_0x6a.HWORD != 0) {
index = 0x4408;
} else if ((gRoomTransition.frameCount & 1U) == 0) {
} else if ((gRoomTransition.frameCount & 1) == 0) {
index = 0x4407;
} else {
index = 0x440d;
@ -298,7 +390,68 @@ void sub_0806AA18(Entity* this) {
MessageNoOverlap(index, this);
}
ASM_FUNC("asm/non_matching/rem/sub_0806AA50.inc", void sub_0806AA50(Entity* this, ScriptExecutionContext* context))
void sub_0806AA50(Entity* this, ScriptExecutionContext* context) {
static const u16 gUnk_081122A8[] = { 0x441c, 0x441d, 0x441e, 0 };
static const u16 gUnk_081122B0[] = { 0x441f, 0x4420, 0x4421, 0 };
static const u16 gUnk_081122B8[] = { 0x4410, 0x4411, 0x4412, 0 };
s32 messageIndex;
Entity* pEnt;
switch (context->unk_18) {
case 0:
context->condition = 0;
if (CheckLocalFlag(0x8f) == 0) {
messageIndex = gUnk_081122A8[gRoomVars.animFlags];
} else if (GetInventoryValue(ITEM_PEGASUS_BOOTS) == 0) {
messageIndex = gUnk_081122B0[gRoomVars.animFlags];
} else {
messageIndex = gUnk_081122B8[gRoomVars.animFlags];
}
if (++gRoomVars.animFlags > 2) {
gRoomVars.animFlags = 0;
}
MessageNoOverlap(messageIndex, this);
switch (context->intVariable) {
case 0:
gRoomVars.field_0xac[0] = this;
PrependEntityToList(this, NPC);
this->zVelocity = 0x18000;
break;
case 1:
pEnt = FindNextDuplicateID(gRoomVars.field_0xac[0], NPC);
gRoomVars.field_0xac[1] = pEnt;
pEnt->zVelocity = 0x18000;
break;
case 2:
pEnt = FindNextDuplicateID(gRoomVars.field_0xac[1], NPC);
gRoomVars.field_0xac[2] = pEnt;
pEnt->zVelocity = 0x18000;
break;
}
if (messageIndex == 0x441e) {
SetLocalFlag(0x8f);
context->condition = 1;
}
context->unk_18 = 1;
break;
case 1:
pEnt = ((Entity*)gRoomVars.field_0xac[context->intVariable]);
if (pEnt->z.HALF.HI < 0) {
break;
}
pEnt->zVelocity = 0x18000;
context->unk_18 = 2;
break;
case 2:
if (this->z.HALF.HI >= 0) {
return;
}
break;
}
gActiveScriptInfo.commandSize = 0;
}
void sub_0806AB74(Entity* this) {
gRoomVars.field_0x3 = 1;
@ -308,7 +461,7 @@ void sub_0806AB74(Entity* this) {
}
void sub_0806AB9C(Entity* this, ScriptExecutionContext* context) {
Entity* entity = FindEntity(NPC, REM, 7, 1, 0);
Entity* entity = FindEntity(NPC, REM, NPC, 1, 0);
if (entity != NULL) {
DeleteEntity(entity);
}