Skip to content

Commit

Permalink
Merge pull request #50 from RayDeeUx/main
Browse files Browse the repository at this point in the history
ShardsPage, DemonFilterSelectLayer, LevelListLayer, LevelListCell, and MoreSearchLayer
  • Loading branch information
HJfod authored May 16, 2024
2 parents 34e0b95 + a569758 commit 53d8bd9
Show file tree
Hide file tree
Showing 5 changed files with 450 additions and 0 deletions.
57 changes: 57 additions & 0 deletions src/DemonFilterSelectLayer.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
#include <Geode/Bindings.hpp>
#include <Geode/modify/DemonFilterSelectLayer.hpp>
#include <Geode/utils/cocos.hpp>
#include <Geode/ui/BasedButtonSprite.hpp>
#include <Geode/utils/NodeIDs.hpp>

using namespace geode::prelude;
using namespace geode::node_ids;

$register_ids(DemonFilterSelectLayer) {
if (auto mainLayer = setIDSafe<CCLayer>(this, 0, "main-layer")) {
setIDSafe<CCScale9Sprite>(mainLayer, 0, "background");
setIDSafe<CCLabelBMFont>(mainLayer, 0, "demon-filter-text");
if (auto demonFilters = setIDSafe<CCMenu>(mainLayer, 0, "demon-filters")) {
auto demonFiltersChildren = CCArrayExt<CCNode*>(demonFilters->getChildren());
for (int i = 0; i < demonFiltersChildren.size(); i++) {
if (auto child = typeinfo_cast<CCMenuItemSpriteExtra*>(demonFiltersChildren[i])) {
if (child->getTag() != -1) {
std::string prefix = "unknown";
if (child->getTag() == 0) { prefix = "all"; }
else if (child->getTag() == 6) { prefix = "hard"; }
else if (child->getTag() == 7) { prefix = "easy"; }
else if (child->getTag() == 8) { prefix = "medium"; }
else if (child->getTag() == 9) { prefix = "insane"; }
else if (child->getTag() == 10) { prefix = "extreme"; }
setIDSafe<CCMenuItemSpriteExtra>(
demonFilters,
i,
fmt::format(
"{}-demon-filter-button",
prefix
).c_str()
);
} else {
setIDSafe<CCMenuItemSpriteExtra>(demonFilters, i, "close-button");
}
}
}
}
}
}

struct DemonFilterSelectLayerIDs : Modify<DemonFilterSelectLayerIDs, DemonFilterSelectLayer> {
static void onModify(auto& self) {
if (!self.setHookPriority("DemonFilterSelectLayer::init", GEODE_ID_PRIORITY)) {
log::warn("Failed to set DemonFilterSelectLayer::init hook priority, node IDs may not work properly");
}
}

bool init() {
if (!DemonFilterSelectLayer::init()) return false;

NodeIDs::get()->provide(this);

return true;
}
};
98 changes: 98 additions & 0 deletions src/LevelListCell.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
#include <Geode/Bindings.hpp>
#include <Geode/modify/LevelListCell.hpp>
#include <Geode/utils/cocos.hpp>
#include <Geode/ui/BasedButtonSprite.hpp>
#include <Geode/utils/NodeIDs.hpp>

using namespace geode::prelude;
using namespace geode::node_ids;

