diff --git a/bindings/GeometryDash.bro b/bindings/GeometryDash.bro index 4b49ce04..4df1cdff 100644 --- a/bindings/GeometryDash.bro +++ b/bindings/GeometryDash.bro @@ -1829,15 +1829,9 @@ class GJChallengeDelegate {} class GJChallengeItem : cocos2d::CCObject { GJChallengeType m_challengeType; - int m_countSeed; - int m_countRand; - int m_count; - int m_rewardSeed; - int m_rewardRand; - int m_reward; - int m_goalSeed; - int m_goalRand; - int m_goal; + geode::SeedValueSRV m_count; + geode::SeedValueSRV m_reward; + geode::SeedValueSRV m_goal; int m_timeLeft; bool m_canClaim; int m_position; @@ -2128,9 +2122,7 @@ class GJGameLevel : cocos2d::CCNode { } cocos2d::CCDictionary* m_lastBuildSave; - int m_levelIDRand; - int m_levelIDSeed; - int m_levelID; + geode::SeedValueRSV m_levelID; gd::string m_levelName; gd::string m_levelDesc; gd::string m_levelString; @@ -2138,20 +2130,14 @@ class GJGameLevel : cocos2d::CCNode { gd::string m_recordString; gd::string m_uploadDate; gd::string m_updateDate; - int m_userIDRand; - int m_userIDSeed; - int m_userID; - int m_accountIDRand; - int m_accountIDSeed; - int m_accountID; + geode::SeedValueRSV m_userID; + geode::SeedValueRSV m_accountID; GJDifficulty m_difficulty; int m_audioTrack; int m_songID; int m_levelRev; bool m_unlisted; - int m_objectCountRand; - int m_objectCountSeed; - int m_objectCount; + geode::SeedValueRSV m_objectCount; int m_levelIndex; int m_ratings; int m_ratingsSum; @@ -2170,30 +2156,16 @@ class GJGameLevel : cocos2d::CCNode { bool m_hasBeenModified; int m_levelVersion; int m_gameVersion; - int m_attemptsRand; - int m_attemptsSeed; - int m_attempts; - int m_jumpsRand; - int m_jumpsSeed; - int m_jumps; - int m_clicksRand; - int m_clicksSeed; - int m_clicks; - int m_attemptTimeRand; - int m_attemptTimeSeed; - int m_attemptTime; + geode::SeedValueRSV m_attempts; + geode::SeedValueRSV m_jumps; + geode::SeedValueRSV m_clicks; + geode::SeedValueRSV m_attemptTime; int m_chk; bool m_isChkValid; bool m_isCompletionLegitimate; - int m_normalPercent; - int m_normalPercentSeed; - int m_normalPercentRand; - int m_orbCompletionRand; - int m_orbCompletionSeed; - int m_orbCompletion; - int m_newNormalPercent2Rand; - int m_newNormalPercent2Seed; - int m_newNormalPercent2; + geode::SeedValueVSR m_normalPercent; + geode::SeedValueRSV m_orbCompletion; + geode::SeedValueRSV m_newNormalPercent2; int m_practicePercent; int m_likes; int m_dislikes; @@ -2202,37 +2174,21 @@ class GJGameLevel : cocos2d::CCNode { bool m_isEpic; bool m_levelFavorited; int m_levelFolder; - int m_dailyIDRand; - int m_dailyIDSeed; - int m_dailyID; - int m_demonRand; - int m_demonSeed; - int m_demon; + geode::SeedValueRSV m_dailyID; + geode::SeedValueRSV m_demon; int m_demonDifficulty; - int m_starsRand; - int m_starsSeed; - int m_stars; + geode::SeedValueRSV m_stars; bool m_autoLevel; int m_coins; - int m_coinsVerifiedRand; - int m_coinsVerifiedSeed; - int m_coinsVerified; + geode::SeedValueRSV m_coinsVerified; int m_passwordRand; int m_passwordSeed; - int m_originalLevelRand; - int m_originalLevelSeed; - int m_originalLevel; + geode::SeedValueRSV m_originalLevel; bool m_twoPlayerMode; int m_failedPasswordAttempts; - int m_firstCoinVerifiedRand; - int m_firstCoinVerifiedSeed; - int m_firstCoinVerified; - int m_secondCoinVerifiedRand; - int m_secondCoinVerifiedSeed; - int m_secondCoinVerified; - int m_thirdCoinVerifiedRand; - int m_thirdCoinVerifiedSeed; - int m_thirdCoinVerified; + geode::SeedValueRSV m_firstCoinVerified; + geode::SeedValueRSV m_secondCoinVerified; + geode::SeedValueRSV m_thirdCoinVerified; int m_starsRequested; bool m_showedSongWarning; int m_starRatings; @@ -2755,47 +2711,36 @@ class GameManager : GManager { } void setPlayerFrame(int id) { m_playerFrame = id; - m_playerFrameRand1 = id + m_playerFrameRand2; } void setPlayerShip(int id) { m_playerShip = id; - m_playerShipRand1 = id + m_playerShipRand2; } void setPlayerBall(int id) { m_playerBall = id; - m_playerBallRand1 = id + m_playerBallRand2; } void setPlayerBird(int id) { m_playerBird = id; - m_playerBirdRand1 = id + m_playerBirdRand2; } void setPlayerDart(int id) { m_playerDart = id; - m_playerDartRand1 = id + m_playerDartRand2; } void setPlayerRobot(int id) { m_playerRobot = id; - m_playerRobotRand1 = id + m_playerRobotRand2; } void setPlayerSpider(int id) { m_playerSpider = id; - m_playerSpiderRand1 = id + m_playerSpiderRand2; } void setPlayerStreak(int id) { m_playerStreak = id; - m_playerStreakRand1 = id + m_playerStreakRand2; } void setPlayerDeathEffect(int id) { m_playerDeathEffect = id; - m_playerDeathEffectRand1 = id + m_playerDeathEffectRand2; } void setPlayerColor(int id) { m_playerColor = id; - m_playerColorRand1 = id + m_playerColorRand2; } void setPlayerColor2(int id) { m_playerColor2 = id; - m_playerColor2Rand1 = id + m_playerColor2Rand2; } void setPlayerGlow(bool v) { m_playerGlow = v; @@ -2892,9 +2837,7 @@ class GameManager : GManager { gd::string m_playerUDID; gd::string m_playerName; bool m_commentsEnabled; - int m_playerUserIDRand1; - int m_playerUserIDRand2; - int m_playerUserID; + geode::SeedValueRSV m_playerUserID; float m_backgroundMusicVolume; float m_effectsVolume; float m_timeOffset; @@ -2912,39 +2855,17 @@ class GameManager : GManager { int m_sceneEnum; int m_searchObjectType; bool m_unknownBool6; - int m_playerFrameRand1; - int m_playerFrameRand2; - int m_playerFrame; - int m_playerShipRand1; - int m_playerShipRand2; - int m_playerShip; - int m_playerBallRand1; - int m_playerBallRand2; - int m_playerBall; - int m_playerBirdRand1; - int m_playerBirdRand2; - int m_playerBird; - int m_playerDartRand1; - int m_playerDartRand2; - int m_playerDart; - int m_playerRobotRand1; - int m_playerRobotRand2; - int m_playerRobot; - int m_playerSpiderRand1; - int m_playerSpiderRand2; - int m_playerSpider; - int m_playerColorRand1; - int m_playerColorRand2; - int m_playerColor; - int m_playerColor2Rand1; - int m_playerColor2Rand2; - int m_playerColor2; - int m_playerStreakRand1; - int m_playerStreakRand2; - int m_playerStreak; - int m_playerDeathEffectRand1; - int m_playerDeathEffectRand2; - int m_playerDeathEffect; + geode::SeedValueRSV m_playerFrame; + geode::SeedValueRSV m_playerShip; + geode::SeedValueRSV m_playerBall; + geode::SeedValueRSV m_playerBird; + geode::SeedValueRSV m_playerDart; + geode::SeedValueRSV m_playerRobot; + geode::SeedValueRSV m_playerSpider; + geode::SeedValueRSV m_playerColor; + geode::SeedValueRSV m_playerColor2; + geode::SeedValueRSV m_playerStreak; + geode::SeedValueRSV m_playerDeathEffect; int m_chkSeed; int m_chkRand; int m_secretNumberSeed; @@ -2973,9 +2894,7 @@ class GameManager : GManager { bool m_unk2; bool m_gameCenterEnabled; bool m_smoothFix; - int m_ratePowerSeed; - int m_ratePowerRand; - int m_ratePower; + geode::SeedValueSRV m_ratePower; bool m_canGetLevelSaveData; int m_resolution; cocos2d::TextureQuality m_quality; @@ -3388,9 +3307,7 @@ class GameStatsManager : cocos2d::CCNode { cocos2d::CCDictionary* m_completedMappacks; cocos2d::CCDictionary* m_weeklyChest; cocos2d::CCDictionary* m_treasureRoomChests; - int m_bonusKeySeed; - int m_bonusKeyRand; - int m_bonusKey; + geode::SeedValueSRV m_bonusKey; cocos2d::CCDictionary* m_miscChests; } @@ -3725,9 +3642,7 @@ class LevelEditorLayer : GJBaseGameLayer, LevelSettingsDelegate { cocos2d::CCArray* m_unkArray12; bool field_14; bool field_31D; - int m_coinCountRand1; - int m_coinCountRand2; - int m_coinCount; + geode::SeedValueRSV m_coinCount; bool m_moveTrigger; bool m_colorTrigger; bool m_pulseTrigger; @@ -3758,9 +3673,7 @@ class LevelEditorLayer : GJBaseGameLayer, LevelSettingsDelegate { cocos2d::CCArray* m_undoObjects; cocos2d::CCArray* m_redoObjects; cocos2d::CCPoint m_unkPoint1; - int m_objectCountRand1; - int m_objectCountRand2; - int m_objectCount; + geode::SeedValueRSV m_objectCount; DrawGridLayer* m_drawGridLayer; GJGameLevel* m_level; PlaybackMode m_playbackMode; diff --git a/codegen/src/BindingGen.cpp b/codegen/src/BindingGen.cpp index ef0a7074..2f4b4e22 100644 --- a/codegen/src/BindingGen.cpp +++ b/codegen/src/BindingGen.cpp @@ -14,6 +14,7 @@ namespace { namespace format_strings { #include <cocos-ext.h> #include <Geode/GeneratedPredeclare.hpp> #include <Geode/Enums.hpp> +#include <Geode/utils/SeedValue.hpp> )GEN"; diff --git a/loader/include/Geode/utils/SeedValue.hpp b/loader/include/Geode/utils/SeedValue.hpp new file mode 100644 index 00000000..9b3a13f2 --- /dev/null +++ b/loader/include/Geode/utils/SeedValue.hpp @@ -0,0 +1,190 @@ +#pragma once + +namespace geode { + enum class SeedOrdering { + VRS, + VSR, + RVS, + RSV, + SVR, + SRV, + }; + + class BaseSeedValue { + protected: + int m_v1 = 0; + int m_v2 = 0; + int m_v3 = 0; + + public: + BaseSeedValue(int v1, int v2, int v3) : m_v1(v1), m_v2(v2), m_v3(v3) {} + + BaseSeedValue() = default; + BaseSeedValue(BaseSeedValue const& other) = default; + BaseSeedValue(BaseSeedValue&& other) = default; + BaseSeedValue& operator=(BaseSeedValue const& other) = default; + BaseSeedValue& operator=(BaseSeedValue&& other) = default; + }; + + template <SeedOrdering Ordering = SeedOrdering::RSV> + class SeedValue {}; + +#define GEODE_SEED_VALUE_COMMON_OPS() \ + SeedValue& operator=(int value) { \ + internalValue() = value; \ + internalRandom() = value + internalSeed(); \ + return *this; \ + } \ + int value() { \ + internalValue() = internalRandom() - internalSeed(); \ + return internalValue(); \ + } \ + operator int() { return this->value(); } + + template <> + class SeedValue<SeedOrdering::VRS> : public BaseSeedValue { + private: + int& internalValue() { + return m_v1; + } + + int& internalRandom() { + return m_v2; + } + + int& internalSeed() { + return m_v3; + } + + public: + using BaseSeedValue::BaseSeedValue; + + SeedValue(int value, int seed) : BaseSeedValue(value, value + seed, seed) {} + + GEODE_SEED_VALUE_COMMON_OPS(); + }; + + template <> + class SeedValue<SeedOrdering::VSR> : public BaseSeedValue { + private: + int& internalValue() { + return m_v1; + } + + int& internalSeed() { + return m_v2; + } + + int& internalRandom() { + return m_v3; + } + + public: + using BaseSeedValue::BaseSeedValue; + + SeedValue(int value, int seed) : BaseSeedValue(value, seed, value + seed) {} + + GEODE_SEED_VALUE_COMMON_OPS(); + }; + + template <> + class SeedValue<SeedOrdering::RVS> : public BaseSeedValue { + private: + int& internalRandom() { + return m_v1; + } + + int& internalValue() { + return m_v2; + } + + int& internalSeed() { + return m_v3; + } + + public: + using BaseSeedValue::BaseSeedValue; + + SeedValue(int value, int seed) : BaseSeedValue(value + seed, value, seed) {} + + GEODE_SEED_VALUE_COMMON_OPS(); + }; + + template <> + class SeedValue<SeedOrdering::RSV> : public BaseSeedValue { + private: + int& internalRandom() { + return m_v1; + } + + int& internalSeed() { + return m_v2; + } + + int& internalValue() { + return m_v3; + } + + public: + using BaseSeedValue::BaseSeedValue; + + SeedValue(int value, int seed) : BaseSeedValue(value + seed, seed, value) {} + + GEODE_SEED_VALUE_COMMON_OPS(); + }; + + template <> + class SeedValue<SeedOrdering::SVR> : public BaseSeedValue { + private: + int& internalSeed() { + return m_v1; + } + + int& internalValue() { + return m_v2; + } + + int& internalRandom() { + return m_v3; + } + + public: + using BaseSeedValue::BaseSeedValue; + + SeedValue(int value, int seed) : BaseSeedValue(seed, value, value + seed) {} + + GEODE_SEED_VALUE_COMMON_OPS(); + }; + + template <> + class SeedValue<SeedOrdering::SRV> : public BaseSeedValue { + private: + int& internalSeed() { + return m_v1; + } + + int& internalRandom() { + return m_v2; + } + + int& internalValue() { + return m_v3; + } + + public: + using BaseSeedValue::BaseSeedValue; + + SeedValue(int value, int seed) : BaseSeedValue(seed, value + seed, value) {} + + GEODE_SEED_VALUE_COMMON_OPS(); + }; + + using SeedValueRSV = SeedValue<SeedOrdering::RSV>; + using SeedValueSRV = SeedValue<SeedOrdering::SRV>; + using SeedValueVRS = SeedValue<SeedOrdering::VRS>; + using SeedValueVSR = SeedValue<SeedOrdering::VSR>; + using SeedValueRVS = SeedValue<SeedOrdering::RVS>; + using SeedValueSVR = SeedValue<SeedOrdering::SVR>; + +#undef GEODE_SEED_VALUE_COMMON_OPS +} // namespace geode \ No newline at end of file