La sobrecarga render(float dx, float dy, float sx, float sy, float w,
float h) no tenía un solo caller en el proyecto. Las otras dos
sobrecargas (con SDL_FRect) cubren todos los casos de uso reales.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
setSurfaceData() no tenía callers. El shared_ptr<SurfaceData> se queda
porque render() puede aliasar el SurfaceData propio con el del renderer
surface (self-blit). Migrar a unique_ptr requeriría tocar Screen y
dissolve_sprite sin simplificación real.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Coherencia con render() y renderWithVerticalFade(): el píxel no
sustituido pasa por sub_palette_ en vez de copiarse crudo. Hoy es
no-op (las surfaces que usan color replace no hacen fadeSubPalette)
pero cierra la divergencia de API y previene regresiones futuras.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
El bucle usaba floats con comparación de igualdad exacta (x1==x2 &&
y1==y2) como condición de parada, con incrementos ±1.0f acumulados:
bug latente. Convertidos los endpoints de entrada con std::lround y
reescrito el algoritmo con ints. Firma pública float preservada para
no tocar callers.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
palette_ y sub_palette_ son std::array de tamaño fijo, así que el check
en runtime nunca podía fallar. Movido a static_assert sobre tuple_size_v.
El throw asociado era código muerto.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Las dos líneas de clamp contra el destino estaban duplicadas. Fusionado
el comentario y dejado un único bloque que limita contra origen y destino.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
loadSurface es static en declaración y definición, así que el
NOLINT(readability-convert-member-functions-to-static) era dead noise.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- CMakeLists.txt (Emscripten): afegit -fexceptions (compile + link) perquè
fkyaml i altres throws ara es capturen pels try/catch enlloc de cridar
abort(). També -sASSERTIONS=1 per veure missatges clars d'error en el
runtime de Emscripten.
- resource_cache: abans de carregar cada recurs, desa el seu nom en
current_loading_name_ i (en wasm/debug) el repinta immediatament sobre la
barra de progrés. Ara, si la càrrega es penja en un fitxer concret, el
nom queda visible en pantalla i ajuda a diagnosticar el problema.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- CMakeLists.txt: branca EMSCRIPTEN amb SDL3 via FetchContent, preload de data/
config/ i gamecontrollerdb.txt, WebGL2, EMSCRIPTEN_BUILD define i sortida .html.
Exclou sdl3gpu_shader (no soportat a WebGL2) i el pack_tool en wasm.
- Makefile: target wasm via Docker emscripten/emsdk, build a build/wasm i
sortida a dist/wasm (.html .js .wasm .data).
- director.cpp: createSystemFolder utilitza MEMFS en wasm (sense pwd.h/unistd.h),
executable_path buit, dev-mode forçat (filesystem preload, no pack), windowed.
- screen.cpp: initShaders és no-op en wasm (SDL3 GPU no suportat a WebGL2).
- global_inputs.cpp: handleQuit és no-op en wasm (no es pot eixir del joc).
- Director::handleEvent ignora SDL_EVENT_QUIT en wasm.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Substitueix el bucle blocant main() → Director::run() → escena::run() per
SDL_AppInit/Iterate/Event/Quit. Cada escena implementa ara iterate() (un frame)
i handleEvent() (un event) sota una interfície base Scene.
- Director gestiona l'escena activa i les transicions via switchToActiveScene()
- Setup/cleanup que estava al voltant del while de run() mogut a ctor/dtor
(música de Game/Ending/Ending2, volum de LoadingScreen)
- GlobalEvents ja no processa SDL_EVENT_QUIT (ho fa Director::handleEvent)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>