$register_ids(LevelListCell) {
setIDSafe<CCLayerColor>(this, 0, "background");

if (auto mainLayer = setIDSafe<CCLayer>(this, 1, "main-layer")) {
if (auto mainMenu = setIDSafe<CCMenu>(mainLayer, 0, "main-menu")) {
setIDSafe<CCSprite>(mainLayer, 0, "difficulty-sprite");
setIDSafe<CCMenuItemSpriteExtra>(mainMenu, 0, "view-button");
setIDSafe<CCMenuItemSpriteExtra>(mainMenu, 1, "creator-name");
setIDSafe<CCMenuItemSpriteExtra>(mainMenu, 2, "info-button");

std::map<const char*, const char*> frameToNodeID = {
{ "GJ_likesIcon_001.png", "likes-icon" },
{ "GJ_downloadsIcon_001.png", "downloads-icon" },
{ "GJ_featuredCoin_001.png", "featured-icon" },
{ "GJ_completesIcon_001.png", "completion-icon" }
};

for (auto &entry : frameToNodeID) {
if (auto icon = ::getChildBySpriteFrameName(mainLayer, entry.first)) {
icon->setID(entry.second);
}
}

if (auto diamondIcon = ::getChildBySpriteFrameName(mainLayer, "diamond_small01_001.png")) {
diamondIcon->setID("diamond-icon");
setIDSafe<CCLabelBMFont>(mainLayer, 0, "diamond-label");
setIDSafe<CCLabelBMFont>(mainLayer, 1, "list-name-label");
setIDSafe<CCLabelBMFont>(mainLayer, 2, "progress-label");
setIDSafe<CCLabelBMFont>(mainLayer, 3, "downloads-label");
setIDSafe<CCLabelBMFont>(mainLayer, 4, "likes-label");
setIDSafe<CCLabelBMFont>(mainLayer, 5, "completion-label");
} else {
setIDSafe<CCLabelBMFont>(mainLayer, 0, "list-name-label");
setIDSafe<CCLabelBMFont>(mainLayer, 1, "progress-label");
setIDSafe<CCLabelBMFont>(mainLayer, 2, "downloads-label");
setIDSafe<CCLabelBMFont>(mainLayer, 3, "likes-label");
}

auto mainLayerChildren = CCArrayExt<CCNode*>(mainLayer->getChildren());

for (int i = 0; i < mainLayerChildren.size(); i++) {
if (auto theObject = typeinfo_cast<CCLabelBMFont*>(mainLayerChildren[i])) {
if (theObject->getID() == "progress-label") {
if (auto theSprite = typeinfo_cast<CCSprite*>(mainLayerChildren[i - 1])) {
theSprite->setID("progress-bar");
if (getChildByIDRecursive("completion-label")) {
if (auto theOtherSprite = typeinfo_cast<CCSprite*>(mainLayerChildren[12])) {
if (theOtherSprite->getID() == "") {
theOtherSprite->setID("completion-diamond");
}
}
}
break;
}
}
}
}

if (!(getChildByIDRecursive("downloads-icon") && getChildByIDRecursive("likes-icon"))) {
mainLayerChildren[5]->setID("info-sprite");
if (auto theChild = typeinfo_cast<CCLabelBMFont*>(mainLayerChildren[6])) {
if (strcmp(theChild->getID().c_str(), "downloads-label") == 0) {
if (strcmp(theChild->getString(), "Unpublished") == 0) {
theChild->setID("unpublished-label");
} else if (strcmp(theChild->getString(), "Uploaded") == 0) {
theChild->setID("uploaded-label");
} else {
theChild->setID("unknown-info-label");
}
}
}
}
}
}
}

struct LevelListCellIDs : Modify<LevelListCellIDs, LevelListCell> {
static void onModify(auto& self) {
if (!self.setHookPriority("LevelListCell::loadFromList", GEODE_ID_PRIORITY)) {
log::warn("Failed to set LevelListCell::loadFromList hook priority, node IDs may not work properly");
}
}

void loadFromList(GJLevelList* p0) {
LevelListCell::loadFromList(p0);

NodeIDs::get()->provide(this);
}
};
146 changes: 146 additions & 0 deletions src/LevelListLayer.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
#include <Geode/Bindings.hpp>
#include <Geode/modify/LevelListLayer.hpp>
#include <Geode/utils/cocos.hpp>
#include <Geode/ui/BasedButtonSprite.hpp>
#include <Geode/utils/NodeIDs.hpp>

using namespace geode::prelude;
using namespace geode::node_ids;

