demo time-based: porta el patro de CCAE (multi-set, index = elapsed_s*60, % size per safe loop), substitueix demo.bin per demo1/2/3.bin
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
#include "core/system/demo.hpp"
|
||||
|
||||
#include <cstring> // for memcpy
|
||||
|
||||
// Desempaqueta un blob binari amb TOTAL_DEMO_DATA registres consecutius
|
||||
// de DemoKeys (struct POD de 6 bytes). Si el blob no te la mida esperada,
|
||||
// torna un vector buit perque el playback el detecti i no peti.
|
||||
auto loadDemoDataFromBytes(const std::vector<uint8_t> &bytes) -> DemoData {
|
||||
DemoData dd;
|
||||
const size_t EXPECTED = sizeof(DemoKeys) * TOTAL_DEMO_DATA;
|
||||
if (bytes.size() < EXPECTED) {
|
||||
return dd;
|
||||
}
|
||||
dd.resize(TOTAL_DEMO_DATA);
|
||||
std::memcpy(dd.data(), bytes.data(), EXPECTED);
|
||||
return dd;
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
#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;
|
||||
@@ -338,7 +338,9 @@ auto Director::setFileList() -> bool {
|
||||
|
||||
// Ficheros de configuración
|
||||
Asset::get()->add(system_folder_ + "/score.bin", Asset::Type::DATA, false, true);
|
||||
Asset::get()->add(PREFIX + "/data/demo/demo.bin", Asset::Type::DATA);
|
||||
Asset::get()->add(PREFIX + "/data/demo/demo1.bin", Asset::Type::DATA);
|
||||
Asset::get()->add(PREFIX + "/data/demo/demo2.bin", Asset::Type::DATA);
|
||||
Asset::get()->add(PREFIX + "/data/demo/demo3.bin", Asset::Type::DATA);
|
||||
|
||||
// Musicas
|
||||
Asset::get()->add(PREFIX + "/data/music/intro.ogg", Asset::Type::MUSIC);
|
||||
|
||||
Reference in New Issue
Block a user