Commit Graph
33 Commits
Author SHA1 Message Date
JailDesigner 82b229222f feat(hud): marcador de la franja superior amb 3 blocs i animació d'entrada 2026-04-23 23:46:41 +02:00
JailDesigner 87b08a7c7c feat(map): afegeix PaintLayer com a font única del pintat 2026-04-23 13:17:47 +02:00
JailDesigner a612a8255f feat(editor): mode editor mínim amb toggle, border blau i mutex amb pausa 2026-04-23 12:09:04 +02:00
JailDesigner 6d8423764d feat(editor): writer surgical del bloc data: al YAML del tilemap 2026-04-23 11:51:49 +02:00
JailDesigner 4da05b3d76 chore(release): v0.21.0 — empaquetat de recursos (AE26) i neteja de fonts
- Nou format de pack AE26 v1 (XOR + djb2), eina `pack_resources`,
  regeneració automàtica de `build/resources.pack` a cada build.
- `Resource::Helper` amb init/shutdown, fallback a disc només en Debug
  (apunta al source tree); Release exigeix pack present.
- Callers de YAML migrats a `loadFile`+deserialize des de buffer.
- Arrel neta: el pack viu a `build/`, eliminat `sync_data`.
- Placeholder font -> `ari-w9500-condensed-display`; esborrades variants
  bold/condensed no usades a `data/fonts/`.
2026-04-23 08:51:21 +02:00
JailDesigner 4dd2b6d2a9 feat(mouse): amaga el cursor automàticament després de 3s sense moviment 2026-04-22 21:34:05 +02:00
JailDesigner 7c35ffaa74 feat(gamepad): detecció i notificacions hot-plug amb GamepadManager 2026-04-22 19:39:16 +02:00
JailDesigner fb40d0effb feat(menu): submenú Controls i bloqueig de polling amb menú obert 2026-04-22 19:05:36 +02:00
JailDesigner 350625dec0 feat(menu): primera versió del menú de servei 2026-04-22 18:15:00 +02:00
JailDesigner 6800786194 fix(resources): resoldre rutes de data/ respecte a SDL_GetBasePath
Abans el binari només arrencava si la CWD era la que contenia data/
(típicament build/). Executat des de qualsevol altra carpeta no trobava
keys.yaml, paletes, etc. i es moria al carregar el primer recurs.

Patró seguit de ../aee: Resource::Helper guarda un data root absolut
i resolve(rel) el prefixa davant de rutes no absolutes. Director fa
setDataRoot(SDL_GetBasePath()) com a primera acció del ctor, així tots
els loaders posteriors hi passen sense canvis al call site.

Migrats a Resource::Helper::resolve els loaders que obrien std::ifstream
directament amb el path rebut: Locale, KeyConfig, Player, Map, Tilemap
i EntityLoader. Els que ja usaven Resource::Helper::loadFile
(Resource::Cache, PaletteLoader) hereten el fix automàticament.

Els fitxers de system_folder_ (config.yaml, debug.yaml, postfx.yaml,
crtpi.yaml) es passen com a rutes absolutes i resolve() les deixa
intactes, així no es veuen afectats.

Test targets (test_entities_smoke, test_scene_flow) enllacen ara
resource_helper.cpp perquè el seu codi passa per Helper::resolve. Els
tests corren amb CWD = repo root, on les rutes "data/..." funcionen
amb data root buit sense canviar cap assert.

Verificat executant el binari des de build/, /tmp i / — tots tres
troben els recursos i arrenquen correctament, tant en debug com en
release (release sempre arranca a LOGO).
2026-04-22 11:29:51 +02:00
JailDesigner 2cb21211ef test(scenes): smoke del flux d'escenes i parser de debug.yaml
Cobreix les dues peces pures del flux:
- parseStartScene / resolveStartScene: tots els valors vàlids, fallback
  a GAME per valor invàlid, YAML corrupte o fitxer inexistent.
- createDefaultIfMissing: crea el fitxer amb start_scene=GAME si no
  existeix i és idempotent quan ja hi és.
- isReservedScancode: F1/F12/Escape reservats, SPACE/fletxes no, i
  UNKNOWN sempre fals.