$register_ids(LevelListLayer) {
setIDSafe<CCSprite>(this, 0, "background");
setIDSafe<CCSprite>(this, 1, "bottom-left-corner");
setIDSafe<CCSprite>(this, 2, "bottom-right-corner");

setIDSafe<CCScale9Sprite>(this, 0, "list-title-input-bg");
setIDSafe<CCTextInputNode>(this, 0, "list-title-input");

setIDSafe<LoadingCircle>(this, 0, "loading-circle");

setIDSafe<TextArea>(this, 0, "no-internet-label");

bool isPublishedList = (!getChildByIDRecursive("list-title-input-bg") && !getChildByIDRecursive("list-title-input"));

if (isPublishedList) {
setIDSafe<CCLabelBMFont>(this, 0, "title-label");
setIDSafe<CCLabelBMFont>(this, 1, "progress-label");
setIDSafe<CCLabelBMFont>(this, 2, "downloads-label");
setIDSafe<CCLabelBMFont>(this, 3, "likes-label");
} else {
if (!getChildByIDRecursive("list-title-input")) {
setIDSafe<CCLabelBMFont>(this, 1, "progress-label");
setIDSafe<CCLabelBMFont>(this, 0, "published-list-label");
} else {
setIDSafe<CCLabelBMFont>(this, 0, "progress-label");
}
}

std::map<const char*, const char*> frameToNodeID = {
{ "GJ_likesIcon_001.png", "likes-icon" },
{ "GJ_downloadsIcon_001.png", "downloads-icon" },
{ "GJ_featuredCoin_001.png", "featured-icon" }
};

for (auto &entry : frameToNodeID) {
if (auto icon = ::getChildBySpriteFrameName(this, entry.first)) {
icon->setID(entry.second);
}
}

if (auto diamondsIcon = ::getChildBySpriteFrameName(this, "GJ_diamondsIcon_001.png")) {
diamondsIcon->setID("diamonds-icon");
setIDSafe<CCLabelBMFont>(this, 4, "diamonds-label");
} else if (auto completetionIcon = ::getChildBySpriteFrameName(this, "GJ_completesIcon_001.png")) {
completetionIcon->setID("completion-icon");
setIDSafe<CCLabelBMFont>(this, 4, "completion-label");
}

bool isIncompleteRatedList = getChildByIDRecursive("completion-icon");

if (auto mainMenu = setIDSafe<CCMenu>(this, 0, "main-menu")) {
setIDSafe<CCMenuItemSpriteExtra>(mainMenu, 0, "back-menu");

std::map<const char*, const char*> buttonToNodeID = {
{ "GJ_deleteBtn_001.png", "delete-button" },
{ "GJ_updateBtn_001.png", "refresh-button" },
{ "GJ_chatBtn_001.png", "desc-button" },
{ "GJ_infoBtn_001.png", "info-button" },
{ "GJ_editModeBtn_001.png", "edit-button" },
{ "GJ_duplicateBtn_001.png", "copy-button" },
{ "GJ_shareBtn_001.png", "share-button" },
{ "GJ_like2Btn_001.png", "like-button" },
{ "GJ_like2Btn2_001.png", "like-button" },
{ "GJ_plainBtn_001.png", "rate-button" },
{ "gj_heartOff_001.png", "favorite-button" },
{ "gj_heartOn_001.png", "favorite-button" },
{ "GJ_infoIcon_001.png", "info-icon" }
};

for (auto &entry : buttonToNodeID) {
if (auto icon = ::getChildBySpriteFrameName(mainMenu, entry.first)) {
icon->setID(entry.second);
}
}

if (isPublishedList) {
auto mainMenuChildren = CCArrayExt<CCNode*>(mainMenu->getChildren());
if (typeinfo_cast<CCMenuItemSpriteExtra*>(mainMenuChildren[1])) {
mainMenuChildren[1]->setID("creator-name");
// known issue: after finishing a published + rated level list, mainMenuChildren[8] loses its ID. not sure why.
if (isIncompleteRatedList && mainMenuChildren[8]->getID() == "") {
if (auto menu = typeinfo_cast<CCMenuItemSpriteExtra*>(mainMenuChildren[8])) {
menu->setID("claim-rewards-menu");
if (auto child = menu->getChildren()->objectAtIndex(0)) {
if (auto menuChild = typeinfo_cast<CCNode*>(child)) {
menuChild->setID("claim-rewards-child");
if (auto grandchild = menuChild->getChildren()->objectAtIndex(0)) {
if (auto menuGrandchild = typeinfo_cast<CCNode*>(grandchild)) {
menuGrandchild->setID("claim-rewards-grandchild");
auto grandchildren = CCArrayExt<CCNode*>(menuGrandchild->getChildren());
grandchildren[0]->setID("claim-rewards-sprite");
grandchildren[1]->setID("diamonds-sprite");
grandchildren[2]->setID("diamonds-label");
}
}
}
}
}
}
}
}
}
auto children = CCArrayExt<CCNode*>(getChildren());
if (isPublishedList) {
if (children[5]->getID() == "" && typeinfo_cast<CCSprite*>(children[5])) {
children[5]->setID("difficulty-sprite");
children[9]->setID("progress-bar");
if (isIncompleteRatedList) {
children[15]->setID("completion-diamond");
}
}
} else {
if (!getChildByIDRecursive("list-title-input")) {
setIDSafe<CCLabelBMFont>(this, 0, "published-list-label");
setIDSafe<CCLabelBMFont>(this, 1, "progress-label");
}
if (children[8]->getID() == "" && typeinfo_cast<CCSprite*>(children[8])) {
children[8]->setID("progress-bar");
}
}
}

