From 5232efc723204f793dd40dd7713032c481a86964 Mon Sep 17 00:00:00 2001 From: camden314 Date: Thu, 27 May 2021 12:43:44 -0500 Subject: [PATCH] :trollface: --- to_copy/Cacao/include/CacKit | 223 +++++++++++++++++----------- to_copy/Cacao/include/GDML/GDML.hpp | 2 + to_copy/Cacao/include/cc_defs.hpp | 38 +++++ to_copy/Cacao/static/libCacao.a | Bin 97296 -> 101632 bytes 4 files changed, 179 insertions(+), 84 deletions(-) diff --git a/to_copy/Cacao/include/CacKit b/to_copy/Cacao/include/CacKit index 8b0510f..9876906 100644 --- a/to_copy/Cacao/include/CacKit +++ b/to_copy/Cacao/include/CacKit @@ -6,6 +6,9 @@ ModContainer* m; #ifndef CAC_PROJ_NAME #define CAC_PROJ_NAME "Default Cacao Project" #endif +#define CAC_HOOKS void __cacinj() __attribute__((constructor)); void __cacinj() { +#define END_CAC_HOOKS \ + for(auto& i : __cackit::glob) {i->apply_hooks();};m->enable();} typedef char const* c_string; @@ -33,14 +36,23 @@ template inline typename GetReturnType::type (*extract_virtual(T instance, F func))(T) { return reinterpret_cast::type(*)(T)>(*reinterpret_cast(*reinterpret_cast(instance)+*reinterpret_cast(&func)-1)); }; + +class $CacBase { + public: + virtual void apply_hooks() = 0; +}; + +namespace __cackit { + std::vector<$CacBase*> glob; +} -class $GameObject { + +class $GameObject : public $CacBase { public: $GameObject() { if (!m) m = new ModContainer(CAC_PROJ_NAME); - apply_hooks(); - m->enable(); + __cackit::glob.push_back(this); } typedef GameObject* __thistype; @@ -80,7 +92,7 @@ class $GameObject { return reinterpret_cast(m->getOriginal(getBase()+0x2f5520))(this,p0); } - void apply_hooks() { + void apply_hooks() override { m->registerHook(getBase()+0x33ae10, extract_virtual(this, &$GameObject::getGroupID)); m->registerHook(getBase()+0x335850, extract_virtual(this, &$GameObject::setPosition)); @@ -101,13 +113,13 @@ class $GameObject { } }; -class $GameManager { + +class $GameManager : public $CacBase { public: $GameManager() { if (!m) m = new ModContainer(CAC_PROJ_NAME); - apply_hooks(); - m->enable(); + __cackit::glob.push_back(this); } typedef GameManager* __thistype; @@ -151,7 +163,7 @@ class $GameManager { return reinterpret_cast(m->getOriginal(getBase()+0x1d08a0))(this,p0,p1,p2); } - void apply_hooks() { + void apply_hooks() override { m->registerHook(getBase()+0x1cbc80, extract_virtual(this, &$GameManager::colorForIdx)); m->registerHook(getBase()+0x1d0200, extract_virtual(this, &$GameManager::doQuickSave)); @@ -174,13 +186,13 @@ class $GameManager { } }; -class $PlayerObject { + +class $PlayerObject : public $CacBase { public: $PlayerObject() { if (!m) m = new ModContainer(CAC_PROJ_NAME); - apply_hooks(); - m->enable(); + __cackit::glob.push_back(this); } typedef PlayerObject* __thistype; @@ -208,7 +220,7 @@ class $PlayerObject { return reinterpret_cast(m->getOriginal(getBase()+0x218bf0))(this,p0); } - void apply_hooks() { + void apply_hooks() override { m->registerHook(getBase()+0x22aa00, extract_virtual(this, &$PlayerObject::pushButton)); m->registerHook(getBase()+0x21c090, extract_virtual(this, &$PlayerObject::flipGravity)); @@ -223,13 +235,13 @@ class $PlayerObject { } }; -class $ObjectToolbox { + +class $ObjectToolbox : public $CacBase { public: $ObjectToolbox() { if (!m) m = new ModContainer(CAC_PROJ_NAME); - apply_hooks(); - m->enable(); + __cackit::glob.push_back(this); } typedef ObjectToolbox* __thistype; @@ -237,18 +249,18 @@ class $ObjectToolbox { return reinterpret_cast(m->getOriginal(getBase()+0x4173b0))(this,p0); } - void apply_hooks() { + void apply_hooks() override { m->registerHook(getBase()+0x4173b0, extract_virtual(this, &$ObjectToolbox::intKeyToFrame)); } }; -class $CCTextInputNode { + +class $CCTextInputNode : public $CacBase { public: $CCTextInputNode() { if (!m) m = new ModContainer(CAC_PROJ_NAME); - apply_hooks(); - m->enable(); + __cackit::glob.push_back(this); } typedef CCTextInputNode* __thistype; @@ -276,7 +288,7 @@ class $CCTextInputNode { return reinterpret_cast(m->getOriginal(getBase()+0x5d3e0))(this,p0); } - void apply_hooks() { + void apply_hooks() override { m->registerHook(getBase()+0x5d360, extract_virtual(this, &$CCTextInputNode::setAllowedChars)); m->registerHook(getBase()+0x5da30, extract_virtual(this, &$CCTextInputNode::setMaxLabelScale)); @@ -291,13 +303,13 @@ class $CCTextInputNode { } }; -class $EndPortalObject { + +class $EndPortalObject : public $CacBase { public: $EndPortalObject() { if (!m) m = new ModContainer(CAC_PROJ_NAME); - apply_hooks(); - m->enable(); + __cackit::glob.push_back(this); } typedef EndPortalObject* __thistype; @@ -305,18 +317,18 @@ class $EndPortalObject { return reinterpret_cast(m->getOriginal(getBase()+0x1dacb0))(this,p0); } - void apply_hooks() { + void apply_hooks() override { m->registerHook(getBase()+0x1dacb0, extract_virtual(this, &$EndPortalObject::updateColors)); } }; -class $GJBaseGameLayer { + +class $GJBaseGameLayer : public $CacBase { public: $GJBaseGameLayer() { if (!m) m = new ModContainer(CAC_PROJ_NAME); - apply_hooks(); - m->enable(); + __cackit::glob.push_back(this); } typedef GJBaseGameLayer* __thistype; @@ -328,20 +340,20 @@ class $GJBaseGameLayer { return reinterpret_cast(m->getOriginal(getBase()+0xb7b70))(this,p0); } - void apply_hooks() { + void apply_hooks() override { m->registerHook(getBase()+0xb7050, extract_virtual(this, &$GJBaseGameLayer::spawnGroup)); m->registerHook(getBase()+0xb7b70, extract_virtual(this, &$GJBaseGameLayer::addToSection)); } }; -class $EditorPauseLayer { + +class $EditorPauseLayer : public $CacBase { public: $EditorPauseLayer() { if (!m) m = new ModContainer(CAC_PROJ_NAME); - apply_hooks(); - m->enable(); + __cackit::glob.push_back(this); } typedef EditorPauseLayer* __thistype; @@ -349,18 +361,18 @@ class $EditorPauseLayer { return reinterpret_cast(m->getOriginal(getBase()+0x13ebd0))(this); } - void apply_hooks() { + void apply_hooks() override { m->registerHook(getBase()+0x13ebd0, extract_virtual(this, &$EditorPauseLayer::saveLevel)); } }; -class $GameSoundManager { + +class $GameSoundManager : public $CacBase { public: $GameSoundManager() { if (!m) m = new ModContainer(CAC_PROJ_NAME); - apply_hooks(); - m->enable(); + __cackit::glob.push_back(this); } typedef GameSoundManager* __thistype; @@ -368,18 +380,18 @@ class $GameSoundManager { return reinterpret_cast(m->getOriginal(getBase()+0x362130))(this); } - void apply_hooks() { + void apply_hooks() override { m->registerHook(getBase()+0x362130, extract_virtual(this, &$GameSoundManager::stopBackgroundMusic)); } }; -class $LevelEditorLayer { + +class $LevelEditorLayer : public $CacBase { public: $LevelEditorLayer() { if (!m) m = new ModContainer(CAC_PROJ_NAME); - apply_hooks(); - m->enable(); + __cackit::glob.push_back(this); } typedef LevelEditorLayer* __thistype; @@ -419,7 +431,7 @@ class $LevelEditorLayer { return reinterpret_cast(m->getOriginal(getBase()+0x94730))(this,p0); } - void apply_hooks() { + void apply_hooks() override { m->registerHook(getBase()+0x957c0, extract_virtual(this, &$LevelEditorLayer::createObject)); m->registerHook(getBase()+0x97020, extract_virtual(this, &$LevelEditorLayer::handleAction)); @@ -440,13 +452,13 @@ class $LevelEditorLayer { } }; -class $CCMenuItemToggler { + +class $CCMenuItemToggler : public $CacBase { public: $CCMenuItemToggler() { if (!m) m = new ModContainer(CAC_PROJ_NAME); - apply_hooks(); - m->enable(); + __cackit::glob.push_back(this); } typedef CCMenuItemToggler* __thistype; @@ -458,20 +470,20 @@ class $CCMenuItemToggler { return reinterpret_cast(m->getOriginal(getBase()+0x38950))(this,p0); } - void apply_hooks() { + void apply_hooks() override { m->registerHook(getBase()+0x38a40, extract_virtual(this, &$CCMenuItemToggler::setSizeMult)); m->registerHook(getBase()+0x38950, extract_virtual(this, &$CCMenuItemToggler::toggle)); } }; -class $CCMenuItemSpriteExtra { + +class $CCMenuItemSpriteExtra : public $CacBase { public: $CCMenuItemSpriteExtra() { if (!m) m = new ModContainer(CAC_PROJ_NAME); - apply_hooks(); - m->enable(); + __cackit::glob.push_back(this); } typedef CCMenuItemSpriteExtra* __thistype; @@ -479,18 +491,18 @@ class $CCMenuItemSpriteExtra { return reinterpret_cast(m->getOriginal(getBase()+0x1255e0))(this,p0); } - void apply_hooks() { + void apply_hooks() override { m->registerHook(getBase()+0x1255e0, extract_virtual(this, &$CCMenuItemSpriteExtra::setSizeMult)); } }; -class $MoreVideoOptionsLayer { + +class $MoreVideoOptionsLayer : public $CacBase { public: $MoreVideoOptionsLayer() { if (!m) m = new ModContainer(CAC_PROJ_NAME); - apply_hooks(); - m->enable(); + __cackit::glob.push_back(this); } typedef MoreVideoOptionsLayer* __thistype; @@ -498,18 +510,18 @@ class $MoreVideoOptionsLayer { return reinterpret_cast(m->getOriginal(getBase()+0x444150))(this); } - void apply_hooks() { + void apply_hooks() override { m->registerHook(getBase()+0x444150, extract_virtual(this, &$MoreVideoOptionsLayer::init)); } }; -class $Slider { + +class $Slider : public $CacBase { public: $Slider() { if (!m) m = new ModContainer(CAC_PROJ_NAME); - apply_hooks(); - m->enable(); + __cackit::glob.push_back(this); } typedef Slider* __thistype; @@ -525,7 +537,7 @@ class $Slider { return reinterpret_cast(m->getOriginal(getBase()+0x18e170))(this,p0); } - void apply_hooks() { + void apply_hooks() override { m->registerHook(getBase()+0x18e280, extract_virtual(this, &$Slider::setBarVisibility)); m->registerHook(getBase()+0x18e0c0, extract_virtual(this, &$Slider::getValue)); @@ -534,13 +546,13 @@ class $Slider { } }; -class $CCLabelBMFont { + +class $CCLabelBMFont : public $CacBase { public: $CCLabelBMFont() { if (!m) m = new ModContainer(CAC_PROJ_NAME); - apply_hooks(); - m->enable(); + __cackit::glob.push_back(this); } typedef CCLabelBMFont* __thistype; @@ -556,7 +568,7 @@ class $CCLabelBMFont { return reinterpret_cast(m->getOriginal(getBase()+0x3489e0))(this,p0,p1); } - void apply_hooks() { + void apply_hooks() override { m->registerHook(getBase()+0x34a6e0, extract_virtual(this, &$CCLabelBMFont::limitLabelWidth)); m->registerHook(getBase()+0x34a5d0, extract_virtual(this, &$CCLabelBMFont::setScale)); @@ -565,13 +577,13 @@ class $CCLabelBMFont { } }; -class $CCMouseDelegate { + +class $CCMouseDelegate : public $CacBase { public: $CCMouseDelegate() { if (!m) m = new ModContainer(CAC_PROJ_NAME); - apply_hooks(); - m->enable(); + __cackit::glob.push_back(this); } typedef CCMouseDelegate* __thistype; @@ -587,7 +599,7 @@ class $CCMouseDelegate { return reinterpret_cast(m->getOriginal(getBase()+0x61b0))(this); } - void apply_hooks() { + void apply_hooks() override { m->registerHook(getBase()+0x61c0, extract_virtual(this, &$CCMouseDelegate::rightKeyUp)); m->registerHook(getBase()+0x61d0, extract_virtual(this, &$CCMouseDelegate::scrollWheel)); @@ -596,13 +608,13 @@ class $CCMouseDelegate { } }; -class $CCNode { + +class $CCNode : public $CacBase { public: $CCNode() { if (!m) m = new ModContainer(CAC_PROJ_NAME); - apply_hooks(); - m->enable(); + __cackit::glob.push_back(this); } typedef CCNode* __thistype; @@ -706,7 +718,7 @@ class $CCNode { return reinterpret_cast(m->getOriginal(getBase()+0x122e50))(this,p0); } - void apply_hooks() { + void apply_hooks() override { m->registerHook(getBase()+0x122990, extract_virtual(this, &$CCNode::_setZOrder)); m->registerHook(getBase()+0x1229e0, extract_virtual(this, &$CCNode::getVertexZ)); @@ -759,13 +771,13 @@ class $CCNode { } }; -class $EditorUI { + +class $EditorUI : public $CacBase { public: $EditorUI() { if (!m) m = new ModContainer(CAC_PROJ_NAME); - apply_hooks(); - m->enable(); + __cackit::glob.push_back(this); } typedef EditorUI* __thistype; @@ -813,7 +825,7 @@ class $EditorUI { return reinterpret_cast(m->getOriginal(getBase()+0x23f30))(this); } - void apply_hooks() { + void apply_hooks() override { m->registerHook(getBase()+0x1f300, extract_virtual(this, &$EditorUI::deselectAll)); m->registerHook(getBase()+0x18ba0, extract_virtual(this, &$EditorUI::onDuplicate)); @@ -838,13 +850,13 @@ class $EditorUI { } }; -class $InfoLayer { + +class $InfoLayer : public $CacBase { public: $InfoLayer() { if (!m) m = new ModContainer(CAC_PROJ_NAME); - apply_hooks(); - m->enable(); + __cackit::glob.push_back(this); } typedef InfoLayer* __thistype; @@ -856,20 +868,20 @@ class $InfoLayer { return reinterpret_cast(m->getOriginal(getBase()+0x458fb0))(this,p0,p1); } - void apply_hooks() { + void apply_hooks() override { m->registerHook(getBase()+0x459b60, extract_virtual(this, &$InfoLayer::onRefreshComments)); m->registerHook(getBase()+0x458fb0, extract_virtual(this, &$InfoLayer::loadPage)); } }; -class $MenuLayer { + +class $MenuLayer : public $CacBase { public: $MenuLayer() { if (!m) m = new ModContainer(CAC_PROJ_NAME); - apply_hooks(); - m->enable(); + __cackit::glob.push_back(this); } typedef MenuLayer* __thistype; @@ -881,20 +893,45 @@ class $MenuLayer { return reinterpret_cast(m->getOriginal(getBase()+0x1d2b40))(this,p0); } - void apply_hooks() { + virtual void onMoreGames(CCObject* p0) { + return reinterpret_cast(m->getOriginal(getBase()+0x1d2ad0))(this,p0); + } + + void apply_hooks() override { m->registerHook(getBase()+0x1d3170, extract_virtual(this, &$MenuLayer::keyBackClicked)); m->registerHook(getBase()+0x1d2b40, extract_virtual(this, &$MenuLayer::onQuit)); + + m->registerHook(getBase()+0x1d2ad0, extract_virtual(this, &$MenuLayer::onMoreGames)); } }; -class $PlayLayer { + +class $CCKeyboardDispatcher : public $CacBase { + public: + $CCKeyboardDispatcher() { + if (!m) + m = new ModContainer(CAC_PROJ_NAME); + __cackit::glob.push_back(this); + } + typedef CCKeyboardDispatcher* __thistype; + + virtual void dispatchKeyboardMSG(int p0,bool p1) { + return reinterpret_cast(m->getOriginal(getBase()+0xe8190))(this,p0,p1); + } + + void apply_hooks() override { + m->registerHook(getBase()+0xe8190, extract_virtual(this, &$CCKeyboardDispatcher::dispatchKeyboardMSG)); + } +}; + + +class $PlayLayer : public $CacBase { public: $PlayLayer() { if (!m) m = new ModContainer(CAC_PROJ_NAME); - apply_hooks(); - m->enable(); + __cackit::glob.push_back(this); } typedef PlayLayer* __thistype; @@ -914,7 +951,7 @@ class $PlayLayer { return reinterpret_cast(m->getOriginal(getBase()+0x70e50))(this,p0); } - void apply_hooks() { + void apply_hooks() override { m->registerHook(getBase()+0x71c50, extract_virtual(this, &$PlayLayer::resetLevel)); m->registerHook(getBase()+0xe5d50, extract_virtual(this, &$PlayLayer::switchToScene)); @@ -925,3 +962,21 @@ class $PlayLayer { } }; + +class $CreatorLayer : public $CacBase { + public: + $CreatorLayer() { + if (!m) + m = new ModContainer(CAC_PROJ_NAME); + __cackit::glob.push_back(this); + } + typedef CreatorLayer* __thistype; + + virtual bool init() { + return reinterpret_cast(m->getOriginal(getBase()+0x141c10))(this); + } + + void apply_hooks() override { + m->registerHook(getBase()+0x141c10, extract_virtual(this, &$CreatorLayer::init)); + } +}; diff --git a/to_copy/Cacao/include/GDML/GDML.hpp b/to_copy/Cacao/include/GDML/GDML.hpp index 0e696a4..301ce70 100644 --- a/to_copy/Cacao/include/GDML/GDML.hpp +++ b/to_copy/Cacao/include/GDML/GDML.hpp @@ -28,6 +28,7 @@ class BaseContainer { virtual ~BaseContainer(); void enable(); void disable(); + inline long getAddress() {return address;} friend class ModContainer; }; @@ -69,6 +70,7 @@ class ModContainer func_t getOriginal(long address); char const* getName(); + inline vector getMods() {return mods;}; private: vector mods; char const* containerName; diff --git a/to_copy/Cacao/include/cc_defs.hpp b/to_copy/Cacao/include/cc_defs.hpp index df9fb08..a89b4f8 100644 --- a/to_copy/Cacao/include/cc_defs.hpp +++ b/to_copy/Cacao/include/cc_defs.hpp @@ -77,6 +77,14 @@ class GDObj { void setValOffset(long offset, void* setter); }; +class CreatorLayer : public cocos2d::CCLayer, public GDObj { + +}; + +class GJListLayer : public GDObj { + +}; + class GJGameLevel : public cocos2d::CCNode, public GDObj { public: static GJGameLevel* create(); @@ -442,6 +450,36 @@ class FLAlertLayer : public cocos2d::CCLayerColor, public GDObj { bool m_noAction; }; +class GJDropDownLayer : public cocos2d::CCLayerColor { + public: + bool init(char const*, float); + static GJDropDownLayer* create(char const*); + + void registerWithTouchDispatcher() override {GJDropDownLayer::registerWithTouchDispatcher();} + void draw(void) override {GJDropDownLayer::draw();}; + + virtual ~GJDropDownLayer() {GJDropDownLayer::~GJDropDownLayer();}; + virtual void customSetup() {GJDropDownLayer::customSetup();}; + virtual void enterLayer() {GJDropDownLayer::enterLayer();}; + virtual void exitLayer(cocos2d::CCObject* btn) {GJDropDownLayer::exitLayer(btn);}; + virtual void showLayer(bool noTransition) {GJDropDownLayer::showLayer(noTransition);}; + virtual void hideLayer(bool noTransition) {}; + virtual void layerVisible() {}; + virtual void layerHidden() {}; + virtual void enterAnimFinished() {}; + virtual void disableUI() {}; + virtual void enableUI() {GJDropDownLayer::enableUI();}; + protected: + cocos2d::CCPoint m_obEndPosition; + cocos2d::CCPoint m_obStartPosition; + cocos2d::CCMenu* m_buttonMenu; + GJListLayer* m_listLayer; + bool m_controllerEnabled; //? + cocos2d::CCLayer* m_mainLayer; + bool m_hidden; //? + void* m_unknown; +}; + class FLAlertLayerProtocol { virtual void FLAlert_Clicked(FLAlertLayer*, bool) {} diff --git a/to_copy/Cacao/static/libCacao.a b/to_copy/Cacao/static/libCacao.a index d63f479c66225fdc28710fb8b0645ad646e3a5be..3df0b7a1b8df6c3c9ce7b43187c7fc5239d66106 100644 GIT binary patch delta 14882 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

{9&6t&QK?y;+)D{!B)0QBH1&{ia7m am0EjOT?e0a40X;P?rrZ`^h`Fqy#5cmJ_d^b delta 12897 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 AnE(I)