c++ abi can go burn in gaseous tungsten

This commit is contained in:
altalk23 2023-10-01 17:36:44 +03:00
parent b0ab2f95f6
commit fc58ab79ef
9 changed files with 58 additions and 16 deletions

View file

@ -3611,7 +3611,7 @@ class GameObject : CCSpritePlus {
bool m_unk3D9;
bool m_isSelected;
int m_globalClickCounter;
PAD = mac 0x8, win 0x8;
PAD = mac 0x8, win 0x8, android 0x8;
bool m_shouldUpdateColorSprite;
float m_multiScaleMultiplier;
bool m_isGroupParent;
@ -3624,20 +3624,20 @@ class GameObject : CCSpritePlus {
int m_editorLayer;
int m_editorLayer2;
int m_unk414;
PAD = mac 0xc, win 0xc;
PAD = mac 0xc, win 0xc, android 0xc;
cocos2d::CCPoint m_firstPosition;
bool m_unk42C;
bool m_unk42D;
PAD = mac 0x6, win 0x6;
PAD = mac 0x6, win 0x6, android 0x6;
bool m_isAnimated;
PAD = mac 0x7, win 0x7;
PAD = mac 0x7, win 0x7, android 0x7;
bool m_hasEffectLine;
bool m_specialUnk43d;
PAD = mac 0x1, win 0x1;
PAD = mac 0x1, win 0x1, android 0x1;
bool m_hasDurationLine;
bool m_isTriggerable;
bool m_triggeredInEditor;
PAD = mac 0x6, win 0x6;
PAD = mac 0x6, win 0x6, android 0x6;
bool m_highDetail;
ColorActionSprite* m_colorActionSpriteBase;
ColorActionSprite* m_colorActionSpriteDetail;
@ -3646,7 +3646,7 @@ class GameObject : CCSpritePlus {
bool m_unk459;
bool m_unk45A;
bool m_wasForcedRotatedPositionUpdateIdk;
PAD = mac 0x8, win 0x8;
PAD = mac 0x8, win 0x8, android 0x8;
bool m_orbMultiActivate;
}

View file

@ -7,9 +7,9 @@
#include <string>
#include <string_view>
std::string mangleIdent(std::string_view str) {
std::string mangleIdent(std::string_view str, bool ne = true) {
if (str.find("::") != -1) {
std::string result = "N";
std::string result = ne ? "N" : "";
auto s = str;
do {
const auto i = s.find("::");
@ -19,7 +19,7 @@ std::string mangleIdent(std::string_view str) {
else
s = s.substr(i + 2);
} while(s.size());
return result + "E";
return result + (ne ? "E" : "");
} else {
return std::to_string(str.size()) + std::string(str);
}
@ -125,6 +125,18 @@ std::string mangleType(std::vector<std::string>& seen, std::string name, bool su
std::string generateAndroidSymbol(const Class& clazz, const FunctionBindField* fn) {
auto& decl = fn->prototype;
if (decl.type != FunctionType::Normal) {
// ctor and dtor
switch (decl.type) {
case FunctionType::Ctor:
return "_ZN" + mangleIdent(clazz.name, false) + "C2Ev";
case FunctionType::Dtor:
return "_ZN" + mangleIdent(clazz.name, false) + "D2Ev";
default:
throw std::runtime_error("Unknown function type");
}
}
std::string mangledSymbol = "_Z" + mangleIdent(clazz.name + "::" + decl.name);
if (decl.args.empty()) {
mangledSymbol += "v";

View file

@ -136,6 +136,7 @@ namespace codegen {
inline bool shouldAndroidBind(const FunctionBindField* fn) {
if (codegen::platform == Platform::Android) {
if (fn->prototype.type != FunctionType::Normal) return true;
for (auto& [type, name] : fn->prototype.args) {
if (can_find(type.name, "gd::")) return true;
}

View file

@ -81,8 +81,7 @@ namespace geode {
GEODE_IOS(GEODE_FILL_CONSTRUCTOR(Class_, 0){}) \
GEODE_WINDOWS(Class_(geode::CutoffConstructorType, size_t fill) \
: Class_() {}) \
GEODE_ANDROID(Class_(geode::CutoffConstructorType, size_t fill) \
: Class_() {})
GEODE_ANDROID(GEODE_FILL_CONSTRUCTOR(Class_, 0){})
#define GEODE_CUTOFF_CONSTRUCTOR_COCOS(Class_, Base_) \
GEODE_MACOS(Class_(geode::CutoffConstructorType, size_t fill) \
@ -91,8 +90,8 @@ namespace geode {
: Base_(geode::CutoffConstructor, fill){}) \
GEODE_WINDOWS(Class_(geode::CutoffConstructorType, size_t fill) \
: Class_() {}) \
GEODE_ANDROID(Class_(geode::CutoffConstructorType, size_t fill) \
: Class_() {})
GEODE_ANDROID(Class_(geode::CutoffConstructorType, size_t fill) \
: Base_(geode::CutoffConstructor, fill){})
#define GEODE_CUTOFF_CONSTRUCTOR_GD(Class_, Base_) \
GEODE_WINDOWS(Class_(geode::CutoffConstructorType, size_t fill) \
@ -106,7 +105,8 @@ namespace geode {
#define GEODE_CUTOFF_CONSTRUCTOR_CUTOFF(Class_, Base_) \
GEODE_WINDOWS(GEODE_FILL_CONSTRUCTOR(Class_, sizeof(Base_)) : Base_(){}) \
GEODE_ANDROID(GEODE_FILL_CONSTRUCTOR(Class_, sizeof(Base_)) : Base_(){}) \
GEODE_ANDROID(Class_(geode::CutoffConstructorType, size_t fill) \
: Base_(geode::CutoffConstructor, fill){}) \
GEODE_MACOS(Class_(geode::CutoffConstructorType, size_t fill) \
: Base_(geode::CutoffConstructor, fill){}) \
GEODE_IOS(Class_(geode::CutoffConstructorType, size_t fill) \

View file

@ -34,6 +34,8 @@ class CC_DLL CCEGLView : public CCEGLViewProtocol
{
GEODE_FRIEND_MODIFY
public:
GEODE_CUSTOM_CONSTRUCTOR_COCOS(CCEGLView, CCEGLViewProtocol)
CCEGLView();
virtual ~CCEGLView();

View file

@ -58,7 +58,7 @@ namespace geode::modifier {
using Intermediate = Modify<Parent, Base>;
// Padding used for guaranteeing any member of parents
// will be in between sizeof(Intermediate) and sizeof(Parent)
uintptr_t m_padding;
alignas(Base) uintptr_t m_padding;
public:
// the constructor that constructs the fields.

View file

@ -156,4 +156,25 @@ struct CustomLoadingLayer : Modify<CustomLoadingLayer, LoadingLayer> {
}
this->updateLoadingBar();
}
};
#include <Geode/modify/PlayLayer.hpp>
struct FieldTest : Modify<FieldTest, PlayLayer> {
int field = 0x10101010;
bool init(GJGameLevel* level) {
if (!PlayLayer::init(level)) return false;
log::debug("GameManager 1 {}", GameManager::sharedState());
log::debug("PlayLayer 1 {}", PlayLayer::get());
m_fields->field += 0x20202020;
log::debug("GameManager 2 {}", GameManager::sharedState());
log::debug("PlayLayer 2 {}", PlayLayer::get());
return true;
}
void update(float dt) {
log::debug("GameManager {}", GameManager::sharedState());
log::debug("PlayLayer {}", PlayLayer::get());
PlayLayer::update(dt);
}
};

View file

@ -20,4 +20,8 @@ extern "C" [[gnu::visibility("default")]] jint JNI_OnLoad(JavaVM* vm, void* rese
return JNI_VERSION_1_1;
}
extern "C" [[gnu::visibility("default")]] void emptyFunction(void*) {
// empty
}
#endif

View file

@ -17,4 +17,6 @@ GEODE_MEMBER_CHECK(PlayLayer, m_bottomGround, 0x37c);
GEODE_MEMBER_CHECK(PlayLayer, m_topGround, 0x380);
GEODE_MEMBER_CHECK(PlayLayer, m_level, 0x470);
static_assert(sizeof(GameObject) == 0x42c);
#endif