From 1f002e820c182cd720219c31bd263524074834a0 Mon Sep 17 00:00:00 2001 From: John McCardle Date: Thu, 8 Jan 2026 10:41:24 -0500 Subject: [PATCH] long -> intptr_t for casts. WIP: mingw cross-compilation for Windows (see #162) --- .gitignore | 1 + CMakeLists.txt | 166 +++++++++++++++++++++++-------- deps/platform/windows/platform.h | 6 +- src/Animation.cpp | 2 +- src/Animation.h | 7 +- src/PyAnimation.cpp | 2 +- src/PyColor.cpp | 4 +- src/PyVector.cpp | 4 +- src/UICaption.cpp | 8 +- src/UIDrawable.cpp | 42 ++++---- src/UIEntity.cpp | 18 ++-- src/UIFrame.cpp | 8 +- src/UIGrid.cpp | 4 +- src/UIGridPoint.cpp | 10 +- src/UISprite.cpp | 8 +- 15 files changed, 188 insertions(+), 102 deletions(-) diff --git a/.gitignore b/.gitignore index 2a59fe4..206da9b 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ CMakeFiles/ Makefile *.zip __lib/ +__lib_windows/ _oldscripts/ assets/ cellular_automata_fire/ diff --git a/CMakeLists.txt b/CMakeLists.txt index ac073a8..2976a90 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,14 +8,33 @@ project(McRogueFace) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED True) +# Detect cross-compilation for Windows (MinGW) +if(CMAKE_CROSSCOMPILING AND WIN32) + set(MCRF_CROSS_WINDOWS TRUE) + message(STATUS "Cross-compiling for Windows using MinGW") +endif() + # Add include directories -#include_directories(${CMAKE_SOURCE_DIR}/deps_linux) include_directories(${CMAKE_SOURCE_DIR}/deps) -#include_directories(${CMAKE_SOURCE_DIR}/deps_linux/Python-3.11.1) include_directories(${CMAKE_SOURCE_DIR}/deps/libtcod) -include_directories(${CMAKE_SOURCE_DIR}/deps/cpython) -include_directories(${CMAKE_SOURCE_DIR}/deps/Python) +# Python includes: use different paths for Windows vs Linux +if(MCRF_CROSS_WINDOWS) + # Windows cross-compilation: use cpython headers with PC/pyconfig.h + # Problem: Python.h uses #include "pyconfig.h" which finds Include/pyconfig.h (Linux) first + # Solution: Use -include to force Windows pyconfig.h to be included first + # This defines MS_WINDOWS before Python.h is processed, ensuring correct struct layouts + add_compile_options(-include ${CMAKE_SOURCE_DIR}/deps/cpython/PC/pyconfig.h) + include_directories(${CMAKE_SOURCE_DIR}/deps/cpython/Include) + include_directories(${CMAKE_SOURCE_DIR}/deps/cpython/PC) # For other Windows-specific headers + # Also include SFML and libtcod Windows headers + include_directories(${CMAKE_SOURCE_DIR}/__lib_windows/sfml/include) + include_directories(${CMAKE_SOURCE_DIR}/__lib_windows/libtcod/include) +else() + # Native builds (Linux/Windows): use existing Python setup + include_directories(${CMAKE_SOURCE_DIR}/deps/cpython) + include_directories(${CMAKE_SOURCE_DIR}/deps/Python) +endif() # ImGui and ImGui-SFML include directories include_directories(${CMAKE_SOURCE_DIR}/modules/imgui) @@ -37,35 +56,71 @@ file(GLOB_RECURSE SOURCES "src/*.cpp") list(APPEND SOURCES ${IMGUI_SOURCES}) # Find OpenGL (required by ImGui-SFML) -find_package(OpenGL REQUIRED) - -# Create a list of libraries to link against -set(LINK_LIBS - sfml-graphics - sfml-window - sfml-system - sfml-audio - tcod - OpenGL::GL) - -# On Windows, add any additional libs and include directories -if(WIN32) - # Windows-specific Python library name (no dots) - list(APPEND LINK_LIBS python314) - # Add the necessary Windows-specific libraries and include directories - # include_directories(path_to_additional_includes) - # link_directories(path_to_additional_libs) - # list(APPEND LINK_LIBS additional_windows_libs) - include_directories(${CMAKE_SOURCE_DIR}/deps/platform/windows) +if(MCRF_CROSS_WINDOWS) + # For cross-compilation, OpenGL is provided by MinGW + set(OPENGL_LIBRARIES opengl32) else() - # Unix/Linux specific libraries - list(APPEND LINK_LIBS python3.14 m dl util pthread) - include_directories(${CMAKE_SOURCE_DIR}/deps/platform/linux) + find_package(OpenGL REQUIRED) + set(OPENGL_LIBRARIES OpenGL::GL) endif() -# Add the directory where the linker should look for the libraries -#link_directories(${CMAKE_SOURCE_DIR}/deps_linux) -link_directories(${CMAKE_SOURCE_DIR}/__lib) +# Create a list of libraries to link against +if(MCRF_CROSS_WINDOWS) + # MinGW cross-compilation: use full library names + set(LINK_LIBS + sfml-graphics + sfml-window + sfml-system + sfml-audio + libtcod + python314 + ${OPENGL_LIBRARIES}) + + # Add Windows system libraries needed by SFML and MinGW + list(APPEND LINK_LIBS + winmm # Windows multimedia (for audio) + gdi32 # Graphics Device Interface + ws2_32 # Winsock (networking, used by some deps) + ole32 # OLE support + oleaut32 # OLE automation + uuid # UUID library + comdlg32 # Common dialogs + imm32 # Input Method Manager + version # Version info + ) + + include_directories(${CMAKE_SOURCE_DIR}/deps/platform/windows) + + # Link directories for cross-compiled Windows libs + link_directories(${CMAKE_SOURCE_DIR}/__lib_windows/sfml/lib) + link_directories(${CMAKE_SOURCE_DIR}/__lib_windows/libtcod/lib) + link_directories(${CMAKE_SOURCE_DIR}/__lib_windows) +elseif(WIN32) + # Native Windows build (MSVC) + set(LINK_LIBS + sfml-graphics + sfml-window + sfml-system + sfml-audio + tcod + python314 + ${OPENGL_LIBRARIES}) + include_directories(${CMAKE_SOURCE_DIR}/deps/platform/windows) + link_directories(${CMAKE_SOURCE_DIR}/__lib) +else() + # Unix/Linux build + set(LINK_LIBS + sfml-graphics + sfml-window + sfml-system + sfml-audio + tcod + python3.14 + m dl util pthread + ${OPENGL_LIBRARIES}) + include_directories(${CMAKE_SOURCE_DIR}/deps/platform/linux) + link_directories(${CMAKE_SOURCE_DIR}/__lib) +endif() # Define the executable target before linking libraries add_executable(mcrogueface ${SOURCES}) @@ -73,11 +128,24 @@ add_executable(mcrogueface ${SOURCES}) # Define NO_SDL for libtcod-headless headers (excludes SDL-dependent code) target_compile_definitions(mcrogueface PRIVATE NO_SDL) +# On Windows, define Py_ENABLE_SHARED for proper Python DLL imports +# Py_PYCONFIG_H prevents Include/pyconfig.h (Linux config) from being included +# (PC/pyconfig.h already defines HAVE_DECLSPEC_DLL and MS_WINDOWS) +if(WIN32 OR MCRF_CROSS_WINDOWS) + target_compile_definitions(mcrogueface PRIVATE Py_ENABLE_SHARED Py_PYCONFIG_H) +endif() + # On Windows, set subsystem to WINDOWS to hide console -if(WIN32) +if(WIN32 AND NOT MCRF_CROSS_WINDOWS) + # MSVC-specific flags set_target_properties(mcrogueface PROPERTIES WIN32_EXECUTABLE TRUE LINK_FLAGS "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup") +elseif(MCRF_CROSS_WINDOWS) + # MinGW cross-compilation: use -mwindows to hide console + set_target_properties(mcrogueface PROPERTIES + WIN32_EXECUTABLE TRUE + LINK_FLAGS "-mwindows") endif() # Now the linker will find the libraries in the specified directory @@ -99,20 +167,36 @@ add_custom_command(TARGET mcrogueface POST_BUILD ${CMAKE_SOURCE_DIR}/__lib $/lib) # On Windows, copy DLLs to executable directory -if(WIN32) - # Copy all DLL files from lib to the executable directory +if(MCRF_CROSS_WINDOWS) + # Cross-compilation: copy DLLs from __lib_windows + add_custom_command(TARGET mcrogueface POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory + ${CMAKE_SOURCE_DIR}/__lib_windows/sfml/bin $ + COMMAND ${CMAKE_COMMAND} -E copy_directory + ${CMAKE_SOURCE_DIR}/__lib_windows/libtcod/bin $ + COMMAND ${CMAKE_COMMAND} -E copy + ${CMAKE_SOURCE_DIR}/__lib_windows/python314.dll $ + COMMAND ${CMAKE_COMMAND} -E copy + ${CMAKE_SOURCE_DIR}/__lib_windows/python3.dll $ + COMMAND ${CMAKE_COMMAND} -E copy + ${CMAKE_SOURCE_DIR}/__lib_windows/vcruntime140.dll $ + COMMAND ${CMAKE_COMMAND} -E copy + ${CMAKE_SOURCE_DIR}/__lib_windows/vcruntime140_1.dll $ + COMMAND ${CMAKE_COMMAND} -E copy + /usr/x86_64-w64-mingw32/lib/libwinpthread-1.dll $ + COMMAND ${CMAKE_COMMAND} -E echo "Copied Windows DLLs to executable directory") + + # Copy Python standard library zip + add_custom_command(TARGET mcrogueface POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy + ${CMAKE_SOURCE_DIR}/__lib_windows/python314.zip $ + COMMAND ${CMAKE_COMMAND} -E echo "Copied Python stdlib") +elseif(WIN32) + # Native Windows build: copy DLLs from __lib add_custom_command(TARGET mcrogueface POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/__lib $ COMMAND ${CMAKE_COMMAND} -E echo "Copied DLLs to executable directory") - - # Alternative: Copy specific DLLs if you want more control - # file(GLOB DLLS "${CMAKE_SOURCE_DIR}/__lib/*.dll") - # foreach(DLL ${DLLS}) - # add_custom_command(TARGET mcrogueface POST_BUILD - # COMMAND ${CMAKE_COMMAND} -E copy_if_different - # ${DLL} $) - # endforeach() endif() # rpath for including shared libraries (Linux/Unix only) diff --git a/deps/platform/windows/platform.h b/deps/platform/windows/platform.h index ee4176e..d7d0fc7 100644 --- a/deps/platform/windows/platform.h +++ b/deps/platform/windows/platform.h @@ -1,12 +1,12 @@ #ifndef __PLATFORM #define __PLATFORM #define __PLATFORM_SET_PYTHON_SEARCH_PATHS 0 -#include +#include std::wstring executable_path() { wchar_t buffer[MAX_PATH]; - GetModuleFileName(NULL, buffer, MAX_PATH); + GetModuleFileNameW(NULL, buffer, MAX_PATH); // Use explicit Unicode version std::wstring exec_path = buffer; size_t path_index = exec_path.find_last_of(L"\\/"); return exec_path.substr(0, path_index); @@ -15,7 +15,7 @@ std::wstring executable_path() std::wstring executable_filename() { wchar_t buffer[MAX_PATH]; - GetModuleFileName(NULL, buffer, MAX_PATH); + GetModuleFileNameW(NULL, buffer, MAX_PATH); // Use explicit Unicode version std::wstring exec_path = buffer; return exec_path; } diff --git a/src/Animation.cpp b/src/Animation.cpp index de298ec..9b4c7ba 100644 --- a/src/Animation.cpp +++ b/src/Animation.cpp @@ -767,7 +767,7 @@ void AnimationManager::addAnimation(std::shared_ptr animation, } return; // Don't add to active animations yet - case AnimationConflictMode::ERROR: + case AnimationConflictMode::RAISE_ERROR: // Raise Python exception PyGILState_STATE gstate = PyGILState_Ensure(); PyErr_Format(PyExc_RuntimeError, diff --git a/src/Animation.h b/src/Animation.h index 4d546ab..d364e91 100644 --- a/src/Animation.h +++ b/src/Animation.h @@ -16,9 +16,10 @@ class UIEntity; * ConflictMode - How to handle multiple animations on the same property (#120) */ enum class AnimationConflictMode { - REPLACE, // Stop/complete existing animation, start new one (default) - QUEUE, // Queue new animation to run after existing one completes - ERROR // Raise an error if property is already being animated + REPLACE, // Stop/complete existing animation, start new one (default) + QUEUE, // Queue new animation to run after existing one completes + RAISE_ERROR // Raise an error if property is already being animated + // Note: Can't use ERROR as it conflicts with Windows macro }; // Forward declare namespace diff --git a/src/PyAnimation.cpp b/src/PyAnimation.cpp index 7208fe8..0081365 100644 --- a/src/PyAnimation.cpp +++ b/src/PyAnimation.cpp @@ -186,7 +186,7 @@ static bool parseConflictMode(const char* mode_str, AnimationConflictMode& mode) } else if (strcmp(mode_str, "queue") == 0) { mode = AnimationConflictMode::QUEUE; } else if (strcmp(mode_str, "error") == 0) { - mode = AnimationConflictMode::ERROR; + mode = AnimationConflictMode::RAISE_ERROR; } else { PyErr_Format(PyExc_ValueError, "Invalid conflict_mode '%s'. Must be 'replace', 'queue', or 'error'.", mode_str); diff --git a/src/PyColor.cpp b/src/PyColor.cpp index ef6ca2b..75d5242 100644 --- a/src/PyColor.cpp +++ b/src/PyColor.cpp @@ -172,7 +172,7 @@ PyObject* PyColor::pynew(PyTypeObject* type, PyObject* args, PyObject* kwds) PyObject* PyColor::get_member(PyObject* obj, void* closure) { PyColorObject* self = (PyColorObject*)obj; - long member = (long)closure; + intptr_t member = (intptr_t)closure; switch (member) { case 0: // r @@ -192,7 +192,7 @@ PyObject* PyColor::get_member(PyObject* obj, void* closure) int PyColor::set_member(PyObject* obj, PyObject* value, void* closure) { PyColorObject* self = (PyColorObject*)obj; - long member = (long)closure; + intptr_t member = (intptr_t)closure; if (!PyLong_Check(value)) { PyErr_SetString(PyExc_TypeError, "Color values must be integers"); diff --git a/src/PyVector.cpp b/src/PyVector.cpp index 1625106..4315b30 100644 --- a/src/PyVector.cpp +++ b/src/PyVector.cpp @@ -227,7 +227,7 @@ PyObject* PyVector::pynew(PyTypeObject* type, PyObject* args, PyObject* kwds) PyObject* PyVector::get_member(PyObject* obj, void* closure) { PyVectorObject* self = (PyVectorObject*)obj; - if (reinterpret_cast(closure) == 0) { + if (reinterpret_cast(closure) == 0) { // x return PyFloat_FromDouble(self->data.x); } else { @@ -250,7 +250,7 @@ int PyVector::set_member(PyObject* obj, PyObject* value, void* closure) return -1; } - if (reinterpret_cast(closure) == 0) { + if (reinterpret_cast(closure) == 0) { // x self->data.x = val; } else { diff --git a/src/UICaption.cpp b/src/UICaption.cpp index bc10bc0..805bc2b 100644 --- a/src/UICaption.cpp +++ b/src/UICaption.cpp @@ -96,7 +96,7 @@ void UICaption::onPositionChanged() PyObject* UICaption::get_float_member(PyUICaptionObject* self, void* closure) { - auto member_ptr = reinterpret_cast(closure); + auto member_ptr = reinterpret_cast(closure); if (member_ptr == 0) return PyFloat_FromDouble(self->data->text.getPosition().x); else if (member_ptr == 1) @@ -115,7 +115,7 @@ PyObject* UICaption::get_float_member(PyUICaptionObject* self, void* closure) int UICaption::set_float_member(PyUICaptionObject* self, PyObject* value, void* closure) { float val; - auto member_ptr = reinterpret_cast(closure); + auto member_ptr = reinterpret_cast(closure); if (PyFloat_Check(value)) { val = PyFloat_AsDouble(value); @@ -156,7 +156,7 @@ PyObject* UICaption::get_color_member(PyUICaptionObject* self, void* closure) // TODO: migrate this code to a switch statement - validate closure & return values in one tighter, more extensible structure // validate closure (should be impossible to be wrong, but it's thorough) - auto member_ptr = reinterpret_cast(closure); + auto member_ptr = reinterpret_cast(closure); if (member_ptr != 0 && member_ptr != 1) { PyErr_SetString(PyExc_AttributeError, "Invalid attribute"); @@ -181,7 +181,7 @@ PyObject* UICaption::get_color_member(PyUICaptionObject* self, void* closure) int UICaption::set_color_member(PyUICaptionObject* self, PyObject* value, void* closure) { - auto member_ptr = reinterpret_cast(closure); + auto member_ptr = reinterpret_cast(closure); //TODO: this logic of (PyColor instance OR tuple -> sf::color) should be encapsulated for reuse int r, g, b, a; if (PyObject_IsInstance(value, PyObject_GetAttrString(McRFPy_API::mcrf_module, "Color") /*(PyObject*)&mcrfpydef::PyColorType)*/)) diff --git a/src/UIDrawable.cpp b/src/UIDrawable.cpp index bde2bb6..4812f57 100644 --- a/src/UIDrawable.cpp +++ b/src/UIDrawable.cpp @@ -170,7 +170,7 @@ void UIDrawable::render() } PyObject* UIDrawable::get_click(PyObject* self, void* closure) { - PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); // trust me bro, it's an Enum + PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); // trust me bro, it's an Enum PyObject* ptr; switch (objtype) @@ -228,7 +228,7 @@ PyObject* UIDrawable::get_click(PyObject* self, void* closure) { } int UIDrawable::set_click(PyObject* self, PyObject* value, void* closure) { - PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); // trust me bro, it's an Enum + PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); // trust me bro, it's an Enum UIDrawable* target; switch (objtype) { @@ -305,7 +305,7 @@ void UIDrawable::on_move_unregister() } PyObject* UIDrawable::get_int(PyObject* self, void* closure) { - PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); + PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); UIDrawable* drawable = nullptr; switch (objtype) { @@ -339,7 +339,7 @@ PyObject* UIDrawable::get_int(PyObject* self, void* closure) { } int UIDrawable::set_int(PyObject* self, PyObject* value, void* closure) { - PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); + PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); UIDrawable* drawable = nullptr; switch (objtype) { @@ -405,7 +405,7 @@ void UIDrawable::notifyZIndexChanged() { } PyObject* UIDrawable::get_name(PyObject* self, void* closure) { - PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); + PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); UIDrawable* drawable = nullptr; switch (objtype) { @@ -439,7 +439,7 @@ PyObject* UIDrawable::get_name(PyObject* self, void* closure) { } int UIDrawable::set_name(PyObject* self, PyObject* value, void* closure) { - PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); + PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); UIDrawable* drawable = nullptr; switch (objtype) { @@ -639,7 +639,7 @@ int UIDrawable::set_float_member(PyObject* self, PyObject* value, void* closure) } PyObject* UIDrawable::get_pos(PyObject* self, void* closure) { - PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); + PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); UIDrawable* drawable = nullptr; switch (objtype) { @@ -686,7 +686,7 @@ PyObject* UIDrawable::get_pos(PyObject* self, void* closure) { } int UIDrawable::set_pos(PyObject* self, PyObject* value, void* closure) { - PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); + PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); UIDrawable* drawable = nullptr; switch (objtype) { @@ -892,7 +892,7 @@ void UIDrawable::markDirty() { // Python API - get parent drawable PyObject* UIDrawable::get_parent(PyObject* self, void* closure) { - PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); + PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); UIDrawable* drawable = nullptr; switch (objtype) { @@ -1003,7 +1003,7 @@ PyObject* UIDrawable::get_parent(PyObject* self, void* closure) { // Python API - set parent drawable (or None to remove from parent) int UIDrawable::set_parent(PyObject* self, PyObject* value, void* closure) { - PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); + PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); std::shared_ptr drawable = nullptr; // Get the shared_ptr for self @@ -1125,7 +1125,7 @@ int UIDrawable::set_parent(PyObject* self, PyObject* value, void* closure) { // Python API - get global position (read-only) PyObject* UIDrawable::get_global_pos(PyObject* self, void* closure) { - PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); + PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); UIDrawable* drawable = nullptr; switch (objtype) { @@ -1175,7 +1175,7 @@ PyObject* UIDrawable::get_global_pos(PyObject* self, void* closure) { // #138, #188 - Python API for bounds property - returns (pos, size) as pair of Vectors PyObject* UIDrawable::get_bounds_py(PyObject* self, void* closure) { - PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); + PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); UIDrawable* drawable = nullptr; switch (objtype) { @@ -1236,7 +1236,7 @@ PyObject* UIDrawable::get_bounds_py(PyObject* self, void* closure) { // #138, #188 - Python API for global_bounds property - returns (pos, size) as pair of Vectors PyObject* UIDrawable::get_global_bounds_py(PyObject* self, void* closure) { - PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); + PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); UIDrawable* drawable = nullptr; switch (objtype) { @@ -1297,7 +1297,7 @@ PyObject* UIDrawable::get_global_bounds_py(PyObject* self, void* closure) { // #140 - Python API for on_enter property PyObject* UIDrawable::get_on_enter(PyObject* self, void* closure) { - PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); + PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); PyObject* ptr = nullptr; switch (objtype) { @@ -1340,7 +1340,7 @@ PyObject* UIDrawable::get_on_enter(PyObject* self, void* closure) { } int UIDrawable::set_on_enter(PyObject* self, PyObject* value, void* closure) { - PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); + PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); UIDrawable* target = nullptr; switch (objtype) { @@ -1380,7 +1380,7 @@ int UIDrawable::set_on_enter(PyObject* self, PyObject* value, void* closure) { // #140 - Python API for on_exit property PyObject* UIDrawable::get_on_exit(PyObject* self, void* closure) { - PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); + PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); PyObject* ptr = nullptr; switch (objtype) { @@ -1423,7 +1423,7 @@ PyObject* UIDrawable::get_on_exit(PyObject* self, void* closure) { } int UIDrawable::set_on_exit(PyObject* self, PyObject* value, void* closure) { - PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); + PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); UIDrawable* target = nullptr; switch (objtype) { @@ -1463,7 +1463,7 @@ int UIDrawable::set_on_exit(PyObject* self, PyObject* value, void* closure) { // #140 - Python API for hovered property (read-only) PyObject* UIDrawable::get_hovered(PyObject* self, void* closure) { - PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); + PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); UIDrawable* drawable = nullptr; switch (objtype) { @@ -1498,7 +1498,7 @@ PyObject* UIDrawable::get_hovered(PyObject* self, void* closure) { // #141 - Python API for on_move property PyObject* UIDrawable::get_on_move(PyObject* self, void* closure) { - PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); + PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); PyObject* ptr = nullptr; switch (objtype) { @@ -1541,7 +1541,7 @@ PyObject* UIDrawable::get_on_move(PyObject* self, void* closure) { } int UIDrawable::set_on_move(PyObject* self, PyObject* value, void* closure) { - PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); + PyObjectsEnum objtype = static_cast(reinterpret_cast(closure)); UIDrawable* target = nullptr; switch (objtype) { @@ -1689,7 +1689,7 @@ PyObject* UIDrawable_animate_impl(std::shared_ptr self, PyObject* ar } else if (strcmp(conflict_mode_str, "queue") == 0) { conflict_mode = AnimationConflictMode::QUEUE; } else if (strcmp(conflict_mode_str, "error") == 0) { - conflict_mode = AnimationConflictMode::ERROR; + conflict_mode = AnimationConflictMode::RAISE_ERROR; } else { PyErr_Format(PyExc_ValueError, "Invalid conflict_mode '%s'. Must be 'replace', 'queue', or 'error'.", conflict_mode_str); diff --git a/src/UIEntity.cpp b/src/UIEntity.cpp index 25c15a8..7950c90 100644 --- a/src/UIEntity.cpp +++ b/src/UIEntity.cpp @@ -358,7 +358,7 @@ PyObject* UIGridPointStateVector_to_PyList(const std::vector& } PyObject* UIEntity::get_position(PyUIEntityObject* self, void* closure) { - if (reinterpret_cast(closure) == 0) { + if (reinterpret_cast(closure) == 0) { return sfVector2f_to_PyObject(self->data->position); } else { // Return integer-cast position for grid coordinates @@ -373,7 +373,7 @@ int UIEntity::set_position(PyUIEntityObject* self, PyObject* value, void* closur float old_x = self->data->position.x; float old_y = self->data->position.y; - if (reinterpret_cast(closure) == 0) { + if (reinterpret_cast(closure) == 0) { sf::Vector2f vec = PyObject_to_sfVector2f(value); if (PyErr_Occurred()) { return -1; // Error already set by PyObject_to_sfVector2f @@ -418,7 +418,7 @@ int UIEntity::set_spritenumber(PyUIEntityObject* self, PyObject* value, void* cl PyObject* UIEntity::get_float_member(PyUIEntityObject* self, void* closure) { - auto member_ptr = reinterpret_cast(closure); + auto member_ptr = reinterpret_cast(closure); if (member_ptr == 0) // x return PyFloat_FromDouble(self->data->position.x); else if (member_ptr == 1) // y @@ -433,7 +433,7 @@ PyObject* UIEntity::get_float_member(PyUIEntityObject* self, void* closure) int UIEntity::set_float_member(PyUIEntityObject* self, PyObject* value, void* closure) { float val; - auto member_ptr = reinterpret_cast(closure); + auto member_ptr = reinterpret_cast(closure); if (PyFloat_Check(value)) { val = PyFloat_AsDouble(value); @@ -540,7 +540,7 @@ PyObject* UIEntity::get_pixel_member(PyUIEntityObject* self, void* closure) { float cell_width, cell_height; get_cell_dimensions(self->data.get(), cell_width, cell_height); - auto member_ptr = reinterpret_cast(closure); + auto member_ptr = reinterpret_cast(closure); if (member_ptr == 0) // x return PyFloat_FromDouble(self->data->position.x * cell_width); else // y @@ -570,7 +570,7 @@ int UIEntity::set_pixel_member(PyUIEntityObject* self, PyObject* value, void* cl float old_x = self->data->position.x; float old_y = self->data->position.y; - auto member_ptr = reinterpret_cast(closure); + auto member_ptr = reinterpret_cast(closure); if (member_ptr == 0) // x self->data->position.x = val / cell_width; else // y @@ -584,7 +584,7 @@ int UIEntity::set_pixel_member(PyUIEntityObject* self, PyObject* value, void* cl // #176 - Integer grid position (grid_x, grid_y) PyObject* UIEntity::get_grid_int_member(PyUIEntityObject* self, void* closure) { - auto member_ptr = reinterpret_cast(closure); + auto member_ptr = reinterpret_cast(closure); if (member_ptr == 0) // grid_x return PyLong_FromLong(static_cast(self->data->position.x)); else // grid_y @@ -606,7 +606,7 @@ int UIEntity::set_grid_int_member(PyUIEntityObject* self, PyObject* value, void* float old_x = self->data->position.x; float old_y = self->data->position.y; - auto member_ptr = reinterpret_cast(closure); + auto member_ptr = reinterpret_cast(closure); if (member_ptr == 0) // grid_x self->data->position.x = static_cast(val); else // grid_y @@ -1172,7 +1172,7 @@ PyObject* UIEntity::animate(PyUIEntityObject* self, PyObject* args, PyObject* kw } else if (strcmp(conflict_mode_str, "queue") == 0) { conflict_mode = AnimationConflictMode::QUEUE; } else if (strcmp(conflict_mode_str, "error") == 0) { - conflict_mode = AnimationConflictMode::ERROR; + conflict_mode = AnimationConflictMode::RAISE_ERROR; } else { PyErr_Format(PyExc_ValueError, "Invalid conflict_mode '%s'. Must be 'replace', 'queue', or 'error'.", conflict_mode_str); diff --git a/src/UIFrame.cpp b/src/UIFrame.cpp index 251e9af..195acc6 100644 --- a/src/UIFrame.cpp +++ b/src/UIFrame.cpp @@ -187,7 +187,7 @@ PyObject* UIFrame::get_children(PyUIFrameObject* self, void* closure) PyObject* UIFrame::get_float_member(PyUIFrameObject* self, void* closure) { - auto member_ptr = reinterpret_cast(closure); + auto member_ptr = reinterpret_cast(closure); if (member_ptr == 0) return PyFloat_FromDouble(self->data->box.getPosition().x); else if (member_ptr == 1) @@ -208,7 +208,7 @@ PyObject* UIFrame::get_float_member(PyUIFrameObject* self, void* closure) int UIFrame::set_float_member(PyUIFrameObject* self, PyObject* value, void* closure) { float val; - auto member_ptr = reinterpret_cast(closure); + auto member_ptr = reinterpret_cast(closure); if (PyFloat_Check(value)) { val = PyFloat_AsDouble(value); @@ -258,7 +258,7 @@ int UIFrame::set_float_member(PyUIFrameObject* self, PyObject* value, void* clos PyObject* UIFrame::get_color_member(PyUIFrameObject* self, void* closure) { // validate closure (should be impossible to be wrong, but it's thorough) - auto member_ptr = reinterpret_cast(closure); + auto member_ptr = reinterpret_cast(closure); if (member_ptr != 0 && member_ptr != 1) { PyErr_SetString(PyExc_AttributeError, "Invalid attribute"); @@ -293,7 +293,7 @@ PyObject* UIFrame::get_color_member(PyUIFrameObject* self, void* closure) int UIFrame::set_color_member(PyUIFrameObject* self, PyObject* value, void* closure) { //TODO: this logic of (PyColor instance OR tuple -> sf::color) should be encapsulated for reuse - auto member_ptr = reinterpret_cast(closure); + auto member_ptr = reinterpret_cast(closure); int r, g, b, a; if (PyObject_IsInstance(value, PyObject_GetAttrString(McRFPy_API::mcrf_module, "Color"))) { diff --git a/src/UIGrid.cpp b/src/UIGrid.cpp index f6f21a5..e4188a5 100644 --- a/src/UIGrid.cpp +++ b/src/UIGrid.cpp @@ -1076,7 +1076,7 @@ int UIGrid::set_center(PyUIGridObject* self, PyObject* value, void* closure) { PyObject* UIGrid::get_float_member(PyUIGridObject* self, void* closure) { - auto member_ptr = reinterpret_cast(closure); + auto member_ptr = reinterpret_cast(closure); if (member_ptr == 0) // x return PyFloat_FromDouble(self->data->box.getPosition().x); else if (member_ptr == 1) // y @@ -1101,7 +1101,7 @@ PyObject* UIGrid::get_float_member(PyUIGridObject* self, void* closure) int UIGrid::set_float_member(PyUIGridObject* self, PyObject* value, void* closure) { float val; - auto member_ptr = reinterpret_cast(closure); + auto member_ptr = reinterpret_cast(closure); if (PyFloat_Check(value)) { val = PyFloat_AsDouble(value); diff --git a/src/UIGridPoint.cpp b/src/UIGridPoint.cpp index a636c8c..02131f4 100644 --- a/src/UIGridPoint.cpp +++ b/src/UIGridPoint.cpp @@ -57,7 +57,7 @@ sf::Color PyObject_to_sfColor(PyObject* obj) { // #150 - Removed get_color/set_color - now handled by layers PyObject* UIGridPoint::get_bool_member(PyUIGridPointObject* self, void* closure) { - if (reinterpret_cast(closure) == 0) { // walkable + if (reinterpret_cast(closure) == 0) { // walkable return PyBool_FromLong(self->data->walkable); } else { // transparent return PyBool_FromLong(self->data->transparent); @@ -66,13 +66,13 @@ PyObject* UIGridPoint::get_bool_member(PyUIGridPointObject* self, void* closure) int UIGridPoint::set_bool_member(PyUIGridPointObject* self, PyObject* value, void* closure) { if (value == Py_True) { - if (reinterpret_cast(closure) == 0) { // walkable + if (reinterpret_cast(closure) == 0) { // walkable self->data->walkable = true; } else { // transparent self->data->transparent = true; } } else if (value == Py_False) { - if (reinterpret_cast(closure) == 0) { // walkable + if (reinterpret_cast(closure) == 0) { // walkable self->data->walkable = false; } else { // transparent self->data->transparent = false; @@ -162,7 +162,7 @@ PyObject* UIGridPoint::repr(PyUIGridPointObject* self) { } PyObject* UIGridPointState::get_bool_member(PyUIGridPointStateObject* self, void* closure) { - if (reinterpret_cast(closure) == 0) { // visible + if (reinterpret_cast(closure) == 0) { // visible return PyBool_FromLong(self->data->visible); } else { // discovered return PyBool_FromLong(self->data->discovered); @@ -180,7 +180,7 @@ int UIGridPointState::set_bool_member(PyUIGridPointStateObject* self, PyObject* return -1; // PyObject_IsTrue returns -1 on error } - if (reinterpret_cast(closure) == 0) { // visible + if (reinterpret_cast(closure) == 0) { // visible self->data->visible = truthValue; } else { // discovered self->data->discovered = truthValue; diff --git a/src/UISprite.cpp b/src/UISprite.cpp index a77fea3..7803cc8 100644 --- a/src/UISprite.cpp +++ b/src/UISprite.cpp @@ -182,7 +182,7 @@ void UISprite::onPositionChanged() PyObject* UISprite::get_float_member(PyUISpriteObject* self, void* closure) { - auto member_ptr = reinterpret_cast(closure); + auto member_ptr = reinterpret_cast(closure); if (member_ptr == 0) return PyFloat_FromDouble(self->data->getPosition().x); else if (member_ptr == 1) @@ -203,7 +203,7 @@ PyObject* UISprite::get_float_member(PyUISpriteObject* self, void* closure) int UISprite::set_float_member(PyUISpriteObject* self, PyObject* value, void* closure) { float val; - auto member_ptr = reinterpret_cast(closure); + auto member_ptr = reinterpret_cast(closure); if (PyFloat_Check(value)) { val = PyFloat_AsDouble(value); @@ -232,7 +232,7 @@ int UISprite::set_float_member(PyUISpriteObject* self, PyObject* value, void* cl PyObject* UISprite::get_int_member(PyUISpriteObject* self, void* closure) { - auto member_ptr = reinterpret_cast(closure); + auto member_ptr = reinterpret_cast(closure); if (true) {} else { @@ -246,7 +246,7 @@ PyObject* UISprite::get_int_member(PyUISpriteObject* self, void* closure) int UISprite::set_int_member(PyUISpriteObject* self, PyObject* value, void* closure) { int val; - auto member_ptr = reinterpret_cast(closure); + auto member_ptr = reinterpret_cast(closure); if (PyLong_Check(value)) { val = PyLong_AsLong(value);