diff options
-rw-r--r-- | asm/contest_effect.s | 218 | ||||
-rw-r--r-- | include/contest.h | 3 | ||||
-rw-r--r-- | ld_script.txt | 1 | ||||
-rw-r--r-- | src/contest_effect.c | 100 |
4 files changed, 86 insertions, 236 deletions
diff --git a/asm/contest_effect.s b/asm/contest_effect.s deleted file mode 100644 index 22d116663..000000000 --- a/asm/contest_effect.s +++ /dev/null @@ -1,218 +0,0 @@ - .include "constants/gba_constants.inc" - .include "include/macros.inc" - - .syntax unified - - .text - - thumb_func_start sub_80B9120 -sub_80B9120: @ 80B9120 - push {r4-r7,lr} - sub sp, 0xC - mov r0, sp - movs r1, 0 - movs r2, 0x8 - bl memset - movs r7, 0 - ldr r1, _080B918C @ =gSharedMem + 0x192D0 - ldrb r0, [r1, 0x8] - cmp r0, 0xFF - beq _080B91D8 - adds r5, r1, 0 -_080B913A: - adds r0, r5, 0 - adds r0, 0x8 - adds r0, r7, r0 - ldrb r4, [r0] - adds r6, r4, 0 - adds r0, r4, 0 - str r1, [sp, 0x8] - bl sub_80B90C0 - lsls r0, 24 - ldr r1, [sp, 0x8] - cmp r0, 0 - beq _080B91C8 - ldrh r0, [r1, 0x4] - strh r0, [r1, 0x6] - lsls r0, r4, 3 - subs r0, r4 - lsls r0, 2 - subs r1, 0x70 - adds r2, r0, r1 - ldrb r1, [r2, 0x10] - movs r0, 0x4 - ands r0, r1 - cmp r0, 0 - beq _080B9174 - movs r1, 0x6 - ldrsh r0, [r5, r1] - lsls r0, 1 - strh r0, [r5, 0x6] -_080B9174: - ldrb r0, [r2, 0x10] - movs r3, 0x1 - ands r3, r0 - cmp r3, 0 - beq _080B9190 - movs r0, 0xA - strh r0, [r5, 0x6] - adds r0, r4, 0 - movs r1, 0x2F - bl SetContestantStatusUnk13 - b _080B91C8 - .align 2, 0 -_080B918C: .4byte gSharedMem + 0x192D0 -_080B9190: - ldrb r1, [r2, 0xF] - ldrh r0, [r5, 0x6] - subs r0, r1 - adds r1, r0, 0 - strh r0, [r5, 0x6] - lsls r0, 16 - cmp r0, 0 - bgt _080B91AC - strh r3, [r5, 0x6] - adds r0, r4, 0 - movs r1, 0x2E - bl SetContestantStatusUnk13 - b _080B91C8 -_080B91AC: - lsls r1, 24 - lsrs r1, 24 - adds r0, r6, 0 - bl sub_80B9200 - ldrb r1, [r5, 0x6] - adds r0, r6, 0 - bl sub_80B141C - lsls r0, r6, 1 - mov r2, sp - adds r1, r2, r0 - ldrh r0, [r5, 0x6] - strh r0, [r1] -_080B91C8: - adds r7, 0x1 - ldr r1, _080B91E8 @ =gSharedMem + 0x192D0 - adds r0, r1, 0 - adds r0, 0x8 - adds r0, r7, r0 - ldrb r0, [r0] - cmp r0, 0xFF - bne _080B913A -_080B91D8: - movs r7, 0 - mov r1, sp -_080B91DC: - movs r2, 0 - ldrsh r0, [r1, r2] - cmp r0, 0 - beq _080B91EC - movs r0, 0x1 - b _080B91F6 - .align 2, 0 -_080B91E8: .4byte gSharedMem + 0x192D0 -_080B91EC: - adds r1, 0x2 - adds r7, 0x1 - cmp r7, 0x3 - ble _080B91DC - movs r0, 0 -_080B91F6: - add sp, 0xC - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_80B9120 - - thumb_func_start sub_80B9200 -sub_80B9200: @ 80B9200 - lsls r0, 24 - lsrs r0, 24 - lsls r1, 24 - lsrs r1, 24 - lsls r2, r0, 3 - subs r2, r0 - lsls r2, 2 - ldr r0, _080B9220 @ =gSharedMem + 0x19260 - adds r2, r0 - ldrh r0, [r2, 0x2] - subs r0, r1 - strh r0, [r2, 0x2] - ldrb r0, [r2, 0xE] - adds r1, r0 - strb r1, [r2, 0xE] - bx lr - .align 2, 0 -_080B9220: .4byte gSharedMem + 0x19260 - thumb_func_end sub_80B9200 - - thumb_func_start sub_80B9224 -sub_80B9224: @ 80B9224 - push {r4,r5,lr} - lsls r0, 16 - lsrs r5, r0, 16 - asrs r4, r0, 16 - adds r0, r4, 0 - cmp r4, 0 - bge _080B9234 - negs r0, r4 -_080B9234: - movs r1, 0xA - bl __modsi3 - lsls r0, 16 - lsrs r0, 16 - cmp r4, 0 - bge _080B9252 - lsls r0, 16 - asrs r1, r0, 16 - cmp r1, 0 - beq _080B925C - adds r0, r4, 0 - subs r0, 0xA - adds r0, r1, r0 - b _080B9258 -_080B9252: - lsls r0, 16 - asrs r0, 16 - subs r0, r4, r0 -_080B9258: - lsls r0, 16 - lsrs r5, r0, 16 -_080B925C: - lsls r0, r5, 16 - asrs r0, 16 - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end sub_80B9224 - - thumb_func_start sub_80B9268 -sub_80B9268: @ 80B9268 - push {r4,r5,lr} - lsls r0, 16 - lsrs r5, r0, 16 - asrs r4, r0, 16 - adds r0, r4, 0 - cmp r4, 0 - bge _080B9278 - negs r0, r4 -_080B9278: - movs r1, 0xA - bl __modsi3 - lsls r0, 16 - asrs r1, r0, 16 - cmp r1, 0 - beq _080B9290 - adds r0, r4, 0 - adds r0, 0xA - subs r0, r1 - lsls r0, 16 - lsrs r5, r0, 16 -_080B9290: - lsls r0, r5, 16 - asrs r0, 16 - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end sub_80B9268 - - .align 2, 0 @ Don't pad with nop. diff --git a/include/contest.h b/include/contest.h index 2bcf32bef..4fef98f6e 100644 --- a/include/contest.h +++ b/include/contest.h @@ -226,7 +226,7 @@ struct UnknownContestStruct7 { u8 unk0[4]; s16 unk4; - u16 unk6; + s16 unk6; u8 unk8[5]; u8 unkD[4]; u8 unk11; @@ -284,5 +284,6 @@ void SetContestantStatusUnk14(u8 a, u8 b); void sub_80B157C(u8 p); bool8 Contest_IsMonsTurnDisabled(u8 a); bool8 sub_80B214C(u8 a); +void sub_80B141C(u8 a, u8 b); #endif // GUARD_CONTEST_H diff --git a/ld_script.txt b/ld_script.txt index 2eae4d81c..3e3cb622f 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -161,7 +161,6 @@ SECTIONS { src/naming_screen.o(.text); src/money.o(.text); src/contest_effect.o(.text); - asm/contest_effect.o(.text); src/record_mixing.o(.text); src/debug/sound_check_menu.o(.text); src/secret_base.o(.text); diff --git a/src/contest_effect.c b/src/contest_effect.c index e28334b12..ae9be3aaf 100644 --- a/src/contest_effect.c +++ b/src/contest_effect.c @@ -3,11 +3,14 @@ #include "random.h" #include "contest.h" -void sub_80B9038(u8); -bool8 sub_80B90C0(u8); -u8 sub_80B9120(void); -s16 sub_80B9224(s16); -s16 sub_80B9268(s16); +static void sub_80B9038(u8); +static bool8 sub_80B90C0(u8); +static u8 sub_80B9120(void); +static void sub_80B9200(u8, u8); +static s16 RoundTowardsZero(s16); +static s16 RoundUp(s16); + +#define abs(x) ((x) >= 0 ? (x) : -(x)) extern bool8 const gComboStarterLookupTable[]; @@ -497,7 +500,7 @@ void ContestEffect_31(void) curContestant->appeal2 += r3 / 2; SetContestantStatusUnk13(shared192D0.unk11, 17); } - sContestantStatus[shared192D0.unk11].appeal2 = sub_80B9224(sContestantStatus[shared192D0.unk11].appeal2); + sContestantStatus[shared192D0.unk11].appeal2 = RoundTowardsZero(sContestantStatus[shared192D0.unk11].appeal2); } void ContestEffect_32(void) @@ -945,7 +948,7 @@ void ContestEffect_45(void) if (sContestantStatus[i].appeal2 > 0) { shared192D0.unk4 = sContestantStatus[i].appeal2 / 2; - shared192D0.unk4 = sub_80B9268(shared192D0.unk4); + shared192D0.unk4 = RoundUp(shared192D0.unk4); } else shared192D0.unk4 = 10; @@ -1004,7 +1007,7 @@ void ContestEffect_47(void) } } -void sub_80B9038(u8 category) +static void sub_80B9038(u8 category) { int i; int r7 = 0; @@ -1029,26 +1032,24 @@ void sub_80B9038(u8 category) } #ifdef NONMATCHING -bool8 sub_80B90C0(u8 i) +static bool8 sub_80B90C0(u8 i) { shared192D0.unkD[i] = 1; if (sContestantStatus[i].unk10_1) - SetContestantStatusUnk13(i, 45); - else if (sContestantStatus[i].unk12 == 0) { - if (sContestantStatus[i].unkB_7 || sContestantStatus[i].unkC_1) - return FALSE; - return TRUE; + SetContestantStatusUnk13(i, 45); } - else + else if (sContestantStatus[i].unk12 != 0) { sContestantStatus[i].unk12--; SetContestantStatusUnk13(i, 44); } + else if (!sContestantStatus[i].unkB_7 && sContestantStatus[i].unkC_1 == 0) + return TRUE; return FALSE; } #else -__attribute__((naked)) bool8 sub_80B90C0(u8 i) +static __attribute__((naked)) bool8 sub_80B90C0(u8 i) { asm_unified("\tpush {lr}\n" "\tlsls r0, 24\n" @@ -1104,3 +1105,70 @@ __attribute__((naked)) bool8 sub_80B90C0(u8 i) "\tbx r1"); } #endif + +static bool8 sub_80B9120(void) +{ + s16 sp00[4] = {0}; + int i; + + for (i = 0; shared192D0.unk8[i] != 0xFF; i++) + { + u8 r4 = shared192D0.unk8[i]; + if (sub_80B90C0(r4)) + { + shared192D0.unk6 = shared192D0.unk4; + if (sContestantStatus[r4].unk10_2) + shared192D0.unk6 *= 2; + if (sContestantStatus[r4].unk10_0) + { + shared192D0.unk6 = 10; + SetContestantStatusUnk13(r4, 47); + } + else if ((shared192D0.unk6 -= sContestantStatus[r4].unkF) <= 0) + { + shared192D0.unk6 = 0; + SetContestantStatusUnk13(r4, 46); + } + else + { + sub_80B9200(r4, shared192D0.unk6); + sub_80B141C(r4, shared192D0.unk6); + sp00[r4] = shared192D0.unk6; + } + } + } + + for (i = 0; i < 4; i++) + { + if (sp00[i] != 0) + return TRUE; + } + return FALSE; +} + +static void sub_80B9200(u8 i, u8 jam) +{ + sContestantStatus[i].appeal2 -= jam; + sContestantStatus[i].unkE += jam; +} + +static s16 RoundTowardsZero(s16 score) +{ + s16 r1 = abs(score) % 10; + if (score < 0) + { + if (r1 != 0) + score -= 10 - r1; + } + else + score -= r1; + return score; +} + +static s16 RoundUp(s16 score) +{ + s16 r1 = abs(score) % 10; + if (r1 != 0) + score += 10 - r1; + return score; +} |