diff --git a/asm/code_809C5C4.s b/asm/code_809C5C4.s deleted file mode 100644 index bddb34597..000000000 --- a/asm/code_809C5C4.s +++ /dev/null @@ -1,445 +0,0 @@ - #include "asm/constants/gba_constants.inc" - #include "asm/macros.inc" - - .syntax unified - - .text - - - thumb_func_start sub_809CCDC -sub_809CCDC: - push {r4-r6,lr} - adds r6, r0, 0 - adds r4, r1, 0 - lsls r1, r6, 2 - ldr r0, _0809CD20 - adds r5, r1, r0 - ldr r0, _0809CD24 - ldr r1, [r0] - movs r0, 0x1 - negs r0, r0 - str r0, [r1, 0x4] - movs r0, 0 - str r0, [r1, 0x8] - movs r0, 0x2 - cmp r4, 0x63 - bgt _0809CD04 - movs r0, 0 - cmp r4, 0x1 - ble _0809CD04 - movs r0, 0x1 -_0809CD04: - ldr r1, _0809CD28 - ldr r2, _0809CD2C - ldr r3, _0809CD30 - lsls r0, 2 - adds r0, r3 - ldr r3, [r0] - adds r0, r5, 0 - bl sub_809CBBC - lsls r0, 24 - cmp r0, 0 - bne _0809CD34 - movs r0, 0x2 - b _0809CD3E - .align 2, 0 -_0809CD20: .4byte gUnknown_81163BC -_0809CD24: .4byte gUnknown_20399E0 -_0809CD28: .4byte gUnknown_81163F0 -_0809CD2C: .4byte gUnknown_811642C -_0809CD30: .4byte gUnknown_203B4A0 -_0809CD34: - ldr r0, _0809CD44 - ldr r0, [r0] - str r6, [r0, 0x4] - str r4, [r0, 0x8] - movs r0, 0x1 -_0809CD3E: - pop {r4-r6} - pop {r1} - bx r1 - .align 2, 0 -_0809CD44: .4byte gUnknown_20399E0 - thumb_func_end sub_809CCDC - - thumb_func_start sub_809CD48 -sub_809CD48: - push {lr} - bl IsTextboxOpen_809A750 - lsls r0, 24 - cmp r0, 0 - bne _0809CD58 - movs r0, 0x3 - b _0809CD5A -_0809CD58: - movs r0, 0 -_0809CD5A: - pop {r1} - bx r1 - thumb_func_end sub_809CD48 - - thumb_func_start nullsub_117 -nullsub_117: - bx lr - thumb_func_end nullsub_117 - - thumb_func_start nullsub_118 -nullsub_118: - bx lr - thumb_func_end nullsub_118 - - thumb_func_start sub_809CD68 -sub_809CD68: - movs r2, 0 - str r2, [r0] - str r2, [r0, 0x4] - movs r1, 0x1 - negs r1, r1 - str r1, [r0, 0x10] - str r2, [r0, 0x14] - str r2, [r0, 0x8] - strb r2, [r0, 0x18] - bx lr - thumb_func_end sub_809CD68 - - thumb_func_start sub_809CD7C -sub_809CD7C: - movs r2, 0 - str r2, [r0] - movs r1, 0x1 - negs r1, r1 - str r1, [r0, 0x10] - str r2, [r0, 0x14] - str r2, [r0, 0x8] - bx lr - thumb_func_end sub_809CD7C - - thumb_func_start sub_809CD8C -sub_809CD8C: - push {r4,r5,lr} - adds r5, r0, 0 - adds r4, r1, 0 - cmp r4, 0x5 - bne _0809CD9E - bl sub_809CD68 - str r4, [r5] - b _0809CDB0 -_0809CD9E: - ldr r0, [r5, 0x4] - cmp r0, r4 - beq _0809CDB0 - str r4, [r5, 0x4] - movs r0, 0x1 - negs r0, r0 - str r0, [r5, 0x10] - movs r0, 0 - str r0, [r5, 0x14] -_0809CDB0: - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end sub_809CD8C - - thumb_func_start sub_809CDB8 -sub_809CDB8: - push {lr} - adds r1, r0, 0 - ldr r0, [r1, 0x4] - cmp r0, 0 - bne _0809CDC4 - ldr r0, [r1] -_0809CDC4: - pop {r1} - bx r1 - thumb_func_end sub_809CDB8 - - thumb_func_start sub_809CDC8 -sub_809CDC8: - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x8 - adds r4, r0, 0 - adds r6, r1, 0 - adds r7, r2, 0 - ldr r1, [sp, 0x24] - movs r0, 0x1 - negs r0, r0 - str r0, [r3] - ldr r0, [r4] - cmp r0, 0x1 - beq _0809CDEA - cmp r0, 0x2 - beq _0809CDFE - b _0809CE12 -_0809CDEA: - movs r0, 0x80 - lsls r0, 6 - ands r1, r0 - cmp r1, 0 - beq _0809CE12 - adds r0, r4, 0 - bl sub_809CD68 - movs r0, 0x2 - b _0809CE10 -_0809CDFE: - movs r0, 0x80 - lsls r0, 6 - ands r1, r0 - cmp r1, 0 - bne _0809CE12 - adds r0, r4, 0 - bl sub_809CD68 - movs r0, 0x1 -_0809CE10: - str r0, [r4] -_0809CE12: - ldr r0, [r4, 0x4] - mov r8, r0 - cmp r0, 0 - bne _0809CE1E - ldr r1, [r4] - mov r8, r1 -_0809CE1E: - mov r0, r8 - subs r0, 0x1 - cmp r0, 0x6 - bls _0809CE28 - b _0809CFCC -_0809CE28: - lsls r0, 2 - ldr r1, _0809CE34 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_0809CE34: .4byte _0809CE38 - .align 2, 0 -_0809CE38: - .4byte _0809CE54 - .4byte _0809CF74 - .4byte _0809CFCC - .4byte _0809CFCC - .4byte _0809CECC - .4byte _0809CF5C - .4byte _0809CF5C -_0809CE54: - ldr r0, _0809CE70 - ldrh r2, [r0] - ldrh r1, [r0, 0x2] - movs r0, 0xF0 - ands r0, r2 - cmp r0, 0 - beq _0809CE74 - movs r0, 0x2 - ands r0, r2 - cmp r0, 0 - beq _0809CEA4 - movs r0, 0 - b _0809CEA8 - .align 2, 0 -_0809CE70: .4byte gRealInputs -_0809CE74: - movs r3, 0x2 - adds r0, r1, 0 - ands r0, r3 - cmp r0, 0 - beq _0809CE82 - movs r0, 0x14 - b _0809CEA8 -_0809CE82: - ldr r0, [r4, 0x10] - cmp r0, 0x1 - ble _0809CEA4 - subs r0, 0x1 - str r0, [r4, 0x10] - adds r0, r2, 0 - ands r0, r3 - cmp r0, 0 - bne _0809CEAA - movs r0, 0x13 - str r0, [r6] - movs r1, 0x1 - negs r1, r1 - adds r0, r1, 0 - strb r0, [r7] - movs r0, 0x5 - b _0809CFDA -_0809CEA4: - movs r0, 0x1 - negs r0, r0 -_0809CEA8: - str r0, [r4, 0x10] -_0809CEAA: - movs r0, 0x1 - ands r1, r0 - cmp r1, 0 - beq _0809CEB6 - movs r0, 0xA - b _0809CEC2 -_0809CEB6: - ldr r0, [r4, 0x10] - cmp r0, 0 - bne _0809CEC0 - movs r0, 0x8 - b _0809CEC2 -_0809CEC0: - movs r0, 0x7 -_0809CEC2: - str r0, [r6] - adds r0, r2, 0 - bl sub_809CFE8 - b _0809CF4E -_0809CECC: - mov r0, sp - bl sub_809B260 - lsls r0, 24 - cmp r0, 0 - beq _0809CFCC - ldr r0, _0809CEEC - ldr r0, [r0] - ldrb r0, [r0, 0xC] - cmp r0, 0 - bne _0809CEF0 - movs r0, 0x4 - bl sub_809C6CC - b _0809CEF6 - .align 2, 0 -_0809CEEC: .4byte gGameOptionsRef -_0809CEF0: - movs r0, 0x3 - bl sub_809C6CC -_0809CEF6: - bl nullsub_104 - adds r0, r4, 0 - bl sub_809CD7C - movs r5, 0x1 - str r5, [r4] - ldr r0, [sp] - cmp r0, 0x2 - beq _0809CF1E - cmp r0, 0x2 - bgt _0809CF14 - cmp r0, 0x1 - beq _0809CF2A - b _0809CF54 -_0809CF14: - cmp r0, 0x3 - beq _0809CF2A - cmp r0, 0x4 - beq _0809CF3C - b _0809CF54 -_0809CF1E: - movs r0, 0x4 - str r0, [r4] - movs r0, 0x1E - bl sub_8098D80 - b _0809CF46 -_0809CF2A: - movs r0, 0x4 - str r0, [r4] - str r5, [r6] - movs r1, 0x1 - negs r1, r1 - adds r0, r1, 0 - strb r0, [r7] - movs r0, 0x4 - b _0809CFDA -_0809CF3C: - str r0, [r4] - movs r0, 0x45 - movs r1, 0 - bl GroundMap_ExecuteEvent -_0809CF46: - str r5, [r6] - movs r1, 0x1 - negs r1, r1 - adds r0, r1, 0 -_0809CF4E: - strb r0, [r7] - ldr r0, [r4] - b _0809CFDA -_0809CF54: - movs r0, 0x2 - bl GroundScriptLockJumpZero - b _0809CFCC -_0809CF5C: - add r0, sp, 0x4 - bl sub_809B260 - lsls r0, 24 - cmp r0, 0 - beq _0809CFCC - adds r0, r4, 0 - bl sub_809CD7C - movs r0, 0x1 - str r0, [r4] - b _0809CFDA -_0809CF74: - ldr r0, [r4, 0x8] - cmp r0, 0 - ble _0809CF86 - subs r0, 0x1 - str r0, [r4, 0x8] - movs r0, 0x9 - str r0, [r6] - ldrb r0, [r4, 0xC] - b _0809CFD6 -_0809CF86: - ldr r0, _0809CFA0 - ldrh r1, [r0] - movs r0, 0x9 - str r0, [r6] - movs r0, 0x40 - ands r0, r1 - lsls r0, 16 - lsrs r2, r0, 16 - cmp r2, 0 - beq _0809CFA4 - movs r0, 0x4 - b _0809CFB6 - .align 2, 0 -_0809CFA0: .4byte gRealInputs -_0809CFA4: - movs r0, 0x80 - ands r1, r0 - cmp r1, 0 - beq _0809CFB0 - strb r2, [r7] - b _0809CFB8 -_0809CFB0: - movs r1, 0x1 - negs r1, r1 - adds r0, r1, 0 -_0809CFB6: - strb r0, [r7] -_0809CFB8: - ldrb r0, [r7] - strb r0, [r4, 0xC] - lsls r0, 24 - movs r1, 0xFF - lsls r1, 24 - cmp r0, r1 - beq _0809CFD8 - movs r0, 0x20 - str r0, [r4, 0x8] - b _0809CFD8 -_0809CFCC: - movs r0, 0 - str r0, [r6] - movs r1, 0x1 - negs r1, r1 - adds r0, r1, 0 -_0809CFD6: - strb r0, [r7] -_0809CFD8: - mov r0, r8 -_0809CFDA: - add sp, 0x8 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_809CDC8 - - .align 2,0 diff --git a/ld_script.txt b/ld_script.txt index 907f33151..c7287d5c7 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -337,7 +337,6 @@ SECTIONS { asm/code_8099360.o(.text); src/code_809A560.o(.text); src/code_809C5C4.o(.text); - asm/code_809C5C4.o(.text); src/code_809D148.o(.text); src/ground_script.o(.text); src/code_80A26CC.o(.text); diff --git a/src/code_809C5C4.c b/src/code_809C5C4.c index e8dc51176..604867589 100644 --- a/src/code_809C5C4.c +++ b/src/code_809C5C4.c @@ -8,6 +8,7 @@ #include "code_800D090.h" #include "code_80118A4.h" #include "string_format.h" +#include "input.h" struct unkStruct_3001B68 { @@ -439,6 +440,11 @@ bool8 HasItemInInventory(u8 item) extern bool8 ScriptPrintText(s32 a0, s32 a1_, const char *text); extern bool8 sub_809124C(u8 id, u8 param_3); +extern u8 IsTextboxOpen_809A750(void); +extern u8 sub_809CFE8(u32); +extern bool8 sub_809B260(s32 *a0); +extern void GroundMap_ExecuteEvent(s32, s32); +extern void GroundScriptLockJumpZero(s32 index); extern const u8 gUnknown_81163E4[]; @@ -448,7 +454,7 @@ struct ItemWithQuantity s16 quantity; }; -bool8 sub_809CBBC(const struct ItemWithQuantity *itemToAdd, u8 *maxMoneyStr, u8 *noItemSpaceStr, u8 *itemGivenStr) +static bool8 sub_809CBBC(const struct ItemWithQuantity *itemToAdd, const u8 *maxMoneyStr, const u8 *noItemSpaceStr, const u8 *itemGivenStr) { char buffer[80]; @@ -493,9 +499,9 @@ bool8 sub_809CBBC(const struct ItemWithQuantity *itemToAdd, u8 *maxMoneyStr, u8 extern const struct ItemWithQuantity gUnknown_81163BC[]; -s32 sub_809CC90(s32 r0) +s32 sub_809CC90(s32 tableId) { - const struct ItemWithQuantity *item = &gUnknown_81163BC[r0]; + const struct ItemWithQuantity *item = &gUnknown_81163BC[tableId]; if (item->id == ITEM_POKE) { if (gTeamInventoryRef->teamMoney + item->quantity > MAX_TEAM_MONEY) return 2; @@ -506,3 +512,246 @@ s32 sub_809CC90(s32 r0) } return 1; } + +extern const u8 gUnknown_81163F0[]; +extern const u8 gUnknown_811642C[]; + +s32 sub_809CCDC(u32 tableId, s32 a1) +{ + s32 strId; + const struct ItemWithQuantity *item = &gUnknown_81163BC[tableId]; + gUnknown_20399E0->unk4 = -1; + gUnknown_20399E0->unk8 = 0; + + if (a1 > 99) { + strId = 2; + } + else if (a1 > 1) { + strId = 1; + } + else { + strId = 0; + } + + if (sub_809CBBC(item, gUnknown_81163F0, gUnknown_811642C, gUnknown_203B4A0[strId])) { + gUnknown_20399E0->unk4 = tableId; + gUnknown_20399E0->unk8 = a1; + return 1; + } + else { + return 2; + } +} + +s32 sub_809CD48(void) +{ + if (IsTextboxOpen_809A750()) { + return 0; + } + return 3; +} + +void nullsub_117(void) {} +void nullsub_118(void) {} + +// TODO: merge this struct with other ground-related structs (if possible, otherwise just give a fitting name) +struct Tempsub_809CD68Struct +{ + s32 unk0; + s32 unk4; + s32 unk8; + u8 unkC; + s32 unk10; + s32 unk14; + u8 unk18; +}; + +void sub_809CD68(struct Tempsub_809CD68Struct *dst) +{ + dst->unk0 = 0; + dst->unk4 = 0; + dst->unk10 = -1; + dst->unk14 = 0; + dst->unk8 = 0; + dst->unk18 = 0; +} + +void sub_809CD7C(struct Tempsub_809CD68Struct *dst) +{ + dst->unk0 = 0; + dst->unk10 = -1; + dst->unk14 = 0; + dst->unk8 = 0; +} + +void sub_809CD8C(struct Tempsub_809CD68Struct *dst, s32 a1) +{ + if (a1 == 5) { + sub_809CD68(dst); + dst->unk0 = a1; + } + else if (dst->unk4 != a1) { + dst->unk4 = a1; + dst->unk10 = -1; + dst->unk14 = 0; + } +} + +s32 sub_809CDB8(struct Tempsub_809CD68Struct *dst) +{ + s32 ret = dst->unk4; + if (ret == 0) { + ret = dst->unk0; + } + return ret; +} + +u32 sub_809CDC8(struct Tempsub_809CD68Struct *strPtr, u32 *r6, s8 *r7, s32 *param_4, u32 param_5, u32 param_6) +{ + u32 sp_4; + s32 sp; + s32 r8; + + param_4[0] = -1; + + switch (strPtr->unk0) { + case 1: + if (param_6 & 0x2000) { + sub_809CD68(strPtr); + strPtr->unk0 = 2; + } + break; + case 2: + if (!(param_6 & 0x2000)) { + sub_809CD68(strPtr); + strPtr->unk0 = 1; + } + break; + } + + r8 = strPtr->unk4; + if (r8 == 0) + r8 = strPtr->unk0; + + switch (r8) { + case 1: + { + u16 held = gRealInputs.held; + u16 pressed = gRealInputs.pressed; + if (held & DPAD_ANY) { + if (held & B_BUTTON) { + strPtr->unk10 = 0; + } + else { + strPtr->unk10 = -1; + } + } + else if (pressed & B_BUTTON) { + strPtr->unk10 = 0x14; + } + else if (strPtr->unk10 > 1) { + strPtr->unk10--; + if (!(held & B_BUTTON)) { + *r6 = 0x13; + *r7 = -1; + return 5; + } + } + else { + strPtr->unk10 = -1; + } + + if (pressed & A_BUTTON) { + *r6 = 10; + } + else if (strPtr->unk10 == 0) { + *r6 = 8; + } + else { + *r6 = 7; + } + + *r7 = sub_809CFE8(held); + return strPtr->unk0; + } + case 5: + if (sub_809B260(&sp)) { + if (gGameOptionsRef->unkC == 0) + sub_809C6CC(4); + else + sub_809C6CC(3); + + nullsub_104(); + sub_809CD7C(strPtr); + strPtr->unk0 = 1; + + switch (sp) { + case 3: + strPtr->unk0 = 4; + *r6 = 1; + *r7 = -1; + return 4; + case 2: + strPtr->unk0 = 4; + sub_8098D80(0x1E); + *r6 = 1; + *r7 = -1; + return strPtr->unk0; + case 1: + strPtr->unk0 = 4; + *r6 = 1; + *r7 = -1; + return 4; + case 4: + strPtr->unk0 = 4; + GroundMap_ExecuteEvent(0x45, 0); + *r6 = 1; + *r7 = -1; + return strPtr->unk0; + } + GroundScriptLockJumpZero(2); + } + break; + case 6: + case 7: + if (sub_809B260(&sp_4)) { + sub_809CD7C(strPtr); + strPtr->unk0 = 1; + return strPtr->unk0; + } + break; + case 2: + { + if (strPtr->unk8 >= 1) { + strPtr->unk8--; + *r6 = 9; + *r7 = strPtr->unkC; + } + else { + s32 v; + u16 held = gRealInputs.held; + *r6 = 9; + if (held & 0x40) { + *r7 = 4; + } + else if (held & 0x80) { + *r7 = 0; + } + else { + *r7 = -1; + } + + // TODO: Fix me, this should be a simple -1 comparision, but agbcc doesn't want to cooperate... + v = strPtr->unkC = *r7; + if ((v << 0x18) != (0xFF) << 0x18) { + strPtr->unk8 = 0x20; + } + } + } + return r8; + } + + *r6 = 0; + *r7 = -1; + return r8; +}