diff --git a/pkgs/by-name/mo/moon-child-fe/package.nix b/pkgs/by-name/mo/moon-child-fe/package.nix new file mode 100644 index 000000000000..a7ee0853f7ff --- /dev/null +++ b/pkgs/by-name/mo/moon-child-fe/package.nix @@ -0,0 +1,104 @@ +{ + lib, + stdenv, + fetchFromGitHub, + cmake, + sdl3, + zlib, + pkg-config, + sdl_gamecontrollerdb, + copyDesktopItems, + makeDesktopItem, + iconConvTools, +}: +let + plMpegSrc = fetchFromGitHub { + owner = "phoboslab"; + repo = "pl_mpeg"; + rev = "c871f2be022ece7ef4f64230b4fb8e1fb9eb6023"; + hash = "sha256-Mr+hid5RRQ2Yh6UcNDFFbbHMrGGVju0o20KIAEvzEg8="; + }; +in +stdenv.mkDerivation (finalAttrs: { + pname = "moon-child-fe"; + version = "1.0.5"; + + src = fetchFromGitHub { + owner = "MorsGames"; + repo = "MoonChildFE"; + tag = "v${finalAttrs.version}"; + hash = "sha256-SqoCSAFkQKcEbwDwHqicYXnQ8/HC523c+ePQFB+6rus="; + }; + + __structuredAttrs = true; + strictDeps = true; + + cmakeFlags = [ + (lib.cmakeFeature "MOONCHILD_RENDERER_BACKEND" "SDL3") + (lib.cmakeBool "MOONCHILD_VENDORED_SDL3" false) + (lib.cmakeBool "MOONCHILD_VENDORED_ZLIB" false) + (lib.cmakeBool "MOONCHILD_VENDORED_GAMECONTROLLERDB" false) + (lib.cmakeBool "MOONCHILD_VENDORED_PL_MPEG" false) + ]; + + env = { + MOONCHILD_PL_MPEG_PATH = plMpegSrc; + MOONCHILD_GAMECONTROLLERDB_PATH = "${sdl_gamecontrollerdb}/share/gamecontrollerdb.txt"; + }; + + nativeBuildInputs = [ + cmake + pkg-config + copyDesktopItems + iconConvTools + ]; + + buildInputs = [ + sdl3 + zlib + sdl_gamecontrollerdb + ]; + + installPhase = '' + runHook preInstall + + mkdir -p $out/bin $out/share/icons/hicolor/256x256/apps/ + + cd /build/source + mv ./Bin/Release $out/share/MoonChildFE + icoFileToHiColorTheme game.ico MoonChildFE $out + + ln -s $out/share/MoonChildFE/MoonChildFE $out/bin/MoonChildFE + + runHook postInstall + ''; + + desktopItems = [ + (makeDesktopItem { + name = "MoonChildFE"; + desktopName = "Moon Child - Friend Edition"; + exec = "MoonChildFE"; + icon = "MoonChildFE"; + comment = finalAttrs.meta.description; + startupWMClass = "MoonChildFE"; + categories = [ + "Game" + ]; + }) + ]; + + meta = { + changelog = "https://github.com/MorsGames/MoonChildFE/releases/tag/v${finalAttrs.version}"; + description = "Modern source port of the 1997 Windows 95 classic, Moon Child"; + homepage = "https://github.com/MorsGames/MoonChildFE"; + license = with lib.licenses; [ + # Code + mit + # Assets + cc-by-nc-40 + ]; + mainProgram = "MoonChildFE"; + maintainers = [ lib.maintainers.pyrox0 ]; + platforms = lib.platforms.linux; + }; +}) diff --git a/pkgs/by-name/mo/moon-child-fe/unvendor-deps.patch b/pkgs/by-name/mo/moon-child-fe/unvendor-deps.patch new file mode 100644 index 000000000000..1f0df35383f1 --- /dev/null +++ b/pkgs/by-name/mo/moon-child-fe/unvendor-deps.patch @@ -0,0 +1,132 @@ +diff --git c/CMakeLists.txt w/CMakeLists.txt +index 63803d8..49982bc 100644 +--- c/CMakeLists.txt ++++ w/CMakeLists.txt +@@ -25,6 +25,12 @@ option(MOONCHILD_INPUT_SDL3 "Use SDL3 input backend" ON) + + option(MOONCHILD_AUDIO_SDL3 "Use SDL3 audio backend" ON) + ++# Vendoring options ++option(MOONCHILD_VENDORED_SDL3 "Use vendored SDL3 library" ON) ++option(MOONCHILD_VENDORED_ZLIB "Use vendored zlib library" ON) ++option(MOONCHILD_VENDORED_GAMECONTROLLERDB "Use vendored SDL_GameControllerDB" ON) ++option(MOONCHILD_VENDORED_PL_MPEG "Use vendored pl_mpeg library" ON) ++ + # Aggregate flags + if(MOONCHILD_WINDOW_SDL3 OR MOONCHILD_RENDERER_SDL3 OR MOONCHILD_INPUT_SDL3 OR MOONCHILD_AUDIO_SDL3) + set(MOONCHILD_USE_SDL3 ON) +@@ -57,6 +63,7 @@ endif() + + # SDL3 stuff + if(MOONCHILD_USE_SDL3) ++ if(MOONCHILD_VENDORED_SDL3) + set(SDL_SHARED OFF CACHE BOOL "" FORCE) + set(SDL_STATIC ON CACHE BOOL "" FORCE) + set(SDL_TEST_LIBRARY OFF CACHE BOOL "" FORCE) +@@ -74,13 +81,28 @@ if(MOONCHILD_USE_SDL3) + else() + message(FATAL_ERROR "Could not find an SDL3 target to link!") + endif() ++ else() ++ find_package(SDL3) ++ endif() + endif() + + # zlib stuff +-set(ZLIB_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) +-set(ZLIB_BUILD_SHARED OFF CACHE BOOL "" FORCE) +-set(ZLIB_BUILD_STATIC ON CACHE BOOL "" FORCE) +-add_subdirectory("${LIBRARY_DIR}/zlib" "${CMAKE_BINARY_DIR}/zlib" EXCLUDE_FROM_ALL) ++if(MOONCHILD_VENDORED_ZLIB) ++ set(ZLIB_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) ++ set(ZLIB_BUILD_SHARED OFF CACHE BOOL "" FORCE) ++ set(ZLIB_BUILD_STATIC ON CACHE BOOL "" FORCE) ++ add_subdirectory("${LIBRARY_DIR}/zlib" "${CMAKE_BINARY_DIR}/zlib" EXCLUDE_FROM_ALL) ++else() ++ find_package(ZLIB) ++endif() ++ ++# SDL_gamecontrollerdb path ++if(MOONCHILD_VENDORED_GAMECONTROLLERDB) ++ set(MOONCHILD_GAMECONTROLLERDB_PATH "gamecontrollerdb.txt") ++else() ++ set(MOONCHILD_GAMECONTROLLERDB_PATH "$ENV{MOONCHILD_GAMECONTROLLERDB_PATH}") ++ file(TO_CMAKE_PATH "${MOONCHILD_GAMECONTROLLERDB_PATH}" MOONCHILD_GAMECONTROLLERDB_PATH) ++endif() + + # Game + framework + # TODO: Unglobify this +@@ -171,6 +193,15 @@ target_include_directories(${EXECUTABLE_NAME} PRIVATE + ${LIBRARY_DIR}/pl_mpeg + ${BACKEND_INCLUDES} + ) ++if(MOONCHILD_VENDORED_PL_MPEG) ++ target_include_directories(${EXECUTABLE_NAME} PRIVATE ++ ${LIBRARY_DIR}/pl_mpeg ++ ) ++else() ++ target_include_directories(${EXECUTABLE_NAME} PRIVATE ++ $ENV{MOONCHILD_PL_MPEG_PATH} ++ ) ++endif() + + # Backend selection macros + if(MOONCHILD_WINDOW_SDL3) +@@ -185,6 +216,11 @@ if(MOONCHILD_RENDERER_SDL3) + endif() + if(MOONCHILD_INPUT_SDL3) + target_compile_definitions(${EXECUTABLE_NAME} PRIVATE MOONCHILD_INPUT_SDL3) ++ if(NOT MOONCHILD_GAMECONTROLLERDB_PATH STREQUAL "") ++ target_compile_definitions(${EXECUTABLE_NAME} PRIVATE ++ MOONCHILD_GAMECONTROLLERDB_PATH=\"${MOONCHILD_GAMECONTROLLERDB_PATH}\" ++ ) ++ endif() + endif() + if(MOONCHILD_AUDIO_SDL3) + target_compile_definitions(${EXECUTABLE_NAME} PRIVATE MOONCHILD_AUDIO_SDL3) +@@ -201,10 +237,16 @@ if(MSVC) + target_compile_definitions(${EXECUTABLE_NAME} PRIVATE _CRT_SECURE_NO_WARNINGS) + endif() + +-target_link_libraries(${EXECUTABLE_NAME} PRIVATE zlibstatic) ++if(MOONCHILD_VENDORED_ZLIB) ++ target_link_libraries(${EXECUTABLE_NAME} PRIVATE zlibstatic) ++else() ++ target_link_libraries(${EXECUTABLE_NAME} PRIVATE ZLIB::ZLIB) ++endif() + +-if(MOONCHILD_USE_SDL3) ++if(MOONCHILD_USE_SDL3 AND MOONCHILD_VENDORED_SDL3) + target_link_libraries(${EXECUTABLE_NAME} PRIVATE ${MOONCHILD_SDL_TARGET}) ++elseif(MOONCHILD_USE_SDL3 AND NOT MOONCHILD_VENDORED_SDL3) ++ target_link_libraries(${EXECUTABLE_NAME} PRIVATE SDL3::SDL3) + endif() + + # Platform specific configuration +@@ -239,7 +281,7 @@ set_target_properties(${EXECUTABLE_NAME} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY_RELEASE ${MOONCHILD_BIN_DIR}/Release + ) + +-if(MOONCHILD_INPUT_SDL3 AND NOT EMSCRIPTEN) ++if(MOONCHILD_INPUT_SDL3 AND NOT EMSCRIPTEN AND MOONCHILD_VENDORED_GAMECONTROLLERDB) + add_custom_command(TARGET ${EXECUTABLE_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${LIBRARY_DIR}/SDL_GameControllerDB/gamecontrollerdb.txt" +diff --git c/Platform/Backends/Input/SDL3Input.cpp w/Platform/Backends/Input/SDL3Input.cpp +index d214516..1412c00 100644 +--- c/Platform/Backends/Input/SDL3Input.cpp ++++ w/Platform/Backends/Input/SDL3Input.cpp +@@ -19,10 +19,12 @@ bool SDL3Input::Init() + return false; + } + +- if (SDL_AddGamepadMappingsFromFile("gamecontrollerdb.txt") < 0) ++#ifdef MOONCHILD_GAMECONTROLLERDB_PATH ++ if (SDL_AddGamepadMappingsFromFile(MOONCHILD_GAMECONTROLLERDB_PATH) < 0) + { + printf("SDL gamepad mapping load failed! %s\n", SDL_GetError()); + } ++#endif + + int count = 0; + if (SDL_JoystickID* ids = SDL_GetGamepads(&count))