mirror of https://github.com/zeldaret/tmc.git
Merge pull request #586 from Catobat/sub_0801E99C
This commit is contained in:
commit
30c2186c90
|
@ -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
|
|
@ -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;
|
||||
|
|
62
src/common.c
62
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) {
|
||||
|
|
Loading…
Reference in New Issue