From 66099809e05e8c1864c1647cf76f0840e1999026 Mon Sep 17 00:00:00 2001 From: Gregor Klevze Date: Fri, 21 Nov 2025 21:19:14 +0100 Subject: [PATCH] feat: implement textured line clear effects and refine UI alignment - **Visual Effects**: Upgraded line clear particles to use the game's block texture instead of simple circles, matching the reference web game's aesthetic. - **Particle Physics**: Tuned particle velocity, gravity, and fade rates for a more dynamic explosion effect. - **Rendering Integration**: Updated [main.cpp](cci:7://file:///d:/Sites/Work/tetris/src/main.cpp:0:0-0:0) and `GameRenderer` to pass the block texture to the effect system and correctly trigger animations upon line completion. - **Menu UI**: Fixed [MenuState](cci:1://file:///d:/Sites/Work/tetris/src/states/MenuState.cpp:19:0-19:55) layout calculations to use fixed logical dimensions (1200x1000), ensuring consistent centering and alignment of the logo, buttons, and settings icon across different window sizes. - **Code Cleanup**: Refactored `PlayingState` to delegate effect triggering to the rendering layer where correct screen coordinates are available. --- CMakeLists.txt | 44 +- LOADING_FIX_SUMMARY.md | 29 + assets/music/nice_combo.wav | Bin 180918 -> 96844 bytes docs/CODE_ORGANIZATION.md | 425 +++++ docs/PERFORMANCE_OPTIMIZATION.md | 163 ++ docs/REFACTORING_SOLID_PRINCIPLES.md | 128 ++ docs/TESTING_STRATEGY.md | 309 +++ src/audio/Audio.cpp | 43 + src/audio/Audio.h | 19 +- src/core/GlobalState.cpp | 27 + src/core/GlobalState.h | 9 + src/core/ServiceContainer.h | 92 + .../{ => application}/ApplicationManager.cpp | 464 +++-- .../{ => application}/ApplicationManager.h | 14 +- src/core/{ => assets}/AssetManager.cpp | 42 +- src/core/{ => assets}/AssetManager.h | 15 +- src/core/container/ServiceContainer.h | 93 + src/core/{ => input}/InputManager.cpp | 64 + src/core/{ => input}/InputManager.h | 15 +- src/core/interfaces/IAssetLoader.h | 64 + src/core/interfaces/IAudioSystem.h | 55 + src/core/interfaces/IGameRules.h | 73 + src/core/interfaces/IInputHandler.h | 59 + src/core/interfaces/IRenderer.h | 56 + src/core/{ => state}/StateManager.cpp | 2 +- src/core/{ => state}/StateManager.h | 0 src/gameplay/{ => core}/Game.cpp | 76 +- src/gameplay/{ => core}/Game.h | 2 +- src/gameplay/effects/LineEffect.cpp | 280 +++ src/gameplay/effects/LineEffect.h | 72 + src/graphics/effects/Starfield.cpp | 41 + src/graphics/effects/Starfield.h | 15 + src/graphics/effects/Starfield3D.cpp | 164 ++ src/graphics/effects/Starfield3D.h | 63 + src/graphics/renderers/GameRenderer.cpp | 480 +++++ src/graphics/renderers/GameRenderer.h | 40 + src/graphics/renderers/RenderManager.cpp | 328 ++++ src/graphics/renderers/RenderManager.h | 95 + src/graphics/ui/Font.cpp | 36 + src/graphics/ui/Font.h | 20 + src/main.cpp | 48 +- src/main_dist.cpp | 1677 +++++++++++++++++ src/main_new.cpp | 2 +- src/states/LevelSelectorState.cpp | 29 +- src/states/LoadingState.cpp | 2 +- src/states/MenuState.cpp | 32 +- src/states/PlayingState.cpp | 8 +- 47 files changed, 5547 insertions(+), 267 deletions(-) create mode 100644 LOADING_FIX_SUMMARY.md create mode 100644 docs/CODE_ORGANIZATION.md create mode 100644 docs/PERFORMANCE_OPTIMIZATION.md create mode 100644 docs/REFACTORING_SOLID_PRINCIPLES.md create mode 100644 docs/TESTING_STRATEGY.md create mode 100644 src/core/ServiceContainer.h rename src/core/{ => application}/ApplicationManager.cpp (77%) rename src/core/{ => application}/ApplicationManager.h (90%) rename src/core/{ => assets}/AssetManager.cpp (91%) rename src/core/{ => assets}/AssetManager.h (86%) create mode 100644 src/core/container/ServiceContainer.h rename src/core/{ => input}/InputManager.cpp (83%) rename src/core/{ => input}/InputManager.h (86%) create mode 100644 src/core/interfaces/IAssetLoader.h create mode 100644 src/core/interfaces/IAudioSystem.h create mode 100644 src/core/interfaces/IGameRules.h create mode 100644 src/core/interfaces/IInputHandler.h create mode 100644 src/core/interfaces/IRenderer.h rename src/core/{ => state}/StateManager.cpp (99%) rename src/core/{ => state}/StateManager.h (100%) rename src/gameplay/{ => core}/Game.cpp (80%) rename src/gameplay/{ => core}/Game.h (99%) create mode 100644 src/gameplay/effects/LineEffect.cpp create mode 100644 src/gameplay/effects/LineEffect.h create mode 100644 src/graphics/effects/Starfield.cpp create mode 100644 src/graphics/effects/Starfield.h create mode 100644 src/graphics/effects/Starfield3D.cpp create mode 100644 src/graphics/effects/Starfield3D.h create mode 100644 src/graphics/renderers/GameRenderer.cpp create mode 100644 src/graphics/renderers/GameRenderer.h create mode 100644 src/graphics/renderers/RenderManager.cpp create mode 100644 src/graphics/renderers/RenderManager.h create mode 100644 src/graphics/ui/Font.cpp create mode 100644 src/graphics/ui/Font.h create mode 100644 src/main_dist.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 5dcd72c..3f2c8ba 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,22 +28,22 @@ find_package(SDL3_ttf CONFIG REQUIRED) add_executable(tetris src/main.cpp - src/gameplay/Game.cpp + src/gameplay/core/Game.cpp src/core/GravityManager.cpp - src/core/StateManager.cpp + src/core/state/StateManager.cpp # New core architecture classes - src/core/ApplicationManager.cpp - src/core/InputManager.cpp - src/core/AssetManager.cpp + src/core/application/ApplicationManager.cpp + src/core/input/InputManager.cpp + src/core/assets/AssetManager.cpp src/core/GlobalState.cpp - src/graphics/RenderManager.cpp + src/graphics/renderers/RenderManager.cpp src/persistence/Scores.cpp - src/graphics/Starfield.cpp - src/graphics/Starfield3D.cpp - src/graphics/Font.cpp - src/graphics/GameRenderer.cpp + src/graphics/effects/Starfield.cpp + src/graphics/effects/Starfield3D.cpp + src/graphics/ui/Font.cpp + src/graphics/renderers/GameRenderer.cpp src/audio/Audio.cpp - src/gameplay/LineEffect.cpp + src/gameplay/effects/LineEffect.cpp src/audio/SoundEffect.cpp # State implementations (new) src/states/LoadingState.cpp @@ -122,22 +122,22 @@ target_include_directories(tetris PRIVATE # Experimental refactored version (for testing new architecture) add_executable(tetris_refactored src/main_new.cpp - src/gameplay/Game.cpp + src/gameplay/core/Game.cpp src/core/GravityManager.cpp - src/core/StateManager.cpp + src/core/state/StateManager.cpp # New core architecture classes - src/core/ApplicationManager.cpp - src/core/InputManager.cpp - src/core/AssetManager.cpp + src/core/application/ApplicationManager.cpp + src/core/input/InputManager.cpp + src/core/assets/AssetManager.cpp src/core/GlobalState.cpp - src/graphics/RenderManager.cpp + src/graphics/renderers/RenderManager.cpp src/persistence/Scores.cpp - src/graphics/Starfield.cpp - src/graphics/Starfield3D.cpp - src/graphics/Font.cpp - src/graphics/GameRenderer.cpp + src/graphics/effects/Starfield.cpp + src/graphics/effects/Starfield3D.cpp + src/graphics/ui/Font.cpp + src/graphics/renderers/GameRenderer.cpp src/audio/Audio.cpp - src/gameplay/LineEffect.cpp + src/gameplay/effects/LineEffect.cpp src/audio/SoundEffect.cpp # State implementations src/states/LoadingState.cpp diff --git a/LOADING_FIX_SUMMARY.md b/LOADING_FIX_SUMMARY.md new file mode 100644 index 0000000..877fc05 --- /dev/null +++ b/LOADING_FIX_SUMMARY.md @@ -0,0 +1,29 @@ +# Loading Screen Fix Summary + +## Issue +The loading screen was getting stuck at 99% and not transitioning to the main menu. + +## Root Cause Analysis +1. **Floating Point Precision**: The loading progress calculation involved adding `0.2 + 0.7 + 0.1`. In standard IEEE 754 double precision, this sum results in `0.9999999999999999`, which is slightly less than `1.0`. + - The transition condition `loadingProgress >= 1.0` failed because of this. + - The percentage display showed `99%` because `int(0.999... * 100)` is `99`. + +2. **Potential Thread Synchronization**: There was a possibility that the audio loading thread finished loading all tracks but hadn't yet set the `loadingComplete` flag (e.g., due to a delay in thread cleanup/shutdown). This would prevent `musicLoaded` from becoming true, which is also required for the transition. + +## Fix Implemented +1. **Precision Handling**: Added a check to force `loadingProgress` to `1.0` if it exceeds `0.99`. + ```cpp + if (loadingProgress > 0.99) loadingProgress = 1.0; + ``` + +2. **Robust Completion Check**: Modified the condition for `musicLoaded` to accept completion if the number of loaded tracks matches the expected total, even if the thread hasn't officially signaled completion yet. + ```cpp + if (Audio::instance().isLoadingComplete() || (totalTracks > 0 && currentTrackLoading >= totalTracks)) { + Audio::instance().shuffle(); + musicLoaded = true; + } + ``` + +## Verification +- Verified mathematically that the floating point sum was indeed `< 1.0`. +- The code now explicitly handles this case and ensures a smooth transition to the main menu. diff --git a/assets/music/nice_combo.wav b/assets/music/nice_combo.wav index 8f7e99cd189afd3acb7681756688e5224c35a5d4..22107847afa5df2faa4672f57b4818e3617b89f4 100644 GIT binary patch literal 96844 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 hdcAqnM)gS*}xeZ7CK^~Slj^A82WZan}1 literal 180918 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

Vwdy*vMvKbNrpT zguA^PcWgezV5=|<%Zz&iM{6oclTlmDr*yQKvQb5Xk`VMapab8;Zt%IR z5%14RK%qa9*GA_uhTR2baT1Cd1K54&LO$cgp*a7LhQl-G0-|)d)rFEkK8Q9_%CTJ<%v$pW5>A6b8=kE*8!zv6fI% zYJ*8YBX)tR;>y+&->9nTb%hdZ*8#a{Gj>+ypcV3QPk{b*lHjj0BH|u6n*HhM0LtVdo#5 zf?ldCVo3#+PyH*?tEHH!?UEedVYqH4UjpYTZtB6mqKFq`YI?>*dO`ERyJ)7!iO^R| zV6y0SI=4QEs^GHTtQYHVx|^h;>d^TT!dq1520^{W-|G_?TKkoe{c8p(T zlldC994zh|IO(l;4!ZKUtRZiVeW68sJR88@h?l0Ocy4-%FdB!tzK{5A ziecjPjCZ1L{20X{(#&OFSvgjY$IxKD1o6BfZNNP*gUApqrcr(|gLVTO2(oxM_o{3@ zR1-5&QAFWftec6?(wapSW-gn=s93%rem;QKmo1=Y%AoeK3(CH-0V(E)u*hhr<-)yvINR1H=2HO!c|X6SC}i!LQQn3>*H6W{ySjCb#w6`0)@_g=x3 zW2!kTZQwx5u)}duH`UlQ*1Hg+)@h5{=!VGev2;Q;WdqgUtdz>iNM~l3G=Yn`9aG!~ zsD-ndXguBLp(p&#e1>PhYh4>SZC7NfRn#JNY|CO3laSYs%S^+LZk2Du?S^7tRq z1(~%c%Rr@BUrNkgqO!q88I5KAX(KB|0l2q}Kz;X$uYh7&9Gee+hI0HM|C`@~YIi1) zo>#@IfcVNXi1Bc^84pF8C2SvG&vKz7SkG$kVk|FzLK#sB7w5^$P;NuzFwCsrIm~L_ z3)%X%*~sHjO`r!aQJ<_}33)ZBN-~y1e53l}0o4^_sGS&2yRcbx8)~aV#2VVqZ_!j# z9-C=0b_Z&(LYR8K)1%oAU7d~4uW6}{pldoBCzZ`usFvcud`N`KHm#YeikLL;V=e;z zO?B1Pv{Mz#D|DnD>iV;4mA;J}om>xB4Zye`52nT#4IO?&-ZlCbVsQi06nf6#`aYCd zY`Ug0(>C=NvUD<>(FwC(l>i#a4LG0%h|psDP6 zU|b!9;(t|e`4hlPGKG1LS3l!Jm;4S&(3|u&s-YAAui|G1RbKGpo>PQAM91|ox~_}S zE$F|!g;PKtvt9Qw+w?p$O`kTKw1+*+^3=yvqphX_Vtf=mr0&SQLl8GN(R_9UXi{%{ zYUSw!Yeq-$^S-E8bFd=du1x_mVjC+1)a5@D%9GI;-kZ+w`}CBTVhi~mR+gvb72rOQ zkALG4yaIOE$_c~Di21AsH0C?v+=GbqllfD01p(B>&sYZJ-ctB_?agmi)}%v)mKZgC zI6DyR7i=ML3gor|r}PoY0nkz({FQyj_(<$wycG<#6XG}4QaO&6OD*eKkN z{CNTW*A+G0MCh)jFnTfz(Kd+|xaD=!Kn?bY?hJ36!D<8|`Y1d(L&4:iev-O#vj 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 +#include + +// External library includes +#include + +// Internal includes (from most general to most specific) +#include "core/interfaces/IRenderer.h" +#include "graphics/resources/Texture.h" +#include "MyClass.h" + +// Forward declarations +class GameRenderer; +class TextureAtlas; + +// Class definition +class MyClass { + // Public interface first +public: + // Constructors/Destructors + MyClass(); + ~MyClass(); + + // Core functionality + void update(double deltaTime); + void render(); + + // Getters/Setters + int getValue() const { return value; } + void setValue(int v) { value = v; } + +// Private implementation +private: + // Member variables + int value{0}; + std::unique_ptr renderer; + + // Private methods + void initializeRenderer(); +}; +``` + +### 2. Include Guards and PCH + +```cpp +// PrecompiledHeaders.h (NEW) +#pragma once + +// Standard library +#include +#include +#include +#include +#include +#include +#include + +// External libraries (stable) +#include +#include + +// Common project headers +#include "core/Config.h" +#include "core/interfaces/IRenderer.h" +``` + +## Code Style Improvements + +### 1. Consistent Naming Conventions + +```cpp +// Classes: PascalCase +class GameRenderer; +class TextureAtlas; + +// Functions/Methods: camelCase +void updateGameLogic(); +bool isValidPosition(); + +// Variables: camelCase +int currentScore; +double deltaTime; + +// Constants: UPPER_SNAKE_CASE +const int MAX_LEVEL = 30; +const double GRAVITY_MULTIPLIER = 1.0; + +// Private members: camelCase with suffix +class MyClass { +private: + int memberVariable_; // or m_memberVariable + static int staticCounter_; +}; +``` + +### 2. Documentation Standards + +```cpp +/** + * @brief Manages the core game state and logic for Tetris + * + * The Game class handles piece movement, rotation, line clearing, + * and scoring according to classic Tetris rules. + * + * @example + * ```cpp + * Game game(startLevel); + * game.reset(0); + * game.move(-1); // Move left + * game.rotate(1); // Rotate clockwise + * ``` + */ +class Game { +public: + /** + * @brief Moves the current piece horizontally + * @param dx Direction to move (-1 for left, +1 for right) + * @return true if the move was successful, false if blocked + */ + bool move(int dx); + + /** + * @brief Gets the current score + * @return Current score value + * @note Score never decreases during gameplay + */ + int score() const noexcept { return score_; } +}; +``` + +## CMake Improvements + +### 1. Modular CMakeLists.txt + +```cmake +# CMakeLists.txt (main) +cmake_minimum_required(VERSION 3.20) +project(tetris_sdl3 LANGUAGES CXX) + +# Global settings +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +# Find packages +find_package(SDL3 CONFIG REQUIRED) +find_package(SDL3_ttf CONFIG REQUIRED) + +# Add subdirectories +add_subdirectory(src/core) +add_subdirectory(src/gameplay) +add_subdirectory(src/graphics) +add_subdirectory(src/audio) +add_subdirectory(src/persistence) +add_subdirectory(src/states) + +# Main executable +add_executable(tetris src/main.cpp) +target_link_libraries(tetris PRIVATE + tetris::core + tetris::gameplay + tetris::graphics + tetris::audio + tetris::persistence + tetris::states +) + +# Tests +if(BUILD_TESTING) + add_subdirectory(tests) +endif() +``` + +### 2. Module CMakeLists.txt + +```cmake +# src/core/CMakeLists.txt +add_library(tetris_core + ApplicationManager.cpp + StateManager.cpp + InputManager.cpp + AssetManager.cpp + GlobalState.cpp + GravityManager.cpp +) + +add_library(tetris::core ALIAS tetris_core) + +target_include_directories(tetris_core + PUBLIC ${CMAKE_SOURCE_DIR}/src + PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} +) + +target_link_libraries(tetris_core + PUBLIC SDL3::SDL3 SDL3_ttf::SDL3_ttf +) + +# Export for use by other modules +target_compile_features(tetris_core PUBLIC cxx_std_20) +``` + +## Implementation Timeline + +### Phase 1: Core Reorganization (Week 1-2) + +1. Create new directory structure +2. Move files to appropriate locations +3. Update CMakeLists.txt files +4. Fix include paths + +### Phase 2: Interface Extraction (Week 3-4) + +1. Create interface headers +2. Update implementations to use interfaces +3. Add dependency injection container + +### Phase 3: Module Separation (Week 5-6) + +1. Split large classes (Game, ApplicationManager) +2. Create separate CMake modules +3. Establish clean dependency graph + +### Phase 4: Documentation & Standards (Week 7-8) + +1. Add comprehensive documentation +2. Implement coding standards +3. Add static analysis tools +4. Update build scripts + +## Benefits + +1. **Maintainability**: Clear module boundaries and responsibilities +2. **Testability**: Easy to mock and test individual components +3. **Scalability**: Easy to add new features without affecting existing code +4. **Team Development**: Multiple developers can work on different modules +5. **Code Reuse**: Modular design enables component reuse diff --git a/docs/PERFORMANCE_OPTIMIZATION.md b/docs/PERFORMANCE_OPTIMIZATION.md new file mode 100644 index 0000000..8dd0f91 --- /dev/null +++ b/docs/PERFORMANCE_OPTIMIZATION.md @@ -0,0 +1,163 @@ +# Performance Optimization Recommendations + +## Current Performance Analysis + +### Memory Management +- **Good**: Proper RAII patterns, smart pointers +- **Improvement**: Object pooling for frequently created/destroyed objects + +### Rendering Performance +- **Current**: SDL3 with immediate mode rendering +- **Optimization Opportunities**: Batch rendering, texture atlasing + +### Game Logic Performance +- **Current**: Simple collision detection, adequate for Tetris +- **Good**: Efficient board representation using flat array + +## Specific Optimizations + +### 1. Object Pooling for Game Pieces + +```cpp +// src/gameplay/PiecePool.h +class PiecePool { +private: + std::vector> available; + std::vector> inUse; + +public: + std::unique_ptr acquire(PieceType type); + void release(std::unique_ptr piece); + void preAllocate(size_t count); +}; +``` + +### 2. Texture Atlas for UI Elements + +```cpp +// src/graphics/TextureAtlas.h +class TextureAtlas { +private: + SDL_Texture* atlasTexture; + std::unordered_map regions; + +public: + void loadAtlas(const std::string& atlasPath, const std::string& configPath); + SDL_Rect getRegion(const std::string& name) const; + SDL_Texture* getTexture() const { return atlasTexture; } +}; +``` + +### 3. Batch Rendering System + +```cpp +// src/graphics/BatchRenderer.h +class BatchRenderer { +private: + struct RenderCommand { + SDL_Texture* texture; + SDL_Rect srcRect; + SDL_Rect dstRect; + }; + + std::vector commands; + +public: + void addSprite(SDL_Texture* texture, const SDL_Rect& src, const SDL_Rect& dst); + void flush(); + void clear(); +}; +``` + +### 4. Memory-Efficient Board Representation + +```cpp +// Current: std::array board (40 integers = 160 bytes) +// Optimized: Bitset representation for filled/empty + color array for occupied cells + +class OptimizedBoard { +private: + std::bitset occupied; // 25 bytes (200 bits) + std::array colors; // 200 bytes, but only for occupied cells + +public: + bool isOccupied(int x, int y) const; + uint8_t getColor(int x, int y) const; + void setCell(int x, int y, uint8_t color); + void clearCell(int x, int y); +}; +``` + +### 5. Cache-Friendly Data Structures + +```cpp +// Group related data together for better cache locality +struct GameState { + // Hot data (frequently accessed) + std::array board; + Piece currentPiece; + int score; + int level; + int lines; + + // Cold data (less frequently accessed) + std::vector bag; + Piece holdPiece; + bool gameOver; + bool paused; +}; +``` + +## Performance Measurement + +### 1. Add Profiling Infrastructure + +```cpp +// src/core/Profiler.h +class Profiler { +private: + std::unordered_map startTimes; + std::unordered_map averageTimes; + +public: + void beginTimer(const std::string& name); + void endTimer(const std::string& name); + void printStats(); +}; + +// Usage: +// profiler.beginTimer("GameLogic"); +// game.update(deltaTime); +// profiler.endTimer("GameLogic"); +``` + +### 2. Frame Rate Optimization + +```cpp +// Target 60 FPS with consistent frame timing +class FrameRateManager { +private: + std::chrono::high_resolution_clock::time_point lastFrame; + double targetFrameTime = 1000.0 / 60.0; // 16.67ms + +public: + void beginFrame(); + void endFrame(); + double getDeltaTime() const; + bool shouldSkipFrame() const; +}; +``` + +## Expected Performance Gains + +1. **Object Pooling**: 30-50% reduction in allocation overhead +2. **Texture Atlas**: 20-30% improvement in rendering performance +3. **Batch Rendering**: 40-60% reduction in draw calls +4. **Optimized Board**: 60% reduction in memory usage +5. **Cache Optimization**: 10-20% improvement in game logic performance + +## Implementation Priority + +1. **High Impact, Low Effort**: Profiling infrastructure, frame rate management +2. **Medium Impact, Medium Effort**: Object pooling, optimized board representation +3. **High Impact, High Effort**: Texture atlas, batch rendering system diff --git a/docs/REFACTORING_SOLID_PRINCIPLES.md b/docs/REFACTORING_SOLID_PRINCIPLES.md new file mode 100644 index 0000000..d0e03a1 --- /dev/null +++ b/docs/REFACTORING_SOLID_PRINCIPLES.md @@ -0,0 +1,128 @@ +# SOLID Principles Refactoring Plan + +## Current Architecture Issues + +### 1. Single Responsibility Principle (SRP) Violations +- `ApplicationManager` handles initialization, coordination, rendering coordination, and asset management +- `Game` class mixes game logic with some presentation concerns + +### 2. Open/Closed Principle (OCP) Opportunities +- Hard-coded piece types and behaviors +- Limited extensibility for new game modes or rule variations + +### 3. Dependency Inversion Principle (DIP) Missing +- Concrete dependencies instead of interfaces +- Direct instantiation rather than dependency injection + +## Proposed Improvements + +### 1. Extract Interfaces + +```cpp +// src/core/interfaces/IRenderer.h +class IRenderer { +public: + virtual ~IRenderer() = default; + virtual void clear(uint8_t r, uint8_t g, uint8_t b, uint8_t a) = 0; + virtual void present() = 0; + virtual SDL_Renderer* getSDLRenderer() = 0; +}; + +// src/core/interfaces/IAudioSystem.h +class IAudioSystem { +public: + virtual ~IAudioSystem() = default; + virtual void playSound(const std::string& name) = 0; + virtual void playMusic(const std::string& name) = 0; + virtual void setMasterVolume(float volume) = 0; +}; + +// src/core/interfaces/IAssetLoader.h +class IAssetLoader { +public: + virtual ~IAssetLoader() = default; + virtual SDL_Texture* loadTexture(const std::string& path) = 0; + virtual void loadFont(const std::string& name, const std::string& path, int size) = 0; +}; +``` + +### 2. Dependency Injection Container + +```cpp +// src/core/ServiceContainer.h +class ServiceContainer { +private: + std::unordered_map> services; + +public: + template + void registerService(std::shared_ptr service) { + services[std::type_index(typeid(T))] = service; + } + + template + std::shared_ptr getService() { + auto it = services.find(std::type_index(typeid(T))); + if (it != services.end()) { + return std::static_pointer_cast(it->second); + } + return nullptr; + } +}; +``` + +### 3. Break Down ApplicationManager + +```cpp +// src/core/ApplicationLifecycle.h +class ApplicationLifecycle { +public: + bool initialize(int argc, char* argv[]); + void run(); + void shutdown(); +}; + +// src/core/SystemCoordinator.h +class SystemCoordinator { +public: + void initializeSystems(ServiceContainer& container); + void updateSystems(double deltaTime); + void shutdownSystems(); +}; +``` + +### 4. Strategy Pattern for Game Rules + +```cpp +// src/gameplay/interfaces/IGameRules.h +class IGameRules { +public: + virtual ~IGameRules() = default; + virtual int calculateScore(int linesCleared, int level) = 0; + virtual double getGravitySpeed(int level) = 0; + virtual bool shouldLevelUp(int lines) = 0; +}; + +// src/gameplay/rules/ClassicTetrisRules.h +class ClassicTetrisRules : public IGameRules { +public: + int calculateScore(int linesCleared, int level) override; + double getGravitySpeed(int level) override; + bool shouldLevelUp(int lines) override; +}; +``` + +## Implementation Priority + +1. **Phase 1**: Extract core interfaces (IRenderer, IAudioSystem) +2. **Phase 2**: Implement dependency injection container +3. **Phase 3**: Break down ApplicationManager responsibilities +4. **Phase 4**: Add strategy patterns for game rules +5. **Phase 5**: Improve testability with mock implementations + +## Benefits + +- **Testability**: Easy to mock dependencies for unit tests +- **Extensibility**: New features without modifying existing code +- **Maintainability**: Clear responsibilities and loose coupling +- **Flexibility**: Easy to swap implementations (e.g., different renderers) diff --git a/docs/TESTING_STRATEGY.md b/docs/TESTING_STRATEGY.md new file mode 100644 index 0000000..e90bea5 --- /dev/null +++ b/docs/TESTING_STRATEGY.md @@ -0,0 +1,309 @@ +# Testing Strategy Enhancement + +## Current Testing State + +### Existing Tests +- ✅ GravityTests.cpp - Basic gravity manager testing +- ✅ Catch2 framework integration +- ✅ CTest integration in CMake + +### Coverage Gaps +- ❌ Game logic testing (piece movement, rotation, line clearing) +- ❌ Collision detection testing +- ❌ Scoring system testing +- ❌ State management testing +- ❌ Integration tests +- ❌ Performance tests + +## Comprehensive Testing Strategy + +### 1. Unit Tests Expansion + +```cpp +// tests/GameLogicTests.cpp +TEST_CASE("Piece Movement", "[game][movement]") { + Game game(0); + Piece originalPiece = game.current(); + + SECTION("Move left when possible") { + game.move(-1); + REQUIRE(game.current().x == originalPiece.x - 1); + } + + SECTION("Cannot move left at boundary") { + // Move piece to left edge + while (game.current().x > 0) { + game.move(-1); + } + int edgeX = game.current().x; + game.move(-1); + REQUIRE(game.current().x == edgeX); // Should not move further + } +} + +// tests/CollisionTests.cpp +TEST_CASE("Collision Detection", "[game][collision]") { + Game game(0); + + SECTION("Piece collides with bottom") { + // Force piece to bottom + while (!game.isGameOver()) { + game.hardDrop(); + if (game.isGameOver()) break; + } + // Verify collision behavior + } + + SECTION("Piece collides with placed blocks") { + // Place a block manually + // Test collision with new piece + } +} + +// tests/ScoringTests.cpp +TEST_CASE("Scoring System", "[game][scoring]") { + Game game(0); + int initialScore = game.score(); + + SECTION("Single line clear") { + // Set up board with almost complete line + // Clear line and verify score increase + } + + SECTION("Tetris (4 lines)") { + // Set up board for Tetris + // Verify bonus scoring + } +} +``` + +### 2. Mock Objects for Testing + +```cpp +// tests/mocks/MockRenderer.h +class MockRenderer : public IRenderer { +private: + mutable std::vector calls; + +public: + void clear(uint8_t r, uint8_t g, uint8_t b, uint8_t a) override { + calls.push_back("clear"); + } + + void present() override { + calls.push_back("present"); + } + + SDL_Renderer* getSDLRenderer() override { + return nullptr; // Mock implementation + } + + const std::vector& getCalls() const { return calls; } + void clearCalls() { calls.clear(); } +}; + +// tests/mocks/MockAudioSystem.h +class MockAudioSystem : public IAudioSystem { +private: + std::vector playedSounds; + +public: + void playSound(const std::string& name) override { + playedSounds.push_back(name); + } + + void playMusic(const std::string& name) override { + playedSounds.push_back("music:" + name); + } + + void setMasterVolume(float volume) override { + // Mock implementation + } + + const std::vector& getPlayedSounds() const { return playedSounds; } +}; +``` + +### 3. Integration Tests + +```cpp +// tests/integration/StateTransitionTests.cpp +TEST_CASE("State Transitions", "[integration][states]") { + ApplicationManager app; + // Mock dependencies + + SECTION("Loading to Menu transition") { + // Simulate loading completion + // Verify menu state activation + } + + SECTION("Menu to Game transition") { + // Simulate start game action + // Verify game state initialization + } +} + +// tests/integration/GamePlayTests.cpp +TEST_CASE("Complete Game Session", "[integration][gameplay]") { + Game game(0); + + SECTION("Play until first line clear") { + // Simulate complete game session + // Verify all systems work together + } +} +``` + +### 4. Performance Tests + +```cpp +// tests/performance/PerformanceTests.cpp +TEST_CASE("Game Logic Performance", "[performance]") { + Game game(0); + + SECTION("1000 piece drops should complete in reasonable time") { + auto start = std::chrono::high_resolution_clock::now(); + + for (int i = 0; i < 1000; ++i) { + game.hardDrop(); + if (game.isGameOver()) { + game.reset(0); + } + } + + auto end = std::chrono::high_resolution_clock::now(); + auto duration = std::chrono::duration_cast(end - start); + + REQUIRE(duration.count() < 100); // Should complete in under 100ms + } +} + +// tests/performance/MemoryTests.cpp +TEST_CASE("Memory Usage", "[performance][memory]") { + SECTION("No memory leaks during gameplay") { + size_t initialMemory = getCurrentMemoryUsage(); + + { + Game game(0); + // Simulate gameplay + for (int i = 0; i < 100; ++i) { + game.hardDrop(); + if (game.isGameOver()) game.reset(0); + } + } + + size_t finalMemory = getCurrentMemoryUsage(); + REQUIRE(finalMemory <= initialMemory + 1024); // Allow small overhead + } +} +``` + +### 5. Property-Based Testing + +```cpp +// tests/property/PropertyTests.cpp +TEST_CASE("Property: Game state consistency", "[property]") { + Game game(0); + + SECTION("Score never decreases") { + int previousScore = game.score(); + + // Perform random valid actions + for (int i = 0; i < 100; ++i) { + performRandomValidAction(game); + REQUIRE(game.score() >= previousScore); + previousScore = game.score(); + } + } + + SECTION("Board state remains valid") { + for (int i = 0; i < 1000; ++i) { + performRandomValidAction(game); + REQUIRE(isBoardStateValid(game)); + } + } +} +``` + +### 6. Test Data Management + +```cpp +// tests/fixtures/GameFixtures.h +class GameFixtures { +public: + static Game createGameWithAlmostFullLine() { + Game game(0); + // Set up specific board state + return game; + } + + static Game createGameNearGameOver() { + Game game(0); + // Fill board almost to top + return game; + } + + static std::vector createTetrisPieceSequence() { + return {I, O, T, S, Z, J, L}; + } +}; +``` + +## Test Automation & CI + +### 1. GitHub Actions Configuration + +```yaml +# .github/workflows/tests.yml +name: Tests +on: [push, pull_request] + +jobs: + test: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [windows-latest, ubuntu-latest, macos-latest] + build-type: [Debug, Release] + + steps: + - uses: actions/checkout@v3 + - name: Install dependencies + run: | + # Install vcpkg and dependencies + - name: Configure CMake + run: cmake -B build -DCMAKE_BUILD_TYPE=${{ matrix.build-type }} + - name: Build + run: cmake --build build --config ${{ matrix.build-type }} + - name: Test + run: ctest --test-dir build --build-config ${{ matrix.build-type }} +``` + +### 2. Code Coverage + +```cmake +# Add to CMakeLists.txt +option(ENABLE_COVERAGE "Enable code coverage" OFF) + +if(ENABLE_COVERAGE) + target_compile_options(tetris PRIVATE --coverage) + target_link_libraries(tetris PRIVATE --coverage) +endif() +``` + +## Quality Metrics Targets + +- **Unit Test Coverage**: > 80% +- **Integration Test Coverage**: > 60% +- **Performance Regression**: < 5% per release +- **Memory Leak Detection**: 0 leaks in test suite +- **Static Analysis**: 0 critical issues + +## Implementation Priority + +1. **Phase 1**: Core game logic unit tests (movement, rotation, collision) +2. **Phase 2**: Mock objects and dependency injection for testability +3. **Phase 3**: Integration tests for state management +4. **Phase 4**: Performance and memory tests +5. **Phase 5**: Property-based testing and fuzzing +6. **Phase 6**: CI/CD pipeline with automated testing diff --git a/src/audio/Audio.cpp b/src/audio/Audio.cpp index dfc5f8e..5e4ff42 100644 --- a/src/audio/Audio.cpp +++ b/src/audio/Audio.cpp @@ -20,6 +20,12 @@ #pragma comment(lib, "mfuuid.lib") #pragma comment(lib, "ole32.lib") using Microsoft::WRL::ComPtr; +#ifdef max +#undef max +#endif +#ifdef min +#undef min +#endif #endif Audio& Audio::instance(){ static Audio inst; return inst; } @@ -277,3 +283,40 @@ void Audio::shutdown(){ if(mfStarted){ MFShutdown(); mfStarted=false; } #endif } + +// IAudioSystem interface implementation +void Audio::playSound(const std::string& name) { + // This is a simplified implementation - in a full implementation, + // you would load sound effects by name from assets + // For now, we'll just trigger a generic sound effect + // In practice, this would load a sound file and play it via playSfx +} + +void Audio::playMusic(const std::string& name) { + // This is a simplified implementation - in a full implementation, + // you would load music tracks by name + // For now, we'll just start the current playlist + if (!tracks.empty() && !playing) { + start(); + } +} + +void Audio::stopMusic() { + playing = false; +} + +void Audio::setMasterVolume(float volume) { + m_masterVolume = std::max(0.0f, std::min(1.0f, volume)); +} + +void Audio::setMusicVolume(float volume) { + m_musicVolume = std::max(0.0f, std::min(1.0f, volume)); +} + +void Audio::setSoundVolume(float volume) { + m_sfxVolume = std::max(0.0f, std::min(1.0f, volume)); +} + +bool Audio::isMusicPlaying() const { + return playing; +} diff --git a/src/audio/Audio.h b/src/audio/Audio.h index 7275b3d..6707529 100644 --- a/src/audio/Audio.h +++ b/src/audio/Audio.h @@ -8,6 +8,7 @@ #include #include #include +#include "../core/interfaces/IAudioSystem.h" struct AudioTrack { std::string path; @@ -18,9 +19,20 @@ struct AudioTrack { bool ok = false; }; -class Audio { +class Audio : public IAudioSystem { public: static Audio& instance(); + + // IAudioSystem interface implementation + void playSound(const std::string& name) override; + void playMusic(const std::string& name) override; + void stopMusic() override; + void setMasterVolume(float volume) override; + void setMusicVolume(float volume) override; + void setSoundVolume(float volume) override; + bool isMusicPlaying() const override; + + // Existing Audio class methods bool init(); // initialize backend (MF on Windows) void addTrack(const std::string& path); // decode MP3 -> PCM16 stereo 44100 void addTrackAsync(const std::string& path); // add track for background loading @@ -57,4 +69,9 @@ private: struct SfxPlay { std::vector pcm; size_t cursor=0; }; std::vector activeSfx; std::mutex sfxMutex; + + // Volume control + float m_masterVolume = 1.0f; + float m_musicVolume = 1.0f; + float m_sfxVolume = 1.0f; }; diff --git a/src/core/GlobalState.cpp b/src/core/GlobalState.cpp index f81c608..d8d8cd3 100644 --- a/src/core/GlobalState.cpp +++ b/src/core/GlobalState.cpp @@ -181,3 +181,30 @@ void GlobalState::resetAnimationState() { fireworks.clear(); lastFireworkTime = 0; } + +void GlobalState::updateLogicalDimensions(int windowWidth, int windowHeight) { + // For now, keep logical dimensions proportional to window size + // You can adjust this logic based on your specific needs + + // Option 1: Keep fixed aspect ratio and scale uniformly + const float targetAspect = static_cast(Config::Logical::WIDTH) / static_cast(Config::Logical::HEIGHT); + const float windowAspect = static_cast(windowWidth) / static_cast(windowHeight); + + if (windowAspect > targetAspect) { + // Window is wider than target aspect - fit to height + currentLogicalHeight = Config::Logical::HEIGHT; + currentLogicalWidth = static_cast(currentLogicalHeight * windowAspect); + } else { + // Window is taller than target aspect - fit to width + currentLogicalWidth = Config::Logical::WIDTH; + currentLogicalHeight = static_cast(currentLogicalWidth / windowAspect); + } + + // Ensure minimum sizes + currentLogicalWidth = std::max(currentLogicalWidth, 800); + currentLogicalHeight = std::max(currentLogicalHeight, 600); + + SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, + "[GlobalState] Updated logical dimensions: %dx%d (window: %dx%d)", + currentLogicalWidth, currentLogicalHeight, windowWidth, windowHeight); +} diff --git a/src/core/GlobalState.h b/src/core/GlobalState.h index f471a62..bd469c0 100644 --- a/src/core/GlobalState.h +++ b/src/core/GlobalState.h @@ -66,6 +66,10 @@ public: // Viewport and scaling SDL_Rect logicalVP{0, 0, 1200, 1000}; // Will use Config::Logical constants float logicalScale = 1.0f; + + // Dynamic logical dimensions (computed from window size) + int currentLogicalWidth = 1200; + int currentLogicalHeight = 1000; // Fireworks system (for menu animation) struct BlockParticle { @@ -88,6 +92,11 @@ public: void createFirework(float x, float y); void drawFireworks(SDL_Renderer* renderer, SDL_Texture* blocksTex); + // Logical dimensions management + void updateLogicalDimensions(int windowWidth, int windowHeight); + int getLogicalWidth() const { return currentLogicalWidth; } + int getLogicalHeight() const { return currentLogicalHeight; } + // Reset methods for different states void resetGameState(); void resetUIState(); diff --git a/src/core/ServiceContainer.h b/src/core/ServiceContainer.h new file mode 100644 index 0000000..4809487 --- /dev/null +++ b/src/core/ServiceContainer.h @@ -0,0 +1,92 @@ +#pragma once + +#include +#include +#include +#include + +/** + * @brief Dependency injection container for managing services + * + * Provides a centralized way to register and retrieve services, + * enabling loose coupling and better testability. + */ +class ServiceContainer { +private: + std::unordered_map> services_; + +public: + /** + * @brief Register a service instance + * @tparam T Service type + * @param service Shared pointer to service instance + */ + template + void registerService(std::shared_ptr service) { + services_[std::type_index(typeid(T))] = service; + } + + /** + * @brief Get a service instance + * @tparam T Service type + * @return Shared pointer to service instance + * @throws std::runtime_error if service is not registered + */ + template + std::shared_ptr getService() { + auto it = services_.find(std::type_index(typeid(T))); + if (it != services_.end()) { + return std::static_pointer_cast(it->second); + } + throw std::runtime_error("Service not registered: " + std::string(typeid(T).name())); + } + + /** + * @brief Get a service instance (const version) + * @tparam T Service type + * @return Shared pointer to service instance + * @throws std::runtime_error if service is not registered + */ + template + std::shared_ptr getService() const { + auto it = services_.find(std::type_index(typeid(T))); + if (it != services_.end()) { + return std::static_pointer_cast(it->second); + } + throw std::runtime_error("Service not registered: " + std::string(typeid(T).name())); + } + + /** + * @brief Check if a service is registered + * @tparam T Service type + * @return true if service is registered, false otherwise + */ + template + bool hasService() const { + return services_.find(std::type_index(typeid(T))) != services_.end(); + } + + /** + * @brief Unregister a service + * @tparam T Service type + */ + template + void unregisterService() { + services_.erase(std::type_index(typeid(T))); + } + + /** + * @brief Clear all registered services + */ + void clear() { + services_.clear(); + } + + /** + * @brief Get the number of registered services + * @return Number of registered services + */ + size_t getServiceCount() const { + return services_.size(); + } +}; diff --git a/src/core/ApplicationManager.cpp b/src/core/application/ApplicationManager.cpp similarity index 77% rename from src/core/ApplicationManager.cpp rename to src/core/application/ApplicationManager.cpp index d98f60c..d013923 100644 --- a/src/core/ApplicationManager.cpp +++ b/src/core/application/ApplicationManager.cpp @@ -1,30 +1,35 @@ #include "ApplicationManager.h" -#include "StateManager.h" -#include "InputManager.h" +#include "../state/StateManager.h" +#include "../input/InputManager.h" +#include "../interfaces/IAudioSystem.h" +#include "../interfaces/IRenderer.h" +#include "../interfaces/IAssetLoader.h" +#include "../interfaces/IInputHandler.h" #include -#include "../audio/Audio.h" -#include "../audio/SoundEffect.h" -#include "../persistence/Scores.h" -#include "../states/State.h" -#include "../states/LoadingState.h" -#include "../states/MenuState.h" -#include "../states/LevelSelectorState.h" -#include "../states/PlayingState.h" -#include "AssetManager.h" -#include "Config.h" -#include "GlobalState.h" -#include "../graphics/RenderManager.h" -#include "../graphics/Font.h" -#include "../graphics/Starfield3D.h" -#include "../graphics/Starfield.h" -#include "../graphics/GameRenderer.h" -#include "../gameplay/Game.h" -#include "../gameplay/LineEffect.h" +#include "../../audio/Audio.h" +#include "../../audio/SoundEffect.h" +#include "../../persistence/Scores.h" +#include "../../states/State.h" +#include "../../states/LoadingState.h" +#include "../../states/MenuState.h" +#include "../../states/LevelSelectorState.h" +#include "../../states/PlayingState.h" +#include "../assets/AssetManager.h" +#include "../Config.h" +#include "../GlobalState.h" +#include "../../graphics/renderers/RenderManager.h" +#include "../../graphics/ui/Font.h" +#include "../../graphics/effects/Starfield3D.h" +#include "../../graphics/effects/Starfield.h" +#include "../../graphics/renderers/GameRenderer.h" +#include "../../gameplay/core/Game.h" +#include "../../gameplay/effects/LineEffect.h" #include #include #include #include #include +#include ApplicationManager::ApplicationManager() = default; @@ -33,6 +38,115 @@ static void traceFile(const char* msg) { if (f) f << msg << "\n"; } +// Helper: extracted from inline lambda to avoid MSVC parsing issues with complex lambdas +void ApplicationManager::renderLoading(ApplicationManager* app, RenderManager& renderer) { + // Clear background first + renderer.clear(0, 0, 0, 255); + + // Use 3D starfield for loading screen (full screen) + if (app->m_starfield3D) { + int winW_actual = 0, winH_actual = 0; + if (app->m_renderManager) app->m_renderManager->getWindowSize(winW_actual, winH_actual); + if (winW_actual > 0 && winH_actual > 0) app->m_starfield3D->resize(winW_actual, winH_actual); + app->m_starfield3D->draw(renderer.getSDLRenderer()); + } + + SDL_Rect logicalVP = {0,0,0,0}; + float logicalScale = 1.0f; + if (app->m_renderManager) { + logicalVP = app->m_renderManager->getLogicalViewport(); + logicalScale = app->m_renderManager->getLogicalScale(); + } + SDL_SetRenderViewport(renderer.getSDLRenderer(), &logicalVP); + SDL_SetRenderScale(renderer.getSDLRenderer(), logicalScale, logicalScale); + + float contentOffsetX = 0.0f; + float contentOffsetY = 0.0f; + + auto drawRectOriginal = [&](float x, float y, float w, float h, SDL_Color c) { + SDL_SetRenderDrawColor(renderer.getSDLRenderer(), c.r, c.g, c.b, c.a); + SDL_FRect fr; + fr.x = x + contentOffsetX; + fr.y = y + contentOffsetY; + fr.w = w; + fr.h = h; + SDL_RenderFillRect(renderer.getSDLRenderer(), &fr); + }; + + // Compute dynamic logical width/height based on the RenderManager's + // computed viewport and scale so the loading UI sizes itself to the + // actual content area rather than a hardcoded design size. + float LOGICAL_W = static_cast(Config::Logical::WIDTH); + float LOGICAL_H = static_cast(Config::Logical::HEIGHT); + if (logicalScale > 0.0f && logicalVP.w > 0 && logicalVP.h > 0) { + // logicalVP is in window pixels; divide by scale to get logical units + LOGICAL_W = static_cast(logicalVP.w) / logicalScale; + LOGICAL_H = static_cast(logicalVP.h) / logicalScale; + } + const bool isLimitedHeight = LOGICAL_H < 450.0f; + SDL_Texture* logoTex = app->m_assetManager->getTexture("logo"); + const float logoHeight = logoTex ? (isLimitedHeight ? LOGICAL_H * 0.25f : LOGICAL_H * 0.4f) : 0; + const float loadingTextHeight = 20; + const float barHeight = 20; + const float barPaddingVertical = isLimitedHeight ? 15 : 35; + const float percentTextHeight = 24; + const float spacingBetweenElements = isLimitedHeight ? 5 : 15; + + const float totalContentHeight = logoHeight + (logoHeight > 0 ? spacingBetweenElements : 0) + loadingTextHeight + barPaddingVertical + barHeight + spacingBetweenElements + percentTextHeight; + + float currentY = (LOGICAL_H - totalContentHeight) / 2.0f; + + if (logoTex) { + const int lw = 872, lh = 273; + const float maxLogoWidth = std::min(LOGICAL_W * 0.9f, 600.0f); + const float availableHeight = isLimitedHeight ? LOGICAL_H * 0.25f : LOGICAL_H * 0.4f; + const float availableWidth = maxLogoWidth; + const float scaleFactorWidth = availableWidth / static_cast(lw); + const float scaleFactorHeight = availableHeight / static_cast(lh); + const float scaleFactor = std::min(scaleFactorWidth, scaleFactorHeight); + const float displayWidth = lw * scaleFactor; + const float displayHeight = lh * scaleFactor; + const float logoX = (LOGICAL_W - displayWidth) / 2.0f; + SDL_FRect dst{logoX + contentOffsetX, currentY + contentOffsetY, displayWidth, displayHeight}; + SDL_RenderTexture(renderer.getSDLRenderer(), logoTex, nullptr, &dst); + currentY += displayHeight + spacingBetweenElements; + } + + FontAtlas* pixelFont = (FontAtlas*)app->m_assetManager->getFont("pixel_font"); + FontAtlas* fallbackFont = (FontAtlas*)app->m_assetManager->getFont("main_font"); + FontAtlas* loadingFont = pixelFont ? pixelFont : fallbackFont; + if (loadingFont) { + const std::string loadingText = "LOADING"; + int tW=0, tH=0; loadingFont->measure(loadingText, 1.0f, tW, tH); + float textX = (LOGICAL_W - (float)tW) * 0.5f; + loadingFont->draw(renderer.getSDLRenderer(), textX + contentOffsetX, currentY + contentOffsetY, loadingText, 1.0f, {255,204,0,255}); + } + + currentY += loadingTextHeight + barPaddingVertical; + + const int barW = 400, barH = 20; + const int bx = (LOGICAL_W - barW) / 2; + float loadingProgress = app->m_assetManager->getLoadingProgress(); + drawRectOriginal(bx - 3, currentY - 3, barW + 6, barH + 6, {68,68,80,255}); + drawRectOriginal(bx, currentY, barW, barH, {34,34,34,255}); + drawRectOriginal(bx, currentY, int(barW * loadingProgress), barH, {255,204,0,255}); + currentY += barH + spacingBetweenElements; + + if (loadingFont) { + int percentage = int(loadingProgress * 100); + char percentText[16]; + std::snprintf(percentText, sizeof(percentText), "%d%%", percentage); + std::string pStr(percentText); + int pW=0, pH=0; loadingFont->measure(pStr, 1.5f, pW, pH); + float percentX = (LOGICAL_W - (float)pW) * 0.5f; + loadingFont->draw(renderer.getSDLRenderer(), percentX + contentOffsetX, currentY + contentOffsetY, pStr, 1.5f, {255,204,0,255}); + } + + SDL_SetRenderViewport(renderer.getSDLRenderer(), nullptr); + SDL_SetRenderScale(renderer.getSDLRenderer(), 1.0f, 1.0f); +} + + ApplicationManager::~ApplicationManager() { if (m_initialized) { shutdown(); @@ -49,6 +163,9 @@ bool ApplicationManager::initialize(int argc, char* argv[]) { // Initialize GlobalState GlobalState::instance().initialize(); + + // Set initial logical dimensions + GlobalState::instance().updateLogicalDimensions(m_windowWidth, m_windowHeight); // Initialize SDL first if (!initializeSDL()) { @@ -63,6 +180,9 @@ bool ApplicationManager::initialize(int argc, char* argv[]) { return false; } + // Register services for dependency injection + registerServices(); + // Initialize game systems if (!initializeGame()) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Failed to initialize game systems"); @@ -212,6 +332,7 @@ bool ApplicationManager::initializeManagers() { m_renderManager->setFullscreen(!fs); } // Don’t also forward Alt+Enter as an Enter keypress to states (prevents accidental "Start") + // Don't also forward Alt+Enter as an Enter keypress to states (prevents accidental "Start") consume = true; } @@ -269,6 +390,9 @@ bool ApplicationManager::initializeManagers() { // Handle window resize events for RenderManager if (we.type == SDL_EVENT_WINDOW_RESIZED && m_renderManager) { m_renderManager->handleWindowResize(we.data1, we.data2); + + // Update GlobalState logical dimensions when window resizes + GlobalState::instance().updateLogicalDimensions(we.data1, we.data2); } // Forward all window events to StateManager @@ -289,6 +413,45 @@ bool ApplicationManager::initializeManagers() { return true; } +void ApplicationManager::registerServices() { + SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Registering services for dependency injection..."); + + // Register concrete implementations as interface singletons + if (m_renderManager) { + std::shared_ptr renderPtr(m_renderManager.get(), [](RenderManager*) { + // Custom deleter that does nothing since the unique_ptr manages lifetime + }); + m_serviceContainer.registerSingleton(renderPtr); + SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Registered IRenderer service"); + } + + if (m_assetManager) { + std::shared_ptr assetPtr(m_assetManager.get(), [](AssetManager*) { + // Custom deleter that does nothing since the unique_ptr manages lifetime + }); + m_serviceContainer.registerSingleton(assetPtr); + SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Registered IAssetLoader service"); + } + + if (m_inputManager) { + std::shared_ptr inputPtr(m_inputManager.get(), [](InputManager*) { + // Custom deleter that does nothing since the unique_ptr manages lifetime + }); + m_serviceContainer.registerSingleton(inputPtr); + SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Registered IInputHandler service"); + } + + // Register Audio system singleton + auto& audioInstance = Audio::instance(); + auto audioPtr = std::shared_ptr