From e689fbaa42fabb893df00b72d5e411d5fd953610 Mon Sep 17 00:00:00 2001 From: robojumper Date: Fri, 25 Oct 2024 10:35:34 +0200 Subject: [PATCH 1/9] Flag managers WIP, broken after rebase --- config/SOUE01/splits.txt | 34 +-- config/SOUE01/symbols.txt | 144 ++++----- configure.py | 8 +- include/libc.h | 1 - include/toBeSorted/file_manager.h | 9 +- include/toBeSorted/flag_space.h | 10 +- include/toBeSorted/item_story_flag_manager.h | 96 +++++- include/toBeSorted/misc_flag_managers.h | 10 +- include/toBeSorted/unk_flag_stuff.h | 4 +- src/toBeSorted/file_manager.cpp | 4 +- .../bitwise_flag_helper.inc} | 0 .../dungeonflag_manager.inc} | 6 +- .../flag_managers/flag_managers.cpp | 289 ++++++++++++++++++ src/toBeSorted/flag_managers/flag_space.inc | 34 +++ .../misc_flag_managers.inc} | 2 +- .../sceneflag_manager.inc} | 0 .../skipflag_manager.inc} | 4 +- .../unk_flag_stuff.inc} | 4 +- src/toBeSorted/flag_space.cpp | 34 --- 19 files changed, 529 insertions(+), 164 deletions(-) rename src/toBeSorted/{bitwise_flag_helper.cpp => flag_managers/bitwise_flag_helper.inc} (100%) rename src/toBeSorted/{dungeonflag_manager.cpp => flag_managers/dungeonflag_manager.inc} (95%) create mode 100644 src/toBeSorted/flag_managers/flag_managers.cpp create mode 100644 src/toBeSorted/flag_managers/flag_space.inc rename src/toBeSorted/{misc_flag_managers.cpp => flag_managers/misc_flag_managers.inc} (98%) rename src/toBeSorted/{sceneflag_manager.cpp => flag_managers/sceneflag_manager.inc} (100%) rename src/toBeSorted/{skipflag_manager.cpp => flag_managers/skipflag_manager.inc} (95%) rename src/toBeSorted/{unk_flag_stuff.cpp => flag_managers/unk_flag_stuff.inc} (92%) delete mode 100644 src/toBeSorted/flag_space.cpp diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 44b2c993..be7224f0 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -199,35 +199,11 @@ d/d_text_writer.cpp: toBeSorted/time_area_mgr.cpp: .text start:0x800B9280 end:0x800BB2A0 -toBeSorted/sceneflag_manager.cpp: - .text start:0x800BD8C0 end:0x800BE7A8 - .sbss start:0x805753E0 end:0x805753F0 - .bss start:0x805A78D0 end:0x805A7AD8 - -toBeSorted/misc_flag_managers.cpp: - .text start:0x800BE7B0 end:0x800BEE00 - .data start:0x80510CDC end:0x80510D04 - .sbss start:0x805753F0 end:0x805753FC - .bss start:0x805A7AD8 end:0x805A9AD8 - -toBeSorted/flag_space.cpp: - .text start:0x800BEE00 end:0x800BEF90 - .data start:0x80510D04 end:0x80510D10 - -toBeSorted/unk_flag_stuff.cpp: - .text start:0x800BEF90 end:0x800BF200 - -toBeSorted/bitwise_flag_helper.cpp: - .text start:0x800BF200 end:0x800BF264 - -toBeSorted/dungeonflag_manager.cpp: - .text start:0x800BF8D0 end:0x800BFB9C - .bss start:0x805A9C58 end:0x805A9C68 - -toBeSorted/skipflag_manager.cpp: - .text start:0x800BFBA0 end:0x800BFE00 - .sbss start:0x80575408 end:0x8057540C - .bss start:0x805A9C68 end:0x805A9C88 +toBeSorted/flag_managers/flag_managers.cpp: + .text start:0x800BD8C0 end:0x800C0650 + .data start:0x80510B88 end:0x80510D10 + .sbss start:0x805753E0 end:0x80575410 + .bss start:0x805A78D0 end:0x805A9C88 toBeSorted/special_item_drop_mgr.cpp: .text start:0x800C7B60 end:0x800C82B0 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 0e95e2d9..7f508863 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -4107,7 +4107,7 @@ doCommit__15TBoxFlagManagerFv = .text:0x800BE810; // type:function size:0x58 checkUncommittedFlag__15TBoxFlagManagerFUs = .text:0x800BE870; // type:function size:0x68 __ct__15TBoxFlagManagerFv = .text:0x800BE8E0; // type:function size:0x40 init__15TBoxFlagManagerFv = .text:0x800BE920; // type:function size:0x4 -copyFromSave__15TBoxFlagManagerFs = .text:0x800BE930; // type:function size:0x5C +copyFromSave__15TBoxFlagManagerFUl = .text:0x800BE930; // type:function size:0x5C checkFlag__15TBoxFlagManagerFUsUs = .text:0x800BE990; // type:function size:0x94 getFlagCount__15TBoxFlagManagerCFv = .text:0x800BEA30; // type:function size:0x8 setFlag__15TBoxFlagManagerFUs = .text:0x800BEA40; // type:function size:0x80 @@ -4122,56 +4122,56 @@ checkIsValidFlag__18EnemyDefeatManagerFUs = .text:0x800BEC90; // type:function s checkFlag__18EnemyDefeatManagerFUs = .text:0x800BECB0; // type:function size:0xA0 getFlagCount__18EnemyDefeatManagerCFv = .text:0x800BED50; // type:function size:0x8 setFlag__18EnemyDefeatManagerFUs = .text:0x800BED60; // type:function size:0x94 -getFlagPtrChecked__9FlagSpaceFv = .text:0x800BEE00; // type:function size:0x3C -getFlagPtrUnchecked__9FlagSpaceFv = .text:0x800BEE40; // type:function size:0x8 +getFlagPtrChecked__9FlagSpaceCFv = .text:0x800BEE00; // type:function size:0x3C +getFlagPtrUnchecked__9FlagSpaceCFv = .text:0x800BEE40; // type:function size:0x8 unsetAll__9FlagSpaceFv = .text:0x800BEE50; // type:function size:0xC setAllToZero__9FlagSpaceFUsUs = .text:0x800BEE60; // type:function size:0x68 -copyFromSaveFile2__9FlagSpaceFPUsUsUs = .text:0x800BEED0; // type:function size:0x7C -copyFromSaveFile__9FlagSpaceFPUsUsUs = .text:0x800BEF50; // type:function size:0x20 -filemanagerCheck__9FlagSpaceFv = .text:0x800BEF70; // type:function size:0x20 -calculateMask__12UnkFlagStuffFi = .text:0x800BEF90; // type:function size:0x18 +copyFromSaveFile2__9FlagSpaceFPCUsUsUs = .text:0x800BEED0; // type:function size:0x7C +copyFromSaveFile__9FlagSpaceFPCUsUsUs = .text:0x800BEF50; // type:function size:0x20 +filemanagerCheck__9FlagSpaceCFv = .text:0x800BEF70; // type:function size:0x20 +calculateMask__12UnkFlagStuffFl = .text:0x800BEF90; // type:function size:0x18 doNothing__12UnkFlagStuffFUl = .text:0x800BEFB0; // type:function size:0x4 __ct__12UnkFlagStuffFUsP17UnkFlagDefinition = .text:0x800BEFC0; // type:function size:0xC prepareIndexShiftMask__12UnkFlagStuffFUsUlPUsPUcPUs = .text:0x800BEFD0; // type:function size:0x80 -maskForIdx__12UnkFlagStuffFUs = .text:0x800BF050; // type:function size:0x50 -getCounterOrFlag__12UnkFlagStuffFUsPUsUl = .text:0x800BF0A0; // type:function size:0x68 +maskForIdx__12UnkFlagStuffFUsUs = .text:0x800BF050; // type:function size:0x50 +getCounterOrFlag__12UnkFlagStuffFUsPCUsUl = .text:0x800BF0A0; // type:function size:0x68 setCounterOrFlag__12UnkFlagStuffFUsPUsUlUl = .text:0x800BF110; // type:function size:0x9C checkFlagValid__12UnkFlagStuffFUsUl = .text:0x800BF1B0; // type:function size:0x50 checkFlag__17BitwiseFlagHelperFUsUsPCUsUs = .text:0x800BF200; // type:function size:0x14 setFlag__17BitwiseFlagHelperFUsUsPUsUs = .text:0x800BF220; // type:function size:0x20 unsetFlag__17BitwiseFlagHelperFUsUsPUsUs = .text:0x800BF240; // type:function size:0x24 -ItemStoryManagerBase__ctor = .text:0x800BF270; // type:function size:0x28 -fn_800BF2A0 = .text:0x800BF2A0; // type:function size:0x70 -fn_800BF310 = .text:0x800BF310; // type:function size:0xC -setupUnkFlagStuff = .text:0x800BF320; // type:function size:0x60 -StoryflagManager__copyFromSave = .text:0x800BF380; // type:function size:0x58 -ItemStoryManagerBase__init = .text:0x800BF3E0; // type:function size:0x88 -fn_800BF470 = .text:0x800BF470; // type:function size:0x4 -StoryflagManager__getCounterOrFlag = .text:0x800BF480; // type:function size:0x58 -fn_800BF4E0 = .text:0x800BF4E0; // type:function size:0x50 -fn_800BF530 = .text:0x800BF530; // type:function size:0x78 -StoryflagManager__setFlagTo1 = .text:0x800BF5B0; // type:function size:0x8 -StoryflagManager__setFlagTo0 = .text:0x800BF5C0; // type:function size:0x8 -StoryflagManager__setStoryflag = .text:0x800BF5D0; // type:function size:0x4 +__ct__20ItemStoryManagerBaseFv = .text:0x800BF270; // type:function size:0x28 +__dt__20ItemStoryManagerBaseFv = .text:0x800BF2A0; // type:function size:0x70 +setFlagSizes__20ItemStoryManagerBaseFUsUs = .text:0x800BF310; // type:function size:0xC +setupUnkFlagStuff__20ItemStoryManagerBaseFP17UnkFlagDefinitionUs = .text:0x800BF320; // type:function size:0x60 +copyFlagsFromSave_Priv__20ItemStoryManagerBaseFv = .text:0x800BF380; // type:function size:0x58 +init__20ItemStoryManagerBaseFv = .text:0x800BF3E0; // type:function size:0x88 +setFlagszptr__20ItemStoryManagerBaseFv = .text:0x800BF470; // type:function size:0x4 +getCounterOrFlag__20ItemStoryManagerBaseCFUs = .text:0x800BF480; // type:function size:0x58 +getUncommittedValue_Priv__20ItemStoryManagerBaseFUs = .text:0x800BF4E0; // type:function size:0x50 +setOrClearFlag__20ItemStoryManagerBaseFUsUs = .text:0x800BF530; // type:function size:0x78 +setFlag__20ItemStoryManagerBaseFUs = .text:0x800BF5B0; // type:function size:0x8 +unsetFlag__20ItemStoryManagerBaseFUs = .text:0x800BF5C0; // type:function size:0x8 +thunk_setOrClearFlag__20ItemStoryManagerBaseFUsUs = .text:0x800BF5D0; // type:function size:0x4 getFlag__20ItemStoryManagerBaseCFUs = .text:0x800BF5E0; // type:function size:0x4 -ItemflagManager__getUncommittedFlags = .text:0x800BF5F0; // type:function size:0x4 -fn_800BF600 = .text:0x800BF600; // type:function size:0x4 -fn_800BF610 = .text:0x800BF610; // type:function size:0x18 -fn_800BF630 = .text:0x800BF630; // type:function size:0x4 -fn_800BF640 = .text:0x800BF640; // type:function size:0x10 -fn_800BF650 = .text:0x800BF650; // type:function size:0x40 -fn_800BF690 = .text:0x800BF690; // type:function size:0x4 -StoryflagManager__ctor = .text:0x800BF6A0; // type:function size:0x5C -fn_800BF700 = .text:0x800BF700; // type:function size:0x3C -StoryflagManager__setupUnkFlagstuff = .text:0x800BF740; // type:function size:0x10 -fn_800BF750 = .text:0x800BF750; // type:function size:0x4 -fn_800BF760 = .text:0x800BF760; // type:function size:0x4C -StoryflagManager__setFlagTo02 = .text:0x800BF7B0; // type:function size:0x4 -ItemflagManager__ctor = .text:0x800BF7C0; // type:function size:0x5C -fn_800BF820 = .text:0x800BF820; // type:function size:0x3C -ItemflagManager__setupUnkFlagStuff = .text:0x800BF860; // type:function size:0x10 -fn_800BF870 = .text:0x800BF870; // type:function size:0x4 -fn_800BF880 = .text:0x800BF880; // type:function size:0x4C +getUncommittedValue__20ItemStoryManagerBaseFUs = .text:0x800BF5F0; // type:function size:0x4 +FUN_800bf600__20ItemStoryManagerBaseFUs = .text:0x800BF600; // type:function size:0x4 +FUN_800bf610__20ItemStoryManagerBaseFUs = .text:0x800BF610; // type:function size:0x18 +onDirty__20ItemStoryManagerBaseFv = .text:0x800BF630; // type:function size:0x4 +FUN_800bf640__20ItemStoryManagerBaseFUs = .text:0x800BF640; // type:function size:0x10 +doCommit_Priv__20ItemStoryManagerBaseFv = .text:0x800BF650; // type:function size:0x40 +FUN_800bf690__20ItemStoryManagerBaseFv = .text:0x800BF690; // type:function size:0x4 +__ct__16StoryFlagManagerFv = .text:0x800BF6A0; // type:function size:0x5C +copyFlagsFromSave__16StoryFlagManagerFv = .text:0x800BF700; // type:function size:0x3C +setupUnkFlagsStuff__16StoryFlagManagerFv = .text:0x800BF740; // type:function size:0x10 +onDirty__16StoryFlagManagerFv = .text:0x800BF750; // type:function size:0x4 +commit__16StoryFlagManagerFv = .text:0x800BF760; // type:function size:0x4C +unsetFlag__16StoryFlagManagerFUs = .text:0x800BF7B0; // type:function size:0x4 +__ct__15ItemFlagManagerFv = .text:0x800BF7C0; // type:function size:0x5C +copyFlagsFromSave__15ItemFlagManagerFv = .text:0x800BF820; // type:function size:0x3C +setupUnkFlagsStuff__15ItemFlagManagerFv = .text:0x800BF860; // type:function size:0x10 +onDirty__15ItemFlagManagerFv = .text:0x800BF870; // type:function size:0x4 +commit__15ItemFlagManagerFv = .text:0x800BF880; // type:function size:0x4C copyFromSave__18DungeonflagManagerFUs = .text:0x800BF8D0; // type:function size:0x54 setCommitFlag__18DungeonflagManagerFUs = .text:0x800BF930; // type:function size:0xC __ct__18DungeonflagManagerFv = .text:0x800BF940; // type:function size:0x3C @@ -4189,32 +4189,32 @@ thunk_copyFromSave__15SkipflagManagerFv = .text:0x800BFC40; // type:function siz setFlag__15SkipflagManagerFUs = .text:0x800BFC50; // type:function size:0xD0 checkFlag__15SkipflagManagerFUs = .text:0x800BFD20; // type:function size:0x68 commitFlags__15SkipflagManagerFv = .text:0x800BFD90; // type:function size:0x70 -setupFlagManagers = .text:0x800BFE00; // type:function size:0x294 +setupFlagManagers__FPQ23EGG4Heap = .text:0x800BFE00; // type:function size:0x294 __dt__15TBoxFlagManagerFv = .text:0x800C00A0; // type:function size:0x40 __dt__18EnemyDefeatManagerFv = .text:0x800C00E0; // type:function size:0x40 -StoryflagManager__dtor = .text:0x800C0120; // type:function size:0x58 -fn_800C0180 = .text:0x800C0180; // type:function size:0x58 -fn_800C01E0 = .text:0x800C01E0; // type:function size:0x8 -copyAllFlagmanagersFromSave = .text:0x800C01F0; // type:function size:0x78 -updateFlagForFlagindex = .text:0x800C0270; // type:function size:0x58 +__dt__16StoryFlagManagerFv = .text:0x800C0120; // type:function size:0x58 +__dt__15ItemFlagManagerFv = .text:0x800C0180; // type:function size:0x58 +postSetup__Fv = .text:0x800C01E0; // type:function size:0x8 +copyAllFlagManagersFromSave__Fv = .text:0x800C01F0; // type:function size:0x78 +updateFlagForFlagIndex__FUs = .text:0x800C0270; // type:function size:0x58 commitAllFlagManagers = .text:0x800C02D0; // type:function size:0x54 checkedMemcpy = .text:0x800C0330; // type:function size:0x54 -getItemFlags = .text:0x800C0390; // type:function size:0x8 -fn_800C03A0 = .text:0x800C03A0; // type:function size:0x8 -fn_800C03B0 = .text:0x800C03B0; // type:function size:0x8 -StoryflagManager__getStoryflag = .text:0x800C03C0; // type:function size:0x8 -ItemflagManager__setToValue = .text:0x800C03D0; // type:function size:0x8 -fn_800C03E0 = .text:0x800C03E0; // type:function size:0x8 -fn_800C03F0 = .text:0x800C03F0; // type:function size:0x44 -ItemStoryManagerBase__setFlagSpacePtr = .text:0x800C0440; // type:function size:0xC -getStoryFlagsSpacePtr = .text:0x800C0450; // type:function size:0x8 -StoryflagManager__doCommit = .text:0x800C0460; // type:function size:0x44 -StoryflagManager__setFlagsPtr = .text:0x800C04B0; // type:function size:0xC -EnemyDefeatFlagManager__doCommit = .text:0x800C04C0; // type:function size:0x44 -fn_800C0510 = .text:0x800C0510; // type:function size:0x5C -fn_800C0570 = .text:0x800C0570; // type:function size:0x5C -fn_800C05D0 = .text:0x800C05D0; // type:function size:0x40 -fn_800C0610 = .text:0x800C0610; // type:function size:0x40 +getSaveFlagSpace__15ItemFlagManagerCFv = .text:0x800C0390; // type:function size:0x8 +unk3__15ItemFlagManagerFUs = .text:0x800C03A0; // type:function size:0x8 +getUncommittedValue__15ItemFlagManagerFUs = .text:0x800C03B0; // type:function size:0x8 +getCounterOrFlag__15ItemFlagManagerCFUs = .text:0x800C03C0; // type:function size:0x8 +setFlagOrCounterToValue__15ItemFlagManagerFUsUs = .text:0x800C03D0; // type:function size:0x8 +unsetFlag__15ItemFlagManagerFUs = .text:0x800C03E0; // type:function size:0x8 +doCommit__15ItemFlagManagerFv = .text:0x800C03F0; // type:function size:0x44 +setFlagszptr__15ItemFlagManagerFv = .text:0x800C0440; // type:function size:0xC +getSaveFlagSpace__16StoryFlagManagerCFv = .text:0x800C0450; // type:function size:0x8 +doCommit__16StoryFlagManagerFv = .text:0x800C0460; // type:function size:0x44 +setFlagszptr__16StoryFlagManagerFv = .text:0x800C04B0; // type:function size:0xC +doCommit__18EnemyDefeatManagerFv = .text:0x800C04C0; // type:function size:0x44 +__dt__18ItemFlagManagerSubFv = .text:0x800C0510; // type:function size:0x5C +__dt__19StoryFlagManagerSubFv = .text:0x800C0570; // type:function size:0x5C +__dt__21EnemyDefeatManagerSubFv = .text:0x800C05D0; // type:function size:0x40 +__dt__18TBoxFlagManagerSubFv = .text:0x800C0610; // type:function size:0x40 fn_800C0650 = .text:0x800C0650; // type:function size:0x3C fn_800C0690 = .text:0x800C0690; // type:function size:0x70 fn_800C0700 = .text:0x800C0700; // type:function size:0x7C @@ -31008,13 +31008,13 @@ lbl_80510B48 = .data:0x80510B48; // type:object size:0xC lbl_80510B54 = .data:0x80510B54; // type:object size:0xC lbl_80510B60 = .data:0x80510B60; // type:object size:0x10 lbl_80510B70 = .data:0x80510B70; // type:object size:0x18 -ItemflagManager__vtable = .data:0x80510B88; // type:object size:0x3C -StoryflagManager__vtable = .data:0x80510BC4; // type:object size:0x3C -lbl_80510C00 = .data:0x80510C00; // type:object size:0x14 -lbl_80510C14 = .data:0x80510C14; // type:object size:0x14 -ItemflagManager__vtableBase = .data:0x80510C28; // type:object size:0x3C -StoryflagManager__vtableBase = .data:0x80510C64; // type:object size:0x3C -ItemStoryManagerBase__vtable = .data:0x80510CA0; // type:object size:0x3C +__vt__18ItemFlagManagerSub = .data:0x80510B88; // type:object size:0x3C +__vt__19StoryFlagManagerSub = .data:0x80510BC4; // type:object size:0x3C +__vt__21EnemyDefeatManagerSub = .data:0x80510C00; // type:object size:0x14 +__vt__18TBoxFlagManagerSub = .data:0x80510C14; // type:object size:0x14 +__vt__15ItemFlagManager = .data:0x80510C28; // type:object size:0x3C +__vt__16StoryFlagManager = .data:0x80510C64; // type:object size:0x3C +__vt__20ItemStoryManagerBase = .data:0x80510CA0; // type:object size:0x3C __vt__18EnemyDefeatManager = .data:0x80510CDC; // type:object size:0x14 __vt__15TBoxFlagManager = .data:0x80510CF0; // type:object size:0x14 __vt__9FlagSpace = .data:0x80510D04; // type:object size:0xC @@ -39947,7 +39947,7 @@ sTBoxFlags__15TBoxFlagManager = .sbss:0x805753F4; // type:object size:0x4 sInstance__18EnemyDefeatManager = .sbss:0x805753F8; // type:object size:0x4 data:4byte sInstance__16StoryflagManager = .sbss:0x805753FC; // type:object size:0x4 data:4byte sInstance__15ItemflagManager = .sbss:0x80575400; // type:object size:0x4 data:4byte -DUNGEONFLAG_MANAGER = .sbss:0x80575404; // type:object size:0x4 data:4byte +sInstance__18DungeonflagManager = .sbss:0x80575404; // type:object size:0x4 data:4byte sInstance__15SkipflagManager = .sbss:0x80575408; // type:object size:0x4 data:4byte lbl_80575410 = .sbss:0x80575410; // type:object size:0x8 data:4byte lbl_80575418 = .sbss:0x80575418; // type:object size:0x8 @@ -48330,8 +48330,8 @@ FontColors1 = .bss:0x805A7730; // type:object size:0xC4 data:byte FontColors2 = .bss:0x805A77F4; // type:object size:0xC4 data:byte lbl_805A78B8 = .bss:0x805A78B8; // type:object size:0xC TIMESHIFT_STONE_REFS = .bss:0x805A78C4; // type:object size:0xC data:4byte -STATIC_SCENEFLAGS = .bss:0x805A78D0; // type:object size:0x10 -STATIC_ZONE_FLAGS = .bss:0x805A78E0; // type:object size:0x1F8 +sSceneFlags__16SceneflagManager = .bss:0x805A78D0; // type:object size:0x10 +sZoneFlags__16SceneflagManager = .bss:0x805A78E0; // type:object size:0x1F8 sEnemyDefeatFlags__18EnemyDefeatManager = .bss:0x805A7AD8; // type:object size:0x2000 STATIC_STORYFLAGS = .bss:0x805A9AD8; // type:object size:0x100 STATIC_ITEM_FLAGS = .bss:0x805A9BD8; // type:object size:0x80 diff --git a/configure.py b/configure.py index 8134e351..0e2d79c1 100644 --- a/configure.py +++ b/configure.py @@ -321,13 +321,7 @@ config.libs = [ "progress_category": "game", "host": False, "objects": [ - Object(Matching, "toBeSorted/unk_flag_stuff.cpp"), - Object(Matching, "toBeSorted/bitwise_flag_helper.cpp"), - Object(Matching, "toBeSorted/sceneflag_manager.cpp"), - Object(NonMatching, "toBeSorted/flag_space.cpp"), - Object(NonMatching, "toBeSorted/misc_flag_managers.cpp"), - Object(Matching, "toBeSorted/dungeonflag_manager.cpp"), - Object(Matching, "toBeSorted/skipflag_manager.cpp"), + Object(NonMatching, "toBeSorted/flag_managers/flag_managers.cpp", extra_cflags=["-i src"]), Object(NonMatching, "toBeSorted/special_item_drop_mgr.cpp"), Object(Matching, "d/d_base.cpp"), Object(Matching, "d/d_dvd.cpp"), diff --git a/include/libc.h b/include/libc.h index e5eb89f8..3ae187a0 100644 --- a/include/libc.h +++ b/include/libc.h @@ -7,7 +7,6 @@ extern "C" { // void *memset(void *dest, s32 value, u32 count); // void *memcpy(void *dest, const void *src, u32 count); -void *checkedMemcpy(void *dest, u16 destLen, const void *src, u16 count); } #endif diff --git a/include/toBeSorted/file_manager.h b/include/toBeSorted/file_manager.h index 185f2f23..89a769aa 100644 --- a/include/toBeSorted/file_manager.h +++ b/include/toBeSorted/file_manager.h @@ -1,3 +1,6 @@ +#ifndef FILE_MANAGER_H +#define FILE_MANAGER_H + #include "common.h" #include "egg/core/eggHeap.h" #include "m/m_angle.h" @@ -76,7 +79,7 @@ public: /* 8000A330 */ u16 *getStoryFlagsMut(); /* 8000A360 */ const u16 *getStoryFlagsConst() const; /* 8000A3B0 */ u16 *getItemFlagsMut(); - /* 8000A3E0 */ u16 *getItemFlagsConst(); + /* 8000A3E0 */ const u16 *getItemFlagsConst(); /* 8000A430 */ u16 *getDungeonFlagsMut(); /* 8000A460 */ u16 *getDungeonFlagsConst(); /* 8000A4B0 */ u16 *getSceneFlagsMut(); @@ -210,7 +213,7 @@ public: /* 8000CAD0 */ bool isNew_FileA(); /* 8000CB00 */ void setSceneFlagIndex(u16 idx); - /* 8000CB30 */ u16 getSceneFlagIndex(); + /* 8000CB30 */ u32 getSceneFlagIndex(); /* 8000CB80 */ s32 getFileAreaIndex(); /* 8000CBD0 */ void fn_8000CBD0(u8); @@ -285,3 +288,5 @@ public: } static FileManager *sInstance; }; + +#endif diff --git a/include/toBeSorted/flag_space.h b/include/toBeSorted/flag_space.h index a59ae3f3..bcc47c19 100644 --- a/include/toBeSorted/flag_space.h +++ b/include/toBeSorted/flag_space.h @@ -16,13 +16,13 @@ public: mCount = count; } FlagSpace(u16 *pFlags, u16 count) : BaseFlagSpace(pFlags, count) {} - u16 *getFlagPtrChecked(); - u16 *getFlagPtrUnchecked(); + u16 *getFlagPtrChecked() const; + u16 *getFlagPtrUnchecked() const; void unsetAll(); void setAllToZero(u16 offset, u16 flagCount); - void copyFromSaveFile2(u16 *pSaved, u16 offset, u16 flagCount); - void copyFromSaveFile(u16 *pSaved, u16 offset, u16 flagCount); - virtual void filemanagerCheck(); + void copyFromSaveFile2(const u16 *pSaved, u16 offset, u16 flagCount); + void copyFromSaveFile(const u16 *pSaved, u16 offset, u16 flagCount); + virtual void filemanagerCheck() const; }; #endif diff --git a/include/toBeSorted/item_story_flag_manager.h b/include/toBeSorted/item_story_flag_manager.h index 669b9b4a..4387c60f 100644 --- a/include/toBeSorted/item_story_flag_manager.h +++ b/include/toBeSorted/item_story_flag_manager.h @@ -3,6 +3,7 @@ #include "toBeSorted/flag_space.h" #include "toBeSorted/unk_flag_stuff.h" +#include "toBeSorted/file_manager.h" // TODO These classes have an interesting relation and there are like 5 vtables, so // the stuff in this header should not be relied upon for actually implementing these, @@ -23,24 +24,113 @@ public: /** 0x28 */ virtual void setFlagOrCounterToValue(u16 flag, u16 value); /** 0x2C */ virtual u16 getCounterOrFlag(u16 flag) const; /** 0x30 */ virtual u16 getUncommittedValue(u16 flag); - /** 0x34 */ virtual void unk3(); - /** 0x38 */ virtual u16 *getSaveFlagSpace() = 0; + /** 0x34 */ virtual void unk3(u16 arg); + /** 0x38 */ virtual const u16 *getSaveFlagSpace() const = 0; - u16 getFlag(u16 flag) const; + + void init(); + void setFlagSizes(u16 flagSizeMaybe, u16 anotherFlagSizeMaybe); + void copyFlagsFromSave_Priv(); + void setupUnkFlagStuff(UnkFlagDefinition *def, u16 count); + void doCommit_Priv(); + void thunk_setOrClearFlag(u16 flag, u16 value); + void setOrClearFlag(u16 flag, u16 value); + u16 getFlag(u16 flag) const; + u16 FUN_800bf600(u16 flag); + void FUN_800bf610(u16 flag); + u16 FUN_800bf640(u16 flag); + void FUN_800bf690(); + + u16 getUncommittedValue_Priv(u16 flag); + +protected: + /** 0x04 */ u16 flagSizeMaybe; + /** 0x06 */ u16 anotherSizeMaybe; + /** 0x08 */ FlagSpace *storyFlagsPtr; + /** 0x0C */ UnkFlagStuff *unkFlagsPtr; + /** 0x10 */ bool dirty; }; class StoryflagManager : public ItemStoryManagerBase { +public: + StoryflagManager(); + + virtual ~StoryflagManager() {} + FlagSpace storyFlags; + void init(); + bool commit(); + + /** 0x0C */ virtual void setFlagszptr() override { + + } + /** 0x10 */ virtual void onDirty() override; + /** 0x14 */ virtual void copyFlagsFromSave() override; + /** 0x18 */ virtual void setupUnkFlagsStuff() override; + /** 0x1C */ virtual bool doCommit() override {} + /** 0x20 */ virtual void setFlag(u16 flag) override; + /** 0x24 */ virtual void unsetFlag(u16 flag) override; + /** 0x28 */ virtual void setFlagOrCounterToValue(u16 flag, u16 value) override; + /** 0x2C */ virtual u16 getCounterOrFlag(u16 flag) const override; + /** 0x30 */ virtual u16 getUncommittedValue(u16 flag) override; + /** 0x34 */ virtual void unk3(u16 arg) override; + /** 0x38 */ virtual const u16 *getSaveFlagSpace() const override { + return FileManager::sInstance->getStoryFlagsConst(); + }; + public: static StoryflagManager *sInstance; + static u16 sFlags[0x80]; }; + class ItemflagManager : public ItemStoryManagerBase { +public: FlagSpace itemFlags; + ItemflagManager(); + virtual ~ItemflagManager() {} + + void init(); + bool commit(); + + /** 0x0C */ virtual void setFlagszptr() override { + + } + /** 0x10 */ virtual void onDirty() override; + /** 0x14 */ virtual void copyFlagsFromSave(); + /** 0x18 */ virtual void setupUnkFlagsStuff(); + /** 0x1C */ virtual bool doCommit() { + u16 sz = flagSizeMaybe; + u16 *flags = storyFlagsPtr->getFlagPtrUnchecked(); + FileManager::sInstance->setItemFlags(flags, 0, sz); + } + /** 0x20 */ virtual void setFlag(u16 flag); + /** 0x24 */ virtual void unsetFlag(u16 flag) { + ItemStoryManagerBase::unsetFlag(flag & ~0x4000); + } + /** 0x28 */ virtual void setFlagOrCounterToValue(u16 flag, u16 value) { + ItemStoryManagerBase::thunk_setOrClearFlag(flag & ~0x4000, value); + } + /** 0x2C */ virtual u16 getCounterOrFlag(u16 flag) const { + return getFlag(flag & ~0x4000); + } + /** 0x30 */ virtual u16 getUncommittedValue(u16 flag) { + return getUncommittedValue_Priv(flag & ~0x4000); + } + /** 0x34 */ virtual void unk3(u16 arg) { + FUN_800bf600(arg & ~0x4000); + } + /** 0x38 */ virtual const u16 *getSaveFlagSpace() const { + return FileManager::sInstance->getItemFlagsConst(); + }; + public: static ItemflagManager *sInstance; + static u16 sFlags[0x40]; }; + + #endif diff --git a/include/toBeSorted/misc_flag_managers.h b/include/toBeSorted/misc_flag_managers.h index 6a871cfa..adb92f93 100644 --- a/include/toBeSorted/misc_flag_managers.h +++ b/include/toBeSorted/misc_flag_managers.h @@ -4,12 +4,14 @@ #include "common.h" #include "toBeSorted/bitwise_flag_helper.h" #include "toBeSorted/flag_space.h" +#include "toBeSorted/file_manager.h" class CommittableFlagManager { public: bool mNeedsCommit; virtual void doCommit() = 0; + virtual ~CommittableFlagManager() {} bool commitIfNecessary(); void setNeedsCommit(bool commit) { mNeedsCommit = commit; @@ -37,7 +39,7 @@ public: TBoxFlagManager(); virtual ~TBoxFlagManager() {} void init(); - void copyFromSave(s16 sceneIndex); + void copyFromSave(u32 sceneIndex); bool checkFlag(u16 sceneIndex, u16 flag); virtual u16 getFlagCount() const; void setFlag(u16 flag); @@ -47,6 +49,7 @@ public: } }; + // NOTE: Not actually Enemy Defeat. // This is a little more than that, it keeps track of live objects based on their id as a whole class EnemyDefeatManager : public CommittableFlagManager { @@ -74,6 +77,11 @@ public: virtual ~EnemyDefeatManager() {} virtual u16 getFlagCount() const; void setFlag(u16 flag); + + virtual void doCommit() override { + FileManager *mgr = FileManager::sInstance; + mgr->setItemFlags(mFlagSpace.getFlagPtrUnchecked(), 0, 0x1000); + }; }; #endif diff --git a/include/toBeSorted/unk_flag_stuff.h b/include/toBeSorted/unk_flag_stuff.h index 04d9a024..9f0513f3 100644 --- a/include/toBeSorted/unk_flag_stuff.h +++ b/include/toBeSorted/unk_flag_stuff.h @@ -17,8 +17,8 @@ public: void doNothing(u32 unused); UnkFlagStuff(u16 count, UnkFlagDefinition *definitions); void prepareIndexShiftMask(u16 counterIdx, u32 flagCount, u16 *pIndex, u8 *pShift, u16 *pMask); - u16 maskForIdx(u16 index); - u32 getCounterOrFlag(u16 counterIdx, u16 *pData, u32 flagCount); + u16 maskForIdx(u16 index, u16 flagSizeMaybe); + u16 getCounterOrFlag(u16 counterIdx, const u16 *pData, u32 flagCount); void setCounterOrFlag(u16 counterIdx, u16 *pData, u32 flagCount, u32 value); u32 checkFlagValid(u16 counterIdx, u32 flagCount); }; diff --git a/src/toBeSorted/file_manager.cpp b/src/toBeSorted/file_manager.cpp index 394975d5..cc5376dd 100644 --- a/src/toBeSorted/file_manager.cpp +++ b/src/toBeSorted/file_manager.cpp @@ -80,7 +80,7 @@ u16 *FileManager::getStoryFlagsMut() { return getCurrentFile()->getStoryFlags1(); } /* 8000A3B0 */ u16 *FileManager::getItemFlagsMut() {} -/* 8000A3E0 */ u16 *FileManager::getItemFlagsConst() {} +/* 8000A3E0 */ const u16 *FileManager::getItemFlagsConst() {} /* 8000A430 */ u16 *FileManager::getDungeonFlagsMut() {} /* 8000A460 */ u16 *FileManager::getDungeonFlagsConst() {} /* 8000A4B0 */ u16 *FileManager::getSceneFlagsMut() {} @@ -234,7 +234,7 @@ u16 *FileManager::getStoryFlagsMut() { /* 8000CAD0 */ bool FileManager::isNew_FileA() {} /* 8000CB00 */ void FileManager::setSceneFlagIndex(u16 idx) {} -/* 8000CB30 */ u16 FileManager::getSceneFlagIndex() {} +/* 8000CB30 */ u32 FileManager::getSceneFlagIndex() {} /* 8000CB80 */ s32 FileManager::getFileAreaIndex() {} /* 8000CBD0 */ void FileManager::fn_8000CBD0(u8) {} diff --git a/src/toBeSorted/bitwise_flag_helper.cpp b/src/toBeSorted/flag_managers/bitwise_flag_helper.inc similarity index 100% rename from src/toBeSorted/bitwise_flag_helper.cpp rename to src/toBeSorted/flag_managers/bitwise_flag_helper.inc diff --git a/src/toBeSorted/dungeonflag_manager.cpp b/src/toBeSorted/flag_managers/dungeonflag_manager.inc similarity index 95% rename from src/toBeSorted/dungeonflag_manager.cpp rename to src/toBeSorted/flag_managers/dungeonflag_manager.inc index 7fcab742..23602448 100644 --- a/src/toBeSorted/dungeonflag_manager.cpp +++ b/src/toBeSorted/flag_managers/dungeonflag_manager.inc @@ -25,7 +25,7 @@ public: void setupFlagStuff(); void setToValue(u16 flag, u32 value); void setFlag(u16 flag); - u32 getDungeonFlag(u16 flag); + u16 getDungeonFlag(u16 flag); bool doCommit(); /** inline shenanigans to get copyFromSave to match */ @@ -33,6 +33,8 @@ public: u32 offset = (flagIndex & 0x1fff) * 8; return FileManager::sInstance->getDungeonFlagsConst() + offset; } + + static DungeonflagManager *sInstance; }; /** 80575404 */ @@ -83,7 +85,7 @@ void DungeonflagManager::setFlag(u16 flag) { } /** 800fbac0 */ -u32 DungeonflagManager::getDungeonFlag(u16 flag) { +u16 DungeonflagManager::getDungeonFlag(u16 flag) { u16 *data = mFlagSpace.getFlagPtrUnchecked(); return mFlagStuff->getCounterOrFlag(flag, data, 8); } diff --git a/src/toBeSorted/flag_managers/flag_managers.cpp b/src/toBeSorted/flag_managers/flag_managers.cpp new file mode 100644 index 00000000..cb424b73 --- /dev/null +++ b/src/toBeSorted/flag_managers/flag_managers.cpp @@ -0,0 +1,289 @@ +// clang-format off + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + + +ItemStoryManagerBase::ItemStoryManagerBase(): flagSizeMaybe(0), anotherSizeMaybe(0), storyFlagsPtr(nullptr), unkFlagsPtr(nullptr), dirty(false) {} +ItemStoryManagerBase::~ItemStoryManagerBase() { + if (unkFlagsPtr != nullptr) { + delete unkFlagsPtr; + } +} + +void ItemStoryManagerBase::setFlagSizes(u16 flagSizeMaybe, u16 anotherFlagSizeMaybe) { + this->flagSizeMaybe = flagSizeMaybe; + this->anotherSizeMaybe = anotherFlagSizeMaybe; +} + +/** 800bf320 */ +void ItemStoryManagerBase::setupUnkFlagStuff(UnkFlagDefinition *def, u16 count) { + UnkFlagStuff *stuff = new UnkFlagStuff(count, def); + this->unkFlagsPtr = stuff; +} + +/** 800bf380 */ +void ItemStoryManagerBase::copyFlagsFromSave_Priv() { + FlagSpace *current = this->storyFlagsPtr; + const u16 *saved = this->getSaveFlagSpace(); + current->copyFromSaveFile(saved, 0, this->flagSizeMaybe); +} + +/** 800bf3e0 */ +void ItemStoryManagerBase::init() { + const u16 *space = this->getSaveFlagSpace(); + if (space == nullptr || this->unkFlagsPtr == nullptr) { + this->setFlagszptr(); + this->copyFlagsFromSave(); + this->setupUnkFlagsStuff(); + } +} + +/** 800bf470 */ +void ItemStoryManagerBase::setFlagszptr() { + +} + +/** 800bf480 */ +u16 ItemStoryManagerBase::getCounterOrFlag(u16 flag) const { + const u16 *data = this->getSaveFlagSpace(); + return this->unkFlagsPtr->getCounterOrFlag(flag, data, this->flagSizeMaybe); +} + +/** 800bf4e0 */ +u16 ItemStoryManagerBase::getUncommittedValue_Priv(u16 flag) { + u16 *data = this->storyFlagsPtr->getFlagPtrUnchecked(); + return this->unkFlagsPtr->getCounterOrFlag(flag, data, this->flagSizeMaybe); +} + +/** 800bf530 */ +void ItemStoryManagerBase::setOrClearFlag(u16 flag, u16 value) { + FlagSpace *storyFlagsPtr = this->storyFlagsPtr; + u16 *pData = storyFlagsPtr->getFlagPtrChecked(); + this->unkFlagsPtr->setCounterOrFlag(flag, pData, storyFlagsPtr->mCount, value); + this->FUN_800bf610(flag); +} + +/** 800bf5b0 */ +void ItemStoryManagerBase::setFlag(u16 flag) { + this->setOrClearFlag(flag, true); +} + +/** 800bf5c0 */ +void ItemStoryManagerBase::unsetFlag(u16 flag) { + this->setOrClearFlag(flag, false); +} + +/** 800bf5d0 */ +void ItemStoryManagerBase::thunk_setOrClearFlag(u16 flag, u16 value) { + this->setOrClearFlag(flag, value); +} + +/** 800bf5e0 */ +u16 ItemStoryManagerBase::getFlag(u16 flag) const { + return ItemStoryManagerBase::getCounterOrFlag(flag); +} + +/** 800bf5f0 */ +u16 ItemStoryManagerBase::getUncommittedValue(u16 flag) { + return this->getUncommittedValue_Priv(flag); +} + +/** 800bf600 */ +u16 ItemStoryManagerBase::FUN_800bf600(u16 flag) { + return this->FUN_800bf640(flag); +} + +/** 800bf610 */ +void ItemStoryManagerBase::FUN_800bf610(u16 flag) { + this->dirty = true; + this->onDirty(); +} + +/** 800bf630 */ +void ItemStoryManagerBase::onDirty() { + +} + +/** 800bf640 */ +u16 ItemStoryManagerBase::FUN_800bf640(u16 flag) { + return this->unkFlagsPtr->maskForIdx(flag, this->flagSizeMaybe); +} + +/** 800bf650 */ +void ItemStoryManagerBase::doCommit_Priv() { + this->doCommit(); + this->dirty = false; +} + +/* 800bf690 */ +void ItemStoryManagerBase::FUN_800bf690() { + +} + +StoryflagManager::StoryflagManager() : storyFlags(sFlags, 0x80) { + +} + +void StoryflagManager::copyFlagsFromSave() { + setFlagSizes(0x80, 0x100); + copyFlagsFromSave_Priv(); +} + +extern "C" UnkFlagDefinition StoryflagManager__STORYFLAG_DEFINITIONS[]; + +void StoryflagManager::setupUnkFlagsStuff() { + setupUnkFlagStuff(StoryflagManager__STORYFLAG_DEFINITIONS, 0x4B1); +} + +void StoryflagManager::onDirty() { + +} + +bool StoryflagManager::commit() { + if (dirty) { + doCommit_Priv(); + FUN_800bf690(); + return true; + } + return false; +} + +void StoryflagManager::unsetFlag(u16 flag) { + ItemStoryManagerBase::unsetFlag(flag); +} + +ItemflagManager::ItemflagManager() : itemFlags(sFlags, 0x40) {} + +void ItemflagManager::copyFlagsFromSave() { + setFlagSizes(0x40, 0x80); + copyFlagsFromSave_Priv(); +} + +extern "C" UnkFlagDefinition ItemflagManager__ITEMFLAG_DEFINITIONS[]; + +void ItemflagManager::setupUnkFlagsStuff() { + setupUnkFlagStuff(ItemflagManager__ITEMFLAG_DEFINITIONS, 0x1FE); +} + +void ItemflagManager::onDirty() { + +} + +bool ItemflagManager::commit() { + if (dirty) { + doCommit_Priv(); + FUN_800bf690(); + return true; + } + return false; +} + +#include +#include +// clang-format on + +#include +#include + +static void postSetup(); +static void updateFlagForFlagIndex(u16 stage); +class TBoxFlagManagerSub : public TBoxFlagManager { + // virtual ~TBoxFlagManagerSub() {} +}; + +class EnemyDefeatManagerSub : public EnemyDefeatManager { + // virtual ~EnemyDefeatManagerSub() {} +}; + + +class StoryflagManagerSub : public StoryflagManager { + // virtual ~StoryflagManagerSub() {} +}; + +class ItemflagManagerSub : public ItemflagManager { + // virtual ~ItemflagManagerSub() {} +}; + + + + +void setupFlagManagers(EGG::Heap *heap) { + if (SceneflagManager::sInstance == nullptr) { + SceneflagManager::sInstance = new (heap) SceneflagManager(); + mHeap m(heap); + SceneflagManager::sInstance->doNothing(); + } + + if (TBoxFlagManager::sInstance == nullptr) { + TBoxFlagManager::sInstance = new (heap) TBoxFlagManagerSub(); + mHeap m(heap); + TBoxFlagManager::sInstance->init(); + } + + if (EnemyDefeatManager::sInstance == nullptr) { + EnemyDefeatManager::sInstance = new (heap) EnemyDefeatManagerSub(); + mHeap m(heap); + EnemyDefeatManager::sInstance->init(); + } + + if (StoryflagManager::sInstance == nullptr) { + StoryflagManager::sInstance = new (heap) StoryflagManagerSub(); + mHeap m(heap); + StoryflagManager::sInstance->init(); + } + + if (ItemflagManager::sInstance == nullptr) { + ItemflagManager::sInstance = new (heap) ItemflagManagerSub(); + mHeap m(heap); + ItemflagManager::sInstance->init(); + } + + if (DungeonflagManager::sInstance == nullptr) { + DungeonflagManager::sInstance = new (heap) DungeonflagManager(); + mHeap m(heap); + DungeonflagManager::sInstance->setupFlagStuff(); + } + + if (SkipflagManager::sInstance == nullptr) { + SkipflagManager::sInstance = new (heap) SkipflagManager(); + mHeap m(heap); + SkipflagManager::sInstance->unsetCommitFlag(); + } + + postSetup(); +} + +static void postSetup() { + updateFlagForFlagIndex(0); +} + +void copyAllFlagManagersFromSave() { + u16 flag = FileManager::sInstance->getSceneFlagIndex(); + SceneflagManager::sInstance->copyFromSave(flag); + TBoxFlagManager::sInstance->copyFromSave(flag); + StoryflagManager::sInstance->copyFlagsFromSave_Priv(); + ItemflagManager::sInstance->copyFlagsFromSave_Priv(); + DungeonflagManager::sInstance->copyFromSave(flag); + SkipflagManager::sInstance->copyFromSave(); + EnemyDefeatManager::sInstance->copyFromSave(flag); +} + +static void updateFlagForFlagIndex(u16 stage) {} + +extern "C" bool checkedMemcpy(void *dest, u32 destLen, const void *src, u32 count) { + if (dest == nullptr || src == nullptr || destLen < count || destLen > 0xFFFF) { + return true; + } else { + memcpy(dest, src, count); + return false; + } +} diff --git a/src/toBeSorted/flag_managers/flag_space.inc b/src/toBeSorted/flag_managers/flag_space.inc new file mode 100644 index 00000000..08e9e83e --- /dev/null +++ b/src/toBeSorted/flag_managers/flag_space.inc @@ -0,0 +1,34 @@ +#include "toBeSorted/flag_space.h" +#include "toBeSorted/file_manager.h" +#include + +extern "C" bool checkedMemcpy(void *dest, u32 destLen, const void *src, u32 count); + +u16 *FlagSpace::getFlagPtrChecked() const { + filemanagerCheck(); + return mpFlags; +} +u16 *FlagSpace::getFlagPtrUnchecked() const { + return mpFlags; +} +void FlagSpace::unsetAll() { + setAllToZero(0, mCount); +} +void FlagSpace::setAllToZero(u16 offset, u16 flagCount) { + filemanagerCheck(); + memset(mpFlags + offset, 0, (u16)(flagCount * 2)); +} +void FlagSpace::copyFromSaveFile2(const u16 *pSaved, u16 offset, u16 flagCount) { + filemanagerCheck(); + checkedMemcpy(mpFlags + offset, (u16)(mCount * 2), pSaved, (u16)(flagCount * 2)); +} + +void FlagSpace::copyFromSaveFile(const u16 *pSaved, u16 offset, u16 flagCount) { + checkedMemcpy(mpFlags + offset, (u16)(mCount * 2), pSaved, (u16)(flagCount * 2)); +} +void FlagSpace::filemanagerCheck() const { + if (FileManager::sInstance->mIsFileUnk1[0]) { + return; + } + while (true) {} +} diff --git a/src/toBeSorted/misc_flag_managers.cpp b/src/toBeSorted/flag_managers/misc_flag_managers.inc similarity index 98% rename from src/toBeSorted/misc_flag_managers.cpp rename to src/toBeSorted/flag_managers/misc_flag_managers.inc index d23b36ec..a756edfd 100644 --- a/src/toBeSorted/misc_flag_managers.cpp +++ b/src/toBeSorted/flag_managers/misc_flag_managers.inc @@ -42,7 +42,7 @@ TBoxFlagManager::TBoxFlagManager() : CommittableFlagManager(false), mFlagSpace(s void TBoxFlagManager::init() {} /* 0x800BE930 */ -void TBoxFlagManager::copyFromSave(s16 sceneIndex) { +void TBoxFlagManager::copyFromSave(u32 sceneIndex) { u16 idx = sceneIndex; mSceneIndex = idx; u16 *flags = FileManager::getInstance()->getTBoxFlagsConst(); diff --git a/src/toBeSorted/sceneflag_manager.cpp b/src/toBeSorted/flag_managers/sceneflag_manager.inc similarity index 100% rename from src/toBeSorted/sceneflag_manager.cpp rename to src/toBeSorted/flag_managers/sceneflag_manager.inc diff --git a/src/toBeSorted/skipflag_manager.cpp b/src/toBeSorted/flag_managers/skipflag_manager.inc similarity index 95% rename from src/toBeSorted/skipflag_manager.cpp rename to src/toBeSorted/flag_managers/skipflag_manager.inc index f0ffad77..e2800a32 100644 --- a/src/toBeSorted/skipflag_manager.cpp +++ b/src/toBeSorted/flag_managers/skipflag_manager.inc @@ -1,8 +1,10 @@ -#include "libc.h" +#include "common.h" #include "toBeSorted/bitwise_flag_helper.h" #include "toBeSorted/file_manager.h" #include "toBeSorted/flag_space.h" +extern "C" bool checkedMemcpy(void *dest, u32 destLen, const void *src, u32 count); + class SkipflagManager { public: bool mShouldCommit; diff --git a/src/toBeSorted/unk_flag_stuff.cpp b/src/toBeSorted/flag_managers/unk_flag_stuff.inc similarity index 92% rename from src/toBeSorted/unk_flag_stuff.cpp rename to src/toBeSorted/flag_managers/unk_flag_stuff.inc index 17cbaa87..edbfdbdb 100644 --- a/src/toBeSorted/unk_flag_stuff.cpp +++ b/src/toBeSorted/flag_managers/unk_flag_stuff.inc @@ -18,13 +18,13 @@ void UnkFlagStuff::prepareIndexShiftMask(u16 counterIdx, u32 unused, u16 *indexP *maskPtr = calculateMask(mpDefinitions[counterIdx].mShiftMask); } -u16 UnkFlagStuff::maskForIdx(u16 index) { +u16 UnkFlagStuff::maskForIdx(u16 index, u16 flagSizeMaybe) { doNothing(index); return calculateMask(mpDefinitions[index].mShiftMask); } -u32 UnkFlagStuff::getCounterOrFlag(u16 counterIdx, u16 *dataPtr, u32 param4) { +u16 UnkFlagStuff::getCounterOrFlag(u16 counterIdx, const u16 *dataPtr, u32 param4) { u16 index = 0; u8 shift = 0; u16 mask = 0; diff --git a/src/toBeSorted/flag_space.cpp b/src/toBeSorted/flag_space.cpp deleted file mode 100644 index f915eaa7..00000000 --- a/src/toBeSorted/flag_space.cpp +++ /dev/null @@ -1,34 +0,0 @@ -#include "toBeSorted/flag_space.h" - -#include "common.h" -#include "libc.h" -#include "toBeSorted/file_manager.h" - -u16 *FlagSpace::getFlagPtrChecked() { - filemanagerCheck(); - return mpFlags; -} -u16 *FlagSpace::getFlagPtrUnchecked() { - return mpFlags; -} -void FlagSpace::unsetAll() { - setAllToZero(0, mCount); -} -void FlagSpace::setAllToZero(u16 offset, u16 flagCount) { - filemanagerCheck(); - memset(mpFlags + offset, 0, (u16)(flagCount * 2)); -} -void FlagSpace::copyFromSaveFile2(u16 *pSaved, u16 offset, u16 flagCount) { - filemanagerCheck(); - checkedMemcpy(mpFlags + offset, mCount * 2, pSaved, flagCount * 2); -} - -void FlagSpace::copyFromSaveFile(u16 *pSaved, u16 offset, u16 flagCount) { - checkedMemcpy(mpFlags + offset, mCount * 2, pSaved, flagCount * 2); -} -void FlagSpace::filemanagerCheck() { - if (FileManager::sInstance->mIsFileUnk1[0]) { - return; - } - while (true) {} -} From ceac3a6ef88704f29c68f35fbc1c3d4f7a8744ea Mon Sep 17 00:00:00 2001 From: robojumper Date: Fri, 25 Oct 2024 11:05:26 +0200 Subject: [PATCH 2/9] Everything OK except for weak dtor order --- config/SOUE01/symbols.txt | 76 +++++++++---------- include/toBeSorted/item_story_flag_manager.h | 18 +++-- include/toBeSorted/misc_flag_managers.h | 2 +- include/toBeSorted/sceneflag_manager.h | 2 +- .../flag_managers/dungeonflag_manager.inc | 16 ++-- .../flag_managers/flag_managers.cpp | 52 +++++++++++-- .../flag_managers/sceneflag_manager.inc | 2 +- .../flag_managers/skipflag_manager.inc | 4 +- 8 files changed, 105 insertions(+), 67 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 7f508863..a4c38ee4 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -4069,7 +4069,7 @@ fn_800BD7A0 = .text:0x800BD7A0; // type:function size:0x74 fn_800BD820 = .text:0x800BD820; // type:function size:0x8 fn_800BD830 = .text:0x800BD830; // type:function size:0x78 fn_800BD8B0 = .text:0x800BD8B0; // type:function size:0x10 -doNothing__16SceneflagManagerFv = .text:0x800BD8C0; // type:function size:0x4 +init__16SceneflagManagerFv = .text:0x800BD8C0; // type:function size:0x4 setShouldCommit__16SceneflagManagerFUs = .text:0x800BD8D0; // type:function size:0xC __ct__16SceneflagManagerFv = .text:0x800BD8E0; // type:function size:0x64 isNotTempOrZoneFlag__16SceneflagManagerFUs = .text:0x800BD950; // type:function size:0xC @@ -4161,22 +4161,22 @@ onDirty__20ItemStoryManagerBaseFv = .text:0x800BF630; // type:function size:0x4 FUN_800bf640__20ItemStoryManagerBaseFUs = .text:0x800BF640; // type:function size:0x10 doCommit_Priv__20ItemStoryManagerBaseFv = .text:0x800BF650; // type:function size:0x40 FUN_800bf690__20ItemStoryManagerBaseFv = .text:0x800BF690; // type:function size:0x4 -__ct__16StoryFlagManagerFv = .text:0x800BF6A0; // type:function size:0x5C -copyFlagsFromSave__16StoryFlagManagerFv = .text:0x800BF700; // type:function size:0x3C -setupUnkFlagsStuff__16StoryFlagManagerFv = .text:0x800BF740; // type:function size:0x10 -onDirty__16StoryFlagManagerFv = .text:0x800BF750; // type:function size:0x4 -commit__16StoryFlagManagerFv = .text:0x800BF760; // type:function size:0x4C -unsetFlag__16StoryFlagManagerFUs = .text:0x800BF7B0; // type:function size:0x4 -__ct__15ItemFlagManagerFv = .text:0x800BF7C0; // type:function size:0x5C -copyFlagsFromSave__15ItemFlagManagerFv = .text:0x800BF820; // type:function size:0x3C -setupUnkFlagsStuff__15ItemFlagManagerFv = .text:0x800BF860; // type:function size:0x10 -onDirty__15ItemFlagManagerFv = .text:0x800BF870; // type:function size:0x4 -commit__15ItemFlagManagerFv = .text:0x800BF880; // type:function size:0x4C -copyFromSave__18DungeonflagManagerFUs = .text:0x800BF8D0; // type:function size:0x54 +__ct__16StoryflagManagerFv = .text:0x800BF6A0; // type:function size:0x5C +copyFlagsFromSave__16StoryflagManagerFv = .text:0x800BF700; // type:function size:0x3C +setupUnkFlagsStuff__16StoryflagManagerFv = .text:0x800BF740; // type:function size:0x10 +onDirty__16StoryflagManagerFv = .text:0x800BF750; // type:function size:0x4 +commit__16StoryflagManagerFv = .text:0x800BF760; // type:function size:0x4C +unsetFlag__16StoryflagManagerFUs = .text:0x800BF7B0; // type:function size:0x4 +__ct__15ItemflagManagerFv = .text:0x800BF7C0; // type:function size:0x5C +copyFlagsFromSave__15ItemflagManagerFv = .text:0x800BF820; // type:function size:0x3C +setupUnkFlagsStuff__15ItemflagManagerFv = .text:0x800BF860; // type:function size:0x10 +onDirty__15ItemflagManagerFv = .text:0x800BF870; // type:function size:0x4 +commit__15ItemflagManagerFv = .text:0x800BF880; // type:function size:0x4C +copyFromSave_Internal__18DungeonflagManagerFUs = .text:0x800BF8D0; // type:function size:0x54 setCommitFlag__18DungeonflagManagerFUs = .text:0x800BF930; // type:function size:0xC __ct__18DungeonflagManagerFv = .text:0x800BF940; // type:function size:0x3C -setupFlagStuff__18DungeonflagManagerFv = .text:0x800BF980; // type:function size:0x54 -copyFromSave__18DungeonflagManagerFs = .text:0x800BF9E0; // type:function size:0xC +init__18DungeonflagManagerFv = .text:0x800BF980; // type:function size:0x54 +copyFromSave__18DungeonflagManagerFUl = .text:0x800BF9E0; // type:function size:0xC setToValue__18DungeonflagManagerFUsUl = .text:0x800BF9F0; // type:function size:0x6C setFlag__18DungeonflagManagerFUs = .text:0x800BFA60; // type:function size:0x60 getDungeonFlag__18DungeonflagManagerFUs = .text:0x800BFAC0; // type:function size:0x50 @@ -4184,7 +4184,7 @@ doCommit__18DungeonflagManagerFv = .text:0x800BFB10; // type:function size:0x8C copyFromSave__15SkipflagManagerFv = .text:0x800BFBA0; // type:function size:0x44 setCommitFlag__15SkipflagManagerFUs = .text:0x800BFBF0; // type:function size:0xC __ct__15SkipflagManagerFv = .text:0x800BFC00; // type:function size:0x2C -unsetCommitFlag__15SkipflagManagerFv = .text:0x800BFC30; // type:function size:0xC +init__15SkipflagManagerFv = .text:0x800BFC30; // type:function size:0xC thunk_copyFromSave__15SkipflagManagerFv = .text:0x800BFC40; // type:function size:0x4 setFlag__15SkipflagManagerFUs = .text:0x800BFC50; // type:function size:0xD0 checkFlag__15SkipflagManagerFUs = .text:0x800BFD20; // type:function size:0x68 @@ -4192,27 +4192,27 @@ commitFlags__15SkipflagManagerFv = .text:0x800BFD90; // type:function size:0x70 setupFlagManagers__FPQ23EGG4Heap = .text:0x800BFE00; // type:function size:0x294 __dt__15TBoxFlagManagerFv = .text:0x800C00A0; // type:function size:0x40 __dt__18EnemyDefeatManagerFv = .text:0x800C00E0; // type:function size:0x40 -__dt__16StoryFlagManagerFv = .text:0x800C0120; // type:function size:0x58 -__dt__15ItemFlagManagerFv = .text:0x800C0180; // type:function size:0x58 +__dt__16StoryflagManagerFv = .text:0x800C0120; // type:function size:0x58 +__dt__15ItemflagManagerFv = .text:0x800C0180; // type:function size:0x58 postSetup__Fv = .text:0x800C01E0; // type:function size:0x8 copyAllFlagManagersFromSave__Fv = .text:0x800C01F0; // type:function size:0x78 updateFlagForFlagIndex__FUs = .text:0x800C0270; // type:function size:0x58 -commitAllFlagManagers = .text:0x800C02D0; // type:function size:0x54 +commitAllFlagManagers__Fv = .text:0x800C02D0; // type:function size:0x54 checkedMemcpy = .text:0x800C0330; // type:function size:0x54 -getSaveFlagSpace__15ItemFlagManagerCFv = .text:0x800C0390; // type:function size:0x8 -unk3__15ItemFlagManagerFUs = .text:0x800C03A0; // type:function size:0x8 -getUncommittedValue__15ItemFlagManagerFUs = .text:0x800C03B0; // type:function size:0x8 -getCounterOrFlag__15ItemFlagManagerCFUs = .text:0x800C03C0; // type:function size:0x8 -setFlagOrCounterToValue__15ItemFlagManagerFUsUs = .text:0x800C03D0; // type:function size:0x8 -unsetFlag__15ItemFlagManagerFUs = .text:0x800C03E0; // type:function size:0x8 -doCommit__15ItemFlagManagerFv = .text:0x800C03F0; // type:function size:0x44 -setFlagszptr__15ItemFlagManagerFv = .text:0x800C0440; // type:function size:0xC -getSaveFlagSpace__16StoryFlagManagerCFv = .text:0x800C0450; // type:function size:0x8 -doCommit__16StoryFlagManagerFv = .text:0x800C0460; // type:function size:0x44 -setFlagszptr__16StoryFlagManagerFv = .text:0x800C04B0; // type:function size:0xC +getSaveFlagSpace__15ItemflagManagerCFv = .text:0x800C0390; // type:function size:0x8 +unk3__15ItemflagManagerFUs = .text:0x800C03A0; // type:function size:0x8 +getUncommittedValue__15ItemflagManagerFUs = .text:0x800C03B0; // type:function size:0x8 +getCounterOrFlag__15ItemflagManagerCFUs = .text:0x800C03C0; // type:function size:0x8 +setFlagOrCounterToValue__15ItemflagManagerFUsUs = .text:0x800C03D0; // type:function size:0x8 +unsetFlag__15ItemflagManagerFUs = .text:0x800C03E0; // type:function size:0x8 +doCommit__15ItemflagManagerFv = .text:0x800C03F0; // type:function size:0x44 +setFlagszptr__15ItemflagManagerFv = .text:0x800C0440; // type:function size:0xC +getSaveFlagSpace__16StoryflagManagerCFv = .text:0x800C0450; // type:function size:0x8 +doCommit__16StoryflagManagerFv = .text:0x800C0460; // type:function size:0x44 +setFlagszptr__16StoryflagManagerFv = .text:0x800C04B0; // type:function size:0xC doCommit__18EnemyDefeatManagerFv = .text:0x800C04C0; // type:function size:0x44 -__dt__18ItemFlagManagerSubFv = .text:0x800C0510; // type:function size:0x5C -__dt__19StoryFlagManagerSubFv = .text:0x800C0570; // type:function size:0x5C +__dt__18ItemflagManagerSubFv = .text:0x800C0510; // type:function size:0x5C +__dt__19StoryflagManagerSubFv = .text:0x800C0570; // type:function size:0x5C __dt__21EnemyDefeatManagerSubFv = .text:0x800C05D0; // type:function size:0x40 __dt__18TBoxFlagManagerSubFv = .text:0x800C0610; // type:function size:0x40 fn_800C0650 = .text:0x800C0650; // type:function size:0x3C @@ -31008,12 +31008,12 @@ lbl_80510B48 = .data:0x80510B48; // type:object size:0xC lbl_80510B54 = .data:0x80510B54; // type:object size:0xC lbl_80510B60 = .data:0x80510B60; // type:object size:0x10 lbl_80510B70 = .data:0x80510B70; // type:object size:0x18 -__vt__18ItemFlagManagerSub = .data:0x80510B88; // type:object size:0x3C -__vt__19StoryFlagManagerSub = .data:0x80510BC4; // type:object size:0x3C +__vt__18ItemflagManagerSub = .data:0x80510B88; // type:object size:0x3C +__vt__19StoryflagManagerSub = .data:0x80510BC4; // type:object size:0x3C __vt__21EnemyDefeatManagerSub = .data:0x80510C00; // type:object size:0x14 __vt__18TBoxFlagManagerSub = .data:0x80510C14; // type:object size:0x14 -__vt__15ItemFlagManager = .data:0x80510C28; // type:object size:0x3C -__vt__16StoryFlagManager = .data:0x80510C64; // type:object size:0x3C +__vt__15ItemflagManager = .data:0x80510C28; // type:object size:0x3C +__vt__16StoryflagManager = .data:0x80510C64; // type:object size:0x3C __vt__20ItemStoryManagerBase = .data:0x80510CA0; // type:object size:0x3C __vt__18EnemyDefeatManager = .data:0x80510CDC; // type:object size:0x14 __vt__15TBoxFlagManager = .data:0x80510CF0; // type:object size:0x14 @@ -48333,8 +48333,8 @@ TIMESHIFT_STONE_REFS = .bss:0x805A78C4; // type:object size:0xC data:4byte sSceneFlags__16SceneflagManager = .bss:0x805A78D0; // type:object size:0x10 sZoneFlags__16SceneflagManager = .bss:0x805A78E0; // type:object size:0x1F8 sEnemyDefeatFlags__18EnemyDefeatManager = .bss:0x805A7AD8; // type:object size:0x2000 -STATIC_STORYFLAGS = .bss:0x805A9AD8; // type:object size:0x100 -STATIC_ITEM_FLAGS = .bss:0x805A9BD8; // type:object size:0x80 +sFlags__16StoryflagManager = .bss:0x805A9AD8; // type:object size:0x100 +sFlags__15ItemflagManager = .bss:0x805A9BD8; // type:object size:0x80 sDungeonFlags__18DungeonflagManager = .bss:0x805A9C58; // type:object size:0x10 sSkipFlags__15SkipflagManager = .bss:0x805A9C68; // type:object size:0x20 lbl_805A9C88 = .bss:0x805A9C88; // type:object size:0x10 data:4byte diff --git a/include/toBeSorted/item_story_flag_manager.h b/include/toBeSorted/item_story_flag_manager.h index 4387c60f..07c96a09 100644 --- a/include/toBeSorted/item_story_flag_manager.h +++ b/include/toBeSorted/item_story_flag_manager.h @@ -18,7 +18,7 @@ public: /** 0x10 */ virtual void onDirty(); /** 0x14 */ virtual void copyFlagsFromSave() = 0; /** 0x18 */ virtual void setupUnkFlagsStuff() = 0; - /** 0x1C */ virtual bool doCommit() = 0; + /** 0x1C */ virtual void doCommit() = 0; /** 0x20 */ virtual void setFlag(u16 flag); /** 0x24 */ virtual void unsetFlag(u16 flag); /** 0x28 */ virtual void setFlagOrCounterToValue(u16 flag, u16 value); @@ -59,16 +59,19 @@ public: FlagSpace storyFlags; - void init(); bool commit(); /** 0x0C */ virtual void setFlagszptr() override { - + storyFlagsPtr = &storyFlags; } /** 0x10 */ virtual void onDirty() override; /** 0x14 */ virtual void copyFlagsFromSave() override; /** 0x18 */ virtual void setupUnkFlagsStuff() override; - /** 0x1C */ virtual bool doCommit() override {} + /** 0x1C */ virtual void doCommit() override { + u16 sz = flagSizeMaybe; + u16 *flags = storyFlagsPtr->getFlagPtrUnchecked(); + FileManager::sInstance->setStoryFlags(flags, 0, sz); + } /** 0x20 */ virtual void setFlag(u16 flag) override; /** 0x24 */ virtual void unsetFlag(u16 flag) override; /** 0x28 */ virtual void setFlagOrCounterToValue(u16 flag, u16 value) override; @@ -92,16 +95,15 @@ public: ItemflagManager(); virtual ~ItemflagManager() {} - void init(); bool commit(); /** 0x0C */ virtual void setFlagszptr() override { - + storyFlagsPtr = &itemFlags; } /** 0x10 */ virtual void onDirty() override; /** 0x14 */ virtual void copyFlagsFromSave(); /** 0x18 */ virtual void setupUnkFlagsStuff(); - /** 0x1C */ virtual bool doCommit() { + /** 0x1C */ virtual void doCommit() { u16 sz = flagSizeMaybe; u16 *flags = storyFlagsPtr->getFlagPtrUnchecked(); FileManager::sInstance->setItemFlags(flags, 0, sz); @@ -117,7 +119,7 @@ public: return getFlag(flag & ~0x4000); } /** 0x30 */ virtual u16 getUncommittedValue(u16 flag) { - return getUncommittedValue_Priv(flag & ~0x4000); + return ItemStoryManagerBase::getUncommittedValue(flag & ~0x4000); } /** 0x34 */ virtual void unk3(u16 arg) { FUN_800bf600(arg & ~0x4000); diff --git a/include/toBeSorted/misc_flag_managers.h b/include/toBeSorted/misc_flag_managers.h index adb92f93..b57c31b7 100644 --- a/include/toBeSorted/misc_flag_managers.h +++ b/include/toBeSorted/misc_flag_managers.h @@ -80,7 +80,7 @@ public: virtual void doCommit() override { FileManager *mgr = FileManager::sInstance; - mgr->setItemFlags(mFlagSpace.getFlagPtrUnchecked(), 0, 0x1000); + mgr->setEnemyDefeatFlags(mFlagSpace.getFlagPtrUnchecked(), 0, 0x1000); }; }; diff --git a/include/toBeSorted/sceneflag_manager.h b/include/toBeSorted/sceneflag_manager.h index 047581eb..b85d8be1 100644 --- a/include/toBeSorted/sceneflag_manager.h +++ b/include/toBeSorted/sceneflag_manager.h @@ -20,7 +20,7 @@ public: static u16 sZoneFlags[0xFC]; static SceneflagManager *sInstance; - void doNothing(); + void init(); void setShouldCommit(u16 flag); SceneflagManager(); s32 isNotTempOrZoneFlag(u16 flag); diff --git a/src/toBeSorted/flag_managers/dungeonflag_manager.inc b/src/toBeSorted/flag_managers/dungeonflag_manager.inc index 23602448..f40fa1ab 100644 --- a/src/toBeSorted/flag_managers/dungeonflag_manager.inc +++ b/src/toBeSorted/flag_managers/dungeonflag_manager.inc @@ -18,11 +18,11 @@ public: static u16 sDungeonFlags[8]; // static DungeonflagManager *sInstance; - void copyFromSave(s16 flag); - void copyFromSave(u16 flagIndex); + void copyFromSave(u32 flag); + void copyFromSave_Internal(u16 flagIndex); void setCommitFlag(u16 flag); DungeonflagManager(); - void setupFlagStuff(); + void init(); void setToValue(u16 flag, u32 value); void setFlag(u16 flag); u16 getDungeonFlag(u16 flag); @@ -38,13 +38,13 @@ public: }; /** 80575404 */ -// DungeonflagManager *DungeonflagManager::sInstance = nullptr; +DungeonflagManager *DungeonflagManager::sInstance = nullptr; /** 805a9c58 */ u16 DungeonflagManager::sDungeonFlags[8] = {}; /** 800bf8d0 */ -void DungeonflagManager::copyFromSave(u16 flagIndex) { +void DungeonflagManager::copyFromSave_Internal(u16 flagIndex) { mFlagSpace.copyFromSaveFile(saveFilePtr(flagIndex), 0, 0x8); } @@ -59,15 +59,15 @@ DungeonflagManager::DungeonflagManager() mFlagSpace(sDungeonFlags, ARRAY_LENGTH(sDungeonFlags)) {} /** 800bf980 */ -void DungeonflagManager::setupFlagStuff() { +void DungeonflagManager::init() { mFlagStuff = new UnkFlagStuff(0x11, DungeonflagManager__FLAG_DEFINITIONS); mShouldCommit = false; } /** 800bf9e0 */ -void DungeonflagManager::copyFromSave(s16 flag) { +void DungeonflagManager::copyFromSave(u32 flag) { mStageIndex = flag; - copyFromSave((u16)flag); + copyFromSave_Internal(flag); } /** 800bf9f0 */ diff --git a/src/toBeSorted/flag_managers/flag_managers.cpp b/src/toBeSorted/flag_managers/flag_managers.cpp index cb424b73..2f929ee9 100644 --- a/src/toBeSorted/flag_managers/flag_managers.cpp +++ b/src/toBeSorted/flag_managers/flag_managers.cpp @@ -1,5 +1,7 @@ // clang-format off +#include "common.h" +#include "toBeSorted/sceneflag_manager.h" #include #include #include @@ -11,6 +13,12 @@ #include #include +u16 StoryflagManager::sFlags[0x80]; +u16 ItemflagManager::sFlags[0x40]; + + +StoryflagManager *StoryflagManager::sInstance = nullptr; +ItemflagManager *ItemflagManager::sInstance = nullptr; ItemStoryManagerBase::ItemStoryManagerBase(): flagSizeMaybe(0), anotherSizeMaybe(0), storyFlagsPtr(nullptr), unkFlagsPtr(nullptr), dirty(false) {} ItemStoryManagerBase::~ItemStoryManagerBase() { @@ -197,6 +205,10 @@ bool ItemflagManager::commit() { static void postSetup(); static void updateFlagForFlagIndex(u16 stage); class TBoxFlagManagerSub : public TBoxFlagManager { +public: + TBoxFlagManagerSub() { + TBoxFlagManager::sInstance = this; + } // virtual ~TBoxFlagManagerSub() {} }; @@ -213,14 +225,23 @@ class ItemflagManagerSub : public ItemflagManager { // virtual ~ItemflagManagerSub() {} }; +class SceneflagManagerSub : public SceneflagManager { +}; +class DungeonflagManagerSub : public DungeonflagManager { + +}; + +class SkipflagManagerSub : public SkipflagManager { + +}; void setupFlagManagers(EGG::Heap *heap) { if (SceneflagManager::sInstance == nullptr) { - SceneflagManager::sInstance = new (heap) SceneflagManager(); + SceneflagManager::sInstance = new (heap) SceneflagManagerSub(); mHeap m(heap); - SceneflagManager::sInstance->doNothing(); + SceneflagManager::sInstance->init(); } if (TBoxFlagManager::sInstance == nullptr) { @@ -248,15 +269,15 @@ void setupFlagManagers(EGG::Heap *heap) { } if (DungeonflagManager::sInstance == nullptr) { - DungeonflagManager::sInstance = new (heap) DungeonflagManager(); + DungeonflagManager::sInstance = new (heap) DungeonflagManagerSub(); mHeap m(heap); - DungeonflagManager::sInstance->setupFlagStuff(); + DungeonflagManager::sInstance->init(); } if (SkipflagManager::sInstance == nullptr) { - SkipflagManager::sInstance = new (heap) SkipflagManager(); + SkipflagManager::sInstance = new (heap) SkipflagManagerSub(); mHeap m(heap); - SkipflagManager::sInstance->unsetCommitFlag(); + SkipflagManager::sInstance->init(); } postSetup(); @@ -273,11 +294,26 @@ void copyAllFlagManagersFromSave() { StoryflagManager::sInstance->copyFlagsFromSave_Priv(); ItemflagManager::sInstance->copyFlagsFromSave_Priv(); DungeonflagManager::sInstance->copyFromSave(flag); - SkipflagManager::sInstance->copyFromSave(); + SkipflagManager::sInstance->thunk_copyFromSave(); EnemyDefeatManager::sInstance->copyFromSave(flag); } -static void updateFlagForFlagIndex(u16 stage) {} +static void updateFlagForFlagIndex(u16 stage) { + SceneflagManager::sInstance->updateFlagindex(stage); + TBoxFlagManager::sInstance->copyFromSave(stage); + EnemyDefeatManager::sInstance->updateFlagIndex(stage); + DungeonflagManager::sInstance->copyFromSave(stage); +} + +void commitAllFlagManagers() { + StoryflagManager::sInstance->commit(); + ItemflagManager::sInstance->commit(); + DungeonflagManager::sInstance->doCommit(); + SkipflagManager::sInstance->commitFlags(); + SceneflagManager::sInstance->doCommit(); + TBoxFlagManager::sInstance->commitIfNecessary(); + EnemyDefeatManager::sInstance->commitIfNecessary(); +} extern "C" bool checkedMemcpy(void *dest, u32 destLen, const void *src, u32 count) { if (dest == nullptr || src == nullptr || destLen < count || destLen > 0xFFFF) { diff --git a/src/toBeSorted/flag_managers/sceneflag_manager.inc b/src/toBeSorted/flag_managers/sceneflag_manager.inc index 0f7b7b89..da696f74 100644 --- a/src/toBeSorted/flag_managers/sceneflag_manager.inc +++ b/src/toBeSorted/flag_managers/sceneflag_manager.inc @@ -10,7 +10,7 @@ u16 SceneflagManager::sTempFlags[] = {}; u16 SceneflagManager::sSceneFlags[8] = {}; u16 SceneflagManager::sZoneFlags[0xFC] = {}; -void SceneflagManager::doNothing() {} +void SceneflagManager::init() {} void SceneflagManager::setShouldCommit(u16 flag) { mShouldCommit = 1; } diff --git a/src/toBeSorted/flag_managers/skipflag_manager.inc b/src/toBeSorted/flag_managers/skipflag_manager.inc index e2800a32..0d859f5e 100644 --- a/src/toBeSorted/flag_managers/skipflag_manager.inc +++ b/src/toBeSorted/flag_managers/skipflag_manager.inc @@ -17,7 +17,7 @@ public: void copyFromSave(); void setCommitFlag(u16 flag); SkipflagManager(); - void unsetCommitFlag(); + void init(); void thunk_copyFromSave(); void setFlag(u16 flag); bool checkFlag(u16 flag); @@ -44,7 +44,7 @@ void SkipflagManager::setCommitFlag(u16 flag) { SkipflagManager::SkipflagManager() : mFlagSpace(sSkipFlags, ARRAY_LENGTH(sSkipFlags)), mShouldCommit(false) {} // 800bfc30 -void SkipflagManager::unsetCommitFlag() { +void SkipflagManager::init() { mShouldCommit = false; } From 5e73b2b902c82b51e489e7f1b6d5644388a706de Mon Sep 17 00:00:00 2001 From: robojumper Date: Fri, 25 Oct 2024 12:08:24 +0200 Subject: [PATCH 3/9] OK, checkpoint --- config/SOUE01/symbols.txt | 28 ++++---- configure.py | 2 +- include/d/flag/flag_managers.h | 13 ++++ include/toBeSorted/item_story_flag_manager.h | 27 ++++---- src/REL/d/t/d_t_dowsing.cpp | 8 +-- src/toBeSorted/counters/rupee_counter.cpp | 2 +- .../flag_managers/flag_managers.cpp | 65 ++++++------------- src/toBeSorted/flag_managers/flag_space.inc | 5 +- .../flag_managers/skipflag_manager.inc | 3 +- 9 files changed, 70 insertions(+), 83 deletions(-) create mode 100644 include/d/flag/flag_managers.h diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index a4c38ee4..d052772d 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -3560,7 +3560,7 @@ fn_8009EAE0 = .text:0x8009EAE0; // type:function size:0x4 fn_8009EAF0 = .text:0x8009EAF0; // type:function size:0xC fn_8009EB00 = .text:0x8009EB00; // type:function size:0xC fn_8009EB10 = .text:0x8009EB10; // type:function size:0xC -fn_8009EB20 = .text:0x8009EB20; // type:function size:0x8 +setFlag__15ItemflagManagerFUs = .text:0x8009EB20; // type:function size:0x8 copyQueuedEventToCurrentAndHandleSkipEvent = .text:0x8009EB30; // type:function size:0x36C fn_8009EEA0 = .text:0x8009EEA0; // type:function size:0x53C alsoSetAsCurrentEvent__12EventManagerFP9dAcBase_cP5EventPv = .text:0x8009F3E0; // type:function size:0x470 @@ -4147,15 +4147,15 @@ setupUnkFlagStuff__20ItemStoryManagerBaseFP17UnkFlagDefinitionUs = .text:0x800BF copyFlagsFromSave_Priv__20ItemStoryManagerBaseFv = .text:0x800BF380; // type:function size:0x58 init__20ItemStoryManagerBaseFv = .text:0x800BF3E0; // type:function size:0x88 setFlagszptr__20ItemStoryManagerBaseFv = .text:0x800BF470; // type:function size:0x4 -getCounterOrFlag__20ItemStoryManagerBaseCFUs = .text:0x800BF480; // type:function size:0x58 +getFlag__20ItemStoryManagerBaseCFUs = .text:0x800BF480; // type:function size:0x58 getUncommittedValue_Priv__20ItemStoryManagerBaseFUs = .text:0x800BF4E0; // type:function size:0x50 setOrClearFlag__20ItemStoryManagerBaseFUsUs = .text:0x800BF530; // type:function size:0x78 setFlag__20ItemStoryManagerBaseFUs = .text:0x800BF5B0; // type:function size:0x8 unsetFlag__20ItemStoryManagerBaseFUs = .text:0x800BF5C0; // type:function size:0x8 -thunk_setOrClearFlag__20ItemStoryManagerBaseFUsUs = .text:0x800BF5D0; // type:function size:0x4 -getFlag__20ItemStoryManagerBaseCFUs = .text:0x800BF5E0; // type:function size:0x4 +setFlagOrCounterToValue__20ItemStoryManagerBaseFUsUs = .text:0x800BF5D0; // type:function size:0x4 +getCounterOrFlag__20ItemStoryManagerBaseCFUs = .text:0x800BF5E0; // type:function size:0x4 getUncommittedValue__20ItemStoryManagerBaseFUs = .text:0x800BF5F0; // type:function size:0x4 -FUN_800bf600__20ItemStoryManagerBaseFUs = .text:0x800BF600; // type:function size:0x4 +unk3__20ItemStoryManagerBaseFUs = .text:0x800BF600; // type:function size:0x4 FUN_800bf610__20ItemStoryManagerBaseFUs = .text:0x800BF610; // type:function size:0x18 onDirty__20ItemStoryManagerBaseFv = .text:0x800BF630; // type:function size:0x4 FUN_800bf640__20ItemStoryManagerBaseFUs = .text:0x800BF640; // type:function size:0x10 @@ -4198,7 +4198,7 @@ postSetup__Fv = .text:0x800C01E0; // type:function size:0x8 copyAllFlagManagersFromSave__Fv = .text:0x800C01F0; // type:function size:0x78 updateFlagForFlagIndex__FUs = .text:0x800C0270; // type:function size:0x58 commitAllFlagManagers__Fv = .text:0x800C02D0; // type:function size:0x54 -checkedMemcpy = .text:0x800C0330; // type:function size:0x54 +checkedMemcpy__FPvUlPCvUl = .text:0x800C0330; // type:function size:0x54 getSaveFlagSpace__15ItemflagManagerCFv = .text:0x800C0390; // type:function size:0x8 unk3__15ItemflagManagerFUs = .text:0x800C03A0; // type:function size:0x8 getUncommittedValue__15ItemflagManagerFUs = .text:0x800C03B0; // type:function size:0x8 @@ -4211,10 +4211,10 @@ getSaveFlagSpace__16StoryflagManagerCFv = .text:0x800C0450; // type:function siz doCommit__16StoryflagManagerFv = .text:0x800C0460; // type:function size:0x44 setFlagszptr__16StoryflagManagerFv = .text:0x800C04B0; // type:function size:0xC doCommit__18EnemyDefeatManagerFv = .text:0x800C04C0; // type:function size:0x44 -__dt__18ItemflagManagerSubFv = .text:0x800C0510; // type:function size:0x5C -__dt__19StoryflagManagerSubFv = .text:0x800C0570; // type:function size:0x5C -__dt__21EnemyDefeatManagerSubFv = .text:0x800C05D0; // type:function size:0x40 -__dt__18TBoxFlagManagerSubFv = .text:0x800C0610; // type:function size:0x40 +__dt__32MyFlagManager<15ItemflagManager>Fv = .text:0x800C0510; // type:function size:0x5C +__dt__33MyFlagManager<16StoryflagManager>Fv = .text:0x800C0570; // type:function size:0x5C +__dt__35MyFlagManager<18EnemyDefeatManager>Fv = .text:0x800C05D0; // type:function size:0x40 +__dt__32MyFlagManager<15TBoxFlagManager>Fv = .text:0x800C0610; // type:function size:0x40 fn_800C0650 = .text:0x800C0650; // type:function size:0x3C fn_800C0690 = .text:0x800C0690; // type:function size:0x70 fn_800C0700 = .text:0x800C0700; // type:function size:0x7C @@ -31008,10 +31008,10 @@ lbl_80510B48 = .data:0x80510B48; // type:object size:0xC lbl_80510B54 = .data:0x80510B54; // type:object size:0xC lbl_80510B60 = .data:0x80510B60; // type:object size:0x10 lbl_80510B70 = .data:0x80510B70; // type:object size:0x18 -__vt__18ItemflagManagerSub = .data:0x80510B88; // type:object size:0x3C -__vt__19StoryflagManagerSub = .data:0x80510BC4; // type:object size:0x3C -__vt__21EnemyDefeatManagerSub = .data:0x80510C00; // type:object size:0x14 -__vt__18TBoxFlagManagerSub = .data:0x80510C14; // type:object size:0x14 +__vt__32MyFlagManager<15ItemflagManager> = .data:0x80510B88; // type:object size:0x3C +__vt__33MyFlagManager<16StoryflagManager> = .data:0x80510BC4; // type:object size:0x3C +__vt__35MyFlagManager<18EnemyDefeatManager> = .data:0x80510C00; // type:object size:0x14 +__vt__32MyFlagManager<15TBoxFlagManager> = .data:0x80510C14; // type:object size:0x14 __vt__15ItemflagManager = .data:0x80510C28; // type:object size:0x3C __vt__16StoryflagManager = .data:0x80510C64; // type:object size:0x3C __vt__20ItemStoryManagerBase = .data:0x80510CA0; // type:object size:0x3C diff --git a/configure.py b/configure.py index 0e2d79c1..7186abab 100644 --- a/configure.py +++ b/configure.py @@ -321,7 +321,7 @@ config.libs = [ "progress_category": "game", "host": False, "objects": [ - Object(NonMatching, "toBeSorted/flag_managers/flag_managers.cpp", extra_cflags=["-i src"]), + Object(Matching, "toBeSorted/flag_managers/flag_managers.cpp"), Object(NonMatching, "toBeSorted/special_item_drop_mgr.cpp"), Object(Matching, "d/d_base.cpp"), Object(Matching, "d/d_dvd.cpp"), diff --git a/include/d/flag/flag_managers.h b/include/d/flag/flag_managers.h new file mode 100644 index 00000000..e834dfbf --- /dev/null +++ b/include/d/flag/flag_managers.h @@ -0,0 +1,13 @@ +#ifndef D_FLAG_FLAG_MANAGERS_H +#define D_FLAG_FLAG_MANAGERS_H + +#include "egg/core/eggHeap.h" + +void setupFlagManagers(EGG::Heap *heap); +void copyAllFlagManagersFromSave(); +void updateFlagForFlagIndex(u16 stage); +void commitAllFlagManagers(); + +bool checkedMemcpy(void *dest, u32 destLen, const void *src, u32 count); + +#endif diff --git a/include/toBeSorted/item_story_flag_manager.h b/include/toBeSorted/item_story_flag_manager.h index 07c96a09..5879954d 100644 --- a/include/toBeSorted/item_story_flag_manager.h +++ b/include/toBeSorted/item_story_flag_manager.h @@ -24,7 +24,7 @@ public: /** 0x28 */ virtual void setFlagOrCounterToValue(u16 flag, u16 value); /** 0x2C */ virtual u16 getCounterOrFlag(u16 flag) const; /** 0x30 */ virtual u16 getUncommittedValue(u16 flag); - /** 0x34 */ virtual void unk3(u16 arg); + /** 0x34 */ virtual u16 unk3(u16 arg); /** 0x38 */ virtual const u16 *getSaveFlagSpace() const = 0; @@ -33,10 +33,8 @@ public: void copyFlagsFromSave_Priv(); void setupUnkFlagStuff(UnkFlagDefinition *def, u16 count); void doCommit_Priv(); - void thunk_setOrClearFlag(u16 flag, u16 value); void setOrClearFlag(u16 flag, u16 value); - u16 getFlag(u16 flag) const; - u16 FUN_800bf600(u16 flag); + u16 getFlag(u16 flag) const; void FUN_800bf610(u16 flag); u16 FUN_800bf640(u16 flag); void FUN_800bf690(); @@ -72,12 +70,7 @@ public: u16 *flags = storyFlagsPtr->getFlagPtrUnchecked(); FileManager::sInstance->setStoryFlags(flags, 0, sz); } - /** 0x20 */ virtual void setFlag(u16 flag) override; /** 0x24 */ virtual void unsetFlag(u16 flag) override; - /** 0x28 */ virtual void setFlagOrCounterToValue(u16 flag, u16 value) override; - /** 0x2C */ virtual u16 getCounterOrFlag(u16 flag) const override; - /** 0x30 */ virtual u16 getUncommittedValue(u16 flag) override; - /** 0x34 */ virtual void unk3(u16 arg) override; /** 0x38 */ virtual const u16 *getSaveFlagSpace() const override { return FileManager::sInstance->getStoryFlagsConst(); }; @@ -108,26 +101,32 @@ public: u16 *flags = storyFlagsPtr->getFlagPtrUnchecked(); FileManager::sInstance->setItemFlags(flags, 0, sz); } - /** 0x20 */ virtual void setFlag(u16 flag); + /** 0x20 */ virtual void setFlag(u16 flag) { + ItemStoryManagerBase::setFlag(flag & ~0x4000); + } /** 0x24 */ virtual void unsetFlag(u16 flag) { ItemStoryManagerBase::unsetFlag(flag & ~0x4000); } /** 0x28 */ virtual void setFlagOrCounterToValue(u16 flag, u16 value) { - ItemStoryManagerBase::thunk_setOrClearFlag(flag & ~0x4000, value); + ItemStoryManagerBase::setFlagOrCounterToValue(flag & ~0x4000, value); } /** 0x2C */ virtual u16 getCounterOrFlag(u16 flag) const { - return getFlag(flag & ~0x4000); + return ItemStoryManagerBase::getCounterOrFlag(flag & ~0x4000); } /** 0x30 */ virtual u16 getUncommittedValue(u16 flag) { return ItemStoryManagerBase::getUncommittedValue(flag & ~0x4000); } - /** 0x34 */ virtual void unk3(u16 arg) { - FUN_800bf600(arg & ~0x4000); + /** 0x34 */ virtual u16 unk3(u16 arg) { + return ItemStoryManagerBase::unk3(arg & ~0x4000); } /** 0x38 */ virtual const u16 *getSaveFlagSpace() const { return FileManager::sInstance->getItemFlagsConst(); }; + u16 getFlagDirect(u16 flag) { + return ItemStoryManagerBase::getCounterOrFlag(flag); + } + public: static ItemflagManager *sInstance; static u16 sFlags[0x40]; diff --git a/src/REL/d/t/d_t_dowsing.cpp b/src/REL/d/t/d_t_dowsing.cpp index dee083da..d9e977be 100644 --- a/src/REL/d/t/d_t_dowsing.cpp +++ b/src/REL/d/t/d_t_dowsing.cpp @@ -56,13 +56,13 @@ bool dTgDowsing_c::checkDowsing() const { switch (mDowsingOption) { case TRIAL_0: - return ItemflagManager::sInstance->getFlag(187) && !StoryflagManager::sInstance->getCounterOrFlag(93); + return ItemflagManager::sInstance->getFlagDirect(187) && !StoryflagManager::sInstance->getCounterOrFlag(93); case TRIAL_1: - return ItemflagManager::sInstance->getFlag(188) && !StoryflagManager::sInstance->getCounterOrFlag(97); + return ItemflagManager::sInstance->getFlagDirect(188) && !StoryflagManager::sInstance->getCounterOrFlag(97); case TRIAL_2: - return ItemflagManager::sInstance->getFlag(189) && !StoryflagManager::sInstance->getCounterOrFlag(98); + return ItemflagManager::sInstance->getFlagDirect(189) && !StoryflagManager::sInstance->getCounterOrFlag(98); case TRIAL_3: - return ItemflagManager::sInstance->getFlag(193) && !StoryflagManager::sInstance->getCounterOrFlag(99); + return ItemflagManager::sInstance->getFlagDirect(193) && !StoryflagManager::sInstance->getCounterOrFlag(99); case PROPELLER: return DowsingTarget::hasPropellerDowsing(); case WATER_BASIN: return DowsingTarget::hasWaterBasinDowsing(); case CRYSTAL_BALL: return DowsingTarget::hasCrystalBallDowsing(); diff --git a/src/toBeSorted/counters/rupee_counter.cpp b/src/toBeSorted/counters/rupee_counter.cpp index 0ccfa6eb..69cb0ff9 100644 --- a/src/toBeSorted/counters/rupee_counter.cpp +++ b/src/toBeSorted/counters/rupee_counter.cpp @@ -28,7 +28,7 @@ struct WalletStruct { }; const WalletStruct *wallet = &wallet_definitions[3]; for (; i < 4; i++, wallet--) { - if (ItemflagManager::sInstance->getFlag(wallet->flag)) { + if (ItemflagManager::sInstance->getFlagDirect(wallet->flag)) { return wallet->capacity; } } diff --git a/src/toBeSorted/flag_managers/flag_managers.cpp b/src/toBeSorted/flag_managers/flag_managers.cpp index 2f929ee9..842a76d7 100644 --- a/src/toBeSorted/flag_managers/flag_managers.cpp +++ b/src/toBeSorted/flag_managers/flag_managers.cpp @@ -1,5 +1,7 @@ // clang-format off +#include "d/flag/flag_managers.h" + #include "common.h" #include "toBeSorted/sceneflag_manager.h" #include @@ -61,7 +63,7 @@ void ItemStoryManagerBase::setFlagszptr() { } /** 800bf480 */ -u16 ItemStoryManagerBase::getCounterOrFlag(u16 flag) const { +u16 ItemStoryManagerBase::getFlag(u16 flag) const { const u16 *data = this->getSaveFlagSpace(); return this->unkFlagsPtr->getCounterOrFlag(flag, data, this->flagSizeMaybe); } @@ -91,13 +93,13 @@ void ItemStoryManagerBase::unsetFlag(u16 flag) { } /** 800bf5d0 */ -void ItemStoryManagerBase::thunk_setOrClearFlag(u16 flag, u16 value) { +void ItemStoryManagerBase::setFlagOrCounterToValue(u16 flag, u16 value) { this->setOrClearFlag(flag, value); } /** 800bf5e0 */ -u16 ItemStoryManagerBase::getFlag(u16 flag) const { - return ItemStoryManagerBase::getCounterOrFlag(flag); +u16 ItemStoryManagerBase::getCounterOrFlag(u16 flag) const { + return ItemStoryManagerBase::getFlag(flag); } /** 800bf5f0 */ @@ -106,7 +108,7 @@ u16 ItemStoryManagerBase::getUncommittedValue(u16 flag) { } /** 800bf600 */ -u16 ItemStoryManagerBase::FUN_800bf600(u16 flag) { +u16 ItemStoryManagerBase::unk3(u16 flag) { return this->FUN_800bf640(flag); } @@ -203,79 +205,54 @@ bool ItemflagManager::commit() { #include static void postSetup(); -static void updateFlagForFlagIndex(u16 stage); -class TBoxFlagManagerSub : public TBoxFlagManager { + +template +class MyFlagManager : public T { public: - TBoxFlagManagerSub() { - TBoxFlagManager::sInstance = this; + MyFlagManager() { } - // virtual ~TBoxFlagManagerSub() {} -}; - -class EnemyDefeatManagerSub : public EnemyDefeatManager { - // virtual ~EnemyDefeatManagerSub() {} -}; - - -class StoryflagManagerSub : public StoryflagManager { - // virtual ~StoryflagManagerSub() {} -}; - -class ItemflagManagerSub : public ItemflagManager { - // virtual ~ItemflagManagerSub() {} -}; - -class SceneflagManagerSub : public SceneflagManager { - -}; - -class DungeonflagManagerSub : public DungeonflagManager { - -}; - -class SkipflagManagerSub : public SkipflagManager { - + ~MyFlagManager() {} }; void setupFlagManagers(EGG::Heap *heap) { if (SceneflagManager::sInstance == nullptr) { - SceneflagManager::sInstance = new (heap) SceneflagManagerSub(); + SceneflagManager::sInstance = new (heap) MyFlagManager(); mHeap m(heap); SceneflagManager::sInstance->init(); } if (TBoxFlagManager::sInstance == nullptr) { - TBoxFlagManager::sInstance = new (heap) TBoxFlagManagerSub(); + TBoxFlagManager::sInstance = new (heap) MyFlagManager(); mHeap m(heap); TBoxFlagManager::sInstance->init(); } if (EnemyDefeatManager::sInstance == nullptr) { - EnemyDefeatManager::sInstance = new (heap) EnemyDefeatManagerSub(); + EnemyDefeatManager::sInstance = new (heap) MyFlagManager(); mHeap m(heap); EnemyDefeatManager::sInstance->init(); } if (StoryflagManager::sInstance == nullptr) { - StoryflagManager::sInstance = new (heap) StoryflagManagerSub(); + StoryflagManager::sInstance = new (heap) MyFlagManager(); mHeap m(heap); StoryflagManager::sInstance->init(); } if (ItemflagManager::sInstance == nullptr) { - ItemflagManager::sInstance = new (heap) ItemflagManagerSub(); + ItemflagManager::sInstance = new (heap) MyFlagManager(); mHeap m(heap); ItemflagManager::sInstance->init(); } if (DungeonflagManager::sInstance == nullptr) { - DungeonflagManager::sInstance = new (heap) DungeonflagManagerSub(); + DungeonflagManager::sInstance = new (heap) MyFlagManager(); mHeap m(heap); DungeonflagManager::sInstance->init(); } if (SkipflagManager::sInstance == nullptr) { - SkipflagManager::sInstance = new (heap) SkipflagManagerSub(); + SkipflagManager::sInstance = new (heap) MyFlagManager(); mHeap m(heap); SkipflagManager::sInstance->init(); } @@ -298,7 +275,7 @@ void copyAllFlagManagersFromSave() { EnemyDefeatManager::sInstance->copyFromSave(flag); } -static void updateFlagForFlagIndex(u16 stage) { +void updateFlagForFlagIndex(u16 stage) { SceneflagManager::sInstance->updateFlagindex(stage); TBoxFlagManager::sInstance->copyFromSave(stage); EnemyDefeatManager::sInstance->updateFlagIndex(stage); @@ -315,7 +292,7 @@ void commitAllFlagManagers() { EnemyDefeatManager::sInstance->commitIfNecessary(); } -extern "C" bool checkedMemcpy(void *dest, u32 destLen, const void *src, u32 count) { +bool checkedMemcpy(void *dest, u32 destLen, const void *src, u32 count) { if (dest == nullptr || src == nullptr || destLen < count || destLen > 0xFFFF) { return true; } else { diff --git a/src/toBeSorted/flag_managers/flag_space.inc b/src/toBeSorted/flag_managers/flag_space.inc index 08e9e83e..93848a41 100644 --- a/src/toBeSorted/flag_managers/flag_space.inc +++ b/src/toBeSorted/flag_managers/flag_space.inc @@ -1,8 +1,7 @@ +#include "d/flag/flag_managers.h" #include "toBeSorted/flag_space.h" #include "toBeSorted/file_manager.h" -#include - -extern "C" bool checkedMemcpy(void *dest, u32 destLen, const void *src, u32 count); +#include "common.h" u16 *FlagSpace::getFlagPtrChecked() const { filemanagerCheck(); diff --git a/src/toBeSorted/flag_managers/skipflag_manager.inc b/src/toBeSorted/flag_managers/skipflag_manager.inc index 0d859f5e..b568ebd7 100644 --- a/src/toBeSorted/flag_managers/skipflag_manager.inc +++ b/src/toBeSorted/flag_managers/skipflag_manager.inc @@ -1,10 +1,9 @@ #include "common.h" +#include "d/flag/flag_managers.h" #include "toBeSorted/bitwise_flag_helper.h" #include "toBeSorted/file_manager.h" #include "toBeSorted/flag_space.h" -extern "C" bool checkedMemcpy(void *dest, u32 destLen, const void *src, u32 count); - class SkipflagManager { public: bool mShouldCommit; From 50b16f7da4319dd059ace7e8015b2f74fda38a68 Mon Sep 17 00:00:00 2001 From: robojumper Date: Fri, 25 Oct 2024 14:36:31 +0200 Subject: [PATCH 4/9] Separate our inc files --- .clangd | 5 + .vscode/settings.json | 2 +- config/SOUE01/splits.txt | 2 +- configure.py | 2 +- include/d/flag/baseflag_manager.h | 47 +++ .../flag}/bitwise_flag_helper.h | 0 include/d/flag/committable_flag_manager.h | 23 ++ include/d/flag/enemyflag_manager.h | 41 +++ include/{toBeSorted => d/flag}/flag_space.h | 0 include/d/flag/itemflag_manager.h | 60 ++++ .../flag}/sceneflag_manager.h | 4 +- include/d/flag/skipflag_manager.h | 29 ++ include/d/flag/storyflag_manager.h | 38 +++ include/d/flag/tboxflag_manager.h | 33 ++ .../{toBeSorted => d/flag}/unk_flag_stuff.h | 0 include/toBeSorted/item_story_flag_manager.h | 137 -------- include/toBeSorted/misc_flag_managers.h | 87 ----- src/REL/d/a/obj/d_a_obj_bamboo_island.cpp | 2 +- src/REL/d/a/obj/d_a_obj_island_nusi.cpp | 2 +- src/REL/d/a/obj/d_a_obj_junk_repairing.cpp | 2 +- src/REL/d/a/obj/d_a_obj_pool_cock.cpp | 2 +- src/REL/d/a/obj/d_a_obj_toD3_stone_figure.cpp | 2 +- src/REL/d/a/obj/d_a_obj_utajima.cpp | 2 +- src/REL/d/t/d_t_dowsing.cpp | 6 +- src/REL/d/t/d_t_genki_dws_tgt.cpp | 4 +- src/REL/d/t/d_t_reaction.cpp | 2 +- src/REL/d/t/d_t_ship_window.cpp | 2 +- src/REL/d/t/d_t_sw_area.cpp | 4 +- src/REL/d/t/d_t_time_area_check.cpp | 2 +- src/REL/d/t/d_t_timer.cpp | 2 +- src/REL/d/t/d_t_touch.cpp | 2 +- src/d/a/d_a_base.cpp | 2 +- src/d/a/obj/d_a_obj_switch.cpp | 2 +- src/d/flag/baseflag_manager.inc | 118 +++++++ .../flag}/bitwise_flag_helper.inc | 2 +- src/d/flag/committable_flag_manager.inc | 12 + .../flag}/dungeonflag_manager.inc | 6 +- .../flag/enemyflag_manager.inc} | 72 +---- src/d/flag/flag_managers.cpp | 125 ++++++++ .../flag_managers => d/flag}/flag_space.inc | 2 +- src/d/flag/itemflag_manager.inc | 29 ++ .../flag}/sceneflag_manager.inc | 2 +- .../flag}/skipflag_manager.inc | 24 +- src/d/flag/storyflag_manager.inc | 36 +++ src/d/flag/tboxflag_manager.inc | 54 ++++ .../flag}/unk_flag_stuff.inc | 2 +- src/d/tg/d_t_switch.cpp | 2 +- src/toBeSorted/counters/counter.cpp | 2 +- src/toBeSorted/counters/rupee_counter.cpp | 2 +- src/toBeSorted/dowsing_target.cpp | 4 +- .../flag_managers/flag_managers.cpp | 302 ------------------ 51 files changed, 690 insertions(+), 656 deletions(-) create mode 100644 .clangd create mode 100644 include/d/flag/baseflag_manager.h rename include/{toBeSorted => d/flag}/bitwise_flag_helper.h (100%) create mode 100644 include/d/flag/committable_flag_manager.h create mode 100644 include/d/flag/enemyflag_manager.h rename include/{toBeSorted => d/flag}/flag_space.h (100%) create mode 100644 include/d/flag/itemflag_manager.h rename include/{toBeSorted => d/flag}/sceneflag_manager.h (96%) create mode 100644 include/d/flag/skipflag_manager.h create mode 100644 include/d/flag/storyflag_manager.h create mode 100644 include/d/flag/tboxflag_manager.h rename include/{toBeSorted => d/flag}/unk_flag_stuff.h (100%) delete mode 100644 include/toBeSorted/item_story_flag_manager.h delete mode 100644 include/toBeSorted/misc_flag_managers.h create mode 100644 src/d/flag/baseflag_manager.inc rename src/{toBeSorted/flag_managers => d/flag}/bitwise_flag_helper.inc (89%) create mode 100644 src/d/flag/committable_flag_manager.inc rename src/{toBeSorted/flag_managers => d/flag}/dungeonflag_manager.inc (95%) rename src/{toBeSorted/flag_managers/misc_flag_managers.inc => d/flag/enemyflag_manager.inc} (52%) create mode 100644 src/d/flag/flag_managers.cpp rename src/{toBeSorted/flag_managers => d/flag}/flag_space.inc (96%) create mode 100644 src/d/flag/itemflag_manager.inc rename src/{toBeSorted/flag_managers => d/flag}/sceneflag_manager.inc (99%) rename src/{toBeSorted/flag_managers => d/flag}/skipflag_manager.inc (77%) create mode 100644 src/d/flag/storyflag_manager.inc create mode 100644 src/d/flag/tboxflag_manager.inc rename src/{toBeSorted/flag_managers => d/flag}/unk_flag_stuff.inc (97%) delete mode 100644 src/toBeSorted/flag_managers/flag_managers.cpp diff --git a/.clangd b/.clangd new file mode 100644 index 00000000..ca38e50f --- /dev/null +++ b/.clangd @@ -0,0 +1,5 @@ +# https://clangd.llvm.org/config +CompileFlags: + Add: [ + "-Wno-c++11-compat-deprecated-writable-strings" + ] diff --git a/.vscode/settings.json b/.vscode/settings.json index 6a1a17be..13b3e250 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -15,7 +15,7 @@ "files.insertFinalNewline": true, "files.trimFinalNewlines": true, "files.associations": { - "*.inc": "c", + "*.inc": "cpp", ".clangd": "yaml" }, // Disable C/C++ IntelliSense, use clangd instead diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index be7224f0..66dc9b2d 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -199,7 +199,7 @@ d/d_text_writer.cpp: toBeSorted/time_area_mgr.cpp: .text start:0x800B9280 end:0x800BB2A0 -toBeSorted/flag_managers/flag_managers.cpp: +d/flag/flag_managers.cpp: .text start:0x800BD8C0 end:0x800C0650 .data start:0x80510B88 end:0x80510D10 .sbss start:0x805753E0 end:0x80575410 diff --git a/configure.py b/configure.py index 7186abab..157744c5 100644 --- a/configure.py +++ b/configure.py @@ -321,7 +321,7 @@ config.libs = [ "progress_category": "game", "host": False, "objects": [ - Object(Matching, "toBeSorted/flag_managers/flag_managers.cpp"), + Object(Matching, "d/flag/flag_managers.cpp"), Object(NonMatching, "toBeSorted/special_item_drop_mgr.cpp"), Object(Matching, "d/d_base.cpp"), Object(Matching, "d/d_dvd.cpp"), diff --git a/include/d/flag/baseflag_manager.h b/include/d/flag/baseflag_manager.h new file mode 100644 index 00000000..9d187957 --- /dev/null +++ b/include/d/flag/baseflag_manager.h @@ -0,0 +1,47 @@ +#ifndef D_FLAG_BASEFLAG_MANAGER_H +#define D_FLAG_BASEFLAG_MANAGER_H + +#include "d/flag/unk_flag_stuff.h" +#include "d/flag/flag_space.h" + +class ItemStoryManagerBase { +public: + ItemStoryManagerBase(); + + /** 0x08 */ virtual ~ItemStoryManagerBase(); + /** 0x0C */ virtual void setFlagszptr(); + /** 0x10 */ virtual void onDirty(); + /** 0x14 */ virtual void copyFlagsFromSave() = 0; + /** 0x18 */ virtual void setupUnkFlagsStuff() = 0; + /** 0x1C */ virtual void doCommit() = 0; + /** 0x20 */ virtual void setFlag(u16 flag); + /** 0x24 */ virtual void unsetFlag(u16 flag); + /** 0x28 */ virtual void setFlagOrCounterToValue(u16 flag, u16 value); + /** 0x2C */ virtual u16 getCounterOrFlag(u16 flag) const; + /** 0x30 */ virtual u16 getUncommittedValue(u16 flag); + /** 0x34 */ virtual u16 unk3(u16 arg); + /** 0x38 */ virtual const u16 *getSaveFlagSpace() const = 0; + + + void init(); + void setFlagSizes(u16 flagSizeMaybe, u16 anotherFlagSizeMaybe); + void copyFlagsFromSave_Priv(); + void setupUnkFlagStuff(UnkFlagDefinition *def, u16 count); + void doCommit_Priv(); + void setOrClearFlag(u16 flag, u16 value); + u16 getFlag(u16 flag) const; + void FUN_800bf610(u16 flag); + u16 FUN_800bf640(u16 flag); + void FUN_800bf690(); + + u16 getUncommittedValue_Priv(u16 flag); + +protected: + /** 0x04 */ u16 flagSizeMaybe; + /** 0x06 */ u16 anotherSizeMaybe; + /** 0x08 */ FlagSpace *storyFlagsPtr; + /** 0x0C */ UnkFlagStuff *unkFlagsPtr; + /** 0x10 */ bool dirty; +}; + +#endif diff --git a/include/toBeSorted/bitwise_flag_helper.h b/include/d/flag/bitwise_flag_helper.h similarity index 100% rename from include/toBeSorted/bitwise_flag_helper.h rename to include/d/flag/bitwise_flag_helper.h diff --git a/include/d/flag/committable_flag_manager.h b/include/d/flag/committable_flag_manager.h new file mode 100644 index 00000000..c1d40787 --- /dev/null +++ b/include/d/flag/committable_flag_manager.h @@ -0,0 +1,23 @@ +#ifndef D_FLAG_COMMITTABLE_FLAG_MANAGER_H +#define D_FLAG_COMMITTABLE_FLAG_MANAGER_H + +class CommittableFlagManager { +public: + bool mNeedsCommit; + + virtual void doCommit() = 0; + virtual ~CommittableFlagManager() {} + bool commitIfNecessary(); + void setNeedsCommit(bool commit) { + mNeedsCommit = commit; + } + CommittableFlagManager() { + mNeedsCommit = false; + } + CommittableFlagManager(bool commit) { + mNeedsCommit = commit; + } +}; + + +#endif diff --git a/include/d/flag/enemyflag_manager.h b/include/d/flag/enemyflag_manager.h new file mode 100644 index 00000000..b294c4f3 --- /dev/null +++ b/include/d/flag/enemyflag_manager.h @@ -0,0 +1,41 @@ +#ifndef D_FLAG_ENEMYFLAG_MANAGER_H +#define D_FLAG_ENEMYFLAG_MANAGER_H + +#include "d/flag/bitwise_flag_helper.h" +#include "d/flag/committable_flag_manager.h" +#include "d/flag/flag_space.h" +#include "toBeSorted/file_manager.h" + +class EnemyDefeatManager : public CommittableFlagManager { +public: + FlagSpace mFlagSpace; + BitwiseFlagHelper mFlagHelper; + u16 mSceneIndex; + + static u16 sEnemyDefeatFlags[4096]; + + static EnemyDefeatManager *sInstance; + + void clearSavedFlags(); + bool checkUncommittedFlag(u16 flag); + u16 checkUncommittedFlag2(u16 flag) { + return checkUncommittedFlag(flag); + } + EnemyDefeatManager(); + void init(); + void copyFromSave(u16 sceneIndex); + void updateFlagIndex(u16 sceneIndex); + void clearAll(); + bool checkIsValidFlag(u16 flag); + bool checkFlag(u16 flag); + virtual ~EnemyDefeatManager() {} + virtual u16 getFlagCount() const; + void setFlag(u16 flag); + + virtual void doCommit() override { + FileManager *mgr = FileManager::sInstance; + mgr->setEnemyDefeatFlags(mFlagSpace.getFlagPtrUnchecked(), 0, 0x1000); + }; +}; + +#endif diff --git a/include/toBeSorted/flag_space.h b/include/d/flag/flag_space.h similarity index 100% rename from include/toBeSorted/flag_space.h rename to include/d/flag/flag_space.h diff --git a/include/d/flag/itemflag_manager.h b/include/d/flag/itemflag_manager.h new file mode 100644 index 00000000..fa55067c --- /dev/null +++ b/include/d/flag/itemflag_manager.h @@ -0,0 +1,60 @@ + +#ifndef D_FLAG_ITEMFLAG_MANAGER_H +#define D_FLAG_ITEMFLAG_MANAGER_H + +#include "d/flag/baseflag_manager.h" +#include "toBeSorted/file_manager.h" + + +class ItemflagManager : public ItemStoryManagerBase { +public: + FlagSpace itemFlags; + + ItemflagManager(); + virtual ~ItemflagManager() {} + + bool commit(); + + /** 0x0C */ virtual void setFlagszptr() override { + storyFlagsPtr = &itemFlags; + } + /** 0x10 */ virtual void onDirty() override; + /** 0x14 */ virtual void copyFlagsFromSave(); + /** 0x18 */ virtual void setupUnkFlagsStuff(); + /** 0x1C */ virtual void doCommit() { + u16 sz = flagSizeMaybe; + u16 *flags = storyFlagsPtr->getFlagPtrUnchecked(); + FileManager::sInstance->setItemFlags(flags, 0, sz); + } + /** 0x20 */ virtual void setFlag(u16 flag) { + ItemStoryManagerBase::setFlag(flag & ~0x4000); + } + /** 0x24 */ virtual void unsetFlag(u16 flag) { + ItemStoryManagerBase::unsetFlag(flag & ~0x4000); + } + /** 0x28 */ virtual void setFlagOrCounterToValue(u16 flag, u16 value) { + ItemStoryManagerBase::setFlagOrCounterToValue(flag & ~0x4000, value); + } + /** 0x2C */ virtual u16 getCounterOrFlag(u16 flag) const { + return ItemStoryManagerBase::getCounterOrFlag(flag & ~0x4000); + } + /** 0x30 */ virtual u16 getUncommittedValue(u16 flag) { + return ItemStoryManagerBase::getUncommittedValue(flag & ~0x4000); + } + /** 0x34 */ virtual u16 unk3(u16 arg) { + return ItemStoryManagerBase::unk3(arg & ~0x4000); + } + /** 0x38 */ virtual const u16 *getSaveFlagSpace() const { + return FileManager::sInstance->getItemFlagsConst(); + }; + + u16 getFlagDirect(u16 flag) { + return ItemStoryManagerBase::getCounterOrFlag(flag); + } + +public: + static ItemflagManager *sInstance; + static u16 sFlags[0x40]; +}; + +#endif diff --git a/include/toBeSorted/sceneflag_manager.h b/include/d/flag/sceneflag_manager.h similarity index 96% rename from include/toBeSorted/sceneflag_manager.h rename to include/d/flag/sceneflag_manager.h index b85d8be1..9e2ce4c3 100644 --- a/include/toBeSorted/sceneflag_manager.h +++ b/include/d/flag/sceneflag_manager.h @@ -2,8 +2,8 @@ #define SCENEFLAG_MANAGER_H #include "common.h" -#include "toBeSorted/bitwise_flag_helper.h" -#include "toBeSorted/flag_space.h" +#include "d/flag/bitwise_flag_helper.h" +#include "d/flag/flag_space.h" class SceneflagManager { diff --git a/include/d/flag/skipflag_manager.h b/include/d/flag/skipflag_manager.h new file mode 100644 index 00000000..52bf2cf4 --- /dev/null +++ b/include/d/flag/skipflag_manager.h @@ -0,0 +1,29 @@ +#ifndef D_FLAG_SKIPFLAG_MANAGER_H +#define D_FLAG_SKIPFLAG_MANAGER_H + + +#include "d/flag/bitwise_flag_helper.h" +#include "d/flag/flag_space.h" + +class SkipflagManager { +public: + SkipflagManager(); + void init(); + + void copyFromSave(); + void setCommitFlag(u16 flag); + void thunk_copyFromSave(); + void setFlag(u16 flag); + bool checkFlag(u16 flag); + bool commitFlags(); + static SkipflagManager *sInstance; + +private: + static u16 sSkipFlags[16]; + + bool mShouldCommit; + BitwiseFlagHelper mFlagHelper; + FlagSpace mFlagSpace; +}; + +#endif diff --git a/include/d/flag/storyflag_manager.h b/include/d/flag/storyflag_manager.h new file mode 100644 index 00000000..d718823d --- /dev/null +++ b/include/d/flag/storyflag_manager.h @@ -0,0 +1,38 @@ +#ifndef D_FLAG_STORYFLAG_MANAGER_H +#define D_FLAG_STORYFLAG_MANAGER_H + +#include "d/flag/baseflag_manager.h" +#include "toBeSorted/file_manager.h" + +class StoryflagManager : public ItemStoryManagerBase { +public: + StoryflagManager(); + + virtual ~StoryflagManager() {} + + FlagSpace storyFlags; + + bool commit(); + + /** 0x0C */ virtual void setFlagszptr() override { + storyFlagsPtr = &storyFlags; + } + /** 0x10 */ virtual void onDirty() override; + /** 0x14 */ virtual void copyFlagsFromSave() override; + /** 0x18 */ virtual void setupUnkFlagsStuff() override; + /** 0x1C */ virtual void doCommit() override { + u16 sz = flagSizeMaybe; + u16 *flags = storyFlagsPtr->getFlagPtrUnchecked(); + FileManager::sInstance->setStoryFlags(flags, 0, sz); + } + /** 0x24 */ virtual void unsetFlag(u16 flag) override; + /** 0x38 */ virtual const u16 *getSaveFlagSpace() const override { + return FileManager::sInstance->getStoryFlagsConst(); + }; + +public: + static StoryflagManager *sInstance; + static u16 sFlags[0x80]; +}; + +#endif diff --git a/include/d/flag/tboxflag_manager.h b/include/d/flag/tboxflag_manager.h new file mode 100644 index 00000000..bc0f36b8 --- /dev/null +++ b/include/d/flag/tboxflag_manager.h @@ -0,0 +1,33 @@ +#ifndef D_FLAG_TBOXFLAG_MANAGER_H +#define D_FLAG_TBOXFLAG_MANAGER_H + +#include "d/flag/bitwise_flag_helper.h" +#include "d/flag/committable_flag_manager.h" +#include "d/flag/flag_space.h" + +class TBoxFlagManager : public CommittableFlagManager { +public: + FlagSpace mFlagSpace; + u16 mSceneIndex; + BitwiseFlagHelper mFlagHelper; + + static u16 sTBoxFlags[2]; + + static TBoxFlagManager *sInstance; + + virtual void doCommit() override; + bool checkUncommittedFlag(u16 flag); + TBoxFlagManager(); + virtual ~TBoxFlagManager() {} + void init(); + void copyFromSave(u32 sceneIndex); + bool checkFlag(u16 sceneIndex, u16 flag); + virtual u16 getFlagCount() const; + void setFlag(u16 flag); + bool checkUncommittedFlag(u16 sceneIndex, u16 flag); + u16 checkUncommittedFlag2(u16 flag) { + return checkUncommittedFlag(flag); + } +}; + +#endif diff --git a/include/toBeSorted/unk_flag_stuff.h b/include/d/flag/unk_flag_stuff.h similarity index 100% rename from include/toBeSorted/unk_flag_stuff.h rename to include/d/flag/unk_flag_stuff.h diff --git a/include/toBeSorted/item_story_flag_manager.h b/include/toBeSorted/item_story_flag_manager.h deleted file mode 100644 index 5879954d..00000000 --- a/include/toBeSorted/item_story_flag_manager.h +++ /dev/null @@ -1,137 +0,0 @@ -#ifndef ITEM_STORY_FLAG_MANAGER_H -#define ITEM_STORY_FLAG_MANAGER_H - -#include "toBeSorted/flag_space.h" -#include "toBeSorted/unk_flag_stuff.h" -#include "toBeSorted/file_manager.h" - -// TODO These classes have an interesting relation and there are like 5 vtables, so -// the stuff in this header should not be relied upon for actually implementing these, -// but we need the interface - -class ItemStoryManagerBase { -public: - ItemStoryManagerBase(); - - /** 0x08 */ virtual ~ItemStoryManagerBase(); - /** 0x0C */ virtual void setFlagszptr(); - /** 0x10 */ virtual void onDirty(); - /** 0x14 */ virtual void copyFlagsFromSave() = 0; - /** 0x18 */ virtual void setupUnkFlagsStuff() = 0; - /** 0x1C */ virtual void doCommit() = 0; - /** 0x20 */ virtual void setFlag(u16 flag); - /** 0x24 */ virtual void unsetFlag(u16 flag); - /** 0x28 */ virtual void setFlagOrCounterToValue(u16 flag, u16 value); - /** 0x2C */ virtual u16 getCounterOrFlag(u16 flag) const; - /** 0x30 */ virtual u16 getUncommittedValue(u16 flag); - /** 0x34 */ virtual u16 unk3(u16 arg); - /** 0x38 */ virtual const u16 *getSaveFlagSpace() const = 0; - - - void init(); - void setFlagSizes(u16 flagSizeMaybe, u16 anotherFlagSizeMaybe); - void copyFlagsFromSave_Priv(); - void setupUnkFlagStuff(UnkFlagDefinition *def, u16 count); - void doCommit_Priv(); - void setOrClearFlag(u16 flag, u16 value); - u16 getFlag(u16 flag) const; - void FUN_800bf610(u16 flag); - u16 FUN_800bf640(u16 flag); - void FUN_800bf690(); - - u16 getUncommittedValue_Priv(u16 flag); - -protected: - /** 0x04 */ u16 flagSizeMaybe; - /** 0x06 */ u16 anotherSizeMaybe; - /** 0x08 */ FlagSpace *storyFlagsPtr; - /** 0x0C */ UnkFlagStuff *unkFlagsPtr; - /** 0x10 */ bool dirty; -}; - -class StoryflagManager : public ItemStoryManagerBase { -public: - StoryflagManager(); - - virtual ~StoryflagManager() {} - - FlagSpace storyFlags; - - bool commit(); - - /** 0x0C */ virtual void setFlagszptr() override { - storyFlagsPtr = &storyFlags; - } - /** 0x10 */ virtual void onDirty() override; - /** 0x14 */ virtual void copyFlagsFromSave() override; - /** 0x18 */ virtual void setupUnkFlagsStuff() override; - /** 0x1C */ virtual void doCommit() override { - u16 sz = flagSizeMaybe; - u16 *flags = storyFlagsPtr->getFlagPtrUnchecked(); - FileManager::sInstance->setStoryFlags(flags, 0, sz); - } - /** 0x24 */ virtual void unsetFlag(u16 flag) override; - /** 0x38 */ virtual const u16 *getSaveFlagSpace() const override { - return FileManager::sInstance->getStoryFlagsConst(); - }; - -public: - static StoryflagManager *sInstance; - static u16 sFlags[0x80]; -}; - - -class ItemflagManager : public ItemStoryManagerBase { -public: - FlagSpace itemFlags; - - ItemflagManager(); - virtual ~ItemflagManager() {} - - bool commit(); - - /** 0x0C */ virtual void setFlagszptr() override { - storyFlagsPtr = &itemFlags; - } - /** 0x10 */ virtual void onDirty() override; - /** 0x14 */ virtual void copyFlagsFromSave(); - /** 0x18 */ virtual void setupUnkFlagsStuff(); - /** 0x1C */ virtual void doCommit() { - u16 sz = flagSizeMaybe; - u16 *flags = storyFlagsPtr->getFlagPtrUnchecked(); - FileManager::sInstance->setItemFlags(flags, 0, sz); - } - /** 0x20 */ virtual void setFlag(u16 flag) { - ItemStoryManagerBase::setFlag(flag & ~0x4000); - } - /** 0x24 */ virtual void unsetFlag(u16 flag) { - ItemStoryManagerBase::unsetFlag(flag & ~0x4000); - } - /** 0x28 */ virtual void setFlagOrCounterToValue(u16 flag, u16 value) { - ItemStoryManagerBase::setFlagOrCounterToValue(flag & ~0x4000, value); - } - /** 0x2C */ virtual u16 getCounterOrFlag(u16 flag) const { - return ItemStoryManagerBase::getCounterOrFlag(flag & ~0x4000); - } - /** 0x30 */ virtual u16 getUncommittedValue(u16 flag) { - return ItemStoryManagerBase::getUncommittedValue(flag & ~0x4000); - } - /** 0x34 */ virtual u16 unk3(u16 arg) { - return ItemStoryManagerBase::unk3(arg & ~0x4000); - } - /** 0x38 */ virtual const u16 *getSaveFlagSpace() const { - return FileManager::sInstance->getItemFlagsConst(); - }; - - u16 getFlagDirect(u16 flag) { - return ItemStoryManagerBase::getCounterOrFlag(flag); - } - -public: - static ItemflagManager *sInstance; - static u16 sFlags[0x40]; -}; - - - -#endif diff --git a/include/toBeSorted/misc_flag_managers.h b/include/toBeSorted/misc_flag_managers.h deleted file mode 100644 index b57c31b7..00000000 --- a/include/toBeSorted/misc_flag_managers.h +++ /dev/null @@ -1,87 +0,0 @@ -#ifndef MISC_FLAG_MANAGERS_H -#define MISC_FLAG_MANAGERS_H - -#include "common.h" -#include "toBeSorted/bitwise_flag_helper.h" -#include "toBeSorted/flag_space.h" -#include "toBeSorted/file_manager.h" - -class CommittableFlagManager { -public: - bool mNeedsCommit; - - virtual void doCommit() = 0; - virtual ~CommittableFlagManager() {} - bool commitIfNecessary(); - void setNeedsCommit(bool commit) { - mNeedsCommit = commit; - } - CommittableFlagManager() { - mNeedsCommit = false; - } - CommittableFlagManager(bool commit) { - mNeedsCommit = commit; - } -}; - -class TBoxFlagManager : public CommittableFlagManager { -public: - FlagSpace mFlagSpace; - u16 mSceneIndex; - BitwiseFlagHelper mFlagHelper; - - static u16 sTBoxFlags[2]; - - static TBoxFlagManager *sInstance; - - virtual void doCommit() override; - bool checkUncommittedFlag(u16 flag); - TBoxFlagManager(); - virtual ~TBoxFlagManager() {} - void init(); - void copyFromSave(u32 sceneIndex); - bool checkFlag(u16 sceneIndex, u16 flag); - virtual u16 getFlagCount() const; - void setFlag(u16 flag); - bool checkUncommittedFlag(u16 sceneIndex, u16 flag); - u16 checkUncommittedFlag2(u16 flag) { - return checkUncommittedFlag(flag); - } -}; - - -// NOTE: Not actually Enemy Defeat. -// This is a little more than that, it keeps track of live objects based on their id as a whole -class EnemyDefeatManager : public CommittableFlagManager { -public: - FlagSpace mFlagSpace; - BitwiseFlagHelper mFlagHelper; - u16 mSceneIndex; - - static u16 sEnemyDefeatFlags[4096]; - - static EnemyDefeatManager *sInstance; - - void clearSavedFlags(); - bool checkUncommittedFlag(u16 flag); - u16 checkUncommittedFlag2(u16 flag) { - return checkUncommittedFlag(flag); - } - EnemyDefeatManager(); - void init(); - void copyFromSave(u16 sceneIndex); - void updateFlagIndex(u16 sceneIndex); - void clearAll(); - bool checkIsValidFlag(u16 flag); - bool checkFlag(u16 flag); - virtual ~EnemyDefeatManager() {} - virtual u16 getFlagCount() const; - void setFlag(u16 flag); - - virtual void doCommit() override { - FileManager *mgr = FileManager::sInstance; - mgr->setEnemyDefeatFlags(mFlagSpace.getFlagPtrUnchecked(), 0, 0x1000); - }; -}; - -#endif diff --git a/src/REL/d/a/obj/d_a_obj_bamboo_island.cpp b/src/REL/d/a/obj/d_a_obj_bamboo_island.cpp index 35aeb06e..1a89d00e 100644 --- a/src/REL/d/a/obj/d_a_obj_bamboo_island.cpp +++ b/src/REL/d/a/obj/d_a_obj_bamboo_island.cpp @@ -1,7 +1,7 @@ #include "d/a/obj/d_a_obj_bamboo_island.h" #include "d/col/bg/d_bg_s.h" -#include "toBeSorted/item_story_flag_manager.h" +#include "d/flag/storyflag_manager.h" #include "toBeSorted/room_manager.h" const f32 dAcObambooIsland_c::unusedFloat1 = 100000.0f; diff --git a/src/REL/d/a/obj/d_a_obj_island_nusi.cpp b/src/REL/d/a/obj/d_a_obj_island_nusi.cpp index c1129728..dc50ca9d 100644 --- a/src/REL/d/a/obj/d_a_obj_island_nusi.cpp +++ b/src/REL/d/a/obj/d_a_obj_island_nusi.cpp @@ -8,7 +8,7 @@ #include "nw4r/g3d/g3d_resnode.h" #include "nw4r/g3d/g3d_scnmdl.h" #include "nw4r/g3d/g3d_scnobj.h" -#include "toBeSorted/item_story_flag_manager.h" +#include "d/flag/storyflag_manager.h" #include "toBeSorted/room_manager.h" const f32 dAcOislandNusi_c::someFloat = 100000.0f; diff --git a/src/REL/d/a/obj/d_a_obj_junk_repairing.cpp b/src/REL/d/a/obj/d_a_obj_junk_repairing.cpp index aff5ff3c..d363eb78 100644 --- a/src/REL/d/a/obj/d_a_obj_junk_repairing.cpp +++ b/src/REL/d/a/obj/d_a_obj_junk_repairing.cpp @@ -1,6 +1,6 @@ #include "d/a/obj/d_a_obj_junk_repairing.h" -#include "toBeSorted/item_story_flag_manager.h" +#include "d/flag/storyflag_manager.h" SPECIAL_ACTOR_PROFILE(OBJ_JUNK_REPAIR, dAcOJunkRep_c, fProfile::OBJ_JUNK_REPAIR, 0x027B, 0, 3); diff --git a/src/REL/d/a/obj/d_a_obj_pool_cock.cpp b/src/REL/d/a/obj/d_a_obj_pool_cock.cpp index c4821622..04ab8498 100644 --- a/src/REL/d/a/obj/d_a_obj_pool_cock.cpp +++ b/src/REL/d/a/obj/d_a_obj_pool_cock.cpp @@ -3,7 +3,7 @@ #include "d/a/obj/d_a_obj_vortex.h" #include "s/s_Math.h" #include "toBeSorted/room_manager.h" -#include "toBeSorted/sceneflag_manager.h" +#include "d/flag/sceneflag_manager.h" SPECIAL_ACTOR_PROFILE(OBJ_POOL_COCK, dAcOPoolCock_c, fProfile::OBJ_POOL_COCK, 0x024D, 0, 7); diff --git a/src/REL/d/a/obj/d_a_obj_toD3_stone_figure.cpp b/src/REL/d/a/obj/d_a_obj_toD3_stone_figure.cpp index ffe36621..93fd5c24 100644 --- a/src/REL/d/a/obj/d_a_obj_toD3_stone_figure.cpp +++ b/src/REL/d/a/obj/d_a_obj_toD3_stone_figure.cpp @@ -4,7 +4,7 @@ #include "toBeSorted/attention.h" #include "toBeSorted/event.h" #include "toBeSorted/event_manager.h" -#include "toBeSorted/item_story_flag_manager.h" +#include "d/flag/storyflag_manager.h" #include "toBeSorted/scgame.h" diff --git a/src/REL/d/a/obj/d_a_obj_utajima.cpp b/src/REL/d/a/obj/d_a_obj_utajima.cpp index 29fb96b2..d3248393 100644 --- a/src/REL/d/a/obj/d_a_obj_utajima.cpp +++ b/src/REL/d/a/obj/d_a_obj_utajima.cpp @@ -4,7 +4,7 @@ #include "d/a/obj/d_a_obj_base.h" #include "d/col/bg/d_bg_s.h" #include "d/col/c/c_m3d_g_aab.h" -#include "toBeSorted/item_story_flag_manager.h" +#include "d/flag/storyflag_manager.h" #include "toBeSorted/room_manager.h" static const char *const mMdlNames[] = { diff --git a/src/REL/d/t/d_t_dowsing.cpp b/src/REL/d/t/d_t_dowsing.cpp index d9e977be..642d1de9 100644 --- a/src/REL/d/t/d_t_dowsing.cpp +++ b/src/REL/d/t/d_t_dowsing.cpp @@ -1,8 +1,8 @@ #include "d/t/d_t_dowsing.h" -#include "toBeSorted/item_story_flag_manager.h" -#include "toBeSorted/room_manager.h" -#include "toBeSorted/sceneflag_manager.h" +#include "d/flag/itemflag_manager.h" +#include "d/flag/storyflag_manager.h" +#include "d/flag/sceneflag_manager.h" SPECIAL_ACTOR_PROFILE(T_DOWSING, dTgDowsing_c, fProfile::T_DOWSING, 0x0293, 0, 0); diff --git a/src/REL/d/t/d_t_genki_dws_tgt.cpp b/src/REL/d/t/d_t_genki_dws_tgt.cpp index a354795b..bdee8025 100644 --- a/src/REL/d/t/d_t_genki_dws_tgt.cpp +++ b/src/REL/d/t/d_t_genki_dws_tgt.cpp @@ -1,8 +1,8 @@ #include "d/t/d_t_genki_dws_tgt.h" -#include "toBeSorted/item_story_flag_manager.h" #include "toBeSorted/room_manager.h" -#include "toBeSorted/sceneflag_manager.h" +#include "d/flag/sceneflag_manager.h" +#include "d/flag/storyflag_manager.h" #include "toBeSorted/scgame.h" diff --git a/src/REL/d/t/d_t_reaction.cpp b/src/REL/d/t/d_t_reaction.cpp index f71f8553..b09a86cf 100644 --- a/src/REL/d/t/d_t_reaction.cpp +++ b/src/REL/d/t/d_t_reaction.cpp @@ -5,7 +5,7 @@ #include "d/a/d_a_player.h" #include "d/a/obj/d_a_obj_item.h" #include "d/col/cc/d_cc_mgr.h" -#include "toBeSorted/sceneflag_manager.h" +#include "d/flag/sceneflag_manager.h" SPECIAL_ACTOR_PROFILE(TAG_REACTION, dTgReaction_c, fProfile::TAG_REACTION, 0x0151, 0, 0); diff --git a/src/REL/d/t/d_t_ship_window.cpp b/src/REL/d/t/d_t_ship_window.cpp index 9ae4a0f9..7b650421 100644 --- a/src/REL/d/t/d_t_ship_window.cpp +++ b/src/REL/d/t/d_t_ship_window.cpp @@ -1,7 +1,7 @@ #include "d/t/d_t_ship_window.h" #include "toBeSorted/event_manager.h" -#include "toBeSorted/sceneflag_manager.h" +#include "d/flag/sceneflag_manager.h" SPECIAL_ACTOR_PROFILE(TAG_SHIP_WINDOW, dTgShipWindow_c, fProfile::TAG_SHIP_WINDOW, 0x0228, 0, 0); diff --git a/src/REL/d/t/d_t_sw_area.cpp b/src/REL/d/t/d_t_sw_area.cpp index ab8b67fb..90d96210 100644 --- a/src/REL/d/t/d_t_sw_area.cpp +++ b/src/REL/d/t/d_t_sw_area.cpp @@ -1,8 +1,8 @@ #include "d/t/d_t_sw_area.h" #include "d/a/d_a_player.h" #include "toBeSorted/area_math.h" -#include "toBeSorted/sceneflag_manager.h" -#include "toBeSorted/item_story_flag_manager.h" +#include "d/flag/sceneflag_manager.h" +#include "d/flag/storyflag_manager.h" SPECIAL_ACTOR_PROFILE(SW_AREA_TAG, dTgSwArea_c, fProfile::SW_AREA_TAG, 0x292, 0, 0); diff --git a/src/REL/d/t/d_t_time_area_check.cpp b/src/REL/d/t/d_t_time_area_check.cpp index d35b3932..8f9ca218 100644 --- a/src/REL/d/t/d_t_time_area_check.cpp +++ b/src/REL/d/t/d_t_time_area_check.cpp @@ -1,6 +1,6 @@ #include "d/t/d_t_time_area_check.h" -#include "toBeSorted/sceneflag_manager.h" +#include "d/flag/sceneflag_manager.h" #include "toBeSorted/time_area_mgr.h" diff --git a/src/REL/d/t/d_t_timer.cpp b/src/REL/d/t/d_t_timer.cpp index c5237049..08e61bcf 100644 --- a/src/REL/d/t/d_t_timer.cpp +++ b/src/REL/d/t/d_t_timer.cpp @@ -1,6 +1,6 @@ #include "d/t/d_t_timer.h" -#include "toBeSorted/sceneflag_manager.h" +#include "d/flag/sceneflag_manager.h" SPECIAL_ACTOR_PROFILE(TAG_TIMER, dTgTimer_c, fProfile::TAG_TIMER, 0x029F, 0, 0); diff --git a/src/REL/d/t/d_t_touch.cpp b/src/REL/d/t/d_t_touch.cpp index 06bcecff..352f2f54 100644 --- a/src/REL/d/t/d_t_touch.cpp +++ b/src/REL/d/t/d_t_touch.cpp @@ -2,7 +2,7 @@ #include "c/c_math.h" #include "toBeSorted/area_math.h" -#include "toBeSorted/sceneflag_manager.h" +#include "d/flag/sceneflag_manager.h" SPECIAL_ACTOR_PROFILE(TOUCH_TAG, dTgTouchTag, fProfile::TOUCH_TAG, 0x028E, 0, 0); diff --git a/src/d/a/d_a_base.cpp b/src/d/a/d_a_base.cpp index ba38f824..6220d7f1 100644 --- a/src/d/a/d_a_base.cpp +++ b/src/d/a/d_a_base.cpp @@ -8,7 +8,7 @@ #include "toBeSorted/event.h" #include "toBeSorted/event_manager.h" #include "toBeSorted/file_manager.h" -#include "toBeSorted/misc_flag_managers.h" +#include "d/flag/enemyflag_manager.h" #include "toBeSorted/room_manager.h" #include "toBeSorted/scgame.h" #include "toBeSorted/special_item_drop_mgr.h" diff --git a/src/d/a/obj/d_a_obj_switch.cpp b/src/d/a/obj/d_a_obj_switch.cpp index 9e33a73b..0029e81f 100644 --- a/src/d/a/obj/d_a_obj_switch.cpp +++ b/src/d/a/obj/d_a_obj_switch.cpp @@ -6,7 +6,7 @@ #include "d/col/bg/d_bg_w.h" #include "nw4r/g3d/g3d_resfile.h" #include "s/s_Math.h" -#include "toBeSorted/sceneflag_manager.h" +#include "d/flag/sceneflag_manager.h" SPECIAL_ACTOR_PROFILE(OBJ_SW, dAcOsw_c, fProfile::OBJ_SW, 0x12B, 0, 0x1002); diff --git a/src/d/flag/baseflag_manager.inc b/src/d/flag/baseflag_manager.inc new file mode 100644 index 00000000..86b3e14e --- /dev/null +++ b/src/d/flag/baseflag_manager.inc @@ -0,0 +1,118 @@ +#include "d/flag/baseflag_manager.h" + +ItemStoryManagerBase::ItemStoryManagerBase(): flagSizeMaybe(0), anotherSizeMaybe(0), storyFlagsPtr(nullptr), unkFlagsPtr(nullptr), dirty(false) {} +ItemStoryManagerBase::~ItemStoryManagerBase() { + if (unkFlagsPtr != nullptr) { + delete unkFlagsPtr; + } +} + +void ItemStoryManagerBase::setFlagSizes(u16 flagSizeMaybe, u16 anotherFlagSizeMaybe) { + this->flagSizeMaybe = flagSizeMaybe; + this->anotherSizeMaybe = anotherFlagSizeMaybe; +} + +/** 800bf320 */ +void ItemStoryManagerBase::setupUnkFlagStuff(UnkFlagDefinition *def, u16 count) { + UnkFlagStuff *stuff = new UnkFlagStuff(count, def); + this->unkFlagsPtr = stuff; +} + +/** 800bf380 */ +void ItemStoryManagerBase::copyFlagsFromSave_Priv() { + FlagSpace *current = this->storyFlagsPtr; + const u16 *saved = this->getSaveFlagSpace(); + current->copyFromSaveFile(saved, 0, this->flagSizeMaybe); +} + +/** 800bf3e0 */ +void ItemStoryManagerBase::init() { + const u16 *space = this->getSaveFlagSpace(); + if (space == nullptr || this->unkFlagsPtr == nullptr) { + this->setFlagszptr(); + this->copyFlagsFromSave(); + this->setupUnkFlagsStuff(); + } +} + +/** 800bf470 */ +void ItemStoryManagerBase::setFlagszptr() { + +} + +/** 800bf480 */ +u16 ItemStoryManagerBase::getFlag(u16 flag) const { + const u16 *data = this->getSaveFlagSpace(); + return this->unkFlagsPtr->getCounterOrFlag(flag, data, this->flagSizeMaybe); +} + +/** 800bf4e0 */ +u16 ItemStoryManagerBase::getUncommittedValue_Priv(u16 flag) { + u16 *data = this->storyFlagsPtr->getFlagPtrUnchecked(); + return this->unkFlagsPtr->getCounterOrFlag(flag, data, this->flagSizeMaybe); +} + +/** 800bf530 */ +void ItemStoryManagerBase::setOrClearFlag(u16 flag, u16 value) { + FlagSpace *storyFlagsPtr = this->storyFlagsPtr; + u16 *pData = storyFlagsPtr->getFlagPtrChecked(); + this->unkFlagsPtr->setCounterOrFlag(flag, pData, storyFlagsPtr->mCount, value); + this->FUN_800bf610(flag); +} + +/** 800bf5b0 */ +void ItemStoryManagerBase::setFlag(u16 flag) { + this->setOrClearFlag(flag, true); +} + +/** 800bf5c0 */ +void ItemStoryManagerBase::unsetFlag(u16 flag) { + this->setOrClearFlag(flag, false); +} + +/** 800bf5d0 */ +void ItemStoryManagerBase::setFlagOrCounterToValue(u16 flag, u16 value) { + this->setOrClearFlag(flag, value); +} + +/** 800bf5e0 */ +u16 ItemStoryManagerBase::getCounterOrFlag(u16 flag) const { + return ItemStoryManagerBase::getFlag(flag); +} + +/** 800bf5f0 */ +u16 ItemStoryManagerBase::getUncommittedValue(u16 flag) { + return this->getUncommittedValue_Priv(flag); +} + +/** 800bf600 */ +u16 ItemStoryManagerBase::unk3(u16 flag) { + return this->FUN_800bf640(flag); +} + +/** 800bf610 */ +void ItemStoryManagerBase::FUN_800bf610(u16 flag) { + this->dirty = true; + this->onDirty(); +} + +/** 800bf630 */ +void ItemStoryManagerBase::onDirty() { + +} + +/** 800bf640 */ +u16 ItemStoryManagerBase::FUN_800bf640(u16 flag) { + return this->unkFlagsPtr->maskForIdx(flag, this->flagSizeMaybe); +} + +/** 800bf650 */ +void ItemStoryManagerBase::doCommit_Priv() { + this->doCommit(); + this->dirty = false; +} + +/* 800bf690 */ +void ItemStoryManagerBase::FUN_800bf690() { + +} diff --git a/src/toBeSorted/flag_managers/bitwise_flag_helper.inc b/src/d/flag/bitwise_flag_helper.inc similarity index 89% rename from src/toBeSorted/flag_managers/bitwise_flag_helper.inc rename to src/d/flag/bitwise_flag_helper.inc index bc3ac870..a79095f5 100644 --- a/src/toBeSorted/flag_managers/bitwise_flag_helper.inc +++ b/src/d/flag/bitwise_flag_helper.inc @@ -1,4 +1,4 @@ -#include "toBeSorted/bitwise_flag_helper.h" +#include "d/flag/bitwise_flag_helper.h" #include "common.h" diff --git a/src/d/flag/committable_flag_manager.inc b/src/d/flag/committable_flag_manager.inc new file mode 100644 index 00000000..beeb9273 --- /dev/null +++ b/src/d/flag/committable_flag_manager.inc @@ -0,0 +1,12 @@ +#include "d/flag/committable_flag_manager.h" + +/* 0x800BE7B0 */ +bool CommittableFlagManager::commitIfNecessary() { + if (mNeedsCommit) { + doCommit(); + mNeedsCommit = false; + return true; + } else { + return false; + } +} diff --git a/src/toBeSorted/flag_managers/dungeonflag_manager.inc b/src/d/flag/dungeonflag_manager.inc similarity index 95% rename from src/toBeSorted/flag_managers/dungeonflag_manager.inc rename to src/d/flag/dungeonflag_manager.inc index f40fa1ab..7b9e0f50 100644 --- a/src/toBeSorted/flag_managers/dungeonflag_manager.inc +++ b/src/d/flag/dungeonflag_manager.inc @@ -1,8 +1,6 @@ -#include "libc.h" -#include "toBeSorted/bitwise_flag_helper.h" #include "toBeSorted/file_manager.h" -#include "toBeSorted/flag_space.h" -#include "toBeSorted/unk_flag_stuff.h" +#include "d/flag/flag_space.h" +#include "d/flag/unk_flag_stuff.h" // TODO move diff --git a/src/toBeSorted/flag_managers/misc_flag_managers.inc b/src/d/flag/enemyflag_manager.inc similarity index 52% rename from src/toBeSorted/flag_managers/misc_flag_managers.inc rename to src/d/flag/enemyflag_manager.inc index a756edfd..ce5a2dd6 100644 --- a/src/toBeSorted/flag_managers/misc_flag_managers.inc +++ b/src/d/flag/enemyflag_manager.inc @@ -1,74 +1,4 @@ -#include "toBeSorted/misc_flag_managers.h" - -#include "common.h" -#include "libc.h" -#include "toBeSorted/bitwise_flag_helper.h" -#include "toBeSorted/file_manager.h" -#include "toBeSorted/flag_space.h" - - -/* 0x800BE7B0 */ -bool CommittableFlagManager::commitIfNecessary() { - if (mNeedsCommit) { - doCommit(); - mNeedsCommit = false; - return true; - } else { - return false; - } -} - -TBoxFlagManager *TBoxFlagManager::sInstance = nullptr; -u16 TBoxFlagManager::sTBoxFlags[2] = {}; - -/* 0x800BE810 */ -void TBoxFlagManager::doCommit() { - if (mSceneIndex != 0xFFFF) { - FileManager::getInstance()->setTBoxFlags(mFlagSpace.getFlagPtrUnchecked(), mSceneIndex * 2, 2); - } -} - -/* 0x800BE870 */ -bool TBoxFlagManager::checkUncommittedFlag(u16 flag) { - return mFlagHelper.checkFlag(flag / 16, flag % 16, mFlagSpace.getFlagPtrUnchecked(), mFlagSpace.mCount); -} - -/* 0x800BE8E0 */ -TBoxFlagManager::TBoxFlagManager() : CommittableFlagManager(false), mFlagSpace(sTBoxFlags, ARRAY_LENGTH(sTBoxFlags)) { - mSceneIndex = 0xFFFF; -} - -/* 0x800BE920 */ -void TBoxFlagManager::init() {} - -/* 0x800BE930 */ -void TBoxFlagManager::copyFromSave(u32 sceneIndex) { - u16 idx = sceneIndex; - mSceneIndex = idx; - u16 *flags = FileManager::getInstance()->getTBoxFlagsConst(); - mFlagSpace.copyFromSaveFile2(flags + (idx * 2), 0, 2); -} - -/* 0x800BE990 */ -bool TBoxFlagManager::checkFlag(u16 sceneIndex, u16 flag) { - s32 actualFlag = (flag + sceneIndex * 0x20); - return mFlagHelper.checkFlag( - actualFlag / 16, flag % 16, FileManager::getInstance()->getTBoxFlagsConst(), getFlagCount() - ); -} - -/* 0x800BEA30 */ -u16 TBoxFlagManager::getFlagCount() const { - return 0x200; -} - -/* 0x800BEA40 */ -void TBoxFlagManager::setFlag(u16 flag) { - if (checkUncommittedFlag2(flag) != 1) { - mFlagHelper.setFlag(flag / 16, flag % 16, mFlagSpace.getFlagPtrChecked(), mFlagSpace.mCount); - setNeedsCommit(true); - } -} +#include "d/flag/enemyflag_manager.h" EnemyDefeatManager *EnemyDefeatManager::sInstance = nullptr; u16 EnemyDefeatManager::sEnemyDefeatFlags[4096] = {}; diff --git a/src/d/flag/flag_managers.cpp b/src/d/flag/flag_managers.cpp new file mode 100644 index 00000000..5a39ad65 --- /dev/null +++ b/src/d/flag/flag_managers.cpp @@ -0,0 +1,125 @@ + +#include "d/flag/flag_managers.h" + +// clang-format off +#include "common.h" +#include "egg/core/eggHeap.h" +#include "m/m_heap.h" +// vtable order +#include "d/flag/flag_space.h" +#include "d/flag/tboxflag_manager.h" +#include "d/flag/enemyflag_manager.h" +#include "d/flag/storyflag_manager.h" +#include "d/flag/itemflag_manager.h" +// clang-format on + +#include "d/flag/sceneflag_manager.inc" +#include "d/flag/committable_flag_manager.inc" +#include "d/flag/tboxflag_manager.inc" +#include "d/flag/enemyflag_manager.inc" +#include "d/flag/flag_space.inc" +#include "d/flag/unk_flag_stuff.inc" +#include "d/flag/bitwise_flag_helper.inc" + +#include "d/flag/baseflag_manager.inc" +#include "d/flag/storyflag_manager.inc" +#include "d/flag/itemflag_manager.inc" +#include "d/flag/dungeonflag_manager.inc" +#include "d/flag/skipflag_manager.inc" + + +static void postSetup(); + +template +class MyFlagManager : public T { +public: + MyFlagManager() {} + ~MyFlagManager() {} +}; + +void setupFlagManagers(EGG::Heap *heap) { + if (SceneflagManager::sInstance == nullptr) { + SceneflagManager::sInstance = new (heap) MyFlagManager(); + mHeap m(heap); + SceneflagManager::sInstance->init(); + } + + if (TBoxFlagManager::sInstance == nullptr) { + TBoxFlagManager::sInstance = new (heap) MyFlagManager(); + mHeap m(heap); + TBoxFlagManager::sInstance->init(); + } + + if (EnemyDefeatManager::sInstance == nullptr) { + EnemyDefeatManager::sInstance = new (heap) MyFlagManager(); + mHeap m(heap); + EnemyDefeatManager::sInstance->init(); + } + + if (StoryflagManager::sInstance == nullptr) { + StoryflagManager::sInstance = new (heap) MyFlagManager(); + mHeap m(heap); + StoryflagManager::sInstance->init(); + } + + if (ItemflagManager::sInstance == nullptr) { + ItemflagManager::sInstance = new (heap) MyFlagManager(); + mHeap m(heap); + ItemflagManager::sInstance->init(); + } + + if (DungeonflagManager::sInstance == nullptr) { + DungeonflagManager::sInstance = new (heap) MyFlagManager(); + mHeap m(heap); + DungeonflagManager::sInstance->init(); + } + + if (SkipflagManager::sInstance == nullptr) { + SkipflagManager::sInstance = new (heap) MyFlagManager(); + mHeap m(heap); + SkipflagManager::sInstance->init(); + } + + postSetup(); +} + +static void postSetup() { + updateFlagForFlagIndex(0); +} + +void copyAllFlagManagersFromSave() { + u16 flag = FileManager::sInstance->getSceneFlagIndex(); + SceneflagManager::sInstance->copyFromSave(flag); + TBoxFlagManager::sInstance->copyFromSave(flag); + StoryflagManager::sInstance->copyFlagsFromSave_Priv(); + ItemflagManager::sInstance->copyFlagsFromSave_Priv(); + DungeonflagManager::sInstance->copyFromSave(flag); + SkipflagManager::sInstance->thunk_copyFromSave(); + EnemyDefeatManager::sInstance->copyFromSave(flag); +} + +void updateFlagForFlagIndex(u16 stage) { + SceneflagManager::sInstance->updateFlagindex(stage); + TBoxFlagManager::sInstance->copyFromSave(stage); + EnemyDefeatManager::sInstance->updateFlagIndex(stage); + DungeonflagManager::sInstance->copyFromSave(stage); +} + +void commitAllFlagManagers() { + StoryflagManager::sInstance->commit(); + ItemflagManager::sInstance->commit(); + DungeonflagManager::sInstance->doCommit(); + SkipflagManager::sInstance->commitFlags(); + SceneflagManager::sInstance->doCommit(); + TBoxFlagManager::sInstance->commitIfNecessary(); + EnemyDefeatManager::sInstance->commitIfNecessary(); +} + +bool checkedMemcpy(void *dest, u32 destLen, const void *src, u32 count) { + if (dest == nullptr || src == nullptr || destLen < count || destLen > 0xFFFF) { + return true; + } else { + memcpy(dest, src, count); + return false; + } +} diff --git a/src/toBeSorted/flag_managers/flag_space.inc b/src/d/flag/flag_space.inc similarity index 96% rename from src/toBeSorted/flag_managers/flag_space.inc rename to src/d/flag/flag_space.inc index 93848a41..298aac80 100644 --- a/src/toBeSorted/flag_managers/flag_space.inc +++ b/src/d/flag/flag_space.inc @@ -1,5 +1,5 @@ #include "d/flag/flag_managers.h" -#include "toBeSorted/flag_space.h" +#include "d/flag/flag_space.h" #include "toBeSorted/file_manager.h" #include "common.h" diff --git a/src/d/flag/itemflag_manager.inc b/src/d/flag/itemflag_manager.inc new file mode 100644 index 00000000..027a16a8 --- /dev/null +++ b/src/d/flag/itemflag_manager.inc @@ -0,0 +1,29 @@ +#include "d/flag/itemflag_manager.h" + +u16 ItemflagManager::sFlags[0x40]; + +ItemflagManager *ItemflagManager::sInstance = nullptr; + +ItemflagManager::ItemflagManager() : itemFlags(sFlags, 0x40) {} + +void ItemflagManager::copyFlagsFromSave() { + setFlagSizes(0x40, 0x80); + copyFlagsFromSave_Priv(); +} + +extern "C" UnkFlagDefinition ItemflagManager__ITEMFLAG_DEFINITIONS[]; + +void ItemflagManager::setupUnkFlagsStuff() { + setupUnkFlagStuff(ItemflagManager__ITEMFLAG_DEFINITIONS, 0x1FE); +} + +void ItemflagManager::onDirty() {} + +bool ItemflagManager::commit() { + if (dirty) { + doCommit_Priv(); + FUN_800bf690(); + return true; + } + return false; +} diff --git a/src/toBeSorted/flag_managers/sceneflag_manager.inc b/src/d/flag/sceneflag_manager.inc similarity index 99% rename from src/toBeSorted/flag_managers/sceneflag_manager.inc rename to src/d/flag/sceneflag_manager.inc index da696f74..c0536acf 100644 --- a/src/toBeSorted/flag_managers/sceneflag_manager.inc +++ b/src/d/flag/sceneflag_manager.inc @@ -1,4 +1,4 @@ -#include "toBeSorted/sceneflag_manager.h" +#include "d/flag/sceneflag_manager.h" #include "common.h" #include "libc.h" diff --git a/src/toBeSorted/flag_managers/skipflag_manager.inc b/src/d/flag/skipflag_manager.inc similarity index 77% rename from src/toBeSorted/flag_managers/skipflag_manager.inc rename to src/d/flag/skipflag_manager.inc index b568ebd7..b365aee3 100644 --- a/src/toBeSorted/flag_managers/skipflag_manager.inc +++ b/src/d/flag/skipflag_manager.inc @@ -1,27 +1,9 @@ #include "common.h" #include "d/flag/flag_managers.h" -#include "toBeSorted/bitwise_flag_helper.h" +#include "d/flag/skipflag_manager.h" +#include "d/flag/bitwise_flag_helper.h" #include "toBeSorted/file_manager.h" -#include "toBeSorted/flag_space.h" - -class SkipflagManager { -public: - bool mShouldCommit; - BitwiseFlagHelper mFlagHelper; - FlagSpace mFlagSpace; - - static u16 sSkipFlags[16]; - static SkipflagManager *sInstance; - - void copyFromSave(); - void setCommitFlag(u16 flag); - SkipflagManager(); - void init(); - void thunk_copyFromSave(); - void setFlag(u16 flag); - bool checkFlag(u16 flag); - bool commitFlags(); -}; +#include "d/flag/flag_space.h" // 0x80575408 SkipflagManager *SkipflagManager::sInstance = nullptr; diff --git a/src/d/flag/storyflag_manager.inc b/src/d/flag/storyflag_manager.inc new file mode 100644 index 00000000..3b45d4cc --- /dev/null +++ b/src/d/flag/storyflag_manager.inc @@ -0,0 +1,36 @@ +#include "d/flag/storyflag_manager.h" + +u16 StoryflagManager::sFlags[0x80]; +StoryflagManager *StoryflagManager::sInstance = nullptr; + +StoryflagManager::StoryflagManager() : storyFlags(sFlags, 0x80) { + +} + +void StoryflagManager::copyFlagsFromSave() { + setFlagSizes(0x80, 0x100); + copyFlagsFromSave_Priv(); +} + +extern "C" UnkFlagDefinition StoryflagManager__STORYFLAG_DEFINITIONS[]; + +void StoryflagManager::setupUnkFlagsStuff() { + setupUnkFlagStuff(StoryflagManager__STORYFLAG_DEFINITIONS, 0x4B1); +} + +void StoryflagManager::onDirty() { + +} + +bool StoryflagManager::commit() { + if (dirty) { + doCommit_Priv(); + FUN_800bf690(); + return true; + } + return false; +} + +void StoryflagManager::unsetFlag(u16 flag) { + ItemStoryManagerBase::unsetFlag(flag); +} diff --git a/src/d/flag/tboxflag_manager.inc b/src/d/flag/tboxflag_manager.inc new file mode 100644 index 00000000..2984b978 --- /dev/null +++ b/src/d/flag/tboxflag_manager.inc @@ -0,0 +1,54 @@ +#include "d/flag/tboxflag_manager.h" +#include "toBeSorted/file_manager.h" + +TBoxFlagManager *TBoxFlagManager::sInstance = nullptr; +u16 TBoxFlagManager::sTBoxFlags[2] = {}; + +/* 0x800BE810 */ +void TBoxFlagManager::doCommit() { + if (mSceneIndex != 0xFFFF) { + FileManager::getInstance()->setTBoxFlags(mFlagSpace.getFlagPtrUnchecked(), mSceneIndex * 2, 2); + } +} + +/* 0x800BE870 */ +bool TBoxFlagManager::checkUncommittedFlag(u16 flag) { + return mFlagHelper.checkFlag(flag / 16, flag % 16, mFlagSpace.getFlagPtrUnchecked(), mFlagSpace.mCount); +} + +/* 0x800BE8E0 */ +TBoxFlagManager::TBoxFlagManager() : CommittableFlagManager(false), mFlagSpace(sTBoxFlags, ARRAY_LENGTH(sTBoxFlags)) { + mSceneIndex = 0xFFFF; +} + +/* 0x800BE920 */ +void TBoxFlagManager::init() {} + +/* 0x800BE930 */ +void TBoxFlagManager::copyFromSave(u32 sceneIndex) { + u16 idx = sceneIndex; + mSceneIndex = idx; + u16 *flags = FileManager::getInstance()->getTBoxFlagsConst(); + mFlagSpace.copyFromSaveFile2(flags + (idx * 2), 0, 2); +} + +/* 0x800BE990 */ +bool TBoxFlagManager::checkFlag(u16 sceneIndex, u16 flag) { + s32 actualFlag = (flag + sceneIndex * 0x20); + return mFlagHelper.checkFlag( + actualFlag / 16, flag % 16, FileManager::getInstance()->getTBoxFlagsConst(), getFlagCount() + ); +} + +/* 0x800BEA30 */ +u16 TBoxFlagManager::getFlagCount() const { + return 0x200; +} + +/* 0x800BEA40 */ +void TBoxFlagManager::setFlag(u16 flag) { + if (checkUncommittedFlag2(flag) != 1) { + mFlagHelper.setFlag(flag / 16, flag % 16, mFlagSpace.getFlagPtrChecked(), mFlagSpace.mCount); + setNeedsCommit(true); + } +} diff --git a/src/toBeSorted/flag_managers/unk_flag_stuff.inc b/src/d/flag/unk_flag_stuff.inc similarity index 97% rename from src/toBeSorted/flag_managers/unk_flag_stuff.inc rename to src/d/flag/unk_flag_stuff.inc index edbfdbdb..79289abe 100644 --- a/src/toBeSorted/flag_managers/unk_flag_stuff.inc +++ b/src/d/flag/unk_flag_stuff.inc @@ -1,4 +1,4 @@ -#include "toBeSorted/unk_flag_stuff.h" +#include "d/flag/unk_flag_stuff.h" u16 UnkFlagStuff::calculateMask(s32 shift) { return (2 << (shift & 0xF)) - 1; diff --git a/src/d/tg/d_t_switch.cpp b/src/d/tg/d_t_switch.cpp index c576d9d6..f7c1141b 100644 --- a/src/d/tg/d_t_switch.cpp +++ b/src/d/tg/d_t_switch.cpp @@ -2,7 +2,7 @@ #include "c/c_math.h" #include "toBeSorted/event.h" -#include "toBeSorted/sceneflag_manager.h" +#include "d/flag/sceneflag_manager.h" #include "toBeSorted/scgame.h" diff --git a/src/toBeSorted/counters/counter.cpp b/src/toBeSorted/counters/counter.cpp index 7bda499c..89b5b60e 100644 --- a/src/toBeSorted/counters/counter.cpp +++ b/src/toBeSorted/counters/counter.cpp @@ -1,6 +1,6 @@ #include "toBeSorted/counters/counter.h" -#include "toBeSorted/item_story_flag_manager.h" +#include "d/flag/itemflag_manager.h" /* 8016cc40 */ s32 Counter::checkedAdd(s32 num) { s32 uncommitted = getUncommittedValue(); diff --git a/src/toBeSorted/counters/rupee_counter.cpp b/src/toBeSorted/counters/rupee_counter.cpp index 69cb0ff9..1a96ae83 100644 --- a/src/toBeSorted/counters/rupee_counter.cpp +++ b/src/toBeSorted/counters/rupee_counter.cpp @@ -1,5 +1,5 @@ #include "toBeSorted/counters/counter.h" -#include "toBeSorted/item_story_flag_manager.h" +#include "d/flag/itemflag_manager.h" static u16 getBaseCapacity(); static u16 getExtraWalletCapacity(); diff --git a/src/toBeSorted/dowsing_target.cpp b/src/toBeSorted/dowsing_target.cpp index 48ae7952..41acf5bf 100644 --- a/src/toBeSorted/dowsing_target.cpp +++ b/src/toBeSorted/dowsing_target.cpp @@ -2,8 +2,8 @@ #include "c/c_math.h" #include "m/m_mtx.h" -#include "nw4r/ut/ut_LinkList.h" -#include "toBeSorted/item_story_flag_manager.h" +#include "d/flag/itemflag_manager.h" +#include "d/flag/storyflag_manager.h" #include "toBeSorted/tlist.h" diff --git a/src/toBeSorted/flag_managers/flag_managers.cpp b/src/toBeSorted/flag_managers/flag_managers.cpp deleted file mode 100644 index 842a76d7..00000000 --- a/src/toBeSorted/flag_managers/flag_managers.cpp +++ /dev/null @@ -1,302 +0,0 @@ -// clang-format off - -#include "d/flag/flag_managers.h" - -#include "common.h" -#include "toBeSorted/sceneflag_manager.h" -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -u16 StoryflagManager::sFlags[0x80]; -u16 ItemflagManager::sFlags[0x40]; - - -StoryflagManager *StoryflagManager::sInstance = nullptr; -ItemflagManager *ItemflagManager::sInstance = nullptr; - -ItemStoryManagerBase::ItemStoryManagerBase(): flagSizeMaybe(0), anotherSizeMaybe(0), storyFlagsPtr(nullptr), unkFlagsPtr(nullptr), dirty(false) {} -ItemStoryManagerBase::~ItemStoryManagerBase() { - if (unkFlagsPtr != nullptr) { - delete unkFlagsPtr; - } -} - -void ItemStoryManagerBase::setFlagSizes(u16 flagSizeMaybe, u16 anotherFlagSizeMaybe) { - this->flagSizeMaybe = flagSizeMaybe; - this->anotherSizeMaybe = anotherFlagSizeMaybe; -} - -/** 800bf320 */ -void ItemStoryManagerBase::setupUnkFlagStuff(UnkFlagDefinition *def, u16 count) { - UnkFlagStuff *stuff = new UnkFlagStuff(count, def); - this->unkFlagsPtr = stuff; -} - -/** 800bf380 */ -void ItemStoryManagerBase::copyFlagsFromSave_Priv() { - FlagSpace *current = this->storyFlagsPtr; - const u16 *saved = this->getSaveFlagSpace(); - current->copyFromSaveFile(saved, 0, this->flagSizeMaybe); -} - -/** 800bf3e0 */ -void ItemStoryManagerBase::init() { - const u16 *space = this->getSaveFlagSpace(); - if (space == nullptr || this->unkFlagsPtr == nullptr) { - this->setFlagszptr(); - this->copyFlagsFromSave(); - this->setupUnkFlagsStuff(); - } -} - -/** 800bf470 */ -void ItemStoryManagerBase::setFlagszptr() { - -} - -/** 800bf480 */ -u16 ItemStoryManagerBase::getFlag(u16 flag) const { - const u16 *data = this->getSaveFlagSpace(); - return this->unkFlagsPtr->getCounterOrFlag(flag, data, this->flagSizeMaybe); -} - -/** 800bf4e0 */ -u16 ItemStoryManagerBase::getUncommittedValue_Priv(u16 flag) { - u16 *data = this->storyFlagsPtr->getFlagPtrUnchecked(); - return this->unkFlagsPtr->getCounterOrFlag(flag, data, this->flagSizeMaybe); -} - -/** 800bf530 */ -void ItemStoryManagerBase::setOrClearFlag(u16 flag, u16 value) { - FlagSpace *storyFlagsPtr = this->storyFlagsPtr; - u16 *pData = storyFlagsPtr->getFlagPtrChecked(); - this->unkFlagsPtr->setCounterOrFlag(flag, pData, storyFlagsPtr->mCount, value); - this->FUN_800bf610(flag); -} - -/** 800bf5b0 */ -void ItemStoryManagerBase::setFlag(u16 flag) { - this->setOrClearFlag(flag, true); -} - -/** 800bf5c0 */ -void ItemStoryManagerBase::unsetFlag(u16 flag) { - this->setOrClearFlag(flag, false); -} - -/** 800bf5d0 */ -void ItemStoryManagerBase::setFlagOrCounterToValue(u16 flag, u16 value) { - this->setOrClearFlag(flag, value); -} - -/** 800bf5e0 */ -u16 ItemStoryManagerBase::getCounterOrFlag(u16 flag) const { - return ItemStoryManagerBase::getFlag(flag); -} - -/** 800bf5f0 */ -u16 ItemStoryManagerBase::getUncommittedValue(u16 flag) { - return this->getUncommittedValue_Priv(flag); -} - -/** 800bf600 */ -u16 ItemStoryManagerBase::unk3(u16 flag) { - return this->FUN_800bf640(flag); -} - -/** 800bf610 */ -void ItemStoryManagerBase::FUN_800bf610(u16 flag) { - this->dirty = true; - this->onDirty(); -} - -/** 800bf630 */ -void ItemStoryManagerBase::onDirty() { - -} - -/** 800bf640 */ -u16 ItemStoryManagerBase::FUN_800bf640(u16 flag) { - return this->unkFlagsPtr->maskForIdx(flag, this->flagSizeMaybe); -} - -/** 800bf650 */ -void ItemStoryManagerBase::doCommit_Priv() { - this->doCommit(); - this->dirty = false; -} - -/* 800bf690 */ -void ItemStoryManagerBase::FUN_800bf690() { - -} - -StoryflagManager::StoryflagManager() : storyFlags(sFlags, 0x80) { - -} - -void StoryflagManager::copyFlagsFromSave() { - setFlagSizes(0x80, 0x100); - copyFlagsFromSave_Priv(); -} - -extern "C" UnkFlagDefinition StoryflagManager__STORYFLAG_DEFINITIONS[]; - -void StoryflagManager::setupUnkFlagsStuff() { - setupUnkFlagStuff(StoryflagManager__STORYFLAG_DEFINITIONS, 0x4B1); -} - -void StoryflagManager::onDirty() { - -} - -bool StoryflagManager::commit() { - if (dirty) { - doCommit_Priv(); - FUN_800bf690(); - return true; - } - return false; -} - -void StoryflagManager::unsetFlag(u16 flag) { - ItemStoryManagerBase::unsetFlag(flag); -} - -ItemflagManager::ItemflagManager() : itemFlags(sFlags, 0x40) {} - -void ItemflagManager::copyFlagsFromSave() { - setFlagSizes(0x40, 0x80); - copyFlagsFromSave_Priv(); -} - -extern "C" UnkFlagDefinition ItemflagManager__ITEMFLAG_DEFINITIONS[]; - -void ItemflagManager::setupUnkFlagsStuff() { - setupUnkFlagStuff(ItemflagManager__ITEMFLAG_DEFINITIONS, 0x1FE); -} - -void ItemflagManager::onDirty() { - -} - -bool ItemflagManager::commit() { - if (dirty) { - doCommit_Priv(); - FUN_800bf690(); - return true; - } - return false; -} - -#include -#include -// clang-format on - -#include -#include - -static void postSetup(); - -template -class MyFlagManager : public T { -public: - MyFlagManager() { - } - ~MyFlagManager() {} -}; - -void setupFlagManagers(EGG::Heap *heap) { - if (SceneflagManager::sInstance == nullptr) { - SceneflagManager::sInstance = new (heap) MyFlagManager(); - mHeap m(heap); - SceneflagManager::sInstance->init(); - } - - if (TBoxFlagManager::sInstance == nullptr) { - TBoxFlagManager::sInstance = new (heap) MyFlagManager(); - mHeap m(heap); - TBoxFlagManager::sInstance->init(); - } - - if (EnemyDefeatManager::sInstance == nullptr) { - EnemyDefeatManager::sInstance = new (heap) MyFlagManager(); - mHeap m(heap); - EnemyDefeatManager::sInstance->init(); - } - - if (StoryflagManager::sInstance == nullptr) { - StoryflagManager::sInstance = new (heap) MyFlagManager(); - mHeap m(heap); - StoryflagManager::sInstance->init(); - } - - if (ItemflagManager::sInstance == nullptr) { - ItemflagManager::sInstance = new (heap) MyFlagManager(); - mHeap m(heap); - ItemflagManager::sInstance->init(); - } - - if (DungeonflagManager::sInstance == nullptr) { - DungeonflagManager::sInstance = new (heap) MyFlagManager(); - mHeap m(heap); - DungeonflagManager::sInstance->init(); - } - - if (SkipflagManager::sInstance == nullptr) { - SkipflagManager::sInstance = new (heap) MyFlagManager(); - mHeap m(heap); - SkipflagManager::sInstance->init(); - } - - postSetup(); -} - -static void postSetup() { - updateFlagForFlagIndex(0); -} - -void copyAllFlagManagersFromSave() { - u16 flag = FileManager::sInstance->getSceneFlagIndex(); - SceneflagManager::sInstance->copyFromSave(flag); - TBoxFlagManager::sInstance->copyFromSave(flag); - StoryflagManager::sInstance->copyFlagsFromSave_Priv(); - ItemflagManager::sInstance->copyFlagsFromSave_Priv(); - DungeonflagManager::sInstance->copyFromSave(flag); - SkipflagManager::sInstance->thunk_copyFromSave(); - EnemyDefeatManager::sInstance->copyFromSave(flag); -} - -void updateFlagForFlagIndex(u16 stage) { - SceneflagManager::sInstance->updateFlagindex(stage); - TBoxFlagManager::sInstance->copyFromSave(stage); - EnemyDefeatManager::sInstance->updateFlagIndex(stage); - DungeonflagManager::sInstance->copyFromSave(stage); -} - -void commitAllFlagManagers() { - StoryflagManager::sInstance->commit(); - ItemflagManager::sInstance->commit(); - DungeonflagManager::sInstance->doCommit(); - SkipflagManager::sInstance->commitFlags(); - SceneflagManager::sInstance->doCommit(); - TBoxFlagManager::sInstance->commitIfNecessary(); - EnemyDefeatManager::sInstance->commitIfNecessary(); -} - -bool checkedMemcpy(void *dest, u32 destLen, const void *src, u32 count) { - if (dest == nullptr || src == nullptr || destLen < count || destLen > 0xFFFF) { - return true; - } else { - memcpy(dest, src, count); - return false; - } -} From dfaf6296a515273ec1697effbc4903e367956cb4 Mon Sep 17 00:00:00 2001 From: robojumper Date: Fri, 25 Oct 2024 15:15:10 +0200 Subject: [PATCH 5/9] Renames --- config/SOUE01/symbols.txt | 24 +++--- include/d/flag/baseflag_manager.h | 24 +++--- include/d/flag/dungeonflag_manager.h | 36 +++++++++ include/d/flag/flag_index.h | 37 ++++++++++ include/d/flag/itemflag_manager.h | 8 +- include/d/flag/storyflag_manager.h | 8 +- include/d/flag/unk_flag_stuff.h | 26 ------- src/d/flag/baseflag_manager.inc | 73 +++++++++---------- src/d/flag/dungeonflag_manager.inc | 46 ++---------- .../{unk_flag_stuff.inc => flag_index.inc} | 18 ++--- src/d/flag/flag_managers.cpp | 6 +- src/d/flag/flag_space.inc | 2 +- src/d/flag/itemflag_manager.inc | 12 +-- src/d/flag/sceneflag_manager.inc | 14 +--- src/d/flag/skipflag_manager.inc | 6 +- src/d/flag/storyflag_manager.inc | 18 ++--- 16 files changed, 181 insertions(+), 177 deletions(-) create mode 100644 include/d/flag/dungeonflag_manager.h create mode 100644 include/d/flag/flag_index.h delete mode 100644 include/d/flag/unk_flag_stuff.h rename src/d/flag/{unk_flag_stuff.inc => flag_index.inc} (66%) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index d052772d..f889db3a 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -4129,21 +4129,21 @@ setAllToZero__9FlagSpaceFUsUs = .text:0x800BEE60; // type:function size:0x68 copyFromSaveFile2__9FlagSpaceFPCUsUsUs = .text:0x800BEED0; // type:function size:0x7C copyFromSaveFile__9FlagSpaceFPCUsUsUs = .text:0x800BEF50; // type:function size:0x20 filemanagerCheck__9FlagSpaceCFv = .text:0x800BEF70; // type:function size:0x20 -calculateMask__12UnkFlagStuffFl = .text:0x800BEF90; // type:function size:0x18 -doNothing__12UnkFlagStuffFUl = .text:0x800BEFB0; // type:function size:0x4 -__ct__12UnkFlagStuffFUsP17UnkFlagDefinition = .text:0x800BEFC0; // type:function size:0xC -prepareIndexShiftMask__12UnkFlagStuffFUsUlPUsPUcPUs = .text:0x800BEFD0; // type:function size:0x80 -maskForIdx__12UnkFlagStuffFUsUs = .text:0x800BF050; // type:function size:0x50 -getCounterOrFlag__12UnkFlagStuffFUsPCUsUl = .text:0x800BF0A0; // type:function size:0x68 -setCounterOrFlag__12UnkFlagStuffFUsPUsUlUl = .text:0x800BF110; // type:function size:0x9C -checkFlagValid__12UnkFlagStuffFUsUl = .text:0x800BF1B0; // type:function size:0x50 +calculateMask__9FlagIndexFl = .text:0x800BEF90; // type:function size:0x18 +doNothing__9FlagIndexFUl = .text:0x800BEFB0; // type:function size:0x4 +__ct__9FlagIndexFUsP14FlagDefinition = .text:0x800BEFC0; // type:function size:0xC +prepareIndexShiftMask__9FlagIndexFUsUlPUsPUcPUs = .text:0x800BEFD0; // type:function size:0x80 +maskForIdx__9FlagIndexFUsUs = .text:0x800BF050; // type:function size:0x50 +getCounterOrFlag__9FlagIndexFUsPCUsUl = .text:0x800BF0A0; // type:function size:0x68 +setCounterOrFlag__9FlagIndexFUsPUsUlUl = .text:0x800BF110; // type:function size:0x9C +checkFlagValid__9FlagIndexFUsUl = .text:0x800BF1B0; // type:function size:0x50 checkFlag__17BitwiseFlagHelperFUsUsPCUsUs = .text:0x800BF200; // type:function size:0x14 setFlag__17BitwiseFlagHelperFUsUsPUsUs = .text:0x800BF220; // type:function size:0x20 unsetFlag__17BitwiseFlagHelperFUsUsPUsUs = .text:0x800BF240; // type:function size:0x24 __ct__20ItemStoryManagerBaseFv = .text:0x800BF270; // type:function size:0x28 __dt__20ItemStoryManagerBaseFv = .text:0x800BF2A0; // type:function size:0x70 setFlagSizes__20ItemStoryManagerBaseFUsUs = .text:0x800BF310; // type:function size:0xC -setupUnkFlagStuff__20ItemStoryManagerBaseFP17UnkFlagDefinitionUs = .text:0x800BF320; // type:function size:0x60 +setupFlagIndex__20ItemStoryManagerBaseFP14FlagDefinitionUs = .text:0x800BF320; // type:function size:0x60 copyFlagsFromSave_Priv__20ItemStoryManagerBaseFv = .text:0x800BF380; // type:function size:0x58 init__20ItemStoryManagerBaseFv = .text:0x800BF3E0; // type:function size:0x88 setFlagszptr__20ItemStoryManagerBaseFv = .text:0x800BF470; // type:function size:0x4 @@ -4156,11 +4156,11 @@ setFlagOrCounterToValue__20ItemStoryManagerBaseFUsUs = .text:0x800BF5D0; // type getCounterOrFlag__20ItemStoryManagerBaseCFUs = .text:0x800BF5E0; // type:function size:0x4 getUncommittedValue__20ItemStoryManagerBaseFUs = .text:0x800BF5F0; // type:function size:0x4 unk3__20ItemStoryManagerBaseFUs = .text:0x800BF600; // type:function size:0x4 -FUN_800bf610__20ItemStoryManagerBaseFUs = .text:0x800BF610; // type:function size:0x18 +onFlagChange__20ItemStoryManagerBaseFUs = .text:0x800BF610; // type:function size:0x18 onDirty__20ItemStoryManagerBaseFv = .text:0x800BF630; // type:function size:0x4 -FUN_800bf640__20ItemStoryManagerBaseFUs = .text:0x800BF640; // type:function size:0x10 +getMaskForFlag__20ItemStoryManagerBaseFUs = .text:0x800BF640; // type:function size:0x10 doCommit_Priv__20ItemStoryManagerBaseFv = .text:0x800BF650; // type:function size:0x40 -FUN_800bf690__20ItemStoryManagerBaseFv = .text:0x800BF690; // type:function size:0x4 +postCommit__20ItemStoryManagerBaseFv = .text:0x800BF690; // type:function size:0x4 __ct__16StoryflagManagerFv = .text:0x800BF6A0; // type:function size:0x5C copyFlagsFromSave__16StoryflagManagerFv = .text:0x800BF700; // type:function size:0x3C setupUnkFlagsStuff__16StoryflagManagerFv = .text:0x800BF740; // type:function size:0x10 diff --git a/include/d/flag/baseflag_manager.h b/include/d/flag/baseflag_manager.h index 9d187957..42471bca 100644 --- a/include/d/flag/baseflag_manager.h +++ b/include/d/flag/baseflag_manager.h @@ -1,7 +1,7 @@ #ifndef D_FLAG_BASEFLAG_MANAGER_H #define D_FLAG_BASEFLAG_MANAGER_H -#include "d/flag/unk_flag_stuff.h" +#include "d/flag/flag_index.h" #include "d/flag/flag_space.h" class ItemStoryManagerBase { @@ -24,24 +24,26 @@ public: void init(); - void setFlagSizes(u16 flagSizeMaybe, u16 anotherFlagSizeMaybe); void copyFlagsFromSave_Priv(); - void setupUnkFlagStuff(UnkFlagDefinition *def, u16 count); + void setupFlagIndex(FlagDefinition *def, u16 count); void doCommit_Priv(); void setOrClearFlag(u16 flag, u16 value); u16 getFlag(u16 flag) const; - void FUN_800bf610(u16 flag); - u16 FUN_800bf640(u16 flag); - void FUN_800bf690(); + void onFlagChange(u16 flag); + u16 getMaskForFlag(u16 flag); + void postCommit(); u16 getUncommittedValue_Priv(u16 flag); protected: - /** 0x04 */ u16 flagSizeMaybe; - /** 0x06 */ u16 anotherSizeMaybe; - /** 0x08 */ FlagSpace *storyFlagsPtr; - /** 0x0C */ UnkFlagStuff *unkFlagsPtr; - /** 0x10 */ bool dirty; + + void setFlagSizes(u16 flagCount, u16 flagSizeBytes); + + /** 0x04 */ u16 mFlagCount; + /** 0x06 */ u16 mFlagSizeBytes; + /** 0x08 */ FlagSpace *mpFlagSpace; + /** 0x0C */ FlagIndex *mpFlagIndex; + /** 0x10 */ bool mDirty; }; #endif diff --git a/include/d/flag/dungeonflag_manager.h b/include/d/flag/dungeonflag_manager.h new file mode 100644 index 00000000..ec944532 --- /dev/null +++ b/include/d/flag/dungeonflag_manager.h @@ -0,0 +1,36 @@ +#ifndef D_FLAG_DUNGEONFLAG_MANAGER_H +#define D_FLAG_DUNGEONFLAG_MANAGER_H + +#include "d/flag/flag_index.h" +#include "d/flag/flag_space.h" +#include "toBeSorted/file_manager.h" + +class DungeonflagManager { +public: + bool mShouldCommit; + u16 mStageIndex; + FlagIndex *mpFlagIndex; + FlagSpace mFlagSpace; + + static u16 sDungeonFlags[8]; + + void copyFromSave(u32 flag); + void copyFromSave_Internal(u16 flagIndex); + void setCommitFlag(u16 flag); + DungeonflagManager(); + void init(); + void setToValue(u16 flag, u32 value); + void setFlag(u16 flag); + u16 getDungeonFlag(u16 flag); + bool doCommit(); + + /** inline shenanigans to get copyFromSave to match */ + static inline u16 *saveFilePtr(u16 flagIndex) { + u32 offset = (flagIndex & 0x1fff) * 8; + return FileManager::sInstance->getDungeonFlagsConst() + offset; + } + + static DungeonflagManager *sInstance; +}; + +#endif diff --git a/include/d/flag/flag_index.h b/include/d/flag/flag_index.h new file mode 100644 index 00000000..f4f98d34 --- /dev/null +++ b/include/d/flag/flag_index.h @@ -0,0 +1,37 @@ +#ifndef D_FLAG_FLAG_INDEX_H +#define D_FLAG_FLAG_INDEX_H + +#include "common.h" + +/** + * @brief Defines a single story or item flag. + */ +struct FlagDefinition { + u8 mIndex; + u8 mShiftMask; +}; + +/** + * @brief Helper class for packing and unpacking flag data. + * + * Some flag managers store their data in a packed format, where + * flags have a variable number of bits and can appear in varied + * locations within a halfword. + */ +class FlagIndex { + u16 mDefinitionsCount; + FlagDefinition *mpDefinitions; + +public: + u16 calculateMask(s32 shift); + void doNothing(u32 unused); + FlagIndex(u16 count, FlagDefinition *definitions); + void prepareIndexShiftMask(u16 counterIdx, u32 flagCount, u16 *pIndex, u8 *pShift, u16 *pMask); + u16 maskForIdx(u16 index, u16 flagCount); + u16 getCounterOrFlag(u16 counterIdx, const u16 *pData, u32 flagCount); + void setCounterOrFlag(u16 counterIdx, u16 *pData, u32 flagCount, u32 value); + + u32 checkFlagValid(u16 counterIdx, u32 flagCount); +}; + +#endif diff --git a/include/d/flag/itemflag_manager.h b/include/d/flag/itemflag_manager.h index fa55067c..d2507575 100644 --- a/include/d/flag/itemflag_manager.h +++ b/include/d/flag/itemflag_manager.h @@ -8,7 +8,7 @@ class ItemflagManager : public ItemStoryManagerBase { public: - FlagSpace itemFlags; + FlagSpace mItemFlags; ItemflagManager(); virtual ~ItemflagManager() {} @@ -16,14 +16,14 @@ public: bool commit(); /** 0x0C */ virtual void setFlagszptr() override { - storyFlagsPtr = &itemFlags; + mpFlagSpace = &mItemFlags; } /** 0x10 */ virtual void onDirty() override; /** 0x14 */ virtual void copyFlagsFromSave(); /** 0x18 */ virtual void setupUnkFlagsStuff(); /** 0x1C */ virtual void doCommit() { - u16 sz = flagSizeMaybe; - u16 *flags = storyFlagsPtr->getFlagPtrUnchecked(); + u16 sz = mFlagCount; + u16 *flags = mpFlagSpace->getFlagPtrUnchecked(); FileManager::sInstance->setItemFlags(flags, 0, sz); } /** 0x20 */ virtual void setFlag(u16 flag) { diff --git a/include/d/flag/storyflag_manager.h b/include/d/flag/storyflag_manager.h index d718823d..bdcaf0aa 100644 --- a/include/d/flag/storyflag_manager.h +++ b/include/d/flag/storyflag_manager.h @@ -10,19 +10,19 @@ public: virtual ~StoryflagManager() {} - FlagSpace storyFlags; + FlagSpace mStoryFlags; bool commit(); /** 0x0C */ virtual void setFlagszptr() override { - storyFlagsPtr = &storyFlags; + mpFlagSpace = &mStoryFlags; } /** 0x10 */ virtual void onDirty() override; /** 0x14 */ virtual void copyFlagsFromSave() override; /** 0x18 */ virtual void setupUnkFlagsStuff() override; /** 0x1C */ virtual void doCommit() override { - u16 sz = flagSizeMaybe; - u16 *flags = storyFlagsPtr->getFlagPtrUnchecked(); + u16 sz = mFlagCount; + u16 *flags = mpFlagSpace->getFlagPtrUnchecked(); FileManager::sInstance->setStoryFlags(flags, 0, sz); } /** 0x24 */ virtual void unsetFlag(u16 flag) override; diff --git a/include/d/flag/unk_flag_stuff.h b/include/d/flag/unk_flag_stuff.h deleted file mode 100644 index 9f0513f3..00000000 --- a/include/d/flag/unk_flag_stuff.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef UNK_FLAG_STUFF_H -#define UNK_FLAG_STUFF_H - -#include "common.h" - -struct UnkFlagDefinition { - u8 mIndex; - u8 mShiftMask; -}; - -class UnkFlagStuff { - u16 mDefinitionsCount; - UnkFlagDefinition *mpDefinitions; - -public: - u16 calculateMask(s32 shift); - void doNothing(u32 unused); - UnkFlagStuff(u16 count, UnkFlagDefinition *definitions); - void prepareIndexShiftMask(u16 counterIdx, u32 flagCount, u16 *pIndex, u8 *pShift, u16 *pMask); - u16 maskForIdx(u16 index, u16 flagSizeMaybe); - u16 getCounterOrFlag(u16 counterIdx, const u16 *pData, u32 flagCount); - void setCounterOrFlag(u16 counterIdx, u16 *pData, u32 flagCount, u32 value); - u32 checkFlagValid(u16 counterIdx, u32 flagCount); -}; - -#endif diff --git a/src/d/flag/baseflag_manager.inc b/src/d/flag/baseflag_manager.inc index 86b3e14e..9dd6c15c 100644 --- a/src/d/flag/baseflag_manager.inc +++ b/src/d/flag/baseflag_manager.inc @@ -1,37 +1,36 @@ #include "d/flag/baseflag_manager.h" -ItemStoryManagerBase::ItemStoryManagerBase(): flagSizeMaybe(0), anotherSizeMaybe(0), storyFlagsPtr(nullptr), unkFlagsPtr(nullptr), dirty(false) {} +ItemStoryManagerBase::ItemStoryManagerBase(): mFlagCount(0), mFlagSizeBytes(0), mpFlagSpace(nullptr), mpFlagIndex(nullptr), mDirty(false) {} ItemStoryManagerBase::~ItemStoryManagerBase() { - if (unkFlagsPtr != nullptr) { - delete unkFlagsPtr; + if (mpFlagIndex != nullptr) { + delete mpFlagIndex; } } -void ItemStoryManagerBase::setFlagSizes(u16 flagSizeMaybe, u16 anotherFlagSizeMaybe) { - this->flagSizeMaybe = flagSizeMaybe; - this->anotherSizeMaybe = anotherFlagSizeMaybe; +void ItemStoryManagerBase::setFlagSizes(u16 flagCount, u16 flagSizeBytes) { + mFlagCount = flagCount; + mFlagSizeBytes = flagSizeBytes; } /** 800bf320 */ -void ItemStoryManagerBase::setupUnkFlagStuff(UnkFlagDefinition *def, u16 count) { - UnkFlagStuff *stuff = new UnkFlagStuff(count, def); - this->unkFlagsPtr = stuff; +void ItemStoryManagerBase::setupFlagIndex(FlagDefinition *def, u16 count) { + mpFlagIndex = new FlagIndex(count, def); } /** 800bf380 */ void ItemStoryManagerBase::copyFlagsFromSave_Priv() { - FlagSpace *current = this->storyFlagsPtr; - const u16 *saved = this->getSaveFlagSpace(); - current->copyFromSaveFile(saved, 0, this->flagSizeMaybe); + FlagSpace *current = mpFlagSpace; + const u16 *saved = getSaveFlagSpace(); + current->copyFromSaveFile(saved, 0, mFlagCount); } /** 800bf3e0 */ void ItemStoryManagerBase::init() { - const u16 *space = this->getSaveFlagSpace(); - if (space == nullptr || this->unkFlagsPtr == nullptr) { - this->setFlagszptr(); - this->copyFlagsFromSave(); - this->setupUnkFlagsStuff(); + const u16 *space = getSaveFlagSpace(); + if (space == nullptr || mpFlagIndex == nullptr) { + setFlagszptr(); + copyFlagsFromSave(); + setupUnkFlagsStuff(); } } @@ -42,37 +41,37 @@ void ItemStoryManagerBase::setFlagszptr() { /** 800bf480 */ u16 ItemStoryManagerBase::getFlag(u16 flag) const { - const u16 *data = this->getSaveFlagSpace(); - return this->unkFlagsPtr->getCounterOrFlag(flag, data, this->flagSizeMaybe); + const u16 *data = getSaveFlagSpace(); + return mpFlagIndex->getCounterOrFlag(flag, data, mFlagCount); } /** 800bf4e0 */ u16 ItemStoryManagerBase::getUncommittedValue_Priv(u16 flag) { - u16 *data = this->storyFlagsPtr->getFlagPtrUnchecked(); - return this->unkFlagsPtr->getCounterOrFlag(flag, data, this->flagSizeMaybe); + u16 *data = mpFlagSpace->getFlagPtrUnchecked(); + return mpFlagIndex->getCounterOrFlag(flag, data, mFlagCount); } /** 800bf530 */ void ItemStoryManagerBase::setOrClearFlag(u16 flag, u16 value) { - FlagSpace *storyFlagsPtr = this->storyFlagsPtr; + FlagSpace *storyFlagsPtr = mpFlagSpace; u16 *pData = storyFlagsPtr->getFlagPtrChecked(); - this->unkFlagsPtr->setCounterOrFlag(flag, pData, storyFlagsPtr->mCount, value); - this->FUN_800bf610(flag); + mpFlagIndex->setCounterOrFlag(flag, pData, storyFlagsPtr->mCount, value); + onFlagChange(flag); } /** 800bf5b0 */ void ItemStoryManagerBase::setFlag(u16 flag) { - this->setOrClearFlag(flag, true); + setOrClearFlag(flag, true); } /** 800bf5c0 */ void ItemStoryManagerBase::unsetFlag(u16 flag) { - this->setOrClearFlag(flag, false); + setOrClearFlag(flag, false); } /** 800bf5d0 */ void ItemStoryManagerBase::setFlagOrCounterToValue(u16 flag, u16 value) { - this->setOrClearFlag(flag, value); + setOrClearFlag(flag, value); } /** 800bf5e0 */ @@ -82,18 +81,18 @@ u16 ItemStoryManagerBase::getCounterOrFlag(u16 flag) const { /** 800bf5f0 */ u16 ItemStoryManagerBase::getUncommittedValue(u16 flag) { - return this->getUncommittedValue_Priv(flag); + return getUncommittedValue_Priv(flag); } /** 800bf600 */ u16 ItemStoryManagerBase::unk3(u16 flag) { - return this->FUN_800bf640(flag); + return getMaskForFlag(flag); } /** 800bf610 */ -void ItemStoryManagerBase::FUN_800bf610(u16 flag) { - this->dirty = true; - this->onDirty(); +void ItemStoryManagerBase::onFlagChange(u16 flag) { + mDirty = true; + onDirty(); } /** 800bf630 */ @@ -102,17 +101,17 @@ void ItemStoryManagerBase::onDirty() { } /** 800bf640 */ -u16 ItemStoryManagerBase::FUN_800bf640(u16 flag) { - return this->unkFlagsPtr->maskForIdx(flag, this->flagSizeMaybe); +u16 ItemStoryManagerBase::getMaskForFlag(u16 flag) { + return mpFlagIndex->maskForIdx(flag, mFlagCount); } /** 800bf650 */ void ItemStoryManagerBase::doCommit_Priv() { - this->doCommit(); - this->dirty = false; + doCommit(); + mDirty = false; } /* 800bf690 */ -void ItemStoryManagerBase::FUN_800bf690() { +void ItemStoryManagerBase::postCommit() { } diff --git a/src/d/flag/dungeonflag_manager.inc b/src/d/flag/dungeonflag_manager.inc index 7b9e0f50..4af48f90 100644 --- a/src/d/flag/dungeonflag_manager.inc +++ b/src/d/flag/dungeonflag_manager.inc @@ -1,39 +1,9 @@ -#include "toBeSorted/file_manager.h" -#include "d/flag/flag_space.h" -#include "d/flag/unk_flag_stuff.h" +#include "d/flag/dungeonflag_manager.h" +#include "d/flag/flag_index.h" // TODO move -extern "C" UnkFlagDefinition DungeonflagManager__FLAG_DEFINITIONS[]; - -class DungeonflagManager { -public: - bool mShouldCommit; - u16 mStageIndex; - UnkFlagStuff *mFlagStuff; - FlagSpace mFlagSpace; - - static u16 sDungeonFlags[8]; - // static DungeonflagManager *sInstance; - - void copyFromSave(u32 flag); - void copyFromSave_Internal(u16 flagIndex); - void setCommitFlag(u16 flag); - DungeonflagManager(); - void init(); - void setToValue(u16 flag, u32 value); - void setFlag(u16 flag); - u16 getDungeonFlag(u16 flag); - bool doCommit(); - - /** inline shenanigans to get copyFromSave to match */ - static inline u16 *saveFilePtr(u16 flagIndex) { - u32 offset = (flagIndex & 0x1fff) * 8; - return FileManager::sInstance->getDungeonFlagsConst() + offset; - } - - static DungeonflagManager *sInstance; -}; +extern "C" FlagDefinition DungeonflagManager__FLAG_DEFINITIONS[]; /** 80575404 */ DungeonflagManager *DungeonflagManager::sInstance = nullptr; @@ -53,12 +23,12 @@ void DungeonflagManager::setCommitFlag(u16 flag) { /** 0x800bf940 */ DungeonflagManager::DungeonflagManager() - : mShouldCommit(false), mStageIndex(-1), mFlagStuff(nullptr), + : mShouldCommit(false), mStageIndex(-1), mpFlagIndex(nullptr), mFlagSpace(sDungeonFlags, ARRAY_LENGTH(sDungeonFlags)) {} /** 800bf980 */ void DungeonflagManager::init() { - mFlagStuff = new UnkFlagStuff(0x11, DungeonflagManager__FLAG_DEFINITIONS); + mpFlagIndex = new FlagIndex(0x11, DungeonflagManager__FLAG_DEFINITIONS); mShouldCommit = false; } @@ -71,21 +41,21 @@ void DungeonflagManager::copyFromSave(u32 flag) { /** 800bf9f0 */ void DungeonflagManager::setToValue(u16 flag, u32 value) { u16 *data = mFlagSpace.getFlagPtrChecked(); - mFlagStuff->setCounterOrFlag(flag, data, 8, value); + mpFlagIndex->setCounterOrFlag(flag, data, 8, value); setCommitFlag(flag); } /** 800bfa60 */ void DungeonflagManager::setFlag(u16 flag) { u16 *data = mFlagSpace.getFlagPtrChecked(); - mFlagStuff->setCounterOrFlag(flag, data, 8, 1); + mpFlagIndex->setCounterOrFlag(flag, data, 8, 1); setCommitFlag(flag); } /** 800fbac0 */ u16 DungeonflagManager::getDungeonFlag(u16 flag) { u16 *data = mFlagSpace.getFlagPtrUnchecked(); - return mFlagStuff->getCounterOrFlag(flag, data, 8); + return mpFlagIndex->getCounterOrFlag(flag, data, 8); } /** 800fbb10 */ diff --git a/src/d/flag/unk_flag_stuff.inc b/src/d/flag/flag_index.inc similarity index 66% rename from src/d/flag/unk_flag_stuff.inc rename to src/d/flag/flag_index.inc index 79289abe..b7dc5380 100644 --- a/src/d/flag/unk_flag_stuff.inc +++ b/src/d/flag/flag_index.inc @@ -1,30 +1,30 @@ -#include "d/flag/unk_flag_stuff.h" +#include "d/flag/flag_index.h" -u16 UnkFlagStuff::calculateMask(s32 shift) { +u16 FlagIndex::calculateMask(s32 shift) { return (2 << (shift & 0xF)) - 1; } -void UnkFlagStuff::doNothing(u32 unused) {} +void FlagIndex::doNothing(u32 unused) {} -UnkFlagStuff::UnkFlagStuff(u16 count, UnkFlagDefinition *definitions) { +FlagIndex::FlagIndex(u16 count, FlagDefinition *definitions) { this->mDefinitionsCount = count; this->mpDefinitions = definitions; } -void UnkFlagStuff::prepareIndexShiftMask(u16 counterIdx, u32 unused, u16 *indexPtr, u8 *shiftPtr, u16 *maskPtr) { +void FlagIndex::prepareIndexShiftMask(u16 counterIdx, u32 unused, u16 *indexPtr, u8 *shiftPtr, u16 *maskPtr) { doNothing(counterIdx); *indexPtr = mpDefinitions[counterIdx].mIndex; *shiftPtr = mpDefinitions[counterIdx].mShiftMask >> 4; *maskPtr = calculateMask(mpDefinitions[counterIdx].mShiftMask); } -u16 UnkFlagStuff::maskForIdx(u16 index, u16 flagSizeMaybe) { +u16 FlagIndex::maskForIdx(u16 index, u16 flagCount) { doNothing(index); return calculateMask(mpDefinitions[index].mShiftMask); } -u16 UnkFlagStuff::getCounterOrFlag(u16 counterIdx, const u16 *dataPtr, u32 param4) { +u16 FlagIndex::getCounterOrFlag(u16 counterIdx, const u16 *dataPtr, u32 param4) { u16 index = 0; u8 shift = 0; u16 mask = 0; @@ -32,7 +32,7 @@ u16 UnkFlagStuff::getCounterOrFlag(u16 counterIdx, const u16 *dataPtr, u32 param return mask & (dataPtr[index] >> shift); } -void UnkFlagStuff::setCounterOrFlag(u16 counterIdx, u16 *dataPtr, u32 flagCount, u32 value) { +void FlagIndex::setCounterOrFlag(u16 counterIdx, u16 *dataPtr, u32 flagCount, u32 value) { u16 index = 0; u8 shift = 0; u16 mask = 0; @@ -45,7 +45,7 @@ inline bool isLessThan(int a, int b) { return a <= b; } -u32 UnkFlagStuff::checkFlagValid(u16 counterIdx, u32 flagCount) { +u32 FlagIndex::checkFlagValid(u16 counterIdx, u32 flagCount) { if (mpDefinitions == nullptr) { return 0; } diff --git a/src/d/flag/flag_managers.cpp b/src/d/flag/flag_managers.cpp index 5a39ad65..acd6b3b9 100644 --- a/src/d/flag/flag_managers.cpp +++ b/src/d/flag/flag_managers.cpp @@ -11,21 +11,21 @@ #include "d/flag/enemyflag_manager.h" #include "d/flag/storyflag_manager.h" #include "d/flag/itemflag_manager.h" -// clang-format on +// actual managers #include "d/flag/sceneflag_manager.inc" #include "d/flag/committable_flag_manager.inc" #include "d/flag/tboxflag_manager.inc" #include "d/flag/enemyflag_manager.inc" #include "d/flag/flag_space.inc" -#include "d/flag/unk_flag_stuff.inc" +#include "d/flag/flag_index.inc" #include "d/flag/bitwise_flag_helper.inc" - #include "d/flag/baseflag_manager.inc" #include "d/flag/storyflag_manager.inc" #include "d/flag/itemflag_manager.inc" #include "d/flag/dungeonflag_manager.inc" #include "d/flag/skipflag_manager.inc" +// clang-format on static void postSetup(); diff --git a/src/d/flag/flag_space.inc b/src/d/flag/flag_space.inc index 298aac80..18e7c0ab 100644 --- a/src/d/flag/flag_space.inc +++ b/src/d/flag/flag_space.inc @@ -1,7 +1,7 @@ +#include "common.h" #include "d/flag/flag_managers.h" #include "d/flag/flag_space.h" #include "toBeSorted/file_manager.h" -#include "common.h" u16 *FlagSpace::getFlagPtrChecked() const { filemanagerCheck(); diff --git a/src/d/flag/itemflag_manager.inc b/src/d/flag/itemflag_manager.inc index 027a16a8..190d2fb1 100644 --- a/src/d/flag/itemflag_manager.inc +++ b/src/d/flag/itemflag_manager.inc @@ -4,25 +4,25 @@ u16 ItemflagManager::sFlags[0x40]; ItemflagManager *ItemflagManager::sInstance = nullptr; -ItemflagManager::ItemflagManager() : itemFlags(sFlags, 0x40) {} +ItemflagManager::ItemflagManager() : mItemFlags(sFlags, 0x40) {} void ItemflagManager::copyFlagsFromSave() { setFlagSizes(0x40, 0x80); - copyFlagsFromSave_Priv(); + ItemStoryManagerBase::copyFlagsFromSave_Priv(); } -extern "C" UnkFlagDefinition ItemflagManager__ITEMFLAG_DEFINITIONS[]; +extern "C" FlagDefinition ItemflagManager__ITEMFLAG_DEFINITIONS[]; void ItemflagManager::setupUnkFlagsStuff() { - setupUnkFlagStuff(ItemflagManager__ITEMFLAG_DEFINITIONS, 0x1FE); + setupFlagIndex(ItemflagManager__ITEMFLAG_DEFINITIONS, 0x1FE); } void ItemflagManager::onDirty() {} bool ItemflagManager::commit() { - if (dirty) { + if (mDirty) { doCommit_Priv(); - FUN_800bf690(); + postCommit(); return true; } return false; diff --git a/src/d/flag/sceneflag_manager.inc b/src/d/flag/sceneflag_manager.inc index c0536acf..16d51c7c 100644 --- a/src/d/flag/sceneflag_manager.inc +++ b/src/d/flag/sceneflag_manager.inc @@ -1,10 +1,7 @@ -#include "d/flag/sceneflag_manager.h" - #include "common.h" -#include "libc.h" +#include "d/flag/sceneflag_manager.h" #include "toBeSorted/file_manager.h" - SceneflagManager *SceneflagManager::sInstance = nullptr; u16 SceneflagManager::sTempFlags[] = {}; u16 SceneflagManager::sSceneFlags[8] = {}; @@ -20,14 +17,7 @@ SceneflagManager::SceneflagManager() mSceneIdx = 0xFFFF; mShouldCommit = 0; } -// SceneflagManager::SceneflagManager() -// { -// mSceneflags.init(sSceneFlags, ARRAY_LENGTH(sSceneFlags)); -// mTempflags.init(sTempFlags, ARRAY_LENGTH(sTempFlags)); -// mZoneflags.init(sZoneFlags, ARRAY_LENGTH(sZoneFlags)); -// mSceneIdx = 0xFFFF; -// mShouldCommit = 0; -// } + s32 SceneflagManager::isNotTempOrZoneFlag(u16 flag) { // return ((s32)flag - 0x80) < 0; return flag < 0x80; diff --git a/src/d/flag/skipflag_manager.inc b/src/d/flag/skipflag_manager.inc index b365aee3..c3bd8433 100644 --- a/src/d/flag/skipflag_manager.inc +++ b/src/d/flag/skipflag_manager.inc @@ -1,9 +1,9 @@ #include "common.h" -#include "d/flag/flag_managers.h" -#include "d/flag/skipflag_manager.h" #include "d/flag/bitwise_flag_helper.h" -#include "toBeSorted/file_manager.h" +#include "d/flag/flag_managers.h" #include "d/flag/flag_space.h" +#include "d/flag/skipflag_manager.h" +#include "toBeSorted/file_manager.h" // 0x80575408 SkipflagManager *SkipflagManager::sInstance = nullptr; diff --git a/src/d/flag/storyflag_manager.inc b/src/d/flag/storyflag_manager.inc index 3b45d4cc..74408dff 100644 --- a/src/d/flag/storyflag_manager.inc +++ b/src/d/flag/storyflag_manager.inc @@ -3,29 +3,25 @@ u16 StoryflagManager::sFlags[0x80]; StoryflagManager *StoryflagManager::sInstance = nullptr; -StoryflagManager::StoryflagManager() : storyFlags(sFlags, 0x80) { - -} +StoryflagManager::StoryflagManager() : mStoryFlags(sFlags, 0x80) {} void StoryflagManager::copyFlagsFromSave() { setFlagSizes(0x80, 0x100); - copyFlagsFromSave_Priv(); + ItemStoryManagerBase::copyFlagsFromSave_Priv(); } -extern "C" UnkFlagDefinition StoryflagManager__STORYFLAG_DEFINITIONS[]; +extern "C" FlagDefinition StoryflagManager__STORYFLAG_DEFINITIONS[]; void StoryflagManager::setupUnkFlagsStuff() { - setupUnkFlagStuff(StoryflagManager__STORYFLAG_DEFINITIONS, 0x4B1); + setupFlagIndex(StoryflagManager__STORYFLAG_DEFINITIONS, 0x4B1); } -void StoryflagManager::onDirty() { - -} +void StoryflagManager::onDirty() {} bool StoryflagManager::commit() { - if (dirty) { + if (mDirty) { doCommit_Priv(); - FUN_800bf690(); + postCommit(); return true; } return false; From 6fab08332965a727ef646c568ed854d323a3e336 Mon Sep 17 00:00:00 2001 From: robojumper Date: Fri, 25 Oct 2024 15:30:28 +0200 Subject: [PATCH 6/9] Uniformity renames --- config/SOUE01/symbols.txt | 28 +++++++++++------------ include/d/flag/baseflag_manager.h | 10 ++++---- include/d/flag/committable_flag_manager.h | 2 +- include/d/flag/dungeonflag_manager.h | 2 +- include/d/flag/itemflag_manager.h | 6 ++--- include/d/flag/sceneflag_manager.h | 2 +- include/d/flag/skipflag_manager.h | 7 +++--- include/d/flag/storyflag_manager.h | 6 ++--- src/d/flag/baseflag_manager.inc | 12 +++++----- src/d/flag/committable_flag_manager.inc | 2 +- src/d/flag/dungeonflag_manager.inc | 2 +- src/d/flag/flag_index.inc | 10 +------- src/d/flag/flag_managers.cpp | 16 ++++++------- src/d/flag/itemflag_manager.inc | 8 +++---- src/d/flag/sceneflag_manager.inc | 2 +- src/d/flag/skipflag_manager.inc | 8 +++---- src/d/flag/storyflag_manager.inc | 8 +++---- 17 files changed, 62 insertions(+), 69 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index f889db3a..7dbfb6ea 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -4101,8 +4101,8 @@ unsetZoneflag__16SceneflagManagerFUsUs = .text:0x800BE3E0; // type:function size unsetFlag__16SceneflagManagerFUsUs = .text:0x800BE490; // type:function size:0x70 unsetSceneflagGlobal__16SceneflagManagerFUsUs = .text:0x800BE500; // type:function size:0xE0 unsetTempOrSceneflag__16SceneflagManagerFUs = .text:0x800BE5E0; // type:function size:0x100 -doCommit__16SceneflagManagerFv = .text:0x800BE6E0; // type:function size:0xC8 -commitIfNecessary__22CommittableFlagManagerFv = .text:0x800BE7B0; // type:function size:0x58 +commit__16SceneflagManagerFv = .text:0x800BE6E0; // type:function size:0xC8 +commit__22CommittableFlagManagerFv = .text:0x800BE7B0; // type:function size:0x58 doCommit__15TBoxFlagManagerFv = .text:0x800BE810; // type:function size:0x58 checkUncommittedFlag__15TBoxFlagManagerFUs = .text:0x800BE870; // type:function size:0x68 __ct__15TBoxFlagManagerFv = .text:0x800BE8E0; // type:function size:0x40 @@ -4143,10 +4143,10 @@ unsetFlag__17BitwiseFlagHelperFUsUsPUsUs = .text:0x800BF240; // type:function si __ct__20ItemStoryManagerBaseFv = .text:0x800BF270; // type:function size:0x28 __dt__20ItemStoryManagerBaseFv = .text:0x800BF2A0; // type:function size:0x70 setFlagSizes__20ItemStoryManagerBaseFUsUs = .text:0x800BF310; // type:function size:0xC -setupFlagIndex__20ItemStoryManagerBaseFP14FlagDefinitionUs = .text:0x800BF320; // type:function size:0x60 -copyFlagsFromSave_Priv__20ItemStoryManagerBaseFv = .text:0x800BF380; // type:function size:0x58 +createFlagIndex__20ItemStoryManagerBaseFP14FlagDefinitionUs = .text:0x800BF320; // type:function size:0x60 +copyFromSave__20ItemStoryManagerBaseFv = .text:0x800BF380; // type:function size:0x58 init__20ItemStoryManagerBaseFv = .text:0x800BF3E0; // type:function size:0x88 -setFlagszptr__20ItemStoryManagerBaseFv = .text:0x800BF470; // type:function size:0x4 +initFlagSpace__20ItemStoryManagerBaseFv = .text:0x800BF470; // type:function size:0x4 getFlag__20ItemStoryManagerBaseCFUs = .text:0x800BF480; // type:function size:0x58 getUncommittedValue_Priv__20ItemStoryManagerBaseFUs = .text:0x800BF4E0; // type:function size:0x50 setOrClearFlag__20ItemStoryManagerBaseFUsUs = .text:0x800BF530; // type:function size:0x78 @@ -4162,14 +4162,14 @@ getMaskForFlag__20ItemStoryManagerBaseFUs = .text:0x800BF640; // type:function s doCommit_Priv__20ItemStoryManagerBaseFv = .text:0x800BF650; // type:function size:0x40 postCommit__20ItemStoryManagerBaseFv = .text:0x800BF690; // type:function size:0x4 __ct__16StoryflagManagerFv = .text:0x800BF6A0; // type:function size:0x5C -copyFlagsFromSave__16StoryflagManagerFv = .text:0x800BF700; // type:function size:0x3C -setupUnkFlagsStuff__16StoryflagManagerFv = .text:0x800BF740; // type:function size:0x10 +copyFlagsFromSaveFirstTime__16StoryflagManagerFv = .text:0x800BF700; // type:function size:0x3C +setupFlagIndex__16StoryflagManagerFv = .text:0x800BF740; // type:function size:0x10 onDirty__16StoryflagManagerFv = .text:0x800BF750; // type:function size:0x4 commit__16StoryflagManagerFv = .text:0x800BF760; // type:function size:0x4C unsetFlag__16StoryflagManagerFUs = .text:0x800BF7B0; // type:function size:0x4 __ct__15ItemflagManagerFv = .text:0x800BF7C0; // type:function size:0x5C -copyFlagsFromSave__15ItemflagManagerFv = .text:0x800BF820; // type:function size:0x3C -setupUnkFlagsStuff__15ItemflagManagerFv = .text:0x800BF860; // type:function size:0x10 +copyFlagsFromSaveFirstTime__15ItemflagManagerFv = .text:0x800BF820; // type:function size:0x3C +setupFlagIndex__15ItemflagManagerFv = .text:0x800BF860; // type:function size:0x10 onDirty__15ItemflagManagerFv = .text:0x800BF870; // type:function size:0x4 commit__15ItemflagManagerFv = .text:0x800BF880; // type:function size:0x4C copyFromSave_Internal__18DungeonflagManagerFUs = .text:0x800BF8D0; // type:function size:0x54 @@ -4180,12 +4180,12 @@ copyFromSave__18DungeonflagManagerFUl = .text:0x800BF9E0; // type:function size: setToValue__18DungeonflagManagerFUsUl = .text:0x800BF9F0; // type:function size:0x6C setFlag__18DungeonflagManagerFUs = .text:0x800BFA60; // type:function size:0x60 getDungeonFlag__18DungeonflagManagerFUs = .text:0x800BFAC0; // type:function size:0x50 -doCommit__18DungeonflagManagerFv = .text:0x800BFB10; // type:function size:0x8C -copyFromSave__15SkipflagManagerFv = .text:0x800BFBA0; // type:function size:0x44 +commit__18DungeonflagManagerFv = .text:0x800BFB10; // type:function size:0x8C +doCopyFromSave__15SkipflagManagerFv = .text:0x800BFBA0; // type:function size:0x44 setCommitFlag__15SkipflagManagerFUs = .text:0x800BFBF0; // type:function size:0xC __ct__15SkipflagManagerFv = .text:0x800BFC00; // type:function size:0x2C init__15SkipflagManagerFv = .text:0x800BFC30; // type:function size:0xC -thunk_copyFromSave__15SkipflagManagerFv = .text:0x800BFC40; // type:function size:0x4 +copyFromSave__15SkipflagManagerFv = .text:0x800BFC40; // type:function size:0x4 setFlag__15SkipflagManagerFUs = .text:0x800BFC50; // type:function size:0xD0 checkFlag__15SkipflagManagerFUs = .text:0x800BFD20; // type:function size:0x68 commitFlags__15SkipflagManagerFv = .text:0x800BFD90; // type:function size:0x70 @@ -4206,10 +4206,10 @@ getCounterOrFlag__15ItemflagManagerCFUs = .text:0x800C03C0; // type:function siz setFlagOrCounterToValue__15ItemflagManagerFUsUs = .text:0x800C03D0; // type:function size:0x8 unsetFlag__15ItemflagManagerFUs = .text:0x800C03E0; // type:function size:0x8 doCommit__15ItemflagManagerFv = .text:0x800C03F0; // type:function size:0x44 -setFlagszptr__15ItemflagManagerFv = .text:0x800C0440; // type:function size:0xC +initFlagSpace__15ItemflagManagerFv = .text:0x800C0440; // type:function size:0xC getSaveFlagSpace__16StoryflagManagerCFv = .text:0x800C0450; // type:function size:0x8 doCommit__16StoryflagManagerFv = .text:0x800C0460; // type:function size:0x44 -setFlagszptr__16StoryflagManagerFv = .text:0x800C04B0; // type:function size:0xC +initFlagSpace__16StoryflagManagerFv = .text:0x800C04B0; // type:function size:0xC doCommit__18EnemyDefeatManagerFv = .text:0x800C04C0; // type:function size:0x44 __dt__32MyFlagManager<15ItemflagManager>Fv = .text:0x800C0510; // type:function size:0x5C __dt__33MyFlagManager<16StoryflagManager>Fv = .text:0x800C0570; // type:function size:0x5C diff --git a/include/d/flag/baseflag_manager.h b/include/d/flag/baseflag_manager.h index 42471bca..c30236f4 100644 --- a/include/d/flag/baseflag_manager.h +++ b/include/d/flag/baseflag_manager.h @@ -9,10 +9,10 @@ public: ItemStoryManagerBase(); /** 0x08 */ virtual ~ItemStoryManagerBase(); - /** 0x0C */ virtual void setFlagszptr(); + /** 0x0C */ virtual void initFlagSpace(); /** 0x10 */ virtual void onDirty(); - /** 0x14 */ virtual void copyFlagsFromSave() = 0; - /** 0x18 */ virtual void setupUnkFlagsStuff() = 0; + /** 0x14 */ virtual void copyFlagsFromSaveFirstTime() = 0; + /** 0x18 */ virtual void setupFlagIndex() = 0; /** 0x1C */ virtual void doCommit() = 0; /** 0x20 */ virtual void setFlag(u16 flag); /** 0x24 */ virtual void unsetFlag(u16 flag); @@ -24,8 +24,8 @@ public: void init(); - void copyFlagsFromSave_Priv(); - void setupFlagIndex(FlagDefinition *def, u16 count); + void copyFromSave(); + void createFlagIndex(FlagDefinition *def, u16 count); void doCommit_Priv(); void setOrClearFlag(u16 flag, u16 value); u16 getFlag(u16 flag) const; diff --git a/include/d/flag/committable_flag_manager.h b/include/d/flag/committable_flag_manager.h index c1d40787..e709d518 100644 --- a/include/d/flag/committable_flag_manager.h +++ b/include/d/flag/committable_flag_manager.h @@ -7,7 +7,7 @@ public: virtual void doCommit() = 0; virtual ~CommittableFlagManager() {} - bool commitIfNecessary(); + bool commit(); void setNeedsCommit(bool commit) { mNeedsCommit = commit; } diff --git a/include/d/flag/dungeonflag_manager.h b/include/d/flag/dungeonflag_manager.h index ec944532..55dfa150 100644 --- a/include/d/flag/dungeonflag_manager.h +++ b/include/d/flag/dungeonflag_manager.h @@ -22,7 +22,7 @@ public: void setToValue(u16 flag, u32 value); void setFlag(u16 flag); u16 getDungeonFlag(u16 flag); - bool doCommit(); + bool commit(); /** inline shenanigans to get copyFromSave to match */ static inline u16 *saveFilePtr(u16 flagIndex) { diff --git a/include/d/flag/itemflag_manager.h b/include/d/flag/itemflag_manager.h index d2507575..e6561302 100644 --- a/include/d/flag/itemflag_manager.h +++ b/include/d/flag/itemflag_manager.h @@ -15,12 +15,12 @@ public: bool commit(); - /** 0x0C */ virtual void setFlagszptr() override { + /** 0x0C */ virtual void initFlagSpace() override { mpFlagSpace = &mItemFlags; } /** 0x10 */ virtual void onDirty() override; - /** 0x14 */ virtual void copyFlagsFromSave(); - /** 0x18 */ virtual void setupUnkFlagsStuff(); + /** 0x14 */ virtual void copyFlagsFromSaveFirstTime(); + /** 0x18 */ virtual void setupFlagIndex(); /** 0x1C */ virtual void doCommit() { u16 sz = mFlagCount; u16 *flags = mpFlagSpace->getFlagPtrUnchecked(); diff --git a/include/d/flag/sceneflag_manager.h b/include/d/flag/sceneflag_manager.h index 9e2ce4c3..d1c8d98f 100644 --- a/include/d/flag/sceneflag_manager.h +++ b/include/d/flag/sceneflag_manager.h @@ -58,7 +58,7 @@ public: void unsetFlag(u16 roomId, u16 flag); void unsetSceneflagGlobal(u16 sceneIdx, u16 flag); void unsetTempOrSceneflag(u16 flag); - s32 doCommit(); + s32 commit(); bool checkBoolFlag(u16 roomid, u16 flag) { return checkFlag(roomid, flag); diff --git a/include/d/flag/skipflag_manager.h b/include/d/flag/skipflag_manager.h index 52bf2cf4..c0cbc926 100644 --- a/include/d/flag/skipflag_manager.h +++ b/include/d/flag/skipflag_manager.h @@ -10,15 +10,16 @@ public: SkipflagManager(); void init(); - void copyFromSave(); void setCommitFlag(u16 flag); - void thunk_copyFromSave(); + void copyFromSave(); void setFlag(u16 flag); bool checkFlag(u16 flag); - bool commitFlags(); + bool commit(); static SkipflagManager *sInstance; private: + void doCopyFromSave(); + static u16 sSkipFlags[16]; bool mShouldCommit; diff --git a/include/d/flag/storyflag_manager.h b/include/d/flag/storyflag_manager.h index bdcaf0aa..66639005 100644 --- a/include/d/flag/storyflag_manager.h +++ b/include/d/flag/storyflag_manager.h @@ -14,12 +14,12 @@ public: bool commit(); - /** 0x0C */ virtual void setFlagszptr() override { + /** 0x0C */ virtual void initFlagSpace() override { mpFlagSpace = &mStoryFlags; } /** 0x10 */ virtual void onDirty() override; - /** 0x14 */ virtual void copyFlagsFromSave() override; - /** 0x18 */ virtual void setupUnkFlagsStuff() override; + /** 0x14 */ virtual void copyFlagsFromSaveFirstTime() override; + /** 0x18 */ virtual void setupFlagIndex() override; /** 0x1C */ virtual void doCommit() override { u16 sz = mFlagCount; u16 *flags = mpFlagSpace->getFlagPtrUnchecked(); diff --git a/src/d/flag/baseflag_manager.inc b/src/d/flag/baseflag_manager.inc index 9dd6c15c..f9de576d 100644 --- a/src/d/flag/baseflag_manager.inc +++ b/src/d/flag/baseflag_manager.inc @@ -13,12 +13,12 @@ void ItemStoryManagerBase::setFlagSizes(u16 flagCount, u16 flagSizeBytes) { } /** 800bf320 */ -void ItemStoryManagerBase::setupFlagIndex(FlagDefinition *def, u16 count) { +void ItemStoryManagerBase::createFlagIndex(FlagDefinition *def, u16 count) { mpFlagIndex = new FlagIndex(count, def); } /** 800bf380 */ -void ItemStoryManagerBase::copyFlagsFromSave_Priv() { +void ItemStoryManagerBase::copyFromSave() { FlagSpace *current = mpFlagSpace; const u16 *saved = getSaveFlagSpace(); current->copyFromSaveFile(saved, 0, mFlagCount); @@ -28,14 +28,14 @@ void ItemStoryManagerBase::copyFlagsFromSave_Priv() { void ItemStoryManagerBase::init() { const u16 *space = getSaveFlagSpace(); if (space == nullptr || mpFlagIndex == nullptr) { - setFlagszptr(); - copyFlagsFromSave(); - setupUnkFlagsStuff(); + initFlagSpace(); + copyFlagsFromSaveFirstTime(); + setupFlagIndex(); } } /** 800bf470 */ -void ItemStoryManagerBase::setFlagszptr() { +void ItemStoryManagerBase::initFlagSpace() { } diff --git a/src/d/flag/committable_flag_manager.inc b/src/d/flag/committable_flag_manager.inc index beeb9273..8bf86ba7 100644 --- a/src/d/flag/committable_flag_manager.inc +++ b/src/d/flag/committable_flag_manager.inc @@ -1,7 +1,7 @@ #include "d/flag/committable_flag_manager.h" /* 0x800BE7B0 */ -bool CommittableFlagManager::commitIfNecessary() { +bool CommittableFlagManager::commit() { if (mNeedsCommit) { doCommit(); mNeedsCommit = false; diff --git a/src/d/flag/dungeonflag_manager.inc b/src/d/flag/dungeonflag_manager.inc index 4af48f90..08c5036a 100644 --- a/src/d/flag/dungeonflag_manager.inc +++ b/src/d/flag/dungeonflag_manager.inc @@ -59,7 +59,7 @@ u16 DungeonflagManager::getDungeonFlag(u16 flag) { } /** 800fbb10 */ -bool DungeonflagManager::doCommit() { +bool DungeonflagManager::commit() { FileManager *instance; u16 idx = mStageIndex; if (idx == 0xFFFF) { diff --git a/src/d/flag/flag_index.inc b/src/d/flag/flag_index.inc index b7dc5380..e72efd5f 100644 --- a/src/d/flag/flag_index.inc +++ b/src/d/flag/flag_index.inc @@ -41,10 +41,6 @@ void FlagIndex::setCounterOrFlag(u16 counterIdx, u16 *dataPtr, u32 flagCount, u3 dataPtr[index] = (u16)(value << shift) | dataPtr[index]; } -inline bool isLessThan(int a, int b) { - return a <= b; -} - u32 FlagIndex::checkFlagValid(u16 counterIdx, u32 flagCount) { if (mpDefinitions == nullptr) { return 0; @@ -52,10 +48,6 @@ u32 FlagIndex::checkFlagValid(u16 counterIdx, u32 flagCount) { if (mDefinitionsCount <= counterIdx || mpDefinitions[counterIdx].mIndex == 0xFF) { return 0; } else { - if (isLessThan(flagCount, mpDefinitions[counterIdx].mIndex)) { - return 0; - } else { - return 1; - } + return (int)mpDefinitions[counterIdx].mIndex < (int)flagCount; } } diff --git a/src/d/flag/flag_managers.cpp b/src/d/flag/flag_managers.cpp index acd6b3b9..4798f50e 100644 --- a/src/d/flag/flag_managers.cpp +++ b/src/d/flag/flag_managers.cpp @@ -91,10 +91,10 @@ void copyAllFlagManagersFromSave() { u16 flag = FileManager::sInstance->getSceneFlagIndex(); SceneflagManager::sInstance->copyFromSave(flag); TBoxFlagManager::sInstance->copyFromSave(flag); - StoryflagManager::sInstance->copyFlagsFromSave_Priv(); - ItemflagManager::sInstance->copyFlagsFromSave_Priv(); + StoryflagManager::sInstance->copyFromSave(); + ItemflagManager::sInstance->copyFromSave(); DungeonflagManager::sInstance->copyFromSave(flag); - SkipflagManager::sInstance->thunk_copyFromSave(); + SkipflagManager::sInstance->copyFromSave(); EnemyDefeatManager::sInstance->copyFromSave(flag); } @@ -108,11 +108,11 @@ void updateFlagForFlagIndex(u16 stage) { void commitAllFlagManagers() { StoryflagManager::sInstance->commit(); ItemflagManager::sInstance->commit(); - DungeonflagManager::sInstance->doCommit(); - SkipflagManager::sInstance->commitFlags(); - SceneflagManager::sInstance->doCommit(); - TBoxFlagManager::sInstance->commitIfNecessary(); - EnemyDefeatManager::sInstance->commitIfNecessary(); + DungeonflagManager::sInstance->commit(); + SkipflagManager::sInstance->commit(); + SceneflagManager::sInstance->commit(); + TBoxFlagManager::sInstance->commit(); + EnemyDefeatManager::sInstance->commit(); } bool checkedMemcpy(void *dest, u32 destLen, const void *src, u32 count) { diff --git a/src/d/flag/itemflag_manager.inc b/src/d/flag/itemflag_manager.inc index 190d2fb1..1e603342 100644 --- a/src/d/flag/itemflag_manager.inc +++ b/src/d/flag/itemflag_manager.inc @@ -6,15 +6,15 @@ ItemflagManager *ItemflagManager::sInstance = nullptr; ItemflagManager::ItemflagManager() : mItemFlags(sFlags, 0x40) {} -void ItemflagManager::copyFlagsFromSave() { +void ItemflagManager::copyFlagsFromSaveFirstTime() { setFlagSizes(0x40, 0x80); - ItemStoryManagerBase::copyFlagsFromSave_Priv(); + ItemStoryManagerBase::copyFromSave(); } extern "C" FlagDefinition ItemflagManager__ITEMFLAG_DEFINITIONS[]; -void ItemflagManager::setupUnkFlagsStuff() { - setupFlagIndex(ItemflagManager__ITEMFLAG_DEFINITIONS, 0x1FE); +void ItemflagManager::setupFlagIndex() { + createFlagIndex(ItemflagManager__ITEMFLAG_DEFINITIONS, 0x1FE); } void ItemflagManager::onDirty() {} diff --git a/src/d/flag/sceneflag_manager.inc b/src/d/flag/sceneflag_manager.inc index 16d51c7c..5101567e 100644 --- a/src/d/flag/sceneflag_manager.inc +++ b/src/d/flag/sceneflag_manager.inc @@ -249,7 +249,7 @@ void SceneflagManager::unsetTempOrSceneflag(u16 flag) { setShouldCommit(flag); } } -s32 SceneflagManager::doCommit() { +s32 SceneflagManager::commit() { if (mSceneIdx == 0xFFFF) { return 0; } else if (mShouldCommit) { diff --git a/src/d/flag/skipflag_manager.inc b/src/d/flag/skipflag_manager.inc index c3bd8433..96287018 100644 --- a/src/d/flag/skipflag_manager.inc +++ b/src/d/flag/skipflag_manager.inc @@ -11,7 +11,7 @@ SkipflagManager *SkipflagManager::sInstance = nullptr; u16 SkipflagManager::sSkipFlags[16] = {}; // 800bfba0 -void SkipflagManager::copyFromSave() { +void SkipflagManager::doCopyFromSave() { u16 *savedSkipflags = FileManager::sInstance->getSkipFlags(); mFlagSpace.copyFromSaveFile(savedSkipflags, 0, 0x10); } @@ -30,8 +30,8 @@ void SkipflagManager::init() { } // 800bfc40 -void SkipflagManager::thunk_copyFromSave() { - SkipflagManager::copyFromSave(); +void SkipflagManager::copyFromSave() { + doCopyFromSave(); } // 800bfc50 @@ -53,7 +53,7 @@ bool SkipflagManager::checkFlag(u16 flag) { } // 800bfd90 -bool SkipflagManager::commitFlags() { +bool SkipflagManager::commit() { if (mShouldCommit) { FileManager *instance = FileManager::sInstance; instance->setSkipFlagsChecked(mFlagSpace.getFlagPtrUnchecked(), 0, 0x10); diff --git a/src/d/flag/storyflag_manager.inc b/src/d/flag/storyflag_manager.inc index 74408dff..e4cd30f4 100644 --- a/src/d/flag/storyflag_manager.inc +++ b/src/d/flag/storyflag_manager.inc @@ -5,15 +5,15 @@ StoryflagManager *StoryflagManager::sInstance = nullptr; StoryflagManager::StoryflagManager() : mStoryFlags(sFlags, 0x80) {} -void StoryflagManager::copyFlagsFromSave() { +void StoryflagManager::copyFlagsFromSaveFirstTime() { setFlagSizes(0x80, 0x100); - ItemStoryManagerBase::copyFlagsFromSave_Priv(); + ItemStoryManagerBase::copyFromSave(); } extern "C" FlagDefinition StoryflagManager__STORYFLAG_DEFINITIONS[]; -void StoryflagManager::setupUnkFlagsStuff() { - setupFlagIndex(StoryflagManager__STORYFLAG_DEFINITIONS, 0x4B1); +void StoryflagManager::setupFlagIndex() { + createFlagIndex(StoryflagManager__STORYFLAG_DEFINITIONS, 0x4B1); } void StoryflagManager::onDirty() {} From 1ffae07e7aac60f3ec2773e12ea9ce0d3a971b74 Mon Sep 17 00:00:00 2001 From: robojumper Date: Fri, 25 Oct 2024 15:33:56 +0200 Subject: [PATCH 7/9] oops --- config/SOUE01/symbols.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 7dbfb6ea..e7d61a2a 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -4188,7 +4188,7 @@ init__15SkipflagManagerFv = .text:0x800BFC30; // type:function size:0xC copyFromSave__15SkipflagManagerFv = .text:0x800BFC40; // type:function size:0x4 setFlag__15SkipflagManagerFUs = .text:0x800BFC50; // type:function size:0xD0 checkFlag__15SkipflagManagerFUs = .text:0x800BFD20; // type:function size:0x68 -commitFlags__15SkipflagManagerFv = .text:0x800BFD90; // type:function size:0x70 +commit__15SkipflagManagerFv = .text:0x800BFD90; // type:function size:0x70 setupFlagManagers__FPQ23EGG4Heap = .text:0x800BFE00; // type:function size:0x294 __dt__15TBoxFlagManagerFv = .text:0x800C00A0; // type:function size:0x40 __dt__18EnemyDefeatManagerFv = .text:0x800C00E0; // type:function size:0x40 From 8d798be1203db006b7b72b6d6a51660a9fd4699d Mon Sep 17 00:00:00 2001 From: robojumper Date: Fri, 25 Oct 2024 15:36:39 +0200 Subject: [PATCH 8/9] Flag capitalization --- config/SOUE01/symbols.txt | 64 +++++++++++++++--------------- include/d/flag/enemyflag_manager.h | 8 ++-- include/d/flag/tboxflag_manager.h | 8 ++-- src/d/a/d_a_base.cpp | 2 +- src/d/flag/enemyflag_manager.inc | 26 ++++++------ src/d/flag/flag_managers.cpp | 24 +++++------ src/d/flag/tboxflag_manager.inc | 20 +++++----- 7 files changed, 76 insertions(+), 76 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index e7d61a2a..578d7040 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -4103,25 +4103,25 @@ unsetSceneflagGlobal__16SceneflagManagerFUsUs = .text:0x800BE500; // type:functi unsetTempOrSceneflag__16SceneflagManagerFUs = .text:0x800BE5E0; // type:function size:0x100 commit__16SceneflagManagerFv = .text:0x800BE6E0; // type:function size:0xC8 commit__22CommittableFlagManagerFv = .text:0x800BE7B0; // type:function size:0x58 -doCommit__15TBoxFlagManagerFv = .text:0x800BE810; // type:function size:0x58 -checkUncommittedFlag__15TBoxFlagManagerFUs = .text:0x800BE870; // type:function size:0x68 -__ct__15TBoxFlagManagerFv = .text:0x800BE8E0; // type:function size:0x40 -init__15TBoxFlagManagerFv = .text:0x800BE920; // type:function size:0x4 -copyFromSave__15TBoxFlagManagerFUl = .text:0x800BE930; // type:function size:0x5C -checkFlag__15TBoxFlagManagerFUsUs = .text:0x800BE990; // type:function size:0x94 -getFlagCount__15TBoxFlagManagerCFv = .text:0x800BEA30; // type:function size:0x8 -setFlag__15TBoxFlagManagerFUs = .text:0x800BEA40; // type:function size:0x80 -clearSavedFlags__18EnemyDefeatManagerFv = .text:0x800BEAC0; // type:function size:0x40 -checkUncommittedFlag__18EnemyDefeatManagerFUs = .text:0x800BEB00; // type:function size:0x7C -__ct__18EnemyDefeatManagerFv = .text:0x800BEB80; // type:function size:0x38 -init__18EnemyDefeatManagerFv = .text:0x800BEBC0; // type:function size:0xC -copyFromSave__18EnemyDefeatManagerFUs = .text:0x800BEBD0; // type:function size:0x54 -updateFlagIndex__18EnemyDefeatManagerFUs = .text:0x800BEC30; // type:function size:0x18 -clearAll__18EnemyDefeatManagerFv = .text:0x800BEC50; // type:function size:0x34 -checkIsValidFlag__18EnemyDefeatManagerFUs = .text:0x800BEC90; // type:function size:0x18 -checkFlag__18EnemyDefeatManagerFUs = .text:0x800BECB0; // type:function size:0xA0 -getFlagCount__18EnemyDefeatManagerCFv = .text:0x800BED50; // type:function size:0x8 -setFlag__18EnemyDefeatManagerFUs = .text:0x800BED60; // type:function size:0x94 +doCommit__15TBoxflagManagerFv = .text:0x800BE810; // type:function size:0x58 +checkUncommittedFlag__15TBoxflagManagerFUs = .text:0x800BE870; // type:function size:0x68 +__ct__15TBoxflagManagerFv = .text:0x800BE8E0; // type:function size:0x40 +init__15TBoxflagManagerFv = .text:0x800BE920; // type:function size:0x4 +copyFromSave__15TBoxflagManagerFUl = .text:0x800BE930; // type:function size:0x5C +checkFlag__15TBoxflagManagerFUsUs = .text:0x800BE990; // type:function size:0x94 +getFlagCount__15TBoxflagManagerCFv = .text:0x800BEA30; // type:function size:0x8 +setFlag__15TBoxflagManagerFUs = .text:0x800BEA40; // type:function size:0x80 +clearSavedFlags__16EnemyflagManagerFv = .text:0x800BEAC0; // type:function size:0x40 +checkUncommittedFlag__16EnemyflagManagerFUs = .text:0x800BEB00; // type:function size:0x7C +__ct__16EnemyflagManagerFv = .text:0x800BEB80; // type:function size:0x38 +init__16EnemyflagManagerFv = .text:0x800BEBC0; // type:function size:0xC +copyFromSave__16EnemyflagManagerFUs = .text:0x800BEBD0; // type:function size:0x54 +updateFlagIndex__16EnemyflagManagerFUs = .text:0x800BEC30; // type:function size:0x18 +clearAll__16EnemyflagManagerFv = .text:0x800BEC50; // type:function size:0x34 +checkIsValidFlag__16EnemyflagManagerFUs = .text:0x800BEC90; // type:function size:0x18 +checkFlag__16EnemyflagManagerFUs = .text:0x800BECB0; // type:function size:0xA0 +getFlagCount__16EnemyflagManagerCFv = .text:0x800BED50; // type:function size:0x8 +setFlag__16EnemyflagManagerFUs = .text:0x800BED60; // type:function size:0x94 getFlagPtrChecked__9FlagSpaceCFv = .text:0x800BEE00; // type:function size:0x3C getFlagPtrUnchecked__9FlagSpaceCFv = .text:0x800BEE40; // type:function size:0x8 unsetAll__9FlagSpaceFv = .text:0x800BEE50; // type:function size:0xC @@ -4190,8 +4190,8 @@ setFlag__15SkipflagManagerFUs = .text:0x800BFC50; // type:function size:0xD0 checkFlag__15SkipflagManagerFUs = .text:0x800BFD20; // type:function size:0x68 commit__15SkipflagManagerFv = .text:0x800BFD90; // type:function size:0x70 setupFlagManagers__FPQ23EGG4Heap = .text:0x800BFE00; // type:function size:0x294 -__dt__15TBoxFlagManagerFv = .text:0x800C00A0; // type:function size:0x40 -__dt__18EnemyDefeatManagerFv = .text:0x800C00E0; // type:function size:0x40 +__dt__15TBoxflagManagerFv = .text:0x800C00A0; // type:function size:0x40 +__dt__16EnemyflagManagerFv = .text:0x800C00E0; // type:function size:0x40 __dt__16StoryflagManagerFv = .text:0x800C0120; // type:function size:0x58 __dt__15ItemflagManagerFv = .text:0x800C0180; // type:function size:0x58 postSetup__Fv = .text:0x800C01E0; // type:function size:0x8 @@ -4210,11 +4210,11 @@ initFlagSpace__15ItemflagManagerFv = .text:0x800C0440; // type:function size:0xC getSaveFlagSpace__16StoryflagManagerCFv = .text:0x800C0450; // type:function size:0x8 doCommit__16StoryflagManagerFv = .text:0x800C0460; // type:function size:0x44 initFlagSpace__16StoryflagManagerFv = .text:0x800C04B0; // type:function size:0xC -doCommit__18EnemyDefeatManagerFv = .text:0x800C04C0; // type:function size:0x44 +doCommit__16EnemyflagManagerFv = .text:0x800C04C0; // type:function size:0x44 __dt__32MyFlagManager<15ItemflagManager>Fv = .text:0x800C0510; // type:function size:0x5C __dt__33MyFlagManager<16StoryflagManager>Fv = .text:0x800C0570; // type:function size:0x5C -__dt__35MyFlagManager<18EnemyDefeatManager>Fv = .text:0x800C05D0; // type:function size:0x40 -__dt__32MyFlagManager<15TBoxFlagManager>Fv = .text:0x800C0610; // type:function size:0x40 +__dt__35MyFlagManager<16EnemyflagManager>Fv = .text:0x800C05D0; // type:function size:0x40 +__dt__32MyFlagManager<15TBoxflagManager>Fv = .text:0x800C0610; // type:function size:0x40 fn_800C0650 = .text:0x800C0650; // type:function size:0x3C fn_800C0690 = .text:0x800C0690; // type:function size:0x70 fn_800C0700 = .text:0x800C0700; // type:function size:0x7C @@ -31010,13 +31010,13 @@ lbl_80510B60 = .data:0x80510B60; // type:object size:0x10 lbl_80510B70 = .data:0x80510B70; // type:object size:0x18 __vt__32MyFlagManager<15ItemflagManager> = .data:0x80510B88; // type:object size:0x3C __vt__33MyFlagManager<16StoryflagManager> = .data:0x80510BC4; // type:object size:0x3C -__vt__35MyFlagManager<18EnemyDefeatManager> = .data:0x80510C00; // type:object size:0x14 -__vt__32MyFlagManager<15TBoxFlagManager> = .data:0x80510C14; // type:object size:0x14 +__vt__35MyFlagManager<16EnemyflagManager> = .data:0x80510C00; // type:object size:0x14 +__vt__32MyFlagManager<15TBoxflagManager> = .data:0x80510C14; // type:object size:0x14 __vt__15ItemflagManager = .data:0x80510C28; // type:object size:0x3C __vt__16StoryflagManager = .data:0x80510C64; // type:object size:0x3C __vt__20ItemStoryManagerBase = .data:0x80510CA0; // type:object size:0x3C -__vt__18EnemyDefeatManager = .data:0x80510CDC; // type:object size:0x14 -__vt__15TBoxFlagManager = .data:0x80510CF0; // type:object size:0x14 +__vt__16EnemyflagManager = .data:0x80510CDC; // type:object size:0x14 +__vt__15TBoxflagManager = .data:0x80510CF0; // type:object size:0x14 __vt__9FlagSpace = .data:0x80510D04; // type:object size:0xC lbl_80510D10 = .data:0x80510D10; // type:object size:0x38 data:4byte lbl_80510D48 = .data:0x80510D48; // type:object size:0x18 @@ -39942,9 +39942,9 @@ NAND_REQUEST_THREAD = .sbss:0x805753D0; // type:object size:0x8 data:4byte lbl_805753D8 = .sbss:0x805753D8; // type:object size:0x8 data:4byte sInstance__16SceneflagManager = .sbss:0x805753E0; // type:object size:0x4 data:4byte sTempFlags__16SceneflagManager = .sbss:0x805753E8; // type:object size:0x8 -sInstance__15TBoxFlagManager = .sbss:0x805753F0; // type:object size:0x4 data:4byte -sTBoxFlags__15TBoxFlagManager = .sbss:0x805753F4; // type:object size:0x4 -sInstance__18EnemyDefeatManager = .sbss:0x805753F8; // type:object size:0x4 data:4byte +sInstance__15TBoxflagManager = .sbss:0x805753F0; // type:object size:0x4 data:4byte +sTBoxFlags__15TBoxflagManager = .sbss:0x805753F4; // type:object size:0x4 +sInstance__16EnemyflagManager = .sbss:0x805753F8; // type:object size:0x4 data:4byte sInstance__16StoryflagManager = .sbss:0x805753FC; // type:object size:0x4 data:4byte sInstance__15ItemflagManager = .sbss:0x80575400; // type:object size:0x4 data:4byte sInstance__18DungeonflagManager = .sbss:0x80575404; // type:object size:0x4 data:4byte @@ -48332,7 +48332,7 @@ lbl_805A78B8 = .bss:0x805A78B8; // type:object size:0xC TIMESHIFT_STONE_REFS = .bss:0x805A78C4; // type:object size:0xC data:4byte sSceneFlags__16SceneflagManager = .bss:0x805A78D0; // type:object size:0x10 sZoneFlags__16SceneflagManager = .bss:0x805A78E0; // type:object size:0x1F8 -sEnemyDefeatFlags__18EnemyDefeatManager = .bss:0x805A7AD8; // type:object size:0x2000 +sEnemyDefeatFlags__16EnemyflagManager = .bss:0x805A7AD8; // type:object size:0x2000 sFlags__16StoryflagManager = .bss:0x805A9AD8; // type:object size:0x100 sFlags__15ItemflagManager = .bss:0x805A9BD8; // type:object size:0x80 sDungeonFlags__18DungeonflagManager = .bss:0x805A9C58; // type:object size:0x10 diff --git a/include/d/flag/enemyflag_manager.h b/include/d/flag/enemyflag_manager.h index b294c4f3..1bfe3a62 100644 --- a/include/d/flag/enemyflag_manager.h +++ b/include/d/flag/enemyflag_manager.h @@ -6,7 +6,7 @@ #include "d/flag/flag_space.h" #include "toBeSorted/file_manager.h" -class EnemyDefeatManager : public CommittableFlagManager { +class EnemyflagManager : public CommittableFlagManager { public: FlagSpace mFlagSpace; BitwiseFlagHelper mFlagHelper; @@ -14,21 +14,21 @@ public: static u16 sEnemyDefeatFlags[4096]; - static EnemyDefeatManager *sInstance; + static EnemyflagManager *sInstance; void clearSavedFlags(); bool checkUncommittedFlag(u16 flag); u16 checkUncommittedFlag2(u16 flag) { return checkUncommittedFlag(flag); } - EnemyDefeatManager(); + EnemyflagManager(); void init(); void copyFromSave(u16 sceneIndex); void updateFlagIndex(u16 sceneIndex); void clearAll(); bool checkIsValidFlag(u16 flag); bool checkFlag(u16 flag); - virtual ~EnemyDefeatManager() {} + virtual ~EnemyflagManager() {} virtual u16 getFlagCount() const; void setFlag(u16 flag); diff --git a/include/d/flag/tboxflag_manager.h b/include/d/flag/tboxflag_manager.h index bc0f36b8..a675b789 100644 --- a/include/d/flag/tboxflag_manager.h +++ b/include/d/flag/tboxflag_manager.h @@ -5,7 +5,7 @@ #include "d/flag/committable_flag_manager.h" #include "d/flag/flag_space.h" -class TBoxFlagManager : public CommittableFlagManager { +class TBoxflagManager : public CommittableFlagManager { public: FlagSpace mFlagSpace; u16 mSceneIndex; @@ -13,12 +13,12 @@ public: static u16 sTBoxFlags[2]; - static TBoxFlagManager *sInstance; + static TBoxflagManager *sInstance; virtual void doCommit() override; bool checkUncommittedFlag(u16 flag); - TBoxFlagManager(); - virtual ~TBoxFlagManager() {} + TBoxflagManager(); + virtual ~TBoxflagManager() {} void init(); void copyFromSave(u32 sceneIndex); bool checkFlag(u16 sceneIndex, u16 flag); diff --git a/src/d/a/d_a_base.cpp b/src/d/a/d_a_base.cpp index 6220d7f1..e629b108 100644 --- a/src/d/a/d_a_base.cpp +++ b/src/d/a/d_a_base.cpp @@ -476,7 +476,7 @@ void dAcBase_c::setActorRef(dAcBase_c *ref) { // May not be only purpose void dAcBase_c::setEnemyDefeatFlag() { - EnemyDefeatManager::sInstance->setFlag(obj_id); + EnemyflagManager::sInstance->setFlag(obj_id); } // 8002d940 diff --git a/src/d/flag/enemyflag_manager.inc b/src/d/flag/enemyflag_manager.inc index ce5a2dd6..6c274fa4 100644 --- a/src/d/flag/enemyflag_manager.inc +++ b/src/d/flag/enemyflag_manager.inc @@ -1,17 +1,17 @@ #include "d/flag/enemyflag_manager.h" -EnemyDefeatManager *EnemyDefeatManager::sInstance = nullptr; -u16 EnemyDefeatManager::sEnemyDefeatFlags[4096] = {}; +EnemyflagManager *EnemyflagManager::sInstance = nullptr; +u16 EnemyflagManager::sEnemyDefeatFlags[4096] = {}; /* 0x800BEAC0 */ -void EnemyDefeatManager::clearSavedFlags() { +void EnemyflagManager::clearSavedFlags() { u16 empty[0x1000]; memset(empty, 0, 0x2000); FileManager::getInstance()->setEnemyDefeatFlags(empty, 0, 0x1000); } /* 0x800BEB00 */ -bool EnemyDefeatManager::checkUncommittedFlag(u16 flag) { +bool EnemyflagManager::checkUncommittedFlag(u16 flag) { if (checkIsValidFlag(flag)) { return mFlagHelper.checkFlag(flag / 16, flag % 16, mFlagSpace.getFlagPtrUnchecked(), mFlagSpace.mCount); } else { @@ -20,17 +20,17 @@ bool EnemyDefeatManager::checkUncommittedFlag(u16 flag) { } /* 0x800BEB80 */ -EnemyDefeatManager::EnemyDefeatManager() +EnemyflagManager::EnemyflagManager() : CommittableFlagManager(false), mFlagSpace(sEnemyDefeatFlags, ARRAY_LENGTH(sEnemyDefeatFlags)) {} /* 0x800BEBC0 */ -void EnemyDefeatManager::init() { +void EnemyflagManager::init() { mSceneIndex = 0; clearAll(); } /* 0x800BEBD0 */ -void EnemyDefeatManager::copyFromSave(u16 sceneIndex) { +void EnemyflagManager::copyFromSave(u16 sceneIndex) { mSceneIndex = sceneIndex; u16 count = mFlagSpace.mCount; u16 *flags = FileManager::getInstance()->getEnemyDefeatFlagsConst(); @@ -38,7 +38,7 @@ void EnemyDefeatManager::copyFromSave(u16 sceneIndex) { } /* 0x800BEC30 */ -void EnemyDefeatManager::updateFlagIndex(u16 sceneIndex) { +void EnemyflagManager::updateFlagIndex(u16 sceneIndex) { if (mSceneIndex == sceneIndex) { return; } @@ -47,18 +47,18 @@ void EnemyDefeatManager::updateFlagIndex(u16 sceneIndex) { } /* 0x800BEC50 */ -void EnemyDefeatManager::clearAll() { +void EnemyflagManager::clearAll() { clearSavedFlags(); mFlagSpace.unsetAll(); } /* 0x800BEC90 */ -bool EnemyDefeatManager::checkIsValidFlag(u16 flag) { +bool EnemyflagManager::checkIsValidFlag(u16 flag) { return flag < 0xFFFF; } /* 0x800BECB0 */ -bool EnemyDefeatManager::checkFlag(u16 flag) { +bool EnemyflagManager::checkFlag(u16 flag) { if (!checkIsValidFlag(flag)) { return false; } else { @@ -68,12 +68,12 @@ bool EnemyDefeatManager::checkFlag(u16 flag) { } /* 0x800BED50 */ -u16 EnemyDefeatManager::getFlagCount() const { +u16 EnemyflagManager::getFlagCount() const { return 0x1000; } /* 0x800BED60 */ -void EnemyDefeatManager::setFlag(u16 flag) { +void EnemyflagManager::setFlag(u16 flag) { if (checkUncommittedFlag2(flag) != 1 && checkIsValidFlag(flag)) { mFlagHelper.setFlag(flag / 16, flag % 16, mFlagSpace.getFlagPtrChecked(), mFlagSpace.mCount); setNeedsCommit(true); diff --git a/src/d/flag/flag_managers.cpp b/src/d/flag/flag_managers.cpp index 4798f50e..259ea153 100644 --- a/src/d/flag/flag_managers.cpp +++ b/src/d/flag/flag_managers.cpp @@ -44,16 +44,16 @@ void setupFlagManagers(EGG::Heap *heap) { SceneflagManager::sInstance->init(); } - if (TBoxFlagManager::sInstance == nullptr) { - TBoxFlagManager::sInstance = new (heap) MyFlagManager(); + if (TBoxflagManager::sInstance == nullptr) { + TBoxflagManager::sInstance = new (heap) MyFlagManager(); mHeap m(heap); - TBoxFlagManager::sInstance->init(); + TBoxflagManager::sInstance->init(); } - if (EnemyDefeatManager::sInstance == nullptr) { - EnemyDefeatManager::sInstance = new (heap) MyFlagManager(); + if (EnemyflagManager::sInstance == nullptr) { + EnemyflagManager::sInstance = new (heap) MyFlagManager(); mHeap m(heap); - EnemyDefeatManager::sInstance->init(); + EnemyflagManager::sInstance->init(); } if (StoryflagManager::sInstance == nullptr) { @@ -90,18 +90,18 @@ static void postSetup() { void copyAllFlagManagersFromSave() { u16 flag = FileManager::sInstance->getSceneFlagIndex(); SceneflagManager::sInstance->copyFromSave(flag); - TBoxFlagManager::sInstance->copyFromSave(flag); + TBoxflagManager::sInstance->copyFromSave(flag); StoryflagManager::sInstance->copyFromSave(); ItemflagManager::sInstance->copyFromSave(); DungeonflagManager::sInstance->copyFromSave(flag); SkipflagManager::sInstance->copyFromSave(); - EnemyDefeatManager::sInstance->copyFromSave(flag); + EnemyflagManager::sInstance->copyFromSave(flag); } void updateFlagForFlagIndex(u16 stage) { SceneflagManager::sInstance->updateFlagindex(stage); - TBoxFlagManager::sInstance->copyFromSave(stage); - EnemyDefeatManager::sInstance->updateFlagIndex(stage); + TBoxflagManager::sInstance->copyFromSave(stage); + EnemyflagManager::sInstance->updateFlagIndex(stage); DungeonflagManager::sInstance->copyFromSave(stage); } @@ -111,8 +111,8 @@ void commitAllFlagManagers() { DungeonflagManager::sInstance->commit(); SkipflagManager::sInstance->commit(); SceneflagManager::sInstance->commit(); - TBoxFlagManager::sInstance->commit(); - EnemyDefeatManager::sInstance->commit(); + TBoxflagManager::sInstance->commit(); + EnemyflagManager::sInstance->commit(); } bool checkedMemcpy(void *dest, u32 destLen, const void *src, u32 count) { diff --git a/src/d/flag/tboxflag_manager.inc b/src/d/flag/tboxflag_manager.inc index 2984b978..a00ac045 100644 --- a/src/d/flag/tboxflag_manager.inc +++ b/src/d/flag/tboxflag_manager.inc @@ -1,31 +1,31 @@ #include "d/flag/tboxflag_manager.h" #include "toBeSorted/file_manager.h" -TBoxFlagManager *TBoxFlagManager::sInstance = nullptr; -u16 TBoxFlagManager::sTBoxFlags[2] = {}; +TBoxflagManager *TBoxflagManager::sInstance = nullptr; +u16 TBoxflagManager::sTBoxFlags[2] = {}; /* 0x800BE810 */ -void TBoxFlagManager::doCommit() { +void TBoxflagManager::doCommit() { if (mSceneIndex != 0xFFFF) { FileManager::getInstance()->setTBoxFlags(mFlagSpace.getFlagPtrUnchecked(), mSceneIndex * 2, 2); } } /* 0x800BE870 */ -bool TBoxFlagManager::checkUncommittedFlag(u16 flag) { +bool TBoxflagManager::checkUncommittedFlag(u16 flag) { return mFlagHelper.checkFlag(flag / 16, flag % 16, mFlagSpace.getFlagPtrUnchecked(), mFlagSpace.mCount); } /* 0x800BE8E0 */ -TBoxFlagManager::TBoxFlagManager() : CommittableFlagManager(false), mFlagSpace(sTBoxFlags, ARRAY_LENGTH(sTBoxFlags)) { +TBoxflagManager::TBoxflagManager() : CommittableFlagManager(false), mFlagSpace(sTBoxFlags, ARRAY_LENGTH(sTBoxFlags)) { mSceneIndex = 0xFFFF; } /* 0x800BE920 */ -void TBoxFlagManager::init() {} +void TBoxflagManager::init() {} /* 0x800BE930 */ -void TBoxFlagManager::copyFromSave(u32 sceneIndex) { +void TBoxflagManager::copyFromSave(u32 sceneIndex) { u16 idx = sceneIndex; mSceneIndex = idx; u16 *flags = FileManager::getInstance()->getTBoxFlagsConst(); @@ -33,7 +33,7 @@ void TBoxFlagManager::copyFromSave(u32 sceneIndex) { } /* 0x800BE990 */ -bool TBoxFlagManager::checkFlag(u16 sceneIndex, u16 flag) { +bool TBoxflagManager::checkFlag(u16 sceneIndex, u16 flag) { s32 actualFlag = (flag + sceneIndex * 0x20); return mFlagHelper.checkFlag( actualFlag / 16, flag % 16, FileManager::getInstance()->getTBoxFlagsConst(), getFlagCount() @@ -41,12 +41,12 @@ bool TBoxFlagManager::checkFlag(u16 sceneIndex, u16 flag) { } /* 0x800BEA30 */ -u16 TBoxFlagManager::getFlagCount() const { +u16 TBoxflagManager::getFlagCount() const { return 0x200; } /* 0x800BEA40 */ -void TBoxFlagManager::setFlag(u16 flag) { +void TBoxflagManager::setFlag(u16 flag) { if (checkUncommittedFlag2(flag) != 1) { mFlagHelper.setFlag(flag / 16, flag % 16, mFlagSpace.getFlagPtrChecked(), mFlagSpace.mCount); setNeedsCommit(true); From cf0bbb2e10ebcda02e3aea4def234a8ece8bf2ff Mon Sep 17 00:00:00 2001 From: robojumper Date: Fri, 25 Oct 2024 15:47:13 +0200 Subject: [PATCH 9/9] Oops v2 --- config/SOUE01/symbols.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 578d7040..8ca6a50b 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -4213,7 +4213,7 @@ initFlagSpace__16StoryflagManagerFv = .text:0x800C04B0; // type:function size:0x doCommit__16EnemyflagManagerFv = .text:0x800C04C0; // type:function size:0x44 __dt__32MyFlagManager<15ItemflagManager>Fv = .text:0x800C0510; // type:function size:0x5C __dt__33MyFlagManager<16StoryflagManager>Fv = .text:0x800C0570; // type:function size:0x5C -__dt__35MyFlagManager<16EnemyflagManager>Fv = .text:0x800C05D0; // type:function size:0x40 +__dt__33MyFlagManager<16EnemyflagManager>Fv = .text:0x800C05D0; // type:function size:0x40 __dt__32MyFlagManager<15TBoxflagManager>Fv = .text:0x800C0610; // type:function size:0x40 fn_800C0650 = .text:0x800C0650; // type:function size:0x3C fn_800C0690 = .text:0x800C0690; // type:function size:0x70 @@ -31010,7 +31010,7 @@ lbl_80510B60 = .data:0x80510B60; // type:object size:0x10 lbl_80510B70 = .data:0x80510B70; // type:object size:0x18 __vt__32MyFlagManager<15ItemflagManager> = .data:0x80510B88; // type:object size:0x3C __vt__33MyFlagManager<16StoryflagManager> = .data:0x80510BC4; // type:object size:0x3C -__vt__35MyFlagManager<16EnemyflagManager> = .data:0x80510C00; // type:object size:0x14 +__vt__33MyFlagManager<16EnemyflagManager> = .data:0x80510C00; // type:object size:0x14 __vt__32MyFlagManager<15TBoxflagManager> = .data:0x80510C14; // type:object size:0x14 __vt__15ItemflagManager = .data:0x80510C28; // type:object size:0x3C __vt__16StoryflagManager = .data:0x80510C64; // type:object size:0x3C