Skip to content

Commit

Permalink
hi custom bindings
Browse files Browse the repository at this point in the history
  • Loading branch information
user95401 committed Mar 9, 2024
1 parent 122a086 commit 1de5366
Show file tree
Hide file tree
Showing 68 changed files with 108,480 additions and 59 deletions.
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ cmake_minimum_required(VERSION 3.21)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_OSX_ARCHITECTURES "x86_64")
set(GEODE_BINDINGS_REPO_PATH "${CMAKE_CURRENT_LIST_DIR}/bindings")

project(MainLevelsEditor VERSION 3.0.0)

Expand Down
70 changes: 40 additions & 30 deletions _Src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,28 @@ auto read_file(std::string_view path) -> std::string {
out.append(buf, 0, stream.gcount());
return out;
}

void BreakLevelStrValidation() {
#ifdef GEODE_IS_WINDOWS
WriteProcMem(patterns::find_pattern("8a c3 5b 5d c3", ""), { 0xB0, 0x01 });
#endif
std::vector<std::string> explode(const std::string& str, const char& ch) {
std::string next;
std::vector<std::string> result;
// For each character in the string
for (std::string::const_iterator it = str.begin(); it != str.end(); it++) {
// If we've hit the terminal character
if (*it == ch) {
// If we have some characters accumulated
if (!next.empty()) {
// Add them to the result vector
result.push_back(next);
next.clear();
}
}
else {
// Accumulate the next character into the sequence
next += *it;
}
}
if (!next.empty())
result.push_back(next);
return result;
}

void UpdatePagesSetup() {
Expand Down Expand Up @@ -139,8 +156,6 @@ class $modify(LoadingLayer) {
TodoReturn loadingFinished() {
//create some inis
LevelSelectLayer::create(0);
//break level str check
BreakLevelStrValidation();
LoadingLayer::loadingFinished();
};
};
Expand All @@ -152,7 +167,6 @@ class $modify(LevelSelectLayer) {
auto rtn = LevelSelectLayer::init(p0);
return rtn;
};
#ifdef GEODE_IS_WINDOWS
ccColor3B colorForPage(int page) {
ccColor3B _ccColor3B = LevelSelectLayer::colorForPage(page);

Expand Down Expand Up @@ -181,7 +195,6 @@ class $modify(LevelSelectLayer) {

return _ccColor3B;
}
#endif
};

#if 1
Expand Down Expand Up @@ -315,46 +328,43 @@ GJGameLevel* processOutLevelByConfig(int id, GJGameLevel* pGJGameLevel) {

return pGJGameLevel;
}
#ifdef GEODE_IS_WINDOWS
#define LevelToolsero() LevelTools::
#define LevelToolseros static
#else
#define LevelToolsero() this->
#define LevelToolseros
#endif
class $modify(LevelTools) {
LevelToolseros gd::string getAudioFileName(int p0) {
std::string crRet = LevelToolsero()getAudioFileName(p0);
static gd::string getAudioFileName(int p0) {
std::string crRet = LevelTools::getAudioFileName(p0);
crRetAAAsdp0("Filename", FilePathFromModFolder("_AudioTracks.ini"));
return crRet;
}
LevelToolseros gd::string getAudioTitle(int p0) {
gd::string crRet = LevelToolsero()getAudioTitle(p0);
static gd::string getAudioTitle(int p0) {
gd::string crRet = LevelTools::getAudioTitle(p0);
crRetAAAsdp0("Title", FilePathFromModFolder("_AudioTracks.ini"));
return crRet;
}
LevelToolseros gd::string nameForArtist(int p0) {
gd::string crRet = LevelToolsero()nameForArtist(p0);
static gd::string nameForArtist(int p0) {
gd::string crRet = LevelTools::nameForArtist(p0);
crRetAAAsdp0("name", FilePathFromModFolder("_Artists.ini"));
return crRet;
}
LevelToolseros gd::string fbURLForArtist(int p0) {
gd::string crRet = LevelToolsero()fbURLForArtist(p0);
static gd::string fbURLForArtist(int p0) {
gd::string crRet = LevelTools::fbURLForArtist(p0);
crRetAAAsdp0("fbURL", FilePathFromModFolder("_Artists.ini"));
return crRet;
}
LevelToolseros gd::string ngURLForArtist(int p0) {
gd::string crRet = LevelToolsero()ngURLForArtist(p0);
static gd::string ngURLForArtist(int p0) {
gd::string crRet = LevelTools::ngURLForArtist(p0);
crRetAAAsdp0("ngURL", FilePathFromModFolder("_Artists.ini"));
return crRet;
}
LevelToolseros gd::string ytURLForArtist(int p0) {
gd::string crRet = LevelToolsero()ytURLForArtist(p0);
static gd::string ytURLForArtist(int p0) {
gd::string crRet = LevelTools::ytURLForArtist(p0);
crRetAAAsdp0("ytURL", FilePathFromModFolder("_Artists.ini"));
return crRet;
}
LevelToolseros GJGameLevel* getLevel(int p0, bool p1) {
GJGameLevel* pGJGameLevel = processOutLevelByConfig(p0, LevelToolsero()getLevel(p0, p1));
static GJGameLevel* getLevel(int p0, bool p1) {
GJGameLevel* pGJGameLevel = processOutLevelByConfig(p0, LevelTools::getLevel(p0, p1));
return pGJGameLevel;
}
bool verifyLevelIntegrity(gd::string p0, int p1) {
LevelTools::verifyLevelIntegrity(p0, p1);
return 1;
}
};
29 changes: 0 additions & 29 deletions _Src/win32/ModUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -92,35 +92,6 @@ std::string getRandomFileNameFromDir(std::string path, std::string or_else) {
return or_else;
}

/*
create strings vector by splitting string with separator char
example:
log(explode("zero_str.str1.strTwo", '.')[2]); //print strTwo
*/
std::vector<std::string> explode(const std::string& str, const char& ch) {
std::string next;
std::vector<std::string> result;
// For each character in the string
for (std::string::const_iterator it = str.begin(); it != str.end(); it++) {
// If we've hit the terminal character
if (*it == ch) {
// If we have some characters accumulated
if (!next.empty()) {
// Add them to the result vector
result.push_back(next);
next.clear();
}
}
else {
// Accumulate the next character into the sequence
next += *it;
}
}
if (!next.empty())
result.push_back(next);
return result;
}

//set every char of string to lower
void strToLower(std::string& str) {
for (auto& c : str) c = tolower(c);
Expand Down
162 changes: 162 additions & 0 deletions bindings/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
cmake_minimum_required(VERSION 3.21 FATAL_ERROR)

project(GeodeBindings VERSION 1.0.0)

if (NOT DEFINED GEODE_TARGET_PLATFORM)
message(FATAL_ERROR "GEODE_TARGET_PLATFORM is not defined.")
endif()
if (NOT DEFINED GEODE_GD_VERSION)
message(FATAL_ERROR "GEODE_GD_VERSION is not defined.")
endif()
if (NOT DEFINED GEODE_LOADER_PATH)
message(FATAL_ERROR "GEODE_LOADER_PATH is not defined.")
endif()

if (NOT GEODE_BINDINGS_PATH)
set(GEODE_BINDINGS_PATH ${CMAKE_CURRENT_SOURCE_DIR}/bindings/${GEODE_GD_VERSION})
endif()

set(GEODE_CODEGEN_BINARY_OUT ${CMAKE_CURRENT_BINARY_DIR}/codegen)
set(GEODE_CODEGEN_PATH ${CMAKE_CURRENT_BINARY_DIR}/bindings)

set(GEODE_CODEGEN_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/codegen)
set(GEODE_CODEGEN_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/codegen-build)

if (NOT DEFINED SKIP_BUILDING_CODEGEN)
if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
set(GEODE_CODEGEN_DOWNLOAD_FILE_NAME geode-codegen-win.exe)
set(GEODE_CODEGEN_TARGET_FILE_NAME Codegen.exe)
elseif (CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux")
set(GEODE_CODEGEN_DOWNLOAD_FILE_NAME geode-codegen-linux)
set(GEODE_CODEGEN_TARGET_FILE_NAME Codegen)
elseif (CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin")
set(GEODE_CODEGEN_DOWNLOAD_FILE_NAME geode-codegen-mac)
set(GEODE_CODEGEN_TARGET_FILE_NAME Codegen)
else()
unset(GEODE_CODEGEN_DOWNLOAD_FILE_NAME)
endif()
if (DEFINED GEODE_CODEGEN_DOWNLOAD_FILE_NAME)
message(STATUS "Downloading Codegen")
message(NOTICE "Set SKIP_BUILDING_CODEGEN to OFF to force codegen to build locally.")
# have to run file(DOWNLOAD) twice to check if it exists first because
# cmake is silly and fails the entire configure even if i have STATUS set
file(DOWNLOAD
https://github.com/geode-sdk/bindings/releases/download/codegen/${GEODE_CODEGEN_DOWNLOAD_FILE_NAME}
STATUS GEODE_CODEGEN_DOWNLOAD_STATUS
)
list(GET GEODE_CODEGEN_DOWNLOAD_STATUS 0 GEODE_CODEGEN_DOWNLOAD_STATUS_CODE)
if (${GEODE_CODEGEN_DOWNLOAD_STATUS_CODE} EQUAL 0)
file(MAKE_DIRECTORY ${GEODE_CODEGEN_BINARY_OUT})
file(DOWNLOAD
https://github.com/geode-sdk/bindings/releases/download/codegen/${GEODE_CODEGEN_DOWNLOAD_FILE_NAME}
${GEODE_CODEGEN_BINARY_OUT}/${GEODE_CODEGEN_TARGET_FILE_NAME}
STATUS GEODE_CODEGEN_DOWNLOAD_STATUS
)
list(GET GEODE_CODEGEN_DOWNLOAD_STATUS 0 GEODE_CODEGEN_DOWNLOAD_STATUS_CODE)
endif()
if (${GEODE_CODEGEN_DOWNLOAD_STATUS_CODE} EQUAL 0)
file(
CHMOD ${GEODE_CODEGEN_BINARY_OUT}/${GEODE_CODEGEN_TARGET_FILE_NAME}
PERMISSIONS
OWNER_READ OWNER_WRITE OWNER_EXECUTE
GROUP_READ GROUP_WRITE GROUP_EXECUTE
WORLD_READ WORLD_WRITE WORLD_EXECUTE
)
message(STATUS "Downloading Codegen - success")
set(SKIP_BUILDING_CODEGEN ON)
else()
list(GET GEODE_CODEGEN_DOWNLOAD_STATUS 1 GEODE_CODEGEN_DOWNLOAD_STATUS_MESSAGE)
message(STATUS "Downloading Codegen - fail: ${GEODE_CODEGEN_DOWNLOAD_STATUS_MESSAGE}")
set(SKIP_BUILDING_CODEGEN OFF)
endif()
else()
set(SKIP_BUILDING_CODEGEN OFF)
endif()
unset(GEODE_CODEGEN_DOWNLOAD_FILE_NAME)
unset(GEODE_CODEGEN_TARGET_FILE_NAME)
endif()

if (NOT SKIP_BUILDING_CODEGEN)
file(MAKE_DIRECTORY ${GEODE_CODEGEN_BINARY_DIR})

if (DEFINED CROSS_TOOLCHAIN_FLAGS_NATIVE)
message(STATUS "Passing CROSS_TOOLCHAIN_FLAGS_NATIVE to Codegen")
set(GEODE_CODEGEN_CROSS_TOOLCHAIN_FLAGS_NATIVE -DCROSS_TOOLCHAIN_FLAGS_NATIVE=${CROSS_TOOLCHAIN_FLAGS_NATIVE})
endif()

set(PREV_SCCACHE_C_CUSTOM_CACHE_BUSTER ENV{SCCACHE_C_CUSTOM_CACHE_BUSTER})
set(ENV{SCCACHE_C_CUSTOM_CACHE_BUSTER} "codegen")

message(STATUS "Configuring Codegen")
execute_process(
COMMAND ${CMAKE_COMMAND} ${GEODE_CODEGEN_CMAKE_ARGS}
-DCMAKE_C_COMPILER_LAUNCHER=${CMAKE_C_COMPILER_LAUNCHER}
-DCMAKE_CXX_COMPILER_LAUNCHER=${CMAKE_CXX_COMPILER_LAUNCHER}
${GEODE_CODEGEN_CROSS_TOOLCHAIN_FLAGS_NATIVE}
-DCMAKE_BUILD_TYPE=Release
-DCMAKE_INSTALL_PREFIX:STRING=${GEODE_CODEGEN_BINARY_OUT}
-S ${GEODE_CODEGEN_SOURCE_DIR} -B ${GEODE_CODEGEN_BINARY_DIR}
WORKING_DIRECTORY ${GEODE_CODEGEN_SOURCE_DIR}
COMMAND_ECHO STDOUT
COMMAND_ERROR_IS_FATAL ANY
)
message(STATUS "Building Codegen")
execute_process(
COMMAND ${CMAKE_COMMAND} --build ${GEODE_CODEGEN_BINARY_DIR} --config Release
WORKING_DIRECTORY ${GEODE_CODEGEN_SOURCE_DIR}
COMMAND_ECHO STDOUT
COMMAND_ERROR_IS_FATAL ANY
)
execute_process(
COMMAND ${CMAKE_COMMAND} --install ${GEODE_CODEGEN_BINARY_DIR} --config Release
--prefix ${GEODE_CODEGEN_BINARY_OUT}
WORKING_DIRECTORY ${GEODE_CODEGEN_SOURCE_DIR}
COMMAND_ECHO STDOUT
COMMAND_ERROR_IS_FATAL ANY
)

set(ENV{SCCACHE_C_CUSTOM_CACHE_BUSTER} PREV_SCCACHE_C_CUSTOM_CACHE_BUSTER)
endif()

message(STATUS "Running Codegen")
execute_process(
COMMAND ./Codegen ${GEODE_TARGET_PLATFORM} ${GEODE_BINDINGS_PATH} ${GEODE_CODEGEN_PATH}
WORKING_DIRECTORY ${GEODE_CODEGEN_BINARY_OUT}
COMMAND_ECHO STDOUT
COMMAND_ERROR_IS_FATAL ANY
)

file(GLOB GEODE_BINDINGS_FILES ${GEODE_BINDINGS_PATH}/*.bro)
file(GLOB GEODE_CODEGEN_OUT_FILES
${GEODE_CODEGEN_PATH}/Geode/CodegenData.txt
${GEODE_CODEGEN_PATH}/Geode/*.cpp
${GEODE_CODEGEN_PATH}/Geode/*.hpp
${GEODE_CODEGEN_PATH}/Geode/binding/*.hpp
${GEODE_CODEGEN_PATH}/Geode/modify/*.hpp
)
add_custom_command(
DEPENDS ${GEODE_BINDINGS_FILES}
COMMENT "Running Codegen"
COMMAND ./Codegen ${GEODE_TARGET_PLATFORM} ${GEODE_BINDINGS_PATH} ${GEODE_CODEGEN_PATH}
WORKING_DIRECTORY ${GEODE_CODEGEN_BINARY_OUT}
OUTPUT ${GEODE_CODEGEN_OUT_FILES}
)

if (GEODE_IS_MEMBER_TEST)
set(GEODE_MEMBER_TEST_CODEGEN_PATH ${GEODE_CODEGEN_PATH} PARENT_SCOPE)
return()
endif()

add_library(${PROJECT_NAME} ${GEODE_CODEGEN_PATH}/Geode/GeneratedSource.cpp)
target_include_directories(${PROJECT_NAME} PUBLIC ${GEODE_CODEGEN_PATH})

set_target_properties(${PROJECT_NAME} PROPERTIES CXX_VISIBILITY_PRESET hidden)
target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_20)

if (APPLE)
target_compile_options(${PROJECT_NAME} PUBLIC -ffunction-sections -fdata-sections)
target_link_options(${PROJECT_NAME} PUBLIC -dead_strip)
elseif (ANDROID)
target_compile_options(${PROJECT_NAME} PUBLIC -ffunction-sections -fdata-sections)
target_link_options(${PROJECT_NAME} PUBLIC -Wl,--gc-sections)
endif()
Loading

0 comments on commit 1de5366

Please sign in to comment.