Files
AyeZeeBB db99ed4d72 Mods: two mods that conflict load only the higher one, found before the merge
Where two mods change one of the game's assets in ways that cannot both be
in the game (a resource or chunk changed differently, an EBX whose changes
cannot be combined, different assets added under one name), the one lower
in the load order is left out whole, so neither loads half its changes.
The merge used to keep the higher copy of each asset and lose the rest of
the lower mod's change silently, which broke Skaterize beside deckorate.

A check before the merge (find_conflicts) reads only the bundles two or
more mods ship and applies the merge's rule: about 2 s for 296 mods, on
several threads, each mod's copy of a bundle by itself. When it finds
conflicts nothing is built, the catalog leaves the losing mods out and
merges once. The merge keeps its own check behind it, tracking per asset
the last change a mod made itself, so a change carried through other mods'
copies is still caught. A conflict is remembered in .reskate-excluded.json
with the mod it lost to, and stays out while both are unchanged and the
winner still loads above it.

The launcher says "Checking the mods" and "Checking the mods for
conflicts" during those steps. Its mod problems screen says MOD CONFLICT
when that is all there is, and the Mod Manager shows a CONFLICT badge, an
N CONFLICTS banner, a Conflicts filter and, on the mod, which mod it lost
to and how to load it instead.
2026-10-18 01:35:31 -05:00

136 lines
5.9 KiB
CMake

