diff --git a/asm/non_matching/common/sub_0801E99C.inc b/asm/non_matching/common/sub_0801E99C.inc deleted file mode 100644 index 7bbda3c9..00000000 --- a/asm/non_matching/common/sub_0801E99C.inc +++ /dev/null @@ -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 diff --git a/include/common.h b/include/common.h index 5d68679b..4fcf2be6 100644 --- a/include/common.h +++ b/include/common.h @@ -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; diff --git a/src/common.c b/src/common.c index 0ad58ee5..909dd944 100644 --- a/src/common.c +++ b/src/common.c @@ -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) {