diff --git a/asm/MetroidPrime/CGameArea.s b/asm/MetroidPrime/CGameArea.s index 1b4a9618..187f93af 100644 --- a/asm/MetroidPrime/CGameArea.s +++ b/asm/MetroidPrime/CGameArea.s @@ -3936,7 +3936,7 @@ LoadScriptObjects__9CGameAreaFR13CStateManager: /* 80060F94 0005DEF4 83 C3 00 00 */ lwz r30, 0(r3) /* 80060F98 0005DEF8 90 01 00 2C */ stw r0, 0x2c(r1) /* 80060F9C 0005DEFC 7F C3 F3 78 */ mr r3, r30 -/* 80060FA0 0005DF00 48 1D 30 15 */ bl GetAreaLayerCount__16CWorldLayerStateFi +/* 80060FA0 0005DF00 48 1D 30 15 */ bl GetAreaLayerCount__16CWorldLayerStateFRC7TAreaId /* 80060FA4 0005DF04 7C 7F 1B 78 */ mr r31, r3 /* 80060FA8 0005DF08 3B A0 00 00 */ li r29, 0 /* 80060FAC 0005DF0C 48 00 00 90 */ b lbl_8006103C @@ -3948,7 +3948,7 @@ lbl_80060FB0: /* 80060FC0 0005DF20 80 1B 00 04 */ lwz r0, 4(r27) /* 80060FC4 0005DF24 93 A1 00 30 */ stw r29, 0x30(r1) /* 80060FC8 0005DF28 90 01 00 28 */ stw r0, 0x28(r1) -/* 80060FCC 0005DF2C 48 1D 32 A5 */ bl IsLayerActive__16CWorldLayerStateFii +/* 80060FCC 0005DF2C 48 1D 32 A5 */ bl IsLayerActive__16CWorldLayerStateFRC7TAreaIdRCi /* 80060FD0 0005DF30 54 60 06 3F */ clrlwi. r0, r3, 0x18 /* 80060FD4 0005DF34 41 82 00 64 */ beq lbl_80061038 /* 80060FD8 0005DF38 7F A0 EB 78 */ mr r0, r29 @@ -6085,7 +6085,7 @@ lbl_80062DD0: /* 80062DE0 0005FD40 80 1A 00 04 */ lwz r0, 4(r26) /* 80062DE4 0005FD44 93 A1 00 08 */ stw r29, 8(r1) /* 80062DE8 0005FD48 90 01 00 10 */ stw r0, 0x10(r1) -/* 80062DEC 0005FD4C 48 1D 14 85 */ bl IsLayerActive__16CWorldLayerStateFii +/* 80062DEC 0005FD4C 48 1D 14 85 */ bl IsLayerActive__16CWorldLayerStateFRC7TAreaIdRCi /* 80062DF0 0005FD50 54 60 06 3F */ clrlwi. r0, r3, 0x18 /* 80062DF4 0005FD54 41 82 00 D8 */ beq lbl_80062ECC /* 80062DF8 0005FD58 80 1A 00 C0 */ lwz r0, 0xc0(r26) diff --git a/asm/MetroidPrime/CWorld.s b/asm/MetroidPrime/CWorld.s index f19dc63a..148b1bf3 100644 --- a/asm/MetroidPrime/CWorld.s +++ b/asm/MetroidPrime/CWorld.s @@ -4185,7 +4185,7 @@ lbl_8005942C: /* 80059448 000563A8 38 A1 00 24 */ addi r5, r1, 0x24 /* 8005944C 000563AC 38 C1 00 20 */ addi r6, r1, 0x20 /* 80059450 000563B0 80 63 00 00 */ lwz r3, 0(r3) -/* 80059454 000563B4 48 1D AB 75 */ bl "InitializeWorldLayers__16CWorldLayerStateFQ24rstl6vector" +/* 80059454 000563B4 48 1D AB 75 */ bl "InitializeWorldLayers__16CWorldLayerStateFRCQ24rstl56vector" /* 80059458 000563B8 38 61 00 20 */ addi r3, r1, 0x20 /* 8005945C 000563BC 48 00 0A 09 */ bl sub_80059e64 /* 80059460 000563C0 38 61 00 24 */ addi r3, r1, 0x24 @@ -4263,7 +4263,7 @@ sub_80059520: /* 80059550 000564B0 7C 7C 1B 78 */ mr r28, r3 /* 80059554 000564B4 7F 23 CB 78 */ mr r3, r25 /* 80059558 000564B8 7F 84 E3 78 */ mr r4, r28 -/* 8005955C 000564BC 48 00 05 59 */ bl sub_80059ab4 +/* 8005955C 000564BC 48 00 05 59 */ bl "reserve__Q24rstl56vectorFi" /* 80059560 000564C0 3B 60 00 00 */ li r27, 0 /* 80059564 000564C4 48 00 00 78 */ b lbl_800595DC lbl_80059568: @@ -4284,7 +4284,7 @@ lbl_80059568: /* 800595A0 00056500 41 82 00 08 */ beq lbl_800595A8 /* 800595A4 00056504 54 A4 08 3C */ slwi r4, r5, 1 lbl_800595A8: -/* 800595A8 00056508 48 00 05 0D */ bl sub_80059ab4 +/* 800595A8 00056508 48 00 05 0D */ bl "reserve__Q24rstl56vectorFi" lbl_800595AC: /* 800595AC 0005650C 80 19 00 04 */ lwz r0, 4(r25) /* 800595B0 00056510 80 79 00 0C */ lwz r3, 0xc(r25) @@ -4664,8 +4664,8 @@ lbl_80059AA0: /* 80059AAC 00056A0C 38 21 00 30 */ addi r1, r1, 0x30 /* 80059AB0 00056A10 4E 80 00 20 */ blr -.global sub_80059ab4 -sub_80059ab4: +.global "reserve__Q24rstl56vectorFi" +"reserve__Q24rstl56vectorFi": /* 80059AB4 00056A14 94 21 FF D0 */ stwu r1, -0x30(r1) /* 80059AB8 00056A18 7C 08 02 A6 */ mflr r0 /* 80059ABC 00056A1C 90 01 00 34 */ stw r0, 0x34(r1) diff --git a/asm/MetroidPrime/Player/CGameState.s b/asm/MetroidPrime/Player/CGameState.s index b0662c9f..8cfc3526 100644 --- a/asm/MetroidPrime/Player/CGameState.s +++ b/asm/MetroidPrime/Player/CGameState.s @@ -968,7 +968,7 @@ lbl_801D4468: /* 801D44B8 001D1418 90 07 00 04 */ stw r0, 4(r7) /* 801D44BC 001D141C 80 61 00 10 */ lwz r3, 0x10(r1) /* 801D44C0 001D1420 80 63 00 00 */ lwz r3, 0(r3) -/* 801D44C4 001D1424 48 05 FB 05 */ bl "InitializeWorldLayers__16CWorldLayerStateFQ24rstl6vector" +/* 801D44C4 001D1424 48 05 FB 05 */ bl "InitializeWorldLayers__16CWorldLayerStateFRCQ24rstl56vector" /* 801D44C8 001D1428 38 61 00 08 */ addi r3, r1, 8 /* 801D44CC 001D142C 4B E8 59 99 */ bl sub_80059e64 /* 801D44D0 001D1430 38 61 00 0C */ addi r3, r1, 0xc diff --git a/asm/MetroidPrime/Player/CWorldLayerState.s b/asm/MetroidPrime/Player/CWorldLayerState.s index bff06b78..2fa3bc0e 100644 --- a/asm/MetroidPrime/Player/CWorldLayerState.s +++ b/asm/MetroidPrime/Player/CWorldLayerState.s @@ -26,18 +26,16 @@ lbl_805A8200: nullsub_5: /* 80233FB0 00230F10 4E 80 00 20 */ blr -.global GetAreaLayerCount__16CWorldLayerStateFi -GetAreaLayerCount__16CWorldLayerStateFi: +.global GetAreaLayerCount__16CWorldLayerStateFRC7TAreaId +GetAreaLayerCount__16CWorldLayerStateFRC7TAreaId: /* 80233FB4 00230F14 80 04 00 00 */ lwz r0, 0(r4) /* 80233FB8 00230F18 80 63 00 0C */ lwz r3, 0xc(r3) /* 80233FBC 00230F1C 54 00 20 36 */ slwi r0, r0, 4 /* 80233FC0 00230F20 7C 63 00 2E */ lwzx r3, r3, r0 -.global lbl_80233FC4 -lbl_80233FC4: /* 80233FC4 00230F24 4E 80 00 20 */ blr -.global "InitializeWorldLayers__16CWorldLayerStateFQ24rstl6vector" -"InitializeWorldLayers__16CWorldLayerStateFQ24rstl6vector": +.global "InitializeWorldLayers__16CWorldLayerStateFRCQ24rstl56vector" +"InitializeWorldLayers__16CWorldLayerStateFRCQ24rstl56vector": /* 80233FC8 00230F28 94 21 FF 90 */ stwu r1, -0x70(r1) /* 80233FCC 00230F2C 7C 08 02 A6 */ mflr r0 /* 80233FD0 00230F30 90 01 00 74 */ stw r0, 0x74(r1) @@ -46,7 +44,7 @@ lbl_80233FC4: /* 80233FDC 00230F3C 80 03 00 04 */ lwz r0, 4(r3) /* 80233FE0 00230F40 2C 00 00 00 */ cmpwi r0, 0 /* 80233FE4 00230F44 40 82 01 34 */ bne lbl_80234118 -/* 80233FE8 00230F48 48 00 01 85 */ bl sub_8023416c +/* 80233FE8 00230F48 48 00 01 85 */ bl "__as__Q24rstl56vectorFRCQ24rstl56vector" /* 80233FEC 00230F4C 80 1A 00 10 */ lwz r0, 0x10(r26) /* 80233FF0 00230F50 2C 00 00 00 */ cmpwi r0, 0 /* 80233FF4 00230F54 41 82 01 24 */ beq lbl_80234118 @@ -59,7 +57,7 @@ lbl_80234008: /* 8023400C 00230F6C 7F 43 D3 78 */ mr r3, r26 /* 80234010 00230F70 38 81 00 34 */ addi r4, r1, 0x34 /* 80234014 00230F74 93 81 00 34 */ stw r28, 0x34(r1) -/* 80234018 00230F78 4B FF FF 9D */ bl GetAreaLayerCount__16CWorldLayerStateFi +/* 80234018 00230F78 4B FF FF 9D */ bl GetAreaLayerCount__16CWorldLayerStateFRC7TAreaId /* 8023401C 00230F7C 93 81 00 28 */ stw r28, 0x28(r1) /* 80234020 00230F80 7C 7F 1B 78 */ mr r31, r3 /* 80234024 00230F84 3B 60 00 01 */ li r27, 1 @@ -93,7 +91,7 @@ lbl_8023402C: /* 80234090 00230FF0 3B BD 00 01 */ addi r29, r29, 1 /* 80234094 00230FF4 93 61 00 24 */ stw r27, 0x24(r1) /* 80234098 00230FF8 93 81 00 2C */ stw r28, 0x2c(r1) -/* 8023409C 00230FFC 48 00 02 25 */ bl SetLayerActive__16CWorldLayerStateFiib +/* 8023409C 00230FFC 48 00 02 25 */ bl SetLayerActive__16CWorldLayerStateFRC7TAreaIdRCib /* 802340A0 00231000 3B 7B 00 01 */ addi r27, r27, 1 lbl_802340A4: /* 802340A4 00231004 7C 1B F8 00 */ cmpw r27, r31 @@ -109,7 +107,7 @@ lbl_802340B0: /* 802340C8 00231028 90 01 00 48 */ stw r0, 0x48(r1) /* 802340CC 0023102C 90 01 00 4C */ stw r0, 0x4c(r1) /* 802340D0 00231030 90 01 00 50 */ stw r0, 0x50(r1) -/* 802340D4 00231034 48 00 00 59 */ bl sub_8023412c +/* 802340D4 00231034 48 00 00 59 */ bl __as__10WordBitmapFRC10WordBitmap /* 802340D8 00231038 80 01 00 48 */ lwz r0, 0x48(r1) /* 802340DC 0023103C 80 61 00 50 */ lwz r3, 0x50(r1) /* 802340E0 00231040 54 00 10 3A */ slwi r0, r0, 2 @@ -135,8 +133,8 @@ lbl_80234118: /* 80234124 00231084 38 21 00 70 */ addi r1, r1, 0x70 /* 80234128 00231088 4E 80 00 20 */ blr -.global sub_8023412c -sub_8023412c: +.global __as__10WordBitmapFRC10WordBitmap +__as__10WordBitmapFRC10WordBitmap: /* 8023412C 0023108C 94 21 FF F0 */ stwu r1, -0x10(r1) /* 80234130 00231090 7C 08 02 A6 */ mflr r0 /* 80234134 00231094 90 01 00 14 */ stw r0, 0x14(r1) @@ -154,8 +152,8 @@ sub_8023412c: /* 80234164 002310C4 38 21 00 10 */ addi r1, r1, 0x10 /* 80234168 002310C8 4E 80 00 20 */ blr -.global sub_8023416c -sub_8023416c: +.global "__as__Q24rstl56vectorFRCQ24rstl56vector" +"__as__Q24rstl56vectorFRCQ24rstl56vector": /* 8023416C 002310CC 94 21 FF E0 */ stwu r1, -0x20(r1) /* 80234170 002310D0 7C 08 02 A6 */ mflr r0 /* 80234174 002310D4 90 01 00 24 */ stw r0, 0x24(r1) @@ -198,7 +196,7 @@ lbl_802341E8: /* 802341F8 00231158 48 00 00 5C */ b lbl_80234254 lbl_802341FC: /* 802341FC 0023115C 7F C3 F3 78 */ mr r3, r30 -/* 80234200 00231160 4B E2 58 B5 */ bl sub_80059ab4 +/* 80234200 00231160 4B E2 58 B5 */ bl "reserve__Q24rstl56vectorFi" /* 80234204 00231164 80 1F 00 04 */ lwz r0, 4(r31) /* 80234208 00231168 80 DF 00 0C */ lwz r6, 0xc(r31) /* 8023420C 0023116C 54 00 20 36 */ slwi r0, r0, 4 @@ -232,8 +230,8 @@ lbl_80234258: /* 80234268 002311C8 38 21 00 20 */ addi r1, r1, 0x20 /* 8023426C 002311CC 4E 80 00 20 */ blr -.global IsLayerActive__16CWorldLayerStateFii -IsLayerActive__16CWorldLayerStateFii: +.global IsLayerActive__16CWorldLayerStateFRC7TAreaIdRCi +IsLayerActive__16CWorldLayerStateFRC7TAreaIdRCi: /* 80234270 002311D0 80 E4 00 00 */ lwz r7, 0(r4) /* 80234274 002311D4 38 C0 00 01 */ li r6, 1 /* 80234278 002311D8 80 05 00 00 */ lwz r0, 0(r5) @@ -255,8 +253,8 @@ IsLayerActive__16CWorldLayerStateFii: /* 802342B8 00231218 7C 60 19 10 */ subfe r3, r0, r3 /* 802342BC 0023121C 4E 80 00 20 */ blr -.global SetLayerActive__16CWorldLayerStateFiib -SetLayerActive__16CWorldLayerStateFiib: +.global SetLayerActive__16CWorldLayerStateFRC7TAreaIdRCib +SetLayerActive__16CWorldLayerStateFRC7TAreaIdRCib: /* 802342C0 00231220 54 C0 06 3F */ clrlwi. r0, r6, 0x18 /* 802342C4 00231224 80 84 00 00 */ lwz r4, 0(r4) /* 802342C8 00231228 80 63 00 0C */ lwz r3, 0xc(r3) @@ -304,7 +302,7 @@ lbl_80234358: /* 8023435C 002312BC 7F 43 D3 78 */ mr r3, r26 /* 80234360 002312C0 38 81 00 24 */ addi r4, r1, 0x24 /* 80234364 002312C4 93 A1 00 24 */ stw r29, 0x24(r1) -/* 80234368 002312C8 4B FF FC 4D */ bl GetAreaLayerCount__16CWorldLayerStateFi +/* 80234368 002312C8 4B FF FC 4D */ bl GetAreaLayerCount__16CWorldLayerStateFRC7TAreaId /* 8023436C 002312CC 7F E3 FA 14 */ add r31, r3, r31 /* 80234370 002312D0 3B BD 00 01 */ addi r29, r29, 1 /* 80234374 002312D4 3B FF FF FF */ addi r31, r31, -1 @@ -322,7 +320,7 @@ lbl_80234398: /* 8023439C 002312FC 7F 43 D3 78 */ mr r3, r26 /* 802343A0 00231300 38 81 00 1C */ addi r4, r1, 0x1c /* 802343A4 00231304 93 A1 00 1C */ stw r29, 0x1c(r1) -/* 802343A8 00231308 4B FF FC 0D */ bl GetAreaLayerCount__16CWorldLayerStateFi +/* 802343A8 00231308 4B FF FC 0D */ bl GetAreaLayerCount__16CWorldLayerStateFRC7TAreaId /* 802343AC 0023130C 93 A1 00 10 */ stw r29, 0x10(r1) /* 802343B0 00231310 7C 7F 1B 78 */ mr r31, r3 /* 802343B4 00231314 3B 80 00 01 */ li r28, 1 @@ -334,7 +332,7 @@ lbl_802343BC: /* 802343C8 00231328 38 A1 00 0C */ addi r5, r1, 0xc /* 802343CC 0023132C 93 81 00 0C */ stw r28, 0xc(r1) /* 802343D0 00231330 93 A1 00 14 */ stw r29, 0x14(r1) -/* 802343D4 00231334 4B FF FE 9D */ bl IsLayerActive__16CWorldLayerStateFii +/* 802343D4 00231334 4B FF FE 9D */ bl IsLayerActive__16CWorldLayerStateFRC7TAreaIdRCi /* 802343D8 00231338 54 64 06 3E */ clrlwi r4, r3, 0x18 /* 802343DC 0023133C 7F 63 DB 78 */ mr r3, r27 /* 802343E0 00231340 7C 04 00 D0 */ neg r0, r4 diff --git a/asm/MetroidPrime/Player/CWorldSaveGameInfo.s b/asm/MetroidPrime/Player/CWorldSaveGameInfo.s index f4e8717a..bb0a893e 100644 --- a/asm/MetroidPrime/Player/CWorldSaveGameInfo.s +++ b/asm/MetroidPrime/Player/CWorldSaveGameInfo.s @@ -322,7 +322,7 @@ lbl_802491F8: /* 80249200 00246160 4B E1 A4 FD */ bl "clear__Q24rstl37vectorFv" /* 80249204 00246164 38 7F 00 1C */ addi r3, r31, 0x1c /* 80249208 00246168 38 9D 00 1C */ addi r4, r29, 0x1c -/* 8024920C 0024616C 4B FE AF 61 */ bl sub_8023416c +/* 8024920C 0024616C 4B FE AF 61 */ bl "__as__Q24rstl56vectorFRCQ24rstl56vector" /* 80249210 00246170 80 9D 00 38 */ lwz r4, 0x38(r29) /* 80249214 00246174 38 78 00 20 */ addi r3, r24, 0x20 /* 80249218 00246178 83 C4 00 08 */ lwz r30, 8(r4) @@ -853,7 +853,7 @@ lbl_8024991C: /* 80249950 002468B0 4B FE A6 61 */ bl nullsub_5 /* 80249954 002468B4 7C 64 1B 78 */ mr r4, r3 /* 80249958 002468B8 38 7F 00 1C */ addi r3, r31, 0x1c -/* 8024995C 002468BC 4B FE A8 11 */ bl sub_8023416c +/* 8024995C 002468BC 4B FE A8 11 */ bl "__as__Q24rstl56vectorFRCQ24rstl56vector" /* 80249960 002468C0 80 7F 00 08 */ lwz r3, 8(r31) /* 80249964 002468C4 3C 03 00 01 */ addis r0, r3, 1 /* 80249968 002468C8 28 00 FF FF */ cmplwi r0, 0xffff diff --git a/asm/MetroidPrime/ScriptObjects/CScriptSpecialFunction.s b/asm/MetroidPrime/ScriptObjects/CScriptSpecialFunction.s index 28671797..74c4c178 100644 --- a/asm/MetroidPrime/ScriptObjects/CScriptSpecialFunction.s +++ b/asm/MetroidPrime/ScriptObjects/CScriptSpecialFunction.s @@ -3668,7 +3668,7 @@ lbl_801522F0: /* 80152314 0014F274 38 A1 00 3C */ addi r5, r1, 0x3c /* 80152318 0014F278 90 E1 00 3C */ stw r7, 0x3c(r1) /* 8015231C 0014F27C 90 01 00 40 */ stw r0, 0x40(r1) -/* 80152320 0014F280 48 0E 1F A1 */ bl SetLayerActive__16CWorldLayerStateFiib +/* 80152320 0014F280 48 0E 1F A1 */ bl SetLayerActive__16CWorldLayerStateFRC7TAreaIdRCib lbl_80152324: /* 80152324 0014F284 2C 1C 00 13 */ cmpwi r28, 0x13 /* 80152328 0014F288 40 82 05 78 */ bne lbl_801528A0 diff --git a/configure.py b/configure.py index be084a7e..45b708e2 100755 --- a/configure.py +++ b/configure.py @@ -334,7 +334,7 @@ LIBS = [ "MetroidPrime/Weapons/CShockWave", "MetroidPrime/Enemies/CRipperControlledPlatform", "MetroidPrime/Enemies/CKnockBackController", - "MetroidPrime/Player/CWorldLayerState", + ["MetroidPrime/Player/CWorldLayerState", False], "MetroidPrime/Enemies/CMagdolite", "MetroidPrime/Enemies/CTeamAiMgr", "MetroidPrime/Enemies/CSnakeWeedSwarm", diff --git a/include/MetroidPrime/Player/CWorldLayerState.hpp b/include/MetroidPrime/Player/CWorldLayerState.hpp new file mode 100644 index 00000000..cf510dbb --- /dev/null +++ b/include/MetroidPrime/Player/CWorldLayerState.hpp @@ -0,0 +1,68 @@ +#ifndef _CWORLDLAYERSTATE +#define _CWORLDLAYERSTATE + +#include "MetroidPrime/TGameTypes.hpp" + +#include "rstl/vector.hpp" + +class CBitStreamReader; +class CWorldSaveGameInfo; +class CMemoryStreamOut; + +class CWorldLayers { +public: + class Area { + public: + int m_startNameIdx; + int m_layerCount; + // u64 m_layerBits; + uint m_layerBitsHi; + uint m_layerBitsLo; + }; +}; + +class WordBitmap { +public: + WordBitmap() : bitCount(0) {} + + int GetBitCount() const { return bitCount; } + + bool GetBit(int idx) const { + int wordIdx = idx / 32; + if (wordIdx >= words.size()) { + return false; + } + int wordCur = idx % 32; + return ((words[wordIdx] >> wordCur) & 0x1) != 0u; + } + + void operator=(const WordBitmap&); + + void Clear() { + words.clear(); + bitCount = 0; + } + +private: + int bitCount; + rstl::vector< uint > words; +}; + +class CWorldLayerState { +public: + CWorldLayerState(CBitStreamReader&, const CWorldSaveGameInfo&); + + void PutTo(CMemoryStreamOut&); + + void SetLayerActive(const TAreaId& areaIdx, const int& layerIdx, bool active); + bool IsLayerActive(const TAreaId& areaIdx, const int& layerIdx); + + void InitializeWorldLayers(const rstl::vector< CWorldLayers::Area >&); + int GetAreaLayerCount(const TAreaId&); + +private: + rstl::vector< CWorldLayers::Area > x0_areaLayers; + WordBitmap x10_saveLayers; +}; + +#endif // _CWORLDLAYERSTATE diff --git a/src/MetroidPrime/Player/CWorldLayerState.cpp b/src/MetroidPrime/Player/CWorldLayerState.cpp new file mode 100644 index 00000000..3367080d --- /dev/null +++ b/src/MetroidPrime/Player/CWorldLayerState.cpp @@ -0,0 +1,78 @@ +#include "MetroidPrime/Player/CWorldLayerState.hpp" + +#include "Kyoto/Streams/CMemoryStreamOut.hpp" + +CWorldLayerState::CWorldLayerState(CBitStreamReader&, const CWorldSaveGameInfo&) {} + +void CWorldLayerState::PutTo(CMemoryStreamOut& out) { + u32 totalLayerCount = 0; + for (int i = 0; i < x0_areaLayers.size(); ++i) { + TAreaId areaId(i); + totalLayerCount += GetAreaLayerCount(areaId) - 1; + } + + out.WriteBits(totalLayerCount, 10); + + for (int i = 0; i < x0_areaLayers.size(); ++i) { + TAreaId areaId(i); + int count = GetAreaLayerCount(areaId); + for (int l = 1; l < count; ++l) { + out.WriteBits(static_cast(IsLayerActive(areaId, l)), 1); + } + } +} + +void CWorldLayerState::SetLayerActive(const TAreaId& areaIdx, const int& layerIdx, bool active) { + CWorldLayers::Area& area = x0_areaLayers[areaIdx.Value()]; + int layerId = layerIdx; + if (active) { + u32 flag = 1 << layerId; + // area.m_layerBits = area.m_layerBits | flag; + area.m_layerBitsLo = area.m_layerBitsLo | flag; + area.m_layerBitsHi = area.m_layerBitsHi | (flag >> 0x1f); + } else { + u32 flag = ~(1 << layerId); + // area.m_layerBits = area.m_layerBits & flag; + area.m_layerBitsLo = area.m_layerBitsLo & flag; + area.m_layerBitsHi = area.m_layerBitsHi & (flag >> 0x1f); + } +} + +bool CWorldLayerState::IsLayerActive(const TAreaId& areaIdx, const int& layerIdx) { + const uint* layerBits = &x0_areaLayers[areaIdx.Value()].m_layerBitsHi; + u32 flag = 1 << layerIdx; + return ((layerBits[1] & flag) | (layerBits[0] >> 0x1f)) != 0; +} + +void WordBitmap::operator=(const WordBitmap& other) { + bitCount = other.bitCount; + words = other.words; +} + +void CWorldLayerState::InitializeWorldLayers(const rstl::vector< CWorldLayers::Area >& layers) { + if (!x0_areaLayers.empty()) { + return; + } + + x0_areaLayers = layers; + if (x10_saveLayers.GetBitCount() == 0) { + return; + } + + uint a = 0; + uint b = 0; + for (int i = 0; i < x0_areaLayers.size(); ++i) { + TAreaId areaId(i); + int layerCount = GetAreaLayerCount(areaId); + for (uint l = 1; l < layerCount; ++l) { + SetLayerActive(areaId, l, x10_saveLayers.GetBit(b++)); + } + ++a; + } + + x10_saveLayers = WordBitmap(); +} + +int CWorldLayerState::GetAreaLayerCount(const TAreaId& areaId) { + return x0_areaLayers[areaId.Value()].m_startNameIdx; +}