# Changelog

Tots els canvis de la reconstrucció moderna (C++/SDL3) d'**Aventures en Egipte**.

## [1.2] — 2026-04-18

Versió de modernització profunda: desapareix el model *threads estil emulador* i tot el runtime passa a un sol fil tick-based compatible amb emscripten. Zero regressions de gameplay.

### Afegit

#### Arquitectura: capa `scenes::` tick-based
- Infraestructura `scenes::` ([source/scenes/](source/scenes/)): `Scene`, `SceneRegistry`, `Timeline`, `SpriteMover`, `FrameAnimator`, `PaletteFade`, `SurfaceHandle`, helper `playMusic` (`4436f7f`)
- **MortScene** substitueix `doMort()` (`d86cb21`)
- **BannerScene** substitueix `doBanner()` per piràmides 2–5 (`2cb38ff`)
- **MenuScene** substitueix `doMenu()` + fix `JI_Update` al loop (`8720e77`)
- **IntroNewLogoScene** substitueix `doIntroNewLogo()` (`ad38fc0`)
- **SlidesScene** amb wipe suau per easing (`605c273`)
- **CreditsScene** amb scroll vertical + parallax condicional (`829d743`)
- **SecretaScene** amb swap `tomba1→tomba2` i red pulse animat (`6063b1c`)
- **IntroScene** amb revelat *JAILGAMES* lletra a lletra + cicle de paleta (`e18b732`)
- **IntroSpritesScene** com a sub-escena amb 3 variants aleatòries (`d343e71`)
- **ModuleGame** migrat a `scenes::Scene` amb fases `FadingIn`/`FadingOut` (`4e18f83`)
- Pla de migració documentat a [docs/scenes-migration-plan.md](docs/scenes-migration-plan.md) (`6125277`)

#### Resource pack
- Sistema d'empaquetat d'assets `resources.pack` (format **AEE1**, XOR-xifrat) estil *coffee_crisis* (`b2d5f5a`, `4244bca`)
- Classe `ResourcePack` + namespace `ResourceHelper` + eina CLI standalone `pack_resources` (target `make pack`)
- Cablejat a tots els callsites de recursos via `ResourceHelper::loadFile`
- Scaffold `.jrf` llegat eliminat completament de `jfile.cpp`
- Releases natius depenen del pack i l'usen obligatòriament (sense fallback); WASM i Debug mantenen fallback
- Normalització de `resource::cache` per a `Audio` (`94aa69c`)

#### Build WebAssembly
- Build WASM via Docker (`emscripten/emsdk:latest`) amb desplegament a maverick (`make wasm`)
- SDL3 compilat des de font via `FetchContent`; shaders omesos; `sdl3gpu_shader.cpp` exclòs
- Events de canvas d'emscripten (`1c11a30`)
- Fix de mandos en emscripten Android (`d3bdd9b`)
- Defaults específics d'emscripten (`7f26b8d`)
- Internal resolution configurable (`e8b0b12`, `16a3f5b`)

#### Menú i UI
- **Menú de sistema** amb versió i opció de tancar/reiniciar (`e0f9b60`)
- Animació de tancar el menú (`5956d87`)
- Items ocultables condicionalment en funció d'altres items (`a3fc111`)
- Tots els valors d'escala que exposa SDL3 (`52431ad`)
- `debug.yaml` separat de `config.yaml` (`fe41919`)

### Canviat

#### Runtime: sense fibers, sense threads, sense mutex
- **Fase 1** — jail i game a C++ idiomàtic: RAII, `info::ctx` com a singleton `inline`, cheats arreglats (`scancode→ASCII`) (`7f85b50`)
- **Fase 2** — fades de `jd8` a màquina d'estats + helper `wait_frame_or_skip` a les cinemàtiques (`80fa7b4`)
- **Fase 3** — `jail_audio` header-only amb streaming real (`stb_vorbis_open_memory` + `JA_PumpMusic`), sense `SDL_AddTimer` (`801a8ad`)
- **Fase 4+5** — fibers cooperatius substitueixen el game thread, sense mutex ni `cv` (`1507a1c`)
- **Step B.1** — fades de `ModuleGame` tick-based amb `scenes::PaletteFade` (`4e18f83`)
- **Step B.2** — **eliminació total del fiber**: `Director` posseeix l'escena (`current_scene_`, `game_state_`), `JD8_Flip` sense yield, `fiber.{hpp,cpp}` esborrats (`96a3cf9`)
- **Step 10** — `ModuleSequence` eliminat; dispatch via `SceneRegistry::tryCreate()` i `game_state_ == 0/1` directe des del `Director`
- Main loop via **SDL3 Callback API** (`SDL_MAIN_USE_CALLBACKS`): `SDL_AppInit`/`Iterate`/`Event`/`Quit`, compatible amb emscripten

#### RAII i neteja de memòria
- **Fase 1** — cleanup mecànic: `NULL→nullptr`, `typedef→using`, `explicit`, `enum class` local (`e7aa246`)
- **Fase 2** — elimina `malloc`/`free` a `jdraw8` i paletes d'escenes (`53e93ef`)
- **Fase 3** — `Text::bitmap_` a `std::vector<Uint8>` (`2a8fbbb`)
- **Fase 4** — llista enllaçada de Momia a `std::vector<std::unique_ptr>` (`5e57034`)
- **Fase 5** — singletons a `std::unique_ptr` (elimina `new`/`delete` manual) (`c6e37af`)
- **Fase 6** — Rule of 5 a `Mapa` i `ModuleGame` (no-copiables, no-movibles) (`f7875ba`)
- `file_getfilebuffer` → `file_readfile` retornant `std::vector<char>` — elimina 3 leaks silenciosos (paleta + música gameplay + música cinemàtica) (`b3ff620`)
- `JA_Music_t` RAII amb `vector<Uint8>`/`string`, elimina overload i camps morts (`f9346ad`)
- `JA_Sound_t` RAII amb `unique_ptr + SDLFreeDeleter`, elimina `JA_NewSound` (`550e3e0`)

