Skip to content

Commit 0161d70

Browse files
committed
fix fallback userobject not being properly assigned in certain cases
1 parent 0771502 commit 0161d70

File tree

2 files changed

+64
-33
lines changed

2 files changed

+64
-33
lines changed

mod.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
2-
"geode": "3.1.1",
3-
"version": "v1.6.1",
2+
"geode": "3.7.1",
3+
"version": "v1.6.2",
44
"gd": {
55
"win": "2.206",
66
"android": "2.206",
@@ -17,4 +17,4 @@
1717
]
1818
},
1919
"repository": "https://github.com/geode-sdk/textureldr"
20-
}
20+
}

src/Fallback.cpp

+61-30
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33

44
using namespace geode::prelude;
55

6-
void assignFallbackObj(CCNode* node) {
6+
static constexpr int FALLBACK_TAG = 105871529;
7+
8+
static void assignFallbackObj(CCNode* node) {
79
if (!node) return;
810
node->setUserObject("fallback"_spr, CCBool::create(true));
911
}
@@ -21,50 +23,79 @@ class $modify(CCSprite) {
2123
}
2224
return sprite;
2325
}
26+
2427
static CCSprite* createWithSpriteFrameName(const char* name) {
25-
auto* sprite = CCSprite::createWithSpriteFrameName(name);
28+
auto* spriteFrame = CCSpriteFrameCache::get()->spriteFrameByName(name);
29+
30+
// we check for tag instead of the frame name because this is significantly better for performance
31+
bool needFallback = !spriteFrame || spriteFrame->getTag() == FALLBACK_TAG;
32+
33+
if (!needFallback) {
34+
return CCSprite::createWithSpriteFrame(spriteFrame);
35+
}
36+
37+
CCSprite* sprite = CCSprite::create("fallback.png"_spr);
2638
if (sprite == nullptr) {
27-
sprite = CCSprite::create("fallback.png"_spr);
28-
if (sprite == nullptr) {
29-
sprite = CCSprite::create("bigFont.png");
30-
}
31-
assignFallbackObj(sprite);
39+
sprite = CCSprite::create("bigFont.png");
3240
}
41+
assignFallbackObj(sprite);
3342
return sprite;
3443
}
3544

3645
bool initWithSpriteFrame(CCSpriteFrame* frame) {
3746
if (frame == nullptr) {
38-
return CCSprite::initWithFile("fallback.png"_spr);
47+
bool result = CCSprite::initWithFile("fallback.png"_spr);
48+
if (result) {
49+
assignFallbackObj(this);
50+
}
51+
52+
return result;
3953
}
4054
return CCSprite::initWithSpriteFrame(frame);
4155
}
4256
};
4357

4458
class $modify(CCSpriteFrameCache) {
45-
cocos2d::CCSpriteFrame* spriteFrameByName(char const* name) {
46-
auto* frame = CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(name);
47-
if (frame == nullptr) {
48-
// this is stupid but rob intentionally doesnt load all icons at startup,
49-
// probably to save memory, so do this to not use fallback on icons
50-
static constexpr std::string_view prefixes[] = {
51-
"player_",
52-
"ship_",
53-
"dart_",
54-
"bird_",
55-
"robot_",
56-
"spider_",
57-
"swing_",
58-
"jetpack_",
59-
};
60-
const std::string_view nameStr = name;
61-
for (auto const& prefix : prefixes) {
62-
if (nameStr.find(prefix) != -1) {
63-
return frame;
64-
}
59+
CCSpriteFrame* spriteFrameByName(char const* name) {
60+
auto* frame = CCSpriteFrameCache::spriteFrameByName(name);
61+
62+
if (frame != nullptr) {
63+
return frame;
64+
}
65+
66+
// this is stupid but rob intentionally doesnt load all icons at startup,
67+
// probably to save memory, so do this to not use fallback on icons
68+
static constexpr std::string_view prefixes[] = {
69+
"player_",
70+
"ship_",
71+
"dart_",
72+
"bird_",
73+
"robot_",
74+
"spider_",
75+
"swing_",
76+
"jetpack_",
77+
};
78+
const std::string_view nameStr = name;
79+
for (auto const& prefix : prefixes) {
80+
if (nameStr.find(prefix) != -1) {
81+
return frame;
6582
}
66-
frame = CCSpriteFrame::create("fallback.png"_spr, {ccp(0, 0), ccp(128, 128)});
6783
}
68-
return frame;
84+
85+
// check if the fallback was already added
86+
auto fallbackFrame = CCSpriteFrameCache::spriteFrameByName("fallback.png"_spr);
87+
if (fallbackFrame) {
88+
return fallbackFrame;
89+
}
90+
91+
// create the fallback frame and add to cache
92+
fallbackFrame = CCSpriteFrame::create("fallback.png"_spr, {ccp(0, 0), ccp(128, 128)});
93+
94+
if (fallbackFrame) {
95+
fallbackFrame->setTag(FALLBACK_TAG);
96+
this->addSpriteFrame(fallbackFrame, "fallback.png"_spr);
97+
}
98+
99+
return fallbackFrame;
69100
}
70101
};

0 commit comments

Comments
 (0)