Core Modules (game-agnostic, reusable for WarFactory): - ResourceModule: Inventory, crafting system (465 lines) - StorageModule: Save/load with pub/sub state collection (424 lines) - CombatModule: Combat resolver, damage/armor/morale (580 lines) - EventModule: JSON event scripting with choices/outcomes (651 lines) MC-Specific Modules: - GameModule v2: State machine + event subscriptions (updated) - TrainBuilderModule: 3 wagons, 2-axis balance, performance malus (530 lines) - ExpeditionModule: A→B expeditions, team management, events integration (641 lines) Features: - All modules hot-reload compatible (state preservation) - Pure pub/sub architecture (zero direct coupling) - 7 config files (resources, storage, combat, events, train, expeditions) - 7 test suites (GameModuleTest: 12/12 PASSED) - CMakeLists.txt updated for all modules + tests Total: ~3,500 lines of production code + comprehensive tests 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
362 lines
10 KiB
CMake
362 lines
10 KiB
CMake
cmake_minimum_required(VERSION 3.20)
|
|
project(MobileCommand VERSION 0.1.0 LANGUAGES CXX)
|
|
|
|
set(CMAKE_CXX_STANDARD 17)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
|
|
# Export compile commands for IDE support
|
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
|
|
|
# ============================================================================
|
|
# GroveEngine Integration
|
|
# ============================================================================
|
|
set(GROVE_BUILD_TESTS OFF CACHE BOOL "Disable GroveEngine tests" FORCE)
|
|
set(GROVE_BUILD_MODULES OFF CACHE BOOL "Disable GroveEngine modules" FORCE)
|
|
add_subdirectory(external/GroveEngine)
|
|
|
|
# ============================================================================
|
|
# Dependencies
|
|
# ============================================================================
|
|
include(FetchContent)
|
|
|
|
# ============================================================================
|
|
# Main Executable
|
|
# ============================================================================
|
|
add_executable(mobilecommand
|
|
src/main.cpp
|
|
)
|
|
|
|
target_link_libraries(mobilecommand PRIVATE
|
|
GroveEngine::impl
|
|
spdlog::spdlog
|
|
)
|
|
|
|
target_include_directories(mobilecommand PRIVATE
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
|
)
|
|
|
|
# ============================================================================
|
|
# Hot-Reloadable Modules (.so/.dll) - Game modules
|
|
# ============================================================================
|
|
|
|
# GameModule - Core game loop
|
|
add_library(GameModule SHARED
|
|
src/modules/GameModule.cpp
|
|
src/modules/GameModule.h
|
|
)
|
|
target_link_libraries(GameModule PRIVATE
|
|
GroveEngine::impl
|
|
spdlog::spdlog
|
|
)
|
|
target_include_directories(GameModule PRIVATE
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
|
)
|
|
set_target_properties(GameModule PROPERTIES
|
|
PREFIX "lib"
|
|
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/modules
|
|
)
|
|
|
|
# ResourceModule - Core inventory and crafting (game-agnostic)
|
|
add_library(ResourceModule SHARED
|
|
src/modules/core/ResourceModule.cpp
|
|
src/modules/core/ResourceModule.h
|
|
)
|
|
target_link_libraries(ResourceModule PRIVATE
|
|
GroveEngine::impl
|
|
spdlog::spdlog
|
|
)
|
|
target_include_directories(ResourceModule PRIVATE
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
|
)
|
|
set_target_properties(ResourceModule PROPERTIES
|
|
PREFIX "lib"
|
|
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/modules/core
|
|
)
|
|
|
|
# EventModule - Core event scripting system (game-agnostic)
|
|
add_library(EventModule SHARED
|
|
src/modules/core/EventModule.cpp
|
|
src/modules/core/EventModule.h
|
|
)
|
|
target_link_libraries(EventModule PRIVATE
|
|
GroveEngine::impl
|
|
spdlog::spdlog
|
|
)
|
|
target_include_directories(EventModule PRIVATE
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
|
)
|
|
set_target_properties(EventModule PROPERTIES
|
|
PREFIX "lib"
|
|
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/modules/core
|
|
)
|
|
|
|
# StorageModule - Core save/load system (game-agnostic)
|
|
add_library(StorageModule SHARED
|
|
src/modules/core/StorageModule.cpp
|
|
src/modules/core/StorageModule.h
|
|
)
|
|
target_link_libraries(StorageModule PRIVATE
|
|
GroveEngine::impl
|
|
spdlog::spdlog
|
|
)
|
|
target_include_directories(StorageModule PRIVATE
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
|
)
|
|
set_target_properties(StorageModule PROPERTIES
|
|
PREFIX "lib"
|
|
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/modules/core
|
|
)
|
|
|
|
# CombatModule - Core combat resolver (game-agnostic)
|
|
add_library(CombatModule SHARED
|
|
src/modules/core/CombatModule.cpp
|
|
src/modules/core/CombatModule.h
|
|
)
|
|
target_link_libraries(CombatModule PRIVATE
|
|
GroveEngine::impl
|
|
spdlog::spdlog
|
|
)
|
|
target_include_directories(CombatModule PRIVATE
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
|
)
|
|
set_target_properties(CombatModule PROPERTIES
|
|
PREFIX "lib"
|
|
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/modules/core
|
|
)
|
|
|
|
# TrainBuilderModule - MC-specific train management
|
|
add_library(TrainBuilderModule SHARED
|
|
src/modules/mc_specific/TrainBuilderModule.cpp
|
|
src/modules/mc_specific/TrainBuilderModule.h
|
|
)
|
|
target_link_libraries(TrainBuilderModule PRIVATE
|
|
GroveEngine::impl
|
|
spdlog::spdlog
|
|
)
|
|
target_include_directories(TrainBuilderModule PRIVATE
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
|
)
|
|
set_target_properties(TrainBuilderModule PROPERTIES
|
|
PREFIX "lib"
|
|
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/modules/mc_specific
|
|
)
|
|
|
|
# ExpeditionModule - MC-specific expedition system
|
|
add_library(ExpeditionModule SHARED
|
|
src/modules/mc_specific/ExpeditionModule.cpp
|
|
src/modules/mc_specific/ExpeditionModule.h
|
|
)
|
|
target_link_libraries(ExpeditionModule PRIVATE
|
|
GroveEngine::impl
|
|
spdlog::spdlog
|
|
)
|
|
target_include_directories(ExpeditionModule PRIVATE
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
|
)
|
|
set_target_properties(ExpeditionModule PROPERTIES
|
|
PREFIX "lib"
|
|
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/modules/mc_specific
|
|
)
|
|
|
|
# ============================================================================
|
|
# Copy config files to build directory
|
|
# ============================================================================
|
|
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/config/
|
|
DESTINATION ${CMAKE_BINARY_DIR}/config)
|
|
|
|
# ============================================================================
|
|
# Development targets
|
|
# ============================================================================
|
|
|
|
# Quick rebuild of modules only (for hot-reload workflow)
|
|
add_custom_target(modules
|
|
DEPENDS GameModule ResourceModule StorageModule CombatModule EventModule TrainBuilderModule ExpeditionModule
|
|
COMMENT "Building hot-reloadable modules only"
|
|
)
|
|
|
|
# Run MobileCommand
|
|
add_custom_target(run
|
|
COMMAND $<TARGET_FILE:mobilecommand>
|
|
DEPENDS mobilecommand modules
|
|
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
|
COMMENT "Running Mobile Command"
|
|
)
|
|
|
|
# ============================================================================
|
|
# Tests
|
|
# ============================================================================
|
|
|
|
# Google Test (for GameModule tests)
|
|
include(FetchContent)
|
|
FetchContent_Declare(
|
|
googletest
|
|
GIT_REPOSITORY https://github.com/google/googletest.git
|
|
GIT_TAG v1.14.0
|
|
)
|
|
# For Windows: Prevent overriding the parent project's compiler/linker settings
|
|
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
|
|
FetchContent_MakeAvailable(googletest)
|
|
|
|
# Enable testing
|
|
enable_testing()
|
|
|
|
# GameModule unit tests
|
|
add_executable(GameModuleTest
|
|
tests/GameModuleTest.cpp
|
|
src/modules/GameModule.cpp
|
|
src/modules/GameModule.h
|
|
)
|
|
target_link_libraries(GameModuleTest PRIVATE
|
|
GroveEngine::impl
|
|
spdlog::spdlog
|
|
gtest_main
|
|
gmock_main
|
|
)
|
|
target_include_directories(GameModuleTest PRIVATE
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
|
)
|
|
|
|
# ResourceModule independent test
|
|
add_executable(ResourceModuleTest
|
|
tests/ResourceModuleTest.cpp
|
|
src/modules/core/ResourceModule.cpp
|
|
src/modules/core/ResourceModule.h
|
|
)
|
|
target_link_libraries(ResourceModuleTest PRIVATE
|
|
GroveEngine::impl
|
|
spdlog::spdlog
|
|
)
|
|
target_include_directories(ResourceModuleTest PRIVATE
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
|
)
|
|
|
|
# EventModule independent test
|
|
add_executable(EventModuleTest
|
|
tests/EventModuleTest.cpp
|
|
src/modules/core/EventModule.cpp
|
|
src/modules/core/EventModule.h
|
|
)
|
|
target_link_libraries(EventModuleTest PRIVATE
|
|
GroveEngine::impl
|
|
spdlog::spdlog
|
|
)
|
|
target_include_directories(EventModuleTest PRIVATE
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
|
)
|
|
|
|
# Test targets
|
|
add_custom_target(test_game
|
|
COMMAND $<TARGET_FILE:GameModuleTest>
|
|
DEPENDS GameModuleTest
|
|
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
|
COMMENT "Running GameModule tests"
|
|
)
|
|
|
|
add_custom_target(test_resource
|
|
COMMAND $<TARGET_FILE:ResourceModuleTest>
|
|
DEPENDS ResourceModuleTest
|
|
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
|
COMMENT "Running ResourceModule tests"
|
|
)
|
|
|
|
add_custom_target(test_event
|
|
COMMAND $<TARGET_FILE:EventModuleTest>
|
|
DEPENDS EventModuleTest
|
|
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
|
COMMENT "Running EventModule tests"
|
|
)
|
|
|
|
# TrainBuilderModule independent test
|
|
add_executable(TrainBuilderModuleTest
|
|
tests/TrainBuilderModuleTest.cpp
|
|
src/modules/mc_specific/TrainBuilderModule.cpp
|
|
src/modules/mc_specific/TrainBuilderModule.h
|
|
)
|
|
target_link_libraries(TrainBuilderModuleTest PRIVATE
|
|
GroveEngine::impl
|
|
spdlog::spdlog
|
|
gtest_main
|
|
gmock_main
|
|
)
|
|
target_include_directories(TrainBuilderModuleTest PRIVATE
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
|
)
|
|
|
|
add_custom_target(test_train
|
|
COMMAND $<TARGET_FILE:TrainBuilderModuleTest>
|
|
DEPENDS TrainBuilderModuleTest
|
|
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
|
COMMENT "Running TrainBuilderModule tests"
|
|
)
|
|
|
|
# StorageModule independent test
|
|
add_executable(StorageModuleTest
|
|
tests/StorageModuleTest.cpp
|
|
src/modules/core/StorageModule.cpp
|
|
src/modules/core/StorageModule.h
|
|
)
|
|
target_link_libraries(StorageModuleTest PRIVATE
|
|
GroveEngine::impl
|
|
spdlog::spdlog
|
|
)
|
|
target_include_directories(StorageModuleTest PRIVATE
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
|
)
|
|
|
|
add_custom_target(test_storage
|
|
COMMAND $<TARGET_FILE:StorageModuleTest>
|
|
DEPENDS StorageModuleTest
|
|
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
|
COMMENT "Running StorageModule tests"
|
|
)
|
|
|
|
# CombatModule independent test
|
|
add_executable(CombatModuleTest
|
|
tests/CombatModuleTest.cpp
|
|
src/modules/core/CombatModule.cpp
|
|
src/modules/core/CombatModule.h
|
|
)
|
|
target_link_libraries(CombatModuleTest PRIVATE
|
|
GroveEngine::impl
|
|
spdlog::spdlog
|
|
)
|
|
target_include_directories(CombatModuleTest PRIVATE
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
|
)
|
|
|
|
add_custom_target(test_combat
|
|
COMMAND $<TARGET_FILE:CombatModuleTest>
|
|
DEPENDS CombatModuleTest
|
|
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
|
COMMENT "Running CombatModule tests"
|
|
)
|
|
|
|
# ExpeditionModule independent test
|
|
add_executable(ExpeditionModuleTest
|
|
tests/ExpeditionModuleTest.cpp
|
|
src/modules/mc_specific/ExpeditionModule.cpp
|
|
src/modules/mc_specific/ExpeditionModule.h
|
|
)
|
|
target_link_libraries(ExpeditionModuleTest PRIVATE
|
|
GroveEngine::impl
|
|
spdlog::spdlog
|
|
)
|
|
target_include_directories(ExpeditionModuleTest PRIVATE
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
|
)
|
|
|
|
add_custom_target(test_expedition
|
|
COMMAND $<TARGET_FILE:ExpeditionModuleTest>
|
|
DEPENDS ExpeditionModuleTest
|
|
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
|
COMMENT "Running ExpeditionModule tests"
|
|
)
|
|
|
|
# Run all tests
|
|
add_custom_target(test_all
|
|
COMMAND $<TARGET_FILE:GameModuleTest>
|
|
DEPENDS GameModuleTest ResourceModuleTest StorageModuleTest CombatModuleTest EventModuleTest TrainBuilderModuleTest ExpeditionModuleTest
|
|
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
|
COMMENT "Running all tests"
|
|
)
|