From eb19398b4f20afcfbb455b90365ea47062655f96 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Fri, 28 Jul 2023 11:10:45 -0700 Subject: [PATCH] combine event_flag files --- asm/event_flag_1.s | 45 ---- include/event_flag.h | 22 +- ld_script.txt | 2 - src/code.c | 2 +- src/code_80972F4.c | 4 +- src/event_flag.c | 569 ++++++++++++++++++++++++++++++++++++++++++- src/event_flag_1.c | 569 ------------------------------------------- src/ground_main.c | 5 +- 8 files changed, 586 insertions(+), 632 deletions(-) delete mode 100644 asm/event_flag_1.s delete mode 100644 src/event_flag_1.c diff --git a/asm/event_flag_1.s b/asm/event_flag_1.s deleted file mode 100644 index c3cf362fa..000000000 --- a/asm/event_flag_1.s +++ /dev/null @@ -1,45 +0,0 @@ - #include "asm/constants/gba_constants.inc" - #include "asm/macros.inc" - - .syntax unified - - .text - - thumb_func_start sub_8002658 -sub_8002658: - push {r4,r5,lr} - lsls r0, 16 - asrs r4, r0, 16 - ldr r1, _0800267C - ldrh r2, [r1] - movs r3, 0 - ldrsh r0, [r1, r3] - movs r3, 0x1 - negs r3, r3 - cmp r0, r3 - beq _0800268C -_0800266E: - lsls r0, r2, 16 - asrs r0, 16 - cmp r0, r4 - bne _08002680 - ldrb r0, [r1, 0x2] - b _0800268E - .align 2, 0 -_0800267C: .4byte gUnknown_80B71E4 -_08002680: - adds r1, 0x4 - ldrh r2, [r1] - movs r5, 0 - ldrsh r0, [r1, r5] - cmp r0, r3 - bne _0800266E -_0800268C: - movs r0, 0 -_0800268E: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end sub_8002658 - - .align 2,0 diff --git a/include/event_flag.h b/include/event_flag.h index 466a4b344..0fd643364 100644 --- a/include/event_flag.h +++ b/include/event_flag.h @@ -4,14 +4,32 @@ struct UnkEventStruct { /* 0x0 */ s16 *unk0; - /* 0x4 */ u32 *unk4; + /* 0x4 */ u8 *unk4; }; + +void sub_8001B88(s32 param_1,u32 *param_2,u32 *param_3); +void ScenarioCalc(s16 param_1, s32 param_2, s32 param_3); +bool8 sub_8001CC4(s16 param_1, u32 param_2, s32 param_3); +bool8 sub_8001D08(s16 param_1, u32 param_2, s32 param_3); +bool8 sub_8001D44(s16 param_1, u32 param_2, s32 param_3); +void sub_8001D88(void); +u32 _FlagCalc(s32 param_1, s32 param_2, u32 operation); +u8 _FlagJudge(s32 param_1, s32 param_2, u32 operation); +u32 FlagCalc(s32 r0, s32 r1, u32 operation); +void sub_800226C(u32 param_1, s16 param_2, s32 param_3, u32 operation); +void sub_80022A0(u32 param_1, s16 param_2, s16 param_3, u32 operation); +u8 FlagJudge(s32 r0, s32 r1, u32 operation); +u8 sub_80022F8(u32 param_1, s16 param_2, s32 param_3, u32 operation); +u8 sub_8002318(u32 param_1, s16 param_2, s16 param_3, u32 operation); +bool8 sub_80023E4(u32 param_1); +u8 sub_8002658(s16 param_1); +s16 sub_8002694(u8 param_1); bool8 sub_80026CC(s16 r0); void sub_80026E8(s16 r0); bool8 sub_8002700(void *r0); bool8 sub_8002718(u8 *r0); -void sub_8002758(u32 *r0); +void sub_8002758(s32 r0); u8 sub_800276C(void); #endif // GUARD_EVENT_FLAG_H diff --git a/ld_script.txt b/ld_script.txt index 1a52aceb2..f36a2857b 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -47,8 +47,6 @@ SECTIONS { asm/code_2.o(.text); src/code.o(.text); asm/event_flag.o(.text); - src/event_flag_1.o(.text); - asm/event_flag_1.o(.text); src/event_flag.o(.text); asm/code_8002774.o(.text); src/memory.o(.text); diff --git a/src/code.c b/src/code.c index 348465b0d..03d146058 100644 --- a/src/code.c +++ b/src/code.c @@ -1,4 +1,5 @@ #include "global.h" +#include "event_flag.h" extern void xxx_dungeon_8042F6C(u32 r0); extern void NDS_LoadOverlay_GroundMain(); @@ -49,7 +50,6 @@ struct unkStruct_80B7394 }; extern struct unkStruct_80B7394 gUnknown_80B7394[]; -void ScenarioCalc(s16 param_1,s32 param_2,s32 param_3); extern void sub_80015C0(u32, u32); extern void sub_800199C(u32, s32, u32, s32); extern void sub_80018D8(u32, u32, u32); diff --git a/src/code_80972F4.c b/src/code_80972F4.c index b3c2e5e9f..483f96218 100644 --- a/src/code_80972F4.c +++ b/src/code_80972F4.c @@ -5,6 +5,7 @@ #include "code_80958E8.h" #include "dungeon.h" #include "exclusive_pokemon.h" +#include "event_flag.h" struct MissionText { @@ -23,10 +24,7 @@ extern const u8 gDummyScenarioText[]; extern u8 sub_80A270C(s16); extern u8 sub_80A2728(s16); -extern bool8 sub_8001D08(u32, u32 ,s32); -extern u32 sub_8001784(u32, u32, u16); extern void sub_800199C(u8, u8, u16, s32); -extern bool8 sub_80023E4(u32); void SaveWonderMail(struct unkStruct_8094924 *a, struct WonderMail *b); void RestoreWonderMail(struct unkStruct_8094924 *a, struct WonderMail *b); diff --git a/src/event_flag.c b/src/event_flag.c index 06f8fd97d..14d353fc9 100644 --- a/src/event_flag.c +++ b/src/event_flag.c @@ -1,11 +1,18 @@ #include "global.h" +#include "constants/friend_area.h" +#include "constants/item.h" +#include "item.h" #include "event_flag.h" +#include "debug.h" #include "memory.h" #include "friend_area.h" +#include "rescue_team_info.h" +#include "other_random.h" +#include "friend_area.h" +#include "team_inventory.h" -extern void sub_800226C(u8 r0, u8 r1, u32* r2, u8 u3); -extern void sub_800160C(struct UnkEventStruct *r0, u32 r1, u32 r2); -extern u8 sub_8002658(s16); + +extern u8 gUnknown_2000A88[0x400]; struct unkEventStruct { @@ -16,7 +23,557 @@ struct unkEventStruct extern struct unkEventStruct gUnknown_80B71E4[58]; -extern u8 gUnknown_2000A88[0x400]; +struct unkStruct_80B6D90 +{ + u8 *text; + s32 num; +}; +extern struct unkStruct_80B6D90 gUnknown_80B6D90[]; + +extern u8 gUnknown_80B735C[]; +extern u32 gUnknown_80B7350; +extern u8 gUnknown_80B7324[]; +extern u32 gUnknown_80B7318; +extern u8 gUnknown_80B72CC[]; +extern u8 gUnknown_80B7144[]; +extern u8 *gUnknown_80B71A0[]; +extern u8 *gUnknown_80B714C[]; +extern u8 gUnknown_80B7388[]; +extern u8 gUnknown_80B7378[]; + +void FatalError(u32 *, const char *, ...) __attribute__((noreturn)); +extern u8 sub_80973F4(u32); +extern bool8 HasCompletedAllMazes(void); +extern void sub_8097418(u32, u32); +extern void sub_800160C(struct UnkEventStruct *r0, u32 r1, u32 r2); +extern u8 sub_8002658(s16); +extern u32 sub_8001658(u32, s32); +extern void sub_80018D8(u32, u32, u32); +extern void sub_809733C(u32, u32); +extern void sub_80973A8(u32, u32); +extern u8 HasRecruitedMon(u32); +extern void sub_80976F8(u32); +extern void sub_800199C(u32, s32, u32, s32); +extern s32 sub_8001784(u32, s32, u16); + +u8 *sub_8001A74(s16 param_1) +{ + struct UnkEventStruct local_1c; + + sub_800160C(&local_1c,0,param_1); + return local_1c.unk4; +} + +s16 sub_8001A90(s16 param_1) +{ + struct UnkEventStruct local_1c; + + sub_800160C(&local_1c,0,param_1); + return local_1c.unk0[4]; +} + +s32 sub_8001AB0(s32 param_1, s16 param_2) +{ + s32 counter; + s32 total; + struct UnkEventStruct local_1c; + s32 param_2_s32; + + param_2_s32 = param_2; + + total = 0; + sub_800160C(&local_1c, 0, param_2_s32); + for(counter = 0; counter < local_1c.unk0[4]; counter++) + { + total += sub_8001784(param_1, param_2_s32, counter); + } + return total; +} + +void sub_8001AF8(s16 param_1, u8 *param_2, s32 param_3) +{ + u8 *r1; + s32 r2; + u8 r0; + struct UnkEventStruct local_10; + + sub_800160C(&local_10,0,param_1); + for (r1 = local_10.unk4, r2 = 0; r2 < param_3; r2++) { + r0 = *r1; + if (*r1++ == 0) break; + *param_2 = r0; + param_2++; + } + *param_2 = 0; +} + +void sub_8001B34(s16 param_1,u32 param_2,s32 param_3) +{ + u8 *r1; + s32 r2; + u8 r0; + struct UnkEventStruct local_10; + + sub_800160C(&local_10,0,param_1); + for (r1 = local_10.unk4, r2 = 0; r2 < param_3; r1++, r2++) { + r0 = *r1; + if (*r1++ == 0) break; + *r1 = r0; + } + if (r2 < local_10.unk0[4]) { + for(; r2 < local_10.unk0[4]; r1++, r2++) + { + *r1 = 0; + } + } +} + +void sub_8001B88(s32 param_1,u32 *param_2,u32 *param_3) +{ + *param_2 = sub_8001784(0, (s16)param_1, 0); + *param_3 = sub_8001784(0, (s16)param_1, 1); +} + +void ScenarioCalc(s16 param_1,s32 param_2,s32 param_3) +{ + s32 param_1_s32; + u32 local_18; + u32 local_14; + + param_1_s32 = param_1; + sub_8001B88(param_1_s32,&local_18,&local_14); + Log(6,gUnknown_80B72CC,param_1_s32,local_18,local_14,param_2,param_3); // SCENARIO CALC [%3d] %4d %4d -> %4d %4d + if ((param_1_s32 == 3) && ((param_2 != local_18 || (param_3 != local_14)))) { + sub_80018D8(0,0x19,0); + } + sub_800199C(0,param_1_s32,0,param_2); + sub_800199C(0,param_1_s32,1,param_3); + + switch(param_1_s32) + { + case 3: + if (((u32)(param_2 - 1) < 0x1b)) { + if (sub_8001D44(3,8,-1)) { + sub_80976F8(0); + } + if (sub_8001D44(3,0xb,3)) { + sub_80976F8(1); + } + if (sub_8001D44(3,0x11,0)) { + sub_80976F8(2); + } + } + break; + case 4: + if (sub_8001CC4(4,0x1f,0) == 0) { + sub_80976F8(4); + } + if (sub_8001CC4(4,0x20,0) == 0) { + sub_80976F8(5); + } + break; + case 0xC: + if(sub_8001CC4(0xc,0x37,2) == 0) { + sub_80976F8(3); + } + break; + } +} + +bool8 sub_8001CC4(s16 param_1,u32 param_2,s32 param_3) +{ + s32 uVar1; + s32 iVar2; + + uVar1 = sub_8001784(0,param_1,0); + iVar2 = sub_8001784(0,param_1,1); + if ((uVar1 != 0x3a) && + (uVar1 < param_2 || (param_3 >= 0 && (uVar1 == param_2) && (iVar2 < param_3)))) { + return TRUE; + } + else { + return FALSE; + } +} + +bool8 sub_8001D08(s16 param_1,u32 param_2,s32 param_3) +{ + s32 uVar1; + s32 iVar2; + + uVar1 = sub_8001784(0, param_1, 0); + iVar2 = sub_8001784(0, param_1, 1); + if (((uVar1 == param_2 && (((param_3 < 0) || (iVar2 == param_3)))))) { + return TRUE; + } + else { + return FALSE; + } +} + +bool8 sub_8001D44(s16 param_1,u32 param_2,s32 param_3) +{ + s32 uVar1; + s32 iVar2; + + uVar1 = sub_8001784(0, param_1, 0); + iVar2 = sub_8001784(0, param_1, 1); + if ((uVar1 != 0x3a) && + ((uVar1 > param_2 || (((param_3 >= 0 && (uVar1 == param_2)) && (iVar2 > param_3)))))) { + return TRUE; + } + else { + return FALSE; + } +} + +void sub_8001D88(void) +{ + u32 local_c; + u32 auStack8; + + sub_8001B88(3, &auStack8, &local_c); + if (auStack8 - 1 < 0x1b) { + if (sub_8001CC4(4,0x1f,0) != 0) { + if (sub_8001D44(3,0xf,7) != 0) { + ScenarioCalc(4,0x1f,0); + sub_8097418(0xe,1); + sub_80018D8(0,0x28,2); + } + else { + if ((sub_8001D08(4,0,0)) && (sub_8001D44(3,0xf,3))) { + ScenarioCalc(4,0x1d,1); + } + } + } + if ((sub_8001D08(4,0x1f,0)) && (GetFriendAreaStatus(SKY_BLUE_PLAINS))) { + ScenarioCalc(4,0x1f,1); + sub_809733C(0xf,1); + } + if (auStack8 > 0x11) { + sub_80973A8(0x25,1); + if (((FindItemInInventory(ITEM_HM_DIVE) != -1) || (gTeamInventory_203B460->teamStorage[ITEM_HM_DIVE] != 0)) || + (sub_8001D44(5,0x21,3) != 0)) { + sub_80973A8(0x22,1); + } + if (GetFriendAreaStatus(FURNACE_DESERT) != 0) { + sub_80973A8(0x1f,1); + } + if (GetFriendAreaStatus(BOULDER_CAVE)) { + sub_80973A8(0x20,1); + } + if (GetFriendAreaStatus(DRAGON_CAVE)) { + sub_80973A8(0x21,1); + } + if (GetFriendAreaStatus(SECRETIVE_FOREST)) { + sub_80973A8(0x23,1); + } + if (GetFriendAreaStatus(SERENE_SEA)) { + sub_80973A8(0x24,1); + sub_80973A8(0x28,1); + } + if ((GetFriendAreaStatus(AGED_CHAMBER_AN)) && (GetFriendAreaStatus(AGED_CHAMBER_O_EXCLAIM))) { + sub_80973A8(0x26,1); + } + if (sub_8001D08(5,0,0)) { + ScenarioCalc(5,0x21,1); + } + if ((FindItemInInventory(ITEM_HM_SURF) != -1) || (gTeamInventory_203B460->teamStorage[ITEM_HM_SURF] != 0)) { + if (sub_8001D08(7,0,0)) { + ScenarioCalc(7,0x26,1); + } + if ((sub_8001D08(9,0,0)) && (GetFriendAreaStatus(SOUTHERN_ISLAND))) { + ScenarioCalc(9,0x2e,1); + } + } + if (!sub_8001CC4(9,0x30,0)) { + if ((sub_8001D08(5,0x22,0)) && HasRecruitedMon(MONSTER_ARTICUNO) && HasRecruitedMon(MONSTER_ZAPDOS) && HasRecruitedMon(MONSTER_MOLTRES)) { + ScenarioCalc(5,0x22,1); + } + if (((sub_8001D08(0xb,0,0)) && (sub_8001D44(5,0x21,3) != 0)) && + (GetFriendAreaStatus(SKY_BLUE_PLAINS))) { + ScenarioCalc(0xb,0x33,1); + } + if (GetFriendAreaStatus(SKY_BLUE_PLAINS)) { + sub_80973A8(0x27,1); + } + if (GetFriendAreaStatus(SKY_BLUE_PLAINS)) { + sub_80973A8(0x29,1); + } + } + if (!sub_8001CC4(5,0x22,0)) { + if (sub_8001D08(10,0,0)) { + ScenarioCalc(10,0x31,1); + sub_809733C(0x1b,1); + } + if ((sub_8001D08(0xc,0,0)) && (!sub_8001CC4(0xb,0x34,0))) { + ScenarioCalc(0xc,0x35,1); + } + } + if ((sub_8001D08(6,0,0)) && (HasRecruitedMon(MONSTER_LUGIA))) { + ScenarioCalc(6,0x24,1); + } + if ((sub_8001D08(8,0,0)) && (HasRecruitedMon(MONSTER_HO_OH))) { + ScenarioCalc(8,0x2c,1); + } + } + } +} + +u32 _FlagCalc(s32 param_1, s32 param_2, u32 operation) +{ + switch(operation) { + case 0: + return param_2; + case 1: + return param_1 - param_2; + case 2: + return param_1 + param_2; + case 3: + return param_1 * param_2; + case 4: + return param_1 / param_2; + case 5: + return param_1 % param_2; + case 6: + return param_1 & param_2; + case 7: + return param_1 | param_2; + case 8: + return param_1 ^ param_2; + case 9: + return (1 << param_2) | param_1; + case 10: + return param_1 & ~(1 << param_2); + case 0xb: + return OtherRandInt(param_2); + default: + FatalError(&gUnknown_80B7318,gUnknown_80B7324, operation); // event flag expansion error %d + } +} + +u8 _FlagJudge(s32 param_1, s32 param_2, u32 operation) +{ + switch(operation) { + case 0: + return 1; + case 1: + return 0; + case 2: + return param_1 == param_2; + case 7: + return param_1 != param_2; + case 3: + return param_1 > param_2; + case 5: + return param_1 >= param_2; + case 4: + return param_1 < param_2; + case 6: + return param_1 <= param_2; + case 8: + return (param_1 & param_2) != 0; + case 9: + return (param_1 ^ param_2) != 0; + case 10: + return param_1 >> (param_2) & 1; + default: + FatalError(&gUnknown_80B7350,gUnknown_80B735C, operation); // event flag rule error %d + } +} + +u32 FlagCalc(s32 r0, s32 r1, u32 operation) +{ + return _FlagCalc(r0, r1, operation); +} + +void sub_800226C(u32 param_1, s16 param_2, s32 param_3, u32 operation) +{ + u32 uVar1; + u32 uVar3; + + uVar1 = sub_8001658(param_1,param_2); + uVar3 = _FlagCalc(uVar1,param_3,operation); + sub_80018D8(param_1,param_2,uVar3); +} + +void sub_80022A0(u32 param_1, s16 param_2, s16 param_3, u32 operation) +{ + s32 uVar1; + s32 uVar2; + s32 uVar3; + + s32 param_2_s32 = param_2; + s32 param_3_s32 = param_3; + + + uVar1 = sub_8001658(param_1,param_2_s32); + uVar2 = sub_8001658(param_1,param_3_s32); + uVar3 = _FlagCalc(uVar1,uVar2,operation); + sub_80018D8(param_1,param_2_s32,uVar3); +} + +u8 FlagJudge(s32 r0, s32 r1, u32 operation) +{ + return _FlagJudge(r0, r1, operation); +} + +u8 sub_80022F8(u32 param_1, s16 param_2, s32 param_3, u32 operation) +{ + s32 uVar1; + + uVar1 = sub_8001658(param_1, param_2); + return _FlagJudge(uVar1,param_3,operation); +} + +u8 sub_8002318(u32 param_1, s16 param_2, s16 param_3, u32 operation) +{ + s32 uVar1; + s32 uVar2; + + s32 param_2_s32 = param_2; + s32 param_3_s32 = param_3; + + uVar1 = sub_8001658(param_1,param_2_s32); + uVar2 = sub_8001658(param_1,param_3_s32); + return _FlagJudge(uVar1,uVar2,operation); +} + +s32 sub_8002354(u32 param_1) +{ + if (param_1 < 0x3b) { + return gUnknown_80B6D90[param_1].num; + } + else { + return -1; + } +} + +u8 *sub_8002374(u32 param_1) +{ + if (param_1 < 0x3b) { + return gUnknown_80B6D90[param_1].text; + } + else { + return gUnknown_80B7378; + } +} + +// Unused +u8 *sub_8002394(u32 param_1) +{ + if (param_1 - 0x12 < 9) { + return gUnknown_80B714C[param_1 - 0x12]; + } + else if (param_1 == 0xf) { + return gUnknown_80B7388; // 1-1 + } + else { + return gUnknown_80B7144; // NONE + } +} + +// Unused +u8 *sub_80023C4(u32 param_1) +{ + if (param_1 < 4) { + return gUnknown_80B71A0[param_1]; // CISTART, CECONTINUE, CNLAST, CWEND + } + else { + return gUnknown_80B7144; // NONE + } +} + +bool8 sub_80023E4(u32 param_1) +{ + switch(param_1) { + case 0: + return sub_8001D44(3,2,-1); + case 1: + return sub_8001D44(3,3,3); + case 2: + return sub_8001D44(3,4,3); + case 3: + return sub_8001D44(3,5,0); + case 4: + return (sub_8001D44(3,0xb,0) && sub_8001CC4(3,0xd,0)); + case 5: + return (sub_8001D44(3,0xb,3) && sub_8001CC4(3,0xf,0)); + case 6: + return sub_8001D44(3,0x11,-1); + case 7: + return sub_8001D44(3,0x12,2); + case 8: + return sub_8001D44(3,0x12,3); + case 9: + return sub_8001D44(3,0x12,-1); + case 10: + return sub_8001D44(3,5,4); + case 0xb: + return sub_8001D44(3,5,4); + case 0xc: + return (!sub_8001D08(3,0xb,2) && !sub_8001D08(3,0xb,3)); + case 0xd: + return sub_8001D08(3,0x10,2); + case 0xe: + return !sub_8001CC4(3,5,7); + case 0xf: + return !sub_8001CC4(3,0xf,0); + case 0x10: + return sub_8001D44(3,7,-1); + case 0x11: + return sub_8001D44(3,0xc,-1); + case 0x12: + return sub_8001D44(3,0xd,-1); + case 0x13: + return sub_8001D44(3,0xf,-1); + case 0x14: + return sub_8001D44(3,0x10,-1); + case 0x15: + return sub_8001D44(5,0x21,-1); + case 0x16: + return sub_8001D44(5,0x22,-1); + case 0x17: + return sub_8001D44(6,0x24,-1); + case 0x18: + return sub_8001D44(7,0x2a,-1); + case 0x19: + return sub_8001D44(8,0x2c,-1); + case 0x1a: + return sub_8001D44(10,0x31,-1); + case 0x1b: + return sub_80973F4(0x29); + case 0x1c: + return GetRescueTeamRank() == LUCARIO_RANK; + case 0x1d: + return HasCompletedAllMazes(); + default: + return FALSE; + } +} + +u8 sub_8002658(s16 param_1) + +{ + short sVar1; + s32 param_1_s32; + struct unkEventStruct *ptr; + + param_1_s32 = param_1; + + ptr = gUnknown_80B71E4; + sVar1 = gUnknown_80B71E4[0].unk0; + if (sVar1 != -1) { + do { + if (sVar1 == param_1_s32) { + return ptr->unk2; + } + ptr++; + sVar1 = ptr->unk0; + } while (sVar1 != -1); + } + return 0; +} s16 sub_8002694(u8 param_1) { @@ -54,12 +611,12 @@ bool8 sub_8002718(u8 *r0) struct UnkEventStruct temp; sub_800160C(&temp, 0, 0); MemoryCopy8(gUnknown_2000A88, r0, 0x400); - if (temp.unk0[5] != temp.unk4[0]) + if (temp.unk0[5] != *(u32 *)temp.unk4) return 0; return 1; } -void sub_8002758(u32 *r0) +void sub_8002758(s32 r0) { sub_800226C(0, 0x1, r0, 0x9); } diff --git a/src/event_flag_1.c b/src/event_flag_1.c deleted file mode 100644 index 1bbdc201a..000000000 --- a/src/event_flag_1.c +++ /dev/null @@ -1,569 +0,0 @@ -#include "global.h" -#include "constants/friend_area.h" -#include "friend_area.h" -#include "item.h" -#include "debug.h" -#include "other_random.h" -#include "rescue_team_info.h" -#include "team_inventory.h" - -extern bool8 HasCompletedAllMazes(void); -extern u8 sub_80973F4(u32); -extern u8 _FlagJudge(s32, s32, u32); -extern u32 sub_8001658(u32, s32); -extern u32 _FlagCalc(s32, s32, u32); -extern void sub_80018D8(u32, u32, u32); -extern u8 HasRecruitedMon(u32); -extern void sub_809733C(u32, u32); -extern void sub_80973A8(u32, u32); -extern void sub_8097418(u32, u32); -extern s32 sub_8001784(u32, s32, u16); - -extern u8 gUnknown_80B7144[]; -extern u8 *gUnknown_80B71A0[]; -extern u8 *gUnknown_80B714C[]; -extern u8 gUnknown_80B7388[]; -extern u8 gUnknown_80B7378[]; - -struct unkStruct_80B6D90 -{ - u8 *text; - s32 num; -}; -extern struct unkStruct_80B6D90 gUnknown_80B6D90[]; - -extern u8 gUnknown_80B735C[]; -extern u32 gUnknown_80B7350; -extern u8 gUnknown_80B7324[]; -extern u32 gUnknown_80B7318; -extern u8 gUnknown_80B72CC[]; - -extern void sub_80976F8(u32); -extern void sub_800199C(u32, s32, u32, s32); -bool8 sub_8001CC4(u32 param_1,u32 param_2,s32 param_3); -bool8 sub_8001D44(u32 param_1,u32 param_2,s32 param_3); - -void FatalError(u32 *, const char *, ...) __attribute__((noreturn)); - - -// TODO: rectify with UnkEventStruct -struct UnkEventStruct2_sub -{ - /* 0x0 */ s16 *unk0; - u32 fill4; - s16 unk8; -}; - -struct UnkEventStruct2 -{ - /* 0x0 */ struct UnkEventStruct2_sub *unk0; - /* 0x4 */ u8 *unk4; -}; - - -extern void sub_800160C(struct UnkEventStruct2 *r0, u32 r1, s32 r2); - - -u8 *sub_8001A74(s16 param_1) -{ - struct UnkEventStruct2 local_1c; - - sub_800160C(&local_1c,0,param_1); - return local_1c.unk4; -} - -s16 sub_8001A90(s16 param_1) -{ - struct UnkEventStruct2 local_1c; - - sub_800160C(&local_1c,0,param_1); - return local_1c.unk0->unk8; -} - -s32 sub_8001AB0(s32 param_1,s16 param_2) -{ - s32 iVar1; - s32 counter; - s32 total; - struct UnkEventStruct2 local_1c; - s32 param_2_s32; - - param_2_s32 = param_2; - - total = 0; - sub_800160C(&local_1c,0,param_2_s32); - counter = 0; - if (counter < local_1c.unk0->unk8) { - for(; counter < local_1c.unk0->unk8; counter++) - { - iVar1 = sub_8001784(param_1, param_2_s32, counter); - total += iVar1; - } - } - return total; -} - -void sub_8001AF8(s16 param_1, u8 *param_2, s32 param_3) -{ - u8 *r1; - s32 r2; - u8 r0; - struct UnkEventStruct2 local_10; - - sub_800160C(&local_10,0,param_1); - for (r1 = local_10.unk4, r2 = 0; r2 < param_3; r2++) { - r0 = *r1; - if (*r1++ == 0) break; - *param_2 = r0; - param_2++; - } - *param_2 = 0; -} - -void sub_8001B34(s16 param_1,u32 param_2,s32 param_3) -{ - u8 *r1; - s32 r2; - u8 r0; - struct UnkEventStruct2 local_10; - - sub_800160C(&local_10,0,param_1); - for (r1 = local_10.unk4, r2 = 0; r2 < param_3; r1++, r2++) { - r0 = *r1; - if (*r1++ == 0) break; - *r1 = r0; - } - if (r2 < local_10.unk0->unk8) { - for(; r2 < local_10.unk0->unk8; r1++, r2++) - { - *r1 = 0; - } - } -} - -void sub_8001B88(s32 param_1,u32 *param_2,u32 *param_3) -{ - *param_2 = sub_8001784(0, (s16)param_1, 0); - *param_3 = sub_8001784(0, (s16)param_1, 1); -} - -void ScenarioCalc(s16 param_1,s32 param_2,s32 param_3) -{ - s32 param_1_s32; - u32 local_18; - u32 local_14; - - param_1_s32 = param_1; - sub_8001B88(param_1_s32,&local_18,&local_14); - Log(6,gUnknown_80B72CC,param_1_s32,local_18,local_14,param_2,param_3); // SCENARIO CALC [%3d] %4d %4d -> %4d %4d - if ((param_1_s32 == 3) && ((param_2 != local_18 || (param_3 != local_14)))) { - sub_80018D8(0,0x19,0); - } - sub_800199C(0,param_1_s32,0,param_2); - sub_800199C(0,param_1_s32,1,param_3); - - switch(param_1_s32) - { - case 3: - if (((u32)(param_2 - 1) < 0x1b)) { - if (sub_8001D44(3,8,-1)) { - sub_80976F8(0); - } - if (sub_8001D44(3,0xb,3)) { - sub_80976F8(1); - } - if (sub_8001D44(3,0x11,0)) { - sub_80976F8(2); - } - } - break; - case 4: - if (sub_8001CC4(4,0x1f,0) == 0) { - sub_80976F8(4); - } - if (sub_8001CC4(4,0x20,0) == 0) { - sub_80976F8(5); - } - break; - case 0xC: - if(sub_8001CC4(0xc,0x37,2) == 0) { - sub_80976F8(3); - } - break; - } -} - -bool8 sub_8001CC4(u32 param_1,u32 param_2,s32 param_3) -{ - s32 uVar1; - s32 iVar2; - - uVar1 = sub_8001784(0,(s16)param_1,0); - iVar2 = sub_8001784(0,(s16)param_1,1); - if ((uVar1 != 0x3a) && - (uVar1 < param_2 || (param_3 >= 0 && (uVar1 == param_2) && (iVar2 < param_3)))) { - return TRUE; - } - else { - return FALSE; - } -} - -bool8 sub_8001D08(u32 param_1,u32 param_2,s32 param_3) -{ - s32 uVar1; - s32 iVar2; - - uVar1 = sub_8001784(0, (s16)param_1, 0); - iVar2 = sub_8001784(0, (s16)param_1, 1); - if (((uVar1 == param_2 && (((param_3 < 0) || (iVar2 == param_3)))))) { - return TRUE; - } - else { - return FALSE; - } -} - -bool8 sub_8001D44(u32 param_1,u32 param_2,s32 param_3) -{ - s32 uVar1; - s32 iVar2; - - uVar1 = sub_8001784(0, (s16)param_1, 0); - iVar2 = sub_8001784(0, (s16)param_1, 1); - if ((uVar1 != 0x3a) && - ((uVar1 > param_2 || (((param_3 >= 0 && (uVar1 == param_2)) && (iVar2 > param_3)))))) { - return TRUE; - } - else { - return FALSE; - } -} - -void sub_8001D88(void) -{ - u32 local_c; - u32 auStack8; - - sub_8001B88(3, &auStack8, &local_c); - if (auStack8 - 1 < 0x1b) { - if (sub_8001CC4(4,0x1f,0) != 0) { - if (sub_8001D44(3,0xf,7) != 0) { - ScenarioCalc(4,0x1f,0); - sub_8097418(0xe,1); - sub_80018D8(0,0x28,2); - } - else { - if ((sub_8001D08(4,0,0)) && (sub_8001D44(3,0xf,3))) { - ScenarioCalc(4,0x1d,1); - } - } - } - if ((sub_8001D08(4,0x1f,0)) && (GetFriendAreaStatus(SKY_BLUE_PLAINS))) { - ScenarioCalc(4,0x1f,1); - sub_809733C(0xf,1); - } - if (auStack8 > 0x11) { - sub_80973A8(0x25,1); - if (((FindItemInInventory(ITEM_HM_DIVE) != -1) || (gTeamInventory_203B460->teamStorage[ITEM_HM_DIVE] != 0)) || - (sub_8001D44(5,0x21,3) != 0)) { - sub_80973A8(0x22,1); - } - if (GetFriendAreaStatus(FURNACE_DESERT) != 0) { - sub_80973A8(0x1f,1); - } - if (GetFriendAreaStatus(BOULDER_CAVE)) { - sub_80973A8(0x20,1); - } - if (GetFriendAreaStatus(DRAGON_CAVE)) { - sub_80973A8(0x21,1); - } - if (GetFriendAreaStatus(SECRETIVE_FOREST)) { - sub_80973A8(0x23,1); - } - if (GetFriendAreaStatus(SERENE_SEA)) { - sub_80973A8(0x24,1); - sub_80973A8(0x28,1); - } - if ((GetFriendAreaStatus(AGED_CHAMBER_AN)) && (GetFriendAreaStatus(AGED_CHAMBER_O_EXCLAIM))) { - sub_80973A8(0x26,1); - } - if (sub_8001D08(5,0,0)) { - ScenarioCalc(5,0x21,1); - } - if ((FindItemInInventory(ITEM_HM_SURF) != -1) || (gTeamInventory_203B460->teamStorage[ITEM_HM_SURF] != 0)) { - if (sub_8001D08(7,0,0)) { - ScenarioCalc(7,0x26,1); - } - if ((sub_8001D08(9,0,0)) && (GetFriendAreaStatus(SOUTHERN_ISLAND))) { - ScenarioCalc(9,0x2e,1); - } - } - if (!sub_8001CC4(9,0x30,0)) { - if ((sub_8001D08(5,0x22,0)) && HasRecruitedMon(MONSTER_ARTICUNO) && HasRecruitedMon(MONSTER_ZAPDOS) && HasRecruitedMon(MONSTER_MOLTRES)) { - ScenarioCalc(5,0x22,1); - } - if (((sub_8001D08(0xb,0,0)) && (sub_8001D44(5,0x21,3) != 0)) && - (GetFriendAreaStatus(SKY_BLUE_PLAINS))) { - ScenarioCalc(0xb,0x33,1); - } - if (GetFriendAreaStatus(SKY_BLUE_PLAINS)) { - sub_80973A8(0x27,1); - } - if (GetFriendAreaStatus(SKY_BLUE_PLAINS)) { - sub_80973A8(0x29,1); - } - } - if (!sub_8001CC4(5,0x22,0)) { - if (sub_8001D08(10,0,0)) { - ScenarioCalc(10,0x31,1); - sub_809733C(0x1b,1); - } - if ((sub_8001D08(0xc,0,0)) && (!sub_8001CC4(0xb,0x34,0))) { - ScenarioCalc(0xc,0x35,1); - } - } - if ((sub_8001D08(6,0,0)) && (HasRecruitedMon(MONSTER_LUGIA))) { - ScenarioCalc(6,0x24,1); - } - if ((sub_8001D08(8,0,0)) && (HasRecruitedMon(MONSTER_HO_OH))) { - ScenarioCalc(8,0x2c,1); - } - } - } -} - -u32 _FlagCalc(s32 param_1, s32 param_2, u32 operation) -{ - switch(operation) { - case 0: - return param_2; - case 1: - return param_1 - param_2; - case 2: - return param_1 + param_2; - case 3: - return param_1 * param_2; - case 4: - return param_1 / param_2; - case 5: - return param_1 % param_2; - case 6: - return param_1 & param_2; - case 7: - return param_1 | param_2; - case 8: - return param_1 ^ param_2; - case 9: - return (1 << param_2) | param_1; - case 10: - return param_1 & ~(1 << param_2); - case 0xb: - return OtherRandInt(param_2); - default: - FatalError(&gUnknown_80B7318,gUnknown_80B7324, operation); // event flag expansion error %d - } -} - -u8 _FlagJudge(s32 param_1, s32 param_2, u32 operation) -{ - switch(operation) { - case 0: - return 1; - case 1: - return 0; - case 2: - return param_1 == param_2; - case 7: - return param_1 != param_2; - case 3: - return param_1 > param_2; - case 5: - return param_1 >= param_2; - case 4: - return param_1 < param_2; - case 6: - return param_1 <= param_2; - case 8: - return (param_1 & param_2) != 0; - case 9: - return (param_1 ^ param_2) != 0; - case 10: - return param_1 >> (param_2) & 1; - default: - FatalError(&gUnknown_80B7350,gUnknown_80B735C, operation); // event flag rule error %d - } -} - -u32 FlagCalc(u32 r0, u32 r1, u32 operation) -{ - return _FlagCalc(r0, r1, operation); -} - -void sub_800226C(u32 param_1, s16 param_2, s32 param_3, u32 operation) -{ - u32 uVar1; - u32 uVar3; - - s32 param_2_s32 = param_2; - - - uVar1 = sub_8001658(param_1,param_2_s32); - uVar3 = _FlagCalc(uVar1,param_3,operation); - sub_80018D8(param_1,param_2_s32,uVar3); -} - -void sub_80022A0(u32 param_1, s16 param_2, s16 param_3, u32 operation) -{ - s32 uVar1; - s32 uVar2; - s32 uVar3; - - s32 param_2_s32 = param_2; - s32 param_3_s32 = param_3; - - - uVar1 = sub_8001658(param_1,param_2_s32); - uVar2 = sub_8001658(param_1,param_3_s32); - uVar3 = _FlagCalc(uVar1,uVar2,operation); - sub_80018D8(param_1,param_2_s32,uVar3); -} - -u8 FlagJudge(s32 r0, s32 r1, u32 operation) -{ - return _FlagJudge(r0, r1, operation); -} - -u8 sub_80022F8(u32 param_1, s16 param_2, s32 param_3, u32 operation) -{ - s32 uVar1; - - uVar1 = sub_8001658(param_1, param_2); - return _FlagJudge(uVar1,param_3,operation); -} - -u8 sub_8002318(u32 param_1, s16 param_2, s16 param_3, u32 operation) -{ - s32 uVar1; - s32 uVar2; - - s32 param_2_s32 = param_2; - s32 param_3_s32 = param_3; - - uVar1 = sub_8001658(param_1,param_2_s32); - uVar2 = sub_8001658(param_1,param_3_s32); - return _FlagJudge(uVar1,uVar2,operation); -} - -s32 sub_8002354(u32 param_1) -{ - if (param_1 < 0x3b) { - return gUnknown_80B6D90[param_1].num; - } - else { - return -1; - } -} - -u8 *sub_8002374(u32 param_1) -{ - if (param_1 < 0x3b) { - return gUnknown_80B6D90[param_1].text; - } - else { - return gUnknown_80B7378; - } -} - -// Unused -u8 *sub_8002394(u32 param_1) -{ - if (param_1 - 0x12 < 9) { - return gUnknown_80B714C[param_1 - 0x12U]; - } - else if (param_1 == 0xf) { - return gUnknown_80B7388; // 1-1 - } - else { - return gUnknown_80B7144; // NONE - } -} - -// Unused -u8 *sub_80023C4(u32 param_1) -{ - if (param_1 < 4) { - return gUnknown_80B71A0[param_1]; // CISTART, CECONTINUE, CNLAST, CWEND - } - else { - return gUnknown_80B7144; // NONE - } -} - -bool8 sub_80023E4(u32 param_1) -{ - switch(param_1) { - case 0: - return sub_8001D44(3,2,-1); - case 1: - return sub_8001D44(3,3,3); - case 2: - return sub_8001D44(3,4,3); - case 3: - return sub_8001D44(3,5,0); - case 4: - return (sub_8001D44(3,0xb,0) && sub_8001CC4(3,0xd,0)); - case 5: - return (sub_8001D44(3,0xb,3) && sub_8001CC4(3,0xf,0)); - case 6: - return sub_8001D44(3,0x11,-1); - case 7: - return sub_8001D44(3,0x12,2); - case 8: - return sub_8001D44(3,0x12,3); - case 9: - return sub_8001D44(3,0x12,-1); - case 10: - return sub_8001D44(3,5,4); - case 0xb: - return sub_8001D44(3,5,4); - case 0xc: - return (!sub_8001D08(3,0xb,2) && !sub_8001D08(3,0xb,3)); - case 0xd: - return sub_8001D08(3,0x10,2); - case 0xe: - return !sub_8001CC4(3,5,7); - case 0xf: - return !sub_8001CC4(3,0xf,0); - case 0x10: - return sub_8001D44(3,7,-1); - case 0x11: - return sub_8001D44(3,0xc,-1); - case 0x12: - return sub_8001D44(3,0xd,-1); - case 0x13: - return sub_8001D44(3,0xf,-1); - case 0x14: - return sub_8001D44(3,0x10,-1); - case 0x15: - return sub_8001D44(5,0x21,-1); - case 0x16: - return sub_8001D44(5,0x22,-1); - case 0x17: - return sub_8001D44(6,0x24,-1); - case 0x18: - return sub_8001D44(7,0x2a,-1); - case 0x19: - return sub_8001D44(8,0x2c,-1); - case 0x1a: - return sub_8001D44(10,0x31,-1); - case 0x1b: - return sub_80973F4(0x29); - case 0x1c: - return GetRescueTeamRank() == LUCARIO_RANK; - case 0x1d: - return HasCompletedAllMazes(); - default: - return FALSE; - } -} diff --git a/src/ground_main.c b/src/ground_main.c index a1ec4be11..6aae81407 100644 --- a/src/ground_main.c +++ b/src/ground_main.c @@ -3,6 +3,7 @@ #include "input.h" #include "debug.h" #include "code_80A26CC.h" +#include "event_flag.h" EWRAM_DATA u32 gUnknown_20398A8 = {0}; EWRAM_DATA u32 gUnknown_20398AC = {0}; @@ -68,7 +69,6 @@ extern void GroundEffect_Action(); extern s32 sub_8001658(u8, u8); extern s32 sub_8001784(u8, u8, u8); extern void sub_809CB8C(); -extern void sub_8001D88(); extern void sub_80015C0(u8, u8); extern void sub_80018D8(u8, u8, u32); extern void sub_800199C(u8, u8, u8, s32); @@ -77,13 +77,10 @@ extern void GeneratePelipperJobs(); extern void sub_80961B4(); extern void ClearAllItems_8091FB4(); extern const char *sub_80A2B18(s16); -extern bool8 sub_8001CC4(u8, u8, u8); extern void ChooseKecleonShopInventory(u32); -extern bool8 sub_80023E4(u32); extern void FadeOutAllMusic(u16); extern u8 sub_809C730(); extern s16 sub_80A2750(s16); -extern u8 sub_8001D44(u32, u32, s32); void sub_8098BDC(void) {