make member check and size check less confusing

This commit is contained in:
altalk23 2023-12-20 18:36:54 +03:00
parent 3aa3ae7dce
commit 7c0d7ba57a
4 changed files with 171 additions and 152 deletions

View file

@ -4,36 +4,38 @@
// Add known android struct members here
GEODE_SIZE_CHECK(CCObject, 0x34);
// needed classes are ones in the ids folder and some generic ones (i think they are already done though so only ids)
GEODE_MEMBER_CHECK(GameManager, m_playLayer, 0x138);
GEODE_MEMBER_CHECK(GameManager, m_levelEditorLayer, 0x13c);
GEODE_MEMBER_CHECK(GameManager, m_canGetLevelSaveData, 0x28c);
// GEODE_MEMBER_CHECK(GameManager, m_playLayer, 0x138);
// GEODE_MEMBER_CHECK(GameManager, m_levelEditorLayer, 0x13c);
// GEODE_MEMBER_CHECK(GameManager, m_canGetLevelSaveData, 0x28c);
static_assert(sizeof(GJBaseGameLayer) == 0x2cc);
// static_assert(sizeof(GJBaseGameLayer) == 0x2cc);
GEODE_MEMBER_CHECK(PlayLayer, unknown4e8, 0x2e8);
GEODE_MEMBER_CHECK(PlayLayer, m_endPortal, 0x324);
GEODE_MEMBER_CHECK(PlayLayer, m_bottomGround, 0x37c);
GEODE_MEMBER_CHECK(PlayLayer, m_topGround, 0x380);
GEODE_MEMBER_CHECK(PlayLayer, m_level, 0x470);
GEODE_MEMBER_CHECK(PlayLayer, m_shouldTryToKick, 0x4e0);
// GEODE_MEMBER_CHECK(PlayLayer, unknown4e8, 0x2e8);
// GEODE_MEMBER_CHECK(PlayLayer, m_endPortal, 0x324);
// GEODE_MEMBER_CHECK(PlayLayer, m_bottomGround, 0x37c);
// GEODE_MEMBER_CHECK(PlayLayer, m_topGround, 0x380);
// GEODE_MEMBER_CHECK(PlayLayer, m_level, 0x470);
// GEODE_MEMBER_CHECK(PlayLayer, m_shouldTryToKick, 0x4e0);
static_assert(sizeof(GameObject) == 0x42c);
// static_assert(sizeof(GameObject) == 0x42c);
GEODE_MEMBER_CHECK(GameStatsManager, m_dailyChests, 0x110);
GEODE_MEMBER_CHECK(GameStatsManager, m_completedLevels, 0x164);
// GEODE_MEMBER_CHECK(GameStatsManager, m_dailyChests, 0x110);
// GEODE_MEMBER_CHECK(GameStatsManager, m_completedLevels, 0x164);
GEODE_MEMBER_CHECK(DailyLevelPage, m_weekly, 0x1ed);
// GEODE_MEMBER_CHECK(DailyLevelPage, m_weekly, 0x1ed);
GEODE_MEMBER_CHECK(TeleportPortalObject, m_orangePortal, 0x430);
// GEODE_MEMBER_CHECK(TeleportPortalObject, m_orangePortal, 0x430);
GEODE_MEMBER_CHECK(EditorUI, m_rotationControl, 0x16c);
GEODE_MEMBER_CHECK(EditorUI, m_updateTimeMarkers, 0x1a4);
GEODE_MEMBER_CHECK(EditorUI, m_selectedObjects, 0x1bc);
GEODE_MEMBER_CHECK(EditorUI, m_selectedObject, 0x2c4);
// GEODE_MEMBER_CHECK(EditorUI, m_rotationControl, 0x16c);
// GEODE_MEMBER_CHECK(EditorUI, m_updateTimeMarkers, 0x1a4);
// GEODE_MEMBER_CHECK(EditorUI, m_selectedObjects, 0x1bc);
// GEODE_MEMBER_CHECK(EditorUI, m_selectedObject, 0x2c4);
GEODE_MEMBER_CHECK(MoreSearchLayer, m_enterSongID, 0x1E4);
GEODE_MEMBER_CHECK(MoreSearchLayer, m_songLeftBtn, 0x1D4);
// GEODE_MEMBER_CHECK(MoreSearchLayer, m_enterSongID, 0x1E4);
// GEODE_MEMBER_CHECK(MoreSearchLayer, m_songLeftBtn, 0x1D4);
#endif

