From 4f9224d9bf5c0e36785f29c75bd721450f230217 Mon Sep 17 00:00:00 2001 From: Cheeseworks Date: Sun, 6 Jul 2025 08:00:16 -0500 Subject: [PATCH 1/3] tweak linked proj lazysprite --- CMakeLists.txt | 2 +- changelog.md | 14 ++++++++++---- mod.json | 4 ++-- src/headers/src/ProjectInfoPopup.cpp | 6 +++--- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5642f6b..bbb04dd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,7 +9,7 @@ else() set(CMAKE_OSX_ARCHITECTURES "arm64;x86_64") endif() -project(AvalancheIndex VERSION 1.2.0) +project(AvalancheIndex VERSION 1.2.1) file(GLOB_RECURSE SOURCES src/*.cpp diff --git a/changelog.md b/changelog.md index 23679df..fda81d2 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,13 @@ +### v1.1.2 +##### Patches + +#### Changes +- **Tweaked** linked project container in Team Project information pop-up + +###### Latest +--- +###### Older + ## v1.2.0 #### Team Project pop-up @@ -10,10 +20,6 @@ #### Developers - **Updated** URLs to use Cubic Studios API endpoints for all web requests -###### Latest ---- -###### Older - ### v1.1.2 ##### Patches diff --git a/mod.json b/mod.json index 8fc0977..34ad1cb 100644 --- a/mod.json +++ b/mod.json @@ -8,7 +8,7 @@ }, "id": "cubicstudios.avalancheindex", "name": "Avalanche Index", - "version": "1.2.0", + "version": "1.2.1", "developers": [ "Cheeseworks" ], @@ -18,7 +18,7 @@ "enhancement" ], "links": { - "source": "https://www.github.com/CubicCommunity/AvalancheIndex/", + "source": "https://github.com/CubicCommunity/AvalancheIndex", "homepage": "https://avalanche.cubicstudios.xyz/", "community": "https://www.dsc.gg/cubic" }, diff --git a/src/headers/src/ProjectInfoPopup.cpp b/src/headers/src/ProjectInfoPopup.cpp index 032d619..c3013f2 100644 --- a/src/headers/src/ProjectInfoPopup.cpp +++ b/src/headers/src/ProjectInfoPopup.cpp @@ -699,8 +699,8 @@ ProjectInfoPopup* ProjectInfoPopup::setProject(GJGameLevel* level) { linkedProjThumb->setPosition(linkedProjClippingNode->getPosition()); linkedProjThumb->ignoreAnchorPointForPosition(false); - linkedProjThumb->setColor({ 250, 250, 250 }); - linkedProjThumb->setOpacity(250); + linkedProjThumb->setColor({ 175, 175, 175 }); + linkedProjThumb->setOpacity(175); } else { AVAL_LOG_ERROR("Failed to load linked project thumbnail: {}", res.unwrapErr()); linkedProjThumb->removeMeAndCleanup(); @@ -749,7 +749,7 @@ ProjectInfoPopup* ProjectInfoPopup::setProject(GJGameLevel* level) { auto linkedProjLabel = CCLabelBMFont::create("Play Now!", "bigFont.fnt"); linkedProjLabel->setID("label"); linkedProjLabel->setAlignment(CCTextAlignment::kCCTextAlignmentCenter); - linkedProjLabel->setPosition({ linkedProjMenu->getScaledContentWidth() / 2.f, linkedProjMenu->getScaledContentHeight() - 10.f }); + linkedProjLabel->setPosition({ linkedProjMenu->getScaledContentWidth() / 2.f, linkedProjMenu->getScaledContentHeight() - 12.5f }); linkedProjLabel->setScale(0.25f); linkedProjMenu->addChild(linkedProjLabel); From 6b568c832432e6eaf88f3e67ecec6d22239ca508 Mon Sep 17 00:00:00 2001 From: Cheeseworks Date: Sun, 6 Jul 2025 13:04:51 -0500 Subject: [PATCH 2/3] buttons --- changelog.md | 4 +++- src/headers/src/AvalancheFeatured.cpp | 4 ++-- src/main.cpp | 17 ++++++----------- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/changelog.md b/changelog.md index fda81d2..e2b2e93 100644 --- a/changelog.md +++ b/changelog.md @@ -1,8 +1,10 @@ -### v1.1.2 +### v1.2.1 ##### Patches #### Changes +- **Optimized** Avalanche project button creation in level information page - **Tweaked** linked project container in Team Project information pop-up +- **Tweaked** changelog button in featured project pop-up ###### Latest --- diff --git a/src/headers/src/AvalancheFeatured.cpp b/src/headers/src/AvalancheFeatured.cpp index 80d425f..2750489 100644 --- a/src/headers/src/AvalancheFeatured.cpp +++ b/src/headers/src/AvalancheFeatured.cpp @@ -230,8 +230,8 @@ bool AvalancheFeatured::setup() { AVAL_LOG_INFO("Dev buttons are enabled"); // geode changelog popup button - auto changelogBtnSprite = CCSprite::createWithSpriteFrameName("GJ_chatBtn_001.png"); - changelogBtnSprite->setScale(0.75f); + auto changelogBtnSprite = CCSprite::createWithSpriteFrameName("GJ_menuBtn_001.png"); + changelogBtnSprite->setScale(0.625f); auto changelogBtn = CCMenuItemSpriteExtra::create( changelogBtnSprite, diff --git a/src/main.cpp b/src/main.cpp index 873ec30..be07ac4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -228,17 +228,12 @@ class $modify(LevelInfo, LevelInfoLayer) { auto showProjectInfo = AVAL_GEODE_MOD->getSettingValue("show-proj-info"); if (showProjectInfo) { - CCSprite* avalBtnSprite = CCSprite::createWithSpriteFrameName("GJ_plainBtn_001.png"); - avalBtnSprite->setScale(0.944f); - - CCSprite* avalBtnSpriteIcon = CCSprite::createWithSpriteFrameName("button-logo.png"_spr); - avalBtnSpriteIcon->setPositionX(avalBtnSprite->getContentWidth() / 2.025f); - avalBtnSpriteIcon->setPositionY(avalBtnSprite->getContentHeight() / 2.f); - avalBtnSpriteIcon->ignoreAnchorPointForPosition(false); - avalBtnSpriteIcon->setAnchorPoint({ 0.5, 0.5 }); - avalBtnSpriteIcon->setScale(0.875f); - - avalBtnSprite->addChild(avalBtnSpriteIcon); + CCSprite* avalBtnSprite = CircleButtonSprite::createWithSpriteFrameName( + "button-logo.png"_spr, + 1.25f, + CircleBaseColor::Green, + CircleBaseSize::Medium + ); CCMenuItemSpriteExtra* avalBtn = CCMenuItemSpriteExtra::create( avalBtnSprite, From d6c342cce275c5a3f303ea921409075cc49ab59d Mon Sep 17 00:00:00 2001 From: Cheeseworks Date: Mon, 7 Jul 2025 19:53:44 -0500 Subject: [PATCH 3/3] clean clean clean --- changelog.md | 10 +- incl/src/Avalanche.cpp | 276 ++++++++++++-------------- src/headers/src/AvalancheFeatured.cpp | 22 +- src/main.cpp | 46 ++--- 4 files changed, 176 insertions(+), 178 deletions(-) diff --git a/changelog.md b/changelog.md index e2b2e93..2bc4974 100644 --- a/changelog.md +++ b/changelog.md @@ -2,9 +2,13 @@ ##### Patches #### Changes -- **Optimized** Avalanche project button creation in level information page -- **Tweaked** linked project container in Team Project information pop-up -- **Tweaked** changelog button in featured project pop-up +- **Fixed** previews not showing with [Mod Previews](mod:alphalaneous.mod_previews) mod +- Huge code cleanup +- Minor optimizations +- Several tweaks + +#### Developers +- **Added** Geode and Geometry Dash version information to featured project pop-up ###### Latest --- diff --git a/incl/src/Avalanche.cpp b/incl/src/Avalanche.cpp index 834a0d2..bb446e3 100644 --- a/incl/src/Avalanche.cpp +++ b/incl/src/Avalanche.cpp @@ -20,7 +20,7 @@ namespace avalanche { Mod* AVAL_MOD = getMod(); // Get the mod instance int ACC_PUBLISHER = 31079132; - std::string URL_MOD_ISSUES = avalanche::AVAL_MOD->getMetadataRef().getIssues().value().url.value_or(URL_AVALANCHE); // URL to the mod's issues page on its GitHub repository + std::string URL_MOD_ISSUES = AVAL_MOD->getMetadataRef().getIssues().value().url.value_or(URL_AVALANCHE); // URL to the mod's issues page on its GitHub repository matjson::Value fetchedBadges = nullptr; // Cached profile data matjson::Value fetchedLevels = nullptr; // Cached project data @@ -28,54 +28,54 @@ namespace avalanche { EventListener badgeListReq; // Web request listener for team profile data EventListener levelListReq; // Web request listener for team project data - std::map avalanche::Profile::profileBadgeEnum{ - {"cubic-studios-badge"_spr, avalanche::Profile::Badge::CUBIC}, - {"director-badge"_spr, avalanche::Profile::Badge::DIRECTOR}, - {"team-manager-badge"_spr, avalanche::Profile::Badge::MANAGER}, - {"team-member-badge"_spr, avalanche::Profile::Badge::MEMBER}, - {"collaborator-badge"_spr, avalanche::Profile::Badge::COLLABORATOR}, + std::map Profile::profileBadgeEnum{ + {"cubic-studios-badge"_spr, Profile::Badge::CUBIC}, + {"director-badge"_spr, Profile::Badge::DIRECTOR}, + {"team-manager-badge"_spr, Profile::Badge::MANAGER}, + {"team-member-badge"_spr, Profile::Badge::MEMBER}, + {"collaborator-badge"_spr, Profile::Badge::COLLABORATOR}, }; - std::map avalanche::Project::projectTypeEnum{ - {"solo", avalanche::Project::Type::SOLO}, - {"team", avalanche::Project::Type::TEAM}, - {"collab", avalanche::Project::Type::COLLAB}, - {"event", avalanche::Project::Type::EVENT}, + std::map Project::projectTypeEnum{ + {"solo", Project::Type::SOLO}, + {"team", Project::Type::TEAM}, + {"collab", Project::Type::COLLAB}, + {"event", Project::Type::EVENT}, }; - std::map avalanche::Handler::badgeStringID{ - {avalanche::Profile::Badge::CUBIC, "cubic-studios-badge"_spr}, - {avalanche::Profile::Badge::DIRECTOR, "director-badge"_spr}, - {avalanche::Profile::Badge::MANAGER, "team-manager-badge"_spr}, - {avalanche::Profile::Badge::MEMBER, "team-member-badge"_spr}, - {avalanche::Profile::Badge::COLLABORATOR, "collaborator-badge"_spr}, + std::map Handler::badgeStringID{ + {Profile::Badge::CUBIC, "cubic-studios-badge"_spr}, + {Profile::Badge::DIRECTOR, "director-badge"_spr}, + {Profile::Badge::MANAGER, "team-manager-badge"_spr}, + {Profile::Badge::MEMBER, "team-member-badge"_spr}, + {Profile::Badge::COLLABORATOR, "collaborator-badge"_spr}, }; - std::map avalanche::Handler::badgeSpriteName{ - {avalanche::Handler::badgeStringID[avalanche::Profile::Badge::CUBIC], "cubic-studios.png"_spr}, - {avalanche::Handler::badgeStringID[avalanche::Profile::Badge::DIRECTOR], "director.png"_spr}, - {avalanche::Handler::badgeStringID[avalanche::Profile::Badge::MANAGER], "team-manager.png"_spr}, - {avalanche::Handler::badgeStringID[avalanche::Profile::Badge::MEMBER], "team-member.png"_spr}, - {avalanche::Handler::badgeStringID[avalanche::Profile::Badge::COLLABORATOR], "collaborator.png"_spr}, + std::map Handler::badgeSpriteName{ + {Handler::badgeStringID[Profile::Badge::CUBIC], "cubic-studios.png"_spr}, + {Handler::badgeStringID[Profile::Badge::DIRECTOR], "director.png"_spr}, + {Handler::badgeStringID[Profile::Badge::MANAGER], "team-manager.png"_spr}, + {Handler::badgeStringID[Profile::Badge::MEMBER], "team-member.png"_spr}, + {Handler::badgeStringID[Profile::Badge::COLLABORATOR], "collaborator.png"_spr}, }; - std::map avalanche::Handler::badgeColor{ - {avalanche::Handler::badgeStringID[avalanche::Profile::Badge::CUBIC], AVAL_MOD->getSettingValue("com-cubic")}, - {avalanche::Handler::badgeStringID[avalanche::Profile::Badge::DIRECTOR], AVAL_MOD->getSettingValue("com-director")}, - {avalanche::Handler::badgeStringID[avalanche::Profile::Badge::MANAGER], AVAL_MOD->getSettingValue("com-manager")}, - {avalanche::Handler::badgeStringID[avalanche::Profile::Badge::MEMBER], AVAL_MOD->getSettingValue("com-member")}, - {avalanche::Handler::badgeStringID[avalanche::Profile::Badge::COLLABORATOR], AVAL_MOD->getSettingValue("com-collaborator")}, + std::map Handler::badgeColor{ + {Handler::badgeStringID[Profile::Badge::CUBIC], AVAL_MOD->getSettingValue("com-cubic")}, + {Handler::badgeStringID[Profile::Badge::DIRECTOR], AVAL_MOD->getSettingValue("com-director")}, + {Handler::badgeStringID[Profile::Badge::MANAGER], AVAL_MOD->getSettingValue("com-manager")}, + {Handler::badgeStringID[Profile::Badge::MEMBER], AVAL_MOD->getSettingValue("com-member")}, + {Handler::badgeStringID[Profile::Badge::COLLABORATOR], AVAL_MOD->getSettingValue("com-collaborator")}, }; - std::map avalanche::Handler::apiToString{ - {"cubic-studios", avalanche::Handler::badgeStringID[avalanche::Profile::Badge::CUBIC]}, - {"director", avalanche::Handler::badgeStringID[avalanche::Profile::Badge::DIRECTOR]}, - {"team-manager", avalanche::Handler::badgeStringID[avalanche::Profile::Badge::MANAGER]}, - {"team-member", avalanche::Handler::badgeStringID[avalanche::Profile::Badge::MEMBER]}, - {"collaborator", avalanche::Handler::badgeStringID[avalanche::Profile::Badge::COLLABORATOR]}, + std::map Handler::apiToString{ + {"cubic-studios", Handler::badgeStringID[Profile::Badge::CUBIC]}, + {"director", Handler::badgeStringID[Profile::Badge::DIRECTOR]}, + {"team-manager", Handler::badgeStringID[Profile::Badge::MANAGER]}, + {"team-member", Handler::badgeStringID[Profile::Badge::MEMBER]}, + {"collaborator", Handler::badgeStringID[Profile::Badge::COLLABORATOR]}, }; - void avalanche::Handler::scanAll() { + void Handler::scanAll() { badgeListReq.bind([](web::WebTask::Event* e) { if (web::WebResponse* avalReqRes = e->getValue()) { if (avalReqRes->ok()) { @@ -84,13 +84,8 @@ namespace avalanche { auto jsonRes = avalReqRes->json().unwrapOr(matjson::Value::object()); for (auto& [key, value] : jsonRes) { - // key is an id and therefore must have numbers only - if (key.empty() || key.find_first_not_of("0123456789") != std::string::npos) { - log::error("Key for profile of ID '{}' is invalid", (std::string)key); - } else { - std::string cacheKey = fmt::format("cache-badge-p{}", (std::string)key); - AVAL_MOD->setSavedValue(cacheKey, value); - }; + std::string cacheKey = fmt::format("cache-badge-p{}", (std::string)key); + AVAL_MOD->setSavedValue(cacheKey, value); }; if (AVAL_MOD->getSettingValue("web-once")) fetchedBadges = jsonRes; @@ -106,93 +101,89 @@ namespace avalanche { log::debug("badge id progress: {}", (float)p->downloadProgress().value_or(0.f)); } else if (e->isCancelled()) { log::error("Badge web request failed"); - if (AVAL_MOD->getSettingValue("err-notifs")) Notification::create("Unable to fetch badge", NotificationIcon::Error, 2.5f)->show(); - }; }); - - auto badgeReq = web::WebRequest(); // send the web request - badgeReq.userAgent("Avalanche Index mod for Geode"); - badgeReq.timeout(std::chrono::seconds(30)); - badgeListReq.setFilter(badgeReq.get(URL_API_BADGES)); - - // fetch data for all projects - levelListReq.bind([](web::WebTask::Event* e) { - if (web::WebResponse* avalReqRes = e->getValue()) { - if (avalReqRes->ok()) { - if (fetchedLevels == nullptr) { - if (avalReqRes->json().isOk()) { - auto jsonRes = avalReqRes->json().unwrapOr(matjson::Value::object()); - - for (auto& [key, value] : jsonRes) { - // key is an id and therefore must have numbers only - if (key.empty() || key.find_first_not_of("0123456789") != std::string::npos) { - log::error("Key for project of ID '{}' is invalid", (std::string)key); - } else { - std::string cacheKey = fmt::format("cache-level-p{}", (std::string)key); - AVAL_MOD->setSavedValue(cacheKey, value); - }; - }; - - if (AVAL_MOD->getSettingValue("web-once")) - fetchedLevels = jsonRes; + if (AVAL_MOD->getSettingValue("err-notifs")) Notification::create("Unable to fetch badges", NotificationIcon::Error, 2.5f)->show(); + }; + }); + + auto badgeReq = web::WebRequest(); // send the web request + badgeReq.userAgent("Avalanche Index mod for Geode"); + badgeReq.timeout(std::chrono::seconds(30)); + badgeListReq.setFilter(badgeReq.get(URL_API_BADGES)); + + // fetch data for all projects + levelListReq.bind([](web::WebTask::Event* e) { + if (web::WebResponse* avalReqRes = e->getValue()) { + if (avalReqRes->ok()) { + if (fetchedLevels == nullptr) { + if (avalReqRes->json().isOk()) { + auto jsonRes = avalReqRes->json().unwrapOr(matjson::Value::object()); + + for (auto& [key, value] : jsonRes) { + std::string cacheKey = fmt::format("cache-level-p{}", (std::string)key); + AVAL_MOD->setSavedValue(cacheKey, value); }; - } else { - log::error("Already fetched remote data for levels"); + + if (AVAL_MOD->getSettingValue("web-once")) fetchedLevels = jsonRes; }; } else { - log::error("Badge web request failed: {}", avalReqRes->string().unwrapOr(und)); - if (AVAL_MOD->getSettingValue("err-notifs")) Notification::create("Unable to fetch main Avalanche levels", NotificationIcon::Error, 2.5f)->show(); + log::error("Already fetched remote data for levels"); }; - } else if (web::WebProgress* p = e->getProgress()) { - log::debug("level id progress: {}", (float)p->downloadProgress().value_or(0.f)); - } else if (e->isCancelled()) { - log::error("Badge web request failed"); - if (AVAL_MOD->getSettingValue("err-notifs")) Notification::create("Unable to fetch level", NotificationIcon::Error, 2.5f)->show(); - }; }); - - auto levelReq = web::WebRequest(); // send the web request - levelReq.userAgent("Avalanche Index mod for Geode"); - levelReq.timeout(std::chrono::seconds(30)); - levelListReq.setFilter(levelReq.get(URL_API_LEVELS)); + } else { + log::error("Badge web request failed: {}", avalReqRes->string().unwrapOr(und)); + if (AVAL_MOD->getSettingValue("err-notifs")) Notification::create("Unable to fetch main Avalanche levels", NotificationIcon::Error, 2.5f)->show(); + }; + } else if (web::WebProgress* p = e->getProgress()) { + log::debug("level id progress: {}", (float)p->downloadProgress().value_or(0.f)); + } else if (e->isCancelled()) { + log::error("Badge web request failed"); + if (AVAL_MOD->getSettingValue("err-notifs")) Notification::create("Unable to fetch levels", NotificationIcon::Error, 2.5f)->show(); + }; + }); + + auto levelReq = web::WebRequest(); // send the web request + levelReq.userAgent("Avalanche Index mod for Geode"); + levelReq.timeout(std::chrono::seconds(30)); + levelListReq.setFilter(levelReq.get(URL_API_LEVELS)); }; - avalanche::Profile avalanche::Handler::GetProfile(int id) { + Profile Handler::GetProfile(int id) { if (id > 0) { std::string cacheKey = fmt::format("cache-badge-p{}", (int)id); matjson::Value cacheStd = AVAL_MOD->getSavedValue(cacheKey); // gets locally saved badge json - auto lBadge = avalanche::Profile::profileBadgeEnum.find(avalanche::Handler::apiToString[cacheStd["badge"].asString().unwrapOr(und)]); + auto lBadge = Profile::profileBadgeEnum.find(Handler::apiToString[cacheStd["badge"].asString().unwrapOr(und)]); auto c_name = cacheStd["name"].asString().unwrapOr(und); - auto c_badge = (lBadge != avalanche::Profile::profileBadgeEnum.end()) ? lBadge->second : avalanche::Profile::Badge::NONE; + auto c_badge = (lBadge != Profile::profileBadgeEnum.end()) ? lBadge->second : Profile::Badge::NONE; - avalanche::Profile res(c_name, c_badge); + Profile res(c_name, c_badge); return res; } else { log::error("Profile ID is invalid"); - avalanche::Profile res("Name", avalanche::Profile::Badge::NONE); + Profile res("Name", Profile::Badge::NONE); return res; }; }; - avalanche::Project avalanche::Handler::GetProject(int id) { + Project Handler::GetProject(int id) { if (id > 0) { std::string cacheKey = fmt::format("cache-level-p{}", (int)id); matjson::Value cacheStd = AVAL_MOD->getSavedValue(cacheKey); // gets locally saved level json - auto lType = avalanche::Project::projectTypeEnum.find(cacheStd["type"].asString().unwrapOr(und)); + auto lType = Project::projectTypeEnum.find(cacheStd["type"].asString().unwrapOr(und)); auto c_name = cacheStd["name"].asString().unwrapOr(und); auto c_host = cacheStd["host"].asString().unwrapOr(und); auto c_showcase = cacheStd["showcase"].asString().unwrapOr(und); auto c_thumbnail = cacheStd["thumbnail"].asString().unwrapOr(""); - auto c_type = (lType != avalanche::Project::projectTypeEnum.end()) ? lType->second : avalanche::Project::Type::NONE; + auto c_type = (lType != Project::projectTypeEnum.end()) ? lType->second : Project::Type::NONE; auto c_fame = cacheStd["fame"].asBool().unwrapOr(false); auto c_linked = cacheStd["project"]; - avalanche::Project::LinkToMain ltm; + Project::LinkToMain ltm; if (c_linked.isObject()) { ltm.enabled = c_linked["enabled"].asBool().unwrapOr(false); @@ -202,91 +193,74 @@ namespace avalanche { ltm.level_id = 0; }; - avalanche::Project res(c_name, c_host, c_showcase, c_thumbnail, c_type, c_fame, ltm); + Project res(c_name, c_host, c_showcase, c_thumbnail, c_type, c_fame, ltm); return res; } else { log::error("Project ID is invalid"); - avalanche::Project res("Name", "Host", URL_AVALANCHE, "", avalanche::Project::Type::NONE, false, avalanche::Project::LinkToMain()); + Project res("Name", "Host", URL_AVALANCHE, "", Project::Type::NONE, false, Project::LinkToMain()); return res; }; }; - ccColor3B avalanche::Handler::getCommentColor(Profile::Badge badge) { - ccColor3B colorSetting = avalanche::Handler::badgeColor[avalanche::Handler::badgeStringID[badge]]; + ccColor3B Handler::getCommentColor(Profile::Badge badge) { + ccColor3B colorSetting = Handler::badgeColor[Handler::badgeStringID[badge]]; return colorSetting; }; - void avalanche::Handler::getBadgeInfo(avalanche::Profile::Badge badge) { + void Handler::getBadgeInfo(Profile::Badge badge) { + auto title = "Oops!"; + auto description = "This badge has no available information. This is likely unintentional, please report it as an issue in the mod's repository."; + auto button = "Learn More"; + auto url = URL_AVALANCHE; + switch (badge) { - case avalanche::Profile::Badge::CUBIC: - createQuickPopup( - "Cubic Studios", - "This user is a staff member of Cubic Studios. They partake in the activities of a department of Cubic, and may supervise or join projects such as Avalanche.", - "OK", "Learn More", - [](auto, bool btn2) { - if (btn2) web::openLinkInBrowser(URL_CUBIC); - }); + case Profile::Badge::CUBIC: + title = "Cubic Studios"; + description = "This user is a staff member of Cubic Studios. They partake in the activities of a department of Cubic, and may supervise or join projects such as Avalanche."; break; - case avalanche::Profile::Badge::DIRECTOR: - createQuickPopup( - "Avalanche Director", - "This user is the director of Avalanche. They run the whole team.", - "OK", "Learn More", - [](auto, bool btn2) { - if (btn2) web::openLinkInBrowser(URL_AVALANCHE); - }); + case Profile::Badge::DIRECTOR: + title = "Avalanche Director"; + description = "This user is the director of Avalanche. They run the whole team."; break; - case avalanche::Profile::Badge::MANAGER: - createQuickPopup( - "Avalanche Manager", - "This user is a manager of Avalanche. They manage team projects and collaborations.", - "OK", "Learn More", - [](auto, bool btn2) { - if (btn2) web::openLinkInBrowser(URL_AVALANCHE); - }); + case Profile::Badge::MANAGER: + title = "Avalanche Manager"; + description = "This user is a manager of Avalanche. They manage team projects and collaborations."; break; - case avalanche::Profile::Badge::MEMBER: - createQuickPopup( - "Avalanche Team Member", - "This user is a member of Avalanche. They partake in team projects and collaborations.", - "OK", "Learn More", - [](auto, bool btn2) { - if (btn2) web::openLinkInBrowser(URL_AVALANCHE); - }); + case Profile::Badge::MEMBER: + title = "Avalanche Team Member"; + description = "This user is a member of Avalanche. They partake in team projects and collaborations."; break; - case avalanche::Profile::Badge::COLLABORATOR: - createQuickPopup( - "Team Collaborator", - "This user is a collaborator of Avalanche. They've directly worked on the crew's or team's projects as an outsider.", - "OK", "Learn More", - [](auto, bool btn2) { - if (btn2) web::openLinkInBrowser(URL_AVALANCHE); - }); + case Profile::Badge::COLLABORATOR: + title = "Team Collaborator"; + description = "This user is a collaborator of Avalanche. They've directly worked on the crew's or team's projects as an outsider."; break; default: - createQuickPopup( - "Oops!", - "This badge has no available information. This is likely unintentional, please report it as an issue in the mod's repository.", - "OK", "Report", - [](auto, bool btn2) { - if (btn2) web::openLinkInBrowser(URL_MOD_ISSUES); - }); + button = "Report"; + url = URL_MOD_ISSUES.c_str(); break; }; + + createQuickPopup( + title, + description, + "OK", button, + [url](auto, bool btn2) { + if (btn2) web::openLinkInBrowser(url); + }, true); }; // badge button event - void avalanche::Handler::onInfoBadge(CCObject* sender) { + void Handler::onInfoBadge(CCObject* sender) { // gets the node that triggered the function auto nodeObject = as(sender); - auto badge = avalanche::Profile::profileBadgeEnum[nodeObject->getID()]; + auto badge = Profile::profileBadgeEnum[nodeObject->getID()]; - avalanche::Handler::getBadgeInfo(badge); + Handler::getBadgeInfo(badge); }; }; \ No newline at end of file diff --git a/src/headers/src/AvalancheFeatured.cpp b/src/headers/src/AvalancheFeatured.cpp index 2750489..bfd1168 100644 --- a/src/headers/src/AvalancheFeatured.cpp +++ b/src/headers/src/AvalancheFeatured.cpp @@ -197,7 +197,7 @@ bool AvalancheFeatured::setup() { infoSprite, this, menu_selector(AvalancheFeatured::openApplicationPopup)); - m_infoBtn->setPosition({ widthCS / 2.f, 5.f }); + m_infoBtn->setPosition({ widthCS / 2.f, 2.5f }); m_infoBtn->setVisible(true); m_infoBtn->setZOrder(3); @@ -229,6 +229,9 @@ bool AvalancheFeatured::setup() { if (AVAL_GEODE_MOD->getSettingValue("dev-mode")) { AVAL_LOG_INFO("Dev buttons are enabled"); + // geode loader + auto loader = Loader::get(); + // geode changelog popup button auto changelogBtnSprite = CCSprite::createWithSpriteFrameName("GJ_menuBtn_001.png"); changelogBtnSprite->setScale(0.625f); @@ -258,6 +261,23 @@ bool AvalancheFeatured::setup() { verLabel->setZOrder(3); m_overlayMenu->addChild(verLabel); + + // game and geode version text label + std::ostringstream gdVerLabelText; + gdVerLabelText << "Geode " << loader->getVersion().toVString(true) << " for v" << loader->getGameVersion(); + + auto gdVerLabelTextStr = gdVerLabelText.str(); + + auto gdVerLabel = CCLabelBMFont::create(gdVerLabelTextStr.c_str(), "bigFont.fnt"); + gdVerLabel->setID("gd-version-label"); + gdVerLabel->ignoreAnchorPointForPosition(false); + gdVerLabel->setPosition({ m_overlayMenu->getScaledContentWidth() - 5.f, 12.5f }); + gdVerLabel->setAnchorPoint({ 1, 0 }); + gdVerLabel->setOpacity(100); + gdVerLabel->setScale(0.25f); + gdVerLabel->setZOrder(3); + + m_overlayMenu->addChild(gdVerLabel); } else { AVAL_LOG_DEBUG("Dev buttons are disabled"); }; diff --git a/src/main.cpp b/src/main.cpp index be07ac4..0cb5519 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -207,17 +207,17 @@ class $modify(LevelInfo, LevelInfoLayer) { bool displayCollabLayers = AVAL_GEODE_MOD->getSettingValue("collab-layers"); // get main bg color layer - auto bg = this->getChildByID("background"); + auto bg = getChildByID("background"); auto background = as(bg); // get level name node - auto nameText = this->getChildByID("title-label"); + auto nameText = getChildByID("title-label"); auto levelName = dynamic_cast(nameText); // whether or not display for classics only bool onlyClassic = AVAL_GEODE_MOD->getSettingValue("classic-only") && level->isPlatformer(); - CCMenu* leftMenu = typeinfo_cast(this->getChildByID("left-side-menu")); + CCMenu* leftMenu = typeinfo_cast(getChildByID("left-side-menu")); Project thisProj = getHandler->GetProject(level->m_levelID.value()); @@ -325,8 +325,8 @@ class $modify(LevelInfo, LevelInfoLayer) { bgSprite->setColor({ 66, 94, 255 }); bgSprite->setAnchorPoint({ 0.5, 0.5 }); bgSprite->ignoreAnchorPointForPosition(false); - bgSprite->setContentSize({ this->getScaledContentWidth(), this->getScaledContentWidth() }); - bgSprite->setPosition({ this->getScaledContentWidth() / 2, this->getScaledContentHeight() / 2 }); + bgSprite->setContentSize({ getScaledContentWidth(), getScaledContentWidth() }); + bgSprite->setPosition({ getScaledContentWidth() / 2, getScaledContentHeight() / 2 }); bgSprite->setZOrder(background->getZOrder()); bgSprite->setID("team_background"_spr); @@ -338,7 +338,7 @@ class $modify(LevelInfo, LevelInfoLayer) { bgThumbnail->setZOrder(background->getZOrder() + 1); bgThumbnail->setID("team_thumbnail"_spr); - auto ogHeight = this->getContentHeight(); + auto ogHeight = getContentHeight(); auto thumbHeight = bgThumbnail->getContentHeight(); // checks if the heights are valid before rescaling @@ -349,12 +349,12 @@ class $modify(LevelInfo, LevelInfoLayer) { bgThumbnail->setScale(scaleFactor); }; - this->addChild(bgThumbnail); + addChild(bgThumbnail); } else { AVAL_LOG_ERROR("Failed to load sprite: project-bg.png"); }; - this->addChild(bgSprite); + addChild(bgSprite); } else { AVAL_LOG_ERROR("Failed to load sprite: game_bg_19_001.png"); }; @@ -397,11 +397,11 @@ class $modify(LevelInfo, LevelInfoLayer) { bgThumbnail->setOpacity(125); bgThumbnail->setAnchorPoint({ 0.5, 0 }); bgThumbnail->ignoreAnchorPointForPosition(false); - bgThumbnail->setPosition({ this->getContentWidth() / 2, 0 }); + bgThumbnail->setPosition({ getContentWidth() / 2, 0 }); bgThumbnail->setZOrder(background->getZOrder() + 1); bgThumbnail->setID("team_thumbnail"_spr); - auto ogWidth = this->getContentWidth(); + auto ogWidth = getContentWidth(); auto scaledWidth = bgThumbnail->getContentWidth(); if (ogWidth <= 0 || scaledWidth <= 0) { @@ -413,7 +413,7 @@ class $modify(LevelInfo, LevelInfoLayer) { background->setZOrder(-5); }; - this->addChild(bgThumbnail); + addChild(bgThumbnail); } else { AVAL_LOG_ERROR("Failed to load sprite: fame-bg.png"); }; @@ -427,7 +427,7 @@ class $modify(LevelInfo, LevelInfoLayer) { // when player presses the avalanche button void onAvalancheButton(CCObject * sender) { - ProjectInfoPopup::create()->setProject(this->m_level)->show(); + ProjectInfoPopup::create()->setProject(m_level)->show(); }; }; @@ -444,7 +444,7 @@ class $modify(Level, LevelCell) { bool displayCollabCells = AVAL_GEODE_MOD->getSettingValue("collab-cells"); // get main bg color layer - auto color = this->getChildByType(0); + auto color = getChildByType(0); // get level name text auto nameText = m_mainLayer->getChildByID("level-name"); @@ -513,7 +513,7 @@ class $modify(Level, LevelCell) { newColor->setID("solo_color"_spr); colorNode->removeMeAndCleanup(); - this->addChild(newColor); + addChild(newColor); if (fame) Level::setFame(newColor, { 255, 255, 255 }); } else { @@ -536,7 +536,7 @@ class $modify(Level, LevelCell) { newColor->setID("collab_color"_spr); colorNode->removeMeAndCleanup(); - this->addChild(newColor); + addChild(newColor); if (fame) Level::setFame(newColor, { 255, 255, 255 }); } else { @@ -567,7 +567,7 @@ class $modify(Level, LevelCell) { levelName->setScale(levelName->getScale() * scaleDownBy); colorNode->removeMeAndCleanup(); - this->addChild(newColor); + addChild(newColor); if (fame) Level::setFame(newColor, { 255, 244, 95 }); } else { @@ -590,7 +590,7 @@ class $modify(Level, LevelCell) { newColor->setID("event_color"_spr); colorNode->removeMeAndCleanup(); - this->addChild(newColor); + addChild(newColor); if (fame) Level::setFame(newColor, { 85, 249, 255 }); } else { @@ -616,10 +616,10 @@ class $modify(Level, LevelCell) { fameGlow->setID("fame"_spr); // for compact lists - float reScale = (this->m_height / fameGlow->getContentHeight()) * this->getScale(); + float reScale = (m_height / fameGlow->getContentHeight()) * getScale(); fameGlow->setScale(reScale); - this->addChild(fameGlow); + addChild(fameGlow); } else { AVAL_LOG_ERROR("Failed to load sprite: fame-glow.png"); }; @@ -642,7 +642,7 @@ class $modify(Pause, PauseLayer) { void customSetup() { PauseLayer::customSetup(); - if (auto rightMenu = this->getChildByID("right-button-menu")) { + if (auto rightMenu = getChildByID("right-button-menu")) { if (m_fields->m_level) { Project thisProj = getHandler->GetProject(m_fields->m_level->m_levelID.value()); @@ -741,8 +741,8 @@ class $modify(Menu, MenuLayer) { AVAL_LOG_DEBUG("Changelog alert disabled"); }; - auto winSizeX = this->getScaledContentWidth(); - auto winSizeY = this->getScaledContentHeight(); + auto winSizeX = getScaledContentWidth(); + auto winSizeY = getScaledContentHeight(); bool showAvalButton = AVAL_GEODE_MOD->getSettingValue("show-aval-featured"); @@ -752,7 +752,7 @@ class $modify(Menu, MenuLayer) { avalMenu->setPosition({ winSizeX / 2, (winSizeY / 2) - 70.f }); avalMenu->setScaledContentSize({ winSizeX - 75.f, 50.f }); - this->addChild(avalMenu); + addChild(avalMenu); auto avalBtnSprite = CCSprite::createWithSpriteFrameName("button-logo-framed.png"_spr); avalBtnSprite->ignoreAnchorPointForPosition(false);