#pragma once #include #include #include #include // 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; // 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 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 &bytes) -> DemoData;