From 0f924528ba53d4b47e20a5a74e0320427aaf5155 Mon Sep 17 00:00:00 2001 From: Gleb Mazovetskiy Date: Sun, 5 Dec 2021 12:07:20 +0000 Subject: [PATCH] macOS/iOS: Add resources to the bundle --- CMakeLists.txt | 95 ++++++++++++++++++++++++++-------------- Source/engine/assets.cpp | 4 +- Source/init.cpp | 2 +- 3 files changed, 64 insertions(+), 37 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fead9bcc7..525d1655e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -744,6 +744,14 @@ if (Gettext_FOUND) list(APPEND devilutionx_lang_targets "${_lang_target}") list(APPEND devilutionx_lang_files "${_gmo_file}") + if(APPLE) + set_source_files_properties("${_gmo_file}" PROPERTIES + MACOSX_PACKAGE_LOCATION Resources + XCODE_EXPLICIT_FILE_TYPE compiled) + add_dependencies(${BIN_TARGET} "${_lang_target}") + target_sources(${BIN_TARGET} PRIVATE "${_gmo_file}") + endif() + if(VITA) list(APPEND VITA_TRANSLATIONS_LIST "FILE" "${_gmo_file}" "assets/${lang}.gmo") endif() @@ -855,43 +863,62 @@ set(devilutionx_assets ui_art/mainmenuw.pcx ui_art/supportw.pcx) - -# Copy assets to the build assets subdirectory. This serves two purposes: -# - If smpq is installed, devilutionx.mpq is built from these files. -# - If smpq is not installed, the game will load the assets directly from this directoy. -foreach(asset_file ${devilutionx_assets}) - set(src "${CMAKE_CURRENT_SOURCE_DIR}/Packaging/resources/assets/${asset_file}") - set(dst "${DEVILUTIONX_ASSETS_OUTPUT_DIRECTORY}/${asset_file}") - list(APPEND DEVILUTIONX_MPQ_FILES "${asset_file}") - list(APPEND DEVILUTIONX_OUTPUT_ASSETS_FILES "${dst}") - add_custom_command( - COMMENT "Copying ${asset_file}" - OUTPUT "${dst}" - DEPENDS "${src}" - COMMAND ${CMAKE_COMMAND} -E copy "${src}" "${dst}" - VERBATIM) -endforeach() -if (Gettext_FOUND) - foreach(lang ${devilutionx_langs}) - list(APPEND DEVILUTIONX_MPQ_FILES "${lang}.gmo") - endforeach() +if(VIRTUAL_GAMEPAD) + list(APPEND devilutionx_assets + ui_art/button.png + ui_art/directions2.png + ui_art/directions.png + ui_art/menu-levelup.png + ui_art/menu.png) endif() -if(BUILD_ASSETS_MPQ) - set(DEVILUTIONX_MPQ "${CMAKE_CURRENT_BINARY_DIR}/devilutionx.mpq") - add_custom_command( - COMMENT "Building devilutionx.mpq" - OUTPUT "${DEVILUTIONX_MPQ}" - COMMAND ${CMAKE_COMMAND} -E remove -f "${DEVILUTIONX_MPQ}" - COMMAND ${SMPQ} -M 1 -C PKWARE -c "${DEVILUTIONX_MPQ}" ${DEVILUTIONX_MPQ_FILES} - WORKING_DIRECTORY "${DEVILUTIONX_ASSETS_OUTPUT_DIRECTORY}" - DEPENDS ${DEVILUTIONX_OUTPUT_ASSETS_FILES} ${devilutionx_lang_targets} ${devilutionx_lang_files} - VERBATIM) - add_custom_target(devilutionx_mpq DEPENDS "${DEVILUTIONX_MPQ}") - add_dependencies(${BIN_TARGET} devilutionx_mpq) +if(APPLE) + foreach(asset_file ${devilutionx_assets}) + set(src "${CMAKE_CURRENT_SOURCE_DIR}/Packaging/resources/assets/${asset_file}") + get_filename_component(_asset_dir "${asset_file}" DIRECTORY) + set_source_files_properties("${src}" PROPERTIES + MACOSX_PACKAGE_LOCATION "Resources/${_asset_dir}" + XCODE_EXPLICIT_FILE_TYPE compiled) + target_sources(${BIN_TARGET} PRIVATE "${src}") + endforeach() else() - add_custom_target(devilutionx_copied_assets DEPENDS ${DEVILUTIONX_OUTPUT_ASSETS_FILES} ${devilutionx_lang_targets}) - add_dependencies(${BIN_TARGET} devilutionx_copied_assets) + # Copy assets to the build assets subdirectory. This serves two purposes: + # - If smpq is installed, devilutionx.mpq is built from these files. + # - If smpq is not installed, the game will load the assets directly from this directoy. + foreach(asset_file ${devilutionx_assets}) + set(src "${CMAKE_CURRENT_SOURCE_DIR}/Packaging/resources/assets/${asset_file}") + set(dst "${DEVILUTIONX_ASSETS_OUTPUT_DIRECTORY}/${asset_file}") + list(APPEND DEVILUTIONX_MPQ_FILES "${asset_file}") + list(APPEND DEVILUTIONX_OUTPUT_ASSETS_FILES "${dst}") + add_custom_command( + COMMENT "Copying ${asset_file}" + OUTPUT "${dst}" + DEPENDS "${src}" + COMMAND ${CMAKE_COMMAND} -E copy "${src}" "${dst}" + VERBATIM) + endforeach() + if (Gettext_FOUND) + foreach(lang ${devilutionx_langs}) + list(APPEND DEVILUTIONX_MPQ_FILES "${lang}.gmo") + endforeach() + endif() + + if(BUILD_ASSETS_MPQ) + set(DEVILUTIONX_MPQ "${CMAKE_CURRENT_BINARY_DIR}/devilutionx.mpq") + add_custom_command( + COMMENT "Building devilutionx.mpq" + OUTPUT "${DEVILUTIONX_MPQ}" + COMMAND ${CMAKE_COMMAND} -E remove -f "${DEVILUTIONX_MPQ}" + COMMAND ${SMPQ} -M 1 -C PKWARE -c "${DEVILUTIONX_MPQ}" ${DEVILUTIONX_MPQ_FILES} + WORKING_DIRECTORY "${DEVILUTIONX_ASSETS_OUTPUT_DIRECTORY}" + DEPENDS ${DEVILUTIONX_OUTPUT_ASSETS_FILES} ${devilutionx_lang_targets} ${devilutionx_lang_files} + VERBATIM) + add_custom_target(devilutionx_mpq DEPENDS "${DEVILUTIONX_MPQ}") + add_dependencies(${BIN_TARGET} devilutionx_mpq) + else() + add_custom_target(devilutionx_copied_assets DEPENDS ${DEVILUTIONX_OUTPUT_ASSETS_FILES} ${devilutionx_lang_targets}) + add_dependencies(${BIN_TARGET} devilutionx_copied_assets) + endif() endif() target_include_directories(libdevilutionx PUBLIC diff --git a/Source/engine/assets.cpp b/Source/engine/assets.cpp index 380125dd4..44eb5b46c 100644 --- a/Source/engine/assets.cpp +++ b/Source/engine/assets.cpp @@ -63,8 +63,8 @@ SDL_RWops *OpenAsset(const char *filename, bool threadsafe) if ((rwops = SDL_RWFromFile(path.c_str(), "rb")) != nullptr) return rwops; -#ifdef __ANDROID__ - // On Android, fall back to the APK's assets. +#if defined(__ANDROID__) || defined(__APPLE__) + // Fall back to the bundled assets on supported systems. // This is handled by SDL when we pass a relative path. if (!paths::AssetsPath().empty() && (rwops = SDL_RWFromFile(relativePath.c_str(), "rb"))) return rwops; diff --git a/Source/init.cpp b/Source/init.cpp index 6f8c7dae7..5609acbef 100644 --- a/Source/init.cpp +++ b/Source/init.cpp @@ -164,7 +164,7 @@ void init_archives() { auto paths = GetMPQSearchPaths(); -#ifndef __ANDROID__ +#if !defined(__ANDROID__) && !defined(__APPLE__) // Load devilutionx.mpq first to get the font file for error messages devilutionx_mpq = LoadMPQ(paths, "devilutionx.mpq"); #endif