Merge pull request #586 from Catobat/sub_0801E99C

This commit is contained in:
notyourav 2023-01-03 22:41:49 -08:00 committed by GitHub
commit 30c2186c90
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 61 additions and 114 deletions

View File

@ -1,112 +0,0 @@
.syntax unified
push {r4, r5, r6, r7, lr}
mov r7, r8
push {r7}
bl sub_08002632
mov r8, r0
ldr r1, _0801E9E4 @ =gUnk_08001DCC
lsls r0, r0, #2
adds r0, r0, r1
ldr r7, [r0]
movs r0, #0x67
bl GetInventoryValue
cmp r0, #0
beq _0801EA56
ldr r1, _0801E9E8 @ =gSave
ldrb r0, [r7]
ldrb r2, [r1, #8]
cmp r0, r2
bhi _0801EA56
ldr r2, _0801E9EC @ =0x000001C1
adds r0, r1, r2
add r0, r8
ldrb r5, [r0]
subs r2, #0x80
adds r0, r1, r2
add r0, r8
ldrb r6, [r0]
adds r4, r6, r7
_0801E9D6:
cmp r5, #0xf1
beq _0801E9F6
cmp r5, #0xf1
bhi _0801E9F0
cmp r5, #0
beq _0801E9F6
b _0801EA10
.align 2, 0
_0801E9E4: .4byte gUnk_08001DCC
_0801E9E8: .4byte gSave
_0801E9EC: .4byte 0x000001C1
_0801E9F0:
cmp r5, #0xf2
beq _0801EA0A
b _0801EA10
_0801E9F6:
ldrb r5, [r4, #5]
cmp r5, #0
beq _0801EA10
cmp r5, #0xff
beq _0801EA14
adds r0, r5, #0
bl CheckKinstoneFused
cmp r0, #0
beq _0801EA10
_0801EA0A:
adds r4, #1
adds r6, #1
ldrb r5, [r4, #5]
_0801EA10:
cmp r5, #0xff
bne _0801EA1C
_0801EA14:
adds r0, r7, #0
bl sub_0801EA74
adds r5, r0, #0
_0801EA1C:
cmp r5, #0
beq _0801EA32
cmp r5, #0xf2
beq _0801E9D6
adds r0, r5, #0
bl CheckKinstoneFused
cmp r0, #0
beq _0801EA34
movs r5, #0xf1
b _0801E9D6
_0801EA32:
movs r5, #0xf3
_0801EA34:
ldr r1, _0801EA5C @ =gSave
ldr r2, _0801EA60 @ =0x000001C1
adds r0, r1, r2
add r0, r8
strb r5, [r0]
subs r2, #0x80
adds r0, r1, r2
add r0, r8
strb r6, [r0]
bl Random
ldrb r4, [r7, #1]
movs r1, #0x64
bl __modsi3
cmp r4, r0
bhi _0801EA64
_0801EA56:
movs r0, #0
b _0801EA6E
.align 2, 0
_0801EA5C: .4byte gSave
_0801EA60: .4byte 0x000001C1
_0801EA64:
subs r0, r5, #1
cmp r0, #0x63
bls _0801EA6C
movs r5, #0
_0801EA6C:
adds r0, r5, #0
_0801EA6E:
pop {r3}
mov r8, r3
pop {r4, r5, r6, r7, pc}
.syntax divided

View File

@ -124,6 +124,7 @@ void sub_0801DFB4(struct Entity_*, u32, u32, u32);
u32 sub_0801E00C(void);
bool32 sub_0801E810(u32);
u32 sub_0801DB94(void);
u32 sub_0801EA74(u8*);
typedef struct {
u8 unk_0;

View File

@ -5,6 +5,7 @@
#include "functions.h"
#include "game.h"
#include "global.h"
#include "item.h"
#include "kinstone.h"
#include "main.h"
#include "message.h"
@ -966,7 +967,64 @@ void sub_0801E8D4(void) {
}
}
ASM_FUNC("asm/non_matching/common/sub_0801E99C.inc", u32 sub_0801E99C(u32 a1));
extern u8* gUnk_08001DCC[];
u32 sub_0801E99C(Entity* entity) {
u8* fuserData;
u32 fuserId;
u32 offeredFusion;
u32 fuserProgress;
u8* fuserFusionData;
s32 randomMood;
u32 fuserStability;
fuserId = sub_08002632(entity);
fuserData = gUnk_08001DCC[fuserId];
if (GetInventoryValue(ITEM_KINSTONE_BAG) == 0 || fuserData[0] > gSave.global_progress) {
return 0;
}
offeredFusion = gSave.unk1C1[fuserId];
fuserProgress = gSave.unk141[fuserId];
fuserFusionData = (u8*)(fuserProgress + (u32)fuserData);
while (TRUE) { // loop through fusions for this fuser
switch (offeredFusion) {
case 0xF1: // offered fusion completed with someone else
case 0x00: // no fusion offered yet
offeredFusion = fuserFusionData[5];
if (offeredFusion == 0x00 || offeredFusion == 0xFF || CheckKinstoneFused(offeredFusion) == 0) {
break;
}
case 0xF2: // previous fusion completed
fuserFusionData++;
fuserProgress++;
offeredFusion = fuserFusionData[5];
}
if (offeredFusion == 0xFF) { // random shared fusion
offeredFusion = sub_0801EA74(fuserData);
}
if (offeredFusion == 0x00) { // end of fusion list
offeredFusion = 0xF3; // mark this fuser as done
break;
}
if (offeredFusion == 0xF2) { // previous fusion completed
continue;
}
if (CheckKinstoneFused(offeredFusion) == 0) {
break;
}
offeredFusion = 0xF1; // already completed, try next fusion in the list
}
gSave.unk1C1[fuserId] = offeredFusion;
gSave.unk141[fuserId] = fuserProgress;
randomMood = Random();
fuserStability = fuserData[1];
if (fuserStability <= randomMood % 100) {
return 0; // fickleness
}
if (offeredFusion - 1 > 99) {
offeredFusion = 0;
}
return offeredFusion;
}
const struct_080C9C6C gUnk_080C9C6C[] = {
{ 1, 2, 2 }, { 3, 3, 3 }, { 4, 3, 0 }, { 3, 5, 5 }, { 3, 2, 2 }, { 5, 7, 7 }, { 5, 5, 5 }, { 1, 3, 3 },
@ -1135,7 +1193,7 @@ const u8 gUnk_080CA11C[] = {
};
// Get a random kinstone
u32 sub_0801EA74(void) {
u32 sub_0801EA74(u8* fuserData) {
s32 r = (s32)Random() % 18;
u32 i;
for (i = 0; i < 18; ++i) {