Skip to content

Commit

Permalink
You can see them on the menu now!
Browse files Browse the repository at this point in the history
  • Loading branch information
hiimjasmine00 committed Nov 19, 2024
1 parent d3ff538 commit 9a88fd1
Show file tree
Hide file tree
Showing 13 changed files with 94 additions and 45 deletions.
3 changes: 2 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_OSX_ARCHITECTURES "x86_64;arm64")
set(CMAKE_CXX_VISIBILITY_PRESET hidden)

project(MoreIcons VERSION 1.4.6)
project(MoreIcons VERSION 1.5.0)

add_library(${PROJECT_NAME} SHARED
src/api/MoreIconsAPI.cpp
Expand All @@ -17,6 +17,7 @@ add_library(${PROJECT_NAME} SHARED
src/hooks/GJGarageLayer.cpp
src/hooks/GJRobotSprite.cpp
src/hooks/LoadingLayer.cpp
src/hooks/MenuGameLayer.cpp
src/hooks/MenuLayer.cpp
src/hooks/PlayerObject.cpp
src/hooks/ProfilePage.cpp
Expand Down
6 changes: 6 additions & 0 deletions changelog.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
# More Icons Changelog
## v1.5.0 (2024-11-18)
- Added custom icons to the main menu
- Fixed a bug where switching separate dual icons would not work properly in the icon kit
- Fixed crashing incompatibilities with the mod "Fine Outline" by Alphalaneous
- Fixed some potential spider weirdness

## v1.4.6 (2024-11-15)
- Ported to Geode v4.0.0-beta.1

Expand Down
4 changes: 2 additions & 2 deletions mod.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@
"win": "2.2074",
"mac": "2.2074"
},
"version": "v1.4.6",
"version": "v1.5.0",
"id": "hiimjustin000.more_icons",
"name": "More Icons",
"developer": "hiimjustin000",
"description": "A mod that loads custom icons.",
"dependencies": [
{
"id": "geode.node-ids",
"version": ">=v1.12.0",
"version": ">=v1.17.0",
"importance": "required"
}
],
Expand Down
3 changes: 1 addition & 2 deletions src/MoreIcons.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -139,8 +139,7 @@ class MoreIcons {
static std::vector<std::filesystem::path> getTexturePacks();

static std::string replaceEnd(const std::string& str, const std::string& end, const std::string& replace, bool check = false) {
if (!check || str.ends_with(end)) return str.substr(0, str.size() - end.size()) + replace;
return str;
return !check || str.ends_with(end) ? str.substr(0, str.size() - end.size()) + replace : str;
}

static void loadIcons(
Expand Down
5 changes: 3 additions & 2 deletions src/api/MoreIconsAPI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ void MoreIconsAPI::updatePlayerObject(PlayerObject* object, const std::string& i
auto hasExisted = batchNode && batchNode->getParent() == object->m_mainLayer;
robotSprite->retain();
if (batchNode) {
robotSprite->removeFromParent();
robotSprite->removeFromParentAndCleanup(false);
batchNode->removeFromParent();
batchNode->release();
}
Expand All @@ -150,7 +150,8 @@ void MoreIconsAPI::updatePlayerObject(PlayerObject* object, const std::string& i
batchNode = type == IconType::Robot ? object->m_robotBatchNode : object->m_spiderBatchNode;
batchNode->retain();
batchNode->addChild(robotSprite);
if (hasExisted && object->m_isRobot) object->m_mainLayer->addChild(batchNode, 2);
if (hasExisted && ((type == IconType::Robot && object->m_isRobot) || (type == IconType::Spider && object->m_isSpider)))
object->m_mainLayer->addChild(batchNode, 2);
robotSprite->release();
return;
}
Expand Down
23 changes: 15 additions & 8 deletions src/api/MoreIconsAPI.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -108,17 +108,24 @@ class MoreIconsAPI {

static void updateRobotSprite(GJRobotSprite* sprite, const std::string& icon, IconType type);

static IconType getIconType(PlayerObject* object) {
if (object->m_isShip) {
if (object->m_isPlatformer) return IconType::Jetpack;
else return IconType::Ship;
}
else if (object->m_isBall) return IconType::Ball;
else if (object->m_isBird) return IconType::Ufo;
else if (object->m_isDart) return IconType::Wave;
else if (object->m_isRobot) return IconType::Robot;
else if (object->m_isSpider) return IconType::Spider;
else if (object->m_isSwing) return IconType::Swing;
else return IconType::Cube;
}

static void updatePlayerObject(PlayerObject* object, const std::string& icon) {
if (!object || icon.empty()) return;

if (object->m_isShip) updatePlayerObject(object, icon, object->m_isPlatformer ? IconType::Jetpack : IconType::Ship);
else if (object->m_isBall) updatePlayerObject(object, icon, IconType::Ball);
else if (object->m_isBird) updatePlayerObject(object, icon, IconType::Ufo);
else if (object->m_isDart) updatePlayerObject(object, icon, IconType::Wave);
else if (object->m_isRobot) updatePlayerObject(object, icon, IconType::Robot);
else if (object->m_isSpider) updatePlayerObject(object, icon, IconType::Spider);
else if (object->m_isSwing) updatePlayerObject(object, icon, IconType::Swing);
else updatePlayerObject(object, icon, IconType::Cube);
updatePlayerObject(object, icon, getIconType(object));
}

static void updatePlayerObject(PlayerObject* object, const std::string& icon, IconType type);
Expand Down
11 changes: 2 additions & 9 deletions src/classes/ButtonHooker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,9 @@ using namespace geode::prelude;
ButtonHooker* ButtonHooker::create(CCMenuItem* button, CCObject* listener, SEL_MenuHandler selector) {
auto hooker = new ButtonHooker();
hooker->m_listener = button->m_pListener;
hooker->m_newListener = listener;
hooker->m_selector = button->m_pfnSelector;
hooker->m_newSelector = selector;
hooker->autorelease();
button->setTarget(hooker, menu_selector(ButtonHooker::onClick));
button->setTarget(listener, selector);
button->setUserObject("hooker"_spr, hooker);
hooker->autorelease();
return hooker;
}

void ButtonHooker::onClick(CCObject* sender) {
(m_listener->*m_selector)(sender);
(m_newListener->*m_newSelector)(sender);
}
12 changes: 6 additions & 6 deletions src/classes/ButtonHooker.hpp
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
#define CALL_BUTTON_ORIGINAL(button) \
if (auto hooker = static_cast<ButtonHooker*>(static_cast<CCNode*>(button)->getUserObject("hooker"_spr))) \
(hooker->m_listener->*hooker->m_selector)(button)

class ButtonHooker : public cocos2d::CCObject {
private:
public:
cocos2d::CCObject* m_listener;
cocos2d::CCObject* m_newListener;
cocos2d::SEL_MenuHandler m_selector;
cocos2d::SEL_MenuHandler m_newSelector;
public:
static ButtonHooker* create(cocos2d::CCMenuItem* button, cocos2d::CCObject* listener, cocos2d::SEL_MenuHandler selector);

void onClick(cocos2d::CCObject* sender);
static ButtonHooker* create(cocos2d::CCMenuItem* button, cocos2d::CCObject* listener, cocos2d::SEL_MenuHandler selector);
};
4 changes: 2 additions & 2 deletions src/classes/LogCell.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

using namespace geode::prelude;

LogCell* LogCell::create(LogData const& data, int index, int total, bool dark) {
LogCell* LogCell::create(const LogData& data, int index, int total, bool dark) {
auto ret = new LogCell();
if (ret->init(data, index, total, dark)) {
ret->autorelease();
Expand All @@ -12,7 +12,7 @@ LogCell* LogCell::create(LogData const& data, int index, int total, bool dark) {
return nullptr;
}

bool LogCell::init(LogData const& data, int index, int total, bool dark) {
bool LogCell::init(const LogData& data, int index, int total, bool dark) {
if (!CCLayer::init()) return false;

ignoreAnchorPointForPosition(false);
Expand Down
4 changes: 2 additions & 2 deletions src/classes/LogCell.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ class LogCell : public cocos2d::CCLayer {
int m_index = 0;
int m_total = 0;

bool init(LogData const& data, int index, int total, bool dark);
bool init(const LogData& data, int index, int total, bool dark);
public:
static LogCell* create(LogData const& data, int index, int total, bool dark);
static LogCell* create(const LogData& data, int index, int total, bool dark);
void draw() override;
};
18 changes: 7 additions & 11 deletions src/hooks/GJGarageLayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ class $modify(MIGarageLayer, GJGarageLayer) {
auto p1Button = static_cast<CCMenuItemSpriteExtra*>(playerButtonsMenu->getChildByID("player1-button"));
auto p2Button = static_cast<CCMenuItemSpriteExtra*>(playerButtonsMenu->getChildByID("player2-button"));
if (p1Button && p2Button) {
ButtonHooker::create(p1Button, this, menu_selector(MIGarageLayer::onSelectTab));
ButtonHooker::create(p2Button, this, menu_selector(MIGarageLayer::onSelectTab));
ButtonHooker::create(p1Button, this, menu_selector(MIGarageLayer::newOn2PToggle));
ButtonHooker::create(p2Button, this, menu_selector(MIGarageLayer::newOn2PToggle));
}
}

Expand Down Expand Up @@ -97,10 +97,14 @@ class $modify(MIGarageLayer, GJGarageLayer) {
}

void newOn2PToggle(CCObject* sender) {
CALL_BUTTON_ORIGINAL(sender);

setupCustomPage(m_fields->m_pages[m_iconType]);
}

void newSwap2PKit(CCObject* sender) {
CALL_BUTTON_ORIGINAL(sender);

MoreIcons::swapDual("icon");
MoreIcons::swapDual("ship");
MoreIcons::swapDual("ball");
Expand Down Expand Up @@ -268,20 +272,12 @@ class $modify(MIGarageLayer, GJGarageLayer) {
f->m_pages[m_iconType] = MoreIcons::wrapPage(m_iconType, page);
createNavMenu();

auto gameManager = GameManager::get();
auto iconType = gameManager->m_playerIconType;
MoreIconsAPI::updateSimplePlayer(m_playerObject, Mod::get()->getSavedValue<std::string>(MoreIconsAPI::savedForType(iconType, false), ""), iconType);
if (auto sdi = Loader::get()->getLoadedMod("weebify.separate_dual_icons")) {
auto lastmode = (IconType)sdi->getSavedValue("lastmode", 0);
MoreIconsAPI::updateSimplePlayer(static_cast<SimplePlayer*>(getChildByID("player2-icon")),
Mod::get()->getSavedValue<std::string>(MoreIconsAPI::savedForType(lastmode, true), ""), lastmode);
}

auto spriteFrameCache = CCSpriteFrameCache::get();
for (auto navDot : CCArrayExt<CCMenuItemSpriteExtra*>(m_navDotMenu->getChildren())) {
static_cast<CCSprite*>(navDot->getNormalImage())->setDisplayFrame(spriteFrameCache->spriteFrameByName("gj_navDotBtn_off_001.png"));
}

auto gameManager = GameManager::get();
auto unlockType = gameManager->iconTypeToUnlockType(m_iconType);
auto playerSquare = CCSprite::createWithSpriteFrameName("playerSquare_001.png");
auto objs = CCArray::create();
Expand Down
44 changes: 44 additions & 0 deletions src/hooks/MenuGameLayer.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
#include "../api/MoreIconsAPI.hpp"

using namespace geode::prelude;

#include <Geode/modify/MenuGameLayer.hpp>
class $modify(MIMenuGameLayer, MenuGameLayer) {
void resetPlayer() {
MenuGameLayer::resetPlayer();

auto iconType = MoreIconsAPI::getIconType(m_playerObject);
auto gameManager = GameManager::get();
auto iconCount = gameManager->countForType(iconType);
auto cubeCount = iconType == IconType::Cube ? iconCount : gameManager->countForType(IconType::Cube);
auto& vec = MoreIconsAPI::vectorForType(iconType);

auto randomIcon = (int)roundf((rand() / (float)RAND_MAX) * (iconCount + vec.size() - 1)) + 1;
auto randomCube = m_playerObject->m_isShip || m_playerObject->m_isBird
? (int)roundf((rand() / (float)RAND_MAX) * (cubeCount + MoreIconsAPI::ICONS.size() - 1)) + 1 : 0;

if (randomIcon > iconCount) {
MoreIconsAPI::updatePlayerObject(m_playerObject, vec[randomIcon - iconCount - 1], iconType);
if (m_playerObject->m_isShip || m_playerObject->m_isBird) {
if (randomCube > cubeCount) MoreIconsAPI::updatePlayerObject(m_playerObject, MoreIconsAPI::ICONS[randomCube - cubeCount - 1], IconType::Cube);
else m_playerObject->updatePlayerFrame(randomCube);
}
}
else if (m_playerObject->m_isShip) {
m_playerObject->updatePlayerShipFrame(randomIcon);
if (randomCube > cubeCount) MoreIconsAPI::updatePlayerObject(m_playerObject, MoreIconsAPI::ICONS[randomCube - cubeCount - 1], IconType::Cube);
else m_playerObject->updatePlayerFrame(randomCube);
}
else if (m_playerObject->m_isBall) m_playerObject->updatePlayerRollFrame(randomIcon);
else if (m_playerObject->m_isBird) {
m_playerObject->updatePlayerBirdFrame(randomIcon);
if (randomCube > cubeCount) MoreIconsAPI::updatePlayerObject(m_playerObject, MoreIconsAPI::ICONS[randomCube - cubeCount - 1], IconType::Cube);
else m_playerObject->updatePlayerFrame(randomCube);
}
else if (m_playerObject->m_isDart) m_playerObject->updatePlayerDartFrame(randomIcon);
else if (m_playerObject->m_isRobot) m_playerObject->updatePlayerRobotFrame(randomIcon);
else if (m_playerObject->m_isSpider) m_playerObject->updatePlayerSpiderFrame(randomIcon);
else if (m_playerObject->m_isSwing) m_playerObject->updatePlayerSwingFrame(randomIcon);
else m_playerObject->updatePlayerFrame(randomIcon);
}
};
2 changes: 2 additions & 0 deletions src/hooks/ProfilePage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ class $modify(MIProfilePage, ProfilePage) {
}

void newOn2PToggle(CCObject* sender) {
CALL_BUTTON_ORIGINAL(sender);

auto playerMenu = m_mainLayer->getChildByID("player-menu");
if (!playerMenu) return;

Expand Down

0 comments on commit 9a88fd1

Please sign in to comment.