Compare commits
87 Commits
43a6cc2d7a
...
v1.10
| Author | SHA1 | Date | |
|---|---|---|---|
| e13a28f69a | |||
| 301e0145fb | |||
| 3b233f0e12 | |||
| fd9be2066d | |||
| 7551115912 | |||
| b986778bb4 | |||
| fd2e2f1014 | |||
| 77b844065e | |||
| 2fe79de1d8 | |||
| d6ecadfd3a | |||
| ad467847b9 | |||
| 1bb2142d19 | |||
| f5a82229fe | |||
| 145bab037f | |||
| 754ad2de49 | |||
| a9b7c3f025 | |||
| 4db92d423c | |||
| 6717c1e307 | |||
| 9282d661aa | |||
| a21f530dd4 | |||
| 7483bf63c8 | |||
| 268763f162 | |||
| 71c7b8e553 | |||
| 854a5f04b2 | |||
| ed21a47f92 | |||
| 637df23bc7 | |||
| ea421b4e17 | |||
| 3a5ff06dab | |||
| dfb0d2134f | |||
| b459e2106f | |||
| 065f66d40e | |||
| f15658a767 | |||
| 21c8d1e8ca | |||
| a06eb8c8e9 | |||
| 6b73a76d31 | |||
| 348a76090b | |||
| 02c1bf647e | |||
| a7f0a18e6d | |||
| 8355c266a6 | |||
| 7bad27d686 | |||
| d39622c7e2 | |||
| 4910d201f9 | |||
| e85800c5ed | |||
| f25ee18329 | |||
| 3712f0c8d9 | |||
| c063488e8e | |||
| deb0a8677f | |||
| c5a7c9e70d | |||
| 92453a6104 | |||
| 7aff3e2109 | |||
| 8d213e7b3e | |||
| c6d409c303 | |||
| 6914f7df93 | |||
| 1dbfff2c17 | |||
| 3493636954 | |||
| 8ff1073e4a | |||
| 6497e26202 | |||
| e0e37204d7 | |||
| 6595b28790 | |||
| 0ddb6c85e1 | |||
| f84007902e | |||
| 49ae2ae41f | |||
| c701421a8f | |||
| 1ecb427106 | |||
| c87779cc09 | |||
| 24594fa89a | |||
| 030779794e | |||
| 495c23a3d2 | |||
| 911ee7a13e | |||
| b876ccbb09 | |||
| 94684e8758 | |||
| 0c116665bc | |||
| d0ed49d192 | |||
| 5e013a8414 | |||
| 0cdbeb768d | |||
| cd0477cc4c | |||
| c6e2779429 | |||
| 9b7abc7725 | |||
| c87d682508 | |||
| 366c00fd22 | |||
| 55b58ded70 | |||
| d946ab7943 | |||
| 167797a7b2 | |||
| 7ec869a6d4 | |||
| 82603c1e41 | |||
| 3a2015256a | |||
| 9df3f1b929 |
@@ -1,6 +1,7 @@
|
|||||||
BasedOnStyle: Google
|
BasedOnStyle: Google
|
||||||
IndentWidth: 4
|
IndentWidth: 4
|
||||||
IndentAccessModifiers: true
|
NamespaceIndentation: All
|
||||||
|
IndentAccessModifiers: false
|
||||||
ColumnLimit: 0 # Sin límite de longitud de línea
|
ColumnLimit: 0 # Sin límite de longitud de línea
|
||||||
BreakBeforeBraces: Attach # Llaves en la misma línea
|
BreakBeforeBraces: Attach # Llaves en la misma línea
|
||||||
AllowShortIfStatementsOnASingleLine: true
|
AllowShortIfStatementsOnASingleLine: true
|
||||||
|
|||||||
78
BUILDING.md
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
# Compilar JailDoctor's Dilemma
|
||||||
|
|
||||||
|
## Linux (Debian/Ubuntu)
|
||||||
|
|
||||||
|
Instal·la les dependències:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt install cmake make g++ xxd glslang-tools glslc
|
||||||
|
```
|
||||||
|
|
||||||
|
Per a SDL3, instal·la el paquet de desenvolupament si està disponible al teu repositori:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt install libsdl3-dev
|
||||||
|
```
|
||||||
|
|
||||||
|
Si `libsdl3-dev` no està als repos (SDL3 és recent i pot no estar a Debian stable), compila'l des del codi font:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/libsdl-org/SDL.git --branch release-3.x --depth 1
|
||||||
|
cd SDL && cmake -B build && cmake --build build && sudo cmake --install build
|
||||||
|
```
|
||||||
|
|
||||||
|
Compila el joc:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cmake -B build
|
||||||
|
cmake --build build
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Windows (MinGW via WinLibs)
|
||||||
|
|
||||||
|
1. Instal·la [WinLibs](https://winlibs.com/) (MinGW-w64 amb GCC)
|
||||||
|
2. Instal·la [CMake](https://cmake.org/download/)
|
||||||
|
3. Descarrega les [biblioteques de desenvolupament de SDL3 per a MinGW](https://github.com/libsdl-org/SDL/releases) — copia les capçaleres a `include/` i els fitxers `.a` a `lib/` de MinGW
|
||||||
|
4. Instal·la el [Vulkan SDK](https://vulkan.lunarg.com/sdk/home) — proporciona `glslc` per a la compilació dels shaders
|
||||||
|
|
||||||
|
Compila el joc (des d'un terminal MinGW):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cmake -B build -G "MinGW Makefiles"
|
||||||
|
cmake --build build
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## macOS
|
||||||
|
|
||||||
|
Instal·la les dependències amb [Homebrew](https://brew.sh):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
brew install cmake sdl3 glslang
|
||||||
|
```
|
||||||
|
|
||||||
|
Compila el joc:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cmake -B build
|
||||||
|
cmake --build build
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Què fa la compilació
|
||||||
|
|
||||||
|
`cmake --build build` ho gestiona tot en ordre:
|
||||||
|
|
||||||
|
1. **Compila els shaders** — regenera `postfx_vert_spv.h` / `postfx_frag_spv.h` si els fitxers `.vert` o `.frag` han canviat (requereix `glslc`)
|
||||||
|
2. **Compila el joc** — només recompila els fitxers `.cpp` modificats
|
||||||
|
3. **Empaqueta els recursos** — regenera `resources.pack` des de `data/` si algun asset ha canviat
|
||||||
|
|
||||||
|
Si `glslc` no està instal·lat, s'utilitzen les capçaleres de shaders precompilades (incloses al repositori).
|
||||||
|
|
||||||
|
> **Nota:** El `file(GLOB_RECURSE)` sobre `data/` s'avalua en temps de configuració de CMake. Si **afegeixes un fitxer nou** a `data/`, executa `cmake -B build` de nou perquè CMake el detecte com a dependència.
|
||||||
|
|
||||||
|
L'executable es genera a l'arrel del projecte: `./jaildoctors_dilemma`
|
||||||
103
CMakeLists.txt
@@ -41,14 +41,17 @@ set(APP_SOURCES
|
|||||||
# Core - Rendering
|
# Core - Rendering
|
||||||
source/core/rendering/gif.cpp
|
source/core/rendering/gif.cpp
|
||||||
source/core/rendering/pixel_reveal.cpp
|
source/core/rendering/pixel_reveal.cpp
|
||||||
|
source/core/rendering/render_info.cpp
|
||||||
source/core/rendering/screen.cpp
|
source/core/rendering/screen.cpp
|
||||||
source/core/rendering/surface.cpp
|
source/core/rendering/surface.cpp
|
||||||
source/core/rendering/surface_animated_sprite.cpp
|
source/core/rendering/sprite/animated_sprite.cpp
|
||||||
source/core/rendering/surface_dissolve_sprite.cpp
|
source/core/rendering/sprite/dissolve_sprite.cpp
|
||||||
source/core/rendering/surface_moving_sprite.cpp
|
source/core/rendering/sprite/moving_sprite.cpp
|
||||||
source/core/rendering/surface_sprite.cpp
|
source/core/rendering/sprite/sprite.cpp
|
||||||
source/core/rendering/text.cpp
|
source/core/rendering/text.cpp
|
||||||
source/core/rendering/texture.cpp
|
|
||||||
|
# Core - Locale
|
||||||
|
source/core/locale/locale.cpp
|
||||||
|
|
||||||
# Core - Resources
|
# Core - Resources
|
||||||
source/core/resources/resource_list.cpp
|
source/core/resources/resource_list.cpp
|
||||||
@@ -93,6 +96,7 @@ set(APP_SOURCES
|
|||||||
source/game/scenes/title.cpp
|
source/game/scenes/title.cpp
|
||||||
|
|
||||||
# Game - UI
|
# Game - UI
|
||||||
|
source/game/ui/console.cpp
|
||||||
source/game/ui/notifier.cpp
|
source/game/ui/notifier.cpp
|
||||||
|
|
||||||
# Utils
|
# Utils
|
||||||
@@ -117,9 +121,79 @@ set(DEBUG_SOURCES
|
|||||||
find_package(SDL3 REQUIRED CONFIG REQUIRED COMPONENTS SDL3)
|
find_package(SDL3 REQUIRED CONFIG REQUIRED COMPONENTS SDL3)
|
||||||
message(STATUS "SDL3 encontrado: ${SDL3_INCLUDE_DIRS}")
|
message(STATUS "SDL3 encontrado: ${SDL3_INCLUDE_DIRS}")
|
||||||
|
|
||||||
|
# --- SHADER COMPILATION (Linux/Windows only - macOS uses Metal) ---
|
||||||
|
if(NOT APPLE)
|
||||||
|
find_program(GLSLC_EXE NAMES glslc)
|
||||||
|
|
||||||
|
set(SHADERS_DIR "${CMAKE_SOURCE_DIR}/data/shaders")
|
||||||
|
set(HEADERS_DIR "${CMAKE_SOURCE_DIR}/source/core/rendering/sdl3gpu")
|
||||||
|
|
||||||
|
set(SHADER_POSTFX_VERT_SRC "${SHADERS_DIR}/postfx.vert")
|
||||||
|
set(SHADER_POSTFX_FRAG_SRC "${SHADERS_DIR}/postfx.frag")
|
||||||
|
set(SHADER_UPSCALE_FRAG_SRC "${SHADERS_DIR}/upscale.frag")
|
||||||
|
set(SHADER_DOWNSCALE_FRAG_SRC "${SHADERS_DIR}/downscale.frag")
|
||||||
|
set(SHADER_CRTPI_FRAG_SRC "${SHADERS_DIR}/crtpi_frag.glsl")
|
||||||
|
|
||||||
|
set(SHADER_POSTFX_VERT_H "${HEADERS_DIR}/postfx_vert_spv.h")
|
||||||
|
set(SHADER_POSTFX_FRAG_H "${HEADERS_DIR}/postfx_frag_spv.h")
|
||||||
|
set(SHADER_UPSCALE_FRAG_H "${HEADERS_DIR}/upscale_frag_spv.h")
|
||||||
|
set(SHADER_DOWNSCALE_FRAG_H "${HEADERS_DIR}/downscale_frag_spv.h")
|
||||||
|
set(SHADER_CRTPI_FRAG_H "${HEADERS_DIR}/crtpi_frag_spv.h")
|
||||||
|
|
||||||
|
set(ALL_SHADER_HEADERS
|
||||||
|
"${SHADER_POSTFX_VERT_H}"
|
||||||
|
"${SHADER_POSTFX_FRAG_H}"
|
||||||
|
"${SHADER_UPSCALE_FRAG_H}"
|
||||||
|
"${SHADER_DOWNSCALE_FRAG_H}"
|
||||||
|
"${SHADER_CRTPI_FRAG_H}"
|
||||||
|
)
|
||||||
|
set(ALL_SHADER_SOURCES
|
||||||
|
"${SHADER_POSTFX_VERT_SRC}"
|
||||||
|
"${SHADER_POSTFX_FRAG_SRC}"
|
||||||
|
"${SHADER_UPSCALE_FRAG_SRC}"
|
||||||
|
"${SHADER_DOWNSCALE_FRAG_SRC}"
|
||||||
|
"${SHADER_CRTPI_FRAG_SRC}"
|
||||||
|
)
|
||||||
|
|
||||||
|
if(GLSLC_EXE)
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${ALL_SHADER_HEADERS}
|
||||||
|
COMMAND ${CMAKE_COMMAND}
|
||||||
|
-D GLSLC=${GLSLC_EXE}
|
||||||
|
-D SHADERS_DIR=${SHADERS_DIR}
|
||||||
|
-D HEADERS_DIR=${HEADERS_DIR}
|
||||||
|
-P ${CMAKE_SOURCE_DIR}/tools/shaders/compile_spirv.cmake
|
||||||
|
DEPENDS ${ALL_SHADER_SOURCES}
|
||||||
|
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
|
||||||
|
COMMENT "Compilando shaders SPIR-V..."
|
||||||
|
)
|
||||||
|
add_custom_target(shaders DEPENDS ${ALL_SHADER_HEADERS})
|
||||||
|
message(STATUS "glslc encontrado: shaders se compilarán automáticamente")
|
||||||
|
else()
|
||||||
|
foreach(HDR ${ALL_SHADER_HEADERS})
|
||||||
|
if(NOT EXISTS "${HDR}")
|
||||||
|
message(FATAL_ERROR
|
||||||
|
"glslc no encontrado y header SPIR-V no existe: ${HDR}\n"
|
||||||
|
" Instala glslc: sudo apt install glslang-tools (Linux)\n"
|
||||||
|
" choco install vulkan-sdk (Windows)\n"
|
||||||
|
" O genera los headers manualmente: tools/shaders/compile_spirv.sh"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
message(STATUS "glslc no encontrado - usando headers SPIR-V precompilados")
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
message(STATUS "macOS: shaders SPIR-V omitidos (usa Metal)")
|
||||||
|
endif()
|
||||||
|
|
||||||
# --- 2. AÑADIR EJECUTABLE ---
|
# --- 2. AÑADIR EJECUTABLE ---
|
||||||
add_executable(${PROJECT_NAME} ${APP_SOURCES} ${RENDERING_SOURCES})
|
add_executable(${PROJECT_NAME} ${APP_SOURCES} ${RENDERING_SOURCES})
|
||||||
|
|
||||||
|
# Shaders deben compilarse antes que el ejecutable (Linux/Windows con glslc)
|
||||||
|
if(NOT APPLE AND GLSLC_EXE)
|
||||||
|
add_dependencies(${PROJECT_NAME} shaders)
|
||||||
|
endif()
|
||||||
|
|
||||||
# Añadir fuentes de debug solo en modo Debug
|
# Añadir fuentes de debug solo en modo Debug
|
||||||
target_sources(${PROJECT_NAME} PRIVATE $<$<CONFIG:Debug>:${DEBUG_SOURCES}>)
|
target_sources(${PROJECT_NAME} PRIVATE $<$<CONFIG:Debug>:${DEBUG_SOURCES}>)
|
||||||
|
|
||||||
@@ -176,6 +250,7 @@ list(FILTER ALL_SOURCE_FILES EXCLUDE REGEX ".*/external/.*")
|
|||||||
# Para clang-tidy, también excluir jail_audio.hpp
|
# Para clang-tidy, también excluir jail_audio.hpp
|
||||||
set(CLANG_TIDY_SOURCES ${ALL_SOURCE_FILES})
|
set(CLANG_TIDY_SOURCES ${ALL_SOURCE_FILES})
|
||||||
list(FILTER CLANG_TIDY_SOURCES EXCLUDE REGEX ".*jail_audio\\.hpp$")
|
list(FILTER CLANG_TIDY_SOURCES EXCLUDE REGEX ".*jail_audio\\.hpp$")
|
||||||
|
list(FILTER CLANG_TIDY_SOURCES EXCLUDE REGEX ".*_spv\\.h$")
|
||||||
|
|
||||||
# Targets de clang-tidy
|
# Targets de clang-tidy
|
||||||
if(CLANG_TIDY_EXE)
|
if(CLANG_TIDY_EXE)
|
||||||
@@ -233,11 +308,17 @@ set_target_properties(pack_tool PROPERTIES
|
|||||||
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/tools/pack_resources
|
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/tools/pack_resources
|
||||||
)
|
)
|
||||||
|
|
||||||
add_custom_target(pack
|
file(GLOB_RECURSE DATA_FILES "${CMAKE_SOURCE_DIR}/data/*")
|
||||||
COMMAND ${CMAKE_SOURCE_DIR}/tools/pack_resources/pack_tool
|
|
||||||
${CMAKE_SOURCE_DIR}/data
|
add_custom_command(
|
||||||
${CMAKE_SOURCE_DIR}/resources.pack
|
OUTPUT "${CMAKE_SOURCE_DIR}/resources.pack"
|
||||||
DEPENDS pack_tool
|
COMMAND $<TARGET_FILE:pack_tool>
|
||||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
"${CMAKE_SOURCE_DIR}/data"
|
||||||
|
"${CMAKE_SOURCE_DIR}/resources.pack"
|
||||||
|
DEPENDS pack_tool ${DATA_FILES}
|
||||||
|
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
|
||||||
COMMENT "Generando resources.pack desde data/..."
|
COMMENT "Generando resources.pack desde data/..."
|
||||||
)
|
)
|
||||||
|
|
||||||
|
add_custom_target(pack DEPENDS "${CMAKE_SOURCE_DIR}/resources.pack")
|
||||||
|
add_dependencies(${PROJECT_NAME} pack)
|
||||||
|
|||||||
71
Makefile
@@ -30,6 +30,14 @@ endif
|
|||||||
PACK_SOURCES := $(DIR_TOOLS)pack_resources/pack_resources.cpp source/core/resources/resource_pack.cpp
|
PACK_SOURCES := $(DIR_TOOLS)pack_resources/pack_resources.cpp source/core/resources/resource_pack.cpp
|
||||||
PACK_INCLUDES := -Isource
|
PACK_INCLUDES := -Isource
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# SHADERS
|
||||||
|
# ==============================================================================
|
||||||
|
SHADER_SCRIPT := $(DIR_ROOT)tools/shaders/compile_spirv.sh
|
||||||
|
SHADER_VERT_H := $(DIR_ROOT)source/core/rendering/sdl3gpu/postfx_vert_spv.h
|
||||||
|
SHADER_FRAG_H := $(DIR_ROOT)source/core/rendering/sdl3gpu/postfx_frag_spv.h
|
||||||
|
GLSLC := $(shell command -v glslc 2>/dev/null)
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# VERSION (extracted from defines.hpp)
|
# VERSION (extracted from defines.hpp)
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
@@ -70,15 +78,16 @@ APP_SOURCES := \
|
|||||||
source/core/input/global_inputs.cpp \
|
source/core/input/global_inputs.cpp \
|
||||||
source/core/rendering/screen.cpp \
|
source/core/rendering/screen.cpp \
|
||||||
source/core/rendering/surface.cpp \
|
source/core/rendering/surface.cpp \
|
||||||
source/core/rendering/surface_sprite.cpp \
|
source/core/rendering/sprite/sprite.cpp \
|
||||||
source/core/rendering/surface_animated_sprite.cpp \
|
source/core/rendering/sprite/animated_sprite.cpp \
|
||||||
source/core/rendering/surface_moving_sprite.cpp \
|
source/core/rendering/sprite/moving_sprite.cpp \
|
||||||
|
source/core/rendering/sprite/dissolve_sprite.cpp \
|
||||||
source/core/rendering/text.cpp \
|
source/core/rendering/text.cpp \
|
||||||
source/core/rendering/texture.cpp \
|
|
||||||
source/core/rendering/gif.cpp \
|
source/core/rendering/gif.cpp \
|
||||||
source/core/rendering/pixel_reveal.cpp \
|
source/core/rendering/pixel_reveal.cpp \
|
||||||
source/core/rendering/surface_dissolve_sprite.cpp \
|
source/core/rendering/render_info.cpp \
|
||||||
source/core/rendering/opengl/opengl_shader.cpp \
|
source/core/rendering/sdl3gpu/sdl3gpu_shader.cpp \
|
||||||
|
source/core/locale/locale.cpp \
|
||||||
source/core/resources/resource_list.cpp \
|
source/core/resources/resource_list.cpp \
|
||||||
source/core/resources/resource_cache.cpp \
|
source/core/resources/resource_cache.cpp \
|
||||||
source/core/resources/resource_helper.cpp \
|
source/core/resources/resource_helper.cpp \
|
||||||
@@ -111,6 +120,7 @@ APP_SOURCES := \
|
|||||||
source/game/scenes/ending2.cpp \
|
source/game/scenes/ending2.cpp \
|
||||||
source/game/scenes/credits.cpp \
|
source/game/scenes/credits.cpp \
|
||||||
source/game/ui/notifier.cpp \
|
source/game/ui/notifier.cpp \
|
||||||
|
source/game/ui/console.cpp \
|
||||||
source/utils/utils.cpp \
|
source/utils/utils.cpp \
|
||||||
source/utils/delta_timer.cpp
|
source/utils/delta_timer.cpp
|
||||||
|
|
||||||
@@ -133,7 +143,7 @@ ifeq ($(OS),Windows_NT)
|
|||||||
-Wl,--gc-sections -static-libstdc++ -static-libgcc \
|
-Wl,--gc-sections -static-libstdc++ -static-libgcc \
|
||||||
-Wl,-subsystem,windows -DWINDOWS_BUILD
|
-Wl,-subsystem,windows -DWINDOWS_BUILD
|
||||||
CXXFLAGS_DEBUG := -std=$(CPP_STANDARD) -Wall -g -D_DEBUG -DWINDOWS_BUILD
|
CXXFLAGS_DEBUG := -std=$(CPP_STANDARD) -Wall -g -D_DEBUG -DWINDOWS_BUILD
|
||||||
LDFLAGS := -lmingw32 -lws2_32 -lSDL3 -lopengl32
|
LDFLAGS := -lmingw32 -lws2_32 -lSDL3
|
||||||
RM := del /Q
|
RM := del /Q
|
||||||
MKDIR := mkdir
|
MKDIR := mkdir
|
||||||
else
|
else
|
||||||
@@ -147,18 +157,37 @@ else
|
|||||||
UNAME_S := $(shell uname -s)
|
UNAME_S := $(shell uname -s)
|
||||||
ifeq ($(UNAME_S),Linux)
|
ifeq ($(UNAME_S),Linux)
|
||||||
CXXFLAGS += -DLINUX_BUILD
|
CXXFLAGS += -DLINUX_BUILD
|
||||||
LDFLAGS += -lGL
|
|
||||||
endif
|
endif
|
||||||
ifeq ($(UNAME_S),Darwin)
|
ifeq ($(UNAME_S),Darwin)
|
||||||
CXXFLAGS += -Wno-deprecated -DMACOS_BUILD
|
CXXFLAGS += -DMACOS_BUILD
|
||||||
CXXFLAGS_DEBUG += -Wno-deprecated -DMACOS_BUILD
|
CXXFLAGS_DEBUG += -DMACOS_BUILD
|
||||||
LDFLAGS += -framework OpenGL
|
|
||||||
# Configurar arquitectura (por defecto arm64)
|
# Configurar arquitectura (por defecto arm64)
|
||||||
CXXFLAGS += -arch arm64
|
CXXFLAGS += -arch arm64
|
||||||
CXXFLAGS_DEBUG += -arch arm64
|
CXXFLAGS_DEBUG += -arch arm64
|
||||||
|
# Usar Apple Clang explícitamente para evitar LLVM de Homebrew
|
||||||
|
MACOS_CXX := /usr/bin/clang++
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# REGLAS PARA COMPILACIÓN DE SHADERS
|
||||||
|
# ==============================================================================
|
||||||
|
compile_shaders:
|
||||||
|
ifdef GLSLC
|
||||||
|
@echo "Compilando shaders SPIR-V..."
|
||||||
|
@$(SHADER_SCRIPT)
|
||||||
|
@echo "✓ Shaders compilados"
|
||||||
|
else
|
||||||
|
@if [ -f "$(SHADER_VERT_H)" ] && [ -f "$(SHADER_FRAG_H)" ]; then \
|
||||||
|
echo "⚠ glslc no encontrado - usando headers SPIR-V precompilados"; \
|
||||||
|
else \
|
||||||
|
echo "ERROR: glslc no encontrado y headers SPIR-V no existen."; \
|
||||||
|
echo " Instala glslc: sudo apt install glslang-tools"; \
|
||||||
|
echo " O ejecuta manualmente: tools/shaders/compile_spirv.sh"; \
|
||||||
|
exit 1; \
|
||||||
|
fi
|
||||||
|
endif
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# REGLAS PARA HERRAMIENTA DE EMPAQUETADO Y RESOURCES.PACK
|
# REGLAS PARA HERRAMIENTA DE EMPAQUETADO Y RESOURCES.PACK
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
@@ -187,7 +216,7 @@ windows:
|
|||||||
strip -s -R .comment -R .gnu.version "$(WIN_TARGET_FILE).exe" --strip-unneeded
|
strip -s -R .comment -R .gnu.version "$(WIN_TARGET_FILE).exe" --strip-unneeded
|
||||||
|
|
||||||
windows_release:
|
windows_release:
|
||||||
@$(MAKE) pack_tool
|
@$(MAKE) compile_shaders
|
||||||
@$(MAKE) resources.pack
|
@$(MAKE) resources.pack
|
||||||
@echo off
|
@echo off
|
||||||
@echo Creando release para Windows - Version: $(VERSION)
|
@echo Creando release para Windows - Version: $(VERSION)
|
||||||
@@ -230,10 +259,10 @@ macos:
|
|||||||
@GIT_HASH=$$(git rev-parse --short=7 HEAD 2>/dev/null || echo "unknown"); \
|
@GIT_HASH=$$(git rev-parse --short=7 HEAD 2>/dev/null || echo "unknown"); \
|
||||||
sed "s/@GIT_HASH@/$$GIT_HASH/g" source/version.h.in > source/version.h
|
sed "s/@GIT_HASH@/$$GIT_HASH/g" source/version.h.in > source/version.h
|
||||||
@echo "Compilando para macOS: $(TARGET_NAME)"
|
@echo "Compilando para macOS: $(TARGET_NAME)"
|
||||||
clang++ $(ALL_SOURCES) $(INCLUDES) $(CXXFLAGS) $(LDFLAGS) -o "$(TARGET_FILE)"
|
$(MACOS_CXX) $(ALL_SOURCES) $(INCLUDES) $(CXXFLAGS) $(LDFLAGS) -o "$(TARGET_FILE)"
|
||||||
|
|
||||||
macos_release:
|
macos_release:
|
||||||
@$(MAKE) pack_tool
|
@$(MAKE) compile_shaders
|
||||||
@$(MAKE) resources.pack
|
@$(MAKE) resources.pack
|
||||||
@echo "Creando release para macOS - Version: $(VERSION)"
|
@echo "Creando release para macOS - Version: $(VERSION)"
|
||||||
|
|
||||||
@@ -271,13 +300,12 @@ macos_release:
|
|||||||
sed -i '' '/<key>CFBundleVersion<\/key>/{n;s|<string>.*</string>|<string>'"$$RAW_VERSION"'</string>|;}' "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Info.plist"
|
sed -i '' '/<key>CFBundleVersion<\/key>/{n;s|<string>.*</string>|<string>'"$$RAW_VERSION"'</string>|;}' "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Info.plist"
|
||||||
|
|
||||||
# Compila la versión para procesadores Intel
|
# Compila la versión para procesadores Intel
|
||||||
clang++ $(ALL_SOURCES) $(INCLUDES) -DMACOS_BUNDLE -DRELEASE_BUILD -std=$(CPP_STANDARD) -Wall -Os -framework SDL3 -F release/macos/frameworks/SDL3.xcframework/macos-arm64_x86_64 -framework OpenGL -Wno-deprecated -ffunction-sections -fdata-sections -o "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/MacOS/$(TARGET_NAME)" -rpath @executable_path/../Frameworks/ -target x86_64-apple-macos10.15
|
$(MACOS_CXX) $(ALL_SOURCES) $(INCLUDES) -DMACOS_BUNDLE -DRELEASE_BUILD -std=$(CPP_STANDARD) -Wall -Os -framework SDL3 -F release/macos/frameworks/SDL3.xcframework/macos-arm64_x86_64 -ffunction-sections -fdata-sections -o "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/MacOS/$(TARGET_NAME)" -rpath @executable_path/../Frameworks/ -target x86_64-apple-macos10.15
|
||||||
|
|
||||||
# Firma la aplicación
|
# Firma la aplicación
|
||||||
codesign --deep --force --sign - --timestamp=none "$(RELEASE_FOLDER)/$(APP_NAME).app"
|
codesign --deep --force --sign - --timestamp=none "$(RELEASE_FOLDER)/$(APP_NAME).app"
|
||||||
|
|
||||||
# Empaqueta el .dmg de la versión Intel con create-dmg
|
# Empaqueta el .dmg de la versión Intel con create-dmg
|
||||||
$(MKDIR) "$(DIST_DIR)"
|
|
||||||
@echo "Creando DMG Intel con iconos de 96x96..."
|
@echo "Creando DMG Intel con iconos de 96x96..."
|
||||||
create-dmg \
|
create-dmg \
|
||||||
--volname "$(APP_NAME)" \
|
--volname "$(APP_NAME)" \
|
||||||
@@ -295,7 +323,7 @@ macos_release:
|
|||||||
@echo "Release Intel creado: $(MACOS_INTEL_RELEASE)"
|
@echo "Release Intel creado: $(MACOS_INTEL_RELEASE)"
|
||||||
|
|
||||||
# Compila la versión para procesadores Apple Silicon
|
# Compila la versión para procesadores Apple Silicon
|
||||||
clang++ $(ALL_SOURCES) $(INCLUDES) -DMACOS_BUNDLE -DRELEASE_BUILD -std=$(CPP_STANDARD) -Wall -Os -framework SDL3 -F release/macos/frameworks/SDL3.xcframework/macos-arm64_x86_64 -framework OpenGL -Wno-deprecated -ffunction-sections -fdata-sections -o "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/MacOS/$(TARGET_NAME)" -rpath @executable_path/../Frameworks/ -target arm64-apple-macos11
|
$(MACOS_CXX) $(ALL_SOURCES) $(INCLUDES) -DMACOS_BUNDLE -DRELEASE_BUILD -std=$(CPP_STANDARD) -Wall -Os -framework SDL3 -F release/macos/frameworks/SDL3.xcframework/macos-arm64_x86_64 -ffunction-sections -fdata-sections -o "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/MacOS/$(TARGET_NAME)" -rpath @executable_path/../Frameworks/ -target arm64-apple-macos11
|
||||||
|
|
||||||
# Firma la aplicación
|
# Firma la aplicación
|
||||||
codesign --deep --force --sign - --timestamp=none "$(RELEASE_FOLDER)/$(APP_NAME).app"
|
codesign --deep --force --sign - --timestamp=none "$(RELEASE_FOLDER)/$(APP_NAME).app"
|
||||||
@@ -332,7 +360,7 @@ linux:
|
|||||||
strip -s -R .comment -R .gnu.version "$(TARGET_FILE)" --strip-unneeded
|
strip -s -R .comment -R .gnu.version "$(TARGET_FILE)" --strip-unneeded
|
||||||
|
|
||||||
linux_release:
|
linux_release:
|
||||||
@$(MAKE) pack_tool
|
@$(MAKE) compile_shaders
|
||||||
@$(MAKE) resources.pack
|
@$(MAKE) resources.pack
|
||||||
@echo "Creando release para Linux - Version: $(VERSION)"
|
@echo "Creando release para Linux - Version: $(VERSION)"
|
||||||
|
|
||||||
@@ -341,12 +369,9 @@ linux_release:
|
|||||||
@GIT_HASH=$$(git rev-parse --short=7 HEAD 2>/dev/null || echo "unknown"); \
|
@GIT_HASH=$$(git rev-parse --short=7 HEAD 2>/dev/null || echo "unknown"); \
|
||||||
sed "s/@GIT_HASH@/$$GIT_HASH/g" source/version.h.in > source/version.h
|
sed "s/@GIT_HASH@/$$GIT_HASH/g" source/version.h.in > source/version.h
|
||||||
|
|
||||||
# Elimina carpetas previas
|
# Elimina carpeta temporal previa y la recrea (crea dist/ si no existe)
|
||||||
$(RMDIR) "$(RELEASE_FOLDER)"
|
$(RMDIR) "$(RELEASE_FOLDER)"
|
||||||
|
|
||||||
# Crea la carpeta temporal para realizar el lanzamiento
|
|
||||||
$(MKDIR) "$(RELEASE_FOLDER)"
|
$(MKDIR) "$(RELEASE_FOLDER)"
|
||||||
$(MKDIR) "$(DIST_DIR)"
|
|
||||||
|
|
||||||
# Copia ficheros
|
# Copia ficheros
|
||||||
cp resources.pack "$(RELEASE_FOLDER)"
|
cp resources.pack "$(RELEASE_FOLDER)"
|
||||||
@@ -390,4 +415,4 @@ help:
|
|||||||
|
|
||||||
FORCE:
|
FORCE:
|
||||||
|
|
||||||
.PHONY: windows windows_release macos macos_release linux linux_release pack_tool resources.pack show_version help
|
.PHONY: windows windows_release macos macos_release linux linux_release compile_shaders pack_tool resources.pack show_version help
|
||||||
|
|||||||
@@ -7,23 +7,23 @@ assets:
|
|||||||
- type: BITMAP
|
- type: BITMAP
|
||||||
path: ${PREFIX}/data/font/smb2.gif
|
path: ${PREFIX}/data/font/smb2.gif
|
||||||
- type: FONT
|
- type: FONT
|
||||||
path: ${PREFIX}/data/font/smb2.txt
|
path: ${PREFIX}/data/font/smb2.fnt
|
||||||
- type: BITMAP
|
- type: BITMAP
|
||||||
path: ${PREFIX}/data/font/aseprite.gif
|
path: ${PREFIX}/data/font/aseprite.gif
|
||||||
- type: FONT
|
- type: FONT
|
||||||
path: ${PREFIX}/data/font/aseprite.txt
|
path: ${PREFIX}/data/font/aseprite.fnt
|
||||||
- type: BITMAP
|
- type: BITMAP
|
||||||
path: ${PREFIX}/data/font/gauntlet.gif
|
path: ${PREFIX}/data/font/gauntlet.gif
|
||||||
- type: FONT
|
- type: FONT
|
||||||
path: ${PREFIX}/data/font/gauntlet.txt
|
path: ${PREFIX}/data/font/gauntlet.fnt
|
||||||
- type: BITMAP
|
- type: BITMAP
|
||||||
path: ${PREFIX}/data/font/subatomic.gif
|
path: ${PREFIX}/data/font/subatomic.gif
|
||||||
- type: FONT
|
- type: FONT
|
||||||
path: ${PREFIX}/data/font/subatomic.txt
|
path: ${PREFIX}/data/font/subatomic.fnt
|
||||||
- type: BITMAP
|
- type: BITMAP
|
||||||
path: ${PREFIX}/data/font/8bithud.gif
|
path: ${PREFIX}/data/font/8bithud.gif
|
||||||
- type: FONT
|
- type: FONT
|
||||||
path: ${PREFIX}/data/font/8bithud.txt
|
path: ${PREFIX}/data/font/8bithud.fnt
|
||||||
|
|
||||||
# PALETTES
|
# PALETTES
|
||||||
palettes:
|
palettes:
|
||||||
@@ -56,6 +56,13 @@ assets:
|
|||||||
- type: PALETTE
|
- type: PALETTE
|
||||||
path: ${PREFIX}/data/palette/steam-lords.pal
|
path: ${PREFIX}/data/palette/steam-lords.pal
|
||||||
|
|
||||||
|
# LOCALE
|
||||||
|
locale:
|
||||||
|
- type: DATA
|
||||||
|
path: ${PREFIX}/data/locale/en.yaml
|
||||||
|
- type: DATA
|
||||||
|
path: ${PREFIX}/data/locale/ca.yaml
|
||||||
|
|
||||||
# INPUT
|
# INPUT
|
||||||
input:
|
input:
|
||||||
- type: DATA
|
- type: DATA
|
||||||
@@ -67,6 +74,10 @@ assets:
|
|||||||
path: ${SYSTEM_FOLDER}/config.yaml
|
path: ${SYSTEM_FOLDER}/config.yaml
|
||||||
required: false
|
required: false
|
||||||
absolute: true
|
absolute: true
|
||||||
|
- type: DATA
|
||||||
|
path: ${SYSTEM_FOLDER}/debug.yaml
|
||||||
|
required: false
|
||||||
|
absolute: true
|
||||||
- type: DATA
|
- type: DATA
|
||||||
path: ${SYSTEM_FOLDER}/stats_buffer.csv
|
path: ${SYSTEM_FOLDER}/stats_buffer.csv
|
||||||
required: false
|
required: false
|
||||||
@@ -80,7 +91,11 @@ assets:
|
|||||||
required: false
|
required: false
|
||||||
absolute: true
|
absolute: true
|
||||||
- type: DATA
|
- type: DATA
|
||||||
path: ${SYSTEM_FOLDER}/postfx.yaml
|
path: ${SYSTEM_FOLDER}/shaders/postfx.yaml
|
||||||
|
required: false
|
||||||
|
absolute: true
|
||||||
|
- type: DATA
|
||||||
|
path: ${SYSTEM_FOLDER}/shaders/crtpi.yaml
|
||||||
required: false
|
required: false
|
||||||
absolute: true
|
absolute: true
|
||||||
|
|
||||||
|
|||||||
132
data/font/8bithud.fnt
Normal file
@@ -0,0 +1,132 @@
|
|||||||
|
# Font: 8bithud — generado desde 8-bit-hud.ttf size 5
|
||||||
|
# Generado con tools/font_gen/font_gen.py
|
||||||
|
|
||||||
|
box_width 8
|
||||||
|
box_height 8
|
||||||
|
columns 15
|
||||||
|
|
||||||
|
# codepoint_decimal ancho_visual
|
||||||
|
32 3 # U+0020
|
||||||
|
33 2 # !
|
||||||
|
34 5 # "
|
||||||
|
35 6 # #
|
||||||
|
36 6 # $
|
||||||
|
37 6 # %
|
||||||
|
38 6 # &
|
||||||
|
39 2 # '
|
||||||
|
40 3 # (
|
||||||
|
41 3 # )
|
||||||
|
42 4 # *
|
||||||
|
43 3 # +
|
||||||
|
44 2 # ,
|
||||||
|
45 3 # -
|
||||||
|
46 2 # .
|
||||||
|
47 4 # /
|
||||||
|
48 6 # 0
|
||||||
|
49 3 # 1
|
||||||
|
50 6 # 2
|
||||||
|
51 6 # 3
|
||||||
|
52 6 # 4
|
||||||
|
53 6 # 5
|
||||||
|
54 6 # 6
|
||||||
|
55 6 # 7
|
||||||
|
56 6 # 8
|
||||||
|
57 6 # 9
|
||||||
|
58 2 # :
|
||||||
|
59 2 # ;
|
||||||
|
60 4 # <
|
||||||
|
61 3 # =
|
||||||
|
62 4 # >
|
||||||
|
63 6 # ?
|
||||||
|
64 8 # @
|
||||||
|
65 6 # A
|
||||||
|
66 6 # B
|
||||||
|
67 6 # C
|
||||||
|
68 6 # D
|
||||||
|
69 6 # E
|
||||||
|
70 6 # F
|
||||||
|
71 6 # G
|
||||||
|
72 6 # H
|
||||||
|
73 6 # I
|
||||||
|
74 6 # J
|
||||||
|
75 6 # K
|
||||||
|
76 6 # L
|
||||||
|
77 6 # M
|
||||||
|
78 6 # N
|
||||||
|
79 6 # O
|
||||||
|
80 6 # P
|
||||||
|
81 6 # Q
|
||||||
|
82 6 # R
|
||||||
|
83 6 # S
|
||||||
|
84 6 # T
|
||||||
|
85 6 # U
|
||||||
|
86 5 # V
|
||||||
|
87 6 # W
|
||||||
|
88 6 # X
|
||||||
|
89 6 # Y
|
||||||
|
90 6 # Z
|
||||||
|
91 3 # [
|
||||||
|
92 4 # \
|
||||||
|
93 3 # ]
|
||||||
|
94 4 # ^
|
||||||
|
95 6 # _
|
||||||
|
96 2 # `
|
||||||
|
97 5 # a
|
||||||
|
98 5 # b
|
||||||
|
99 5 # c
|
||||||
|
100 5 # d
|
||||||
|
101 5 # e
|
||||||
|
102 5 # f
|
||||||
|
103 5 # g
|
||||||
|
104 5 # h
|
||||||
|
105 4 # i
|
||||||
|
106 5 # j
|
||||||
|
107 5 # k
|
||||||
|
108 5 # l
|
||||||
|
109 6 # m
|
||||||
|
110 5 # n
|
||||||
|
111 5 # o
|
||||||
|
112 5 # p
|
||||||
|
113 5 # q
|
||||||
|
114 5 # r
|
||||||
|
115 5 # s
|
||||||
|
116 4 # t
|
||||||
|
117 5 # u
|
||||||
|
118 5 # v
|
||||||
|
119 6 # w
|
||||||
|
120 4 # x
|
||||||
|
121 4 # y
|
||||||
|
122 5 # z
|
||||||
|
123 4 # {
|
||||||
|
124 1 # |
|
||||||
|
125 4 # }
|
||||||
|
126 4 # ~
|
||||||
|
192 6 # À
|
||||||
|
193 6 # Á
|
||||||
|
200 6 # È
|
||||||
|
201 6 # É
|
||||||
|
204 6 # Ì
|
||||||
|
205 6 # Í
|
||||||
|
210 6 # Ò
|
||||||
|
211 6 # Ó
|
||||||
|
219 6 # Ù
|
||||||
|
218 6 # Ú
|
||||||
|
209 6 # Ñ
|
||||||
|
199 6 # Ç
|
||||||
|
224 5 # à
|
||||||
|
225 5 # á
|
||||||
|
232 5 # è
|
||||||
|
233 5 # é
|
||||||
|
236 4 # ì
|
||||||
|
237 4 # í
|
||||||
|
242 5 # ò
|
||||||
|
243 5 # ó
|
||||||
|
249 5 # ù
|
||||||
|
250 5 # ú
|
||||||
|
241 5 # ñ
|
||||||
|
231 5 # ç
|
||||||
|
161 2 # ¡
|
||||||
|
191 6 # ¿
|
||||||
|
171 4 # «
|
||||||
|
187 4 # »
|
||||||
|
183 2 # ·
|
||||||
|
Before Width: | Height: | Size: 680 B After Width: | Height: | Size: 837 B |
@@ -1,194 +0,0 @@
|
|||||||
# box width
|
|
||||||
8
|
|
||||||
# box height
|
|
||||||
8
|
|
||||||
# 32 espacio ( )
|
|
||||||
2
|
|
||||||
# 33 !
|
|
||||||
2
|
|
||||||
# 34 "
|
|
||||||
5
|
|
||||||
# 35 #
|
|
||||||
6
|
|
||||||
# 36 $
|
|
||||||
6
|
|
||||||
# 37 %
|
|
||||||
6
|
|
||||||
# 38 &
|
|
||||||
6
|
|
||||||
# 39 '
|
|
||||||
2
|
|
||||||
# 40 (
|
|
||||||
3
|
|
||||||
# 41 )
|
|
||||||
3
|
|
||||||
# 42 *
|
|
||||||
4
|
|
||||||
# 43 +
|
|
||||||
3
|
|
||||||
# 44 ,
|
|
||||||
2
|
|
||||||
# 45 -
|
|
||||||
3
|
|
||||||
# 46 .
|
|
||||||
2
|
|
||||||
# 47 /
|
|
||||||
4
|
|
||||||
# 48 0
|
|
||||||
6
|
|
||||||
# 49 1
|
|
||||||
6
|
|
||||||
# 50 2
|
|
||||||
6
|
|
||||||
# 51 3
|
|
||||||
6
|
|
||||||
# 52 4
|
|
||||||
6
|
|
||||||
# 53 5
|
|
||||||
6
|
|
||||||
# 54 6
|
|
||||||
6
|
|
||||||
# 55 7
|
|
||||||
6
|
|
||||||
# 56 8
|
|
||||||
6
|
|
||||||
# 57 9
|
|
||||||
6
|
|
||||||
# 58 :
|
|
||||||
2
|
|
||||||
# 59 ;
|
|
||||||
2
|
|
||||||
# 60 <
|
|
||||||
4
|
|
||||||
# 61 =
|
|
||||||
3
|
|
||||||
# 62 >
|
|
||||||
4
|
|
||||||
# 63 ?
|
|
||||||
6
|
|
||||||
# 64 @
|
|
||||||
8
|
|
||||||
# 65 A
|
|
||||||
6
|
|
||||||
# 66 B
|
|
||||||
6
|
|
||||||
# 67 C
|
|
||||||
6
|
|
||||||
# 68 D
|
|
||||||
6
|
|
||||||
# 69 E
|
|
||||||
6
|
|
||||||
# 70 F
|
|
||||||
6
|
|
||||||
# 71 G
|
|
||||||
6
|
|
||||||
# 72 H
|
|
||||||
6
|
|
||||||
# 73 I
|
|
||||||
6
|
|
||||||
# 74 J
|
|
||||||
6
|
|
||||||
# 75 K
|
|
||||||
6
|
|
||||||
# 76 L
|
|
||||||
6
|
|
||||||
# 77 M
|
|
||||||
6
|
|
||||||
# 78 N
|
|
||||||
6
|
|
||||||
# 79 O
|
|
||||||
6
|
|
||||||
# 80 P
|
|
||||||
6
|
|
||||||
# 81 Q
|
|
||||||
6
|
|
||||||
# 82 R
|
|
||||||
6
|
|
||||||
# 83 S
|
|
||||||
6
|
|
||||||
# 84 T
|
|
||||||
6
|
|
||||||
# 85 U
|
|
||||||
6
|
|
||||||
# 86 V
|
|
||||||
5
|
|
||||||
# 87 W
|
|
||||||
6
|
|
||||||
# 88 X
|
|
||||||
6
|
|
||||||
# 89 Y
|
|
||||||
6
|
|
||||||
# 90 Z
|
|
||||||
6
|
|
||||||
# 91 [
|
|
||||||
3
|
|
||||||
# 92 \
|
|
||||||
5
|
|
||||||
# 93 ]
|
|
||||||
3
|
|
||||||
# 94 ^
|
|
||||||
4
|
|
||||||
# 95 _
|
|
||||||
6
|
|
||||||
# 96 `
|
|
||||||
2
|
|
||||||
# 97 a
|
|
||||||
5
|
|
||||||
# 98 b
|
|
||||||
5
|
|
||||||
# 99 c
|
|
||||||
5
|
|
||||||
# 100 d
|
|
||||||
5
|
|
||||||
# 101 e
|
|
||||||
5
|
|
||||||
# 102 f
|
|
||||||
5
|
|
||||||
# 103 g
|
|
||||||
5
|
|
||||||
# 104 h
|
|
||||||
5
|
|
||||||
# 105 i
|
|
||||||
4
|
|
||||||
# 106 j
|
|
||||||
5
|
|
||||||
# 107 k
|
|
||||||
5
|
|
||||||
# 108 l
|
|
||||||
5
|
|
||||||
# 109 m
|
|
||||||
6
|
|
||||||
# 110 n
|
|
||||||
5
|
|
||||||
# 111 o
|
|
||||||
5
|
|
||||||
# 112 p
|
|
||||||
5
|
|
||||||
# 113 q
|
|
||||||
5
|
|
||||||
# 114 r
|
|
||||||
5
|
|
||||||
# 115 s
|
|
||||||
5
|
|
||||||
# 116 t
|
|
||||||
4
|
|
||||||
# 117 u
|
|
||||||
5
|
|
||||||
# 118 v
|
|
||||||
5
|
|
||||||
# 119 w
|
|
||||||
6
|
|
||||||
# 120 x
|
|
||||||
4
|
|
||||||
# 121 y
|
|
||||||
4
|
|
||||||
# 122 z
|
|
||||||
5
|
|
||||||
# 123 {
|
|
||||||
3
|
|
||||||
# 124 |
|
|
||||||
2
|
|
||||||
# 125 }
|
|
||||||
3
|
|
||||||
# 126 ~
|
|
||||||
3
|
|
||||||
134
data/font/aseprite.fnt
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
# Font: aseprite — generado desde aseprite_font.gif
|
||||||
|
# Generado con tools/font_gen/font_gen.py
|
||||||
|
|
||||||
|
box_width 10
|
||||||
|
box_height 7
|
||||||
|
columns 16
|
||||||
|
cell_spacing 1
|
||||||
|
row_spacing 4
|
||||||
|
|
||||||
|
# codepoint_decimal ancho_visual
|
||||||
|
32 3 # U+0020
|
||||||
|
33 1 # !
|
||||||
|
34 3 # "
|
||||||
|
35 5 # #
|
||||||
|
36 4 # $
|
||||||
|
37 5 # %
|
||||||
|
38 5 # &
|
||||||
|
39 2 # '
|
||||||
|
40 2 # (
|
||||||
|
41 2 # )
|
||||||
|
42 5 # *
|
||||||
|
43 5 # +
|
||||||
|
44 2 # ,
|
||||||
|
45 3 # -
|
||||||
|
46 1 # .
|
||||||
|
47 3 # /
|
||||||
|
48 4 # 0
|
||||||
|
49 2 # 1
|
||||||
|
50 4 # 2
|
||||||
|
51 4 # 3
|
||||||
|
52 4 # 4
|
||||||
|
53 4 # 5
|
||||||
|
54 4 # 6
|
||||||
|
55 4 # 7
|
||||||
|
56 4 # 8
|
||||||
|
57 4 # 9
|
||||||
|
58 1 # :
|
||||||
|
59 2 # ;
|
||||||
|
60 3 # <
|
||||||
|
61 4 # =
|
||||||
|
62 3 # >
|
||||||
|
63 4 # ?
|
||||||
|
64 8 # @
|
||||||
|
65 4 # A
|
||||||
|
66 4 # B
|
||||||
|
67 4 # C
|
||||||
|
68 4 # D
|
||||||
|
69 4 # E
|
||||||
|
70 4 # F
|
||||||
|
71 4 # G
|
||||||
|
72 4 # H
|
||||||
|
73 1 # I
|
||||||
|
74 2 # J
|
||||||
|
75 4 # K
|
||||||
|
76 4 # L
|
||||||
|
77 5 # M
|
||||||
|
78 4 # N
|
||||||
|
79 5 # O
|
||||||
|
80 4 # P
|
||||||
|
81 5 # Q
|
||||||
|
82 4 # R
|
||||||
|
83 4 # S
|
||||||
|
84 5 # T
|
||||||
|
85 4 # U
|
||||||
|
86 5 # V
|
||||||
|
87 7 # W
|
||||||
|
88 5 # X
|
||||||
|
89 5 # Y
|
||||||
|
90 4 # Z
|
||||||
|
91 2 # [
|
||||||
|
92 3 # \
|
||||||
|
93 2 # ]
|
||||||
|
94 5 # ^
|
||||||
|
95 5 # _
|
||||||
|
96 3 # `
|
||||||
|
97 4 # a
|
||||||
|
98 4 # b
|
||||||
|
99 4 # c
|
||||||
|
100 4 # d
|
||||||
|
101 4 # e
|
||||||
|
102 2 # f
|
||||||
|
103 4 # g
|
||||||
|
104 4 # h
|
||||||
|
105 1 # i
|
||||||
|
106 2 # j
|
||||||
|
107 4 # k
|
||||||
|
108 1 # l
|
||||||
|
109 7 # m
|
||||||
|
110 4 # n
|
||||||
|
111 4 # o
|
||||||
|
112 4 # p
|
||||||
|
113 4 # q
|
||||||
|
114 3 # r
|
||||||
|
115 3 # s
|
||||||
|
116 2 # t
|
||||||
|
117 4 # u
|
||||||
|
118 4 # v
|
||||||
|
119 5 # w
|
||||||
|
120 5 # x
|
||||||
|
121 4 # y
|
||||||
|
122 4 # z
|
||||||
|
123 3 # {
|
||||||
|
124 1 # |
|
||||||
|
125 3 # }
|
||||||
|
126 4 # ~
|
||||||
|
192 5 # À
|
||||||
|
193 5 # Á
|
||||||
|
200 5 # È
|
||||||
|
201 5 # É
|
||||||
|
205 5 # Í
|
||||||
|
207 5 # Ï
|
||||||
|
210 5 # Ò
|
||||||
|
211 5 # Ó
|
||||||
|
218 5 # Ú
|
||||||
|
220 5 # Ü
|
||||||
|
209 5 # Ñ
|
||||||
|
199 5 # Ç
|
||||||
|
224 5 # à
|
||||||
|
225 5 # á
|
||||||
|
232 5 # è
|
||||||
|
233 5 # é
|
||||||
|
237 5 # í
|
||||||
|
239 5 # ï
|
||||||
|
242 5 # ò
|
||||||
|
243 5 # ó
|
||||||
|
250 5 # ú
|
||||||
|
252 5 # ü
|
||||||
|
241 5 # ñ
|
||||||
|
231 5 # ç
|
||||||
|
161 5 # ¡
|
||||||
|
191 5 # ¿
|
||||||
|
171 5 # «
|
||||||
|
187 5 # »
|
||||||
|
183 5 # ·
|
||||||
|
Before Width: | Height: | Size: 640 B After Width: | Height: | Size: 3.9 KiB |
@@ -1,194 +0,0 @@
|
|||||||
# box width
|
|
||||||
8
|
|
||||||
# box height
|
|
||||||
8
|
|
||||||
# 32 espacio ( )
|
|
||||||
3
|
|
||||||
# 33 !
|
|
||||||
1
|
|
||||||
# 34 "
|
|
||||||
3
|
|
||||||
# 35 #
|
|
||||||
3
|
|
||||||
# 36 $
|
|
||||||
4
|
|
||||||
# 37 %
|
|
||||||
5
|
|
||||||
# 38 &
|
|
||||||
5
|
|
||||||
# 39 '
|
|
||||||
2
|
|
||||||
# 40 (
|
|
||||||
2
|
|
||||||
# 41 )
|
|
||||||
2
|
|
||||||
# 42 *
|
|
||||||
5
|
|
||||||
# 43 +
|
|
||||||
5
|
|
||||||
# 44 ,
|
|
||||||
3
|
|
||||||
# 45 -
|
|
||||||
3
|
|
||||||
# 46 .
|
|
||||||
1
|
|
||||||
# 47 /
|
|
||||||
4
|
|
||||||
# 48 0
|
|
||||||
4
|
|
||||||
# 49 1
|
|
||||||
2
|
|
||||||
# 50 2
|
|
||||||
4
|
|
||||||
# 51 3
|
|
||||||
4
|
|
||||||
# 52 4
|
|
||||||
4
|
|
||||||
# 53 5
|
|
||||||
4
|
|
||||||
# 54 6
|
|
||||||
4
|
|
||||||
# 55 7
|
|
||||||
4
|
|
||||||
# 56 8
|
|
||||||
4
|
|
||||||
# 57 9
|
|
||||||
4
|
|
||||||
# 58 :
|
|
||||||
1
|
|
||||||
# 59 ;
|
|
||||||
1
|
|
||||||
# 60 <
|
|
||||||
3
|
|
||||||
# 61 =
|
|
||||||
4
|
|
||||||
# 62 >
|
|
||||||
4
|
|
||||||
# 63 ?
|
|
||||||
4
|
|
||||||
# 64 @
|
|
||||||
7
|
|
||||||
# 65 A
|
|
||||||
4
|
|
||||||
# 66 B
|
|
||||||
4
|
|
||||||
# 67 C
|
|
||||||
4
|
|
||||||
# 68 D
|
|
||||||
4
|
|
||||||
# 69 E
|
|
||||||
4
|
|
||||||
# 70 F
|
|
||||||
4
|
|
||||||
# 71 G
|
|
||||||
4
|
|
||||||
# 72 H
|
|
||||||
4
|
|
||||||
# 73 I
|
|
||||||
2
|
|
||||||
# 74 J
|
|
||||||
2
|
|
||||||
# 75 K
|
|
||||||
4
|
|
||||||
# 76 L
|
|
||||||
4
|
|
||||||
# 77 M
|
|
||||||
5
|
|
||||||
# 78 N
|
|
||||||
4
|
|
||||||
# 79 O
|
|
||||||
5
|
|
||||||
# 80 P
|
|
||||||
4
|
|
||||||
# 81 Q
|
|
||||||
5
|
|
||||||
# 82 R
|
|
||||||
4
|
|
||||||
# 83 S
|
|
||||||
4
|
|
||||||
# 84 T
|
|
||||||
5
|
|
||||||
# 85 U
|
|
||||||
4
|
|
||||||
# 86 V
|
|
||||||
5
|
|
||||||
# 87 W
|
|
||||||
7
|
|
||||||
# 88 X
|
|
||||||
5
|
|
||||||
# 89 Y
|
|
||||||
5
|
|
||||||
# 90 Z
|
|
||||||
4
|
|
||||||
# 91 [
|
|
||||||
2
|
|
||||||
# 92 \
|
|
||||||
3
|
|
||||||
# 93 ]
|
|
||||||
2
|
|
||||||
# 94 ^
|
|
||||||
5
|
|
||||||
# 95 _
|
|
||||||
5
|
|
||||||
# 96 `
|
|
||||||
3
|
|
||||||
# 97 a
|
|
||||||
4
|
|
||||||
# 98 b
|
|
||||||
4
|
|
||||||
# 99 c
|
|
||||||
4
|
|
||||||
# 100 d
|
|
||||||
4
|
|
||||||
# 101 e
|
|
||||||
4
|
|
||||||
# 102 f
|
|
||||||
2
|
|
||||||
# 103 g
|
|
||||||
4
|
|
||||||
# 104 h
|
|
||||||
4
|
|
||||||
# 105 i
|
|
||||||
1
|
|
||||||
# 106 j
|
|
||||||
2
|
|
||||||
# 107 k
|
|
||||||
4
|
|
||||||
# 108 l
|
|
||||||
1
|
|
||||||
# 109 m
|
|
||||||
7
|
|
||||||
# 110 n
|
|
||||||
4
|
|
||||||
# 111 o
|
|
||||||
4
|
|
||||||
# 112 p
|
|
||||||
4
|
|
||||||
# 113 q
|
|
||||||
4
|
|
||||||
# 114 r
|
|
||||||
3
|
|
||||||
# 115 s
|
|
||||||
3
|
|
||||||
# 116 t
|
|
||||||
2
|
|
||||||
# 117 u
|
|
||||||
4
|
|
||||||
# 118 v
|
|
||||||
4
|
|
||||||
# 119 w
|
|
||||||
5
|
|
||||||
# 120 x
|
|
||||||
5
|
|
||||||
# 121 y
|
|
||||||
4
|
|
||||||
# 122 z
|
|
||||||
4
|
|
||||||
# 123 {
|
|
||||||
3
|
|
||||||
# 124 |
|
|
||||||
3
|
|
||||||
# 125 }
|
|
||||||
3
|
|
||||||
# 126 ~
|
|
||||||
5
|
|
||||||
128
data/font/gauntlet.fnt
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
# Font: gauntlet — generado desde Gauntlet.ttf size 7
|
||||||
|
# Generado con tools/font_gen/font_gen.py
|
||||||
|
|
||||||
|
box_width 8
|
||||||
|
box_height 8
|
||||||
|
columns 15
|
||||||
|
|
||||||
|
# codepoint_decimal ancho_visual
|
||||||
|
32 3 # U+0020
|
||||||
|
33 2 # !
|
||||||
|
34 5 # "
|
||||||
|
35 6 # #
|
||||||
|
36 6 # $
|
||||||
|
37 7 # %
|
||||||
|
38 7 # &
|
||||||
|
39 2 # '
|
||||||
|
40 4 # (
|
||||||
|
41 4 # )
|
||||||
|
42 6 # *
|
||||||
|
43 8 # +
|
||||||
|
44 2 # ,
|
||||||
|
45 7 # -
|
||||||
|
46 2 # .
|
||||||
|
47 7 # /
|
||||||
|
48 7 # 0
|
||||||
|
49 6 # 1
|
||||||
|
50 6 # 2
|
||||||
|
51 6 # 3
|
||||||
|
52 7 # 4
|
||||||
|
53 6 # 5
|
||||||
|
54 6 # 6
|
||||||
|
55 6 # 7
|
||||||
|
56 6 # 8
|
||||||
|
57 6 # 9
|
||||||
|
58 2 # :
|
||||||
|
59 3 # ;
|
||||||
|
60 5 # <
|
||||||
|
61 6 # =
|
||||||
|
62 5 # >
|
||||||
|
63 6 # ?
|
||||||
|
64 6 # @
|
||||||
|
65 6 # A
|
||||||
|
66 7 # B
|
||||||
|
67 7 # C
|
||||||
|
68 7 # D
|
||||||
|
69 7 # E
|
||||||
|
70 7 # F
|
||||||
|
71 7 # G
|
||||||
|
72 6 # H
|
||||||
|
73 6 # I
|
||||||
|
74 7 # J
|
||||||
|
75 7 # K
|
||||||
|
76 7 # L
|
||||||
|
77 7 # M
|
||||||
|
78 7 # N
|
||||||
|
79 7 # O
|
||||||
|
80 7 # P
|
||||||
|
81 7 # Q
|
||||||
|
82 7 # R
|
||||||
|
83 6 # S
|
||||||
|
84 6 # T
|
||||||
|
85 6 # U
|
||||||
|
86 6 # V
|
||||||
|
87 7 # W
|
||||||
|
88 7 # X
|
||||||
|
89 6 # Y
|
||||||
|
90 7 # Z
|
||||||
|
91 8 # [
|
||||||
|
92 3 # \
|
||||||
|
93 7 # ]
|
||||||
|
94 7 # ^
|
||||||
|
95 8 # _
|
||||||
|
97 6 # a
|
||||||
|
98 7 # b
|
||||||
|
99 7 # c
|
||||||
|
100 7 # d
|
||||||
|
101 7 # e
|
||||||
|
102 7 # f
|
||||||
|
103 7 # g
|
||||||
|
104 6 # h
|
||||||
|
105 6 # i
|
||||||
|
106 7 # j
|
||||||
|
107 7 # k
|
||||||
|
108 7 # l
|
||||||
|
109 7 # m
|
||||||
|
110 7 # n
|
||||||
|
111 7 # o
|
||||||
|
112 7 # p
|
||||||
|
113 7 # q
|
||||||
|
114 7 # r
|
||||||
|
115 6 # s
|
||||||
|
116 6 # t
|
||||||
|
117 6 # u
|
||||||
|
118 6 # v
|
||||||
|
119 7 # w
|
||||||
|
120 7 # x
|
||||||
|
121 6 # y
|
||||||
|
122 7 # z
|
||||||
|
126 6 # ~
|
||||||
|
192 6 # À
|
||||||
|
193 6 # Á
|
||||||
|
200 7 # È
|
||||||
|
201 7 # É
|
||||||
|
204 6 # Ì
|
||||||
|
205 6 # Í
|
||||||
|
210 7 # Ò
|
||||||
|
211 7 # Ó
|
||||||
|
217 6 # Ù
|
||||||
|
218 6 # Ú
|
||||||
|
209 7 # Ñ
|
||||||
|
199 7 # Ç
|
||||||
|
224 6 # à
|
||||||
|
225 6 # á
|
||||||
|
232 7 # è
|
||||||
|
233 7 # é
|
||||||
|
236 6 # ì
|
||||||
|
237 6 # í
|
||||||
|
242 7 # ò
|
||||||
|
243 7 # ó
|
||||||
|
249 6 # ù
|
||||||
|
250 6 # ú
|
||||||
|
241 7 # ñ
|
||||||
|
231 7 # ç
|
||||||
|
161 2 # ¡
|
||||||
|
191 6 # ¿
|
||||||
|
171 5 # «
|
||||||
|
187 5 # »
|
||||||
|
183 2 # ·
|
||||||
|
Before Width: | Height: | Size: 810 B After Width: | Height: | Size: 959 B |
@@ -1,194 +0,0 @@
|
|||||||
# box width
|
|
||||||
8
|
|
||||||
# box height
|
|
||||||
8
|
|
||||||
# 32 espacio ( )
|
|
||||||
6
|
|
||||||
# 33 !
|
|
||||||
2
|
|
||||||
# 34 "
|
|
||||||
5
|
|
||||||
# 35 #
|
|
||||||
6
|
|
||||||
# 36 $
|
|
||||||
6
|
|
||||||
# 37 %
|
|
||||||
7
|
|
||||||
# 38 &
|
|
||||||
7
|
|
||||||
# 39 '
|
|
||||||
2
|
|
||||||
# 40 (
|
|
||||||
4
|
|
||||||
# 41 )
|
|
||||||
4
|
|
||||||
# 42 *
|
|
||||||
6
|
|
||||||
# 43 +
|
|
||||||
8
|
|
||||||
# 44 ,
|
|
||||||
2
|
|
||||||
# 45 -
|
|
||||||
7
|
|
||||||
# 46 .
|
|
||||||
2
|
|
||||||
# 47 /
|
|
||||||
7
|
|
||||||
# 48 0
|
|
||||||
7
|
|
||||||
# 49 1
|
|
||||||
6
|
|
||||||
# 50 2
|
|
||||||
6
|
|
||||||
# 51 3
|
|
||||||
6
|
|
||||||
# 52 4
|
|
||||||
7
|
|
||||||
# 53 5
|
|
||||||
6
|
|
||||||
# 54 6
|
|
||||||
6
|
|
||||||
# 55 7
|
|
||||||
6
|
|
||||||
# 56 8
|
|
||||||
6
|
|
||||||
# 57 9
|
|
||||||
6
|
|
||||||
# 58 :
|
|
||||||
2
|
|
||||||
# 59 ;
|
|
||||||
2
|
|
||||||
# 60 <
|
|
||||||
5
|
|
||||||
# 61 =
|
|
||||||
6
|
|
||||||
# 62 >
|
|
||||||
5
|
|
||||||
# 63 ?
|
|
||||||
6
|
|
||||||
# 64 @
|
|
||||||
6
|
|
||||||
# 65 A
|
|
||||||
6
|
|
||||||
# 66 B
|
|
||||||
7
|
|
||||||
# 67 C
|
|
||||||
7
|
|
||||||
# 68 D
|
|
||||||
7
|
|
||||||
# 69 E
|
|
||||||
7
|
|
||||||
# 70 F
|
|
||||||
7
|
|
||||||
# 71 G
|
|
||||||
7
|
|
||||||
# 72 H
|
|
||||||
6
|
|
||||||
# 73 I
|
|
||||||
6
|
|
||||||
# 74 J
|
|
||||||
7
|
|
||||||
# 75 K
|
|
||||||
7
|
|
||||||
# 76 L
|
|
||||||
7
|
|
||||||
# 77 M
|
|
||||||
7
|
|
||||||
# 78 N
|
|
||||||
7
|
|
||||||
# 79 O
|
|
||||||
7
|
|
||||||
# 80 P
|
|
||||||
7
|
|
||||||
# 81 Q
|
|
||||||
7
|
|
||||||
# 82 R
|
|
||||||
7
|
|
||||||
# 83 S
|
|
||||||
6
|
|
||||||
# 84 T
|
|
||||||
6
|
|
||||||
# 85 U
|
|
||||||
6
|
|
||||||
# 86 V
|
|
||||||
6
|
|
||||||
# 87 W
|
|
||||||
7
|
|
||||||
# 88 X
|
|
||||||
7
|
|
||||||
# 89 Y
|
|
||||||
6
|
|
||||||
# 90 Z
|
|
||||||
7
|
|
||||||
# 91 [
|
|
||||||
8
|
|
||||||
# 92 \
|
|
||||||
3
|
|
||||||
# 93 ]
|
|
||||||
7
|
|
||||||
# 94 ^
|
|
||||||
7
|
|
||||||
# 95 _
|
|
||||||
8
|
|
||||||
# 96 `
|
|
||||||
0
|
|
||||||
# 97 a
|
|
||||||
6
|
|
||||||
# 98 b
|
|
||||||
7
|
|
||||||
# 99 c
|
|
||||||
7
|
|
||||||
# 100 d
|
|
||||||
7
|
|
||||||
# 101 e
|
|
||||||
7
|
|
||||||
# 102 f
|
|
||||||
7
|
|
||||||
# 103 g
|
|
||||||
7
|
|
||||||
# 104 h
|
|
||||||
6
|
|
||||||
# 105 i
|
|
||||||
6
|
|
||||||
# 106 j
|
|
||||||
7
|
|
||||||
# 107 k
|
|
||||||
7
|
|
||||||
# 108 l
|
|
||||||
7
|
|
||||||
# 109 m
|
|
||||||
7
|
|
||||||
# 110 n
|
|
||||||
7
|
|
||||||
# 111 o
|
|
||||||
7
|
|
||||||
# 112 p
|
|
||||||
7
|
|
||||||
# 113 q
|
|
||||||
7
|
|
||||||
# 114 r
|
|
||||||
7
|
|
||||||
# 115 s
|
|
||||||
6
|
|
||||||
# 116 t
|
|
||||||
6
|
|
||||||
# 117 u
|
|
||||||
6
|
|
||||||
# 118 v
|
|
||||||
6
|
|
||||||
# 119 w
|
|
||||||
7
|
|
||||||
# 120 x
|
|
||||||
7
|
|
||||||
# 121 y
|
|
||||||
6
|
|
||||||
# 122 z
|
|
||||||
7
|
|
||||||
# 123 {
|
|
||||||
0
|
|
||||||
# 124 |
|
|
||||||
0
|
|
||||||
# 125 }
|
|
||||||
0
|
|
||||||
# 126 ~
|
|
||||||
0
|
|
||||||
133
data/font/smb2.fnt
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
# Font: smb2 — generado desde Super Mario Bros. 2.ttf size 8
|
||||||
|
# Generado con tools/font_gen/font_gen.py
|
||||||
|
|
||||||
|
box_width 8
|
||||||
|
box_height 8
|
||||||
|
columns 15
|
||||||
|
|
||||||
|
# codepoint_decimal ancho_visual
|
||||||
|
32 7 # U+0020
|
||||||
|
33 7 # !
|
||||||
|
34 7 # "
|
||||||
|
35 7 # #
|
||||||
|
36 7 # $
|
||||||
|
37 7 # %
|
||||||
|
38 7 # &
|
||||||
|
39 7 # '
|
||||||
|
40 7 # (
|
||||||
|
41 7 # )
|
||||||
|
42 7 # *
|
||||||
|
43 7 # +
|
||||||
|
44 7 # ,
|
||||||
|
45 7 # -
|
||||||
|
46 7 # .
|
||||||
|
47 7 # /
|
||||||
|
48 7 # 0
|
||||||
|
49 7 # 1
|
||||||
|
50 7 # 2
|
||||||
|
51 7 # 3
|
||||||
|
52 7 # 4
|
||||||
|
53 7 # 5
|
||||||
|
54 7 # 6
|
||||||
|
55 7 # 7
|
||||||
|
56 7 # 8
|
||||||
|
57 7 # 9
|
||||||
|
58 7 # :
|
||||||
|
59 7 # ;
|
||||||
|
60 7 # <
|
||||||
|
61 7 # =
|
||||||
|
62 7 # >
|
||||||
|
63 7 # ?
|
||||||
|
64 7 # @
|
||||||
|
65 7 # A
|
||||||
|
66 7 # B
|
||||||
|
67 7 # C
|
||||||
|
68 7 # D
|
||||||
|
69 7 # E
|
||||||
|
70 7 # F
|
||||||
|
71 7 # G
|
||||||
|
72 7 # H
|
||||||
|
73 7 # I
|
||||||
|
74 7 # J
|
||||||
|
75 7 # K
|
||||||
|
76 7 # L
|
||||||
|
77 7 # M
|
||||||
|
78 7 # N
|
||||||
|
79 7 # O
|
||||||
|
80 7 # P
|
||||||
|
81 7 # Q
|
||||||
|
82 7 # R
|
||||||
|
83 7 # S
|
||||||
|
84 7 # T
|
||||||
|
85 7 # U
|
||||||
|
86 7 # V
|
||||||
|
87 7 # W
|
||||||
|
88 7 # X
|
||||||
|
89 7 # Y
|
||||||
|
90 7 # Z
|
||||||
|
91 7 # [
|
||||||
|
92 7 # \
|
||||||
|
93 7 # ]
|
||||||
|
94 7 # ^
|
||||||
|
95 7 # _
|
||||||
|
96 7 # `
|
||||||
|
97 7 # a
|
||||||
|
98 7 # b
|
||||||
|
99 7 # c
|
||||||
|
100 7 # d
|
||||||
|
101 7 # e
|
||||||
|
102 7 # f
|
||||||
|
103 7 # g
|
||||||
|
104 7 # h
|
||||||
|
105 7 # i
|
||||||
|
106 7 # j
|
||||||
|
107 7 # k
|
||||||
|
108 7 # l
|
||||||
|
109 7 # m
|
||||||
|
110 7 # n
|
||||||
|
111 7 # o
|
||||||
|
112 7 # p
|
||||||
|
113 7 # q
|
||||||
|
114 7 # r
|
||||||
|
115 7 # s
|
||||||
|
116 7 # t
|
||||||
|
117 7 # u
|
||||||
|
118 7 # v
|
||||||
|
119 7 # w
|
||||||
|
120 7 # x
|
||||||
|
121 7 # y
|
||||||
|
122 7 # z
|
||||||
|
123 7 # {
|
||||||
|
124 7 # |
|
||||||
|
125 7 # }
|
||||||
|
126 7 # ~
|
||||||
|
192 7 # À
|
||||||
|
193 7 # Á
|
||||||
|
200 7 # È
|
||||||
|
201 7 # É
|
||||||
|
204 7 # Ì
|
||||||
|
205 7 # Í
|
||||||
|
210 7 # Ò
|
||||||
|
211 7 # Ó
|
||||||
|
217 7 # Ù
|
||||||
|
218 7 # Ú
|
||||||
|
209 7 # Ñ
|
||||||
|
199 7 # Ç
|
||||||
|
224 7 # à
|
||||||
|
225 7 # á
|
||||||
|
232 7 # è
|
||||||
|
233 7 # é
|
||||||
|
236 7 # ì
|
||||||
|
237 7 # í
|
||||||
|
242 7 # ò
|
||||||
|
243 7 # ó
|
||||||
|
249 7 # ù
|
||||||
|
250 7 # ú
|
||||||
|
241 7 # ñ
|
||||||
|
231 7 # ç
|
||||||
|
161 7 # ¡
|
||||||
|
191 7 # ¿
|
||||||
|
171 7 # «
|
||||||
|
187 7 # »
|
||||||
|
183 7 # ·
|
||||||
|
228 7 # ä (corazón)
|
||||||
|
Before Width: | Height: | Size: 798 B After Width: | Height: | Size: 1001 B |
@@ -1,194 +0,0 @@
|
|||||||
# box width
|
|
||||||
8
|
|
||||||
# box height
|
|
||||||
8
|
|
||||||
# 32 espacio ( )
|
|
||||||
7
|
|
||||||
# 33 !
|
|
||||||
7
|
|
||||||
# 34 "
|
|
||||||
7
|
|
||||||
# 35 #
|
|
||||||
7
|
|
||||||
# 36 $
|
|
||||||
7
|
|
||||||
# 37 %
|
|
||||||
7
|
|
||||||
# 38 &
|
|
||||||
7
|
|
||||||
# 39 '
|
|
||||||
7
|
|
||||||
# 40 (
|
|
||||||
7
|
|
||||||
# 41 )
|
|
||||||
7
|
|
||||||
# 42 *
|
|
||||||
7
|
|
||||||
# 43 +
|
|
||||||
7
|
|
||||||
# 44 ,
|
|
||||||
7
|
|
||||||
# 45 -
|
|
||||||
7
|
|
||||||
# 46 .
|
|
||||||
7
|
|
||||||
# 47 /
|
|
||||||
7
|
|
||||||
# 48 0
|
|
||||||
7
|
|
||||||
# 49 1
|
|
||||||
7
|
|
||||||
# 50 2
|
|
||||||
7
|
|
||||||
# 51 3
|
|
||||||
7
|
|
||||||
# 52 4
|
|
||||||
7
|
|
||||||
# 53 5
|
|
||||||
7
|
|
||||||
# 54 6
|
|
||||||
7
|
|
||||||
# 55 7
|
|
||||||
7
|
|
||||||
# 56 8
|
|
||||||
7
|
|
||||||
# 57 9
|
|
||||||
7
|
|
||||||
# 58 :
|
|
||||||
7
|
|
||||||
# 59 ;
|
|
||||||
7
|
|
||||||
# 60 <
|
|
||||||
7
|
|
||||||
# 61 =
|
|
||||||
7
|
|
||||||
# 62 >
|
|
||||||
7
|
|
||||||
# 63 ?
|
|
||||||
7
|
|
||||||
# 64 @
|
|
||||||
7
|
|
||||||
# 65 A
|
|
||||||
7
|
|
||||||
# 66 B
|
|
||||||
7
|
|
||||||
# 67 C
|
|
||||||
7
|
|
||||||
# 68 D
|
|
||||||
7
|
|
||||||
# 69 E
|
|
||||||
7
|
|
||||||
# 70 F
|
|
||||||
7
|
|
||||||
# 71 G
|
|
||||||
7
|
|
||||||
# 72 H
|
|
||||||
7
|
|
||||||
# 73 I
|
|
||||||
7
|
|
||||||
# 74 J
|
|
||||||
7
|
|
||||||
# 75 K
|
|
||||||
7
|
|
||||||
# 76 L
|
|
||||||
7
|
|
||||||
# 77 M
|
|
||||||
7
|
|
||||||
# 78 N
|
|
||||||
7
|
|
||||||
# 79 O
|
|
||||||
7
|
|
||||||
# 80 P
|
|
||||||
7
|
|
||||||
# 81 Q
|
|
||||||
7
|
|
||||||
# 82 R
|
|
||||||
7
|
|
||||||
# 83 S
|
|
||||||
7
|
|
||||||
# 84 T
|
|
||||||
7
|
|
||||||
# 85 U
|
|
||||||
7
|
|
||||||
# 86 V
|
|
||||||
7
|
|
||||||
# 87 W
|
|
||||||
7
|
|
||||||
# 88 X
|
|
||||||
7
|
|
||||||
# 89 Y
|
|
||||||
7
|
|
||||||
# 90 Z
|
|
||||||
7
|
|
||||||
# 91 [
|
|
||||||
7
|
|
||||||
# 92 \
|
|
||||||
7
|
|
||||||
# 93 ]
|
|
||||||
7
|
|
||||||
# 94 ^
|
|
||||||
7
|
|
||||||
# 95 _
|
|
||||||
7
|
|
||||||
# 96 `
|
|
||||||
7
|
|
||||||
# 97 a
|
|
||||||
7
|
|
||||||
# 98 b
|
|
||||||
7
|
|
||||||
# 99 c
|
|
||||||
7
|
|
||||||
# 100 d
|
|
||||||
7
|
|
||||||
# 101 e
|
|
||||||
7
|
|
||||||
# 102 f
|
|
||||||
7
|
|
||||||
# 103 g
|
|
||||||
7
|
|
||||||
# 104 h
|
|
||||||
7
|
|
||||||
# 105 i
|
|
||||||
7
|
|
||||||
# 106 j
|
|
||||||
7
|
|
||||||
# 107 k
|
|
||||||
7
|
|
||||||
# 108 l
|
|
||||||
7
|
|
||||||
# 109 m
|
|
||||||
7
|
|
||||||
# 110 n
|
|
||||||
7
|
|
||||||
# 111 o
|
|
||||||
7
|
|
||||||
# 112 p
|
|
||||||
7
|
|
||||||
# 113 q
|
|
||||||
7
|
|
||||||
# 114 r
|
|
||||||
7
|
|
||||||
# 115 s
|
|
||||||
7
|
|
||||||
# 116 t
|
|
||||||
7
|
|
||||||
# 117 u
|
|
||||||
7
|
|
||||||
# 118 v
|
|
||||||
7
|
|
||||||
# 119 w
|
|
||||||
7
|
|
||||||
# 120 x
|
|
||||||
7
|
|
||||||
# 121 y
|
|
||||||
7
|
|
||||||
# 122 z
|
|
||||||
7
|
|
||||||
# 123 {
|
|
||||||
7
|
|
||||||
# 124 |
|
|
||||||
7
|
|
||||||
# 125 }
|
|
||||||
7
|
|
||||||
# 126 ~
|
|
||||||
7
|
|
||||||
132
data/font/subatomic.fnt
Normal file
@@ -0,0 +1,132 @@
|
|||||||
|
# Font: subatomic — generado desde atomics.TTF size 6
|
||||||
|
# Generado con tools/font_gen/font_gen.py
|
||||||
|
|
||||||
|
box_width 7
|
||||||
|
box_height 7
|
||||||
|
columns 15
|
||||||
|
|
||||||
|
# codepoint_decimal ancho_visual
|
||||||
|
32 4 # U+0020
|
||||||
|
33 1 # !
|
||||||
|
34 3 # "
|
||||||
|
35 5 # #
|
||||||
|
36 5 # $
|
||||||
|
37 5 # %
|
||||||
|
38 6 # &
|
||||||
|
39 1 # '
|
||||||
|
40 2 # (
|
||||||
|
41 2 # )
|
||||||
|
42 5 # *
|
||||||
|
43 5 # +
|
||||||
|
44 1 # ,
|
||||||
|
45 5 # -
|
||||||
|
46 1 # .
|
||||||
|
47 5 # /
|
||||||
|
48 5 # 0
|
||||||
|
49 2 # 1
|
||||||
|
50 5 # 2
|
||||||
|
51 5 # 3
|
||||||
|
52 5 # 4
|
||||||
|
53 5 # 5
|
||||||
|
54 5 # 6
|
||||||
|
55 5 # 7
|
||||||
|
56 5 # 8
|
||||||
|
57 5 # 9
|
||||||
|
58 1 # :
|
||||||
|
59 1 # ;
|
||||||
|
60 3 # <
|
||||||
|
61 5 # =
|
||||||
|
62 3 # >
|
||||||
|
63 4 # ?
|
||||||
|
64 5 # @
|
||||||
|
65 5 # A
|
||||||
|
66 5 # B
|
||||||
|
67 5 # C
|
||||||
|
68 5 # D
|
||||||
|
69 4 # E
|
||||||
|
70 5 # F
|
||||||
|
71 5 # G
|
||||||
|
72 5 # H
|
||||||
|
73 1 # I
|
||||||
|
74 5 # J
|
||||||
|
75 5 # K
|
||||||
|
76 4 # L
|
||||||
|
77 5 # M
|
||||||
|
78 5 # N
|
||||||
|
79 5 # O
|
||||||
|
80 5 # P
|
||||||
|
81 5 # Q
|
||||||
|
82 5 # R
|
||||||
|
83 5 # S
|
||||||
|
84 5 # T
|
||||||
|
85 5 # U
|
||||||
|
86 5 # V
|
||||||
|
87 5 # W
|
||||||
|
88 5 # X
|
||||||
|
89 5 # Y
|
||||||
|
90 5 # Z
|
||||||
|
91 2 # [
|
||||||
|
92 5 # \
|
||||||
|
93 2 # ]
|
||||||
|
94 3 # ^
|
||||||
|
95 5 # _
|
||||||
|
96 2 # `
|
||||||
|
97 4 # a
|
||||||
|
98 4 # b
|
||||||
|
99 3 # c
|
||||||
|
100 4 # d
|
||||||
|
101 4 # e
|
||||||
|
102 3 # f
|
||||||
|
103 4 # g
|
||||||
|
104 4 # h
|
||||||
|
105 1 # i
|
||||||
|
106 2 # j
|
||||||
|
107 3 # k
|
||||||
|
108 1 # l
|
||||||
|
109 5 # m
|
||||||
|
110 4 # n
|
||||||
|
111 4 # o
|
||||||
|
112 4 # p
|
||||||
|
113 4 # q
|
||||||
|
114 3 # r
|
||||||
|
115 4 # s
|
||||||
|
116 2 # t
|
||||||
|
117 4 # u
|
||||||
|
118 4 # v
|
||||||
|
119 5 # w
|
||||||
|
120 3 # x
|
||||||
|
121 4 # y
|
||||||
|
122 4 # z
|
||||||
|
123 3 # {
|
||||||
|
124 1 # |
|
||||||
|
125 3 # }
|
||||||
|
126 4 # ~
|
||||||
|
192 5 # À
|
||||||
|
193 5 # Á
|
||||||
|
200 4 # È
|
||||||
|
201 4 # É
|
||||||
|
204 1 # Ì
|
||||||
|
205 1 # Í
|
||||||
|
210 5 # Ò
|
||||||
|
211 5 # Ó
|
||||||
|
217 5 # Ù
|
||||||
|
218 5 # Ú
|
||||||
|
209 5 # Ñ
|
||||||
|
199 5 # Ç
|
||||||
|
224 4 # à
|
||||||
|
225 4 # á
|
||||||
|
232 4 # è
|
||||||
|
233 4 # é
|
||||||
|
236 1 # ì
|
||||||
|
237 1 # í
|
||||||
|
242 4 # ò
|
||||||
|
243 4 # ó
|
||||||
|
249 4 # ù
|
||||||
|
250 4 # ú
|
||||||
|
241 4 # ñ
|
||||||
|
231 3 # ç
|
||||||
|
161 1 # ¡
|
||||||
|
191 4 # ¿
|
||||||
|
171 3 # «
|
||||||
|
187 3 # »
|
||||||
|
183 1 # ·
|
||||||
|
Before Width: | Height: | Size: 540 B After Width: | Height: | Size: 648 B |
@@ -1,194 +0,0 @@
|
|||||||
# box width
|
|
||||||
7
|
|
||||||
# box height
|
|
||||||
7
|
|
||||||
# 32 espacio ( )
|
|
||||||
4
|
|
||||||
# 33 !
|
|
||||||
1
|
|
||||||
# 34 "
|
|
||||||
3
|
|
||||||
# 35 #
|
|
||||||
5
|
|
||||||
# 36 $
|
|
||||||
5
|
|
||||||
# 37 %
|
|
||||||
5
|
|
||||||
# 38 &
|
|
||||||
6
|
|
||||||
# 39 '
|
|
||||||
1
|
|
||||||
# 40 (
|
|
||||||
2
|
|
||||||
# 41 )
|
|
||||||
2
|
|
||||||
# 42 *
|
|
||||||
5
|
|
||||||
# 43 +
|
|
||||||
5
|
|
||||||
# 44 ,
|
|
||||||
1
|
|
||||||
# 45 -
|
|
||||||
5
|
|
||||||
# 46 .
|
|
||||||
1
|
|
||||||
# 47 /
|
|
||||||
5
|
|
||||||
# 48 0
|
|
||||||
5
|
|
||||||
# 49 1
|
|
||||||
2
|
|
||||||
# 50 2
|
|
||||||
5
|
|
||||||
# 51 3
|
|
||||||
5
|
|
||||||
# 52 4
|
|
||||||
5
|
|
||||||
# 53 5
|
|
||||||
5
|
|
||||||
# 54 6
|
|
||||||
5
|
|
||||||
# 55 7
|
|
||||||
5
|
|
||||||
# 56 8
|
|
||||||
5
|
|
||||||
# 57 9
|
|
||||||
5
|
|
||||||
# 58 :
|
|
||||||
1
|
|
||||||
# 59 ;
|
|
||||||
2
|
|
||||||
# 60 <
|
|
||||||
3
|
|
||||||
# 61 =
|
|
||||||
5
|
|
||||||
# 62 >
|
|
||||||
3
|
|
||||||
# 63 ?
|
|
||||||
4
|
|
||||||
# 64 @
|
|
||||||
5
|
|
||||||
# 65 A
|
|
||||||
5
|
|
||||||
# 66 B
|
|
||||||
5
|
|
||||||
# 67 C
|
|
||||||
5
|
|
||||||
# 68 D
|
|
||||||
5
|
|
||||||
# 69 E
|
|
||||||
4
|
|
||||||
# 70 F
|
|
||||||
5
|
|
||||||
# 71 G
|
|
||||||
5
|
|
||||||
# 72 H
|
|
||||||
5
|
|
||||||
# 73 I
|
|
||||||
1
|
|
||||||
# 74 J
|
|
||||||
5
|
|
||||||
# 75 K
|
|
||||||
5
|
|
||||||
# 76 L
|
|
||||||
2
|
|
||||||
# 77 M
|
|
||||||
5
|
|
||||||
# 78 N
|
|
||||||
5
|
|
||||||
# 79 O
|
|
||||||
5
|
|
||||||
# 80 P
|
|
||||||
5
|
|
||||||
# 81 Q
|
|
||||||
5
|
|
||||||
# 82 R
|
|
||||||
5
|
|
||||||
# 83 S
|
|
||||||
5
|
|
||||||
# 84 T
|
|
||||||
5
|
|
||||||
# 85 U
|
|
||||||
5
|
|
||||||
# 86 V
|
|
||||||
5
|
|
||||||
# 87 W
|
|
||||||
5
|
|
||||||
# 88 X
|
|
||||||
5
|
|
||||||
# 89 Y
|
|
||||||
5
|
|
||||||
# 90 Z
|
|
||||||
5
|
|
||||||
# 91 [
|
|
||||||
2
|
|
||||||
# 92 \
|
|
||||||
5
|
|
||||||
# 93 ]
|
|
||||||
2
|
|
||||||
# 94 ^
|
|
||||||
3
|
|
||||||
# 95 _
|
|
||||||
5
|
|
||||||
# 96 `
|
|
||||||
2
|
|
||||||
# 97 a
|
|
||||||
4
|
|
||||||
# 98 b
|
|
||||||
4
|
|
||||||
# 99 c
|
|
||||||
3
|
|
||||||
# 100 d
|
|
||||||
4
|
|
||||||
# 101 e
|
|
||||||
4
|
|
||||||
# 102 f
|
|
||||||
3
|
|
||||||
# 103 g
|
|
||||||
4
|
|
||||||
# 104 h
|
|
||||||
4
|
|
||||||
# 105 i
|
|
||||||
1
|
|
||||||
# 106 j
|
|
||||||
2
|
|
||||||
# 107 k
|
|
||||||
3
|
|
||||||
# 108 l
|
|
||||||
1
|
|
||||||
# 109 m
|
|
||||||
5
|
|
||||||
# 110 n
|
|
||||||
4
|
|
||||||
# 111 o
|
|
||||||
4
|
|
||||||
# 112 p
|
|
||||||
4
|
|
||||||
# 113 q
|
|
||||||
4
|
|
||||||
# 114 r
|
|
||||||
3
|
|
||||||
# 115 s
|
|
||||||
4
|
|
||||||
# 116 t
|
|
||||||
2
|
|
||||||
# 117 u
|
|
||||||
4
|
|
||||||
# 118 v
|
|
||||||
4
|
|
||||||
# 119 w
|
|
||||||
5
|
|
||||||
# 120 x
|
|
||||||
3
|
|
||||||
# 121 y
|
|
||||||
4
|
|
||||||
# 122 z
|
|
||||||
4
|
|
||||||
# 123 {
|
|
||||||
0
|
|
||||||
# 124 |
|
|
||||||
0
|
|
||||||
# 125 }
|
|
||||||
0
|
|
||||||
# 126 ~
|
|
||||||
0
|
|
||||||
140
data/locale/ca.yaml
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
# JailDoctor's Dilemma - Catalan Locale
|
||||||
|
# lang: ca
|
||||||
|
|
||||||
|
title:
|
||||||
|
marquee: "EI JAILERS!! ESTEM EN 2022 I ENCARA HO PETEM COM EN 1998!! QUÉ, HO HEU SENTIT O NO? ELS JAILGAMES HAN TORNAT!! SÍ, COLLONS, HAN TORNAT!! MÉS DE 10 TÍTOLS QUE EL JAILDOC TÉ EN LA CUINA A FOC LENT!! MOLT LENT!! AIXÒ ÉS UNA BARBARITAT, PERÒ... QUIN EIXIRÀ PRIMER? I ATENCIÓ, QUE HI HA UN APARELLET NOU QUE VOS FARÀ VOLAR EL CAP: EL P.A.C.O.! PERÒ UN MOMENT... QUÈ ÉS AQUELLA COSETA QUE VE PER ALLÀ? OOOH, AQUELLA MINIASCII ÉS AMOR DEL BO!! LI PEGARIA UNA LLEPAETA A CADA BYTE! OSTRES! I NO VOS OBLIDEU DE PUJAR AQUELLS JAILGAMES VELLS I PANXUTS DE MS-DOS A GITHUB, QUE SI NO ES PERDRAN!! QUIN SERÀ EL PRÒXIM PROJECTE DE JAILDOC? SERÀ UN PROJECTE DE MERDA? AI MARE... NI IDEA, PERÒ ACÍ PODEU SABER-HO SI RESOLEU EL DILEMA DEL JAILDOCTOR... VOS ATREVIU O QUÈ? VAAAAA!!!"
|
||||||
|
menu:
|
||||||
|
play: "1. JUGAR"
|
||||||
|
keyboard: "2. REDEFINIR TECLES"
|
||||||
|
joystick: "3. REDEFINIR MANDO"
|
||||||
|
projects: "4. PROJECTES"
|
||||||
|
keys:
|
||||||
|
prompt0: "PREM UNA TECLA PER A ESQUERRA"
|
||||||
|
prompt1: "PREM UNA TECLA PER A DRETA"
|
||||||
|
prompt2: "PREM UNA TECLA PER A SALTAR"
|
||||||
|
defined: "TECLES DEFINIDES"
|
||||||
|
label0: "ESQUERRA: "
|
||||||
|
label1: "DRETA: "
|
||||||
|
label2: "SALTAR: "
|
||||||
|
invalid: "TECLA INVÀLIDA! PROVA'N UNA ALTRA"
|
||||||
|
already_used: "TECLA JA USADA! PROVA'N UNA ALTRA"
|
||||||
|
buttons:
|
||||||
|
prompt0: "PREM UN BOTÓ PER A ESQUERRA"
|
||||||
|
prompt1: "PREM UN BOTÓ PER A DRETA"
|
||||||
|
prompt2: "PREM UN BOTÓ PER A SALTAR"
|
||||||
|
defined: "BOTONS DEFINITS"
|
||||||
|
already_used: "BOTÓ JA USAT! PROVA'N UN ALTRE"
|
||||||
|
projects: "PROJECTES"
|
||||||
|
|
||||||
|
game_over:
|
||||||
|
title: "G A M E O V E R"
|
||||||
|
items: "OBJECTES: "
|
||||||
|
rooms: "SALES: "
|
||||||
|
worst_nightmare: "EL TEU PITJOR MALSON ÉS"
|
||||||
|
|
||||||
|
ending:
|
||||||
|
t0: "FINALMENT HO VA ACONSEGUIR"
|
||||||
|
t1: "ARRIBAR A LA JAIL"
|
||||||
|
t2: "AMB TOTS ELS SEUS PROJECTES"
|
||||||
|
t3: "A PUNT D'ALLIBERAR-LOS"
|
||||||
|
t4: "ALLÍ ESTAVEN TOTS ELS JAILERS"
|
||||||
|
t5: "ESPERANT QUE ELS JAILGAMES"
|
||||||
|
t6: "FOREN ALLIBERATS"
|
||||||
|
t7: "HI HAVIA FINS I TOT BARRULLS"
|
||||||
|
t8: "I BEGGINERS ENTRE LA GENT"
|
||||||
|
t9: "BRY ESTAVA PLORANT..."
|
||||||
|
t10: "PERÒ DE SOBTE ALGUNA COSA"
|
||||||
|
t11: "LI VA CRIDAR L'ATENCIÓ"
|
||||||
|
t12: "UN MUNT DE FERRALLA!"
|
||||||
|
t13: "PLE DE TRASTOS QUE NI ANAVEN!!"
|
||||||
|
t14: "I ALESHORES,"
|
||||||
|
t15: "QUARANTA PROJECTES NOUS"
|
||||||
|
t16: "VAN NÀIXER..."
|
||||||
|
|
||||||
|
ending2:
|
||||||
|
starring: "PROTAGONISTES"
|
||||||
|
jaildoctor: "JAILDOCTOR"
|
||||||
|
thank_you: "GRÀCIES"
|
||||||
|
for_playing: "PER JUGAR!"
|
||||||
|
|
||||||
|
credits:
|
||||||
|
instructions: "INSTRUCCIONS:"
|
||||||
|
l0: "AJUDA A JAILDOC A RECUPERAR"
|
||||||
|
l1: "ELS SEUS PROJECTES I ARRIBAR"
|
||||||
|
l2: "A LA JAIL PER ACABAR-LOS"
|
||||||
|
keys: "TECLES:"
|
||||||
|
keys_move: "CURSORS PER A MOURE I SALTAR"
|
||||||
|
f8: "F8 ACTIVAR/DESACTIVAR MÚSICA"
|
||||||
|
f11: "F11 PAUSAR EL JOC"
|
||||||
|
f1f2: "F1-F2 MIDA DE LA FINESTRA"
|
||||||
|
f3: "F3 PANTALLA COMPLETA"
|
||||||
|
f9: "F9 VORA DE LA PANTALLA"
|
||||||
|
author: "UN JOC DE JAILDESIGNER"
|
||||||
|
date: "FET A L'ESTIU/TARDOR DEL 2022"
|
||||||
|
love: "I LOVE JAILGAMES! "
|
||||||
|
|
||||||
|
achievements:
|
||||||
|
header: "ASSOLIMENT DESBLOQUEJAT!"
|
||||||
|
c1: "COSES BRILLANTS"
|
||||||
|
d1: "Aconseguiu el 25% dels objectes"
|
||||||
|
c2: "A MITJAN CAMÍ"
|
||||||
|
d2: "Aconseguiu el 50% dels objectes"
|
||||||
|
c3: "QUASI HI SOM"
|
||||||
|
d3: "Aconseguiu el 75% dels objectes"
|
||||||
|
c4: "EL COL·LECCIONISTA"
|
||||||
|
d4: "Aconseguiu el 100% dels objectes"
|
||||||
|
c5: "PASSEJANT PER ACÍ"
|
||||||
|
d5: "Visiteu 20 sales"
|
||||||
|
c6: "M'HE PERDUT"
|
||||||
|
d6: "Visiteu 40 sales"
|
||||||
|
c7: "M'AGRADA EXPLORAR"
|
||||||
|
d7: "Visiteu totes les sales"
|
||||||
|
c8: "JA ESTÀ?"
|
||||||
|
d8: "Completeu el joc"
|
||||||
|
c9: "UN FORAT EM VA ENGOLIR"
|
||||||
|
d9: "Completeu el joc sense entrar a la presó"
|
||||||
|
c10: "ELS MEUS PROJECTES"
|
||||||
|
d10: "Completeu el joc amb tots els objectes"
|
||||||
|
c11: "M'AGRADEN ELS MEUS AMICS DE COLORS"
|
||||||
|
d11: "Completeu el joc sense morir"
|
||||||
|
c12: "PROJECTES A CORRE-CUITA"
|
||||||
|
d12: "Completeu el joc en menys de 30 minuts"
|
||||||
|
|
||||||
|
ui:
|
||||||
|
press_again_menu: "PREM DE NOU PER TORNAR AL MENÚ"
|
||||||
|
press_again_exit: "PREM DE NOU PER EIXIR"
|
||||||
|
border_enabled: "VORA ACTIVADA"
|
||||||
|
border_disabled: "VORA DESACTIVADA"
|
||||||
|
fullscreen_enabled: "PANTALLA COMPLETA ACTIVADA"
|
||||||
|
fullscreen_disabled: "PANTALLA COMPLETA DESACTIVADA"
|
||||||
|
window_zoom: "ZOOM FINESTRA x"
|
||||||
|
shaders_enabled: "SHADERS ACTIVATS"
|
||||||
|
shaders_disabled: "SHADERS DESACTIVATS"
|
||||||
|
shader: "SHADER"
|
||||||
|
postfx: "POSTFX"
|
||||||
|
crtpi: "CRTPI"
|
||||||
|
supersampling_enabled: "SUPERMOSTREIG ACTIVAT"
|
||||||
|
supersampling_disabled: "SUPERMOSTREIG DESACTIVAT"
|
||||||
|
palette: "PALETA"
|
||||||
|
integer_scale_enabled: "ESCALAT SENCER ACTIVAT"
|
||||||
|
integer_scale_disabled: "ESCALAT SENCER DESACTIVAT"
|
||||||
|
vsync_enabled: "V-SYNC ACTIVAT"
|
||||||
|
vsync_disabled: "V-SYNC DESACTIVAT"
|
||||||
|
|
||||||
|
scoreboard:
|
||||||
|
items: "TRESORS PILLATS "
|
||||||
|
time: " HORA "
|
||||||
|
rooms: "SALES"
|
||||||
|
|
||||||
|
game:
|
||||||
|
music_enabled: "MÚSICA ACTIVADA"
|
||||||
|
music_disabled: "MÚSICA DESACTIVADA"
|
||||||
|
paused: "JOC EN PAUSA"
|
||||||
|
running: "JOC EN MARXA"
|
||||||
|
enabled: " ACTIVAT"
|
||||||
|
disabled: " DESACTIVAT"
|
||||||
|
cheat_infinite_lives: "VIDES INFINITES"
|
||||||
|
cheat_invincible: "INVENCIBLE"
|
||||||
|
cheat_jail_open: "JAIL OBERTA"
|
||||||
|
debug_enabled: "DEBUG ACTIVAT"
|
||||||
|
debug_disabled: "DEBUG DESACTIVAT"
|
||||||
140
data/locale/en.yaml
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
# JailDoctor's Dilemma - English Locale
|
||||||
|
# lang: en
|
||||||
|
|
||||||
|
title:
|
||||||
|
marquee: "HEY JAILERS!! IT'S 2022 AND WE'RE STILL ROCKING LIKE IT'S 1998!!! HAVE YOU HEARD IT? JAILGAMES ARE BACK!! YEEESSS BACK!! MORE THAN 10 TITLES ON JAILDOC'S KITCHEN!! THATS A LOOOOOOT OF JAILGAMES, BUT WHICH ONE WILL STRIKE FIRST? THERE IS ALSO A NEW DEVICE TO COME THAT WILL BLOW YOUR MIND WITH JAILGAMES ON THE GO: P.A.C.O. BUT WAIT! WHAT'S THAT BEAUTY I'M SEEING RIGHT OVER THERE?? OOOH THAT TINY MINIASCII IS PURE LOVE!! I WANT TO LICK EVERY BYTE OF IT!! OH SHIT! AND DON'T FORGET TO BRING BACK THOSE OLD AND FAT MS-DOS JAILGAMES TO GITHUB TO KEEP THEM ALIVE!! WHAT WILL BE THE NEXT JAILDOC RELEASE? WHAT WILL BE THE NEXT PROJECT TO COME ALIVE?? OH BABY WE DON'T KNOW BUT HERE YOU CAN FIND THE ANSWER, YOU JUST HAVE TO COMPLETE JAILDOCTOR'S DILEMMA ... COULD YOU?"
|
||||||
|
menu:
|
||||||
|
play: "1. PLAY"
|
||||||
|
keyboard: "2. REDEFINE KEYBOARD"
|
||||||
|
joystick: "3. REDEFINE JOYSTICK"
|
||||||
|
projects: "4. PROJECTS"
|
||||||
|
keys:
|
||||||
|
prompt0: "PRESS KEY FOR LEFT"
|
||||||
|
prompt1: "PRESS KEY FOR RIGHT"
|
||||||
|
prompt2: "PRESS KEY FOR JUMP"
|
||||||
|
defined: "KEYS DEFINED"
|
||||||
|
label0: "LEFT: "
|
||||||
|
label1: "RIGHT: "
|
||||||
|
label2: "JUMP: "
|
||||||
|
invalid: "INVALID KEY! TRY ANOTHER"
|
||||||
|
already_used: "KEY ALREADY USED! TRY ANOTHER"
|
||||||
|
buttons:
|
||||||
|
prompt0: "PRESS BUTTON FOR LEFT"
|
||||||
|
prompt1: "PRESS BUTTON FOR RIGHT"
|
||||||
|
prompt2: "PRESS BUTTON FOR JUMP"
|
||||||
|
defined: "BUTTONS DEFINED"
|
||||||
|
already_used: "BUTTON ALREADY USED! TRY ANOTHER"
|
||||||
|
projects: "PROJECTS"
|
||||||
|
|
||||||
|
game_over:
|
||||||
|
title: "G A M E O V E R"
|
||||||
|
items: "ITEMS: "
|
||||||
|
rooms: "ROOMS: "
|
||||||
|
worst_nightmare: "YOUR WORST NIGHTMARE IS"
|
||||||
|
|
||||||
|
ending:
|
||||||
|
t0: "HE FINALLY MANAGED"
|
||||||
|
t1: "TO GET TO THE JAIL"
|
||||||
|
t2: "WITH ALL HIS PROJECTS"
|
||||||
|
t3: "READY TO BE FREED"
|
||||||
|
t4: "ALL THE JAILERS WERE THERE"
|
||||||
|
t5: "WAITING FOR THE JAILGAMES"
|
||||||
|
t6: "TO BE RELEASED"
|
||||||
|
t7: "THERE WERE EVEN BARRULLS AND"
|
||||||
|
t8: "BEGINNERS AMONG THE CROWD"
|
||||||
|
t9: "BRY WAS CRYING..."
|
||||||
|
t10: "BUT SUDDENLY SOMETHING"
|
||||||
|
t11: "CAUGHT HIS ATTENTION"
|
||||||
|
t12: "A PILE OF JUNK!"
|
||||||
|
t13: "FULL OF NON WORKING TRASH!!"
|
||||||
|
t14: "AND THEN,"
|
||||||
|
t15: "FOURTY NEW PROJECTS"
|
||||||
|
t16: "WERE BORN..."
|
||||||
|
|
||||||
|
ending2:
|
||||||
|
starring: "STARRING"
|
||||||
|
jaildoctor: "JAILDOCTOR"
|
||||||
|
thank_you: "THANK YOU"
|
||||||
|
for_playing: "FOR PLAYING!"
|
||||||
|
|
||||||
|
credits:
|
||||||
|
instructions: "INSTRUCTIONS:"
|
||||||
|
l0: "HELP JAILDOC TO GET BACK ALL"
|
||||||
|
l1: "HIS PROJECTS AND GO TO THE"
|
||||||
|
l2: "JAIL TO FINISH THEM"
|
||||||
|
keys: "KEYS:"
|
||||||
|
keys_move: "CURSORS TO MOVE AND JUMP"
|
||||||
|
f8: "F8 TOGGLE THE MUSIC"
|
||||||
|
f11: "F11 PAUSE THE GAME"
|
||||||
|
f1f2: "F1-F2 WINDOWS SIZE"
|
||||||
|
f3: "F3 TOGGLE FULLSCREEN"
|
||||||
|
f9: "F9 TOOGLE BORDER SCREEN"
|
||||||
|
author: "A GAME BY JAILDESIGNER"
|
||||||
|
date: "MADE ON SUMMER/FALL 2022"
|
||||||
|
love: "I LOVE JAILGAMES! "
|
||||||
|
|
||||||
|
achievements:
|
||||||
|
header: "ACHIEVEMENT UNLOCKED!"
|
||||||
|
c1: "SHINY THINGS"
|
||||||
|
d1: "Get 25% of the items"
|
||||||
|
c2: "HALF THE WORK"
|
||||||
|
d2: "Get 50% of the items"
|
||||||
|
c3: "GETTING THERE"
|
||||||
|
d3: "Get 75% of the items"
|
||||||
|
c4: "THE COLLECTOR"
|
||||||
|
d4: "Get 100% of the items"
|
||||||
|
c5: "WANDERING AROUND"
|
||||||
|
d5: "Visit 20 rooms"
|
||||||
|
c6: "I GOT LOST"
|
||||||
|
d6: "Visit 40 rooms"
|
||||||
|
c7: "I LIKE TO EXPLORE"
|
||||||
|
d7: "Visit all rooms"
|
||||||
|
c8: "FINISH THE GAME"
|
||||||
|
d8: "Complete the game"
|
||||||
|
c9: "I WAS SUCKED BY A HOLE"
|
||||||
|
d9: "Complete the game without entering the jail"
|
||||||
|
c10: "MY LITTLE PROJECTS"
|
||||||
|
d10: "Complete the game with all items"
|
||||||
|
c11: "I LIKE MY MULTICOLOURED FRIENDS"
|
||||||
|
d11: "Complete the game without dying"
|
||||||
|
c12: "SHIT PROJECTS DONE FAST"
|
||||||
|
d12: "Complete the game in under 30 minutes"
|
||||||
|
|
||||||
|
ui:
|
||||||
|
press_again_menu: "PRESS AGAIN TO RETURN TO MENU"
|
||||||
|
press_again_exit: "PRESS AGAIN TO EXIT"
|
||||||
|
border_enabled: "BORDER ENABLED"
|
||||||
|
border_disabled: "BORDER DISABLED"
|
||||||
|
fullscreen_enabled: "FULLSCREEN ENABLED"
|
||||||
|
fullscreen_disabled: "FULLSCREEN DISABLED"
|
||||||
|
window_zoom: "WINDOW ZOOM x"
|
||||||
|
shaders_enabled: "SHADERS ON"
|
||||||
|
shaders_disabled: "SHADERS OFF"
|
||||||
|
shader: "SHADER"
|
||||||
|
postfx: "POSTFX"
|
||||||
|
crtpi: "CRTPI"
|
||||||
|
supersampling_enabled: "SUPERSAMPLING ON"
|
||||||
|
supersampling_disabled: "SUPERSAMPLING OFF"
|
||||||
|
palette: "PALETTE"
|
||||||
|
integer_scale_enabled: "INTEGER SCALE ENABLED"
|
||||||
|
integer_scale_disabled: "INTEGER SCALE DISABLED"
|
||||||
|
vsync_enabled: "V-SYNC ENABLED"
|
||||||
|
vsync_disabled: "V-SYNC DISABLED"
|
||||||
|
|
||||||
|
scoreboard:
|
||||||
|
items: "ITEMS COLLECTED "
|
||||||
|
time: " TIME "
|
||||||
|
rooms: "ROOMS"
|
||||||
|
|
||||||
|
game:
|
||||||
|
music_enabled: "MUSIC ENABLED"
|
||||||
|
music_disabled: "MUSIC DISABLED"
|
||||||
|
paused: "GAME PAUSED"
|
||||||
|
running: "GAME RUNNING"
|
||||||
|
enabled: " ENABLED"
|
||||||
|
disabled: " DISABLED"
|
||||||
|
cheat_infinite_lives: "INFINITE LIVES"
|
||||||
|
cheat_invincible: "INVINCIBLE"
|
||||||
|
cheat_jail_open: "JAIL IS OPEN"
|
||||||
|
debug_enabled: "DEBUG ENABLED"
|
||||||
|
debug_disabled: "DEBUG DISABLED"
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
# THE JAIL
|
# THE JAIL
|
||||||
room:
|
room:
|
||||||
name: "THE JAIL"
|
name_en: "THE JAIL"
|
||||||
|
name_ca: "LA JAIL"
|
||||||
bgColor: bright_blue
|
bgColor: bright_blue
|
||||||
border: blue
|
border: blue
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# ROAD TO THE JAIL
|
# ROAD TO THE JAIL
|
||||||
room:
|
room:
|
||||||
name: "ROAD TO THE JAIL"
|
name_en: "ROAD TO THE JAIL"
|
||||||
|
name_ca: "CAMI A LA JAIL"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: blue
|
border: blue
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# VOID MAIN
|
# VOID MAIN
|
||||||
room:
|
room:
|
||||||
name: "VOID MAIN"
|
name_en: "VOID MAIN"
|
||||||
|
name_ca: "VOID MAIN"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: magenta
|
border: magenta
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# JUMP THROUGH
|
# JUMP THROUGH
|
||||||
room:
|
room:
|
||||||
name: "JUMP THROUGH"
|
name_en: "JUMP THROUGH"
|
||||||
|
name_ca: "SALTA A TRAVES"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: cyan
|
border: cyan
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# BIG JUMP
|
# BIG JUMP
|
||||||
room:
|
room:
|
||||||
name: "BIG JUMP"
|
name_en: "BIG JUMP"
|
||||||
|
name_ca: "EL GRAN BOT"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: red
|
border: red
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# WELCOME TO MY ABBEY
|
# WELCOME TO MY ABBEY
|
||||||
room:
|
room:
|
||||||
name: "WELCOME TO MY ABBEY"
|
name_en: "WELCOME TO MY ABBEY"
|
||||||
|
name_ca: "BENVINGUT A LA MEUA ABADIA"
|
||||||
bgColor: blue
|
bgColor: blue
|
||||||
border: yellow
|
border: yellow
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# SIGMASUA > TELEGRAM
|
# SIGMASUA > TELEGRAM
|
||||||
room:
|
room:
|
||||||
name: "SIGMASUA > TELEGRAM"
|
name_en: "SIGMASUA > TELEGRAM"
|
||||||
|
name_ca: "SIGMASUA > TELEGRAM"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: blue
|
border: blue
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# THE GARDEN
|
# THE GARDEN
|
||||||
room:
|
room:
|
||||||
name: "THE GARDEN"
|
name_en: "THE GARDEN"
|
||||||
|
name_ca: "EL JARDI"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: cyan
|
border: cyan
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# THE BIG TREE
|
# THE BIG TREE
|
||||||
room:
|
room:
|
||||||
name: "THE BIG TREE"
|
name_en: "THE BIG TREE"
|
||||||
|
name_ca: "EL GRAN ARBRE"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: bright_blue
|
border: bright_blue
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# TREE TOP
|
# TREE TOP
|
||||||
room:
|
room:
|
||||||
name: "TREE TOP"
|
name_en: "TREE TOP"
|
||||||
|
name_ca: "DALT DE L'ARBRE"
|
||||||
bgColor: bright_black
|
bgColor: bright_black
|
||||||
border: blue
|
border: blue
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# LAZY ROOM
|
# LAZY ROOM
|
||||||
room:
|
room:
|
||||||
name: "LAZY ROOM"
|
name_en: "LAZY ROOM"
|
||||||
|
name_ca: "LA SALA GOSSA"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: blue
|
border: blue
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# THE PASSAGE
|
# THE PASSAGE
|
||||||
room:
|
room:
|
||||||
name: "THE PASSAGE"
|
name_en: "THE PASSAGE"
|
||||||
|
name_ca: "EL PASSATGE"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: green
|
border: green
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# TUNO KILLER
|
# TUNO KILLER
|
||||||
room:
|
room:
|
||||||
name: "TUNO KILLER"
|
name_en: "TUNO KILLER"
|
||||||
|
name_ca: "MATATUNOS"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: blue
|
border: blue
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# KILLING SPREE
|
# KILLING SPREE
|
||||||
room:
|
room:
|
||||||
name: "KILLING SPREE"
|
name_en: "KILLING SPREE"
|
||||||
|
name_ca: "MATANÇA INDISCRIMINADA"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: blue
|
border: blue
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# NOW THIS IS THE BATCAVE!
|
# NOW THIS IS THE BATCAVE!
|
||||||
room:
|
room:
|
||||||
name: "NOW THIS IS THE BATCAVE!"
|
name_en: "NOW THIS IS THE BATCAVE!"
|
||||||
|
name_ca: "ESTA SI QUE ES LA BATCOVA!"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: black
|
border: black
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# THE FRIDGE
|
# THE FRIDGE
|
||||||
room:
|
room:
|
||||||
name: "THE FRIDGE"
|
name_en: "THE FRIDGE"
|
||||||
|
name_ca: "EL FRIGO"
|
||||||
bgColor: blue
|
bgColor: blue
|
||||||
border: blue
|
border: blue
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# I DID NOT COPY THIS ONE
|
# I DID NOT COPY THIS ONE
|
||||||
room:
|
room:
|
||||||
name: "I DID NOT COPY THIS ONE"
|
name_en: "I DID NOT COPY THIS ONE"
|
||||||
|
name_ca: "ESTA NO LA HE COPIADA"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: magenta
|
border: magenta
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# MAKE MONEY
|
# MAKE MONEY
|
||||||
room:
|
room:
|
||||||
name: "MAKE MONEY"
|
name_en: "MAKE MONEY"
|
||||||
|
name_ca: "INHERITEDS!"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: yellow
|
border: yellow
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# THIS CAN'T BE THE BATCAVE
|
# THIS CAN'T BE THE BATCAVE
|
||||||
room:
|
room:
|
||||||
name: "THIS CAN'T BE THE BATCAVE"
|
name_en: "THIS CAN'T BE THE BATCAVE"
|
||||||
|
name_ca: "ESTA NO POT SER LA BATCOVA"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: cyan
|
border: cyan
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# ENTRANCE TO THE VALLEY
|
# ENTRANCE TO THE VALLEY
|
||||||
room:
|
room:
|
||||||
name: "ENTRANCE TO THE VALLEY"
|
name_en: "ENTRANCE TO THE VALLEY"
|
||||||
|
name_ca: "ENTRADA A LA VALL"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: red
|
border: red
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# ENTER PAKU SIMBEL
|
# ENTER PAKU SIMBEL
|
||||||
room:
|
room:
|
||||||
name: "ENTER PAKU SIMBEL"
|
name_en: "ENTER PAKU SIMBEL"
|
||||||
|
name_ca: "ACCEDINT A PAKU SIMBEL"
|
||||||
bgColor: bright_black
|
bgColor: bright_black
|
||||||
border: yellow
|
border: yellow
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# AEE REMAKE, PLEASE
|
# AEE REMAKE, PLEASE
|
||||||
room:
|
room:
|
||||||
name: "AEE REMAKE, PLEASE"
|
name_en: "AEE REMAKE, PLEASE"
|
||||||
|
name_ca: "AEE REMAKE, PERFAPLIS"
|
||||||
bgColor: bright_black
|
bgColor: bright_black
|
||||||
border: yellow
|
border: yellow
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# INNER CHAMBER
|
# INNER CHAMBER
|
||||||
room:
|
room:
|
||||||
name: "INNER CHAMBER"
|
name_en: "INNER CHAMBER"
|
||||||
|
name_ca: "CAMBRA INTERIOR"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: bright_yellow
|
border: bright_yellow
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# PLAY IT AGAIN, SAM
|
# PLAY IT AGAIN, SAM
|
||||||
room:
|
room:
|
||||||
name: "PLAY IT AGAIN, SAM"
|
name_en: "PLAY IT AGAIN, SAM"
|
||||||
|
name_ca: "TORNA-LA A TOCAR, SAM"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: bright_yellow
|
border: bright_yellow
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# THE CHAPPEL
|
# THE CHAPPEL
|
||||||
room:
|
room:
|
||||||
name: "THE CHAPPEL"
|
name_en: "THE CHAPPEL"
|
||||||
|
name_ca: "LA CAPELLA"
|
||||||
bgColor: blue
|
bgColor: blue
|
||||||
border: yellow
|
border: yellow
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# JINGLE BELLS
|
# JINGLE BELLS
|
||||||
room:
|
room:
|
||||||
name: "JINGLE BELLS"
|
name_en: "JINGLE BELLS"
|
||||||
|
name_ca: "CAMPANETES"
|
||||||
bgColor: blue
|
bgColor: blue
|
||||||
border: yellow
|
border: yellow
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# THE BACKYARD
|
# THE BACKYARD
|
||||||
room:
|
room:
|
||||||
name: "THE BACKYARD"
|
name_en: "THE BACKYARD"
|
||||||
|
name_ca: "EL PATI DE DARRERE"
|
||||||
bgColor: blue
|
bgColor: blue
|
||||||
border: cyan
|
border: cyan
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# YOU SHALL NOT PASS
|
# YOU SHALL NOT PASS
|
||||||
room:
|
room:
|
||||||
name: "YOU SHALL NOT PASS"
|
name_en: "YOU SHALL NOT PASS"
|
||||||
|
name_ca: "NO PASSARAS"
|
||||||
bgColor: bright_black
|
bgColor: bright_black
|
||||||
border: black
|
border: black
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# QUO VOIDIS
|
# QUO VOIDIS
|
||||||
room:
|
room:
|
||||||
name: "QUO VOIDIS"
|
name_en: "QUO VOIDIS"
|
||||||
|
name_ca: "QUO VOIDIS"
|
||||||
bgColor: blue
|
bgColor: blue
|
||||||
border: bright_black
|
border: bright_black
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# QVOID IS A JAILGAME!
|
# QVOID IS A JAILGAME!
|
||||||
room:
|
room:
|
||||||
name: "QVOID IS A JAILGAME!"
|
name_en: "QVOID IS A JAILGAME!"
|
||||||
|
name_ca: "QVOID ES UN JAILGAME!"
|
||||||
bgColor: blue
|
bgColor: blue
|
||||||
border: bright_black
|
border: bright_black
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# 256 COLORS
|
# 256 COLORS
|
||||||
room:
|
room:
|
||||||
name: "256 COLORS"
|
name_en: "256 COLORS"
|
||||||
|
name_ca: "256 COLORS"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: bright_magenta
|
border: bright_magenta
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# ...?
|
# ...?
|
||||||
room:
|
room:
|
||||||
name: "...?"
|
name_en: "...?"
|
||||||
|
name_ca: "...?"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: cyan
|
border: cyan
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# } WE ALL LOVE JAILGAMES }
|
# } WE ALL LOVE JAILGAMES }
|
||||||
room:
|
room:
|
||||||
name: "} WE ALL LOVE JAILGAMES }"
|
name_en: "ä WE ALL LOVE JAILGAMES ä"
|
||||||
|
name_ca: "ä AMOR PELS JAILGAMES ä"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: bright_black
|
border: bright_black
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# ULA HOP!
|
# ULA HOP!
|
||||||
room:
|
room:
|
||||||
name: "ULA HOP!"
|
name_en: "ULA HOP!"
|
||||||
|
name_ca: "ULA HOP!"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: cyan
|
border: cyan
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# SILICON BOOBS
|
# SILICON BOOBS
|
||||||
room:
|
room:
|
||||||
name: "SILICON BOOBS"
|
name_en: "SILICON BOOBS"
|
||||||
|
name_ca: "MAMELLES DE SILICI"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: bright_green
|
border: bright_green
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# BE CAREFUL WITH THE FUSE
|
# BE CAREFUL WITH THE FUSE
|
||||||
room:
|
room:
|
||||||
name: "BE CAREFUL WITH THE FUSE"
|
name_en: "BE CAREFUL WITH THE FUSE"
|
||||||
|
name_ca: "COMPTE AMB EL FUSIBLE"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: bright_cyan
|
border: bright_cyan
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# CHIP'N CHIP
|
# CHIP'N CHIP
|
||||||
room:
|
room:
|
||||||
name: "CHIP'N CHIP"
|
name_en: "CHIP'N CHIP"
|
||||||
|
name_ca: "CHIP'N CHIP"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: bright_green
|
border: bright_green
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# THE FINAL CROSSOVER
|
# THE FINAL CROSSOVER
|
||||||
room:
|
room:
|
||||||
name: "THE FINAL CROSSOVER"
|
name_en: "THE FINAL CROSSOVER"
|
||||||
|
name_ca: "EL CROSSOVER DEFINITIU"
|
||||||
bgColor: bright_black
|
bgColor: bright_black
|
||||||
border: yellow
|
border: yellow
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# YOU'LL BELIEVE AROUNDER CAN FLY
|
# YOU'LL BELIEVE AROUNDER CAN FLY
|
||||||
room:
|
room:
|
||||||
name: "YOU'LL BELIEVE AROUNDER CAN FLY"
|
name_en: "YOU'LL BELIEVE AROUNDER CAN FLY"
|
||||||
|
name_ca: "CREURAS QUE ELS AROUNDERS VOLEN"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: cyan
|
border: cyan
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# PREVENT THE CRISIS
|
# PREVENT THE CRISIS
|
||||||
room:
|
room:
|
||||||
name: "PREVENT THE CRISIS"
|
name_en: "PREVENT THE CRISIS"
|
||||||
|
name_ca: "EVITA LA CRISI"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: bright_magenta
|
border: bright_magenta
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# AROUND WITH ME
|
# AROUND WITH ME
|
||||||
room:
|
room:
|
||||||
name: "AROUND WITH ME"
|
name_en: "AROUND WITH ME"
|
||||||
|
name_ca: "AROUNDA AMB MI"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: blue
|
border: blue
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# P.A.C.O. ON THE GO
|
# P.A.C.O. ON THE GO
|
||||||
room:
|
room:
|
||||||
name: "P.A.C.O. ON THE GO"
|
name_en: "P.A.C.O. ON THE GO"
|
||||||
|
name_ca: "P.A.C.O. EN MARXA"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: blue
|
border: blue
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# THE TUBE
|
# THE TUBE
|
||||||
room:
|
room:
|
||||||
name: "THE TUBE"
|
name_en: "THE TUBE"
|
||||||
|
name_ca: "EL TUB"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: blue
|
border: blue
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# SANDWITCH AND COUNTER
|
# SANDWITCH AND COUNTER
|
||||||
room:
|
room:
|
||||||
name: "SANDWITCH AND COUNTER"
|
name_en: "SANDWITCH AND COUNTER"
|
||||||
|
name_ca: "SANDVITX I COUNTER STRIKE"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: cyan
|
border: cyan
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# FEEL THE PRESSURE
|
# FEEL THE PRESSURE
|
||||||
room:
|
room:
|
||||||
name: "FEEL THE PRESSURE"
|
name_en: "FEEL THE PRESSURE"
|
||||||
|
name_ca: "NOTA LA PRESSIO"
|
||||||
bgColor: bright_black
|
bgColor: bright_black
|
||||||
border: bright_yellow
|
border: bright_yellow
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# FEEL THE HEAT
|
# FEEL THE HEAT
|
||||||
room:
|
room:
|
||||||
name: "FEEL THE HEAT"
|
name_en: "FEEL THE HEAT"
|
||||||
|
name_ca: "NOTA EL CALORET"
|
||||||
bgColor: bright_black
|
bgColor: bright_black
|
||||||
border: bright_yellow
|
border: bright_yellow
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# THE BATTLE NEVER ENDS
|
# THE BATTLE NEVER ENDS
|
||||||
room:
|
room:
|
||||||
name: "THE BATTLE NEVER ENDS"
|
name_en: "THE BATTLE NEVER ENDS"
|
||||||
|
name_ca: "LA BATALLA MAI ACABA"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: white
|
border: white
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# WELCOME TO THE JAILBATTLE
|
# WELCOME TO THE JAILBATTLE
|
||||||
room:
|
room:
|
||||||
name: "WELCOME TO THE JAILBATTLE"
|
name_en: "WELCOME TO THE JAILBATTLE"
|
||||||
|
name_ca: "BENVINGUTS A JAILBATTLE"
|
||||||
bgColor: green
|
bgColor: green
|
||||||
border: bright_green
|
border: bright_green
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# WE NEED A ROBOT
|
# WE NEED A ROBOT
|
||||||
room:
|
room:
|
||||||
name: "WE NEED A ROBOT"
|
name_en: "WE NEED A JAILROBOT"
|
||||||
|
name_ca: "NECESSITEM UN JAILROBOT"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: red
|
border: red
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# STORED JAILGAMES
|
# STORED JAILGAMES
|
||||||
room:
|
room:
|
||||||
name: "STORED JAILGAMES"
|
name_en: "STORED JAILGAMES"
|
||||||
|
name_ca: "EL MAGATZEM DE JAILGAMES"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: blue
|
border: blue
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# MINI ASCII
|
# MINI ASCII
|
||||||
room:
|
room:
|
||||||
name: "MINI ASCII"
|
name_en: "MINI ASCII"
|
||||||
|
name_ca: "MINI ASCII"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: black
|
border: black
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# BREAKOUT.LUA
|
# BREAKOUT.LUA
|
||||||
room:
|
room:
|
||||||
name: "BREAKOUT.LUA"
|
name_en: "BREAKOUT.LUA"
|
||||||
|
name_ca: "BREAKOUT.LUA"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: black
|
border: black
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# P.A.C.O. WORKSHOP
|
# P.A.C.O. WORKSHOP
|
||||||
room:
|
room:
|
||||||
name: "P.A.C.O. WORKSHOP"
|
name_en: "P.A.C.O. WORKSHOP"
|
||||||
|
name_ca: "EL TALLER DE P.A.C.O."
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: yellow
|
border: yellow
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# THE BASEMENT
|
# THE BASEMENT
|
||||||
room:
|
room:
|
||||||
name: "THE BASEMENT"
|
name_en: "THE BASEMENT"
|
||||||
|
name_ca: "EL SOTAN"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: blue
|
border: blue
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# THAT'S A GUITAR
|
# THAT'S A GUITAR
|
||||||
room:
|
room:
|
||||||
name: "THAT'S A GUITAR"
|
name_en: "THAT'S A GUITAR"
|
||||||
|
name_ca: "AIXO ES UNA GUITARRA"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: black
|
border: black
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# HEAVY DEMONS ON LEGGINS
|
# HEAVY DEMONS ON LEGGINS
|
||||||
room:
|
room:
|
||||||
name: "HEAVY DEMONS ON LEGGINS"
|
name_en: "HEAVY DEMONS ON LEGGINS"
|
||||||
|
name_ca: "DIMONIS HEAVIES AMB MALLES"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: black
|
border: black
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# JAILGAMES GO TO HELL
|
# JAILGAMES GO TO HELL
|
||||||
room:
|
room:
|
||||||
name: "JAILGAMES GO TO HELL"
|
name_en: "JAILGAMES GO TO HELL"
|
||||||
|
name_ca: "JAILGAMES A L'INFERN"
|
||||||
bgColor: red
|
bgColor: red
|
||||||
border: bright_red
|
border: bright_red
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# CHIRPING
|
# CHIRPING
|
||||||
room:
|
room:
|
||||||
name: "CHIRPING"
|
name_en: "CHIRPING"
|
||||||
|
name_ca: "CHIRPING"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: magenta
|
border: magenta
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# STATIC
|
# STATIC
|
||||||
room:
|
room:
|
||||||
name: "STATIC"
|
name_en: "STATIC"
|
||||||
|
name_ca: "ESTATICA"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: bright_magenta
|
border: bright_magenta
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# MAGNETIC FIELDS
|
# MAGNETIC FIELDS
|
||||||
room:
|
room:
|
||||||
name: "MAGNETIC FIELDS"
|
name_en: "MAGNETIC FIELDS"
|
||||||
|
name_ca: "CAMPS MAGNETICS"
|
||||||
bgColor: black
|
bgColor: black
|
||||||
border: bright_red
|
border: bright_red
|
||||||
tileSetFile: standard.gif
|
tileSetFile: standard.gif
|
||||||
|
|||||||
157
data/shaders/crtpi.glsl
Normal file
@@ -0,0 +1,157 @@
|
|||||||
|
#version 330 core
|
||||||
|
|
||||||
|
// Configuración
|
||||||
|
#define SCANLINES
|
||||||
|
#define MULTISAMPLE
|
||||||
|
#define GAMMA
|
||||||
|
//#define FAKE_GAMMA
|
||||||
|
//#define CURVATURE
|
||||||
|
//#define SHARPER
|
||||||
|
#define MASK_TYPE 2
|
||||||
|
|
||||||
|
#define CURVATURE_X 0.05
|
||||||
|
#define CURVATURE_Y 0.1
|
||||||
|
#define MASK_BRIGHTNESS 0.80
|
||||||
|
#define SCANLINE_WEIGHT 6.0
|
||||||
|
#define SCANLINE_GAP_BRIGHTNESS 0.12
|
||||||
|
#define BLOOM_FACTOR 3.5
|
||||||
|
#define INPUT_GAMMA 2.4
|
||||||
|
#define OUTPUT_GAMMA 2.2
|
||||||
|
|
||||||
|
// Inputs desde vertex shader
|
||||||
|
in vec2 vTexCoord;
|
||||||
|
in float vFilterWidth;
|
||||||
|
#if defined(CURVATURE)
|
||||||
|
in vec2 vScreenScale;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Output
|
||||||
|
out vec4 FragColor;
|
||||||
|
|
||||||
|
// Uniforms
|
||||||
|
uniform sampler2D Texture;
|
||||||
|
uniform vec2 TextureSize;
|
||||||
|
|
||||||
|
#if defined(CURVATURE)
|
||||||
|
vec2 Distort(vec2 coord)
|
||||||
|
{
|
||||||
|
vec2 CURVATURE_DISTORTION = vec2(CURVATURE_X, CURVATURE_Y);
|
||||||
|
vec2 barrelScale = 1.0 - (0.23 * CURVATURE_DISTORTION);
|
||||||
|
coord *= vScreenScale;
|
||||||
|
coord -= vec2(0.5);
|
||||||
|
float rsq = coord.x * coord.x + coord.y * coord.y;
|
||||||
|
coord += coord * (CURVATURE_DISTORTION * rsq);
|
||||||
|
coord *= barrelScale;
|
||||||
|
if (abs(coord.x) >= 0.5 || abs(coord.y) >= 0.5)
|
||||||
|
coord = vec2(-1.0);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
coord += vec2(0.5);
|
||||||
|
coord /= vScreenScale;
|
||||||
|
}
|
||||||
|
return coord;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
float CalcScanLineWeight(float dist)
|
||||||
|
{
|
||||||
|
return max(1.0 - dist * dist * SCANLINE_WEIGHT, SCANLINE_GAP_BRIGHTNESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
float CalcScanLine(float dy)
|
||||||
|
{
|
||||||
|
float scanLineWeight = CalcScanLineWeight(dy);
|
||||||
|
#if defined(MULTISAMPLE)
|
||||||
|
scanLineWeight += CalcScanLineWeight(dy - vFilterWidth);
|
||||||
|
scanLineWeight += CalcScanLineWeight(dy + vFilterWidth);
|
||||||
|
scanLineWeight *= 0.3333333;
|
||||||
|
#endif
|
||||||
|
return scanLineWeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
#if defined(CURVATURE)
|
||||||
|
vec2 texcoord = Distort(vTexCoord);
|
||||||
|
if (texcoord.x < 0.0) {
|
||||||
|
FragColor = vec4(0.0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
vec2 texcoord = vTexCoord;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
vec2 texcoordInPixels = texcoord * TextureSize;
|
||||||
|
|
||||||
|
#if defined(SHARPER)
|
||||||
|
vec2 tempCoord = floor(texcoordInPixels) + 0.5;
|
||||||
|
vec2 coord = tempCoord / TextureSize;
|
||||||
|
vec2 deltas = texcoordInPixels - tempCoord;
|
||||||
|
float scanLineWeight = CalcScanLine(deltas.y);
|
||||||
|
vec2 signs = sign(deltas);
|
||||||
|
deltas.x *= 2.0;
|
||||||
|
deltas = deltas * deltas;
|
||||||
|
deltas.y = deltas.y * deltas.y;
|
||||||
|
deltas.x *= 0.5;
|
||||||
|
deltas.y *= 8.0;
|
||||||
|
deltas /= TextureSize;
|
||||||
|
deltas *= signs;
|
||||||
|
vec2 tc = coord + deltas;
|
||||||
|
#else
|
||||||
|
float tempY = floor(texcoordInPixels.y) + 0.5;
|
||||||
|
float yCoord = tempY / TextureSize.y;
|
||||||
|
float dy = texcoordInPixels.y - tempY;
|
||||||
|
float scanLineWeight = CalcScanLine(dy);
|
||||||
|
float signY = sign(dy);
|
||||||
|
dy = dy * dy;
|
||||||
|
dy = dy * dy;
|
||||||
|
dy *= 8.0;
|
||||||
|
dy /= TextureSize.y;
|
||||||
|
dy *= signY;
|
||||||
|
vec2 tc = vec2(texcoord.x, yCoord + dy);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
vec3 colour = texture(Texture, tc).rgb;
|
||||||
|
|
||||||
|
#if defined(SCANLINES)
|
||||||
|
#if defined(GAMMA)
|
||||||
|
#if defined(FAKE_GAMMA)
|
||||||
|
colour = colour * colour;
|
||||||
|
#else
|
||||||
|
colour = pow(colour, vec3(INPUT_GAMMA));
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
scanLineWeight *= BLOOM_FACTOR;
|
||||||
|
colour *= scanLineWeight;
|
||||||
|
|
||||||
|
#if defined(GAMMA)
|
||||||
|
#if defined(FAKE_GAMMA)
|
||||||
|
colour = sqrt(colour);
|
||||||
|
#else
|
||||||
|
colour = pow(colour, vec3(1.0 / OUTPUT_GAMMA));
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if MASK_TYPE == 0
|
||||||
|
FragColor = vec4(colour, 1.0);
|
||||||
|
#elif MASK_TYPE == 1
|
||||||
|
float whichMask = fract(gl_FragCoord.x * 0.5);
|
||||||
|
vec3 mask;
|
||||||
|
if (whichMask < 0.5)
|
||||||
|
mask = vec3(MASK_BRIGHTNESS, 1.0, MASK_BRIGHTNESS);
|
||||||
|
else
|
||||||
|
mask = vec3(1.0, MASK_BRIGHTNESS, 1.0);
|
||||||
|
FragColor = vec4(colour * mask, 1.0);
|
||||||
|
#elif MASK_TYPE == 2
|
||||||
|
float whichMask = fract(gl_FragCoord.x * 0.3333333);
|
||||||
|
vec3 mask = vec3(MASK_BRIGHTNESS, MASK_BRIGHTNESS, MASK_BRIGHTNESS);
|
||||||
|
if (whichMask < 0.3333333)
|
||||||
|
mask.x = 1.0;
|
||||||
|
else if (whichMask < 0.6666666)
|
||||||
|
mask.y = 1.0;
|
||||||
|
else
|
||||||
|
mask.z = 1.0;
|
||||||
|
FragColor = vec4(colour * mask, 1.0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
48
data/shaders/crtpi.vert
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
#version 330 core
|
||||||
|
|
||||||
|
// Configuración
|
||||||
|
#define SCANLINES
|
||||||
|
#define MULTISAMPLE
|
||||||
|
#define GAMMA
|
||||||
|
//#define FAKE_GAMMA
|
||||||
|
//#define CURVATURE
|
||||||
|
//#define SHARPER
|
||||||
|
#define MASK_TYPE 2
|
||||||
|
|
||||||
|
#define CURVATURE_X 0.05
|
||||||
|
#define CURVATURE_Y 0.1
|
||||||
|
#define MASK_BRIGHTNESS 0.80
|
||||||
|
#define SCANLINE_WEIGHT 6.0
|
||||||
|
#define SCANLINE_GAP_BRIGHTNESS 0.12
|
||||||
|
#define BLOOM_FACTOR 3.5
|
||||||
|
#define INPUT_GAMMA 2.4
|
||||||
|
#define OUTPUT_GAMMA 2.2
|
||||||
|
|
||||||
|
// Inputs (desde VAO)
|
||||||
|
layout(location = 0) in vec2 aPosition;
|
||||||
|
layout(location = 1) in vec2 aTexCoord;
|
||||||
|
|
||||||
|
// Outputs al fragment shader
|
||||||
|
out vec2 vTexCoord;
|
||||||
|
out float vFilterWidth;
|
||||||
|
#if defined(CURVATURE)
|
||||||
|
out vec2 vScreenScale;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Uniforms
|
||||||
|
uniform vec2 TextureSize;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
#if defined(CURVATURE)
|
||||||
|
vScreenScale = vec2(1.0, 1.0);
|
||||||
|
#endif
|
||||||
|
// Calcula filterWidth dinámicamente basándose en la altura de la textura
|
||||||
|
vFilterWidth = (768.0 / TextureSize.y) / 3.0;
|
||||||
|
|
||||||
|
// Pasar coordenadas de textura (invertir Y para SDL)
|
||||||
|
vTexCoord = vec2(aTexCoord.x, 1.0 - aTexCoord.y) * 1.0001;
|
||||||
|
|
||||||
|
// Posición del vértice (ya en espacio de clip [-1, 1])
|
||||||
|
gl_Position = vec4(aPosition, 0.0, 1.0);
|
||||||
|
}
|
||||||
152
data/shaders/crtpi_frag.glsl
Normal file
@@ -0,0 +1,152 @@
|
|||||||
|
#version 450
|
||||||
|
|
||||||
|
// Vulkan GLSL fragment shader — CRT-Pi PostFX
|
||||||
|
// Algoritmo de scanlines continuas con pesos gaussianos, bloom y máscara de fósforo.
|
||||||
|
// Basado en el shader CRT-Pi original (GLSL 3.3), portado a GLSL 4.50 con parámetros uniformes.
|
||||||
|
//
|
||||||
|
// Compile: glslc -fshader-stage=frag --target-env=vulkan1.0 crtpi_frag.glsl -o crtpi_frag.spv
|
||||||
|
// xxd -i crtpi_frag.spv > ../../source/core/rendering/sdl3gpu/crtpi_frag_spv.h
|
||||||
|
|
||||||
|
layout(location = 0) in vec2 v_uv;
|
||||||
|
layout(location = 0) out vec4 out_color;
|
||||||
|
|
||||||
|
layout(set = 2, binding = 0) uniform sampler2D Texture;
|
||||||
|
|
||||||
|
layout(set = 3, binding = 0) uniform CrtPiBlock {
|
||||||
|
// vec4 #0
|
||||||
|
float scanline_weight; // Ajuste gaussiano de scanlines (default 6.0)
|
||||||
|
float scanline_gap_brightness; // Brillo mínimo entre scanlines (default 0.12)
|
||||||
|
float bloom_factor; // Factor de brillo en zonas iluminadas (default 3.5)
|
||||||
|
float input_gamma; // Gamma de entrada — linealización (default 2.4)
|
||||||
|
// vec4 #1
|
||||||
|
float output_gamma; // Gamma de salida — codificación (default 2.2)
|
||||||
|
float mask_brightness; // Brillo sub-píxeles de la máscara (default 0.80)
|
||||||
|
float curvature_x; // Distorsión barrel eje X (default 0.05)
|
||||||
|
float curvature_y; // Distorsión barrel eje Y (default 0.10)
|
||||||
|
// vec4 #2
|
||||||
|
int mask_type; // 0=ninguna, 1=verde/magenta, 2=RGB fósforo
|
||||||
|
int enable_scanlines; // 0 = off, 1 = on
|
||||||
|
int enable_multisample; // 0 = off, 1 = on (antialiasing analítico de scanlines)
|
||||||
|
int enable_gamma; // 0 = off, 1 = on
|
||||||
|
// vec4 #3
|
||||||
|
int enable_curvature; // 0 = off, 1 = on
|
||||||
|
int enable_sharper; // 0 = off, 1 = on
|
||||||
|
float texture_width; // Ancho del canvas lógico en píxeles
|
||||||
|
float texture_height; // Alto del canvas lógico en píxeles
|
||||||
|
} u;
|
||||||
|
|
||||||
|
// Distorsión barrel CRT
|
||||||
|
vec2 distort(vec2 coord, vec2 screen_scale) {
|
||||||
|
vec2 curvature = vec2(u.curvature_x, u.curvature_y);
|
||||||
|
vec2 barrel_scale = 1.0 - (0.23 * curvature);
|
||||||
|
coord *= screen_scale;
|
||||||
|
coord -= vec2(0.5);
|
||||||
|
float rsq = coord.x * coord.x + coord.y * coord.y;
|
||||||
|
coord += coord * (curvature * rsq);
|
||||||
|
coord *= barrel_scale;
|
||||||
|
if (abs(coord.x) >= 0.5 || abs(coord.y) >= 0.5) {
|
||||||
|
return vec2(-1.0); // fuera de pantalla
|
||||||
|
}
|
||||||
|
coord += vec2(0.5);
|
||||||
|
coord /= screen_scale;
|
||||||
|
return coord;
|
||||||
|
}
|
||||||
|
|
||||||
|
float calcScanLineWeight(float dist) {
|
||||||
|
return max(1.0 - dist * dist * u.scanline_weight, u.scanline_gap_brightness);
|
||||||
|
}
|
||||||
|
|
||||||
|
float calcScanLine(float dy, float filter_width) {
|
||||||
|
float weight = calcScanLineWeight(dy);
|
||||||
|
if (u.enable_multisample != 0) {
|
||||||
|
weight += calcScanLineWeight(dy - filter_width);
|
||||||
|
weight += calcScanLineWeight(dy + filter_width);
|
||||||
|
weight *= 0.3333333;
|
||||||
|
}
|
||||||
|
return weight;
|
||||||
|
}
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
vec2 tex_size = vec2(u.texture_width, u.texture_height);
|
||||||
|
|
||||||
|
// filterWidth: equivalente al original (768.0 / TextureSize.y) / 3.0
|
||||||
|
float filter_width = (768.0 / u.texture_height) / 3.0;
|
||||||
|
|
||||||
|
vec2 texcoord = v_uv;
|
||||||
|
|
||||||
|
// Curvatura barrel opcional
|
||||||
|
if (u.enable_curvature != 0) {
|
||||||
|
texcoord = distort(texcoord, vec2(1.0, 1.0));
|
||||||
|
if (texcoord.x < 0.0) {
|
||||||
|
out_color = vec4(0.0, 0.0, 0.0, 1.0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
vec2 texcoord_in_pixels = texcoord * tex_size;
|
||||||
|
vec2 tc;
|
||||||
|
float scan_line_weight;
|
||||||
|
|
||||||
|
if (u.enable_sharper != 0) {
|
||||||
|
// Modo SHARPER: filtrado bicúbico-like con subpixel sharpen
|
||||||
|
vec2 temp_coord = floor(texcoord_in_pixels) + 0.5;
|
||||||
|
tc = temp_coord / tex_size;
|
||||||
|
vec2 deltas = texcoord_in_pixels - temp_coord;
|
||||||
|
scan_line_weight = calcScanLine(deltas.y, filter_width);
|
||||||
|
vec2 signs = sign(deltas);
|
||||||
|
deltas.x *= 2.0;
|
||||||
|
deltas = deltas * deltas;
|
||||||
|
deltas.y = deltas.y * deltas.y;
|
||||||
|
deltas.x *= 0.5;
|
||||||
|
deltas.y *= 8.0;
|
||||||
|
deltas /= tex_size;
|
||||||
|
deltas *= signs;
|
||||||
|
tc = tc + deltas;
|
||||||
|
} else {
|
||||||
|
// Modo estándar
|
||||||
|
float temp_y = floor(texcoord_in_pixels.y) + 0.5;
|
||||||
|
float y_coord = temp_y / tex_size.y;
|
||||||
|
float dy = texcoord_in_pixels.y - temp_y;
|
||||||
|
scan_line_weight = calcScanLine(dy, filter_width);
|
||||||
|
float sign_y = sign(dy);
|
||||||
|
dy = dy * dy;
|
||||||
|
dy = dy * dy;
|
||||||
|
dy *= 8.0;
|
||||||
|
dy /= tex_size.y;
|
||||||
|
dy *= sign_y;
|
||||||
|
tc = vec2(texcoord.x, y_coord + dy);
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 colour = texture(Texture, tc).rgb;
|
||||||
|
|
||||||
|
if (u.enable_scanlines != 0) {
|
||||||
|
if (u.enable_gamma != 0) {
|
||||||
|
colour = pow(colour, vec3(u.input_gamma));
|
||||||
|
}
|
||||||
|
colour *= scan_line_weight * u.bloom_factor;
|
||||||
|
if (u.enable_gamma != 0) {
|
||||||
|
colour = pow(colour, vec3(1.0 / u.output_gamma));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Máscara de fósforo
|
||||||
|
if (u.mask_type == 1) {
|
||||||
|
float which_mask = fract(gl_FragCoord.x * 0.5);
|
||||||
|
vec3 mask = (which_mask < 0.5)
|
||||||
|
? vec3(u.mask_brightness, 1.0, u.mask_brightness)
|
||||||
|
: vec3(1.0, u.mask_brightness, 1.0);
|
||||||
|
colour *= mask;
|
||||||
|
} else if (u.mask_type == 2) {
|
||||||
|
float which_mask = fract(gl_FragCoord.x * 0.3333333);
|
||||||
|
vec3 mask = vec3(u.mask_brightness);
|
||||||
|
if (which_mask < 0.3333333)
|
||||||
|
mask.x = 1.0;
|
||||||
|
else if (which_mask < 0.6666666)
|
||||||
|
mask.y = 1.0;
|
||||||
|
else
|
||||||
|
mask.z = 1.0;
|
||||||
|
colour *= mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
out_color = vec4(colour, 1.0);
|
||||||
|
}
|
||||||
BIN
data/shaders/crtpi_frag.spv
Normal file
48
data/shaders/downscale.frag
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
#version 450
|
||||||
|
layout(location = 0) in vec2 v_uv;
|
||||||
|
layout(location = 0) out vec4 out_color;
|
||||||
|
|
||||||
|
layout(set = 2, binding = 0) uniform sampler2D source;
|
||||||
|
|
||||||
|
layout(set = 3, binding = 0) uniform DownscaleUniforms {
|
||||||
|
int algorithm; // 0 = Lanczos2 (ventana 2, ±2 taps), 1 = Lanczos3 (ventana 3, ±3 taps)
|
||||||
|
float pad0;
|
||||||
|
float pad1;
|
||||||
|
float pad2;
|
||||||
|
} u;
|
||||||
|
|
||||||
|
// Kernel Lanczos normalizado: sinc(t) * sinc(t/a) para |t| < a, 0 fuera.
|
||||||
|
float lanczos(float t, float a) {
|
||||||
|
t = abs(t);
|
||||||
|
if (t < 0.0001) { return 1.0; }
|
||||||
|
if (t >= a) { return 0.0; }
|
||||||
|
const float PI = 3.14159265358979;
|
||||||
|
float pt = PI * t;
|
||||||
|
return (a * sin(pt) * sin(pt / a)) / (pt * pt);
|
||||||
|
}
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
vec2 src_size = vec2(textureSize(source, 0));
|
||||||
|
// Posición en coordenadas de texel (centros de texel en N+0.5)
|
||||||
|
vec2 p = v_uv * src_size;
|
||||||
|
vec2 p_floor = floor(p);
|
||||||
|
|
||||||
|
float a = (u.algorithm == 0) ? 2.0 : 3.0;
|
||||||
|
int win = int(a);
|
||||||
|
|
||||||
|
vec4 color = vec4(0.0);
|
||||||
|
float weight_sum = 0.0;
|
||||||
|
|
||||||
|
for (int j = -win; j <= win; j++) {
|
||||||
|
for (int i = -win; i <= win; i++) {
|
||||||
|
// Centro del texel (i,j) relativo a p_floor
|
||||||
|
vec2 tap_center = p_floor + vec2(float(i), float(j)) + 0.5;
|
||||||
|
vec2 offset = tap_center - p;
|
||||||
|
float w = lanczos(offset.x, a) * lanczos(offset.y, a);
|
||||||
|
color += texture(source, tap_center / src_size) * w;
|
||||||
|
weight_sum += w;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
out_color = (weight_sum > 0.0) ? (color / weight_sum) : vec4(0.0, 0.0, 0.0, 1.0);
|
||||||
|
}
|
||||||
@@ -22,6 +22,10 @@ layout(set = 3, binding = 0) uniform PostFXUniforms {
|
|||||||
float gamma_strength;
|
float gamma_strength;
|
||||||
float curvature;
|
float curvature;
|
||||||
float bleeding;
|
float bleeding;
|
||||||
|
float pixel_scale; // physical pixels per logical pixel (vh / tex_height_)
|
||||||
|
float time; // seconds since SDL init
|
||||||
|
float oversample; // supersampling factor (1.0 = off, 3.0 = 3×SS)
|
||||||
|
float flicker; // 0 = off, 1 = phosphor flicker ~50 Hz — 48 bytes total (3 × 16)
|
||||||
} u;
|
} u;
|
||||||
|
|
||||||
// YCbCr helpers for NTSC bleeding
|
// YCbCr helpers for NTSC bleeding
|
||||||
@@ -64,23 +68,25 @@ void main() {
|
|||||||
// Muestra base
|
// Muestra base
|
||||||
vec3 base = texture(scene, uv).rgb;
|
vec3 base = texture(scene, uv).rgb;
|
||||||
|
|
||||||
// Sangrado NTSC — difuminado horizontal de crominancia
|
// Sangrado NTSC — difuminado horizontal de crominancia.
|
||||||
|
// step = 1 pixel lógico de juego en UV (corrige SS: textureSize.x = game_w * oversample).
|
||||||
vec3 colour;
|
vec3 colour;
|
||||||
if (u.bleeding > 0.0) {
|
if (u.bleeding > 0.0) {
|
||||||
float tw = float(textureSize(scene, 0).x);
|
float tw = float(textureSize(scene, 0).x);
|
||||||
|
float step = u.oversample / tw; // 1 pixel lógico en UV
|
||||||
vec3 ycc = rgb_to_ycc(base);
|
vec3 ycc = rgb_to_ycc(base);
|
||||||
vec3 ycc_l2 = rgb_to_ycc(texture(scene, uv - vec2(2.0/tw, 0.0)).rgb);
|
vec3 ycc_l2 = rgb_to_ycc(texture(scene, uv - vec2(2.0*step, 0.0)).rgb);
|
||||||
vec3 ycc_l1 = rgb_to_ycc(texture(scene, uv - vec2(1.0/tw, 0.0)).rgb);
|
vec3 ycc_l1 = rgb_to_ycc(texture(scene, uv - vec2(1.0*step, 0.0)).rgb);
|
||||||
vec3 ycc_r1 = rgb_to_ycc(texture(scene, uv + vec2(1.0/tw, 0.0)).rgb);
|
vec3 ycc_r1 = rgb_to_ycc(texture(scene, uv + vec2(1.0*step, 0.0)).rgb);
|
||||||
vec3 ycc_r2 = rgb_to_ycc(texture(scene, uv + vec2(2.0/tw, 0.0)).rgb);
|
vec3 ycc_r2 = rgb_to_ycc(texture(scene, uv + vec2(2.0*step, 0.0)).rgb);
|
||||||
ycc.yz = (ycc_l2.yz + ycc_l1.yz*2.0 + ycc.yz*2.0 + ycc_r1.yz*2.0 + ycc_r2.yz) / 8.0;
|
ycc.yz = (ycc_l2.yz + ycc_l1.yz*2.0 + ycc.yz*2.0 + ycc_r1.yz*2.0 + ycc_r2.yz) / 8.0;
|
||||||
colour = mix(base, ycc_to_rgb(ycc), u.bleeding);
|
colour = mix(base, ycc_to_rgb(ycc), u.bleeding);
|
||||||
} else {
|
} else {
|
||||||
colour = base;
|
colour = base;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Aberración cromática
|
// Aberración cromática (drift animado con time para efecto NTSC real)
|
||||||
float ca = u.chroma_strength * 0.005;
|
float ca = u.chroma_strength * 0.005 * (1.0 + 0.15 * sin(u.time * 7.3));
|
||||||
colour.r = texture(scene, uv + vec2(ca, 0.0)).r;
|
colour.r = texture(scene, uv + vec2(ca, 0.0)).r;
|
||||||
colour.b = texture(scene, uv - vec2(ca, 0.0)).b;
|
colour.b = texture(scene, uv - vec2(ca, 0.0)).b;
|
||||||
|
|
||||||
@@ -90,14 +96,24 @@ void main() {
|
|||||||
colour = mix(colour, lin, u.gamma_strength);
|
colour = mix(colour, lin, u.gamma_strength);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Scanlines
|
// Scanlines — proporción 2/3 brillantes + 1/3 oscuras por fila lógica.
|
||||||
float texHeight = float(textureSize(scene, 0).y);
|
// Casos especiales: 1 subfila → sin efecto; 2 subfilas → 1+1 (50/50).
|
||||||
float scaleY = u.screen_height / texHeight;
|
// Constantes ajustables:
|
||||||
float screenY = uv.y * u.screen_height;
|
const float SCAN_DARK_RATIO = 0.333; // fracción de subfilas oscuras (ps >= 3)
|
||||||
float posInRow = mod(screenY, scaleY);
|
const float SCAN_DARK_FLOOR = 0.42; // multiplicador de brillo de subfilas oscuras
|
||||||
float scanLineDY = posInRow / scaleY - 0.5;
|
if (u.scanline_strength > 0.0) {
|
||||||
float scan = max(1.0 - scanLineDY * scanLineDY * 6.0, 0.12) * 3.5;
|
float ps = max(1.0, round(u.pixel_scale));
|
||||||
|
float frac_in_row = fract(uv.y * u.screen_height);
|
||||||
|
float row_pos = floor(frac_in_row * ps);
|
||||||
|
// bright_rows: cuántas subfilas son brillantes
|
||||||
|
// ps==1 → ps (todo brillante → is_dark nunca se activa)
|
||||||
|
// ps==2 → 1 brillante + 1 oscura
|
||||||
|
// ps>=3 → floor(ps * (1 - DARK_RATIO)) brillantes
|
||||||
|
float bright_rows = (ps < 2.0) ? ps : ((ps < 3.0) ? 1.0 : floor(ps * (1.0 - SCAN_DARK_RATIO)));
|
||||||
|
float is_dark = step(bright_rows, row_pos);
|
||||||
|
float scan = mix(1.0, SCAN_DARK_FLOOR, is_dark);
|
||||||
colour *= mix(1.0, scan, u.scanline_strength);
|
colour *= mix(1.0, scan, u.scanline_strength);
|
||||||
|
}
|
||||||
|
|
||||||
if (u.gamma_strength > 0.0) {
|
if (u.gamma_strength > 0.0) {
|
||||||
vec3 enc = pow(colour, vec3(1.0 / 2.2));
|
vec3 enc = pow(colour, vec3(1.0 / 2.2));
|
||||||
@@ -109,7 +125,8 @@ void main() {
|
|||||||
float vignette = 1.0 - dot(d, d) * u.vignette_strength;
|
float vignette = 1.0 - dot(d, d) * u.vignette_strength;
|
||||||
colour *= clamp(vignette, 0.0, 1.0);
|
colour *= clamp(vignette, 0.0, 1.0);
|
||||||
|
|
||||||
// Máscara de fósforo RGB
|
// Máscara de fósforo RGB — después de scanlines (orden original):
|
||||||
|
// filas brillantes saturadas → máscara invisible, filas oscuras → RGB visible.
|
||||||
if (u.mask_strength > 0.0) {
|
if (u.mask_strength > 0.0) {
|
||||||
float whichMask = fract(gl_FragCoord.x * 0.3333333);
|
float whichMask = fract(gl_FragCoord.x * 0.3333333);
|
||||||
vec3 mask = vec3(0.80);
|
vec3 mask = vec3(0.80);
|
||||||
@@ -122,5 +139,11 @@ void main() {
|
|||||||
colour = mix(colour, colour * mask, u.mask_strength);
|
colour = mix(colour, colour * mask, u.mask_strength);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Parpadeo de fósforo CRT (~50 Hz)
|
||||||
|
if (u.flicker > 0.0) {
|
||||||
|
float flicker_wave = sin(u.time * 100.0) * 0.5 + 0.5;
|
||||||
|
colour *= 1.0 - u.flicker * 0.04 * flicker_wave;
|
||||||
|
}
|
||||||
|
|
||||||
out_color = vec4(colour, 1.0);
|
out_color = vec4(colour, 1.0);
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
data/shaders/postfx.frag.spv
Normal file
15
data/shaders/upscale.frag
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
#version 450
|
||||||
|
|
||||||
|
// Vulkan GLSL fragment shader — Nearest-neighbour upscale pass
|
||||||
|
// Used as the first render pass when supersampling is active.
|
||||||
|
// Compile: glslc upscale.frag -o upscale.frag.spv
|
||||||
|
// xxd -i upscale.frag.spv > ../../source/core/rendering/sdl3gpu/upscale_frag_spv.h
|
||||||
|
|
||||||
|
layout(location = 0) in vec2 v_uv;
|
||||||
|
layout(location = 0) out vec4 out_color;
|
||||||
|
|
||||||
|
layout(set = 2, binding = 0) uniform sampler2D scene;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
out_color = texture(scene, v_uv);
|
||||||
|
}
|
||||||
BIN
data/shaders/upscale.frag.spv
Normal file
@@ -1,141 +0,0 @@
|
|||||||
# BUGS DETECTADOS - Reescritura Player
|
|
||||||
|
|
||||||
**Fecha:** 2025-10-30
|
|
||||||
**Commit funcional de referencia:** `7cd596a0b9876c75ff75efc13708a2ca00c8cfcd`
|
|
||||||
**Estado:** La reescritura según PLAYER_MECHANICS.md ha introducido múltiples regresiones
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🐛 BUGS CRÍTICOS DETECTADOS
|
|
||||||
|
|
||||||
### 2. **Salto recto en rampa: atraviesa la rampa al caer**
|
|
||||||
- **Descripción:** Si el jugador salta verticalmente (sin movimiento horizontal) estando en una rampa, al caer atraviesa la rampa
|
|
||||||
- **Estado esperado:** Salto recto (vx_ == 0) debería pegarse a la rampa al descender
|
|
||||||
- **Regla violada:** PLAYER_MECHANICS.md líneas 386-391 - "JUMPING con vx_ == 0 se PEGA a la rampa"
|
|
||||||
- **Posible causa:** Lógica en `moveVerticalDown()` no detecta correctamente el caso vx_ == 0
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 4. **No suena al saltar**
|
|
||||||
- **Descripción:** Los sonidos de salto no se reproducen
|
|
||||||
- **Estado esperado:** Sonidos progresivos basados en distancia vertical
|
|
||||||
- **Posible causa:**
|
|
||||||
- `y_prev_` no se inicializa correctamente
|
|
||||||
- Sistema de detección de cambio de índice no funciona
|
|
||||||
- `last_grounded_position_` no se actualiza en el momento correcto
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 5. **No suena al caer**
|
|
||||||
- **Descripción:** Los sonidos de caída no se reproducen
|
|
||||||
- **Estado esperado:** Sonidos progresivos basados en distancia vertical caída
|
|
||||||
- **Posible causa:** Similar al bug #4, sistema distance-based no detecta cambios
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 6. **Caer desde precipicio con inercia sobre rampa: resbala en estado FALLING**
|
|
||||||
- **Descripción:** Al caer con inercia horizontal sobre una rampa, el jugador resbala en lugar de pegarse
|
|
||||||
- **Estado esperado:** FALLING siempre debe tener `vx_ = 0` y pegarse a rampas
|
|
||||||
- **Regla violada:** PLAYER_MECHANICS.md línea 147 - "FALLING se PEGA a TODAS las rampas"
|
|
||||||
- **Posible causa:** `vx_` no se establece a 0 correctamente en transición a FALLING, o se ejecuta después del movimiento horizontal
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 7. **No muere al caer desde gran altura**
|
|
||||||
- **Descripción:** El jugador puede caer desde cualquier altura sin morir
|
|
||||||
- **Estado esperado:** Caída > 32 píxeles (4 tiles) debería matar al jugador
|
|
||||||
- **Regla violada:** PLAYER_MECHANICS.md líneas 158-178
|
|
||||||
- **Posible causa:**
|
|
||||||
- La verificación de muerte en `moveVerticalDown()` no se ejecuta
|
|
||||||
- `previous_state_` no es FALLING cuando debería
|
|
||||||
- Cálculo de `FALL_DISTANCE` es incorrecto
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 8. **No muere al caer sobre conveyor belt desde altura**
|
|
||||||
- **Descripción:** El jugador puede caer sobre una conveyor belt desde cualquier altura sin morir
|
|
||||||
- **Estado esperado:** Caída > 32 píxeles sobre conveyor belt también debería matar
|
|
||||||
- **Regla violada:** PLAYER_MECHANICS.md líneas 158-178
|
|
||||||
- **Posible causa:**
|
|
||||||
- La verificación de muerte solo está en la rama de suelo normal (`checkTopSurfaces`)
|
|
||||||
- Posiblemente necesita estar también cuando aterriza en `checkAutoSurfaces`
|
|
||||||
- Podría ser un subcaso del bug #7
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔍 ANÁLISIS PRELIMINAR
|
|
||||||
|
|
||||||
### Problema raíz principal: **Orden de ejecución**
|
|
||||||
|
|
||||||
El orden actual es:
|
|
||||||
```cpp
|
|
||||||
move() {
|
|
||||||
y_prev_ = y_;
|
|
||||||
applyGravity();
|
|
||||||
updateStateAndVelocity(); // ← Cambia estado y DEBERÍA cambiar vx_
|
|
||||||
moveHorizontal(); // ← Aplica vx_ (que puede ser incorrecto)
|
|
||||||
moveVertical();
|
|
||||||
updateColliderGeometry();
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Problema:** `updateStateAndVelocity()` puede cambiar el estado a FALLING y establecer `vx_ = 0`, pero esto ocurre DENTRO del switch que solo se ejecuta DESPUÉS de que `previous_state_` ya esté establecido. En el código actual, cuando se hace la transición STANDING → FALLING, `setState()` NO establece `vx_ = 0` (se supone que lo hace `updateStateAndVelocity()`), pero esto puede no ejecutarse hasta el siguiente frame.
|
|
||||||
|
|
||||||
### Problema raíz secundario: **setState() incompleto**
|
|
||||||
|
|
||||||
En el commit funcional (`7cd596a0b9876c75ff75efc13708a2ca00c8cfcd`), `setState()` probablemente establecía TODAS las variables necesarias inmediatamente. En la reescritura actual, se delegó parte de esta responsabilidad a `updateStateAndVelocity()`, creando una desincronización.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📋 PLAN DE SOLUCIÓN
|
|
||||||
|
|
||||||
### Opción A: Volver al commit funcional y refactorizar con cuidado
|
|
||||||
1. Hacer `git diff` entre commit funcional y actual
|
|
||||||
2. Identificar QUÉ funcionaba en el original
|
|
||||||
3. Aplicar solo los cambios necesarios (eliminar `jumping_time_`, unificar variables)
|
|
||||||
4. Mantener la lógica de setState() completa
|
|
||||||
|
|
||||||
### Opción B: Corregir bugs uno por uno en código actual
|
|
||||||
1. Arreglar `setState()` para que establezca TODAS las variables inmediatamente
|
|
||||||
2. Revisar orden de ejecución en `move()`
|
|
||||||
3. Depurar sistema de sonidos
|
|
||||||
4. Probar cada bug individualmente
|
|
||||||
|
|
||||||
### Opción C: Híbrido
|
|
||||||
1. Extraer lógica funcional del commit 7cd596a
|
|
||||||
2. Aplicar solo las correcciones de PLAYER_MECHANICS.md que no rompen funcionalidad:
|
|
||||||
- Cambiar `jump_init_pos_` → `last_grounded_position_` (con cuidado)
|
|
||||||
- Eliminar `jumping_time_` (secundario, no crítico)
|
|
||||||
- Implementar sistema de sonidos distance-based (después de que todo funcione)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 RECOMENDACIÓN
|
|
||||||
|
|
||||||
**Opción C (Híbrido)** parece la más sensata:
|
|
||||||
|
|
||||||
1. Revertir a un punto funcional
|
|
||||||
2. Aplicar cambios incrementales uno por uno
|
|
||||||
3. Testear después de cada cambio
|
|
||||||
4. No hacer cambios arquitecturales grandes (mantener `updateState()` y `updateVelocity()` separados si funcionaba así)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📝 NOTAS ADICIONALES
|
|
||||||
|
|
||||||
- El commit `7cd596a` funciona perfecto según el usuario, aunque el código sea "caótico"
|
|
||||||
- **Lección aprendida:** Refactorizar código funcional sin tests automáticos es peligroso
|
|
||||||
- La sincronización estado-velocidad es más sutil de lo que parecía
|
|
||||||
- PLAYER_MECHANICS.md puede tener asunciones incorrectas sobre el orden de ejecución óptimo
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ✅ PRÓXIMOS PASOS
|
|
||||||
|
|
||||||
1. Comparar código actual vs commit 7cd596a
|
|
||||||
2. Identificar diferencias críticas en:
|
|
||||||
- `setState()`
|
|
||||||
- `move()`
|
|
||||||
- `updateState()`/`updateVelocity()`
|
|
||||||
- Transiciones de estado
|
|
||||||
3. Decidir estrategia: revertir completo, revertir parcial, o corregir in-place
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
# Reglas para la clase Player
|
|
||||||
|
|
||||||
## Estados
|
|
||||||
|
|
||||||
El jugador tiene tres estados diferenciados:
|
|
||||||
- STANDING
|
|
||||||
- JUMPING
|
|
||||||
- FALLING
|
|
||||||
|
|
||||||
## Puntos de colision
|
|
||||||
|
|
||||||
El jugador tiene un rectabgulo que lo delimita. Se obtiene con getRect()
|
|
||||||
Tiene ademas dos puntos en un vector de puntos llamado feet_ con el punto inferior izquierdo y el inferior derecho
|
|
||||||
Tiene otros dos puntos llamados under_feet_ que son los puntos inmediatamente inferiores a los puntos en feet_. Se usan para saber SOBRE qué tipo de superficie esta el jugador o si bajo solo tiene aire
|
|
||||||
Tiene otros 8 puntos (el jugador ocupa dos tiles en vertical del mapa, los tiles son de 8 pixeles) que son las 4 esquinas de los dos rectangulos de 8px que formarian al jugador. Se usa para comprobar si el jugador está tocando algun tile de los que matan
|
|
||||||
|
|
||||||
## Comprobar colisiones con el mapa
|
|
||||||
Esto es un poco marciano pero, el jugador genera un rectangulo de proyeccion. Digamos que si se va a mover 3 pixeles hacia la derecha, el rectangulo de proyeccion es el rectangulo que cubre la superficie entre donde está el jugador y donde estará el jugador. Se usa para ver si ese rectangulo (que suele ser de ancho o alto 1, ya que el jugador no llega a moverse mas de un pixel cada vez) colisiona con alguna superficie del mapa. En caso de colision se devuelve el punto de colision y se recoloca al jugador en ese punto. Eso para las superficies rectas.
|
|
||||||
|
|
||||||
## Reglas
|
|
||||||
A continuacion las reglas que se han de cumplir para el jugador en todo momento
|
|
||||||
- Si está STANDING -> vy_ = 0;
|
|
||||||
- Si no tiene suelo debajo y no está JUMPING -> FALLING
|
|
||||||
- Si está JUMPING y tropieza contra el techo -> FALLING
|
|
||||||
- Si está FALLING -> vx_ = 0
|
|
||||||
- Si está STANDING y tropieza lateralmente con una Slope, se pega a la slope
|
|
||||||
- Si esta FALLING y tiene una Slope bajo los pies, se pega a la slope
|
|
||||||
- La unica forma de atravesar una Slope es en estado JUMPING y con vx_ != 0
|
|
||||||
- Si salta, se guarda la posicion inicial en Y, si durante el salto está mas bajo de Y (es decir, el valor de y pasa a ser superior al inicial) -> FALLING
|
|
||||||
|
|
||||||
## Tipos de superficies
|
|
||||||
Hay tres tipos de superficies:
|
|
||||||
- Suelo normal
|
|
||||||
- Suelo tipo conveyor belt
|
|
||||||
- Rampas
|
|
||||||
|
|
||||||
## Reglas explicadas de manera mas abierta
|
|
||||||
Debido a que las reglas anteriores pueden sonar confusas y ser incompletas, se describen aqui con lenguaje mas natural:
|
|
||||||
- El jugador camina sobre las superficies
|
|
||||||
- Si tiene los dos pies sobre el aire -> cae
|
|
||||||
- El jugador sube y baja por las rampas
|
|
||||||
- La unica forma de atravesar las rampas es saltando sobre ellas en movimiento
|
|
||||||
- Un salto recto o una caida (las caidas siempre son rectas) hacen aterrizar al jugador sobre las rampas
|
|
||||||
- Las conveyor belt desplazan al jugador en la direccion de la conveyor belt
|
|
||||||
- El jugador cuando esta siendo desplazado por una conveyor belt, no puede cambiar de direccion
|
|
||||||
- Solo puede saltar y la propia inercia le hace saltar en movimiento
|
|
||||||
- Hay una excepcion en las conveyor belts y es que cuando el jugador cae sobre ellas, puede mantener la direccion que tenia el jugador. En el momento que el jugador deja de estar pulsando una direccion, ya se acopla al movimiento de la conveyor belt y no puede cambiar de direccion
|
|
||||||
- El jugador deja de estar ligado al movimiento de la conveyor belt cuando sus dos pies ya no la tienen debajo, bien porque hay suelo o bien porque hay aire -> cae
|
|
||||||
- El jugador no puede cambiar de direccion en el aire
|
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
// jdd.rc
|
// jdd.rc
|
||||||
IDI_ICON1 ICON "icon.ico"
|
IDI_ICON1 ICON "release/icons/icon.ico"
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ void Audio::update() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Reproduce la música
|
// Reproduce la música
|
||||||
void Audio::playMusic(const std::string& name, const int loop) {
|
void Audio::playMusic(const std::string& name, const int loop) { // NOLINT(readability-convert-member-functions-to-static)
|
||||||
bool new_loop = (loop != 0);
|
bool new_loop = (loop != 0);
|
||||||
|
|
||||||
// Si ya está sonando exactamente la misma pista y mismo modo loop, no hacemos nada
|
// Si ya está sonando exactamente la misma pista y mismo modo loop, no hacemos nada
|
||||||
@@ -71,7 +71,7 @@ void Audio::playMusic(const std::string& name, const int loop) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Pausa la música
|
// Pausa la música
|
||||||
void Audio::pauseMusic() {
|
void Audio::pauseMusic() { // NOLINT(readability-convert-member-functions-to-static)
|
||||||
if (music_enabled_ && music_.state == MusicState::PLAYING) {
|
if (music_enabled_ && music_.state == MusicState::PLAYING) {
|
||||||
JA_PauseMusic();
|
JA_PauseMusic();
|
||||||
music_.state = MusicState::PAUSED;
|
music_.state = MusicState::PAUSED;
|
||||||
@@ -79,7 +79,7 @@ void Audio::pauseMusic() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Continua la música pausada
|
// Continua la música pausada
|
||||||
void Audio::resumeMusic() {
|
void Audio::resumeMusic() { // NOLINT(readability-convert-member-functions-to-static)
|
||||||
if (music_enabled_ && music_.state == MusicState::PAUSED) {
|
if (music_enabled_ && music_.state == MusicState::PAUSED) {
|
||||||
JA_ResumeMusic();
|
JA_ResumeMusic();
|
||||||
music_.state = MusicState::PLAYING;
|
music_.state = MusicState::PLAYING;
|
||||||
@@ -87,7 +87,7 @@ void Audio::resumeMusic() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Detiene la música
|
// Detiene la música
|
||||||
void Audio::stopMusic() {
|
void Audio::stopMusic() { // NOLINT(readability-make-member-function-const)
|
||||||
if (music_enabled_) {
|
if (music_enabled_) {
|
||||||
JA_StopMusic();
|
JA_StopMusic();
|
||||||
music_.state = MusicState::STOPPED;
|
music_.state = MusicState::STOPPED;
|
||||||
@@ -177,6 +177,18 @@ void Audio::initSDLAudio() {
|
|||||||
JA_Init(FREQUENCY, SDL_AUDIO_S16LE, 2);
|
JA_Init(FREQUENCY, SDL_AUDIO_S16LE, 2);
|
||||||
enable(Options::audio.enabled);
|
enable(Options::audio.enabled);
|
||||||
|
|
||||||
|
// Aplicar estado de música y sonido guardado en las opciones.
|
||||||
|
// enable() ya aplica los volúmenes, pero no toca music_enabled_/sound_enabled_.
|
||||||
|
// Si alguno está desactivado, hay que forzar el volumen a 0 en el backend.
|
||||||
|
if (!Options::audio.music.enabled) {
|
||||||
|
setMusicVolume(0.0F); // music_enabled_=true aún → llega a JA
|
||||||
|
enableMusic(false);
|
||||||
|
}
|
||||||
|
if (!Options::audio.sound.enabled) {
|
||||||
|
setSoundVolume(0.0F); // sound_enabled_=true aún → llega a JA
|
||||||
|
enableSound(false);
|
||||||
|
}
|
||||||
|
|
||||||
std::cout << "\n** AUDIO SYSTEM **\n";
|
std::cout << "\n** AUDIO SYSTEM **\n";
|
||||||
std::cout << "Audio system initialized successfully\n";
|
std::cout << "Audio system initialized successfully\n";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,28 +6,27 @@
|
|||||||
#include <vector> // Para vector
|
#include <vector> // Para vector
|
||||||
|
|
||||||
#include "core/input/input.hpp" // Para Input, InputAction, Input::DO_NOT_ALLOW_REPEAT
|
#include "core/input/input.hpp" // Para Input, InputAction, Input::DO_NOT_ALLOW_REPEAT
|
||||||
|
#include "core/locale/locale.hpp" // Para Locale
|
||||||
|
#include "core/rendering/render_info.hpp" // Para RenderInfo
|
||||||
#include "core/rendering/screen.hpp" // Para Screen
|
#include "core/rendering/screen.hpp" // Para Screen
|
||||||
#include "game/options.hpp" // Para Options, options, OptionsVideo, Section
|
#include "game/options.hpp" // Para Options, options, OptionsVideo, Section
|
||||||
#include "game/scene_manager.hpp" // Para SceneManager
|
#include "game/scene_manager.hpp" // Para SceneManager
|
||||||
|
#include "game/ui/console.hpp" // Para Console
|
||||||
#include "game/ui/notifier.hpp" // Para Notifier, NotificationText
|
#include "game/ui/notifier.hpp" // Para Notifier, NotificationText
|
||||||
#include "utils/utils.hpp" // Para stringInVector
|
#include "utils/utils.hpp" // Para stringInVector
|
||||||
|
|
||||||
#ifdef _DEBUG
|
|
||||||
#include "core/system/debug.hpp" // Para Debug
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace GlobalInputs {
|
namespace GlobalInputs {
|
||||||
|
|
||||||
// Funciones internas
|
// Funciones internas
|
||||||
namespace {
|
namespace {
|
||||||
void handleQuit() {
|
void handleQuit() {
|
||||||
// En la escena GAME el comportamiento es siempre el mismo (con o sin modo kiosko)
|
// En la escena GAME el comportamiento es siempre el mismo (con o sin modo kiosko)
|
||||||
if (SceneManager::current == SceneManager::Scene::GAME) {
|
if (SceneManager::current == SceneManager::Scene::GAME) {
|
||||||
const std::string CODE = "PRESS AGAIN TO RETURN TO MENU";
|
const std::string CODE = "PRESS AGAIN TO RETURN TO MENU";
|
||||||
if (stringInVector(Notifier::get()->getCodes(), CODE)) {
|
if (stringInVector(Notifier::get()->getCodes(), CODE)) {
|
||||||
SceneManager::current = SceneManager::Scene::TITLE;
|
SceneManager::current = SceneManager::Scene::TITLE;
|
||||||
} else {
|
} else {
|
||||||
Notifier::get()->show({CODE}, Notifier::Style::DEFAULT, -1, true, CODE);
|
Notifier::get()->show({Locale::get()->get("ui.press_again_menu")}, Notifier::Style::DEFAULT, -1, true, CODE); // NOLINT(readability-static-accessed-through-instance)
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -47,11 +46,11 @@ void handleQuit() {
|
|||||||
if (stringInVector(Notifier::get()->getCodes(), CODE)) {
|
if (stringInVector(Notifier::get()->getCodes(), CODE)) {
|
||||||
SceneManager::current = SceneManager::Scene::QUIT;
|
SceneManager::current = SceneManager::Scene::QUIT;
|
||||||
} else {
|
} else {
|
||||||
Notifier::get()->show({CODE}, Notifier::Style::DEFAULT, -1, true, CODE);
|
Notifier::get()->show({Locale::get()->get("ui.press_again_exit")}, Notifier::Style::DEFAULT, -1, true, CODE); // NOLINT(readability-static-accessed-through-instance)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void handleSkipSection() {
|
void handleSkipSection() {
|
||||||
switch (SceneManager::current) {
|
switch (SceneManager::current) {
|
||||||
case SceneManager::Scene::LOGO:
|
case SceneManager::Scene::LOGO:
|
||||||
case SceneManager::Scene::LOADING_SCREEN:
|
case SceneManager::Scene::LOADING_SCREEN:
|
||||||
@@ -67,79 +66,80 @@ void handleSkipSection() {
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void handleToggleBorder() {
|
void handleToggleBorder() {
|
||||||
Screen::get()->toggleBorder();
|
Screen::get()->toggleBorder();
|
||||||
Notifier::get()->show({"BORDER " + std::string(Options::video.border.enabled ? "ENABLED" : "DISABLED")});
|
Notifier::get()->show({Locale::get()->get(Options::video.border.enabled ? "ui.border_enabled" : "ui.border_disabled")}); // NOLINT(readability-static-accessed-through-instance)
|
||||||
}
|
}
|
||||||
|
|
||||||
void handleToggleVideoMode() {
|
void handleToggleVideoMode() {
|
||||||
Screen::get()->toggleVideoMode();
|
Screen::get()->toggleVideoMode();
|
||||||
Notifier::get()->show({"FULLSCREEN " + std::string(static_cast<int>(Options::video.fullscreen) == 0 ? "DISABLED" : "ENABLED")});
|
Notifier::get()->show({Locale::get()->get(static_cast<int>(Options::video.fullscreen) == 0 ? "ui.fullscreen_disabled" : "ui.fullscreen_enabled")}); // NOLINT(readability-static-accessed-through-instance)
|
||||||
}
|
}
|
||||||
|
|
||||||
void handleDecWindowZoom() {
|
void handleDecWindowZoom() {
|
||||||
if (Screen::get()->decWindowZoom()) {
|
if (Screen::get()->decWindowZoom()) {
|
||||||
Notifier::get()->show({"WINDOW ZOOM x" + std::to_string(Options::window.zoom)});
|
Notifier::get()->show({Locale::get()->get("ui.window_zoom") + std::to_string(Options::window.zoom)}); // NOLINT(readability-static-accessed-through-instance)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void handleIncWindowZoom() {
|
void handleIncWindowZoom() {
|
||||||
if (Screen::get()->incWindowZoom()) {
|
if (Screen::get()->incWindowZoom()) {
|
||||||
Notifier::get()->show({"WINDOW ZOOM x" + std::to_string(Options::window.zoom)});
|
Notifier::get()->show({Locale::get()->get("ui.window_zoom") + std::to_string(Options::window.zoom)}); // NOLINT(readability-static-accessed-through-instance)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void handleTogglePostFX() {
|
void handleToggleShaders() {
|
||||||
Screen::get()->togglePostFX();
|
Screen::get()->toggleShaders();
|
||||||
Notifier::get()->show({"POSTFX " + std::string(Options::video.postfx ? "ENABLED" : "DISABLED")});
|
Notifier::get()->show({Locale::get()->get(Options::video.postfx ? "ui.shaders_enabled" : "ui.shaders_disabled")}); // NOLINT(readability-static-accessed-through-instance)
|
||||||
}
|
}
|
||||||
|
|
||||||
void handleNextPostFXPreset() {
|
void handleNextShaderPreset() {
|
||||||
|
if (Options::current_shader == Rendering::ShaderType::CRTPI) {
|
||||||
|
if (!Options::crtpi_presets.empty()) {
|
||||||
|
Options::current_crtpi_preset = (Options::current_crtpi_preset + 1) % static_cast<int>(Options::crtpi_presets.size());
|
||||||
|
Screen::get()->reloadCrtPi();
|
||||||
|
Notifier::get()->show({Locale::get()->get("ui.crtpi") + " " + Options::crtpi_presets[static_cast<size_t>(Options::current_crtpi_preset)].name}); // NOLINT(readability-static-accessed-through-instance)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
if (!Options::postfx_presets.empty()) {
|
if (!Options::postfx_presets.empty()) {
|
||||||
Options::current_postfx_preset = (Options::current_postfx_preset + 1) % static_cast<int>(Options::postfx_presets.size());
|
Options::current_postfx_preset = (Options::current_postfx_preset + 1) % static_cast<int>(Options::postfx_presets.size());
|
||||||
Screen::get()->reloadPostFX();
|
Screen::get()->reloadPostFX();
|
||||||
Notifier::get()->show({"POSTFX " + Options::postfx_presets[static_cast<size_t>(Options::current_postfx_preset)].name});
|
Notifier::get()->show({Locale::get()->get("ui.postfx") + " " + Options::postfx_presets[static_cast<size_t>(Options::current_postfx_preset)].name}); // NOLINT(readability-static-accessed-through-instance)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void handleNextPalette() {
|
void handleNextShader() {
|
||||||
|
Screen::get()->nextShader();
|
||||||
|
Notifier::get()->show({Locale::get()->get("ui.shader") + " " + // NOLINT(readability-static-accessed-through-instance)
|
||||||
|
(Options::current_shader == Rendering::ShaderType::CRTPI ? "CRTPI" : "POSTFX")});
|
||||||
|
}
|
||||||
|
|
||||||
|
void handleNextPalette() {
|
||||||
Screen::get()->nextPalette();
|
Screen::get()->nextPalette();
|
||||||
Notifier::get()->show({"PALETTE " + Options::video.palette});
|
Notifier::get()->show({Locale::get()->get("ui.palette") + " " + Options::video.palette}); // NOLINT(readability-static-accessed-through-instance)
|
||||||
}
|
}
|
||||||
|
|
||||||
void handlePreviousPalette() {
|
void handlePreviousPalette() {
|
||||||
Screen::get()->previousPalette();
|
Screen::get()->previousPalette();
|
||||||
Notifier::get()->show({"PALETTE " + Options::video.palette});
|
Notifier::get()->show({Locale::get()->get("ui.palette") + " " + Options::video.palette}); // NOLINT(readability-static-accessed-through-instance)
|
||||||
}
|
}
|
||||||
|
|
||||||
void handleToggleIntegerScale() {
|
void handleToggleIntegerScale() {
|
||||||
Screen::get()->toggleIntegerScale();
|
Screen::get()->toggleIntegerScale();
|
||||||
Screen::get()->setVideoMode(Options::video.fullscreen);
|
Screen::get()->setVideoMode(Options::video.fullscreen);
|
||||||
Notifier::get()->show({"INTEGER SCALE " + std::string(Options::video.integer_scale ? "ENABLED" : "DISABLED")});
|
Notifier::get()->show({Locale::get()->get(Options::video.integer_scale ? "ui.integer_scale_enabled" : "ui.integer_scale_disabled")}); // NOLINT(readability-static-accessed-through-instance)
|
||||||
}
|
}
|
||||||
|
|
||||||
void handleToggleVSync() {
|
void handleToggleVSync() {
|
||||||
Screen::get()->toggleVSync();
|
Screen::get()->toggleVSync();
|
||||||
Notifier::get()->show({"V-SYNC " + std::string(Options::video.vertical_sync ? "ENABLED" : "DISABLED")});
|
Notifier::get()->show({Locale::get()->get(Options::video.vertical_sync ? "ui.vsync_enabled" : "ui.vsync_disabled")}); // NOLINT(readability-static-accessed-through-instance)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _DEBUG
|
// Detecta qué acción global ha sido presionada (si alguna)
|
||||||
void handleShowDebugInfo() {
|
auto getPressedAction() -> InputAction {
|
||||||
Screen::get()->toggleDebugInfo();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
void handleToggleDebug() {
|
|
||||||
Debug::get()->toggleEnabled();
|
|
||||||
Notifier::get()->show({"DEBUG " + std::string(Debug::get()->isEnabled() ? "ENABLED" : "DISABLED")}, Notifier::TextAlign::CENTER);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Detecta qué acción global ha sido presionada (si alguna)
|
|
||||||
auto getPressedAction() -> InputAction {
|
|
||||||
if (Input::get()->checkAction(InputAction::EXIT, Input::DO_NOT_ALLOW_REPEAT)) {
|
if (Input::get()->checkAction(InputAction::EXIT, Input::DO_NOT_ALLOW_REPEAT)) {
|
||||||
return InputAction::EXIT;
|
return InputAction::EXIT;
|
||||||
}
|
}
|
||||||
@@ -160,11 +160,14 @@ auto getPressedAction() -> InputAction {
|
|||||||
return InputAction::WINDOW_INC_ZOOM;
|
return InputAction::WINDOW_INC_ZOOM;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (Input::get()->checkAction(InputAction::TOGGLE_POSTFX, Input::DO_NOT_ALLOW_REPEAT)) {
|
if (Input::get()->checkAction(InputAction::TOGGLE_SHADER, Input::DO_NOT_ALLOW_REPEAT)) {
|
||||||
if (Options::video.postfx && (SDL_GetModState() & SDL_KMOD_SHIFT)) {
|
if ((SDL_GetModState() & SDL_KMOD_CTRL) != 0U) {
|
||||||
return InputAction::NEXT_POSTFX_PRESET;
|
return InputAction::TOGGLE_SUPERSAMPLING; // Ctrl+F4
|
||||||
}
|
}
|
||||||
return InputAction::TOGGLE_POSTFX;
|
if (Options::video.postfx && ((SDL_GetModState() & SDL_KMOD_SHIFT) != 0U)) {
|
||||||
|
return InputAction::NEXT_SHADER_PRESET; // Shift+F4
|
||||||
|
}
|
||||||
|
return InputAction::TOGGLE_SHADER; // F4
|
||||||
}
|
}
|
||||||
if (Input::get()->checkAction(InputAction::NEXT_PALETTE, Input::DO_NOT_ALLOW_REPEAT)) {
|
if (Input::get()->checkAction(InputAction::NEXT_PALETTE, Input::DO_NOT_ALLOW_REPEAT)) {
|
||||||
return InputAction::NEXT_PALETTE;
|
return InputAction::NEXT_PALETTE;
|
||||||
@@ -178,34 +181,50 @@ auto getPressedAction() -> InputAction {
|
|||||||
if (Input::get()->checkAction(InputAction::TOGGLE_VSYNC, Input::DO_NOT_ALLOW_REPEAT)) {
|
if (Input::get()->checkAction(InputAction::TOGGLE_VSYNC, Input::DO_NOT_ALLOW_REPEAT)) {
|
||||||
return InputAction::TOGGLE_VSYNC;
|
return InputAction::TOGGLE_VSYNC;
|
||||||
}
|
}
|
||||||
if (Input::get()->checkAction(InputAction::TOGGLE_DEBUG, Input::DO_NOT_ALLOW_REPEAT)) {
|
if (Input::get()->checkAction(InputAction::TOGGLE_INFO, Input::DO_NOT_ALLOW_REPEAT)) {
|
||||||
return InputAction::TOGGLE_DEBUG;
|
return InputAction::TOGGLE_INFO;
|
||||||
}
|
}
|
||||||
if (Input::get()->checkAction(InputAction::SHOW_DEBUG_INFO, Input::DO_NOT_ALLOW_REPEAT)) {
|
if (Input::get()->checkAction(InputAction::TOGGLE_CONSOLE, Input::DO_NOT_ALLOW_REPEAT)) {
|
||||||
return InputAction::SHOW_DEBUG_INFO;
|
return InputAction::TOGGLE_CONSOLE;
|
||||||
}
|
}
|
||||||
return InputAction::NONE;
|
return InputAction::NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
// Funciones públicas
|
// Funciones públicas
|
||||||
|
|
||||||
// Comprueba los inputs que se pueden introducir en cualquier sección del juego
|
// Comprueba los inputs que se pueden introducir en cualquier sección del juego
|
||||||
void handle() {
|
void handle() {
|
||||||
|
const bool CONSOLE_ACTIVE = Console::get() != nullptr && Console::get()->isActive();
|
||||||
|
|
||||||
|
if (CONSOLE_ACTIVE) {
|
||||||
|
// TAB/ESC cierran la consola en lugar de ejecutar sus acciones normales
|
||||||
|
if (Input::get()->checkAction(InputAction::TOGGLE_CONSOLE, Input::DO_NOT_ALLOW_REPEAT) ||
|
||||||
|
Input::get()->checkAction(InputAction::EXIT, Input::DO_NOT_ALLOW_REPEAT)) {
|
||||||
|
Console::get()->toggle();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
// Salida de administrador en modo kiosko (Ctrl+Shift+Alt+Q)
|
// Salida de administrador en modo kiosko (Ctrl+Shift+Alt+Q)
|
||||||
if (Options::kiosk.enabled) {
|
if (Options::kiosk.enabled) {
|
||||||
SDL_Keymod mod = SDL_GetModState();
|
SDL_Keymod mod = SDL_GetModState();
|
||||||
const bool* ks = SDL_GetKeyboardState(nullptr);
|
const bool* ks = SDL_GetKeyboardState(nullptr);
|
||||||
if ((mod & SDL_KMOD_CTRL) && (mod & SDL_KMOD_SHIFT) && (mod & SDL_KMOD_ALT) && ks[SDL_SCANCODE_Q]) {
|
if (((mod & SDL_KMOD_CTRL) != 0U) && ((mod & SDL_KMOD_SHIFT) != 0U) && ((mod & SDL_KMOD_ALT) != 0U) && ks[SDL_SCANCODE_Q]) {
|
||||||
SceneManager::current = SceneManager::Scene::QUIT;
|
SceneManager::current = SceneManager::Scene::QUIT;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Detectar qué acción global está siendo presionada
|
// Detectar qué acción global está siendo presionada
|
||||||
InputAction action = getPressedAction();
|
InputAction action = getPressedAction();
|
||||||
|
|
||||||
|
// Con consola activa, ACCEPT (saltar sección) y EXIT están bloqueados
|
||||||
|
if (CONSOLE_ACTIVE && (action == InputAction::ACCEPT || action == InputAction::EXIT)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Ejecutar el handler correspondiente usando switch statement
|
// Ejecutar el handler correspondiente usando switch statement
|
||||||
switch (action) {
|
switch (action) {
|
||||||
case InputAction::EXIT:
|
case InputAction::EXIT:
|
||||||
@@ -232,12 +251,16 @@ void handle() {
|
|||||||
handleIncWindowZoom();
|
handleIncWindowZoom();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case InputAction::TOGGLE_POSTFX:
|
case InputAction::TOGGLE_SHADER:
|
||||||
handleTogglePostFX();
|
handleToggleShaders();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case InputAction::NEXT_POSTFX_PRESET:
|
case InputAction::NEXT_SHADER_PRESET:
|
||||||
handleNextPostFXPreset();
|
handleNextShaderPreset();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case InputAction::TOGGLE_SUPERSAMPLING:
|
||||||
|
handleNextShader();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case InputAction::NEXT_PALETTE:
|
case InputAction::NEXT_PALETTE:
|
||||||
@@ -256,20 +279,18 @@ void handle() {
|
|||||||
handleToggleVSync();
|
handleToggleVSync();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case InputAction::TOGGLE_DEBUG:
|
case InputAction::TOGGLE_CONSOLE:
|
||||||
// handleToggleDebug();
|
if (Console::get() != nullptr) { Console::get()->toggle(); }
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#ifdef _DEBUG
|
case InputAction::TOGGLE_INFO:
|
||||||
case InputAction::SHOW_DEBUG_INFO:
|
if (RenderInfo::get() != nullptr) { RenderInfo::get()->toggle(); }
|
||||||
handleShowDebugInfo();
|
|
||||||
break;
|
break;
|
||||||
#endif
|
|
||||||
|
|
||||||
case InputAction::NONE:
|
case InputAction::NONE:
|
||||||
default:
|
default:
|
||||||
// No se presionó ninguna acción global
|
// No se presionó ninguna acción global
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} // namespace GlobalInputs
|
} // namespace GlobalInputs
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
namespace GlobalInputs {
|
namespace GlobalInputs {
|
||||||
// Comprueba los inputs que se pueden introducir en cualquier sección del juego
|
// Comprueba los inputs que se pueden introducir en cualquier sección del juego
|
||||||
void handle();
|
void handle();
|
||||||
} // namespace GlobalInputs
|
} // namespace GlobalInputs
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
Input* Input::instance = nullptr;
|
Input* Input::instance = nullptr;
|
||||||
|
|
||||||
// Inicializa la instancia única del singleton
|
// Inicializa la instancia única del singleton
|
||||||
void Input::init(const std::string& game_controller_db_path) {
|
void Input::init(const std::string& game_controller_db_path) { // NOLINT(readability-convert-member-functions-to-static)
|
||||||
Input::instance = new Input(game_controller_db_path);
|
Input::instance = new Input(game_controller_db_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -43,15 +43,16 @@ Input::Input(std::string game_controller_db_path)
|
|||||||
{Action::WINDOW_DEC_ZOOM, KeyState{.scancode = SDL_SCANCODE_F1}},
|
{Action::WINDOW_DEC_ZOOM, KeyState{.scancode = SDL_SCANCODE_F1}},
|
||||||
{Action::WINDOW_INC_ZOOM, KeyState{.scancode = SDL_SCANCODE_F2}},
|
{Action::WINDOW_INC_ZOOM, KeyState{.scancode = SDL_SCANCODE_F2}},
|
||||||
{Action::TOGGLE_FULLSCREEN, KeyState{.scancode = SDL_SCANCODE_F3}},
|
{Action::TOGGLE_FULLSCREEN, KeyState{.scancode = SDL_SCANCODE_F3}},
|
||||||
{Action::TOGGLE_POSTFX, KeyState{.scancode = SDL_SCANCODE_F4}},
|
{Action::TOGGLE_SHADER, KeyState{.scancode = SDL_SCANCODE_F4}},
|
||||||
{Action::NEXT_PALETTE, KeyState{.scancode = SDL_SCANCODE_F5}},
|
{Action::NEXT_PALETTE, KeyState{.scancode = SDL_SCANCODE_F5}},
|
||||||
{Action::PREVIOUS_PALETTE, KeyState{.scancode = SDL_SCANCODE_F6}},
|
{Action::PREVIOUS_PALETTE, KeyState{.scancode = SDL_SCANCODE_F6}},
|
||||||
{Action::TOGGLE_INTEGER_SCALE, KeyState{.scancode = SDL_SCANCODE_F7}},
|
{Action::TOGGLE_INTEGER_SCALE, KeyState{.scancode = SDL_SCANCODE_F7}},
|
||||||
{Action::TOGGLE_MUSIC, KeyState{.scancode = SDL_SCANCODE_F8}},
|
{Action::TOGGLE_IN_GAME_MUSIC, KeyState{.scancode = SDL_SCANCODE_F8}},
|
||||||
{Action::TOGGLE_BORDER, KeyState{.scancode = SDL_SCANCODE_F9}},
|
{Action::TOGGLE_BORDER, KeyState{.scancode = SDL_SCANCODE_F9}},
|
||||||
{Action::TOGGLE_VSYNC, KeyState{.scancode = SDL_SCANCODE_F10}},
|
{Action::TOGGLE_VSYNC, KeyState{.scancode = SDL_SCANCODE_F10}},
|
||||||
{Action::PAUSE, KeyState{.scancode = SDL_SCANCODE_F11}},
|
{Action::PAUSE, KeyState{.scancode = SDL_SCANCODE_F11}},
|
||||||
{Action::TOGGLE_DEBUG, KeyState{.scancode = SDL_SCANCODE_F12}}};
|
{Action::TOGGLE_INFO, KeyState{.scancode = SDL_SCANCODE_F12}},
|
||||||
|
{Action::TOGGLE_CONSOLE, KeyState{.scancode = SDL_SCANCODE_TAB}}};
|
||||||
|
|
||||||
initSDLGamePad(); // Inicializa el subsistema SDL_INIT_GAMEPAD
|
initSDLGamePad(); // Inicializa el subsistema SDL_INIT_GAMEPAD
|
||||||
}
|
}
|
||||||
@@ -69,7 +70,7 @@ void Input::applyKeyboardBindingsFromOptions() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Aplica configuración de botones del gamepad desde Options al primer gamepad conectado
|
// Aplica configuración de botones del gamepad desde Options al primer gamepad conectado
|
||||||
void Input::applyGamepadBindingsFromOptions() {
|
void Input::applyGamepadBindingsFromOptions() { // NOLINT(readability-convert-member-functions-to-static)
|
||||||
// Si no hay gamepads conectados, no hay nada que hacer
|
// Si no hay gamepads conectados, no hay nada que hacer
|
||||||
if (gamepads_.empty()) {
|
if (gamepads_.empty()) {
|
||||||
return;
|
return;
|
||||||
@@ -90,21 +91,21 @@ void Input::applyGamepadBindingsFromOptions() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Asigna inputs a botones del mando
|
// Asigna inputs a botones del mando
|
||||||
void Input::bindGameControllerButton(const std::shared_ptr<Gamepad>& gamepad, Action action, SDL_GamepadButton button) {
|
void Input::bindGameControllerButton(const std::shared_ptr<Gamepad>& gamepad, Action action, SDL_GamepadButton button) { // NOLINT(readability-convert-member-functions-to-static)
|
||||||
if (gamepad != nullptr) {
|
if (gamepad != nullptr) {
|
||||||
gamepad->bindings[action].button = button;
|
gamepad->bindings[action].button = button;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Asigna inputs a botones del mando
|
// Asigna inputs a botones del mando
|
||||||
void Input::bindGameControllerButton(const std::shared_ptr<Gamepad>& gamepad, Action action_target, Action action_source) {
|
void Input::bindGameControllerButton(const std::shared_ptr<Gamepad>& gamepad, Action action_target, Action action_source) { // NOLINT(readability-convert-member-functions-to-static)
|
||||||
if (gamepad != nullptr) {
|
if (gamepad != nullptr) {
|
||||||
gamepad->bindings[action_target].button = gamepad->bindings[action_source].button;
|
gamepad->bindings[action_target].button = gamepad->bindings[action_source].button;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Comprueba si alguna acción está activa
|
// Comprueba si alguna acción está activa
|
||||||
auto Input::checkAction(Action action, bool repeat, bool check_keyboard, const std::shared_ptr<Gamepad>& gamepad) -> bool {
|
auto Input::checkAction(Action action, bool repeat, bool check_keyboard, const std::shared_ptr<Gamepad>& gamepad) -> bool { // NOLINT(readability-convert-member-functions-to-static)
|
||||||
bool success_keyboard = false;
|
bool success_keyboard = false;
|
||||||
bool success_controller = false;
|
bool success_controller = false;
|
||||||
|
|
||||||
@@ -142,7 +143,7 @@ auto Input::checkAction(Action action, bool repeat, bool check_keyboard, const s
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Comprueba si hay almenos una acción activa
|
// Comprueba si hay almenos una acción activa
|
||||||
auto Input::checkAnyInput(bool check_keyboard, const std::shared_ptr<Gamepad>& gamepad) -> bool {
|
auto Input::checkAnyInput(bool check_keyboard, const std::shared_ptr<Gamepad>& gamepad) -> bool { // NOLINT(readability-convert-member-functions-to-static)
|
||||||
// Obtenemos el número total de acciones posibles para iterar sobre ellas.
|
// Obtenemos el número total de acciones posibles para iterar sobre ellas.
|
||||||
|
|
||||||
// --- Comprobación del Teclado ---
|
// --- Comprobación del Teclado ---
|
||||||
@@ -179,7 +180,7 @@ auto Input::checkAnyInput(bool check_keyboard, const std::shared_ptr<Gamepad>& g
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Comprueba si hay algún botón pulsado
|
// Comprueba si hay algún botón pulsado
|
||||||
auto Input::checkAnyButton(bool repeat) -> bool {
|
auto Input::checkAnyButton(bool repeat) -> bool { // NOLINT(readability-convert-member-functions-to-static)
|
||||||
// Solo comprueba los botones definidos previamente
|
// Solo comprueba los botones definidos previamente
|
||||||
for (auto bi : BUTTON_INPUTS) {
|
for (auto bi : BUTTON_INPUTS) {
|
||||||
// Comprueba el teclado
|
// Comprueba el teclado
|
||||||
@@ -219,7 +220,7 @@ auto Input::getControllerNames() const -> std::vector<std::string> {
|
|||||||
auto Input::getNumGamepads() const -> int { return gamepads_.size(); }
|
auto Input::getNumGamepads() const -> int { return gamepads_.size(); }
|
||||||
|
|
||||||
// Obtiene el gamepad a partir de un event.id
|
// Obtiene el gamepad a partir de un event.id
|
||||||
auto Input::getGamepad(SDL_JoystickID id) const -> std::shared_ptr<Input::Gamepad> {
|
auto Input::getGamepad(SDL_JoystickID id) const -> std::shared_ptr<Input::Gamepad> { // NOLINT(readability-convert-member-functions-to-static)
|
||||||
for (const auto& gamepad : gamepads_) {
|
for (const auto& gamepad : gamepads_) {
|
||||||
if (gamepad->instance_id == id) {
|
if (gamepad->instance_id == id) {
|
||||||
return gamepad;
|
return gamepad;
|
||||||
@@ -228,7 +229,7 @@ auto Input::getGamepad(SDL_JoystickID id) const -> std::shared_ptr<Input::Gamepa
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Input::getGamepadByName(const std::string& name) const -> std::shared_ptr<Input::Gamepad> {
|
auto Input::getGamepadByName(const std::string& name) const -> std::shared_ptr<Input::Gamepad> { // NOLINT(readability-convert-member-functions-to-static)
|
||||||
for (const auto& gamepad : gamepads_) {
|
for (const auto& gamepad : gamepads_) {
|
||||||
if (gamepad && gamepad->name == name) {
|
if (gamepad && gamepad->name == name) {
|
||||||
return gamepad;
|
return gamepad;
|
||||||
@@ -238,12 +239,12 @@ auto Input::getGamepadByName(const std::string& name) const -> std::shared_ptr<I
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Obtiene el SDL_GamepadButton asignado a un action
|
// Obtiene el SDL_GamepadButton asignado a un action
|
||||||
auto Input::getControllerBinding(const std::shared_ptr<Gamepad>& gamepad, Action action) -> SDL_GamepadButton {
|
auto Input::getControllerBinding(const std::shared_ptr<Gamepad>& gamepad, Action action) -> SDL_GamepadButton { // NOLINT(readability-convert-member-functions-to-static)
|
||||||
return static_cast<SDL_GamepadButton>(gamepad->bindings[action].button);
|
return static_cast<SDL_GamepadButton>(gamepad->bindings[action].button);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Comprueba el eje del mando
|
// Comprueba el eje del mando
|
||||||
auto Input::checkAxisInput(Action action, const std::shared_ptr<Gamepad>& gamepad, bool repeat) -> bool {
|
auto Input::checkAxisInput(Action action, const std::shared_ptr<Gamepad>& gamepad, bool repeat) -> bool { // NOLINT(readability-convert-member-functions-to-static)
|
||||||
// Obtener el binding configurado para esta acción
|
// Obtener el binding configurado para esta acción
|
||||||
auto& binding = gamepad->bindings[action];
|
auto& binding = gamepad->bindings[action];
|
||||||
|
|
||||||
@@ -286,7 +287,7 @@ auto Input::checkAxisInput(Action action, const std::shared_ptr<Gamepad>& gamepa
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Comprueba los triggers del mando como botones digitales
|
// Comprueba los triggers del mando como botones digitales
|
||||||
auto Input::checkTriggerInput(Action action, const std::shared_ptr<Gamepad>& gamepad, bool repeat) -> bool {
|
auto Input::checkTriggerInput(Action action, const std::shared_ptr<Gamepad>& gamepad, bool repeat) -> bool { // NOLINT(readability-convert-member-functions-to-static)
|
||||||
// Solo manejamos botones específicos que pueden ser triggers
|
// Solo manejamos botones específicos que pueden ser triggers
|
||||||
if (gamepad->bindings[action].button != static_cast<int>(SDL_GAMEPAD_BUTTON_INVALID)) {
|
if (gamepad->bindings[action].button != static_cast<int>(SDL_GAMEPAD_BUTTON_INVALID)) {
|
||||||
// Solo procesamos L2 y R2 como triggers
|
// Solo procesamos L2 y R2 como triggers
|
||||||
@@ -333,13 +334,13 @@ auto Input::checkTriggerInput(Action action, const std::shared_ptr<Gamepad>& gam
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Input::addGamepadMappingsFromFile() {
|
void Input::addGamepadMappingsFromFile() { // NOLINT(readability-convert-member-functions-to-static)
|
||||||
if (SDL_AddGamepadMappingsFromFile(gamepad_mappings_file_.c_str()) < 0) {
|
if (SDL_AddGamepadMappingsFromFile(gamepad_mappings_file_.c_str()) < 0) {
|
||||||
std::cout << "Error, could not load " << gamepad_mappings_file_.c_str() << " file: " << SDL_GetError() << '\n';
|
std::cout << "Error, could not load " << gamepad_mappings_file_.c_str() << " file: " << SDL_GetError() << '\n';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Input::discoverGamepads() {
|
void Input::discoverGamepads() { // NOLINT(readability-convert-member-functions-to-static)
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
while (SDL_PollEvent(&event)) {
|
while (SDL_PollEvent(&event)) {
|
||||||
handleEvent(event); // Comprueba mandos conectados
|
handleEvent(event); // Comprueba mandos conectados
|
||||||
@@ -375,7 +376,7 @@ void Input::resetInputStates() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Input::update() {
|
void Input::update() { // NOLINT(readability-convert-member-functions-to-static)
|
||||||
// --- TECLADO ---
|
// --- TECLADO ---
|
||||||
const bool* key_states = SDL_GetKeyboardState(nullptr);
|
const bool* key_states = SDL_GetKeyboardState(nullptr);
|
||||||
|
|
||||||
@@ -399,7 +400,7 @@ void Input::update() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Input::handleEvent(const SDL_Event& event) -> std::string {
|
auto Input::handleEvent(const SDL_Event& event) -> std::string { // NOLINT(readability-convert-member-functions-to-static)
|
||||||
switch (event.type) {
|
switch (event.type) {
|
||||||
case SDL_EVENT_GAMEPAD_ADDED:
|
case SDL_EVENT_GAMEPAD_ADDED:
|
||||||
return addGamepad(event.gdevice.which);
|
return addGamepad(event.gdevice.which);
|
||||||
@@ -409,7 +410,7 @@ auto Input::handleEvent(const SDL_Event& event) -> std::string {
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Input::addGamepad(int device_index) -> std::string {
|
auto Input::addGamepad(int device_index) -> std::string { // NOLINT(readability-convert-member-functions-to-static)
|
||||||
SDL_Gamepad* pad = SDL_OpenGamepad(device_index);
|
SDL_Gamepad* pad = SDL_OpenGamepad(device_index);
|
||||||
if (pad == nullptr) {
|
if (pad == nullptr) {
|
||||||
std::cerr << "Error al abrir el gamepad: " << SDL_GetError() << '\n';
|
std::cerr << "Error al abrir el gamepad: " << SDL_GetError() << '\n';
|
||||||
@@ -423,8 +424,8 @@ auto Input::addGamepad(int device_index) -> std::string {
|
|||||||
return name + " CONNECTED";
|
return name + " CONNECTED";
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Input::removeGamepad(SDL_JoystickID id) -> std::string {
|
auto Input::removeGamepad(SDL_JoystickID id) -> std::string { // NOLINT(readability-convert-member-functions-to-static)
|
||||||
auto it = std::ranges::find_if(gamepads_, [id](const std::shared_ptr<Gamepad>& gamepad) {
|
auto it = std::ranges::find_if(gamepads_, [id](const std::shared_ptr<Gamepad>& gamepad) -> bool {
|
||||||
return gamepad->instance_id == id;
|
return gamepad->instance_id == id;
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -438,7 +439,7 @@ auto Input::removeGamepad(SDL_JoystickID id) -> std::string {
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
void Input::printConnectedGamepads() const {
|
void Input::printConnectedGamepads() const { // NOLINT(readability-convert-member-functions-to-static)
|
||||||
if (gamepads_.empty()) {
|
if (gamepads_.empty()) {
|
||||||
std::cout << "No hay gamepads conectados." << '\n';
|
std::cout << "No hay gamepads conectados." << '\n';
|
||||||
return;
|
return;
|
||||||
@@ -452,7 +453,7 @@ void Input::printConnectedGamepads() const {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Input::findAvailableGamepadByName(const std::string& gamepad_name) -> std::shared_ptr<Input::Gamepad> {
|
auto Input::findAvailableGamepadByName(const std::string& gamepad_name) -> std::shared_ptr<Input::Gamepad> { // NOLINT(readability-convert-member-functions-to-static)
|
||||||
// Si no hay gamepads disponibles, devolver gamepad por defecto
|
// Si no hay gamepads disponibles, devolver gamepad por defecto
|
||||||
if (gamepads_.empty()) {
|
if (gamepads_.empty()) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|||||||
@@ -101,12 +101,12 @@ class Input {
|
|||||||
// --- Gestión de gamepads ---
|
// --- Gestión de gamepads ---
|
||||||
[[nodiscard]] auto gameControllerFound() const -> bool;
|
[[nodiscard]] auto gameControllerFound() const -> bool;
|
||||||
[[nodiscard]] auto getNumGamepads() const -> int;
|
[[nodiscard]] auto getNumGamepads() const -> int;
|
||||||
auto getGamepad(SDL_JoystickID id) const -> std::shared_ptr<Gamepad>;
|
[[nodiscard]] auto getGamepad(SDL_JoystickID id) const -> std::shared_ptr<Gamepad>;
|
||||||
auto getGamepadByName(const std::string& name) const -> std::shared_ptr<Input::Gamepad>;
|
[[nodiscard]] auto getGamepadByName(const std::string& name) const -> std::shared_ptr<Input::Gamepad>;
|
||||||
auto getGamepads() const -> const Gamepads& { return gamepads_; }
|
[[nodiscard]] auto getGamepads() const -> const Gamepads& { return gamepads_; }
|
||||||
auto findAvailableGamepadByName(const std::string& gamepad_name) -> std::shared_ptr<Gamepad>;
|
auto findAvailableGamepadByName(const std::string& gamepad_name) -> std::shared_ptr<Gamepad>;
|
||||||
static auto getControllerName(const std::shared_ptr<Gamepad>& gamepad) -> std::string;
|
static auto getControllerName(const std::shared_ptr<Gamepad>& gamepad) -> std::string;
|
||||||
auto getControllerNames() const -> std::vector<std::string>;
|
[[nodiscard]] auto getControllerNames() const -> std::vector<std::string>;
|
||||||
[[nodiscard]] static auto getControllerBinding(const std::shared_ptr<Gamepad>& gamepad, Action action) -> SDL_GamepadButton;
|
[[nodiscard]] static auto getControllerBinding(const std::shared_ptr<Gamepad>& gamepad, Action action) -> SDL_GamepadButton;
|
||||||
void printConnectedGamepads() const;
|
void printConnectedGamepads() const;
|
||||||
|
|
||||||
|
|||||||