#pragma once #include #include #include struct Entity; /** * Shared state for one gameplay scene instance. */ struct GameContext { /** * @brief Pointer to the entity list owned by the active gameplay scene. */ std::vector> *entities = nullptr; /** @brief World entity (scroll/spawn owner). */ Entity *worldEntity = nullptr; /** @brief Gravity well entity. */ Entity *wellEntity = nullptr; /** @brief Player probe entity. */ Entity *probeEntity = nullptr; /** @brief Stats entity that owns meter + star records. */ Entity *statsEntity = nullptr; /** @brief Shared horizontal world scroll value. */ float scrollX = 0.0f; /** @brief Optional callback invoked when the probe dies. */ std::function onPlayerDeath; /** @brief Callbacks fired whenever a collectible is picked up. */ std::vector> collectiblePickedListeners; /** @brief Callbacks fired whenever meter value changes. */ std::vector> meterChangedListeners; /** * Registers a collectible pickup listener. * * @param listener Callback receiving the collected entity. */ void AddCollectiblePickedListener(std::function listener) { collectiblePickedListeners.push_back(std::move(listener)); } /** * Emits collectible pickup event. * * @param collectible The collected entity. */ void EmitCollectiblePicked(Entity &collectible) { for (auto &listener : collectiblePickedListeners) { listener(collectible); } } /** * Registers a meter changed listener. * * @param listener Callback receiving old value then new value. */ void AddMeterChangedListener(std::function listener) { meterChangedListeners.push_back(std::move(listener)); } /** * Emits meter changed event. * * @param oldValue Meter value before mutation. * @param newValue Meter value after mutation. */ void EmitMeterChanged(float oldValue, float newValue) { for (auto &listener : meterChangedListeners) { listener(oldValue, newValue); } } };