Merge pull request #388 from DizzyEggg/code_809C5C4
Some checks failed
GithubCI / build (push) Has been cancelled

code_809C5C4
This commit is contained in:
AnonymousRandomPerson
2025-05-09 17:00:39 -04:00
committed by GitHub
3 changed files with 327 additions and 593 deletions

View File

@@ -1,589 +0,0 @@
#include "asm/constants/gba_constants.inc"
#include "asm/macros.inc"
.syntax unified
.text
thumb_func_start sub_809CBBC
sub_809CBBC:
push {r4-r7,lr}
sub sp, 0x54
adds r4, r0, 0
adds r6, r1, 0
adds r5, r2, 0
adds r7, r3, 0
ldrb r1, [r4]
cmp r1, 0x69
bne _0809CC20
ldr r1, _0809CC0C
movs r0, 0x2
ldrsh r2, [r4, r0]
ldr r0, _0809CC10
ldr r0, [r0]
movs r3, 0xD2
lsls r3, 4
adds r0, r3
ldr r3, [r0]
mov r0, sp
bl sprintfStatic
ldr r0, _0809CC14
ldr r0, [r0]
movs r1, 0x98
lsls r1, 2
adds r2, r0, r1
movs r3, 0x2
ldrsh r1, [r4, r3]
ldr r0, [r2]
adds r1, r0, r1
ldr r0, _0809CC18
cmp r1, r0
ble _0809CC1C
cmp r6, 0
beq _0809CC4E
movs r1, 0x1
negs r1, r1
movs r0, 0
adds r2, r6, 0
b _0809CC4A
.align 2, 0
_0809CC0C: .4byte gUnknown_81163E4
_0809CC10: .4byte gItemParametersData
_0809CC14: .4byte gTeamInventoryRef
_0809CC18: .4byte 0x0001869f
_0809CC1C:
str r1, [r2]
b _0809CC5E
_0809CC20:
ldrb r0, [r4, 0x2]
lsls r1, 16
lsls r0, 8
orrs r0, r1
str r0, [sp, 0x50]
add r4, sp, 0x50
mov r0, sp
adds r1, r4, 0
movs r2, 0
bl sub_8090E14
bl GetNumberOfFilledInventorySlots
cmp r0, 0x13
ble _0809CC52
cmp r5, 0
beq _0809CC4E
movs r1, 0x1
negs r1, r1
movs r0, 0
adds r2, r5, 0
_0809CC4A:
bl ScriptPrintText
_0809CC4E:
movs r0, 0
b _0809CC82
_0809CC52:
ldrb r0, [r4, 0x2]
movs r1, 0
bl sub_809124C
bl FillInventoryGaps
_0809CC5E:
cmp r7, 0
beq _0809CC80
ldr r0, _0809CC8C
mov r1, sp
bl strcpy
movs r1, 0x1
negs r1, r1
movs r0, 0
adds r2, r7, 0
bl ScriptPrintText
movs r1, 0x80
lsls r1, 1
movs r0, 0xCB
bl xxx_call_play_fanfare_se
_0809CC80:
movs r0, 0x1
_0809CC82:
add sp, 0x54
pop {r4-r7}
pop {r1}
bx r1
.align 2, 0
_0809CC8C: .4byte gFormatBuffer_Items
thumb_func_end sub_809CBBC
thumb_func_start sub_809CC90
sub_809CC90:
push {lr}
lsls r0, 2
ldr r1, _0809CCBC
adds r1, r0, r1
ldrb r0, [r1]
cmp r0, 0x69
bne _0809CCC8
ldr r0, _0809CCC0
ldr r0, [r0]
movs r2, 0x98
lsls r2, 2
adds r0, r2
movs r2, 0x2
ldrsh r1, [r1, r2]
ldr r0, [r0]
adds r0, r1
ldr r1, _0809CCC4
cmp r0, r1
ble _0809CCD4
movs r0, 0x2
b _0809CCD6
.align 2, 0
_0809CCBC: .4byte gUnknown_81163BC
_0809CCC0: .4byte gTeamInventoryRef
_0809CCC4: .4byte 0x0001869f
_0809CCC8:
bl GetNumberOfFilledInventorySlots
cmp r0, 0x13
ble _0809CCD4
movs r0, 0x2
b _0809CCD6
_0809CCD4:
movs r0, 0x1
_0809CCD6:
pop {r1}
bx r1
thumb_func_end sub_809CC90
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

View File

@@ -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);

View File

@@ -5,6 +5,10 @@
#include "event_flag.h"
#include "ground_main.h"
#include "code_80A26CC.h"
#include "code_800D090.h"
#include "code_80118A4.h"
#include "string_format.h"
#include "input.h"
struct unkStruct_3001B68
{
@@ -413,21 +417,341 @@ void sub_809CB50(void)
gUnknown_20399E0->unk8 = 0;
}
void sub_809CB74(void) {
void sub_809CB74(void)
{
MemoryFree(gUnknown_20399E0);
gUnknown_20399E0 = NULL;
}
void sub_809CB8C(void) {
void sub_809CB8C(void)
{
ClearScriptVarArray(NULL, STATION_ITEM_TEMP);
ClearScriptVarArray(NULL, DELIVER_ITEM_TEMP);
}
bool8 HasItemInInventory(u8 item)
{
if(FindItemInInventory(item) >= 0)
if (FindItemInInventory(item) >= 0)
return TRUE;
else
return FALSE;
}
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[];
struct ItemWithQuantity
{
u8 id;
s16 quantity;
};
static bool8 sub_809CBBC(const struct ItemWithQuantity *itemToAdd, const u8 *maxMoneyStr, const u8 *noItemSpaceStr, const u8 *itemGivenStr)
{
char buffer[80];
if (itemToAdd->id == ITEM_POKE) {
int newMoneyAmount;
sprintfStatic(buffer,gUnknown_81163E4,itemToAdd->quantity,gItemParametersData[ITEM_POKE].name);
newMoneyAmount = gTeamInventoryRef->teamMoney + itemToAdd->quantity;
if (newMoneyAmount > MAX_TEAM_MONEY) {
if (maxMoneyStr != 0) {
ScriptPrintText(0, -1, maxMoneyStr);
}
return FALSE;
}
gTeamInventoryRef->teamMoney = newMoneyAmount;
}
else {
Item item = {0};
item.quantity = itemToAdd->quantity;
item.id = itemToAdd->id;
sub_8090E14(buffer,&item,0);
if (GetNumberOfFilledInventorySlots() >= INVENTORY_SIZE) {
if (noItemSpaceStr != 0) {
ScriptPrintText(0, -1, noItemSpaceStr);
}
return FALSE;
}
sub_809124C(item.id,0);
FillInventoryGaps();
}
if (itemGivenStr != 0) {
strcpy(gFormatBuffer_Items[0], buffer);
ScriptPrintText(0, -1, itemGivenStr);
xxx_call_play_fanfare_se(0xcb,0x100);
}
return TRUE;
}
extern const struct ItemWithQuantity gUnknown_81163BC[];
s32 sub_809CC90(s32 tableId)
{
const struct ItemWithQuantity *item = &gUnknown_81163BC[tableId];
if (item->id == ITEM_POKE) {
if (gTeamInventoryRef->teamMoney + item->quantity > MAX_TEAM_MONEY)
return 2;
}
else {
if (GetNumberOfFilledInventorySlots() >= INVENTORY_SIZE)
return 2;
}
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;
}