From 4b1e8cd7b55dcc4e6a1a04fabef86c60ced70787 Mon Sep 17 00:00:00 2001 From: user666 Date: Tue, 10 Sep 2024 22:12:08 +0400 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D1=8C=D1=82?= =?UTF-8?q?=D0=B5=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=B5=D0=BA=D1=82=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build.yml | 91 +++++++ .gitignore | 66 +++++ CMakeLists.txt | 34 +++ CMakeSettings.json | 16 ++ README.md | 25 ++ about.md | 10 + logo.png | Bin 0 -> 88510 bytes mod.json | 16 ++ src/_fs.hpp | 25 ++ src/_main.hpp | 108 ++++++++ src/main.cpp | 484 ++++++++++++++++++++++++++++++++++++ 11 files changed, 875 insertions(+) create mode 100644 .github/workflows/build.yml create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 CMakeSettings.json create mode 100644 README.md create mode 100644 about.md create mode 100644 logo.png create mode 100644 mod.json create mode 100644 src/_fs.hpp create mode 100644 src/_main.hpp create mode 100644 src/main.cpp diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..fa3315c --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,91 @@ +name: Build Geode Mod + +permissions: + contents: write + +on: + workflow_dispatch: + push: + branches: + - '**' + +jobs: + + build: + continue-on-error: true # continue even if build failed for some platform + strategy: + + fail-fast: false + matrix: + config: + - name: Windows + os: windows-latest + + - name: macOS + os: macos-latest + + - name: Android64 + os: ubuntu-latest + target: Android64 + + - name: Android32 + os: ubuntu-latest + target: Android32 + + name: ${{ matrix.config.name }} + runs-on: ${{ matrix.config.os }} + steps: + - uses: actions/checkout@v3 + + - name: Build the mod + uses: geode-sdk/build-geode-mod@main + with: + target: ${{ matrix.config.target }} + combine: true + + upload: + name: Combine and upload builds + runs-on: ubuntu-latest + needs: ['build'] + steps: + + - name: "Combine builds" + uses: geode-sdk/build-geode-mod/combine@main + id: build + + - name: "Upload artifact" + uses: actions/upload-artifact@v4 + with: + name: Build Output + path: ${{ steps.build.outputs.build-output }} + + - name: "Set up Git repository" + uses: actions/checkout@v2 + + - name: "Development Release" + uses: ncipollo/release-action@v1 + with: + name: "Development Release" + body: | + Release of success build for latest commit on `${{ github.head_ref || github.ref_name }}`. + The build workflow run for this release goes in [#${{ github.run_id }}](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) + tag: "nightly" + prerelease: true + allowUpdates: true + artifactErrorsFailBuild: true + artifacts: "${{steps.build.outputs.build-output}}/*" + + - name: "Get mod properties" + id: json_properties + uses: ActionsTools/read-json-action@main + with: + file_path: "mod.json" + + - name: "Try Release Version" + uses: ncipollo/release-action@v1 + with: + generateReleaseNotes: true + tag: "${{steps.json_properties.outputs.version}}" + artifacts: "${{steps.build.outputs.build-output}}/*" + artifactErrorsFailBuild: true + allowUpdates: false \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bc40f45 --- /dev/null +++ b/.gitignore @@ -0,0 +1,66 @@ +out + +# Prerequisites +*.d + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app + +# Macos be like +**/.DS_Store + +# Cache files for Sublime Text +*.tmlanguage.cache +*.tmPreferences.cache +*.stTheme.cache + +# Ignore build folders +**/build +# Ignore platform specific build folders +build-*/ + +# Workspace files are user-specific +*.sublime-workspace + +# ILY vscode +**/.vscode + +# Local History for Visual Studio Code +.history/ + +# clangd +.cache/ + +# Visual Studio +.vs/ + +# CLion +.idea/ +/cmake-build-*/ \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..e770bd4 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,34 @@ +cmake_minimum_required(VERSION 3.21) +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_OSX_ARCHITECTURES "arm64;x86_64") +set(CMAKE_CXX_VISIBILITY_PRESET hidden) + +project(CubesSlasher VERSION 1.0.0) + +include_directories(src) +add_library(${PROJECT_NAME} SHARED + src/main.cpp + # Add any extra C++ source files here +) + +if (NOT DEFINED ENV{GEODE_SDK}) + message(FATAL_ERROR "Unable to find Geode SDK! Please define GEODE_SDK environment variable to point to Geode") +else() + message(STATUS "Found Geode: $ENV{GEODE_SDK}") +endif() + +# my bindings... https://github.com/user95401/bindings +include("$ENV{GEODE_SDK}/cmake/CPM.cmake") +CPMAddPackage(NAME "bindings" + GITHUB_REPOSITORY "user95401/bindings" + GIT_TAG "main" + DOWNLOAD_ONLY YES + NO_CACHE YES +) + +set(GEODE_BINDINGS_REPO_PATH ${bindings_SOURCE_DIR}) + +add_subdirectory($ENV{GEODE_SDK} ${CMAKE_CURRENT_BINARY_DIR}/geode) + +setup_geode_mod(${PROJECT_NAME}) diff --git a/CMakeSettings.json b/CMakeSettings.json new file mode 100644 index 0000000..2dd4a22 --- /dev/null +++ b/CMakeSettings.json @@ -0,0 +1,16 @@ +{ + "configurations": [ + { + "name": "x64-Clang-Release", + "generator": "Ninja", + "configurationType": "RelWithDebInfo", + "buildRoot": "${projectDir}\\out\\build\\${name}", + "installRoot": "${projectDir}\\out\\install\\${name}", + "cmakeCommandArgs": "", + "buildCommandArgs": "", + "ctestCommandArgs": "", + "inheritEnvironments": [ "clang_cl_x64_x64" ], + "variables": [] + } + ] +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..13e833d --- /dev/null +++ b/README.md @@ -0,0 +1,25 @@ +# Player Particles + +- __customize player particles for drag, land etc__ + +add a ui and use saved data system to make able u create own particles for basic player effects + +- __.txt file "particle from string" loader__ + +u can create `EFFECT_NAME.txt` instead of `EFFECT_NAME.plist` to use **string system** instead xml dict. and also u can edit any other effect by that way. + +the mod's logo + +## Build instructions +For more info, see [docs](https://docs.geode-sdk.org/getting-started/create-mod#build) +```sh +# Assuming you have the Geode CLI set up already +geode build +``` + +### Resources +* [Geode SDK Documentation](https://docs.geode-sdk.org/) +* [Geode SDK Source Code](https://github.com/geode-sdk/geode/) +* [Geode CLI](https://github.com/geode-sdk/cli) +* [Bindings](https://github.com/geode-sdk/bindings/) +* [Dev Tools](https://github.com/geode-sdk/DevTools) diff --git a/about.md b/about.md new file mode 100644 index 0000000..7509400 --- /dev/null +++ b/about.md @@ -0,0 +1,10 @@ +# Player Particles + +- __customize player particles for drag, land etc__ + +add a ui and use saved data system to make able u create own particles for basic player effects + +- __.txt file "particle from string" loader__ + +u can create `EFFECT_NAME.txt` instead of `EFFECT_NAME.plist` to use **string system** instead xml dict. and also u can edit any other effect by that way. + diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..566d376a18cdc19fc08ab9c1279d9a7301533e28 GIT binary patch literal 88510 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�&i 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 Ef)#EAY5)KL literal 0 HcmV?d00001 diff --git a/mod.json b/mod.json new file mode 100644 index 0000000..aaebb0d --- /dev/null +++ b/mod.json @@ -0,0 +1,16 @@ +{ + "geode": "3.5.0", + "gd": { + "win": "2.206", + "android": "2.206", + "mac": "2.206", + "ios": "2.206" + }, + "id": "user95401.player_particles", + "name": "Player Particles", + "version": "v1.0.0-beta.1", + "developer": "user95401", + "description": "customize player particles for drag, land etc", + "tags": [ "gameplay", "offline", "enhancement", "interface", "utility", "customization", "developer" ], + +} diff --git a/src/_fs.hpp b/src/_fs.hpp new file mode 100644 index 0000000..12d17a5 --- /dev/null +++ b/src/_fs.hpp @@ -0,0 +1,25 @@ +#pragma once +namespace fs { +//#include "libs/glob.hpp" + using namespace std::filesystem; + inline std::error_code last_err_code; + template inline auto rtnWithErrLog(T rtn, std::string log) { log::error("{}", log); return rtn; } + inline auto exists(path path) { + return cocos::fileExistsInSearchPaths(path.string().c_str()); + } + inline auto read(path path) { + unsigned long file_size = 0; + auto buffer = CCFileUtils::sharedFileUtils()->getFileData(path.string().c_str(), "rb", &file_size); + std::string data = "read failed..."; + if (buffer && file_size != 0) data = std::string(reinterpret_cast(buffer), file_size); + return data; + } + inline auto rename(path old_path, path new_path) { + std::filesystem::rename(old_path, new_path, last_err_code); + log::debug( + "{}(\n\told_path \"{}\", \n\told_path \"{}\"\n): last_err_code={}, last_err_code.message={}", + __func__, old_path, new_path, last_err_code, last_err_code.message() + ); + return true; + } +} \ No newline at end of file diff --git a/src/_main.hpp b/src/_main.hpp new file mode 100644 index 0000000..1eacfa5 --- /dev/null +++ b/src/_main.hpp @@ -0,0 +1,108 @@ +#pragma once +#include +#include +using namespace geode::prelude; + +#include + +#include <_fs.hpp> + +//lol +#define SETTING(type, key_name) Mod::get()->getSettingValue(key_name) + +#define MEMBER_BY_OFFSET(type, class, offset) *reinterpret_cast(reinterpret_cast(class) + offset) +template constexpr size_t OFFSET_BY_MEMBER(U T::* member) { return (char*)&((T*)nullptr->*member) - (char*)nullptr; } + +#define public_cast(value, member) [](auto* v) { \ + class FriendClass__; \ + using T = std::remove_pointer::type; \ + class FriendeeClass__: public T { \ + protected: \ + friend FriendClass__; \ + }; \ + class FriendClass__ { \ + public: \ + auto& get(FriendeeClass__* v) { return v->member; } \ + } c; \ + return c.get(reinterpret_cast(v)); \ +}(value) + +namespace geode::cocos { + inline std::string frameName(CCNode* node) { + if (node == nullptr) return "NIL_NODE"; + if (auto textureProtocol = dynamic_cast(node)) { + if (auto texture = textureProtocol->getTexture()) { + if (auto spriteNode = dynamic_cast(node)) { + auto* cachedFrames = CCSpriteFrameCache::sharedSpriteFrameCache()->m_pSpriteFrames; + const auto rect = spriteNode->getTextureRect(); + for (auto [key, frame] : CCDictionaryExt(cachedFrames)) { + if (frame->getTexture() == texture && frame->getRect() == rect) { + return key.c_str(); + } + } + } + auto* cachedTextures = CCTextureCache::sharedTextureCache()->m_pTextures; + for (auto [key, obj] : CCDictionaryExt(cachedTextures)) { + if (obj == texture) { + return key.c_str(); + } + } + } + } + auto btnSpriteTry = frameName(getChild(node, 0)); + if ( + btnSpriteTry != "NIL_NODE" + and btnSpriteTry != "CANT_GET_FRAME_NAME" + ) return btnSpriteTry; + return "CANT_GET_FRAME_NAME"; + } + inline auto createDataNode(std::string id, std::string text = "", int tag = 0) { + auto node = CCLabelBMFont::create("", "chatFont.fnt"); + node->setID(id); + node->setString(text.c_str()); + if (tag != 0) node->setTag(tag); + node->setVisible(0); + return node; + } + inline auto findDataNode(CCNode* parent, std::string id) { + auto node = typeinfo_cast(parent->getChildByIDRecursive(id)); + if (node) log::warn("FAILED TO FIND DATA NODE! id: {}", id); + return node; + } +}; + +namespace geode::utils::string { + inline std::vector explode(std::string separator, std::string input) { + std::vector vec; + for (int i{ 0 }; i < input.length(); ++i) { + int pos = input.find(separator, i); + if (pos < 0) { vec.push_back(input.substr(i)); break; } + int count = pos - i; + vec.push_back(input.substr(i, count)); + i = pos + separator.length() - 1; + } + if (vec.size() == 0) vec.push_back(input); + return vec; + } +} + +#include +#include +namespace geode::utils { + template + Iter select_randomly(Iter start, Iter end, RandomGenerator& g) { + std::uniform_int_distribution<> dis(0, std::distance(start, end) - 1); + std::advance(start, dis(g)); + return start; + }; + template + Iter select_randomly(Iter start, Iter end) { + static std::random_device rd; + static std::mt19937 gen(rd()); + return select_randomly(start, end, gen); + } +}; + +#ifdef GEODE_IS_ANDROID +//#define debug error +#endif // GEODE_IS_ANDROID diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..8670d8a --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,484 @@ +#include <_main.hpp> + +std::map defaultEffects; +$execute{ + defaultEffects["dragEffect"] = "30a-1a0.3a0.15a99a90a45a75a20a5a1a0a-300a0a0a0a0a4a3a0a0a1a0.1a1a0.1a1a0.1a1a0a0a0a0a0a0a0a0a0a0a0a1a0a0a0a0a0a0a0a0a0a0a0a0a1a1a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0"; + defaultEffects["shipDragEffect"] = "40a-1a0.3a0.15a133a110a45a94a20a9a1a-350a-300a0a0a0a0a3a2a0a0a1a0.1a1a0.1a1a0.1a1a0a0a0a0a0a0a0a0a0a0a0a1a0a0a0a0a0a0a0a0a0a0a0a0a0a1a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0"; + defaultEffects["landEffect"] = "10a0.02a0a0.6a-1a90a60a150a25a10a0a0a-500a0a0a0a0a5a3a0a0a1a0.1a1a0.1a1a0.1a1a0.5a0a0a0a0a0a0a0a0a0a0a1a0a0a0a0a0a0a0a0a0a0a0a0a0a1a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0"; + defaultEffects["dashEffect"] = "50a-1a0.4a0.2a125a180a0a25a12a0a12a0a0a0a0a0a0a8a4a0a0a1a0a1a0a1a0a1a0a0a1a0a0a0a0a0a0a0a0a1a0a0a0a0a0a0a0a0a0a0a0a0a0a1a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0"; +}; + +class ParticlePopup : public CreateParticlePopup { +public: + inline static Ref sharedObject = nullptr; + static auto get(std::string data) { + if (!sharedObject.data()) sharedObject = CreateParticlePopup::create(nullptr, nullptr); + sharedObject->removeAllChildrenWithCleanup(1); + sharedObject->init(nullptr, nullptr, data); + return sharedObject; + } +}; + +class ParticlePreview : public CCLayerColor { +public: + Ref m_particleRef; + static ParticlePreview* create(std::string fileName) { + ParticlePreview* pRet = new ParticlePreview(); + if (pRet && pRet->init(CCParticleSystemQuad::create(fileName.c_str(), 0))) { + pRet->autorelease(); return pRet; + } + else { + delete pRet; pRet = 0; return 0; + } + }; + static ParticlePreview* createFromString(std::string data) { + ParticlePreview* pRet = new ParticlePreview(); + if (pRet && pRet->init(GameToolbox::particleFromString(data, CCParticleSystemQuad::create(), 0))) { + pRet->autorelease(); return pRet; + } + else { + delete pRet; pRet = 0; return 0; + } + }; + bool init(CCParticleSystemQuad* particleRef) { + + m_particleRef = particleRef; + + CCLayerColor::init(); + setContentSize({ 110.f, 90.f }); + setColor(cocos2d::ccBLACK); + setOpacity(cocos2d::ccWHITE.r); + + auto scroll = CCScrollView::create(this->getContentSize(), m_particleRef); + addChild(scroll); + + m_particleRef->setContentSize(this->getContentSize()); + m_particleRef->setAnchorPoint({ -0.5f, -0.5f }); + + return 1; + } +}; + +#include +class $modify(GJGarageLayerCustomPlayerParticles, GJGarageLayer) { + $override bool init() { + if (!GJGarageLayer::init()) return 0; + + if (auto shards_menu = typeinfo_cast(this->getChildByIDRecursive("shards-menu"))) { + auto openupbtn = CCMenuItemExt::createSpriteExtraWithFrameName( + "edit_eCParticleBtn_001.png", 1.f, [this](CCMenuItem* item) { + + auto createSavedEffectsPopup = [item](std::string effectName) + { + auto popup = createQuickPopup( + effectName.c_str(), + "\n \n \n \n \n \n \n \n ", + "Go Back", nullptr, + [item](auto, auto) { item->activate(); } + ); + popup->setZOrder(CCScene::get()->getChildrenCount()); + popup->m_mainLayer->setPositionX(56.f); + popup->m_buttonMenu->setPositionX(100.f + popup->m_buttonMenu->getPositionX()); + + auto subbg = CCScale9Sprite::create("GJ_square07.png"); + subbg->setPosition(popup->getContentSize() / 2); + subbg->setAnchorPoint({ 0.625f, 0.5f }); + subbg->setContentSize({ 479.f, 292.f }); + popup->m_mainLayer->addChild(subbg); + + auto subbgbackdrop = CCScale9Sprite::create("GJ_square06.png"); + subbgbackdrop->setPosition(subbg->getPosition()); + subbgbackdrop->setAnchorPoint(subbg->getAnchorPoint()); + subbgbackdrop->setContentSize(subbg->getContentSize()); + subbgbackdrop->setColor(ccBLACK); + subbgbackdrop->setOpacity(120); + popup->m_mainLayer->addChild(subbgbackdrop, -2); + + auto resetFileParticleImage = ButtonSprite::create( + "Restart", 141.000f, 1, "bigFont.fnt", "GJ_button_05.png", 0, 0.7f + ); + resetFileParticleImage->setScale(0.7f); + auto resetFileParticle = CCMenuItemExt::createSpriteExtra( + resetFileParticleImage, [popup, effectName](auto) { + popup->m_buttonMenu->removeChildByTag(5719); + popup->m_buttonMenu->removeChildByTag(5719); + + auto selectedPrev = ParticlePreview::create(effectName + ".plist"); + selectedPrev->setPosition({ -392.f, 4.f }); + popup->m_buttonMenu->addChild(selectedPrev, 0, 5719); + + auto selectedPrevTitle = CCLabelBMFont::create( + (effectName + ".plist").c_str(), "chatFont.fnt" + ); + selectedPrevTitle->setPosition({ -338.000f, 14.000f }); + selectedPrevTitle->limitLabelWidth(selectedPrev->getContentWidth() - 22.f, 0.850f, 0.1f); + popup->m_buttonMenu->addChild(selectedPrevTitle, 0, 5719); + + handleTouchPriority(popup); + } + ); + resetFileParticle->activate(); + resetFileParticle->setPosition({ -338.000f, -15.000f }); + popup->m_buttonMenu->addChild(resetFileParticle, 1); + + //card{ 142.000f, 182.000f } + auto scroll = ScrollLayer::create({ 292.000f, 182.000f }); + scroll->setPosition({ -242.000f, 24.000f }); + scroll->setTouchEnabled(0); + popup->m_buttonMenu->addChild(scroll); + + scroll->m_contentLayer->setOpacity(90.f); + + auto scrollOutline = CCScale9Sprite::create("GJ_square07.png"); + scrollOutline->setPositionX(scroll->getPosition().x + scroll->getContentWidth() / 2); + scrollOutline->setPositionY(scroll->getPosition().y + scroll->getContentHeight() / 2); + scrollOutline->setContentSize(scroll->getContentSize() + CCSizeMake(1,1) * 3); + popup->m_buttonMenu->addChild(scrollOutline); + + auto sbar = Scrollbar::create(scroll); + sbar->setTouchEnabled(0); + sbar->setPosition(-151.f, 11.f); + sbar->setRotation(-90.f); + popup->m_buttonMenu->addChild(sbar); + + auto goLeft = CCMenuItemExt::createSpriteExtra( + CCLabelBMFont::create(">", "bigFont.fnt"), [popup, scroll](auto) { + scroll->scrollLayer(scroll->getContentHeight()); + } + ); + goLeft->setSizeMult(1.3f); + goLeft->setPosition(56.000f, scrollOutline->getPositionY()); + popup->m_buttonMenu->addChild(goLeft); + + auto goRight = CCMenuItemExt::createSpriteExtra( + CCLabelBMFont::create("<", "bigFont.fnt"), [popup, scroll](auto) { + scroll->scrollLayer(-scroll->getContentHeight()); + } + ); + goRight->setSizeMult(1.3f); + goRight->setPosition(-246.000, scrollOutline->getPositionY()); + popup->m_buttonMenu->addChild(goRight); + + auto createParticleCard = [popup, scroll, resetFileParticle, effectName](std::string data, int id) + { + auto menu = CCMenu::create(); + menu->setContentSize({ 142.000f, 182.000f }); + menu->setPosition(CCPointZero); + + menu->addChild(cocos::createDataNode("data", data, id)); + + auto bg = CCScale9Sprite::create("geode.loader/black-square.png"); + bg->setAnchorPoint(CCPointZero); + bg->setContentSize(menu->getContentSize()); + menu->addChild(bg, -1); + + auto restartParticleImage = ButtonSprite::create( + "Restart", "bigFont.fnt", "GJ_button_05.png", 0.8f + ); + restartParticleImage->setScale(0.6f); + restartParticleImage->m_BGSprite->setContentWidth(184.000f); + restartParticleImage->m_BGSprite->setContentHeight(32.000f); + auto restartParticle = CCMenuItemExt::createSpriteExtra( + restartParticleImage, [popup, menu](auto) { + menu->removeChildByTag(13384); + auto data = std::string(findDataNode(menu, "data")->getString()); + auto selectedPrev = ParticlePreview::createFromString(data); + selectedPrev->setPosition({ 16.f, 80.f }); + menu->addChild(selectedPrev, 0, 13384); + handleTouchPriority(popup); + } + ); + restartParticle->activate(); + restartParticle->setPosition({ menu->getContentWidth() / 2, 66.f }); + menu->addChild(restartParticle, 1); + + auto idlabel = CCLabelBMFont::create(fmt::format("# {}", id).c_str(), "chatFont.fnt"); + idlabel->setPosition({ menu->getContentWidth() / 2, 96.f }); + idlabel->limitLabelWidth(110.f, 0.5f, 0.1f); + menu->addChild(idlabel, 1); + + auto copyParticleStrLabel = CCLabelBMFont::create("- copy string -", "chatFont.fnt"); + copyParticleStrLabel->setScale(0.6); + auto copyParticleStr = CCMenuItemExt::createSpriteExtra( + copyParticleStrLabel, [menu, restartParticle, resetFileParticle, effectName, id](auto) { + auto data = std::string(findDataNode(menu, "data")->getString()); + geode::utils::clipboard::write(data); + auto ntfy = Notification::create("particle string was wrote to clipboard!"); + ntfy->show(); + } + ); + copyParticleStr->setPosition({ menu->getContentWidth() / 2, 88.f }); + menu->addChild(copyParticleStr, 1); + + auto useParticleImage = ButtonSprite::create( + "Use This", "bigFont.fnt", "GJ_button_03.png", 0.8f + ); + useParticleImage->setScale(0.6f); + useParticleImage->m_BGSprite->setContentWidth(184.000f); + useParticleImage->m_BGSprite->setContentHeight(32.000f); + auto useParticle = CCMenuItemExt::createSpriteExtra( + useParticleImage, [menu, restartParticle, resetFileParticle, effectName](auto) { + auto data = std::string(findDataNode(menu, "data")->getString()); + Mod::get()->setSavedValue(effectName, data); + Mod::get()->saveData(); + restartParticle->activate();//menu, restartParticle, resetFileParticle + resetFileParticle->activate(); + } + ); + useParticle->setPosition({ menu->getContentWidth() / 2, 42.000f }); + menu->addChild(useParticle, 1); + + auto deleteParticleImage = ButtonSprite::create( + "Delete", "bigFont.fnt", "GJ_button_06.png", 0.8f + ); + deleteParticleImage->setScale(0.6f); + deleteParticleImage->m_BGSprite->setContentWidth(184.000f / 1.8f); + deleteParticleImage->m_BGSprite->setContentHeight(32.000f); + auto deleteParticle = CCMenuItemExt::createSpriteExtra( + deleteParticleImage, [menu, scroll, resetFileParticle, effectName, id](auto) { + + auto data = std::string(findDataNode(menu, "data")->getString()); + auto arr = Mod::get()->getSavedValue(effectName + ".saved"); + auto newarr = matjson::Array(); + for (auto val : arr) { + if (val.as_array()[0] != id) { + newarr.push_back(val); + } + } + if (Mod::get()->getSavedValue(effectName) == data) { + Mod::get()->getSaveContainer().try_erase(effectName); + resetFileParticle->activate(); + } + Mod::get()->setSavedValue(effectName + ".saved", newarr); + Mod::get()->saveData(); + + auto parent = menu->getParent(); + menu->removeMeAndCleanup(); + parent->updateLayout(); + scroll->scrollLayer(0.f); + } + ); + deleteParticle->setAnchorPoint({ 1.f, 0.5f }); + deleteParticle->setPosition({ menu->getContentWidth() / 1.8f, 18.000f }); + menu->addChild(deleteParticle, 1); + + auto editParticleImage = ButtonSprite::create( + "Edit", "bigFont.fnt", "GJ_button_02.png", 0.8f + ); + editParticleImage->setScale(0.6f); + editParticleImage->m_BGSprite->setContentWidth(184.000f / 2.5f); + editParticleImage->m_BGSprite->setContentHeight(32.000f); + auto editParticle = CCMenuItemExt::createSpriteExtra( + editParticleImage, [menu, restartParticle, resetFileParticle, effectName, id](auto) { + auto data = std::string(findDataNode(menu, "data")->getString()); + auto popup = ParticlePopup::get(data); + popup->show(); + popup->setZOrder(CCScene::get()->getChildrenCount()); + auto okBtn = cocos::findFirstChildRecursive(popup, [](auto) {return true; }); + CCMenuItemExt::assignCallback( + okBtn, [popup, menu, restartParticle, resetFileParticle, effectName, id](auto) { + findDataNode(menu, "data")->setString( + GameToolbox::saveParticleToString(popup->m_particle).c_str() + ); + popup->onClose(popup); + + auto data = std::string(findDataNode(menu, "data")->getString()); + auto arr = Mod::get()->getSavedValue(effectName + ".saved"); + auto newarr = matjson::Array(); + for (auto val : arr) { + if (val.as_array()[0] == id) { + val.as_array()[1] = (data); + } + newarr.push_back(val); + } + Mod::get()->setSavedValue(effectName + ".saved", newarr); + Mod::get()->saveData(); + + restartParticle->activate();//menu, restartParticle, resetFileParticle + resetFileParticle->activate(); + } + ); + //handleTouchPriority(popup); + //handleTouchPriority(menu); + } + ); + editParticle->setAnchorPoint({ 0.f, 0.5f }); + editParticle->setPosition({ menu->getContentWidth() / 1.74f, 18.000f }); + menu->addChild(editParticle, 1); + + return menu; + }; + + auto items = CCArray::create(); + + auto createDefaultLabel = CCLabelBMFont::create("From Default:", "goldFont.fnt"); + createDefaultLabel->limitLabelWidth(110.f, 0.6f, 0.1f); + items->addObject(createDefaultLabel); + + auto createnewImage = ButtonSprite::create( + "Create", 141.000f, 1, "bigFont.fnt", "GJ_button_04.png", 0, 0.7f + ); + createnewImage->setScale(0.7f); + auto createnew = CCMenuItemExt::createSpriteExtra( + createnewImage, [popup, effectName, scroll, createParticleCard](auto) { + + auto arr = Mod::get()->getSavedValue(effectName + ".saved"); + + auto freeID = 1; + for (auto particle_arr : arr) { + auto particle_id = particle_arr[0].as_int(); + if (particle_id >= freeID) freeID = (particle_id + 1); + } + + matjson::Array item = { freeID, defaultEffects[effectName] }; + arr.push_back(item); + Mod::get()->setSavedValue(effectName + ".saved", arr); + Mod::get()->saveData(); + + auto card = createParticleCard( + defaultEffects[effectName], + freeID + ); + scroll->m_contentLayer->addChild(card); + scroll->m_contentLayer->updateLayout(); + } + ); + items->addObject(createnew); + + auto createFromStringLabel = CCLabelBMFont::create("From String:", "goldFont.fnt"); + createFromStringLabel->limitLabelWidth(110.f, 0.6f, 0.1f); + items->addObject(createFromStringLabel); + + auto inputParticleStr = TextInput::create(110.000f, "particle\nstring here"); + inputParticleStr->setCommonFilter(CommonFilter::Any); + items->addObject(inputParticleStr); + + auto createFromStringImage = ButtonSprite::create( + "Create", 141.000f, 1, "bigFont.fnt", "GJ_button_04.png", 0, 0.7f + ); + createFromStringImage->setScale(0.7f); + auto createFromString = CCMenuItemExt::createSpriteExtra( + createFromStringImage, [popup, inputParticleStr, effectName, scroll, createParticleCard](auto) { + + auto arr = Mod::get()->getSavedValue(effectName + ".saved"); + + auto freeID = 1; + for (auto particle_arr : arr) { + auto particle_id = particle_arr[0].as_int(); + if (particle_id >= freeID) freeID = (particle_id + 1); + } + + matjson::Array item = { freeID, inputParticleStr->getString() }; + arr.push_back(item); + Mod::get()->setSavedValue(effectName + ".saved", arr); + Mod::get()->saveData(); + + auto card = createParticleCard( + inputParticleStr->getString(), + freeID + ); + scroll->m_contentLayer->addChild(card); + scroll->m_contentLayer->updateLayout(); + + } + ); + items->addObject(createFromString); + + CCMenu* menu = CCMenu::createWithArray(items); + menu->alignItemsVerticallyWithPadding(6.f); + menu->setPosition({ -338.000f, 174.000f }); + popup->m_buttonMenu->addChild(menu, 1); + + auto arr = Mod::get()->getSavedValue(effectName + ".saved"); + for (auto particle_arr : arr) { + auto card = createParticleCard( + particle_arr.as_array()[1].as_string(), + particle_arr.as_array()[0].as_int() + ); + scroll->m_contentLayer->addChild(card); + } + + scroll->m_contentLayer->setLayout(RowLayout::create() + ->setGap(0.f) + ->setGrowCrossAxis(1) + ->setAxisAlignment(AxisAlignment::Even) + ); + + handleTouchPriority(popup); + + }; + + auto selectorPopup = createQuickPopup( + "Select Effect", + "\n \n \n \n \n \n", + "Close", nullptr, + nullptr + ); + + auto items = CCArray::create(); + auto createAndAddItem = [selectorPopup, createSavedEffectsPopup, items](std::string title, std::string effectName) + { + auto image = ButtonSprite::create( + title.c_str(), "bigFont.fnt", "GJ_button_05.png", 0.7f + ); + image->m_BGSprite->setContentWidth(392.000f); + auto item = CCMenuItemExt::createSpriteExtra( + image, [selectorPopup, createSavedEffectsPopup, effectName](auto) { + selectorPopup->keyBackClicked(); + createSavedEffectsPopup(effectName); + } + ); + item->getNormalImage()->setScale(0.6f); + items->addObject(item); + }; + createAndAddItem("Drag Effect", "dragEffect"); + createAndAddItem("Ship Drag Effect", "shipDragEffect"); + createAndAddItem("Land Effect", "landEffect"); + createAndAddItem("Dash Effect", "dashEffect"); + + CCMenu* menu = CCMenu::createWithArray(items); + menu->alignItemsVerticallyWithPadding(-6.f); + selectorPopup->m_mainLayer->addChild(menu, 1); + + handleTouchPriority(selectorPopup); + + } + ); + shards_menu->addChild(openupbtn); + shards_menu->updateLayout(); + } + + return 1; + } +}; + +#include +class $modify(CCParticleSystemQuadCustomPlayerParticles, CCParticleSystemQuad) { + $override static CCParticleSystemQuad* create(const char* file, bool idk) { + auto orgone = CCParticleSystemQuad::create(file, idk); + + if (0) log::debug( + "defaultEffects[\"{}\"] = \"{}\";", file, + GameToolbox::saveParticleToString(orgone) + ); + + auto effectName = fs::path(file).filename().replace_extension("").string(); + + auto stringDataFileName = effectName + ".txt"; + if (fileExistsInSearchPaths(stringDataFileName.c_str())) { + //fs::read uses CCFileUtils::getFileData + auto data = fs::read(stringDataFileName.c_str()); + return GameToolbox::particleFromString(data, CCParticleSystemQuad::create(), idk); + } + + auto saves = Mod::get()->getSaveContainer(); + if (saves.contains(effectName)) { + return GameToolbox::particleFromString( + saves.try_get(effectName).value_or(defaultEffects[effectName]), + CCParticleSystemQuad::create(), idk + ); + } + + return orgone; + } +};