Kelsidavis-WoWee/CMakeLists.txt

435 lines
13 KiB
Text
Raw Normal View History

cmake_minimum_required(VERSION 3.15)
project(wowee VERSION 1.0.0 LANGUAGES CXX)
include(GNUInstallDirs)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# Output directories
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
# Options
option(BUILD_SHARED_LIBS "Build shared libraries" OFF)
option(WOWEE_BUILD_TESTS "Build tests" OFF)
# Find required packages
find_package(SDL2 REQUIRED)
find_package(OpenGL REQUIRED)
find_package(GLEW REQUIRED)
find_package(OpenSSL REQUIRED)
find_package(Threads REQUIRED)
find_package(ZLIB REQUIRED)
2026-02-05 15:34:29 -08:00
find_package(PkgConfig REQUIRED)
pkg_check_modules(FFMPEG REQUIRED libavformat libavcodec libswscale libavutil)
# Unicorn Engine (x86 emulator for cross-platform Warden module execution)
find_library(UNICORN_LIBRARY NAMES unicorn)
find_path(UNICORN_INCLUDE_DIR unicorn/unicorn.h)
if(NOT UNICORN_LIBRARY OR NOT UNICORN_INCLUDE_DIR)
message(WARNING "Unicorn Engine not found. Install with: sudo apt-get install libunicorn-dev")
message(WARNING "Warden emulation will be disabled")
set(HAVE_UNICORN FALSE)
else()
message(STATUS "Found Unicorn Engine: ${UNICORN_LIBRARY}")
set(HAVE_UNICORN TRUE)
endif()
# GLM (header-only math library)
find_package(glm QUIET)
if(NOT glm_FOUND)
message(STATUS "GLM not found, will use system includes or download")
endif()
# StormLib for MPQ extraction tool (not needed for main executable)
find_library(STORMLIB_LIBRARY NAMES StormLib stormlib storm)
find_path(STORMLIB_INCLUDE_DIR StormLib.h PATH_SUFFIXES StormLib)
# Include ImGui as a static library (we'll add the sources)
set(IMGUI_DIR ${CMAKE_CURRENT_SOURCE_DIR}/extern/imgui)
if(EXISTS ${IMGUI_DIR})
add_library(imgui STATIC
${IMGUI_DIR}/imgui.cpp
${IMGUI_DIR}/imgui_draw.cpp
${IMGUI_DIR}/imgui_tables.cpp
${IMGUI_DIR}/imgui_widgets.cpp
${IMGUI_DIR}/imgui_demo.cpp
${IMGUI_DIR}/backends/imgui_impl_sdl2.cpp
${IMGUI_DIR}/backends/imgui_impl_opengl3.cpp
)
target_include_directories(imgui PUBLIC
${IMGUI_DIR}
${IMGUI_DIR}/backends
)
target_link_libraries(imgui PUBLIC SDL2::SDL2 OpenGL::GL ${CMAKE_DL_LIBS})
target_compile_definitions(imgui PUBLIC IMGUI_IMPL_OPENGL_LOADER_GLEW)
else()
message(WARNING "ImGui not found in extern/imgui. Clone it with:")
message(WARNING " git clone https://github.com/ocornut/imgui.git extern/imgui")
endif()
# Source files
set(WOWEE_SOURCES
# Core
src/core/application.cpp
src/core/window.cpp
src/core/input.cpp
src/core/logger.cpp
src/core/memory_monitor.cpp
# Network
src/network/socket.cpp
src/network/packet.cpp
src/network/tcp_socket.cpp
src/network/world_socket.cpp
# Auth
src/auth/auth_handler.cpp
src/auth/auth_opcodes.cpp
src/auth/auth_packets.cpp
src/auth/srp.cpp
src/auth/big_num.cpp
src/auth/crypto.cpp
src/auth/rc4.cpp
# Game
src/game/expansion_profile.cpp
src/game/opcode_table.cpp
src/game/update_field_table.cpp
src/game/game_handler.cpp
src/game/warden_crypto.cpp
src/game/warden_module.cpp
src/game/warden_emulator.cpp
src/game/transport_manager.cpp
src/game/world.cpp
src/game/player.cpp
src/game/entity.cpp
src/game/opcodes.cpp
src/game/world_packets.cpp
src/game/packet_parsers_tbc.cpp
src/game/packet_parsers_classic.cpp
src/game/character.cpp
src/game/zone_manager.cpp
src/game/inventory.cpp
# Audio
src/audio/audio_engine.cpp
src/audio/music_manager.cpp
src/audio/footstep_manager.cpp
src/audio/activity_sound_manager.cpp
src/audio/mount_sound_manager.cpp
src/audio/npc_voice_manager.cpp
src/audio/ambient_sound_manager.cpp
src/audio/ui_sound_manager.cpp
src/audio/combat_sound_manager.cpp
Add comprehensive spell sound manager with 35+ magic sounds Implemented complete spell casting audio system with all magic schools: Magic schools supported: - Fire: Precast (Low/Medium/High), Cast, Fireball impacts - Frost: Precast (Low/Medium/High), Cast, Blizzard impacts - Holy: Precast (Low/Medium/High), Cast, Holy impacts (4 levels) - Nature: Precast (Low/Medium/High), Cast - Shadow: Precast (Low/Medium/High), Cast - Arcane: Precast, Arcane Missile impacts - Physical: Non-magical abilities Spell phases: - Precast: Channeling/preparation sounds (before cast) - Cast: Spell release sounds (when spell fires) - Impact: Spell hit sounds (when spell hits target) Power levels: - Low: Weak spells, low level abilities - Medium: Standard power spells - High: Powerful high-level spells Sound coverage (35+ sounds): - 16 precast sounds (Fire/Frost/Holy/Nature/Shadow × Low/Med/High + Arcane) - 5 cast sounds (one per school) - 16 impact sounds (Fireball ×3, Blizzard ×6, Holy ×4, Arcane Missile ×3) Technical details: - Loads 35+ sound files from Sound\Spells directory - Simple API: playPrecast(school, power), playCast(school), playImpact(school, power) - Convenience methods: playFireball(), playFrostbolt(), playHeal(), etc. - Random variation selection for impacts - Volume at 0.75 with global scale control - Ready for integration with spell casting system Usage examples: ```cpp // Full spell sequence spellSoundManager->playPrecast(MagicSchool::FIRE, SpellPower::HIGH); // ... cast time ... spellSoundManager->playCast(MagicSchool::FIRE); // ... projectile travel ... spellSoundManager->playImpact(MagicSchool::FIRE, SpellPower::HIGH); // Convenience methods spellSoundManager->playFireball(); spellSoundManager->playHeal(); ``` This adds essential magic feedback for spell casting gameplay!
2026-02-09 16:45:30 -08:00
src/audio/spell_sound_manager.cpp
src/audio/movement_sound_manager.cpp
# Pipeline (asset loaders)
src/pipeline/blp_loader.cpp
src/pipeline/dbc_loader.cpp
src/pipeline/asset_manager.cpp
src/pipeline/asset_manifest.cpp
src/pipeline/loose_file_reader.cpp
src/pipeline/m2_loader.cpp
src/pipeline/wmo_loader.cpp
src/pipeline/adt_loader.cpp
src/pipeline/dbc_layout.cpp
src/pipeline/hd_pack_manager.cpp
src/pipeline/terrain_mesh.cpp
# Rendering
src/rendering/renderer.cpp
src/rendering/shader.cpp
src/rendering/texture.cpp
src/rendering/mesh.cpp
src/rendering/camera.cpp
src/rendering/camera_controller.cpp
src/rendering/material.cpp
src/rendering/scene.cpp
src/rendering/terrain_renderer.cpp
src/rendering/terrain_manager.cpp
src/rendering/frustum.cpp
src/rendering/performance_hud.cpp
src/rendering/water_renderer.cpp
src/rendering/skybox.cpp
src/rendering/celestial.cpp
src/rendering/starfield.cpp
src/rendering/clouds.cpp
src/rendering/lens_flare.cpp
src/rendering/weather.cpp
src/rendering/lightning.cpp
src/rendering/lighting_manager.cpp
Implement WoW-accurate DBC-driven sky system with lore-faithful celestial bodies Add SkySystem coordinator that follows WoW's actual architecture where skyboxes are authoritative and procedural elements serve as fallbacks. Integrate lighting system across all renderers (terrain, WMO, M2, character) with unified parameters. Sky System: - SkySystem coordinator manages skybox, celestial bodies, stars, clouds, lens flare - Skybox is authoritative (baked stars from M2 models, procedural fallback only) - skyboxHasStars flag gates procedural star rendering (prevents double-star bug) Celestial Bodies (Lore-Accurate): - Two moons: White Lady (30-day cycle, pale white) + Blue Child (27-day cycle, pale blue) - Deterministic moon phases from server gameTime (not deltaTime toys) - Sun positioning driven by LightingManager directionalDir (DBC-sourced) - Camera-locked sky dome (translation ignored, rotation applied) Lighting Integration: - Apply LightingManager params to WMO, M2, character renderers - Unified lighting: directional light, diffuse color, ambient color, fog - Star occlusion by cloud density (70% weight) and fog density (30% weight) Documentation: - Add comprehensive SKY_SYSTEM.md technical guide - Update MEMORY.md with sky system architecture and anti-patterns - Update README.md with WoW-accurate descriptions Critical design decisions: - NO latitude-based star rotation (Azeroth not modeled as spherical planet) - NO always-on procedural stars (skybox authority prevents zone identity loss) - NO universal dual-moon setup (map-specific celestial configurations)
2026-02-10 14:36:17 -08:00
src/rendering/sky_system.cpp
src/rendering/character_renderer.cpp
src/rendering/character_preview.cpp
src/rendering/wmo_renderer.cpp
src/rendering/m2_renderer.cpp
src/rendering/quest_marker_renderer.cpp
src/rendering/minimap.cpp
src/rendering/world_map.cpp
src/rendering/swim_effects.cpp
src/rendering/mount_dust.cpp
src/rendering/loading_screen.cpp
2026-02-05 15:34:29 -08:00
src/rendering/video_player.cpp
# UI
src/ui/ui_manager.cpp
src/ui/auth_screen.cpp
src/ui/realm_screen.cpp
src/ui/character_create_screen.cpp
src/ui/character_screen.cpp
src/ui/game_screen.cpp
src/ui/inventory_screen.cpp
src/ui/quest_log_screen.cpp
src/ui/spellbook_screen.cpp
src/ui/talent_screen.cpp
# Main
src/main.cpp
)
set(WOWEE_HEADERS
include/core/application.hpp
include/core/window.hpp
include/core/input.hpp
include/core/logger.hpp
include/network/socket.hpp
include/network/packet.hpp
include/network/tcp_socket.hpp
include/network/world_socket.hpp
include/network/net_platform.hpp
include/platform/process.hpp
include/auth/auth_handler.hpp
include/auth/auth_opcodes.hpp
include/auth/auth_packets.hpp
include/auth/srp.hpp
include/auth/big_num.hpp
include/auth/crypto.hpp
include/game/game_handler.hpp
include/game/world.hpp
include/game/player.hpp
include/game/entity.hpp
include/game/opcodes.hpp
include/game/zone_manager.hpp
include/game/inventory.hpp
include/game/spell_defines.hpp
include/game/group_defines.hpp
include/game/world_packets.hpp
include/game/character.hpp
include/audio/audio_engine.hpp
include/audio/music_manager.hpp
include/audio/footstep_manager.hpp
include/audio/activity_sound_manager.hpp
include/audio/mount_sound_manager.hpp
include/audio/npc_voice_manager.hpp
include/audio/ambient_sound_manager.hpp
include/audio/ui_sound_manager.hpp
include/audio/combat_sound_manager.hpp
include/audio/spell_sound_manager.hpp
include/audio/movement_sound_manager.hpp
include/pipeline/blp_loader.hpp
include/pipeline/asset_manifest.hpp
include/pipeline/loose_file_reader.hpp
include/pipeline/m2_loader.hpp
include/pipeline/wmo_loader.hpp
include/pipeline/adt_loader.hpp
include/pipeline/dbc_loader.hpp
include/pipeline/terrain_mesh.hpp
include/rendering/renderer.hpp
include/rendering/shader.hpp
include/rendering/texture.hpp
include/rendering/mesh.hpp
include/rendering/camera.hpp
include/rendering/camera_controller.hpp
include/rendering/material.hpp
include/rendering/scene.hpp
include/rendering/terrain_renderer.hpp
include/rendering/terrain_manager.hpp
include/rendering/frustum.hpp
include/rendering/performance_hud.hpp
include/rendering/water_renderer.hpp
include/rendering/skybox.hpp
include/rendering/celestial.hpp
include/rendering/starfield.hpp
include/rendering/clouds.hpp
include/rendering/lens_flare.hpp
include/rendering/weather.hpp
include/rendering/lightning.hpp
include/rendering/swim_effects.hpp
include/rendering/world_map.hpp
include/rendering/character_renderer.hpp
include/rendering/character_preview.hpp
include/rendering/wmo_renderer.hpp
include/rendering/loading_screen.hpp
2026-02-05 15:34:29 -08:00
include/rendering/video_player.hpp
include/ui/ui_manager.hpp
include/ui/auth_screen.hpp
include/ui/realm_screen.hpp
include/ui/character_create_screen.hpp
include/ui/character_screen.hpp
include/ui/game_screen.hpp
include/ui/inventory_screen.hpp
include/ui/spellbook_screen.hpp
include/ui/talent_screen.hpp
)
set(WOWEE_PLATFORM_SOURCES)
if(WIN32)
list(APPEND WOWEE_PLATFORM_SOURCES resources/wowee.rc)
endif()
# Create executable
add_executable(wowee ${WOWEE_SOURCES} ${WOWEE_HEADERS} ${WOWEE_PLATFORM_SOURCES})
# Include directories
target_include_directories(wowee PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/include
${CMAKE_CURRENT_SOURCE_DIR}/src
${CMAKE_CURRENT_SOURCE_DIR}/extern
2026-02-05 15:34:29 -08:00
${FFMPEG_INCLUDE_DIRS}
)
# Link libraries
target_link_libraries(wowee PRIVATE
SDL2::SDL2
OpenGL::GL
GLEW::GLEW
OpenSSL::SSL
OpenSSL::Crypto
Threads::Threads
ZLIB::ZLIB
${CMAKE_DL_LIBS}
)
2026-02-05 15:34:29 -08:00
target_link_libraries(wowee PRIVATE ${FFMPEG_LIBRARIES})
if (FFMPEG_LIBRARY_DIRS)
target_link_directories(wowee PRIVATE ${FFMPEG_LIBRARY_DIRS})
endif()
# Platform-specific libraries
if(UNIX AND NOT APPLE)
target_link_libraries(wowee PRIVATE X11)
endif()
if(WIN32)
target_link_libraries(wowee PRIVATE ws2_32)
# SDL2main provides WinMain entry point on Windows
if(TARGET SDL2::SDL2main)
target_link_libraries(wowee PRIVATE SDL2::SDL2main)
endif()
endif()
# Link ImGui if available
if(TARGET imgui)
target_link_libraries(wowee PRIVATE imgui)
endif()
# Link Unicorn if available
if(HAVE_UNICORN)
target_link_libraries(wowee PRIVATE ${UNICORN_LIBRARY})
target_include_directories(wowee PRIVATE ${UNICORN_INCLUDE_DIR})
target_compile_definitions(wowee PRIVATE HAVE_UNICORN)
endif()
# Link GLM if found
if(TARGET glm::glm)
target_link_libraries(wowee PRIVATE glm::glm)
elseif(glm_FOUND)
target_include_directories(wowee PRIVATE ${GLM_INCLUDE_DIRS})
endif()
# Compiler warnings
if(MSVC)
target_compile_options(wowee PRIVATE /W4)
else()
target_compile_options(wowee PRIVATE -Wall -Wextra -Wpedantic)
endif()
# Copy assets to build directory
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/assets
DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
# Install targets
install(TARGETS wowee
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
)
# Linux desktop integration (launcher + icon)
if(UNIX AND NOT APPLE)
set(WOWEE_LINUX_ICON_PATH "${CMAKE_INSTALL_FULL_DATAROOTDIR}/icons/hicolor/256x256/apps/wowee.png")
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/resources/wowee.desktop.in
${CMAKE_CURRENT_BINARY_DIR}/wowee.desktop
@ONLY
)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/wowee.desktop
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications)
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/assets/Wowee.png
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/256x256/apps
RENAME wowee.png)
endif()
# ---- Tool: asset_extract (MPQ → loose files) ----
if(STORMLIB_LIBRARY AND STORMLIB_INCLUDE_DIR)
add_executable(asset_extract
tools/asset_extract/main.cpp
tools/asset_extract/extractor.cpp
tools/asset_extract/path_mapper.cpp
tools/asset_extract/manifest_writer.cpp
)
target_include_directories(asset_extract PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/include
${CMAKE_CURRENT_SOURCE_DIR}/tools/asset_extract
${STORMLIB_INCLUDE_DIR}
)
target_link_libraries(asset_extract PRIVATE
${STORMLIB_LIBRARY}
ZLIB::ZLIB
Threads::Threads
)
set_target_properties(asset_extract PROPERTIES
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
)
message(STATUS " asset_extract tool: ENABLED")
else()
message(STATUS " asset_extract tool: DISABLED (requires StormLib)")
endif()
# ---- Tool: blp_convert (BLP ↔ PNG) ----
add_executable(blp_convert
tools/blp_convert/main.cpp
src/pipeline/blp_loader.cpp
src/core/logger.cpp
)
target_include_directories(blp_convert PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/include
${CMAKE_CURRENT_SOURCE_DIR}/extern
)
target_link_libraries(blp_convert PRIVATE Threads::Threads)
set_target_properties(blp_convert PROPERTIES
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
)
# Print configuration summary
message(STATUS "")
message(STATUS "Wowee Configuration:")
message(STATUS " C++ Standard: ${CMAKE_CXX_STANDARD}")
message(STATUS " Build Type: ${CMAKE_BUILD_TYPE}")
message(STATUS " SDL2: ${SDL2_VERSION}")
message(STATUS " OpenSSL: ${OPENSSL_VERSION}")
message(STATUS " ImGui: ${IMGUI_DIR}")
message(STATUS "")