struct LevelListLayerIDs : Modify<LevelListLayerIDs, LevelListLayer> {
static void onModify(auto& self) {
if (!self.setHookPriority("LevelListLayer::init", GEODE_ID_PRIORITY)) {
log::warn("Failed to set LevelListLayer::init hook priority, node IDs may not work properly");
}
}

bool init(GJLevelList* p0) {
if (!LevelListLayer::init(p0)) return false;

NodeIDs::get()->provide(this);

return true;
}
};
75 changes: 75 additions & 0 deletions src/MoreSearchLayer.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
#include <Geode/Bindings.hpp>
#include <Geode/modify/MoreSearchLayer.hpp>
#include <Geode/utils/cocos.hpp>
#include <Geode/ui/BasedButtonSprite.hpp>
#include <Geode/utils/NodeIDs.hpp>

using namespace geode::prelude;
using namespace geode::node_ids;

$register_ids(MoreSearchLayer) {
if (auto mainLayer = setIDSafe<CCLayer>(this, 0, "main-layer")) {
setIDSafe<CCScale9Sprite>(mainLayer, 0, "background");
setIDSafe<CCScale9Sprite>(mainLayer, 1, "custom-song-id-input-bg");

setIDSafe<CCLabelBMFont>(mainLayer, 0, "advanced-options-label");

setIDSafe<CCLabelBMFont>(mainLayer, 1, "uncompleted-filter-label");
setIDSafe<CCLabelBMFont>(mainLayer, 2, "completed-filter-label");
setIDSafe<CCLabelBMFont>(mainLayer, 3, "original-filter-label");
setIDSafe<CCLabelBMFont>(mainLayer, 4, "coins-filter-label");
setIDSafe<CCLabelBMFont>(mainLayer, 5, "two-player-filter-label");
setIDSafe<CCLabelBMFont>(mainLayer, 6, "song-filter-label");
setIDSafe<CCLabelBMFont>(mainLayer, 7, "no-star-filter-label");
setIDSafe<CCLabelBMFont>(mainLayer, 8, "featured-filter-label");
setIDSafe<CCLabelBMFont>(mainLayer, 9, "epic-filter-label");
setIDSafe<CCLabelBMFont>(mainLayer, 10, "legendary-filter-label");
setIDSafe<CCLabelBMFont>(mainLayer, 11, "mythic-filter-label");

setIDSafe<CCLabelBMFont>(mainLayer, 12, "select-song-label");
setIDSafe<CCLabelBMFont>(mainLayer, 13, "normal-song-label");


setIDSafe<CCTextInputNode>(mainLayer, 0, "song-id-input");

if (auto mainMenu = setIDSafe<CCMenu>(mainLayer, 0, "main-menu")) {
setIDSafe<CCMenuItemSpriteExtra>(mainMenu, 0, "close-button");

setIDSafe<CCMenuItemToggler>(mainMenu, 0, "uncompleted-filter-toggler");
setIDSafe<CCMenuItemToggler>(mainMenu, 1, "completed-filter-toggler");
setIDSafe<CCMenuItemToggler>(mainMenu, 2, "original-filter-toggler");
setIDSafe<CCMenuItemToggler>(mainMenu, 3, "coins-filter-toggler");
setIDSafe<CCMenuItemToggler>(mainMenu, 4, "two-player-filter-toggler");
setIDSafe<CCMenuItemToggler>(mainMenu, 5, "song-filter-toggler");
setIDSafe<CCMenuItemToggler>(mainMenu, 6, "no-star-filter-toggler");
setIDSafe<CCMenuItemToggler>(mainMenu, 7, "featured-filter-toggler");
setIDSafe<CCMenuItemToggler>(mainMenu, 8, "epic-filter-toggler");
setIDSafe<CCMenuItemToggler>(mainMenu, 9, "legendary-filter-toggler");
setIDSafe<CCMenuItemToggler>(mainMenu, 10, "mythic-filter-toggler");

setIDSafe<CCMenuItemSpriteExtra>(mainMenu, 1, "normal-song-button");
setIDSafe<CCMenuItemSpriteExtra>(mainMenu, 2, "custom-song-button");

setIDSafe<CCMenuItemSpriteExtra>(mainMenu, 3, "prev-normal-song-button");
setIDSafe<CCMenuItemSpriteExtra>(mainMenu, 4, "next-normal-song-button");

setIDSafe<CCMenuItemSpriteExtra>(mainMenu, 5, "info-button");
}
}
}

struct MoreSearchLayerIDs : Modify<MoreSearchLayerIDs, MoreSearchLayer> {
static void onModify(auto& self) {
if (!self.setHookPriority("MoreSearchLayer::init", GEODE_ID_PRIORITY)) {
log::warn("Failed to set MoreSearchLayer::init hook priority, node IDs may not work properly");
}
}

bool init() {
if (!MoreSearchLayer::init()) return false;

NodeIDs::get()->provide(this);

return true;
}
};
Loading

0 comments on commit 53d8bd9

Please sign in to comment.