refactor: file_getfilebuffer → file_readfile (std::vector<char>) — elimina 3 leaks (paleta + música gameplay + música cinemàtica)
This commit is contained in:
@@ -18,7 +18,6 @@
|
||||
#include "core/system/fiber.hpp"
|
||||
#include "game/info.hpp"
|
||||
#include "game/modulegame.hpp"
|
||||
#include "game/modulesequence.hpp"
|
||||
#include "game/options.hpp"
|
||||
#include "scenes/banner_scene.hpp"
|
||||
#include "scenes/credits_scene.hpp"
|
||||
@@ -38,10 +37,11 @@ Director* Director::instance_ = nullptr;
|
||||
|
||||
namespace {
|
||||
|
||||
// Entry del fiber del joc. Executa la màquina d'estats que alterna entre
|
||||
// ModuleSequence (state=1) i ModuleGame (state=0) fins que el joc demana
|
||||
// eixir. Quan el joc crida JD8_Flip() des de dins d'aquest fiber, el
|
||||
// control torna automàticament al Director.
|
||||
// Entry del fiber del joc. Alterna entre la capa `scenes::` (cinemàtiques
|
||||
// i menús, triats per `info::ctx.num_piramide` via el SceneRegistry) i
|
||||
// ModuleGame (gameplay) fins que el joc demana eixir. Quan el codi de
|
||||
// gameplay o una escena crida JD8_Flip(), el control torna automàticament
|
||||
// al Director via `GameFiber::yield()`.
|
||||
void gameFiberEntry() {
|
||||
info::ctx.num_habitacio = Options::game.habitacio_inicial;
|
||||
info::ctx.num_piramide = Options::game.piramide_inicial;
|
||||
@@ -60,51 +60,41 @@ void gameFiberEntry() {
|
||||
|
||||
int gameState = 1;
|
||||
while (gameState != -1 && !JG_Quitting()) {
|
||||
// Mode "Scene nova": si el state actual és de seqüència i el
|
||||
// registry té una escena migrada per al num_piramide, l'executem
|
||||
// amb un mini-loop tick-based. El codi de la Scene no toca
|
||||
// fibers; el JD8_Flip() entre ticks és el que cedeix al Director.
|
||||
if (gameState == 1) {
|
||||
// Replica del redirect que el `ModuleSequence::Go()` vell feia
|
||||
// al principi: si el jugador arriba a la piràmide Secreta (6)
|
||||
// sense prou diners, salta directament als slides de fracàs (7).
|
||||
// Cal fer-ho ací perquè el SceneRegistry consulta num_piramide
|
||||
// abans del fallback legacy; mentres doSecreta no estiga migrada
|
||||
// també continuarà al Go() vell amb num_piramide ja corregida.
|
||||
if (info::ctx.num_piramide == 6 && info::ctx.diners < 200) {
|
||||
info::ctx.num_piramide = 7;
|
||||
}
|
||||
|
||||
if (auto scene = scenes::SceneRegistry::instance().tryCreate(info::ctx.num_piramide)) {
|
||||
scene->onEnter();
|
||||
Uint32 last = SDL_GetTicks();
|
||||
while (!scene->done() && !JG_Quitting()) {
|
||||
JI_Update(); // refresca key_pressed/any_key per a les escenes
|
||||
const Uint32 now = SDL_GetTicks();
|
||||
scene->tick(static_cast<int>(now - last));
|
||||
last = now;
|
||||
JD8_Flip(); // presenta i cedix al Director
|
||||
}
|
||||
gameState = scene->nextState();
|
||||
continue;
|
||||
}
|
||||
if (gameState == 0) {
|
||||
// Gameplay pur (ModuleGame encara és cooperatiu-clàssic: conté
|
||||
// el seu while intern i crida JD8_Flip manualment). Fora
|
||||
// d'abast de la migració scenes:: — es tractarà en una fase
|
||||
// posterior quan el fiber es puga eliminar.
|
||||
auto* mg = new ModuleGame();
|
||||
gameState = mg->Go();
|
||||
delete mg;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Fallback al codi legacy (encara no migrat a Scene).
|
||||
switch (gameState) {
|
||||
case 0: {
|
||||
auto* moduleGame = new ModuleGame();
|
||||
gameState = moduleGame->Go();
|
||||
delete moduleGame;
|
||||
break;
|
||||
}
|
||||
case 1: {
|
||||
auto* moduleSequence = new ModuleSequence();
|
||||
gameState = moduleSequence->Go();
|
||||
delete moduleSequence;
|
||||
break;
|
||||
}
|
||||
// gameState == 1: dispatch a la capa scenes::.
|
||||
// El vell `ModuleSequence::Go()` feia aquest redirect al principi:
|
||||
// si el jugador arriba a la Secreta (6) sense prou diners, salta
|
||||
// als slides de fracàs (7) abans de buscar l'escena al registry.
|
||||
if (info::ctx.num_piramide == 6 && info::ctx.diners < 200) {
|
||||
info::ctx.num_piramide = 7;
|
||||
}
|
||||
|
||||
auto scene = scenes::SceneRegistry::instance().tryCreate(info::ctx.num_piramide);
|
||||
if (!scene) {
|
||||
// State no registrat — indica un bug del dispatcher o del
|
||||
// registre d'escenes. Eixim ordenadament en lloc de cremar CPU.
|
||||
break;
|
||||
}
|
||||
scene->onEnter();
|
||||
Uint32 last = SDL_GetTicks();
|
||||
while (!scene->done() && !JG_Quitting()) {
|
||||
JI_Update(); // refresca key_pressed/any_key per a les escenes
|
||||
const Uint32 now = SDL_GetTicks();
|
||||
scene->tick(static_cast<int>(now - last));
|
||||
last = now;
|
||||
JD8_Flip(); // presenta i cedix al Director
|
||||
}
|
||||
gameState = scene->nextState();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -114,10 +104,10 @@ void Director::init() {
|
||||
instance_ = new Director();
|
||||
Gamepad::init();
|
||||
|
||||
// Registre d'escenes migrades. Cada entrada = una funció del vell
|
||||
// ModuleSequence reescrita com a `scenes::*Scene`. Mentre vagen
|
||||
// caient, el fallback al switch legacy de gameFiberEntry deixa de
|
||||
// rebre aquests states.
|
||||
// Registre d'escenes. Cada entrada = un state_key (`num_piramide`)
|
||||
// amb una factory de `scenes::Scene`. El gameFiberEntry consulta
|
||||
// aquest registry per a tots els states de seqüència; si una clau
|
||||
// no apareix ací, el fiber eixirà del loop.
|
||||
auto& registry = scenes::SceneRegistry::instance();
|
||||
registry.registerScene(0, [] { return std::make_unique<scenes::MenuScene>(); });
|
||||
registry.registerScene(100, [] { return std::make_unique<scenes::MortScene>(); });
|
||||
@@ -136,8 +126,8 @@ void Director::init() {
|
||||
registry.registerScene(8, [] { return std::make_unique<scenes::CreditsScene>(); });
|
||||
// State 255 (intro): dues variants segons `Options::game.use_new_logo`.
|
||||
// La factory tria a runtime — així es pot togglar des del menú sense
|
||||
// re-registrar. Les dues escenes acaben delegant a doIntroSprites
|
||||
// legacy fins al Step 9 de la migració.
|
||||
// re-registrar. Les dues escenes construeixen una IntroSpritesScene
|
||||
// com a sub-escena per a la part d'animacions de sprites.
|
||||
registry.registerScene(255, []() -> std::unique_ptr<scenes::Scene> {
|
||||
if (Options::game.use_new_logo) {
|
||||
return std::make_unique<scenes::IntroNewLogoScene>();
|
||||
|
||||
Reference in New Issue
Block a user