mirror of
https://github.com/1dot13/source.git
synced 2026-07-29 13:52:17 +02:00
Drops the last piece of the proprietary Smacker SDK: SMACKW32.LIB, its header sgp/SMACK.H, and with them the SMACKW32.DLL the game needed at runtime. Bink is untouched and still needs binkw32. The two libraries divide the work differently, so Cinematics.cpp changes more than the call names. SMACKW32.DLL played a file: it kept the playback clock (SmackWait), blitted converted 16bpp pixels into a surface we handed it (SmackToBuffer) and pushed the audio to DirectSound itself. libsmacker only decodes, so this module now: - keeps the clock. Frames are advanced against GetTickCount() from the moment the flic starts, skipping frames if the game fell behind, which is what SmackWait/SmackDoFrame did internally. - blits itself. Frames come out 8bpp palettised, so the palette is converted with Get16BPPColor() and the frame is written into the frame buffer, clipped to the screen. The Y-scaling flags are not handled; none of the videos shipping with the game set them. - plays the audio itself, through the SoundPlayFromBuffer() added earlier. libsmacker hands out audio a frame at a time, so the whole track is decoded up front, with the video track disabled to keep that pass cheap, and given a WAV header so the sound module can take it. libsmacker reads from memory, which lets the file be read straight out of the VFS. That removes the dance where the .smk was first copied to a real file under Temp/ because SmackOpen() could only open a path. SmkInitialize() loses its window and screen size arguments, which only existed for SmackBufferOpen(). SmkOpenFlic(), SmkSetBlitPosition() and SmkGetFreeFlic() are no longer declared in the header; nothing outside the module called them. SMKFLIC is now opaque, Intro.cpp only holds pointers. The unused SMACK.H include in Cinematics Bink.cpp goes away as well. Tested by running the Sirtech splash screen (SPLASHSCREEN.SMK, 640x480, 15 fps, one 44.1kHz 16 bit stereo track) under Wine: picture, palette, placement and playback speed are right. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> refactor
175 lines
5.7 KiB
CMake
175 lines
5.7 KiB
CMake
cmake_minimum_required(VERSION 3.20)
|
|
|
|
project(ja2)
|
|
|
|
include(cmake/CopyUserPresetTemplate.cmake)
|
|
CopyUserPresetTemplate()
|
|
|
|
set(CMAKE_CXX_STANDARD 17)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
|
|
|
option(LTO_OPTION "Enable link-time optimization if supported by compiler" OFF)
|
|
|
|
include(CheckIPOSupported)
|
|
check_ipo_supported(RESULT LinkTimeOptimization OUTPUT IpoError LANGUAGES C CXX)
|
|
if(LinkTimeOptimization AND LTO_OPTION)
|
|
message(STATUS "Configuring WITH link-time optimization")
|
|
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
|
|
else()
|
|
message(STATUS "Configuring WITHOUT link-time optimization ${IpoError}")
|
|
endif()
|
|
|
|
option(ADDRESS_SANITIZER OFF)
|
|
if(ADDRESS_SANITIZER)
|
|
message(STATUS "AddressSanitizer ENABLED for non-Release builds")
|
|
add_compile_options($<IF:$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>,-fsanitize=address,>)
|
|
endif()
|
|
|
|
if(MSVC)
|
|
# TODO: fix the warnings here and turn them on
|
|
# https://learn.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warnings-c4000-through-c4199
|
|
add_compile_options("/wd4838") # silence implicit narrowing conversion warnings
|
|
# add_compile_options("/w14061")
|
|
# add_compile_options("/w14062")
|
|
endif()
|
|
|
|
# whether we are using MSBuild as a generator
|
|
set(usingMsBuild $<STREQUAL:${CMAKE_VS_PLATFORM_NAME},Win32>)
|
|
|
|
# lua51.lib and lua51.vc9.lib have been built with /MTx, so we must as well
|
|
# TODO: build our own Lua 5.1.2 from source so we can use whichever
|
|
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
|
|
|
|
add_compile_definitions(CINTERFACE XML_STATIC VFS_STATIC VFS_WITH_SLF VFS_WITH_7ZIP _CRT_SECURE_NO_DEPRECATE)
|
|
include_directories(
|
|
"${CMAKE_SOURCE_DIR}/Ja2"
|
|
"${CMAKE_SOURCE_DIR}/ext/VFS/include"
|
|
"${CMAKE_SOURCE_DIR}/ext/libsmacker"
|
|
"${CMAKE_SOURCE_DIR}/Utils"
|
|
"${CMAKE_SOURCE_DIR}/TileEngine"
|
|
"${CMAKE_SOURCE_DIR}/TacticalAI"
|
|
"${CMAKE_SOURCE_DIR}/ModularizedTacticalAI/include"
|
|
"${CMAKE_SOURCE_DIR}/Tactical"
|
|
"${CMAKE_SOURCE_DIR}/Strategic"
|
|
"${CMAKE_SOURCE_DIR}/sgp"
|
|
"${CMAKE_SOURCE_DIR}/Ja2/Res"
|
|
"${CMAKE_SOURCE_DIR}/lua"
|
|
"${CMAKE_SOURCE_DIR}/Laptop"
|
|
"${CMAKE_SOURCE_DIR}/Multiplayer"
|
|
"${CMAKE_SOURCE_DIR}/Editor"
|
|
"${CMAKE_SOURCE_DIR}/i18n/include"
|
|
)
|
|
|
|
# external libraries
|
|
add_subdirectory("ext/libpng")
|
|
add_subdirectory("ext/libsmacker")
|
|
add_subdirectory("ext/zlib")
|
|
add_subdirectory("ext/VFS")
|
|
target_link_libraries(bfVFS PRIVATE 7z)
|
|
|
|
# ja2export utility
|
|
add_subdirectory("ext/export/src")
|
|
|
|
# static libraries whose translation units don't rely on Application preprocessor definitions.
|
|
add_subdirectory(lua)
|
|
add_subdirectory(Multiplayer)
|
|
add_subdirectory(wine)
|
|
|
|
set(Ja2_Libraries
|
|
"${CMAKE_SOURCE_DIR}/binkw32.lib"
|
|
"${CMAKE_SOURCE_DIR}/libexpatMT.lib"
|
|
"${CMAKE_SOURCE_DIR}/lua51.lib"
|
|
"${CMAKE_SOURCE_DIR}/lua51.vc9.lib"
|
|
"Dbghelp.lib"
|
|
"Winmm.lib"
|
|
"ws2_32.lib"
|
|
bfVFS
|
|
Lua
|
|
Multiplayer
|
|
smacker
|
|
wine
|
|
)
|
|
|
|
# static libraries whose translation units rely on Application preprocessor definitions.
|
|
set(Ja2_Libs
|
|
Editor
|
|
Ja2
|
|
Laptop
|
|
ModularizedTacticalAI
|
|
sgp
|
|
Strategic
|
|
Tactical
|
|
TacticalAI
|
|
TileEngine
|
|
Utils
|
|
)
|
|
foreach(lib IN LISTS Ja2_Libs)
|
|
add_subdirectory(${lib})
|
|
endforeach()
|
|
|
|
# language library relies on Application preprocessor definition; compiled once per app
|
|
# with all 8 languages built in and selected at runtime (docs/plans/language-design.md).
|
|
add_subdirectory(i18n)
|
|
|
|
# simple function to validate the Application choice
|
|
include(cmake/ValidateOptions.cmake)
|
|
|
|
set(ValidApplications JA2 JA2MAPEDITOR JA2UB JA2UBMAPEDITOR)
|
|
ValidateOptions("${ValidApplications}" "Applications" "${Applications}" "ApplicationTargets")
|
|
|
|
|
|
# preprocessor definitions for Debug build, per the legacy MSBuild
|
|
set(debugFlags $<IF:$<CONFIG:Debug>,JA2BETAVERSION;JA2TESTVERSION;DEBUG_ATTACKBUSY,>)
|
|
|
|
foreach(app IN LISTS ApplicationTargets)
|
|
set(isEditor $<STREQUAL:${app},JA2MAPEDITOR>)
|
|
set(isUb $<STREQUAL:${app},JA2UB>)
|
|
set(isUbEditor $<STREQUAL:${app},JA2UBMAPEDITOR>)
|
|
set(compilationFlags
|
|
$<IF:${isEditor},JA2EDITOR;JA2BETAVERSION,>
|
|
$<IF:${isUb},JA2UB;JA2UBMAPS,>
|
|
$<IF:${isUbEditor},JA2UB;JA2UBMAPS;JA2EDITOR;JA2BETAVERSION,>
|
|
)
|
|
|
|
foreach(lib IN LISTS Ja2_Libs)
|
|
# library for an application, e.g. JA2UB_sgp
|
|
set(game_library ${app}_${lib})
|
|
add_library(${game_library})
|
|
target_sources(${game_library} PRIVATE ${${lib}Src})
|
|
target_compile_definitions(${game_library} PRIVATE ${compilationFlags} ${debugFlags})
|
|
endforeach()
|
|
|
|
# executable for the application, e.g. JA2.exe
|
|
set(exe ${app})
|
|
add_executable(${exe} WIN32
|
|
sgp/sgp.cpp
|
|
Ja2/Res/ja2.rc
|
|
)
|
|
target_link_libraries(${exe} PRIVATE ${Ja2_Libraries} $<IF:${usingMsBuild},legacy_stdio_definitions.lib,>)
|
|
target_link_options(${exe} PRIVATE $<IF:${usingMsBuild},/SAFESEH:NO,>)
|
|
target_compile_definitions(${exe} PRIVATE ${compilationFlags} ${debugFlags})
|
|
|
|
# language library for the application, e.g. JA2MAPEDITOR_i18n — one per app, all 8
|
|
# languages compiled in, selected at runtime by BindLanguageStrings
|
|
set(language_library ${exe}_i18n)
|
|
add_library(${language_library})
|
|
target_sources(${language_library} PRIVATE ${i18nSrc})
|
|
target_compile_definitions(${language_library} PRIVATE ${compilationFlags} ${debugFlags})
|
|
target_compile_options(${language_library} PRIVATE /w14062)
|
|
target_link_libraries(${exe} PRIVATE ${language_library})
|
|
|
|
# go through all game libraries again and link them to the app executable
|
|
foreach(lib IN LISTS Ja2_Libs)
|
|
target_link_libraries(${exe} PRIVATE ${app}_${lib})
|
|
endforeach()
|
|
|
|
# for Utils only
|
|
target_link_libraries(${app}_Utils PRIVATE smacker)
|
|
|
|
# for SGP only
|
|
target_link_libraries(${app}_sgp PRIVATE "ddraw.lib" "${PROJECT_SOURCE_DIR}/fmodvc.lib")
|
|
target_link_libraries(${app}_sgp PRIVATE libpng)
|
|
target_compile_definitions(${app}_sgp PRIVATE ${compilationFlags} ${debugFlags} NO_ZLIB_COMPRESSION)
|
|
endforeach()
|