if(WIN32)
add_library(dingosdk_hooks STATIC
Engine/Core/Hooks/hooks.cpp)
target_link_libraries(dingosdk_hooks PRIVATE dingosdk_detours)
endif()
add_library(dingosdk_launcher_support STATIC
Engine/Core/Platform/launcher_support.cpp
Engine/Core/Platform/launcher_pe.cpp
$<$<BOOL:${WIN32}>:Engine/Core/Platform/launcher_injection.cpp>)
if(WIN32)
target_link_libraries(dingosdk_launcher_support PUBLIC bcrypt)
else()
find_package(OpenSSL REQUIRED)
target_link_libraries(dingosdk_launcher_support PUBLIC OpenSSL::Crypto)
endif()
if(WIN32)
# Checks that the running game is the supported Skate.exe build.
add_library(dingosdk_supported_build STATIC Engine/Game/Build/image_identity.cpp)
target_link_libraries(dingosdk_supported_build PUBLIC bcrypt)
endif()
add_library(dingosdk_console_core STATIC
Engine/Core/Console/console_core.cpp
Engine/Core/Console/command_registry.cpp
Engine/Core/Console/console_activity.cpp)
add_library(dingosdk_json STATIC
Engine/Core/Json/json.cpp)
# The bad-word filter (Engine/Core/Text/word_filter.h); its words come from the backend.
add_library(dingosdk_word_filter STATIC Engine/Core/Text/word_filter.cpp)
target_include_directories(dingosdk_json SYSTEM PRIVATE External)
if(WIN32)
add_library(dingosdk_logging STATIC
Engine/Core/Log/logger.cpp
Engine/Core/Log/banner.cpp
Engine/Core/Log/events.cpp
Engine/Core/Log/paths.cpp
Engine/Core/Log/crash.cpp)
target_link_libraries(dingosdk_logging PUBLIC dingosdk_console_core PRIVATE shell32 ole32)
target_include_directories(dingosdk_logging SYSTEM PRIVATE External/spdlog/include External)
target_compile_definitions(dingosdk_logging PRIVATE SPDLOG_USE_STD_FORMAT SPDLOG_WCHAR_FILENAMES)
# The performance profiler: zones, frame timing, thread CPU use and the stack sampler
# (Engine/Core/Profiling/profiler.h). Shared by the overlay and the runtime.
add_library(dingosdk_profiler STATIC
Engine/Core/Profiling/profiler.cpp
Engine/Core/Profiling/sampler.cpp)
target_link_libraries(dingosdk_profiler PUBLIC dingosdk_logging PRIVATE dbghelp)
add_library(dingosdk_storage STATIC Engine/Core/Storage/save_database.cpp)
target_link_libraries(dingosdk_storage PUBLIC dingosdk_json PRIVATE dingosdk_sqlite)
endif()
add_library(dingosdk_frostbite STATIC
Engine/Resource/binary_io.cpp
Engine/Resource/binary_bundle.cpp
Engine/Resource/cas_codec.cpp
Engine/Resource/ebx_document.cpp
Engine/Resource/ebx_fixup_repair.cpp
Engine/Resource/ebx_merge.cpp
Engine/Resource/material_grid.cpp
Engine/Resource/shader_lookup.cpp
Engine/Resource/bundle_ref_table.cpp
Engine/Resource/ebx_writer.cpp
Engine/Resource/toc.cpp
Engine/Resource/texture.cpp
Engine/Resource/mesh_set.cpp
Engine/Resource/skeleton_asset.cpp)
target_include_directories(dingosdk_frostbite SYSTEM PRIVATE External/bcdec)
target_link_libraries(dingosdk_frostbite PRIVATE dingosdk_lz4 dingosdk_zstd dingosdk_miniz)
add_library(dingosdk_native_db STATIC Engine/Vfs/native_db.cpp)
if(WIN32)
add_library(dingosdk_initfs STATIC Engine/Vfs/initfs.cpp)
target_link_libraries(dingosdk_initfs PUBLIC dingosdk_launcher_support dingosdk_json PRIVATE dingosdk_native_db bcrypt)
# The Mods folder list and mods.json writer, without the merge: shared with
# the launcher's mod manager.
add_library(dingosdk_mod_list STATIC Engine/Vfs/mod_list.cpp)
target_link_libraries(dingosdk_mod_list PUBLIC dingosdk_json)
endif()
# Read access to the installed game's cas archives.
add_library(dingosdk_game_archives STATIC Engine/Vfs/game_archives.cpp Engine/Vfs/game_bundles.cpp
Engine/Vfs/item_thumbnails.cpp Engine/Vfs/game_textures.cpp)
target_link_libraries(dingosdk_game_archives PUBLIC dingosdk_native_db dingosdk_frostbite)
if(WIN32)
add_library(dingosdk_mods STATIC
Engine/Vfs/mod_catalog.cpp
Engine/Vfs/mod_merge.cpp
Engine/Vfs/mod_merge_files.cpp
Engine/Vfs/mod_merge_stamp.cpp
Engine/Vfs/mod_merge_cas_store.cpp
Engine/Vfs/mod_merge_combine.cpp
Engine/Vfs/mod_merge_overrides.cpp
Engine/Vfs/mod_merge_conflicts.cpp
Engine/Vfs/mod_merge_textures.cpp
Engine/Vfs/mod_merge_grid.cpp
Engine/Vfs/mod_merge_load_screens.cpp
Engine/Vfs/mod_music.cpp
Engine/Vfs/mod_scoring.cpp
Engine/Vfs/mod_store_copies.cpp
Engine/Vfs/mod_item_sources.cpp
Engine/Vfs/builtin_packs.cpp)
target_link_libraries(dingosdk_mods PUBLIC dingosdk_json dingosdk_mod_list PRIVATE dingosdk_game_archives dingosdk_native_db dingosdk_frostbite dingosdk_content_cache dingosdk_miniz dingosdk_zstd shell32 bcrypt)
add_library(dingosdk_custom_scripts STATIC Engine/Scripting/custom_scripts.cpp)
target_link_libraries(dingosdk_custom_scripts PUBLIC dingosdk_json PRIVATE dingosdk_initfs)
# HTTPS downloads shared by the park preview and content cache packs.
add_library(dingosdk_https STATIC Engine/Vfs/https_download.cpp)
target_link_libraries(dingosdk_https PUBLIC winhttp)
endif()
# The live game's content cache: the launcher installs it, the runtime reads
# catalogues from it (Engine/Vfs/content_cache.h).
add_library(dingosdk_content_cache STATIC Engine/Vfs/content_cache.cpp Engine/Vfs/content_catalogs.cpp)
target_link_libraries(dingosdk_content_cache PUBLIC dingosdk_json)
if(WIN32)
add_library(dingosdk_content_cache_install STATIC Engine/Vfs/content_cache_install.cpp)
target_link_libraries(dingosdk_content_cache_install PUBLIC dingosdk_content_cache
PRIVATE dingosdk_launcher_support dingosdk_https dingosdk_miniz)
endif()
# World layers read from the installed level data, cached per game build.
add_library(dingosdk_world_layer_scan STATIC Engine/Vfs/world_layer_scan.cpp)
target_link_libraries(dingosdk_world_layer_scan PUBLIC dingosdk_json PRIVATE dingosdk_game_archives dingosdk_content_cache)