From 20f1dc93cf4f763574f23b27cbc14caae9bea99b Mon Sep 17 00:00:00 2001 From: FireMario211 <17692105+FireMario211@users.noreply.github.com> Date: Mon, 13 Jan 2025 16:11:10 -0500 Subject: [PATCH] testing for beta! --- changelog.md | 19 + mod.json | 12 +- resources/NotoSans-Arabic.ttf | Bin 0 -> 204384 bytes resources/hacks/bot.json | 6 + resources/hacks/misc.json | 14 + resources/hacks/player.json | 10 + resources/hacks/settings.json | 10 +- resources/langs/arabic.json | 1285 ++++++++++++++++----------------- src/Hacks/Misc.cpp | 80 +- src/Hacks/Player.cpp | 66 +- src/Hacks/Quartz.cpp | 3 +- src/Hacks/Quartz.hpp | 4 +- src/Languages.hpp | 24 +- src/Misc/Label.hpp | 193 +++++ src/PrismButton.hpp | 162 ++++- src/Themes.cpp | 14 +- src/Themes.hpp | 2 + src/UI/CreditsMenu.cpp | 29 +- src/UI/PrismUI.cpp | 194 +++-- src/Utils.hpp | 110 ++- src/hacks.cpp | 34 +- 21 files changed, 1473 insertions(+), 798 deletions(-) create mode 100644 resources/NotoSans-Arabic.ttf create mode 100644 src/Misc/Label.hpp diff --git a/changelog.md b/changelog.md index 6aa1771..de19e17 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,22 @@ +# v1.10.0 + - Updated to Geode 4.1.2 + - Added Arabic Translations + - Updated French Translations + - Updated Russian Translations + - Updated Romanian Translations + - Updated Turkish Translations + - Updated Vietnamese Translations + - Added Hitbox Trail + - Added Dragging the Prism Button + - Added Menu Transition + - Added Show Tooltip to work properly with info buttons + - Added information for whether or not Quartz Macros have frame fix enabled or not + - Added a confirmation for resetting settings to default + - Added "Export as JSON" for Macros + - Added Everything Hurts back + - Added No Solids back + - Fixed TPS Bypass for Android + - Optimized some hacks # v1.9.3 - Updated to Geode 4.0.0-beta.1 - Updated Ukrainian Translations diff --git a/mod.json b/mod.json index ddd44db..e794377 100644 --- a/mod.json +++ b/mod.json @@ -1,5 +1,5 @@ { - "geode": "4.0.0-beta.1", + "geode": "4.1.2", "version": "v1.9.5", "gd": { "win": "2.2074", @@ -26,6 +26,7 @@ "resources/Screenshot2.png", "resources/PrismMenu.otf", "resources/Hack-Regular.ttf", + "resources/NotoSans-Arabic.ttf", "resources/themes.json", "resources/hacks/README.md", "resources/hacks/*.json", @@ -42,7 +43,14 @@ "charsetold": "21-383,460-513,535-540,561-564,578-581,898-1500,7681-7930,26085,26412,35486", "charset": "21-383,460-513,535-540,561-564,578-581,898-1500,7681-7930,26085,26412,35486,12289,12290,12293,12300,12301,12354,12356,12358,12360,12362,12363,12364,12365,12367,12369,12371,12372,12373,12374,12375,12376,12377,12378,12379,12381,12383,12384,12385,12387,12388,12390,12391,12392,12393,12394,12395,12398,12399,12400,12405,12409,12411,12414,12415,12417,12418,12420,12424,12425,12426,12427,12428,12429,12431,12434,12435,12449,12450,12451,12452,12454,12455,12456,12457,12458,12459,12460,12461,12463,12464,12465,12466,12467,12470,12471,12472,12473,12474,12475,12479,12480,12481,12483,12484,12486,12487,12488,12489,12490,12491,12494,12495,12496,12497,12500,12501,12502,12503,12505,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12521,12522,12523,12524,12525,12527,12531,12539,12540,19968,19978,19979,19981,20001,20013,20037,20102,20107,20129,20154,20182,20197,20301,20307,20316,20351,20415,20491,20516,20803,20837,20840,20844,20877,20998,20999,21028,21029,21033,21046,21066,21069,21147,21177,21205,21270,21332,21336,21453,21487,21491,21512,22238,22258,22266,22580,22793,22806,22810,22823,22826,22909,23383,23433,23436,23450,23453,23475,23567,23627,24038,24230,24235,24335,24341,24375,24403,24418,24441,24460,24489,24517,24615,24656,24847,25104,25147,25171,25246,25407,25551,25563,25925,25968,25973,25991,26041,26082,26085,26126,26143,26178,26222,26354,26367,26377,26399,26410,26412,26689,27005,27490,27491,27497,27515,27573,27704,27880,28187,28288,28357,28857,28858,28961,29289,29305,29575,29992,30011,30171,30340,30636,30701,30906,31034,31186,31354,31435,31561,31684,32218,32232,32244,32302,32622,32722,32763,32884,33021,33258,33324,33394,33853,34892,34920,35201,35211,35222,35302,35328,35373,35379,35430,35486,35488,36092,36215,36578,36600,36802,36879,36884,36890,36895,36899,36914,36984,37096,37325,37329,38263,38281,38283,38291,38306,38450,38480,38500,38555,38556,38560,38598,38754,38899" } - } + }, + "fontsold": { + "PrismMenu-AR": { + "path": "resources/NotoSansArabic-Regular.ttf", + "size": 128, + "charset": "1536-1791,1872-1919,2208-2303,64336-65023,65136-65279,126464-126719" + } + } }, "settings": { "skip-intro": { diff --git a/resources/NotoSans-Arabic.ttf b/resources/NotoSans-Arabic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..24ca97875518675a38b9535f440c5322bb2c8386 GIT binary patch literal 204384 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�{RBOO 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 G\nFile Name: {}\nDescription: {}\nLevel: {} ({})\nTPS: {}\nDuration: {}\n\nMade with {} (v{})", + "By {}\nFile Name: {}\nDescription: {}\nLevel: {} ({})\nTPS: {}\nDuration: {}\nFrame Fix: {}\n\nMade with {} (v{})", m_file.macro.author, m_file.file, m_file.macro.description, m_file.macro.levelInfo.name, m_file.macro.levelInfo.id, m_file.macro.framerate, m_file.macro.duration, + (!m_file.macro.inputs.empty() && m_file.macro.inputs[0].frameFix.fix) ? "Yes" : "No", m_file.macro.botInfo.name, m_file.macro.botInfo.version ).c_str(), "OK", diff --git a/src/Hacks/Quartz.hpp b/src/Hacks/Quartz.hpp index 282fd9c..1d6bb04 100644 --- a/src/Hacks/Quartz.hpp +++ b/src/Hacks/Quartz.hpp @@ -162,9 +162,9 @@ class MacroManager { std::filesystem::create_directory(saveDir + "/macros"); } auto savePath = saveDir + "/macros/" + name + ".gdr"; - if (std::filesystem::exists(savePath)) return false; if (isJSON) savePath = savePath + ".json"; if (std::filesystem::exists(savePath)) return false; + if (std::filesystem::exists(savePath)) return false; QuartzMacro macro; macro.author = GJAccountManager::sharedState()->m_username; //macro.author = "FireeDev"; @@ -173,7 +173,7 @@ class MacroManager { macro.levelInfo.name = ""; macro.levelInfo.id = 0; - macro.gameVersion = 2.206; + macro.gameVersion = 2.2074; std::ofstream f(savePath, std::ios::binary); auto data = macro.exportData(isJSON); diff --git a/src/Languages.hpp b/src/Languages.hpp index 882bb1d..16c7b4e 100644 --- a/src/Languages.hpp +++ b/src/Languages.hpp @@ -56,7 +56,10 @@ class Lang { case 15: // Japanese file = Hacks::readFile("japanese.json"); break; - case 16: // Greek + case 16: // Arabic + file = Hacks::readFile("arabic.json"); + break; + case 17: // Greek file = Hacks::readFile("greek.json"); break; default: // anything else should be discarded @@ -83,14 +86,29 @@ class Lang { auto obj = this->find(key); if (obj == nullptr) return key; matjson::Value def = ""; - return obj.get("name").unwrapOr(def).asString().unwrapOrDefault(); + auto ret = obj.get("name").unwrapOr(def).asString().unwrapOrDefault(); + if (isRTL()) { + //return Utils::simulateRTL(ret); + return "\u200F" + ret; + } else { + return ret; + } } std::string desc(std::string key, std::string original) { if (this->langId == 0) return original; auto obj = this->find(key); if (obj == nullptr) return key; matjson::Value def = ""; - return obj.get("desc").unwrapOr(def).asString().unwrapOrDefault(); + auto ret = obj.get("desc").unwrapOr(def).asString().unwrapOrDefault(); + if (isRTL()) { // 16 + //return Utils::simulateRTL(ret); + return "\u200F" + ret; + } else { + return ret; + } + } + bool isRTL() { + return langId == 16; } int getLangID() { return langId; diff --git a/src/Misc/Label.hpp b/src/Misc/Label.hpp new file mode 100644 index 0000000..2bef2d6 --- /dev/null +++ b/src/Misc/Label.hpp @@ -0,0 +1,193 @@ +#pragma once +#include +#include +#include +#include "../Utils.hpp" + +using namespace geode::prelude; + +/* +class Label : public CCLabelTTF { + protected: + public: + void limitLabelWidth(float width, float defaultScale, float minScale) { + this->setScale(1.0F); + float scale = 1.F; + if (width < this->getContentSize().width && (0.F < width)) { + scale = width / this->getContentSize().width; + } + if (defaultScale != 0.F && defaultScale <= this->getScale()) { + scale = defaultScale; + } + if (minScale != 0.F && (this->getScale() <= minScale)) { + this->setScale(minScale); + } else { + this->setScale(scale); + } + } + static Label * create(const char *string, const char *fontName) { + auto pRet = static_cast(CCLabelTTF::create(string, fontName, 36, CCSizeZero, kCCTextAlignmentCenter, kCCVerticalTextAlignmentTop)); + return pRet; + } +}; +*/ +class Label : public CCNode { + protected: + CCLabelBMFont* m_bmLabel; + CCSprite* m_ttfLabel; + bool m_ttf; + std::string replaceSymbolSpace(std::string str) { + if (str.empty()) return str; + //std::vector symbols = { "§", "¬", "ª", "«", "¦", "¶" }; + std::vector symbols = {167,172,170,171,166,182}; + auto strVec = Utils::utf8ToUtf32(str); + if (strVec.size() < 2) return str; + if (std::find(symbols.begin(), symbols.end(), strVec[1]) != symbols.end()) { + strVec[1] = static_cast(' '); + return Utils::utf32ToUtf8(strVec); + } else { + return str; + } + } + bool hasSymbol(std::string str) { + if (str.empty()) return false; + std::vector symbols = {167,172,170,171,166,182}; + auto strVec = Utils::utf8ToUtf32(str); + if (strVec.size() < 2) return false; + return std::find(symbols.begin(), symbols.end(), strVec[1]) != symbols.end(); + } + bool init(std::string string, const char *fontName, bool ttf) { + if (!CCNode::init()) return false; + m_ttf = ttf; + this->setAnchorPoint({0, 0}); + if (ttf) { + //m_ttfLabel = CCLabelTTF::create(string, fontName, 36, CCSizeZero, kCCTextAlignmentCenter, kCCVerticalTextAlignmentTop); + + auto ttfLabel = CCLabelTTF::create(replaceSymbolSpace(string).c_str(), fontName, 36, CCSizeZero, kCCTextAlignmentCenter, kCCVerticalTextAlignmentTop); + m_ttfLabel = CCSprite::create(); + m_ttfLabel->setDisplayFrame(ttfLabel->displayFrame()); + this->addChild(m_ttfLabel); + this->setContentSize(m_ttfLabel->getContentSize()); + if (hasSymbol(string)) { + std::vector vec = {Utils::utf8ToUtf32(string)[1]}; + auto logo = CCLabelBMFont::create(Utils::utf32ToUtf8(vec).c_str(), "PrismMenu.fnt"_spr); + m_ttfLabel->addChildAtPosition(logo, Anchor::Right); + } + } else { + m_bmLabel = CCLabelBMFont::create(string.c_str(), fontName); + this->addChild(m_bmLabel); + this->setContentSize(m_bmLabel->getContentSize()); + } + return true; + } + public: + bool isTTF() { + return m_ttf; + } + void setColor(const ccColor3B &color) { + if (isTTF()) { + m_ttfLabel->setColor(color); + } else { + m_bmLabel->setColor(color); + } + } + void setOpacity(GLubyte opacity) { + if (isTTF()) { + m_ttfLabel->setOpacity(opacity); + } else { + m_bmLabel->setOpacity(opacity); + } + } + void setAnchorPointTTF(CCPoint anchor) { + if (isTTF()) { + m_ttfLabel->setAnchorPoint(anchor); + } else { + m_bmLabel->setAnchorPoint(anchor); + } + } + /* + void limitLabelWidth(float width, float defaultScale, float minScale) { + this->setScale(1.0F); + float scale = 1.F; + if (width < this->getContentSize().width && (0.F < width)) { + scale = width / this->getContentSize().width; + } + if (defaultScale != 0.F && defaultScale <= this->getScale()) { + scale = defaultScale; + } + if (minScale != 0.F && (this->getScale() <= minScale)) { + this->setScale(minScale); + } else { + this->setScale(scale); + } + }*/ + void limitLabelWidth(float width, float normalScale, float minScale) { + float val = width / this->getContentSize().width; + this->setScale(val > normalScale ? normalScale : val < minScale ? minScale : val); + } + /* + CCRGBAProtocol* getColorLabel() { + return (m_ttf) ? static_cast(m_ttfLabel) : static_cast(m_bmLabel); + } + */ + static Label* create(std::string string, const char *fontName, bool ttf) { + auto pRet = new Label(); + if (pRet) { + if (pRet->init(string, fontName, ttf)) { + pRet->autorelease(); + return pRet; + } + } + CC_SAFE_DELETE(pRet); + return nullptr; + } + static Label* create(const char *string, int langID) { + if (langID == 16) { + return create(string, "NotoSans-Arabic.ttf"_spr, true); + } else { + return create(string, "PrismMenu.fnt"_spr, false); + } + } +}; + + +/* +class Label : public CCNode { + protected: + CCLabelBMFont* m_bmLabel; + CCLabelTTF* m_ttfLabel; + bool m_ttf = false; + virtual bool init(const char *string, const char *fontName, bool ttf) { + if (!CCNode::init()) return false; + m_bmLabel = CCLabelBMFont::create(string, fontName); + this->setContentSize(m_bmLabel->getContentSize()); + this->setAnchorPoint({0.5, 0.5}); + if (ttf) { + m_ttfLabel = CCLabelTTF::create(string, fontName, 36, CCSizeZero, kCCTextAlignmentCenter, kCCVerticalTextAlignmentTop); + this->addChild(m_ttfLabel); + } else { + } + this->addChild(m_bmLabel); + return true; + } + public: + CCNodeRGBA* getColorLabela() { + return m_ttfLabel; + } + CCLabelBMFont* getColorLabel() { + return m_bmLabel; + } + + static Label* create(const char *string, const char *fontName, bool ttf) { + auto pRet = new Label(); + if (pRet) { + if (pRet->init(string, fontName, ttf)) { + pRet->autorelease(); + return pRet; + } + } + CC_SAFE_DELETE(pRet); + return nullptr; + } +}; +*/ diff --git a/src/PrismButton.hpp b/src/PrismButton.hpp index 21042fb..cf4e19b 100644 --- a/src/PrismButton.hpp +++ b/src/PrismButton.hpp @@ -4,7 +4,165 @@ #include "hacks.hpp" #include "UI/PrismUI.hpp" using namespace geode::prelude; + +// definitely not copied from eclipse! class PrismButton : public CCMenu { +protected: + // how many units required to begin dragging the button + constexpr static float MIN_MOVE_DISTANCE = 30.f; + // move progress per second + constexpr static float MOVE_SPEED = 9.2f; + // how many units until the button snaps to touch pos + constexpr static float SNAP_MARGIN = 0.1f; + cocos2d::CCPoint m_holdPosition{}; + bool m_shouldMove = false; // whether currently in move animation + bool m_haveMoved = false; // used to determine whether we should trigger callback after release + CCSprite* m_button; + int currentTouchPrio = 0; + + bool init(CCScene* p0) { + if (!CCMenu::init()) + return false; + if (!p0) + return false; + HackItem* posX = Hacks::getHack("Button Position X"); + HackItem* posY = Hacks::getHack("Button Position Y"); + m_button = CircleButtonSprite::create(CCSprite::create("icon.png"_spr)); + m_button->setID("menu-button"); + this->addChild(m_button); + m_button->setPositionX(posX->value.intValue); + m_button->setPositionY(posY->value.intValue); + this->registerWithTouchDispatcher(); + this->setTouchEnabled(true); + this->setZOrder(p0->getHighestChildZ() + 100); + this->setID("prism-icon"); + currentTouchPrio = this->getTouchPriority(); + this->scheduleUpdate(); + return true; + } + void update(float) override { + this->setPosition({0, 0}); + auto dt = CCDirector::get()->getActualDeltaTime(); + + if (!m_shouldMove) return; + auto currentPos = m_button->getPosition(); + + // if very close to the end, speed up + if (ccpDistance(currentPos, m_holdPosition) < SNAP_MARGIN * 10.f) { + dt *= 2.f; + } + + auto newPoint = ccpLerp(currentPos, m_holdPosition, MOVE_SPEED * dt); + if (ccpDistance(newPoint, m_holdPosition) < SNAP_MARGIN) { + newPoint = m_holdPosition; + m_shouldMove = false; // finished moving + } + + m_button->setPosition(newPoint); + if (!m_shouldMove) { + log::debug("Set new button position: {}", m_button->getPosition()); + HackItem* posX = Hacks::getHack("Button Position X"); + HackItem* posY = Hacks::getHack("Button Position Y"); + posX->value.intValue = m_button->getPositionX(); + posY->value.intValue = m_button->getPositionY(); + auto settings = Mod::get()->getSavedValue("values"); + Hacks::Settings::setSettingValue(&settings, *posX, posX->value.intValue); + Hacks::Settings::setSettingValue(&settings, *posY, posY->value.intValue); + } + // where you set the pos stuff + } +public: + float getRadius() { + return m_button->getScaledContentSize().width / 2.f; + } + bool ccTouchBegan(cocos2d::CCTouch* touch, cocos2d::CCEvent* event) override { + if (!m_button->isVisible() || !this->isVisible() || !isEnabled()) return false; + auto touchPos = this->convertToNodeSpace(touch->getLocation()); + auto spritePos = m_button->getPosition(); + if (ccpDistance(touchPos, spritePos) > getRadius()) + return false; + + m_haveMoved = false; + m_holdPosition = touchPos; + m_button->stopAllActions(); + m_button->runAction(CCScaleTo::create(0.2f, 0.8F)); + return true; + } + void ccTouchEnded(cocos2d::CCTouch* touch, cocos2d::CCEvent* event) override { + m_button->runAction(CCScaleTo::create(0.2f, 1.0F)); + if (m_haveMoved) return; + onButtonClicked(nullptr); + } + void ccTouchMoved(cocos2d::CCTouch* touch, cocos2d::CCEvent* event) override { + auto touchPos = this->convertToNodeSpace(touch->getLocation()); + if (!m_shouldMove && ccpDistance(touchPos, m_holdPosition) < MIN_MOVE_DISTANCE) + return; + + m_shouldMove = true; + m_haveMoved = true; + m_holdPosition = touchPos; + } + void ccTouchCancelled(cocos2d::CCTouch* touch, cocos2d::CCEvent* event) override { + this->ccTouchEnded(touch, event); + } + bool showImGuiMenu = false; + void onButtonClicked(CCObject* p0) { + HackItem* menuStyle = Hacks::getHack("Menu-Style"); + #ifdef NO_IMGUI + menuStyle->value.intValue = 1; + #endif + if (menuStyle->value.intValue == 0) { // imgui + showImGuiMenu = !showImGuiMenu; + } else { + PrismUI::create()->show(); + /*if (Mod::get()->getSettingValue("skip-intro")) { + PrismUI::create()->show(); + } else { + IntroUI::create()->show(); + }*/ + } + } + void resetTouchPriority(bool alsoChild, bool force) { + cocos::handleTouchPriority(this, force); + if (alsoChild) { + /*if (auto menuItem = typeinfo_cast(this->getChildByID("menu-button"))) { + cocos::handleTouchPriority(menuItem, force); + }*/ + } + } + void switchTouchPrio() { + if (this->getTouchPriority() != currentTouchPrio) { + this->setTouchPriority(currentTouchPrio); + } else { + this->setTouchPriority(-1024); + } + } + + static PrismButton* create(CCScene* p0) { + auto ret = new PrismButton(); + if (ret && ret->init(p0)) { + ret->autorelease(); + return ret; + } + CC_SAFE_DELETE(ret); + return nullptr; + } + void setSpritePos(CCPoint pos) { + m_button->setPosition(pos); + } + void setSpritePosX(float x) { + m_button->setPositionX(x); + } + void setSpritePosY(float y) { + m_button->setPositionY(y); + } + static CCMenuItemSpriteExtra* createButton(CCLayer* ret) { + auto myButtonSpr = CircleButtonSprite::create(CCSprite::create("icon.png"_spr)); + return CCMenuItemSpriteExtra::create(myButtonSpr, ret, menu_selector(PrismButton::onButtonClicked)); + } +}; + +class PrismButtonOld : public CCMenu { protected: CCTouch* touchs; //CCMenuItemSpriteExtra* menuButton; @@ -151,8 +309,8 @@ class PrismButton : public CCMenu { } } - static PrismButton* create(CCScene* p0) { - auto ret = new PrismButton(); + static PrismButtonOld* create(CCScene* p0) { + auto ret = new PrismButtonOld(); if (ret && ret->init(p0)) { ret->autorelease(); return ret; diff --git a/src/Themes.cpp b/src/Themes.cpp index 654d66d..701f3a5 100644 --- a/src/Themes.cpp +++ b/src/Themes.cpp @@ -258,4 +258,16 @@ void Themes::RGBAToCC(matjson::Value rgba, CCLabelBMFont* obj) { obj->setColor(color); obj->setOpacity((alpha == -1) ? currentOpacity * 255.0F : alpha); } - +void Themes::RGBAToCC(matjson::Value rgba, Label* obj) { + float currentOpacity = Hacks::getHack("Menu Opacity")->value.floatValue; + std::vector emptyArray; + rgba = rgba.asArray().unwrapOr(emptyArray); + if (rgba.size() != 4) return; + float alpha = rgba[3].asDouble().unwrapOrDefault(); + ccColor3B color; + color.r = rgba[0].asDouble().unwrapOrDefault(); + color.g = rgba[1].asDouble().unwrapOrDefault(); + color.b = rgba[2].asDouble().unwrapOrDefault(); + obj->setColor(color); + obj->setOpacity((alpha == -1) ? currentOpacity * 255.0F : alpha); +} diff --git a/src/Themes.hpp b/src/Themes.hpp index 7e153a6..c521124 100644 --- a/src/Themes.hpp +++ b/src/Themes.hpp @@ -4,6 +4,7 @@ #include #endif #include +#include "Misc/Label.hpp" using namespace geode::prelude; @@ -31,5 +32,6 @@ namespace Themes { #endif void RGBAToCC(matjson::Value rgba, CCNodeRGBA* obj); void RGBAToCC(matjson::Value rgba, CCLabelBMFont* obj); + void RGBAToCC(matjson::Value rgba, Label* obj); matjson::Value getCurrentTheme(); }; diff --git a/src/UI/CreditsMenu.cpp b/src/UI/CreditsMenu.cpp index cf9b899..f0fe587 100644 --- a/src/UI/CreditsMenu.cpp +++ b/src/UI/CreditsMenu.cpp @@ -34,10 +34,10 @@ std::vector users = { },*/ { "TheSillyDoggo", - 5, + 373, "Logo Base", - { 125,125,255 }, - { 125,255,175 }, + { 255,255,255 }, + { 255, 185, 255 }, { 255, 255, 255 }, true, "https://github.com/TheSillyDoggo", @@ -352,7 +352,7 @@ std::vector users = { "ItzRatchett", 275, "Proofreader (PT)", - { 125, 0, 255 }, + { 0, 125, 125 }, { 0, 255, 255 }, { 0, 255, 0 }, true, @@ -369,6 +369,27 @@ std::vector users = { true, "", 20527327 + }, + { + "Sosuke Aoi", + 459, + "Translator (FR)", + { 255, 255, 255 }, + { 0, 0, 0 }, + { 255, 255, 255 }, + true, + "https://www.youtube.com/channel/UC_wDsDqnDOkpC2yPb7pEZWw" + }, + { + "Adamorocco", + 35, + "Translator (AR)", + { 64, 64, 64, }, + { 255, 0, 0 }, + { 255, 255, 255 }, + true, + "", + 25682776 } }; diff --git a/src/UI/PrismUI.cpp b/src/UI/PrismUI.cpp index 6fb8ba8..9045322 100644 --- a/src/UI/PrismUI.cpp +++ b/src/UI/PrismUI.cpp @@ -9,7 +9,8 @@ #include "../Utils.hpp" #include "CreditsMenu.hpp" #include "../Hacks/Quartz.hpp" -//#include "../Misc/Label.hpp" +#include "../PrismButton.hpp" +#include "../Misc/Label.hpp" int currentMenuIndexGD = 0; @@ -119,32 +120,44 @@ bool PrismUIButton::init(HackItem* hack) { matjson::Value val = 0; //auto opcodes = obj.get("opcodes"); this->m_hack = hack; - auto label = CCLabelBMFont::create(currentLanguage->name(name).c_str(), "PrismMenu.fnt"_spr); - //auto label = Label::create(currentLanguage->name(name).c_str(), "NotoSansJP-Regular.ttf"_spr); + //auto label = CCLabelBMFont::create(currentLanguage->name(name).c_str(), "PrismMenu.fnt"_spr); + if (hack->name == "Practice Music") { + //auto tempLabel = CCLabelTTF::create("الموسيقى ممارسة", "NotoSansArabic-Regular.ttf"_spr, 24); + //menu->addChild(tempLabel); + //log::info("Difference between {} and {} I have no idea!", "الموسيقى ممارسة", currentLanguage->name(name).c_str()); + } + auto label = Label::create(currentLanguage->name(name).c_str(), currentLanguage->getLangID()); Themes::RGBAToCC(PrismUI::GetTheme()["Text"], label); - label->setAnchorPoint({0.0F, 0.5F}); + //label->setAnchorPoint({0.0F, 0.5F}); label->limitLabelWidth(150, 0.5F, .2F); - label->setPositionX(20); + if (currentLanguage->isRTL()) { + label->setPositionX(260); + label->setAnchorPointTTF({1.0F, 0.5F}); + } else { + label->setPositionX(20); + label->setAnchorPointTTF({0.0F, 0.5F}); + } menu->addChild(label); - //Themes::RGBAToCC(PrismUI::GetTheme()["Text"], reinterpret_cast(label)); // prrrobably not a good idea if (hack->value.type == ValueType::Bool) { auto checkbox = CCMenuItemToggler::create( createCheckbox(hack->value.boolValue), createCheckbox(!hack->value.boolValue), this, menu_selector(PrismUIButton::onBoolBtn) ); + if (currentLanguage->isRTL()) { + checkbox->setPositionX(280); + } //checkbox->setUserData(reinterpret_cast(hack)); menu->addChild(checkbox); } else if (hack->value.type == ValueType::Int && hack->type != "dropdown" && hack->type != "char" && !name.starts_with("Button Position")) { int min = obj.get("min").unwrapOr(val).asInt().unwrapOrDefault(); int max = obj.get("max").unwrapOr(val).asInt().unwrapOrDefault(); label->limitLabelWidth(120, 0.5F, .1F); - // TODO: add + and - buttons because according to some, android keyboard is BAD! m_input = TextInput::create(150.f, "...", "PrismMenu.fnt"_spr); m_input->setString(std::to_string(hack->value.intValue)); m_input->setFilter("0123456789"); m_input->setMaxCharCount(20); - m_input->setPositionX(37); + m_input->setPositionX((currentLanguage->isRTL()) ? 243 : 37); auto incBtnSpr = cocos2d::extension::CCScale9Sprite::create("square02b_001.png", { 0.0f, 0.0f, 80.0f, 80.0f }); incBtnSpr->setContentSize({ 50.0f, 50.0f }); @@ -171,14 +184,14 @@ bool PrismUIButton::init(HackItem* hack) { this, menu_selector(PrismUIButton::onIncBtn) ); - incBtn->setPositionX(124); + incBtn->setPositionX((currentLanguage->isRTL()) ? 156 : 124); menu->addChild(incBtn); auto decBtn = CCMenuItemSpriteExtra::create( decBtnSpr, this, menu_selector(PrismUIButton::onDecBtn) ); - decBtn->setPositionX(100); + decBtn->setPositionX((currentLanguage->isRTL()) ? 180 : 100); menu->addChild(decBtn); label->setPositionX(140); @@ -188,8 +201,8 @@ bool PrismUIButton::init(HackItem* hack) { m_input->setString(Utils::enumKeyToString(static_cast(hack->value.intValue))); m_input->setCommonFilter(CommonFilter::Any); m_input->setMaxCharCount(1); - m_input->setPositionX(37); - label->setPositionX(117); + m_input->setPositionX((currentLanguage->isRTL()) ? 243 : 37); + label->setPositionX((currentLanguage->isRTL()) ? 167 : 117); auto changeBtnSpr = cocos2d::extension::CCScale9Sprite::create("square02b_001.png", { 0.0f, 0.0f, 80.0f, 80.0f }); changeBtnSpr->setContentSize({ 50.0f, 50.0f }); @@ -207,11 +220,10 @@ bool PrismUIButton::init(HackItem* hack) { this, menu_selector(PrismUIButton::onCharBtn) ); - changeBtn->setPositionX(100); + changeBtn->setPositionX((currentLanguage->isRTL()) ? 180 : 100); menu->addChild(changeBtn); } else if (hack->value.type == ValueType::Float || name.starts_with("Button Position")) { auto value = (name.starts_with("Button Position")) ? hack->value.intValue : hack->value.floatValue; - label->limitLabelWidth(64, 0.5F, .1F); int min = obj.get("min").unwrapOr(val).asInt().unwrapOrDefault(); int max = obj.get("max").unwrapOr(val).asInt().unwrapOrDefault(); @@ -220,11 +232,11 @@ bool PrismUIButton::init(HackItem* hack) { name.starts_with("Button Position") ? std::to_string(value) : Utils::setPrecision(value, 3) ); m_input->setFilter("0123456789."); - m_input->setPositionX(21); + m_input->setPositionX((currentLanguage->isRTL()) ? 259 : 21); m_input->setMaxCharCount(20); - label->setPositionX(190); + label->setPositionX((currentLanguage->isRTL()) ? 85 : 190); m_slider = Slider::create(this, menu_selector(PrismUIButton::onFloatBtn), .6f); - m_slider->setPositionX(122); + m_slider->setPositionX((currentLanguage->isRTL()) ? 150 : 122); m_slider->setValue(Utils::getSliderValue(value, min, max, false)); menu->addChild(m_slider); } else if (hack->type == "dropdown" || hack->value.type == ValueType::Custom) { @@ -233,8 +245,7 @@ bool PrismUIButton::init(HackItem* hack) { //const char* caption, int width, bool absolute, const char* font, const char* texture, float height, float scale //currentLanguage->name(name).c_str() auto btnSpr = cocos2d::extension::CCScale9Sprite::create("square02b_001.png", { 0.0f, 0.0f, 80.0f, 80.0f }); - auto btnlabel = CCLabelBMFont::create(currentLanguage->name(name).c_str(), "PrismMenu.fnt"_spr); - + auto btnlabel = Label::create(currentLanguage->name(name).c_str(), currentLanguage->getLangID()); Themes::RGBAToCC(PrismUI::GetTheme()["Text"], btnlabel); btnlabel->limitLabelWidth(250, 1.0F, .1F); btnSpr->setContentSize({ 300.0f, 50.0f }); @@ -247,7 +258,7 @@ bool PrismUIButton::init(HackItem* hack) { this, menu_selector(PrismUIButton::onBtn) ); - btn->setPositionX(63); + btn->setPositionX((currentLanguage->isRTL()) ? 217 : 63); menu->addChild(btn); label->removeFromParentAndCleanup(true); } else if (type == "dropdown") { @@ -257,7 +268,7 @@ bool PrismUIButton::init(HackItem* hack) { values = Themes::getCurrentThemes(); } Dropdown* dropdown; - label->setPositionX(180); + label->setPositionX((currentLanguage->isRTL()) ? 110 : 180); if (hack->name == "Macro") { auto incBtnSpr = cocos2d::extension::CCScale9Sprite::create("square02b_001.png", { 0.0f, 0.0f, 80.0f, 80.0f }); incBtnSpr->setContentSize({ 50.0f, 50.0f }); @@ -282,7 +293,7 @@ bool PrismUIButton::init(HackItem* hack) { } else { dropdown = Dropdown::create(values, hack, menu_selector(PrismUIButton::onDropdownBtn), nullptr); } - dropdown->menu->setPosition({78, 0}); + dropdown->menu->setPosition({(currentLanguage->isRTL()) ? 202.F : 78.F, 0}); dropdown->menu->setScale(.75F); //cocos::handleTouchPriority(dropdown->menu); @@ -335,6 +346,23 @@ void PrismUIButton::onBoolBtn(CCObject* ret) { if (name == "Instant Complete" && m_hack->value.boolValue) { FLAlertLayer::create(nullptr, "Cheater!", "Just a warning, you will be banned off leaderboards if you use this on rated levels. Consider this your warning.", "OK", nullptr)->show(); } + // "optimization" + if (name == "Hide Player") { + if (auto PL = PlayLayer::get()) { + PL->m_player1->setVisible(!m_hack->value.boolValue); + PL->m_player2->setVisible(!m_hack->value.boolValue); + } + } + if (name == "Force Platformer Mode") { + if (auto PL = PlayLayer::get()) { + PL->m_player1->togglePlatformerMode(m_hack->value.boolValue); + PL->m_player2->togglePlatformerMode(m_hack->value.boolValue); + #ifndef GEODE_IS_DESKTOP + PL->m_uiLayer->togglePlatformerMode(m_hack->value.boolValue); + // for some reason i was trying to look for togglePlatformerMode when I realized that i couldve just literally used the func as its android, im so mad + #endif + } + } if (!m_hack->opcodes.empty()) { Hacks::applyPatches(name, m_hack->opcodes, m_hack->value.boolValue); } @@ -443,12 +471,22 @@ void PrismUIButton::onBtn(CCObject* ret) { auto scene = CCScene::get(); if (!scene) return; - auto prismUI = static_cast(scene->getChildByID("prism-menu")); + auto prismUI = typeinfo_cast(scene->getChildByID("prism-menu")); + if (!prismUI) return; if (name == "Restore Defaults") { - Mod::get()->setSettingValue("skip-intro", false); - Hacks::processJSON(true); - prismUI->onClose(ret); - //GatoSim::onButton(); + geode::createQuickPopup( + "Confirm", + fmt::format("Are you sure you want to restore defaults?\nThis will reset all settings back to their default values, but will not clear themes, macros, etc..."), + "Yes", "No", + [prismUI, ret](auto, bool btn2) { + if (!btn2) { // yes + Mod::get()->setSettingValue("skip-intro", false); + Hacks::processJSON(true); + prismUI->onClose(ret); + //GatoSim::onButton(); + } + }, true, true + ); } else if (name == "Import Theme") { file::pick(file::PickMode::OpenFile, file::FilePickOptions { .filters = { file::FilePickOptions::Filter { @@ -477,7 +515,6 @@ void PrismUIButton::onBtn(CCObject* ret) { } }); } else if (name == "Import Macro") { - file::pick(file::PickMode::OpenFile, file::FilePickOptions { .filters = { file::FilePickOptions::Filter { .description = "Macro (*.gdr)", @@ -544,6 +581,30 @@ void PrismUIButton::onBtn(CCObject* ret) { FLAlertLayer::create("Error", "You currently do not have a macro selected.","OK")->show(); } } + } else if (name == "Export to JSON") { + auto macroItem = Hacks::getHack("Macro"); + if (macroItem != nullptr) { + std::vector defaultVal = { "" }; + std::string value = macroItem->data["values"].asArray().unwrapOr(defaultVal)[0].asString().unwrapOrDefault(); + if (value != "None") { + current_macro = MacroManager::getMacro(value); + current_macro.isEnabled = false; + if (current_macro.inputs.empty()) return FLAlertLayer::create("Error", "Your macro must have inputs. Try selecting the macro with playback enabled and enter a level, then try again.", "OK")->show(); + if (!value.ends_with("gdr")) return FLAlertLayer::create("Error", "Your macro either is already a JSON file, or is invalid!", "OK")->show(); + auto dotPos = value.find_last_of('.'); + std::string newValue = value; + if (dotPos != std::string::npos && dotPos != 0) { + newValue = newValue.substr(0, dotPos); + } + if (MacroManager::createMacro(newValue, current_macro.description, std::to_string(current_macro.framerate), true)) { + if (MacroManager::exportMacro(value + ".json", current_macro)) { + FLAlertLayer::create("Success!", "The macro has been exported as JSON","OK")->show(); + } + } + } else { + FLAlertLayer::create("Error", "You currently do not have a macro selected.","OK")->show(); + } + } } else { // NO SPOILERS! ///GatoSim::onButton(); @@ -614,14 +675,15 @@ void PrismUI::CreateHackItem(HackItem* hack) { //if (!((Hacks::isHackEnabled("Enable Patching") && obj.contains("winOnly")) || !obj.contains("winOnly") || name == "Enable Patching")) return; auto btn = PrismUIButton::create(hack, m_currentLang.get()); float indexY = (currentI * -28) + 310; - // TODO: create custom sprite so people dont complain //auto infoSpr = CCSprite::createWithSpriteFrameName("GJ_infoIcon_001.png"); auto infoSpr = CCSprite::create("infoIcon.png"_spr); Themes::RGBAToCC(GetTheme()["InfoButton"], infoSpr); //infoSpr->setScale(.5F); auto infoBtn = CCMenuItemSpriteExtra::create(infoSpr, this, menu_selector(PrismUIButton::onInfoBtn)); infoBtn->setUserData(reinterpret_cast(hack)); - m_content->addChild(infoBtn); + if (Hacks::isHackEnabled("Show Tooltips")) { + m_content->addChild(infoBtn); + } btn->setPositionY(indexY); m_content->addChild(btn); @@ -633,7 +695,7 @@ void PrismUI::CreateHackItem(HackItem* hack) { m_scrollLayer->m_contentLayer->setContentSize(m_content->getContentSize()); } m_scrollLayer->m_contentLayer->setContentSize({m_content->getContentSize().width, getContentSizeBasedOnCategory(currentI + 1)}); - infoBtn->setPosition({280, indexY}); + infoBtn->setPosition({(m_currentLang->isRTL()) ? 0.F : 280.F, indexY}); //m_content->setPositionY(calculateYPosition(currentI)); m_content->setPositionY(getYPosBasedOnCategory(currentI + 1)); m_scrollLayer->moveToTop(); @@ -766,9 +828,9 @@ void PrismUIButton::intChanged() { //CCApplication::sharedApplication()->toggleVerticalSync(false); GM->updateCustomFPS();*///// } else if (name == "Button Position X") { - prismButton->setPositionX(m_hack->value.intValue); + static_cast(prismButton)->setSpritePosX(m_hack->value.intValue); } else if (name == "Button Position Y") { - prismButton->setPositionY(m_hack->value.intValue); + static_cast(prismButton)->setSpritePosY(m_hack->value.intValue); } else if (name == "TPS Bypass") { Hacks::setTPS(m_hack->value.intValue); } @@ -873,12 +935,12 @@ void PrismUI::RegenCategory() { break; case 6: { // Settings jsonArray = matjson::parse(Hacks::getSettings()).unwrapOrDefault().asArray().unwrapOrDefault(); - auto createdByLabel = CCLabelBMFont::create(m_currentLang->name("Prism Menu by Firee").c_str(), "PrismMenu.fnt"_spr); + auto createdByLabel = Label::create(m_currentLang->name("Prism Menu by Firee").c_str(), m_currentLang->getLangID()); auto versionLabel = CCLabelBMFont::create("Unknown.", "PrismMenu.fnt"_spr); float indexY = (currentI * -28) + 310; createdByLabel->limitLabelWidth(150, 1.0F, .2F); - createdByLabel->setPosition({63, indexY + 15}); - versionLabel->setPosition({63, indexY}); + createdByLabel->setPosition({(m_currentLang->isRTL()) ? 220.F : 63.F, indexY + 15}); + versionLabel->setPosition({(m_currentLang->isRTL()) ? 220.F : 63.F, indexY}); Themes::RGBAToCC(GetTheme()["Text"], createdByLabel); Themes::RGBAToCC(GetTheme()["Text"], versionLabel); #ifndef DEV_BUILD @@ -927,13 +989,14 @@ void PrismUI::CreateButton(const char* name, int menuIndex) { auto menu = CCMenu::create(); float scale = 25.0F; // used to be 35.0F - auto label = CCLabelBMFont::create(name, "PrismMenu.fnt"_spr); + auto label = Label::create(name, m_currentLang->getLangID()); //label->addChild(invisBG); //label->limitLabelWidth(72, 1.0F, .2F); + label->setAnchorPointTTF({0, 0}); label->limitLabelWidth(72, 0.5F, .2F); auto button = CCMenuItemSpriteExtra::create(label, this, menu_selector(PrismUI::onSideButton)); - button->setContentSize({90.0f, scale}); label->setPosition({90.0f / 2, scale / 2}); + button->setContentSize({90.0f, scale}); auto buttonBG = cocos2d::extension::CCScale9Sprite::create("square02b_001.png", { 0.0f, 0.0f, 80.0f, 80.0f }); buttonBG->setContentSize({ 90.0f, 35.0F }); // used to be scale buttonBG->setScaleY(.83F); @@ -948,8 +1011,9 @@ void PrismUI::CreateButton(const char* name, int menuIndex) { offsetY -= 4.0F; //float otherOffsetY = 97.F; float otherOffsetY = 98.F; - buttonBG->setPosition(-163, (menuIndex * offsetY) + otherOffsetY); - button->setPosition(-163, (menuIndex * offsetY) + otherOffsetY); + int posTo = (m_currentLang->isRTL()) ? 167 : -163; + buttonBG->setPosition(posTo, (menuIndex * offsetY) + otherOffsetY); + button->setPosition(posTo, (menuIndex * offsetY) + otherOffsetY); buttonBG->setID(fmt::format("prism-nav-bg-{}", menuIndex)); button->setID(fmt::format("prism-nav-btn-{}", menuIndex)); button->setUserData(button); @@ -995,7 +1059,7 @@ void PrismUIButton::onInfoBtn(CCObject* ret) { } if (lines != nullptr && title != nullptr) { // probably a bad idea memory-wise - auto newTitle = CCLabelBMFont::create(name.c_str(), "PrismMenu.fnt"_spr); + auto newTitle = Label::create(name.c_str(), currentLanguage->getLangID());//CCLabelBMFont::create(name.c_str(), "PrismMenu.fnt"_spr); newTitle->setPosition({title->getPositionX(), title->getPositionY() - 15}); newTitle->limitLabelWidth(256, 0.75F, 0.25F); newTitle->setZOrder(title->getZOrder()); @@ -1011,15 +1075,24 @@ void PrismUIButton::onInfoBtn(CCObject* ret) { 280.F, { 0.5, 0 }, 20.F, false);*/ //const std::string& font, const std::string& text, const float scale, const float width, auto winSize = cocos2d::CCDirector::sharedDirector()->getWinSize(); - auto newLines = SimpleTextArea::create("A", "PrismMenu.fnt"_spr, 0.5F, winSize.width / 2.2F); // 260.0F - newLines->setText(desc.c_str()); - newLines->setAlignment(CCTextAlignment::kCCTextAlignmentCenter); - newLines->setScale(calculateScale(desc, 25, .75F, .25F)); - // ok geode broke AxisLayout, thats nice - newLines->setPosition({(winSize.width / 2), (winSize.height / 2) + 10}); // 160 - 220 - newLines->setZOrder(lines->getZOrder()); - lines->removeFromParentAndCleanup(true); - flAlert->m_mainLayer->addChild(newLines); + if (!currentLanguage->isRTL()) { + auto newLines = SimpleTextArea::create("A", "PrismMenu.fnt"_spr, 0.5F, winSize.width / 2.2F); // 260.0F + newLines->setText(desc.c_str()); + newLines->setAlignment(CCTextAlignment::kCCTextAlignmentCenter); + newLines->setScale(calculateScale(desc, 25, .75F, .25F)); + // ok geode broke AxisLayout, thats nice + newLines->setPosition({(winSize.width / 2), (winSize.height / 2) + 10}); // 160 - 220 + newLines->setZOrder(lines->getZOrder()); + lines->removeFromParentAndCleanup(true); + flAlert->m_mainLayer->addChild(newLines); + } else { + auto newLines = Label::create(desc.c_str(), currentLanguage->getLangID()); + newLines->setScale(calculateScale(desc, 25, .75F, .25F)); + newLines->setPosition({(winSize.width / 2), (winSize.height / 2) + 10}); + newLines->setZOrder(lines->getZOrder()); + lines->removeFromParentAndCleanup(true); + flAlert->m_mainLayer->addChild(newLines); + } flAlert->show(); } @@ -1034,12 +1107,12 @@ matjson::Value PrismUI::GetTheme() { } bool PrismUI::init(float _w, float _h) { + this->m_noElasticity = !Hacks::isHackEnabled("Menu Transition"); auto winSize = cocos2d::CCDirector::sharedDirector()->getWinSize(); m_currentLang = Lang::getLanguage(); float menuScale = Hacks::getHack("Menu Scale")->value.floatValue; this->m_pLrSize = cocos2d::CCSize { _w, _h }; - // this->m_pLrSize = cocos2d::CCSize { _w * menuScale, _h * menuScale }; if (!this->initWithColor({ 0, 0, 0, 105 })) return false; this->m_mainLayer = cocos2d::CCLayer::create(); this->addChild(m_mainLayer); @@ -1076,18 +1149,26 @@ bool PrismUI::init(float _w, float _h) { auto prismButton = CCScene::get()->getChildByID("prism-icon"); if (prismButton != nullptr) { - static_cast(prismButton->getChildren()->objectAtIndex(0))->setEnabled(false); + static_cast(prismButton)->setEnabled(false); + //static_cast(prismButton->getChildren()->objectAtIndex(0))->setEnabled(false); } auto sideBar = cocos2d::extension::CCScale9Sprite::create("square02b_001.png", { 0.0f, 0.0f, 80.0f, 80.0f }); sideBar->setContentSize({ 100.0f, 230.0f }); - //sideBar->setPosition(125, bg->getContentSize().height / 2); - sideBar->setPosition(60, _h / 2); + if (m_currentLang->isRTL()) { + sideBar->setPosition(_w - 60, _h / 2); + } else { + sideBar->setPosition(60, _h / 2); + } Themes::RGBAToCC(GetTheme()["TableRowBg"], sideBar); auto buttonBG = cocos2d::extension::CCScale9Sprite::create("square02b_001.png", { 0.0f, 0.0f, 80.0f, 80.0f }); buttonBG->setContentSize({ 320.0f, 230.0f }); - buttonBG->setPosition(_w - 173, _h / 2); + if (m_currentLang->isRTL()) { + buttonBG->setPosition(175, _h / 2); + } else { + buttonBG->setPosition(_w - 173, _h / 2); + } Themes::RGBAToCC(GetTheme()["TableRowBg"], buttonBG); bg->addChild(sideBar); @@ -1144,7 +1225,8 @@ void PrismUI::keybackClicked() { void PrismUI::onClose(cocos2d::CCObject* pSender) { auto prismButton = CCScene::get()->getChildByID("prism-icon"); if (prismButton != nullptr) { - static_cast(prismButton->getChildren()->objectAtIndex(0))->setEnabled(true); + static_cast(prismButton)->setEnabled(true); + //static_cast(prismButton->getChildren()->objectAtIndex(0))->setEnabled(true); } if (PlayLayer::get() != nullptr) { // attempt to fix the stupid issue #ifndef GEODE_IS_DESKTOP diff --git a/src/Utils.hpp b/src/Utils.hpp index f8b26a9..8f56a8e 100644 --- a/src/Utils.hpp +++ b/src/Utils.hpp @@ -1,6 +1,6 @@ #pragma once -#include "Geode/cocos/robtop/keyboard_dispatcher/CCKeyboardDelegate.h" +#include "Misc/RTLSupport.hpp" #include using namespace geode::prelude; @@ -24,6 +24,114 @@ class Utils { } #endif } + + static bool isRTLChar(uint32_t c) { + // This is a simplified check. You might need a more comprehensive list + // based on the specific Arabic characters your engine supports. + return (c >= 0x0600 && c <= 0x06FF) || (c >= 0x0750 && c <= 0x077F) || (c >= 0xFB50 && c <= 0xFDFF) || (c >= 0xFE70 && c <= 0xFEFF); + } + + // Helper function to determine if a character is a strong LTR character + static bool isLTRChar(uint32_t c) { + // Simplified check for common LTR characters (English, digits, etc.) + return (c >= 0x0041 && c <= 0x005A) || (c >= 0x0061 && c <= 0x007A) || (c >= 0x0030 && c <= 0x0039); + } + + // Helper function to convert UTF-8 to UTF-32 + static std::vector utf8ToUtf32(const std::string& utf8) { + std::vector utf32; + size_t i = 0; + while (i < utf8.length()) { + uint32_t c = 0; + if ((utf8[i] & 0x80) == 0) { + c = utf8[i]; + i++; + } else if ((utf8[i] & 0xE0) == 0xC0) { + c = ((utf8[i] & 0x1F) << 6) | (utf8[i + 1] & 0x3F); + i += 2; + } else if ((utf8[i] & 0xF0) == 0xE0) { + c = ((utf8[i] & 0x0F) << 12) | ((utf8[i + 1] & 0x3F) << 6) | (utf8[i + 2] & 0x3F); + i += 3; + } else if ((utf8[i] & 0xF8) == 0xF0) { + c = ((utf8[i] & 0x07) << 18) | ((utf8[i + 1] & 0x3F) << 12) | ((utf8[i + 2] & 0x3F) << 6) | (utf8[i + 3] & 0x3F); + i += 4; + } else { + // Handle error (invalid UTF-8) - replace with a replacement character or throw an exception + c = 0xFFFD; // Replacement character + i++; + } + utf32.push_back(c); + } + return utf32; + } + + // Helper function to convert UTF-32 to UTF-8 + static std::string utf32ToUtf8(const std::vector& utf32) { + std::string utf8; + for (uint32_t c : utf32) { + if (c <= 0x7F) { + utf8 += static_cast(c); + } else if (c <= 0x7FF) { + utf8 += static_cast(0xC0 | (c >> 6)); + utf8 += static_cast(0x80 | (c & 0x3F)); + } else if (c <= 0xFFFF) { + utf8 += static_cast(0xE0 | (c >> 12)); + utf8 += static_cast(0x80 | ((c >> 6) & 0x3F)); + utf8 += static_cast(0x80 | (c & 0x3F)); + } else if (c <= 0x10FFFF) { + utf8 += static_cast(0xF0 | (c >> 18)); + utf8 += static_cast(0x80 | ((c >> 12) & 0x3F)); + utf8 += static_cast(0x80 | ((c >> 6) & 0x3F)); + utf8 += static_cast(0x80 | (c & 0x3F)); + } else { + // Handle error (invalid UTF-32) + utf8 += "\xEF\xBF\xBD"; // Replacement character + } + } + return utf8; + } + + static std::string simulateRTL(const std::string& text) { + // 1. Convert UTF-8 to UTF-32 for easier character handling + std::vector utf32Text = utf8ToUtf32(text); + + // 2. Identify "runs" of characters with the same directionality + std::vector> rtlRuns; + size_t start = 0; + for (size_t i = 0; i < utf32Text.size(); ++i) { + if (isRTLChar(utf32Text[i])) { + if (i == start || !isRTLChar(utf32Text[i - 1])) { + start = i; + } + } else if (isLTRChar(utf32Text[i])) { + if (i > start && isRTLChar(utf32Text[i - 1])) { + rtlRuns.push_back({start, i - 1}); + } + } else { + // Treat neutral characters (spaces, punctuation) based on surrounding context + if (i > start && isRTLChar(utf32Text[i-1])) { + rtlRuns.push_back({start, i - 1}); + } + start = i + 1; + } + } + if (start < utf32Text.size() && isRTLChar(utf32Text.back())) { + rtlRuns.push_back({start, utf32Text.size() - 1}); + } + + // 3. Reverse the order of characters within each RTL run + for (const auto& run : rtlRuns) { + std::reverse(utf32Text.begin() + run.first, utf32Text.begin() + run.second + 1); + } + + // 4. Convert back to UTF-8 + return utf32ToUtf8(utf32Text); + } + static std::string reverseString(const std::string& input) { + std::string reversed = input; + std::reverse(reversed.begin(), reversed.end()); + return reversed; + } static std::string setPrecision(float value, int streamsize) { std::ostringstream oss; oss << std::fixed << std::setprecision(streamsize) << value; diff --git a/src/hacks.cpp b/src/hacks.cpp index 18e78c7..2e5c886 100644 --- a/src/hacks.cpp +++ b/src/hacks.cpp @@ -227,15 +227,32 @@ class $modify(PlayLayer) { }; */ -/* +float currentTPS = 240.F; +// because FOR SOME REASON PATCHING DOESNT WORK! +#ifdef GEODE_IS_MOBILE #include -class $modify(GJBaseGameLayer) { +class $modify(PrismTPS, GJBaseGameLayer) { float getModifiedDelta(float dt) { - log::debug("the dt is {}", dt); - return GJBaseGameLayer::getModifiedDelta(dt); + auto tps = 1.f / currentTPS; + double timer; + if (m_resumeTimer < 1) { + timer = (double)dt + m_extraDelta; + } else { + m_resumeTimer--; + timer = m_extraDelta; + } + if (m_gameState.m_timeWarp < 1.0) { + dt = (double)(m_gameState.m_timeWarp * tps); + } else { + dt = tps; + } + dt *= (double)(int)((double)(float)timer / dt); + m_extraDelta = (double)(float)timer - dt; + return (float)dt; } }; -*/ +#endif + bool hasChangedTPS = false; void Hacks::setTPS(int tps) { // im actually too lazy to hook GJBaseGameLayer::update and do the calculations, ok!? @@ -243,6 +260,8 @@ void Hacks::setTPS(int tps) { hasChangedTPS = true; } if (!hasChangedTPS) return; + currentTPS = tps; +#ifdef GEODE_IS_WINDOWS #if defined(GEODE_IS_WINDOWS) // why is windows the only one with 1 addr!? uintptr_t addr1 = 0x607008; uintptr_t addr2 = 0x0; @@ -250,8 +269,8 @@ void Hacks::setTPS(int tps) { uintptr_t addr1 = 0x4640fc; // float uintptr_t addr2 = 0x4640f0; // double #elif defined(GEODE_IS_ANDROID64) - uintptr_t addr1 = 0x8384c0; // float - uintptr_t addr2 = 0x8384b8; // double + uintptr_t addr1 = 0x8384b8; // float + uintptr_t addr2 = 0x8384c0; // double #elif defined(GEODE_IS_INTEL_MAC) uintptr_t addr2 = 0x7e9c60; // double TODO uintptr_t addr1 = 0x7e9ac0; // float TODO @@ -300,6 +319,7 @@ void Hacks::setTPS(int tps) { } } } +#endif log::debug("Changed TPS to {}", tps); // oh and uhh, this is expanded from gdmo ok. please dont hurt me maxnut