#### Build i tooling
- Unificats `.clang-format` i `.clang-tidy`, amb exclusió de `external/` i `spv/` via dummies (`7409c79`)
- `cppcheck` integrat amb suppress list (`27f8b0a`, `2e1a82f`)
- `make`/`cmake` estandarditzats amb la resta de projectes JailGames (`9d86137`)
- Fitxers de música renombrats a noms temàtics (`417699d`)
- Carpeta `data/` reordenada (`083a57d`)

### Arreglat

- Shaders ON/OFF no afectaven a CRT-Pi (`a36662a`)
- Logo nou de la intro tornava a descentrar-se (`52369be`, `5cda8fc`)
- Color de fons dels sliders de `0x050505` a `0x000000` (`b1f9e57`)
- Diversos detalls menors (`6394e9a`, `0cd09f6`)

---

## [1.1] — 2026-04-05

Versió que fa coincidir la numeració amb la del joc original del 2000.

### Afegit

#### Presentació i renderitzat
- Backend **SDL3GPU** amb shaders GLSL compilats a SPIR-V (`2c7b709`, `2a774f7`)
- Presets de shaders **PostFX** (CRT, NTSC, CURVED, SCANLINES, SUBTLE, CRT LIVE) i **CRT-Pi** (DEFAULT, CURVED, SHARP, MINIMAL) amb cicle i persistència (`eb3f449`, `d4fc7c0`)
- Control complet de finestra i imatge via tecles de funció F1–F10 (zoom, fullscreen, shaders, aspect ratio 4:3, supersampling, filtres, render info) (`abb2307`)
- VSync i integer scaling configurables (`22ee953`)
- `renderInfo` amb animacions i posicions (off → dalt → baix); correcció del jitter (`4238ae1`, `c0553c6`)
- Suport de framerates fins a 250 FPS al `Director` (`e7202c9`)

#### Overlay i UI
- Capa d'**overlay** que pinta directament sobre el buffer ARGB: notificacions amb slide-in, informació de render i text amb *outline* (`fe8e5d6`, `b707bdd`, `6a58f75`)
- Renderitzador de fonts bitmap (`.fnt` + `.gif`) amb suport UTF-8 i accents
- Primer menú in-game amb opcions d'àudio, vídeo i controls (`dbecd1e`, `6d42f84`)
- Animacions al menú (`5ac570d`)
- Confirmació de sortida amb doble ESC (`a4ee304`, `00f8d6d`)
- Pausa funcional (`91f88de`)
- Fitxer de locales amb textos centralitzats (`788a883`)
- Crèdits dels ports a l'overlay (`6a58f75`)

#### Input
- Capa `GlobalInputs` que intercepta tecles de funció abans que arriben al joc (`699989e`)
- Suport per a **gamepad** (`a328681`)
- Redefinició de tecles des del menú (`f8b60cb`)
- `Mouse` que amaga el cursor automàticament després de 3 segons d'inactivitat (`a4ee304`)
- Mètodes per ciclar presets i opcions amb ESC dins del joc sense tancar l'aplicació (`be4b624`)

#### Arquitectura
- Model de **threads estil emulador**: `Director` al fil principal a 60 FPS independent del fil del joc, amb doble buffer (`6342442`)

#### Persistència i configuració
- Sistema de configuració YAML amb **fkYAML** (`6a09d72`)
- Fitxers a `~/.config/jailgames/aee/`: `config.yaml`, `postfx.yaml`, `crtpi.yaml`
- Ajustats els valors per defecte (`0784cb1`)

#### Release i empaquetat
- Carpeta `release/` amb scripts `make release` (`c0553c6`, `75b6b6f`)
- Accés a la carpeta `data/` des del binari de release (`21bb22b`)
- Icones de l'aplicació (`df18a81`)
- Logo alternatiu opcional (`ec0f233`)

#### Documentació
- `CLAUDE.md` amb instruccions d'arquitectura per a l'assistent (`3aa6078`)
- `README.md` amb descripció, captures i controls (`8fc61de`)

### Canviat
- Netejada iterativa del codi (`08ba88e`, `baee62b`)
- Versió marcada com a **1.1** per a coincidir amb l'original (`486f00b`)

### Arreglat
- `renderInfo` no guardava el preset actual (`d4fc7c0`)
- Eixida neta quan la pausa estava activa (`00f8d6d`)
- Eliminats warnings del codi original tocant el mínim possible (`d598d4f`)
- Eliminats warnings addicionals (pragmas clang+gcc) (`9f37518`)
- El fitxer `gamecontrollerdb.txt` es copiava al release però no es carregava: ara `Gamepad::init()` crida `SDL_AddGamepadMappingsFromFile` per estendre la base de dades de mandos de SDL

---

[1.2]: https://gitea/aee/compare/486f00b...HEAD
[1.1]: https://gitea/aee/compare/9e0ab87...486f00b
