Files
coffee-crisis/source/core/system/demo.hpp
T

48 lines
1.5 KiB
C++

#pragma once
#include <SDL3/SDL.h>
#include <cstdint>
#include <string>
#include <vector>
// Total de "frames" gravats a 60Hz de referencia. Equival a 2000/60 ~ 33.3s
// reals, independentment del refresc real perque el playback es time-based
// (index = elapsed_s * 60).
constexpr int TOTAL_DEMO_DATA = 2000;
// Pulsacions per frame de referencia gravades a disc / reproduides al playback.
struct DemoKeys {
Uint8 left;
Uint8 right;
Uint8 no_input;
Uint8 fire;
Uint8 fire_left;
Uint8 fire_right;
explicit DemoKeys(Uint8 l = 0, Uint8 r = 0, Uint8 ni = 0, Uint8 f = 0, Uint8 fl = 0, Uint8 fr = 0)
: left(l),
right(r),
no_input(ni),
fire(f),
fire_left(fl),
fire_right(fr) {}
};
// Una demo completa: vector de frames.
using DemoData = std::vector<DemoKeys>;
// Estat del subsistema de demo dins de Game.
struct Demo {
bool enabled{false}; // Mode demo actiu (reproduccio)
bool recording{false}; // Mode gravacio actiu
float elapsed_s{0.0F}; // Temps acumulat des de l'inici de la demo
int index{0}; // index = elapsed_s * 60 (derivat)
DemoKeys keys; // Buffer de tecles del frame actual (gravacio)
std::vector<DemoData> data; // Vector de sets de demo carregats (multi-fitxer)
};
// Carrega un fitxer .bin (TOTAL_DEMO_DATA * sizeof(DemoKeys) bytes) i
// retorna el DemoData. Si el fitxer no es troba, retorna un DemoData buit.
auto loadDemoDataFromBytes(const std::vector<uint8_t> &bytes) -> DemoData;