80 lines
2.3 KiB
C++
80 lines
2.3 KiB
C++
#pragma once
|
|
|
|
#include <functional>
|
|
#include <memory>
|
|
#include <vector>
|
|
|
|
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<std::shared_ptr<Entity>> *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<void()> onPlayerDeath;
|
|
|
|
/** @brief Callbacks fired whenever a collectible is picked up. */
|
|
std::vector<std::function<void(Entity &)>> collectiblePickedListeners;
|
|
|
|
/** @brief Callbacks fired whenever meter value changes. */
|
|
std::vector<std::function<void(float, float)>> meterChangedListeners;
|
|
|
|
/**
|
|
* Registers a collectible pickup listener.
|
|
*
|
|
* @param listener Callback receiving the collected entity.
|
|
*/
|
|
void AddCollectiblePickedListener(std::function<void(Entity &)> 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<void(float, float)> 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);
|
|
}
|
|
}
|
|
};
|