La lògica de update/render dels placeholders no es testeja perquè
arrossegaria Screen/Notifier/RenderInfo (tot l'stack SDL). Aquesta
integració queda coberta pel smoke xvfb-run del binari.

Stand-alone target `test_scene_flow` que només enllaça els .cpp pures
necessaris, amb ctest afegit.
2026-04-22 10:35:07 +02:00
JailDesigner 87a9f098b5 feat(debug): selector d'escena inicial via debug.yaml
Director encadena LOGO → TITLE → INTRO → GAME amb factories injectades
al ctor de cada placeholder (sense que cap escena conegui el tipus de
la següent). L'escena d'arrencada surt de `debug.yaml` en debug build i
és sempre LOGO en release.

Comportament:
- Release: `debug.yaml` s'ignora; arranca sempre a LOGO.
- Debug: es llig `debug.yaml`. Si no existeix, es crea automàticament
  amb `start_scene: GAME` per no arrossegar 15 s de placeholders al dia
  a dia de gameplay. Valor invàlid o YAML corrupte → warning + GAME,
  però el fitxer no es reescriu (respectem l'edició manual).

`debug.yaml` viu a `$XDG_CONFIG_HOME/jailgames/aee_2026/`, al costat
de `config.yaml`, i queda fora del repo (ajust per màquina de dev).
2026-04-22 10:33:36 +02:00
JailDesigner d31483124e feat(scenes): afegir placeholders LogoScene/TitleScene/IntroScene
Tres escenes de 5 s cadascuna, activables al flux que precedeix GameScene.
Classes separades (sense base comuna) perquè divergiran quan es
desenvolupi contingut real.

Avancen per timeout o per qualsevol tecla no reservada. Les tecles
reservades (F1-F12, Escape) són les declarades a data/input/keys.yaml i
mantenen el seu comportament habitual via GlobalInputs. La
classificació viu a Placeholder::isReservedScancode, i KeyConfig exposa
bindings() per enumerar-les sense duplicar la llista.

Encara no integrats al Director: això es fa al següent commit quan
s'afegeix el selector d'escena inicial.
2026-04-22 10:31:48 +02:00
JailDesigner 32dcf264c4 feat(entities): caja-peus concèntrica i animacions direccionals a la momia, còpia de data/ sempre sincronitzada; v0.19.0 2026-04-21 23:21:32 +02:00
JailDesigner 7191a08618 feat(entities): integració del sistema d'entitats al GameScene 2026-04-21 13:55:21 +02:00
JailDesigner 96b71b0f65 feat(entities): andamiatge del sistema d'entitats (classes, factory, bus, YAML, placeholders, smoke tests) 2026-04-21 12:35:19 +02:00
JailDesignerandClaude Opus 4.7 bc53174f2b refactor(core/audio): split jail_audio.hpp/.cpp (COUP-02, PATCH-03)
Preparatori per COUP-01. No canvia comportament: només mou les
definicions inline de jail_audio.hpp a un jail_audio.cpp nou, deixant
el .hpp amb declaracions + tipus + constants.

Efectes col·laterals que es tanquen gratis:

  - COUP-02: jail_audio deixa de ser header-only. Abans cada TU que
    l'incloïa compilava 650 línies inline (amb stb_vorbis.c en mode
    HEADER_ONLY). Ara el .hpp té ~130 línies de declaracions.
  - PATCH-03: #include "external/stb_vorbis.c" + #undef L/C/R/PLAYBACK_*
    viu només al final de jail_audio.cpp. audio.cpp perd el workaround
    dels undefs.

Estat intern (current_music, channels[], audio_spec, music_volume,
sound_volume[], music_enabled, sound_enabled, sdl_audio_device,
outgoing_music, incoming_fade) baixa al .cpp dins d'un namespace
anònim (internal linkage). Els helpers privats (feedMusicChunk,
pumpMusic, preFillOutgoing, fadeProgress, update*Fade, updateCurrent*,
stealCurrentIntoOutgoing, forEachTargetChannel) també viuen a
l'anonymous namespace.

Ja::Music i Ja::Sound són públics; el .hpp forward-declara
`struct stb_vorbis` perquè els callers només els agafen per punter.
NOLINT(readability-identifier-naming) al forward-decl perquè el nom
l'imposa stb_vorbis.

jail_audio.cpp s'afegeix a APP_SOURCES al CMakeLists.txt.

.clang-tidy: desactivat clang-analyzer-core.UndefinedBinaryOperatorResult
globalment. Fals positiu conegut a external/stb_vorbis.c que abans no es
disparava (no hi havia TU que cridés directament stb_vorbis_seek_start
des del mateix fitxer on la funció està inlined); ara que jail_audio.cpp
sí que fa aquestes crides directes, el path d'anàlisi passa pel .c i el
check dispara. HeaderFilterRegex no aplica a clang-analyzer-*.

Preparació per COUP-01 (introduir Ja::Engine al commit següent).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 13:11:15 +02:00
JailDesignerandClaude Opus 4.7 81fe826d17 refactor(core/rendering): Surface desacoblat de Screen via Canvas (COUP-02b / COUP-03)
Surface::renderWithColorReplace usava Screen::get().getCanvasArgb() i
companys per a obtenir el buffer destí. S'introdueix una abstracció
mínima:

- source/core/rendering/canvas.hpp: struct Canvas amb pixels/width/
  height i la fàbrica activeCanvas() que retorna el canvas actiu.
- source/core/rendering/canvas.cpp: implementació que delega a Screen.

Surface ara inclou canvas.hpp en lloc de screen.hpp i crida
Rendering::activeCanvas(). L'indirecció permet, més endavant, empènyer
canvases alternatius (off-screen, efectes) sense tocar Surface; ara
mateix es comporta idèntic al codi anterior.

Build + smoke 5s xvfb OK (exit 124).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 09:38:11 +02:00
JailDesignerandClaude Opus 4.7 5f46fb22a4 refactor(sdl3gpu): extreure shaders MSL i helpers a headers compartits (CONV-03)
Els dos pipelines GPU (PostFX i CrtPi) tenien:
- Raw strings MSL incrustades al .cpp amb NOLINTBEGIN(readability-
  identifier-naming) envoltant ~150 línies cadascun.
- Funcions createShaderMSL / createShaderSPIRV duplicades byte a byte
  en cada .cpp (DUP-04), amb un comentari admetent-ho.
- El vertex shader postfx_vs escrit dues voltes, idèntic (DUP-05).

S'introdueixen:
- source/core/rendering/sdl3gpu/shader_factory.hpp amb els dos helpers
  inline, per a reutilitzar des de qualsevol pipeline.
- source/core/rendering/sdl3gpu/msl/ amb un header per shader
  (postfx_vert compartit, postfx_frag, crtpi_frag); cada constant es
  diu kCamelCase i cau per defecte sota el project naming, així que
  els blocs NOLINT desapareixen (PATCH-07).
- Suppresió a cppcheck per a sdl3gpu/msl/* (és MSL, no C++).

Els .cpp es redueixen ~190 línies cada un i queden només amb la
lògica del pipeline.

Build + smoke test de 5s sota xvfb OK (exit 124).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 09:28:52 +02:00
JailDesigner e2b8d0e459 Subsistema d'àudio: port de ../aee/core/audio refactoritzat amb namespace Ja, desacoblat d'Options via Audio::Config i extensió de Resource::Cache per preloading de música i sons; pyramid_1.ogg sona a GameScene (v0.15.0) 2026-04-19 23:19:20 +02:00
JailDesigner 6f3fafbfff RenderInfo amb tres estats (off/dalt/baix), temps de joc i persistència; ombra, mono-dígits i easing compartits (v0.14.0) 2026-04-19 20:28:23 +02:00
JailDesigner 46a578fd86 Tilemap YAML: sala piràmide renderitzada amb tiles reals de tomb.gif i caixa de debug llevada (v0.13.0) 2026-04-19 19:35:21 +02:00
JailDesigner c921833537 Mapa piràmide 4×5 amb muros i passadissos de 16 px + motor de colisions AABB amb snap al passadís (v0.12.0) 2026-04-19 18:08:51 +02:00
JailDesigner 297dc85e47 GlobalInputs F1-F12 + Escape, Screen sense destruir finestra, escalat al GPU, presets i fons canvas (v0.11.0) 2026-04-19 14:27:16 +02:00
JailDesigner 837eb73398 Locale amb català (defecte) i anglès; Options.locale persistit a config.yaml (v0.10.0) 2026-04-19 12:11:42 +02:00
JailDesigner 1b430500f4 Sistema de notificacions amb presets (F4, llisca des de dalt) (v0.9.0) 2026-04-19 10:54:32 +02:00
JailDesigner bee9b650db Paleta UI compartida (sega-cube.pal) i constants semàntiques UiColor (v0.7.1) 2026-04-19 09:30:29 +02:00
JailDesigner e6f3c888e6 Font 8bithud, classe Text i overlay RenderInfo (F3, persistit a config.yaml) (v0.7.0) 2026-04-19 00:31:02 +02:00
JailDesigner ce5bec1b34 Shader CRT-Pi alternatiu en pipeline separat; selecció via config + presets (v0.6.0) 2026-04-18 23:16:17 +02:00
JailDesigner 6c8ef9ff44 Path SDL3 GPU amb PostFX passthrough; Screen amb init/shutdown explicit (v0.4.0) 2026-04-18 22:50:04 +02:00
JailDesigner 0348acb0eb Config.yaml + Screen::Config desacoblat via Options (v0.3.0) 2026-04-18 21:38:40 +02:00
JailDesigner de5a670fdb Motor de sprites/animacions/surfaces i jugador centrat (v0.2.0) 2026-04-18 21:02:55 +02:00
JailDesigner 7bb1edd08a Esquelet inicial: finestra negra i primera escena 2026-04-18 19:56:59 +02:00