View file

@ -6,19 +6,36 @@ struct False {
static constexpr auto value = false;
};
template<int Difference, class Class, class Member, bool Predicate>
template<int Difference, int Expected, int Current, class Class, class Member, bool Predicate>
struct MemberIsOffsetBy {
static_assert(False<Difference>::value, "Member is offset by this value");
static_assert(False<Difference, Expected, Current>::value, "Member is offset by this value (Difference, Expected, Current)");
};
template<int Difference, class Class, class Member>
template<int Difference, int Expected, int Current, class Class, bool Predicate>
struct SizeIsOffsetBy {
static_assert(False<Difference, Expected, Current>::value, "Size is offset by this value (Difference, Expected, Current)");
};
template<int Difference, int Expected, int Current, class Class, class Member>
struct MemberIsOffsetBy<Difference, Class, Member, true> {
};
template <class Member, class Class, int Offset, int Expected>
struct SingleChecker {
using IsOffsetBy = MemberIsOffsetBy<Offset - Expected, Class, Member, Expected == Offset>;
template<int Difference, int Expected, int Current, class Class>
struct SizeIsOffsetBy<Difference, Class, true> {
};
#define GEODE_MEMBER_CHECK(Class_, Member_, Offset_) class Member_; SingleChecker<Member_, Class_, offsetof(Class_, Member_), Offset_>::IsOffsetBy GEODE_CONCAT(OffsetBy, __LINE__)
template <class Member, class Class, int Offset, int Expected>
struct SingleMemberChecker {
using IsOffsetBy = MemberIsOffsetBy<Offset - Expected, Expected, Offset, Class, Member, Expected == Offset>;
};
template <class Class, int Offset, int Expected>
struct SingleSizeChecker {
using IsOffsetBy = MemberIsOffsetBy<Offset - Expected, Expected, Offset, Class, Member, Expected == Offset>;
};
#define GEODE_MEMBER_CHECK(Class_, Member_, Offset_) class Member_; SingleMemberChecker<Member_, Class_, offsetof(Class_, Member_), Offset_>::IsOffsetBy GEODE_CONCAT(OffsetBy, __LINE__)
#define GEODE_SIZE_CHECK(Class_, Offset_) class Class_; SingleMemberChecker<Class_, sizeof(Class_), Offset_>::IsOffsetBy GEODE_CONCAT(OffsetBy, __LINE__)

View file

@ -2,97 +2,97 @@
#ifdef GEODE_IS_MACOS
// PlayerObject
GEODE_MEMBER_CHECK(PlayerObject, m_collisionLog, 0x518);
GEODE_MEMBER_CHECK(PlayerObject, m_particleSystems, 0x590);
GEODE_MEMBER_CHECK(PlayerObject, m_waveTrail, 0x600);
GEODE_MEMBER_CHECK(PlayerObject, m_objectSnappedTo, 0x690);
GEODE_MEMBER_CHECK(PlayerObject, m_playerColor1, 0x7c2);
// // PlayerObject
// GEODE_MEMBER_CHECK(PlayerObject, m_collisionLog, 0x518);
// GEODE_MEMBER_CHECK(PlayerObject, m_particleSystems, 0x590);
// GEODE_MEMBER_CHECK(PlayerObject, m_waveTrail, 0x600);
// GEODE_MEMBER_CHECK(PlayerObject, m_objectSnappedTo, 0x690);
// GEODE_MEMBER_CHECK(PlayerObject, m_playerColor1, 0x7c2);
// EditorUI
GEODE_MEMBER_CHECK(EditorUI, m_buttonBar, 0x1a0);
GEODE_MEMBER_CHECK(EditorUI, m_scaleControl, 0x208);
GEODE_MEMBER_CHECK(EditorUI, m_swipeEnabled, 0x23c);
GEODE_MEMBER_CHECK(EditorUI, m_updateTimeMarkers, 0x244);
GEODE_MEMBER_CHECK(EditorUI, m_selectedObjects, 0x260);
GEODE_MEMBER_CHECK(EditorUI, m_selectedObject, 0x440);
// // EditorUI
// GEODE_MEMBER_CHECK(EditorUI, m_buttonBar, 0x1a0);
// GEODE_MEMBER_CHECK(EditorUI, m_scaleControl, 0x208);
// GEODE_MEMBER_CHECK(EditorUI, m_swipeEnabled, 0x23c);
// GEODE_MEMBER_CHECK(EditorUI, m_updateTimeMarkers, 0x244);
// GEODE_MEMBER_CHECK(EditorUI, m_selectedObjects, 0x260);
// GEODE_MEMBER_CHECK(EditorUI, m_selectedObject, 0x440);
// LevelEditorLayer
GEODE_MEMBER_CHECK(LevelEditorLayer, m_editorUI, 0x5d8);
GEODE_MEMBER_CHECK(LevelEditorLayer, m_level, 0x618);
// // LevelEditorLayer
// GEODE_MEMBER_CHECK(LevelEditorLayer, m_editorUI, 0x5d8);
// GEODE_MEMBER_CHECK(LevelEditorLayer, m_level, 0x618);
// PlayLayer
GEODE_MEMBER_CHECK(PlayLayer, unknown518, 0x518);
GEODE_MEMBER_CHECK(PlayLayer, unknown5f4, 0x5f4);
GEODE_MEMBER_CHECK(PlayLayer, unknown680, 0x680);
GEODE_MEMBER_CHECK(PlayLayer, m_replayInputs, 0x6a8);
GEODE_MEMBER_CHECK(PlayLayer, m_level, 0x728);
GEODE_MEMBER_CHECK(PlayLayer, m_shouldTryToKick, 0x7a8);
// // PlayLayer
// GEODE_MEMBER_CHECK(PlayLayer, unknown518, 0x518);
// GEODE_MEMBER_CHECK(PlayLayer, unknown5f4, 0x5f4);
// GEODE_MEMBER_CHECK(PlayLayer, unknown680, 0x680);
// GEODE_MEMBER_CHECK(PlayLayer, m_replayInputs, 0x6a8);
// GEODE_MEMBER_CHECK(PlayLayer, m_level, 0x728);
// GEODE_MEMBER_CHECK(PlayLayer, m_shouldTryToKick, 0x7a8);
// GameManager
GEODE_MEMBER_CHECK(GameManager, m_playLayer, 0x180);
GEODE_MEMBER_CHECK(GameManager, m_levelEditorLayer, 0x188);
GEODE_MEMBER_CHECK(GameManager, m_menuLayer, 0x198);
GEODE_MEMBER_CHECK(GameManager, m_playerUDID, 0x1b8);
GEODE_MEMBER_CHECK(GameManager, m_playerUserID, 0x1cc);
GEODE_MEMBER_CHECK(GameManager, m_playerFrame, 0x200);
GEODE_MEMBER_CHECK(GameManager, m_clickedGarage, 0x2a2); // todo: find why this is not 0x2a2
// // GameManager
// GEODE_MEMBER_CHECK(GameManager, m_playLayer, 0x180);
// GEODE_MEMBER_CHECK(GameManager, m_levelEditorLayer, 0x188);
// GEODE_MEMBER_CHECK(GameManager, m_menuLayer, 0x198);
// GEODE_MEMBER_CHECK(GameManager, m_playerUDID, 0x1b8);
// GEODE_MEMBER_CHECK(GameManager, m_playerUserID, 0x1cc);
// GEODE_MEMBER_CHECK(GameManager, m_playerFrame, 0x200);
// GEODE_MEMBER_CHECK(GameManager, m_clickedGarage, 0x2a2); // todo: find why this is not 0x2a2
// GameObject
GEODE_MEMBER_CHECK(GameObject, m_baseColorID, 0x27c);
GEODE_MEMBER_CHECK(GameObject, m_detailColorID, 0x280);
GEODE_MEMBER_CHECK(GameObject, m_active, 0x2e5);
GEODE_MEMBER_CHECK(GameObject, m_baseSprite, 0x348);
GEODE_MEMBER_CHECK(GameObject, m_startPosition, 0x37c);
GEODE_MEMBER_CHECK(GameObject, m_baseColor, 0x410);
GEODE_MEMBER_CHECK(GameObject, m_groups, 0x458);
GEODE_MEMBER_CHECK(GameObject, m_effectManager, 0x4d8);
// // GameObject
// GEODE_MEMBER_CHECK(GameObject, m_baseColorID, 0x27c);
// GEODE_MEMBER_CHECK(GameObject, m_detailColorID, 0x280);
// GEODE_MEMBER_CHECK(GameObject, m_active, 0x2e5);
// GEODE_MEMBER_CHECK(GameObject, m_baseSprite, 0x348);
// GEODE_MEMBER_CHECK(GameObject, m_startPosition, 0x37c);
// GEODE_MEMBER_CHECK(GameObject, m_baseColor, 0x410);
// GEODE_MEMBER_CHECK(GameObject, m_groups, 0x458);
// GEODE_MEMBER_CHECK(GameObject, m_effectManager, 0x4d8);
// EffectGameObject
GEODE_MEMBER_CHECK(EffectGameObject, m_duration, 0x4f0);
GEODE_MEMBER_CHECK(EffectGameObject, m_followMod, 0x530);
GEODE_MEMBER_CHECK(EffectGameObject, m_hsvValue, 0x560);
GEODE_MEMBER_CHECK(EffectGameObject, m_spawnDelay, 0x588);
GEODE_MEMBER_CHECK(EffectGameObject, m_itemBlockAID, 0x5b0);
// // EffectGameObject
// GEODE_MEMBER_CHECK(EffectGameObject, m_duration, 0x4f0);
// GEODE_MEMBER_CHECK(EffectGameObject, m_followMod, 0x530);
// GEODE_MEMBER_CHECK(EffectGameObject, m_hsvValue, 0x560);
// GEODE_MEMBER_CHECK(EffectGameObject, m_spawnDelay, 0x588);
// GEODE_MEMBER_CHECK(EffectGameObject, m_itemBlockAID, 0x5b0);
// TeleportPortalObject
GEODE_MEMBER_CHECK(TeleportPortalObject, m_orangePortal, 0x4f8);
// // TeleportPortalObject
// GEODE_MEMBER_CHECK(TeleportPortalObject, m_orangePortal, 0x4f8);
// StartPosObject
GEODE_MEMBER_CHECK(StartPosObject, m_levelSettings, 0x5e0);
// // StartPosObject
// GEODE_MEMBER_CHECK(StartPosObject, m_levelSettings, 0x5e0);
// SetupPulsePopup
GEODE_MEMBER_CHECK(SetupPulsePopup, m_currentColorSpr, 0x2d0);
GEODE_MEMBER_CHECK(SetupPulsePopup, m_pulseMode, 0x38c);
// // SetupPulsePopup
// GEODE_MEMBER_CHECK(SetupPulsePopup, m_currentColorSpr, 0x2d0);
// GEODE_MEMBER_CHECK(SetupPulsePopup, m_pulseMode, 0x38c);
// ColorSelectPopup
GEODE_MEMBER_CHECK(ColorSelectPopup, m_copyColor, 0x372);
// // ColorSelectPopup
// GEODE_MEMBER_CHECK(ColorSelectPopup, m_copyColor, 0x372);
// LevelInfoLayer
GEODE_MEMBER_CHECK(LevelInfoLayer, m_level, 0x1c0);
// // LevelInfoLayer
// GEODE_MEMBER_CHECK(LevelInfoLayer, m_level, 0x1c0);
// LevelBrowserLayer
GEODE_MEMBER_CHECK(LevelBrowserLayer, m_rightArrow, 0x1a8);
GEODE_MEMBER_CHECK(LevelBrowserLayer, m_leftArrow, 0x1b0);
GEODE_MEMBER_CHECK(LevelBrowserLayer, m_searchObject, 0x1d8);
GEODE_MEMBER_CHECK(LevelBrowserLayer, m_itemCount, 0x208);
// // LevelBrowserLayer
// GEODE_MEMBER_CHECK(LevelBrowserLayer, m_rightArrow, 0x1a8);
// GEODE_MEMBER_CHECK(LevelBrowserLayer, m_leftArrow, 0x1b0);
// GEODE_MEMBER_CHECK(LevelBrowserLayer, m_searchObject, 0x1d8);
// GEODE_MEMBER_CHECK(LevelBrowserLayer, m_itemCount, 0x208);
// LocalLevelManager
GEODE_MEMBER_CHECK(LocalLevelManager, m_localLevels, 0x140);
// // LocalLevelManager
// GEODE_MEMBER_CHECK(LocalLevelManager, m_localLevels, 0x140);
// GameStatsManager
GEODE_MEMBER_CHECK(GameStatsManager, m_dailyChests, 0x170);
GEODE_MEMBER_CHECK(GameStatsManager, m_completedLevels, 0x200);
GEODE_MEMBER_CHECK(GameStatsManager, m_weeklyChest, 0x278);
// // GameStatsManager
// GEODE_MEMBER_CHECK(GameStatsManager, m_dailyChests, 0x170);
// GEODE_MEMBER_CHECK(GameStatsManager, m_completedLevels, 0x200);
// GEODE_MEMBER_CHECK(GameStatsManager, m_weeklyChest, 0x278);
// DailyLevelPage
GEODE_MEMBER_CHECK(DailyLevelPage, m_weekly, 0x291);
// // DailyLevelPage
// GEODE_MEMBER_CHECK(DailyLevelPage, m_weekly, 0x291);
// GameLevelManager
GEODE_MEMBER_CHECK(GameLevelManager, m_weeklyID, 0x1a8);
GEODE_MEMBER_CHECK(GameLevelManager, m_gauntletLevels, 0x1b0);
GEODE_MEMBER_CHECK(GameLevelManager, m_timerDict, 0x1e8);
GEODE_MEMBER_CHECK(GameLevelManager, m_accountIDtoUserIDDict, 0x1f8);
GEODE_MEMBER_CHECK(GameLevelManager, m_userIDtoAccountIDDict, 0x200);
// // GameLevelManager
// GEODE_MEMBER_CHECK(GameLevelManager, m_weeklyID, 0x1a8);
// GEODE_MEMBER_CHECK(GameLevelManager, m_gauntletLevels, 0x1b0);
// GEODE_MEMBER_CHECK(GameLevelManager, m_timerDict, 0x1e8);
// GEODE_MEMBER_CHECK(GameLevelManager, m_accountIDtoUserIDDict, 0x1f8);
// GEODE_MEMBER_CHECK(GameLevelManager, m_userIDtoAccountIDDict, 0x200);
#endif

View file

@ -2,64 +2,64 @@
#ifdef GEODE_IS_WINDOWS
GEODE_MEMBER_CHECK(cocos2d::CCApplication, m_fVsyncInterval, 0x8c);
GEODE_MEMBER_CHECK(AppDelegate, m_runningScene, 0xa0);
// GEODE_MEMBER_CHECK(cocos2d::CCApplication, m_fVsyncInterval, 0x8c);
// GEODE_MEMBER_CHECK(AppDelegate, m_runningScene, 0xa0);
GEODE_MEMBER_CHECK(GameObject, m_effectPlistName, 0x278);
GEODE_MEMBER_CHECK(GameObject, m_effectManager, 0x454);
GEODE_MEMBER_CHECK(GameObject, m_firstPosition, 0x424);
// GEODE_MEMBER_CHECK(GameObject, m_effectPlistName, 0x278);
// GEODE_MEMBER_CHECK(GameObject, m_effectManager, 0x454);
// GEODE_MEMBER_CHECK(GameObject, m_firstPosition, 0x424);
GEODE_MEMBER_CHECK(PlayerObject, m_unk484, 0x484);
GEODE_MEMBER_CHECK(PlayerObject, m_ghostTrail, 0x4E4);
GEODE_MEMBER_CHECK(PlayerObject, m_waveTrail, 0x514);
GEODE_MEMBER_CHECK(PlayerObject, m_isDart, 0x63b);
GEODE_MEMBER_CHECK(PlayerObject, m_isDashing, 0x641);
// GEODE_MEMBER_CHECK(PlayerObject, m_unk484, 0x484);
// GEODE_MEMBER_CHECK(PlayerObject, m_ghostTrail, 0x4E4);
// GEODE_MEMBER_CHECK(PlayerObject, m_waveTrail, 0x514);
// GEODE_MEMBER_CHECK(PlayerObject, m_isDart, 0x63b);
// GEODE_MEMBER_CHECK(PlayerObject, m_isDashing, 0x641);
GEODE_MEMBER_CHECK(EditorUI, m_buttonBar, 0x134);
GEODE_MEMBER_CHECK(EditorUI, m_hideableUIElementArray, 0x13c);
GEODE_MEMBER_CHECK(EditorUI, m_gridSize, 0x140);
GEODE_MEMBER_CHECK(EditorUI, m_objectInfoLabel, 0x168);
GEODE_MEMBER_CHECK(EditorUI, m_scaleControl, 0x17c);
GEODE_MEMBER_CHECK(EditorUI, m_selectedObject, 0x2c4);
// GEODE_MEMBER_CHECK(EditorUI, m_buttonBar, 0x134);
// GEODE_MEMBER_CHECK(EditorUI, m_hideableUIElementArray, 0x13c);
// GEODE_MEMBER_CHECK(EditorUI, m_gridSize, 0x140);
// GEODE_MEMBER_CHECK(EditorUI, m_objectInfoLabel, 0x168);
// GEODE_MEMBER_CHECK(EditorUI, m_scaleControl, 0x17c);
// GEODE_MEMBER_CHECK(EditorUI, m_selectedObject, 0x2c4);
GEODE_MEMBER_CHECK(LevelEditorLayer, m_editorUI, 0x380);
GEODE_MEMBER_CHECK(LevelEditorLayer, m_level, 0x3a8);
// GEODE_MEMBER_CHECK(LevelEditorLayer, m_editorUI, 0x380);
// GEODE_MEMBER_CHECK(LevelEditorLayer, m_level, 0x3a8);
GEODE_MEMBER_CHECK(GameManager, m_valueKeeper, 0x110);
GEODE_MEMBER_CHECK(GameManager, m_loaded, 0x148);
GEODE_MEMBER_CHECK(GameManager, m_playLayer, 0x164);
GEODE_MEMBER_CHECK(GameManager, m_levelEditorLayer, 0x168);
GEODE_MEMBER_CHECK(GameManager, m_playerUDID, 0x180);
GEODE_MEMBER_CHECK(GameManager, m_backgroundMusicVolume, 0x1c0);
GEODE_MEMBER_CHECK(GameManager, m_sceneEnum, 0x1dc);
GEODE_MEMBER_CHECK(GameManager, m_ratePower, 0x2d0);
// GEODE_MEMBER_CHECK(GameManager, m_valueKeeper, 0x110);
// GEODE_MEMBER_CHECK(GameManager, m_loaded, 0x148);
// GEODE_MEMBER_CHECK(GameManager, m_playLayer, 0x164);
// GEODE_MEMBER_CHECK(GameManager, m_levelEditorLayer, 0x168);
// GEODE_MEMBER_CHECK(GameManager, m_playerUDID, 0x180);
// GEODE_MEMBER_CHECK(GameManager, m_backgroundMusicVolume, 0x1c0);
// GEODE_MEMBER_CHECK(GameManager, m_sceneEnum, 0x1dc);
// GEODE_MEMBER_CHECK(GameManager, m_ratePower, 0x2d0);
GEODE_MEMBER_CHECK(PlayLayer, m_startPos, 0x32c);
GEODE_MEMBER_CHECK(PlayLayer, m_screenRingObjects, 0x36c);
GEODE_MEMBER_CHECK(PlayLayer, m_bottomGround, 0x38c);
GEODE_MEMBER_CHECK(PlayLayer, m_topGround, 0x390);
GEODE_MEMBER_CHECK(PlayLayer, m_isDead, 0x39c);
GEODE_MEMBER_CHECK(PlayLayer, m_levelLength, 0x3b4);
GEODE_MEMBER_CHECK(PlayLayer, m_attemptLabel, 0x3bc);
GEODE_MEMBER_CHECK(PlayLayer, m_sliderGrooveSprite, 0x404);
GEODE_MEMBER_CHECK(PlayLayer, m_gravitySprites, 0x424);
GEODE_MEMBER_CHECK(PlayLayer, m_level, 0x488);
GEODE_MEMBER_CHECK(PlayLayer, m_isTestMode, 0x494);
GEODE_MEMBER_CHECK(PlayLayer, m_antiCheatObject, 0x530);
GEODE_MEMBER_CHECK(PlayLayer, m_disableGravityEffect, 0x536);
// GEODE_MEMBER_CHECK(PlayLayer, m_startPos, 0x32c);
// GEODE_MEMBER_CHECK(PlayLayer, m_screenRingObjects, 0x36c);
// GEODE_MEMBER_CHECK(PlayLayer, m_bottomGround, 0x38c);
// GEODE_MEMBER_CHECK(PlayLayer, m_topGround, 0x390);
// GEODE_MEMBER_CHECK(PlayLayer, m_isDead, 0x39c);
// GEODE_MEMBER_CHECK(PlayLayer, m_levelLength, 0x3b4);
// GEODE_MEMBER_CHECK(PlayLayer, m_attemptLabel, 0x3bc);
// GEODE_MEMBER_CHECK(PlayLayer, m_sliderGrooveSprite, 0x404);
// GEODE_MEMBER_CHECK(PlayLayer, m_gravitySprites, 0x424);
// GEODE_MEMBER_CHECK(PlayLayer, m_level, 0x488);
// GEODE_MEMBER_CHECK(PlayLayer, m_isTestMode, 0x494);
// GEODE_MEMBER_CHECK(PlayLayer, m_antiCheatObject, 0x530);
// GEODE_MEMBER_CHECK(PlayLayer, m_disableGravityEffect, 0x536);
GEODE_MEMBER_CHECK(GJBaseGameLayer, m_boundingBox, 0x120);
GEODE_MEMBER_CHECK(GJBaseGameLayer, m_player1, 0x224);
GEODE_MEMBER_CHECK(GJBaseGameLayer, m_groups, 0x274);
GEODE_MEMBER_CHECK(GJBaseGameLayer, m_attemptClickCount, 0x2b4);
static_assert(sizeof(GJBaseGameLayer) == 0x2cc);
// GEODE_MEMBER_CHECK(GJBaseGameLayer, m_boundingBox, 0x120);
// GEODE_MEMBER_CHECK(GJBaseGameLayer, m_player1, 0x224);
// GEODE_MEMBER_CHECK(GJBaseGameLayer, m_groups, 0x274);
// GEODE_MEMBER_CHECK(GJBaseGameLayer, m_attemptClickCount, 0x2b4);
// static_assert(sizeof(GJBaseGameLayer) == 0x2cc);
GEODE_MEMBER_CHECK(AudioEffectsLayer, m_unk19C, 0x19c);
// GEODE_MEMBER_CHECK(AudioEffectsLayer, m_unk19C, 0x19c);
GEODE_MEMBER_CHECK(GameStatsManager, m_dailyChests, 0x114);
GEODE_MEMBER_CHECK(GameStatsManager, m_completedLevels, 0x144);
// GEODE_MEMBER_CHECK(GameStatsManager, m_dailyChests, 0x114);
// GEODE_MEMBER_CHECK(GameStatsManager, m_completedLevels, 0x144);
GEODE_MEMBER_CHECK(DailyLevelPage, m_weekly, 0x1ed);
// GEODE_MEMBER_CHECK(DailyLevelPage, m_weekly, 0x1ed);
#endif