Compare commits
329 Commits
70b76edcbf
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| cea5492abc | |||
| cccb2359cf | |||
| b5e822c65f | |||
| c14774478c | |||
| 3c3e012386 | |||
| 44b6f6830d | |||
| 0d12591925 | |||
| 22d6ac2fbf | |||
| acaf434e5c | |||
| 5f25562d52 | |||
| fc28586940 | |||
| 273d9304dc | |||
| 3a5b16346b | |||
| 0e61b94848 | |||
| eca5a55d3c | |||
| dccd0d41e4 | |||
| 20bac58814 | |||
| a6fae7b001 | |||
| b31346830f | |||
| b6fec3eba7 | |||
| 606388227c | |||
| a2caf95005 | |||
| 0bfb535d4d | |||
| 405f2248ec | |||
| 93b1cd80b7 | |||
| b53bf87730 | |||
| 015a9cc4e1 | |||
| 3bd13b72cd | |||
| c94adf39af | |||
| 950eeffb07 | |||
| b37b62ef1e | |||
| 0c8aa5fe50 | |||
| fe520dd341 | |||
| ec9a9aff81 | |||
| f9c1c4843d | |||
| a804ad1368 | |||
| c689507982 | |||
| 417643018f | |||
| 2ed7316948 | |||
| 2228153d59 | |||
| 7315032ff2 | |||
| 3fc6795593 | |||
| 16924cf503 | |||
| 705a9fc7cd | |||
| b164c11ba7 | |||
| 1817d00881 | |||
| 8dcf473f31 | |||
| 8f191f02fa | |||
| 1077c13fd0 | |||
| d5a4caa86e | |||
| f3bad9f4ed | |||
| 32f22c99db | |||
| cd14ae22c5 | |||
| 1fdc29e9d2 | |||
| 0a740a5be2 | |||
| 9e1b2b8960 | |||
| ed3724193e | |||
| 98f01a6dde | |||
| 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 | |||
| 43a6cc2d7a | |||
| aa292dcd92 | |||
| 06457654f4 | |||
| e9fc2e8fa0 | |||
| 23863c02a6 | |||
| 6996b3a82a | |||
| 2b2eb31c67 | |||
| 8aad52f33f | |||
| 4e2393f4d5 | |||
| d9ada12ee0 | |||
| a7d04d2bbc | |||
| c80dffe957 | |||
| 31bbaf997f | |||
| c4d4a3b930 | |||
| d027216dc6 | |||
| 483fe7251d | |||
| 852cda1984 | |||
| 8d9c838be2 | |||
| 9ebf259525 | |||
| f2e45940d5 | |||
| 2ae8fc7440 | |||
| e7860c697e | |||
| a8240a5d82 | |||
| 723ab3d800 | |||
| fda8ff3f65 | |||
| 9ef7f4274d | |||
| bd011a0ebb | |||
| 6052be0c38 | |||
| ec3cc49710 | |||
| 2e1738c20c | |||
| 7479231110 | |||
| 4fc5947ba7 | |||
| a21e6f8bb5 | |||
| d27f978c62 | |||
| 2fd101674e | |||
| e36fa95762 | |||
| 88ce6cd570 | |||
| d011a41d5a | |||
| 039eb20c06 | |||
| 959a513651 | |||
| 1fed8f63bd | |||
| b475c4d818 | |||
| 972d23f178 | |||
| 83d4d0b954 | |||
| ea43880d59 | |||
| 6bf26f7470 | |||
| 0fb986d7c4 | |||
| 9aa86cd531 | |||
| 34840a64cf | |||
| 7d962ae752 | |||
| 28f11a42b7 | |||
| 5337e3b4e5 | |||
| 35ef99cf7c | |||
| cbe71b5af4 | |||
| e73f573e9a | |||
| fa9723dafc | |||
| ceb2b71331 | |||
| 0a5594b9a8 | |||
| 932de53609 | |||
| b7db34cdf7 | |||
| 4477cc4bbc | |||
| 435358ef1e | |||
| fff77e47cf | |||
| 3550f26c45 | |||
| c0905adc62 | |||
| f9b8edc23c | |||
| 6a18d880f2 | |||
| d185a5e72a | |||
| 0c9becae4c | |||
| 6a6cc22b21 | |||
| 3c4092df5e | |||
| 10911990dd | |||
| 21a495e40a | |||
| 6827512025 | |||
| 23fe4a35a9 | |||
| a5d43dfb1f | |||
| e4a61a7241 | |||
| 24a71395da | |||
| e4c10b6b75 | |||
| 710e7cc8c1 | |||
| 8893e8f05b | |||
| 7f51f02d96 | |||
| 29e0daffb0 | |||
| b8dd6e80d9 | |||
| 46eeda4ae9 | |||
| e13a8e5930 | |||
| c59812e4af | |||
| e97c951d0d | |||
| 5365d62abc | |||
| c5ad8041e8 | |||
| 2f90338214 | |||
| 477ab34057 | |||
| 9cf45062a3 | |||
| e626ec9763 | |||
| cf40865d37 | |||
| 580e52a51e | |||
| d6ced94316 | |||
| 54fc6d2902 | |||
| 1821b84e73 | |||
| 6ea0acd3f3 | |||
| b70b728b75 | |||
| 5dd463ad5a | |||
| 1f01268dcf | |||
| 85d34fb907 | |||
| e9fed353ff | |||
| b4f6b919d7 | |||
| 667ab73fc6 | |||
| 7d0e0e0d18 | |||
| 2c92fe8372 | |||
| 6e3cd05cd2 | |||
| 84b5ff05ad | |||
| cf6831206e | |||
| 9e3d3a7ce3 | |||
| 85844645ac | |||
| da159f1409 | |||
| d875a2706b | |||
| 288e01e47f | |||
| a20ea5299d | |||
| 66a580aff6 | |||
| d4030ec1bc | |||
| 3f1c737247 | |||
| 1409ab5bff | |||
| e08badbf22 | |||
| 64f0ef7349 | |||
| 0d19cf18aa | |||
| 87527d01a8 | |||
| b79f30a57b | |||
| 6c766be023 | |||
| ee1dc70bd8 | |||
| eb550ab95b | |||
| 13513384d1 | |||
| f7aa6a2b8b | |||
| ba06bccabc | |||
| 9102c6a65e | |||
| 435ff5eb6a | |||
| af7420d7c7 | |||
| 4eac48ed78 | |||
| c5563768af | |||
| 46f7968faf | |||
| 9cd1755266 | |||
| ef89a858c3 | |||
| d46e2295ff | |||
| f91748bdf0 | |||
| 824e7417ad | |||
| e86539eba0 | |||
| 1dd750ba0c | |||
| 7441fa2b6b | |||
| 139d56f8b5 | |||
| b80e81dab3 | |||
| b21c52092a | |||
| 5c5151c032 | |||
| 66c7c9dfe6 | |||
| cb09198bfe | |||
| 16aa4f52aa | |||
| f67bdc6f4f | |||
| eb7d1bb014 | |||
| 5f802ed6ef | |||
| 635efdba5e | |||
| 8c6bea897c | |||
| 70bfced50d | |||
| 2f20ac422e | |||
| 1bb3d00e7c | |||
| f08b2f9193 | |||
| 3680ff3935 | |||
| 99893a0c83 | |||
| c5cfb518a2 | |||
| 1041aaf385 | |||
| c207b456f5 | |||
| 7cd596a0b9 | |||
| 89a7f197a6 | |||
| fda22dd5f2 | |||
| 70d6cbfaf8 | |||
| 95dd6b4f70 | |||
| 633936c6e8 | |||
| 95b82e5f62 | |||
| ead3265bfc | |||
| 8bf9da5fb6 | |||
| cd836862c0 | |||
| acdad8295a | |||
| f14a1075ab | |||
| 31c84f9676 | |||
| 9e8c5e13df | |||
| de8c714132 | |||
| da65777a5b |
@@ -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
|
||||||
|
|||||||
@@ -16,10 +16,12 @@ Checks:
|
|||||||
- -performance-inefficient-string-concatenation
|
- -performance-inefficient-string-concatenation
|
||||||
- -bugprone-integer-division
|
- -bugprone-integer-division
|
||||||
- -bugprone-easily-swappable-parameters
|
- -bugprone-easily-swappable-parameters
|
||||||
|
- -modernize-avoid-c-arrays,-warnings-as-errors
|
||||||
|
|
||||||
WarningsAsErrors: '*'
|
WarningsAsErrors: '*'
|
||||||
# Solo incluir archivos de tu código fuente
|
# Solo incluir archivos de tu código fuente (external tiene su propio .clang-tidy)
|
||||||
HeaderFilterRegex: '^source/(sections|ui)/.*'
|
# Excluye jail_audio.hpp del análisis
|
||||||
|
HeaderFilterRegex: '^source/(?!core/audio/jail_audio\.hpp).*'
|
||||||
FormatStyle: file
|
FormatStyle: file
|
||||||
|
|
||||||
CheckOptions:
|
CheckOptions:
|
||||||
|
|||||||
172
.claude/commands/lint-clang-tidy.md
Normal file
@@ -0,0 +1,172 @@
|
|||||||
|
---
|
||||||
|
description: Ejecuta clang-tidy en archivos C++ y analiza los resultados
|
||||||
|
---
|
||||||
|
|
||||||
|
# Lint clang-tidy Command
|
||||||
|
|
||||||
|
Ejecuta análisis estático con clang-tidy en archivos C++ específicos, analiza los resultados inteligentemente, e identifica issues reales vs falsos positivos.
|
||||||
|
|
||||||
|
## Propósito
|
||||||
|
|
||||||
|
clang-tidy detecta:
|
||||||
|
- Oportunidades de modernización C++ (auto, range-for, etc.)
|
||||||
|
- Problemas de legibilidad del código
|
||||||
|
- Potenciales bugs y memory leaks
|
||||||
|
- Optimizaciones de performance
|
||||||
|
- Violaciones de mejores prácticas
|
||||||
|
|
||||||
|
## Workflow de Ejecución
|
||||||
|
|
||||||
|
1. **Solicitar archivos al usuario** (si no se especifican)
|
||||||
|
- Pedir rutas de archivos `.cpp` o `.hpp` a analizar
|
||||||
|
- Validar que los archivos existen
|
||||||
|
|
||||||
|
2. **Verificar build directory**
|
||||||
|
- Confirmar que `build/compile_commands.json` existe
|
||||||
|
- Si no existe, informar al usuario que debe compilar primero
|
||||||
|
|
||||||
|
3. **Ejecutar clang-tidy (sin --fix)**
|
||||||
|
```bash
|
||||||
|
tools/linter/run_clang-tidy.sh archivo1.cpp archivo2.hpp
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Capturar y analizar salida**
|
||||||
|
- Parsear mensajes de error/warning
|
||||||
|
- Clasificar por categoría (modernize, readability, performance, bugprone, etc.)
|
||||||
|
- Identificar falsos positivos conocidos
|
||||||
|
|
||||||
|
5. **Presentar resumen al usuario**
|
||||||
|
- Agrupar por tipo de issue
|
||||||
|
- Separar "Críticos" vs "Recomendaciones" vs "Falsos Positivos"
|
||||||
|
- Mostrar líneas de código afectadas con contexto
|
||||||
|
|
||||||
|
6. **Ofrecer acciones**
|
||||||
|
- Preguntar si aplicar `--fix` automáticamente
|
||||||
|
- Si el usuario acepta, ejecutar con `--fix` y recompilar
|
||||||
|
|
||||||
|
## Falsos Positivos Conocidos
|
||||||
|
|
||||||
|
Ignorar o marcar como "Opcional" estos casos:
|
||||||
|
|
||||||
|
### `readability-magic-numbers` / `cppcoreguidelines-avoid-magic-numbers`
|
||||||
|
- **Contexto:** Game constants (block sizes, velocities, timers)
|
||||||
|
- **Ejemplo:** `const int BLOCK = 16;`, `player.vx = 3.0F;`
|
||||||
|
- **Acción:** Marcar como "Opcional - Game constant"
|
||||||
|
|
||||||
|
### `modernize-use-trailing-return-type`
|
||||||
|
- **Contexto:** Funciones con tipos de retorno simples
|
||||||
|
- **Ejemplo:** `int getValue() { return x_; }`
|
||||||
|
- **Acción:** Marcar como "Opcional - Style preference"
|
||||||
|
|
||||||
|
### Errores en `defaults.hpp`
|
||||||
|
- **Contexto:** Archivos de constantes del juego
|
||||||
|
- **Acción:** Ignorar completamente, mencionar al usuario que es conocido
|
||||||
|
|
||||||
|
### `readability-identifier-length`
|
||||||
|
- **Contexto:** Variables cortas comunes en loops o coordenadas (`x`, `y`, `i`, `j`)
|
||||||
|
- **Acción:** Marcar como "Opcional - Common convention"
|
||||||
|
|
||||||
|
## Categorización de Issues
|
||||||
|
|
||||||
|
### 🔴 Críticos (Requieren atención)
|
||||||
|
- `bugprone-*`: Potenciales bugs
|
||||||
|
- `cert-*`: Security issues
|
||||||
|
- Memory leaks y null pointer dereferences
|
||||||
|
- Undefined behavior
|
||||||
|
|
||||||
|
### 🟡 Recomendados (Mejoran calidad)
|
||||||
|
- `modernize-*`: C++20 modernization
|
||||||
|
- `performance-*`: Optimizaciones
|
||||||
|
- `readability-*`: Mejoras de legibilidad (excepto magic-numbers)
|
||||||
|
|
||||||
|
### ⚪ Opcionales (A criterio)
|
||||||
|
- `readability-magic-numbers` en game constants
|
||||||
|
- `modernize-use-trailing-return-type`
|
||||||
|
- `readability-identifier-length` para `x`, `y`, `i`, `j`
|
||||||
|
|
||||||
|
### ⚫ Ignorar (Falsos positivos)
|
||||||
|
- Errores en `defaults.hpp`
|
||||||
|
- Issues en carpeta `external/`
|
||||||
|
- Warnings en headers del sistema
|
||||||
|
|
||||||
|
## Formato de Reporte al Usuario
|
||||||
|
|
||||||
|
```
|
||||||
|
=== clang-tidy Analysis Results ===
|
||||||
|
|
||||||
|
📁 Archivos analizados:
|
||||||
|
- source/game/entities/player.cpp
|
||||||
|
- source/game/entities/player.hpp
|
||||||
|
|
||||||
|
🔴 Críticos (2):
|
||||||
|
player.cpp:145 [bugprone-use-after-move] - Uso de variable después de std::move()
|
||||||
|
player.cpp:230 [cert-err58-cpp] - Excepción en inicialización estática
|
||||||
|
|
||||||
|
🟡 Recomendados (5):
|
||||||
|
player.cpp:67 [modernize-use-auto] - Puede usar 'auto' en lugar de tipo explícito
|
||||||
|
player.cpp:102 [performance-unnecessary-copy-initialization] - Copia innecesaria
|
||||||
|
player.hpp:23 [readability-redundant-access-specifiers] - Especificador de acceso redundante
|
||||||
|
|
||||||
|
⚪ Opcionales (3):
|
||||||
|
player.cpp:88 [readability-magic-numbers] - Magic number '16' (Game constant: BLOCK size)
|
||||||
|
player.cpp:120 [modernize-use-trailing-return-type] - Style preference
|
||||||
|
|
||||||
|
✅ Total: 10 issues (2 críticos, 5 recomendados, 3 opcionales)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
💡 Recomendaciones:
|
||||||
|
1. Corregir los 2 issues críticos manualmente
|
||||||
|
2. Aplicar --fix para 5 recomendaciones (revisa cambios antes de commitear)
|
||||||
|
3. Los opcionales son aceptables en código de juego
|
||||||
|
|
||||||
|
¿Deseas aplicar fixes automáticos para los issues recomendados? (y/n)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Aplicar Fixes Automáticos
|
||||||
|
|
||||||
|
Si el usuario acepta:
|
||||||
|
|
||||||
|
1. **Ejecutar con --fix**
|
||||||
|
```bash
|
||||||
|
tools/linter/run_clang-tidy.sh --fix archivo1.cpp archivo2.hpp
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Informar cambios**
|
||||||
|
- Listar archivos modificados
|
||||||
|
- Recomendar revisión manual
|
||||||
|
|
||||||
|
3. **Recompilar**
|
||||||
|
```bash
|
||||||
|
cmake --build build
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Verificar compilación exitosa**
|
||||||
|
- Si falla, informar errores
|
||||||
|
- Sugerir revertir cambios si es necesario
|
||||||
|
|
||||||
|
## Notas Importantes
|
||||||
|
|
||||||
|
- **Siempre analizar sin --fix primero** para revisar cambios propuestos
|
||||||
|
- **Requiere build/compile_commands.json** - el usuario debe haber compilado antes
|
||||||
|
- **Contexto importa** - Game code tiene patrones legítimos que linters marcan como issues
|
||||||
|
- **No aplicar --fix ciegamente** - Algunos fixes pueden romper lógica del juego
|
||||||
|
- **Archivos específicos** - Siempre analizar archivos concretos, no todo el proyecto
|
||||||
|
|
||||||
|
## Integración con Otros Comandos
|
||||||
|
|
||||||
|
Este comando puede ser llamado desde:
|
||||||
|
- `/refactor-class` - Después de refactorizar una clase
|
||||||
|
- Manualmente por el usuario para análisis ad-hoc
|
||||||
|
- Antes de commits importantes
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Uso:**
|
||||||
|
```
|
||||||
|
/lint-clang-tidy
|
||||||
|
(El comando preguntará qué archivos analizar)
|
||||||
|
|
||||||
|
O especificar directamente:
|
||||||
|
/lint-clang-tidy source/game/entities/player.cpp
|
||||||
|
```
|
||||||
275
.claude/commands/lint-cppcheck.md
Normal file
@@ -0,0 +1,275 @@
|
|||||||
|
---
|
||||||
|
description: Ejecuta cppcheck en código C++ y analiza resultados
|
||||||
|
---
|
||||||
|
|
||||||
|
# Lint cppcheck Command
|
||||||
|
|
||||||
|
Ejecuta análisis estático con cppcheck en código C++, filtra noise, e identifica issues reales relacionados con bugs, memory safety y undefined behavior.
|
||||||
|
|
||||||
|
## Propósito
|
||||||
|
|
||||||
|
cppcheck detecta:
|
||||||
|
- Memory leaks y resource leaks
|
||||||
|
- Null pointer dereferences
|
||||||
|
- Buffer overflows y array bounds issues
|
||||||
|
- Uninitialized variables
|
||||||
|
- Dead code y unused functions
|
||||||
|
- Style issues y code smells
|
||||||
|
- Undefined behavior
|
||||||
|
|
||||||
|
## Workflow de Ejecución
|
||||||
|
|
||||||
|
1. **Solicitar archivos/rutas al usuario** (si no se especifican)
|
||||||
|
- Pedir rutas de archivos `.cpp`/`.hpp` o carpetas a analizar
|
||||||
|
- Preguntar nivel de análisis (warning/all/unused)
|
||||||
|
- Default: `-w` (warning, style, performance)
|
||||||
|
|
||||||
|
2. **Validar precondiciones**
|
||||||
|
- Confirmar que los archivos/carpetas existen
|
||||||
|
- Si no existe `build/compile_commands.json`, el script lo generará automáticamente
|
||||||
|
|
||||||
|
3. **Ejecutar cppcheck**
|
||||||
|
```bash
|
||||||
|
# Para archivo específico
|
||||||
|
tools/linter/run_cppcheck.sh -w --path source/game/entities/player.cpp
|
||||||
|
|
||||||
|
# Para carpeta
|
||||||
|
tools/linter/run_cppcheck.sh -w --path source/game/entities/
|
||||||
|
|
||||||
|
# Proyecto completo (LENTO)
|
||||||
|
tools/linter/run_cppcheck.sh -w
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Leer archivo de resultados**
|
||||||
|
- `-w`: `tools/linter/cppcheck-result-warning-style-performance.txt`
|
||||||
|
- `-a`: `tools/linter/cppcheck-result-all.txt`
|
||||||
|
- `-u`: `tools/linter/cppcheck-result-unusedFunction.txt`
|
||||||
|
|
||||||
|
5. **Analizar y clasificar issues**
|
||||||
|
- Parsear formato de cppcheck: `[archivo:línea]: (severidad) mensaje`
|
||||||
|
- Filtrar falsos positivos conocidos
|
||||||
|
- Agrupar por categoría
|
||||||
|
|
||||||
|
6. **Presentar resumen al usuario**
|
||||||
|
- Mostrar issues críticos primero
|
||||||
|
- Explicar contexto cuando sea relevante
|
||||||
|
- Sugerir acciones correctivas
|
||||||
|
|
||||||
|
## Niveles de Análisis
|
||||||
|
|
||||||
|
### `-w` / `--warning` (Recomendado para uso diario)
|
||||||
|
- **Velocidad:** Rápido
|
||||||
|
- **Checks:** warning, style, performance
|
||||||
|
- **Uso:** Refactoring diario, antes de commits
|
||||||
|
- **Ejemplo:** `tools/linter/run_cppcheck.sh -w --path source/game/entities/player.cpp`
|
||||||
|
|
||||||
|
### `-a` / `--all` (Análisis exhaustivo)
|
||||||
|
- **Velocidad:** Lento
|
||||||
|
- **Checks:** Todos los checks disponibles
|
||||||
|
- **Uso:** Después de cambios mayores, auditorías de código
|
||||||
|
- **Ejemplo:** `tools/linter/run_cppcheck.sh -a --path source/game/`
|
||||||
|
|
||||||
|
### `-u` / `--unused` (Funciones no usadas)
|
||||||
|
- **Velocidad:** Medio
|
||||||
|
- **Checks:** unusedFunction
|
||||||
|
- **Uso:** Limpieza de código muerto
|
||||||
|
- **Ejemplo:** `tools/linter/run_cppcheck.sh -u`
|
||||||
|
- **Nota:** Requiere análisis de proyecto completo
|
||||||
|
|
||||||
|
## Falsos Positivos Conocidos
|
||||||
|
|
||||||
|
### `unusedFunction` en métodos públicos
|
||||||
|
- **Contexto:** Métodos de API pública, callbacks, getters/setters
|
||||||
|
- **Ejemplo:** `Player::getX()` usado desde múltiples lugares
|
||||||
|
- **Acción:** Ignorar si el método es parte de la interfaz pública
|
||||||
|
|
||||||
|
### `passedByValue` para tipos pequeños
|
||||||
|
- **Contexto:** SDL_FRect, SDL_Point, enums, small structs
|
||||||
|
- **Ejemplo:** `void setPos(SDL_FPoint pos)`
|
||||||
|
- **Acción:** Aceptable para tipos ≤ 16 bytes en game code
|
||||||
|
|
||||||
|
### `constParameter` en APIs consistentes
|
||||||
|
- **Contexto:** Parámetros que no se modifican pero mantienen consistencia de API
|
||||||
|
- **Acción:** Opcional, depende de estilo del proyecto
|
||||||
|
|
||||||
|
### `variableScope` en inicializaciones complejas
|
||||||
|
- **Contexto:** Variables declaradas antes de inicialización compleja
|
||||||
|
- **Acción:** Revisar caso por caso, puede ser falso positivo
|
||||||
|
|
||||||
|
## Categorización de Issues
|
||||||
|
|
||||||
|
### 🔴 Críticos (Requieren corrección inmediata)
|
||||||
|
- `error`: Bugs confirmados
|
||||||
|
- `memleakOnRealloc`: Memory leaks
|
||||||
|
- `nullPointer`: Null pointer dereferences
|
||||||
|
- `bufferAccessOutOfBounds`: Buffer overflows
|
||||||
|
- `uninitvar`: Variables no inicializadas
|
||||||
|
- `useAfterFree`: Use-after-free
|
||||||
|
|
||||||
|
### 🟠 Advertencias (Revisar y corregir)
|
||||||
|
- `warning`: Potenciales problemas
|
||||||
|
- `memleak`: Posibles memory leaks
|
||||||
|
- `resourceLeak`: Resource leaks (file handles, etc.)
|
||||||
|
- `doubleFree`: Double free
|
||||||
|
- `arrayIndexOutOfBounds`: Array bounds issues
|
||||||
|
|
||||||
|
### 🟡 Estilo (Mejoran calidad)
|
||||||
|
- `style`: Code smells
|
||||||
|
- `unusedVariable`: Variables no usadas
|
||||||
|
- `redundantAssignment`: Asignaciones redundantes
|
||||||
|
- `unreadVariable`: Variables escritas pero no leídas
|
||||||
|
|
||||||
|
### 🟢 Performance (Optimizaciones)
|
||||||
|
- `performance`: Optimizaciones de rendimiento
|
||||||
|
- `passedByValue`: Pasar por const& en vez de value
|
||||||
|
- `postfixOperator`: Usar prefix++ en vez de postfix++
|
||||||
|
|
||||||
|
### ⚪ Informativo (Opcional)
|
||||||
|
- `information`: Información general
|
||||||
|
- `portability`: Problemas de portabilidad
|
||||||
|
- `unusedFunction`: Funciones no usadas (revisar contexto)
|
||||||
|
|
||||||
|
## Formato de Reporte al Usuario
|
||||||
|
|
||||||
|
```
|
||||||
|
=== cppcheck Analysis Results ===
|
||||||
|
|
||||||
|
📁 Archivos analizados: source/game/entities/player.cpp
|
||||||
|
📊 Nivel: warning + style + performance
|
||||||
|
📝 Resultados: tools/linter/cppcheck-result-warning-style-performance.txt
|
||||||
|
|
||||||
|
🔴 Errores críticos (2):
|
||||||
|
player.cpp:156 [error:uninitvar] - Variable 'velocity' no inicializada
|
||||||
|
player.cpp:234 [error:nullPointer] - Posible null pointer dereference
|
||||||
|
|
||||||
|
🟠 Advertencias (3):
|
||||||
|
player.cpp:89 [warning:memleak] - Posible memory leak en 'sprite_'
|
||||||
|
player.cpp:178 [warning:arrayIndexOutOfBounds] - Índice fuera de límites
|
||||||
|
|
||||||
|
🟡 Estilo (4):
|
||||||
|
player.cpp:45 [style:unusedVariable] - Variable 'temp' declarada pero no usada
|
||||||
|
player.cpp:102 [style:redundantAssignment] - Asignación redundante a 'x_'
|
||||||
|
|
||||||
|
🟢 Performance (2):
|
||||||
|
player.cpp:67 [performance:passedByValue] - Pasar 'data' por const& (8 bytes - FALSO POSITIVO)
|
||||||
|
player.hpp:34 [performance:postfixOperator] - Usar prefix++ en lugar de postfix++
|
||||||
|
|
||||||
|
✅ Total: 11 issues
|
||||||
|
- 2 críticos ❗
|
||||||
|
- 3 advertencias
|
||||||
|
- 4 estilo
|
||||||
|
- 2 performance (1 falso positivo)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
💡 Acción requerida:
|
||||||
|
1. ✅ Corregir 2 errores críticos INMEDIATAMENTE
|
||||||
|
2. ⚠️ Revisar 3 advertencias y corregir si aplica
|
||||||
|
3. 🔧 Considerar 4 mejoras de estilo
|
||||||
|
4. ⚡ 1 optimización real de performance (ignorar passedByValue)
|
||||||
|
|
||||||
|
📄 Detalles completos en: tools/linter/cppcheck-result-warning-style-performance.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
## Acciones Post-Análisis
|
||||||
|
|
||||||
|
### Si hay errores críticos:
|
||||||
|
1. **Mostrar código afectado** con contexto
|
||||||
|
2. **Explicar el problema** en términos claros
|
||||||
|
3. **Sugerir corrección** específica
|
||||||
|
4. **Ofrecer aplicar fix** si es sencillo
|
||||||
|
|
||||||
|
### Si solo hay warnings/style:
|
||||||
|
1. **Resumir issues** por categoría
|
||||||
|
2. **Indicar prioridades** (qué corregir primero)
|
||||||
|
3. **Explicar falsos positivos** identificados
|
||||||
|
4. **Preguntar si aplicar fixes** para issues simples
|
||||||
|
|
||||||
|
### Si no hay issues:
|
||||||
|
```
|
||||||
|
✅ ¡Código limpio! No se encontraron issues.
|
||||||
|
```
|
||||||
|
|
||||||
|
## Ejemplos de Correcciones Comunes
|
||||||
|
|
||||||
|
### Uninitialized variable
|
||||||
|
```cpp
|
||||||
|
// ❌ Antes
|
||||||
|
int velocity;
|
||||||
|
if (condition) {
|
||||||
|
velocity = 10;
|
||||||
|
}
|
||||||
|
use(velocity); // Error: puede estar no inicializada
|
||||||
|
|
||||||
|
// ✅ Después
|
||||||
|
int velocity{0}; // Inicializar en declaración
|
||||||
|
if (condition) {
|
||||||
|
velocity = 10;
|
||||||
|
}
|
||||||
|
use(velocity);
|
||||||
|
```
|
||||||
|
|
||||||
|
### Memory leak
|
||||||
|
```cpp
|
||||||
|
// ❌ Antes
|
||||||
|
void loadTexture() {
|
||||||
|
texture_ = new SDL_Texture(...);
|
||||||
|
if (error) return; // Leak si hay error después
|
||||||
|
}
|
||||||
|
|
||||||
|
// ✅ Después
|
||||||
|
void loadTexture() {
|
||||||
|
auto temp = std::make_unique<SDL_Texture>(...)
|
||||||
|
if (error) return; // RAII - se libera automáticamente
|
||||||
|
texture_ = std::move(temp);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Null pointer dereference
|
||||||
|
```cpp
|
||||||
|
// ❌ Antes
|
||||||
|
Player* player = getPlayer();
|
||||||
|
player->update(); // Puede ser nullptr
|
||||||
|
|
||||||
|
// ✅ Después
|
||||||
|
Player* player = getPlayer();
|
||||||
|
if (player != nullptr) {
|
||||||
|
player->update();
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Integración con Workflow
|
||||||
|
|
||||||
|
### Cuándo ejecutar:
|
||||||
|
|
||||||
|
1. **Después de refactoring** - Verificar que no se introdujeron bugs
|
||||||
|
2. **Antes de commit** - Análisis `-w` rápido
|
||||||
|
3. **Antes de PR** - Análisis `-a` completo
|
||||||
|
4. **Periódicamente** - Análisis `-u` para limpieza de código
|
||||||
|
|
||||||
|
### Integración con `/refactor-class`:
|
||||||
|
|
||||||
|
El comando `/refactor-class` ejecuta automáticamente:
|
||||||
|
```bash
|
||||||
|
tools/linter/run_cppcheck.sh -w --path <archivo_refactorizado>
|
||||||
|
```
|
||||||
|
|
||||||
|
## Notas Importantes
|
||||||
|
|
||||||
|
- **Genera archivos de salida** en `tools/linter/cppcheck-result-*.txt`
|
||||||
|
- **Auto-genera compile_commands.json** si no existe
|
||||||
|
- **Paralelización automática** usa N-1 cores
|
||||||
|
- **Suppressions file** excluye external/ y system headers
|
||||||
|
- **Contexto importa** - Revisar falsos positivos manualmente
|
||||||
|
- **No modifica código** - Solo reporta, no aplica fixes automáticos
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Uso:**
|
||||||
|
```
|
||||||
|
/lint-cppcheck
|
||||||
|
(El comando preguntará qué analizar y qué nivel usar)
|
||||||
|
|
||||||
|
O especificar directamente:
|
||||||
|
/lint-cppcheck source/game/entities/player.cpp
|
||||||
|
```
|
||||||
279
.claude/commands/refactor-class.md
Normal file
@@ -0,0 +1,279 @@
|
|||||||
|
---
|
||||||
|
description: Refactoriza una clase C++ aplicando buenas prácticas de estilo
|
||||||
|
---
|
||||||
|
|
||||||
|
# Refactor Class Command
|
||||||
|
|
||||||
|
Refactoriza una clase C++ siguiendo estas reglas de estilo y buenas prácticas:
|
||||||
|
|
||||||
|
## Reglas de Refactorización
|
||||||
|
|
||||||
|
### 1. Inicialización de Variables Miembro
|
||||||
|
- **Inicializar en la declaración** todas las variables "simples" que no tengan dependencias complejas:
|
||||||
|
- Tipos primitivos: `int`, `float`, `bool`, etc.
|
||||||
|
- Enumeraciones: valores de enum class
|
||||||
|
- Valores por defecto conocidos: `0`, `0.0F`, `false`, `nullptr`, etc.
|
||||||
|
- **NO inicializar en declaración** si:
|
||||||
|
- Dependen de otros miembros
|
||||||
|
- Requieren llamadas a funciones complejas
|
||||||
|
- Son punteros a recursos que necesitan construcción específica
|
||||||
|
|
||||||
|
### 2. Structs con Valores por Defecto
|
||||||
|
- **Todos los miembros de structs** deben tener valores por defecto:
|
||||||
|
- Tipos primitivos: `int x{0}`, `float y{0.0F}`, `bool flag{false}`
|
||||||
|
- Strings: `std::string name{}`
|
||||||
|
- Punteros: `Type* ptr{nullptr}`
|
||||||
|
- **Ventajas**: Inicialización segura, evita valores indefinidos
|
||||||
|
|
||||||
|
### 3. Arrays C-style → std::array
|
||||||
|
- Convertir **todos** los arrays C-style a `std::array`:
|
||||||
|
- `Type array[N]` → `std::array<Type, N> array{}`
|
||||||
|
- Inicializar con `{}` para zero-initialization
|
||||||
|
- Agregar `#include <array>` si no existe
|
||||||
|
- **Ventajas**: type-safety, size(), métodos STL, sin decay a pointer
|
||||||
|
|
||||||
|
### 3. Reorganización de la Clase
|
||||||
|
|
||||||
|
#### Orden de Secciones
|
||||||
|
1. **public** (primero)
|
||||||
|
2. **private** (después)
|
||||||
|
|
||||||
|
#### Dentro de cada sección (private principalmente)
|
||||||
|
1. **Estructuras y enumeraciones** (tipos anidados)
|
||||||
|
2. **Constantes** (static constexpr)
|
||||||
|
3. **Métodos** (funciones miembro)
|
||||||
|
4. **Variables miembro** (al final)
|
||||||
|
|
||||||
|
### 4. Agrupación y Comentarios de Métodos
|
||||||
|
- **En sección public**: Agrupar métodos relacionados funcionalmente
|
||||||
|
- **Comentarios en línea** (a la derecha) para describir cada método/grupo
|
||||||
|
- **Formato**: `void method(); // Descripción concisa`
|
||||||
|
- **Espaciado**: Línea en blanco entre grupos funcionales
|
||||||
|
|
||||||
|
**Ejemplo:**
|
||||||
|
```cpp
|
||||||
|
public:
|
||||||
|
static void init(...); // Inicialización singleton
|
||||||
|
static void destroy(); // Destrucción singleton
|
||||||
|
static auto get() -> T*; // Acceso al singleton
|
||||||
|
|
||||||
|
void render(); // Renderizado
|
||||||
|
void update(float dt); // Actualización lógica
|
||||||
|
|
||||||
|
auto isActive() -> bool; // Consulta estado
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Comentarios de Variables
|
||||||
|
- **Posición**: A la derecha de la variable/grupo
|
||||||
|
- **Formato**: `// Descripción concisa`
|
||||||
|
- Agrupar variables relacionadas con un comentario común
|
||||||
|
|
||||||
|
### 6. Constructores en Structs
|
||||||
|
- **Eliminar constructores por defecto redundantes** en structs:
|
||||||
|
- Si todos los miembros tienen inicialización en declaración
|
||||||
|
- Y no hay múltiples constructores
|
||||||
|
- Eliminar `explicit Type() = default;`
|
||||||
|
- El compilador generará automáticamente un constructor por defecto
|
||||||
|
|
||||||
|
**Ejemplo:**
|
||||||
|
```cpp
|
||||||
|
struct Data {
|
||||||
|
int x{0};
|
||||||
|
std::string name{};
|
||||||
|
// NO NECESITA: explicit Data() = default;
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7. Includes Necesarios
|
||||||
|
- Agregar includes faltantes según lo que se use
|
||||||
|
- Mantener orden alfabético si es posible
|
||||||
|
|
||||||
|
### 8. Header Guards
|
||||||
|
- **Usar `#pragma once`** en todas las cabeceras (`.hpp`)
|
||||||
|
- **NO usar** `#ifndef`/`#define`/`#endif` tradicionales
|
||||||
|
- `#pragma once` debe ser la primera línea del archivo (antes de includes)
|
||||||
|
- **Ventajas**: Más simple, menos propenso a errores, ampliamente soportado
|
||||||
|
|
||||||
|
## Ejemplo de Aplicación
|
||||||
|
|
||||||
|
### Antes:
|
||||||
|
```cpp
|
||||||
|
class Example {
|
||||||
|
private:
|
||||||
|
struct Data {
|
||||||
|
std::string name;
|
||||||
|
int value;
|
||||||
|
};
|
||||||
|
|
||||||
|
int counter_;
|
||||||
|
bool flag_;
|
||||||
|
float values_[10];
|
||||||
|
|
||||||
|
public:
|
||||||
|
Example();
|
||||||
|
void update();
|
||||||
|
};
|
||||||
|
|
||||||
|
// Constructor
|
||||||
|
Example::Example()
|
||||||
|
: counter_(0),
|
||||||
|
flag_(false) {
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
values_[i] = 0.0F;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Después:
|
||||||
|
```cpp
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <array>
|
||||||
|
|
||||||
|
class Example {
|
||||||
|
public:
|
||||||
|
Example() = default; // Ya no necesita inicializar
|
||||||
|
void update();
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Tipos anidados
|
||||||
|
struct Data {
|
||||||
|
std::string name{}; // Nombre con valor por defecto
|
||||||
|
int value{0}; // Valor inicializado
|
||||||
|
};
|
||||||
|
|
||||||
|
// Variables miembro
|
||||||
|
int counter_{0}; // Contador de frames
|
||||||
|
bool flag_{false}; // Estado activo
|
||||||
|
std::array<float, 10> values_{}; // Buffer de valores
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
## Tareas a Realizar
|
||||||
|
|
||||||
|
Cuando uses este comando en una clase específica:
|
||||||
|
|
||||||
|
1. **Leer** el archivo `.hpp` y `.cpp` correspondiente
|
||||||
|
2. **Verificar** que la cabecera use `#pragma once` (reemplazar `#ifndef`/`#define`/`#endif` si existen)
|
||||||
|
3. **Identificar** structs y agregar valores por defecto a todos sus miembros
|
||||||
|
4. **Identificar** variables que pueden inicializarse en declaración
|
||||||
|
5. **Identificar** arrays C-style que convertir a std::array
|
||||||
|
6. **Reorganizar** la estructura de la clase (public/private, agrupación)
|
||||||
|
7. **Actualizar** el archivo `.cpp` eliminando inicializaciones redundantes
|
||||||
|
8. **Compilar** para verificar sintaxis correcta
|
||||||
|
9. **Ejecutar clang-tidy** (análisis, sin --fix) y revisar resultados
|
||||||
|
10. **Ejecutar cppcheck** (nivel -w) y revisar resultados
|
||||||
|
11. **Aplicar fixes apropiados** basados en análisis de linters
|
||||||
|
12. **Recompilar** si se aplicaron fixes
|
||||||
|
13. **Reportar resumen** al usuario: cambios + hallazgos de linters
|
||||||
|
|
||||||
|
## Workflow de Linters (Pasos 9-12)
|
||||||
|
|
||||||
|
### Paso 9: Ejecutar clang-tidy
|
||||||
|
|
||||||
|
```bash
|
||||||
|
tools/linter/run_clang-tidy.sh archivo.cpp archivo.hpp
|
||||||
|
```
|
||||||
|
|
||||||
|
**Analizar resultados:**
|
||||||
|
- Identificar issues críticos (bugprone, cert)
|
||||||
|
- Separar recomendaciones válidas de falsos positivos
|
||||||
|
- Ignorar: magic-numbers en game constants, defaults.hpp errors
|
||||||
|
- Si hay issues críticos, informar al usuario y pausar
|
||||||
|
- Si solo hay recomendaciones, continuar
|
||||||
|
|
||||||
|
### Paso 10: Ejecutar cppcheck
|
||||||
|
|
||||||
|
```bash
|
||||||
|
tools/linter/run_cppcheck.sh -w --path archivo.cpp
|
||||||
|
```
|
||||||
|
|
||||||
|
**Leer archivo de resultados:**
|
||||||
|
- `tools/linter/cppcheck-result-warning-style-performance.txt`
|
||||||
|
- Identificar errores críticos (error, nullPointer, uninitvar)
|
||||||
|
- Separar warnings de style issues
|
||||||
|
- Filtrar falsos positivos (passedByValue para tipos pequeños, unusedFunction en API pública)
|
||||||
|
- Si hay errores críticos, informar al usuario y pausar
|
||||||
|
|
||||||
|
### Paso 11: Aplicar Fixes
|
||||||
|
|
||||||
|
**Si hay issues aplicables:**
|
||||||
|
|
||||||
|
1. **Fixes automáticos de clang-tidy** (solo si son seguros):
|
||||||
|
- modernize-use-auto
|
||||||
|
- readability-redundant-access-specifiers
|
||||||
|
- Performance optimizations claras
|
||||||
|
|
||||||
|
```bash
|
||||||
|
tools/linter/run_clang-tidy.sh --fix archivo.cpp archivo.hpp
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Fixes manuales necesarios:**
|
||||||
|
- Inicializar variables no inicializadas
|
||||||
|
- Corregir null pointer issues
|
||||||
|
- Resolver memory leaks
|
||||||
|
|
||||||
|
3. **Documentar cambios** para el reporte final
|
||||||
|
|
||||||
|
### Paso 12: Recompilar
|
||||||
|
|
||||||
|
Si se aplicaron fixes en paso 11:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cmake --build build
|
||||||
|
```
|
||||||
|
|
||||||
|
**Verificar:**
|
||||||
|
- ✅ Compilación exitosa → Continuar a reporte
|
||||||
|
- ❌ Errores → Informar al usuario, sugerir revisión manual
|
||||||
|
|
||||||
|
## Formato de Reporte Final (Paso 13)
|
||||||
|
|
||||||
|
```
|
||||||
|
=== Refactor Completado: ClassName ===
|
||||||
|
|
||||||
|
📝 Cambios estructurales:
|
||||||
|
✅ #pragma once aplicado
|
||||||
|
✅ 3 structs actualizados con valores por defecto
|
||||||
|
✅ 12 variables movidas a inicialización en declaración
|
||||||
|
✅ 2 arrays C-style → std::array
|
||||||
|
✅ Clase reorganizada (public primero, variables al final)
|
||||||
|
✅ Constructor simplificado (elimina 12 inicializaciones redundantes)
|
||||||
|
|
||||||
|
🔍 Análisis de linters:
|
||||||
|
|
||||||
|
clang-tidy:
|
||||||
|
✅ Sin issues críticos
|
||||||
|
🟡 3 recomendaciones aplicadas automáticamente:
|
||||||
|
- Modernize: use auto (2 lugares)
|
||||||
|
- Readability: redundant specifier (1 lugar)
|
||||||
|
⚪ 2 opcionales ignorados:
|
||||||
|
- magic-numbers en game constants
|
||||||
|
|
||||||
|
cppcheck:
|
||||||
|
✅ Sin errores
|
||||||
|
🟡 2 style issues encontrados:
|
||||||
|
- Unused variable 'temp' en línea 45 → Eliminada
|
||||||
|
- Redundant assignment en línea 102 → Corregida
|
||||||
|
|
||||||
|
📊 Resultado:
|
||||||
|
✅ Compilación exitosa
|
||||||
|
✅ Todos los linters pasan sin issues críticos
|
||||||
|
✅ Código refactorizado y verificado
|
||||||
|
|
||||||
|
💡 Próximos pasos:
|
||||||
|
- Revisar cambios manualmente
|
||||||
|
- Ejecutar tests si existen
|
||||||
|
- Commitear con mensaje descriptivo
|
||||||
|
```
|
||||||
|
|
||||||
|
## Notas Importantes
|
||||||
|
|
||||||
|
- **No cambiar lógica**: Solo refactorización estructural
|
||||||
|
- **Mantener compatibilidad**: std::array usa misma sintaxis [] para acceso
|
||||||
|
- **Formato consistente**: Respetar estilo del proyecto (comentarios, espaciado)
|
||||||
|
- **Validar compilación**: Siempre verificar que compile después de cambios
|
||||||
|
- **Linters integrados**: Análisis automático post-refactor para garantizar calidad
|
||||||
|
- **Fixes inteligentes**: Solo aplicar --fix de clang-tidy si los cambios son seguros
|
||||||
|
- **Contexto importa**: Game code tiene patrones legítimos (magic numbers, etc.)
|
||||||
|
- **Falsos positivos**: Identificar y documentar, no corregir ciegamente
|
||||||
16
.gitignore
vendored
@@ -1,5 +1,6 @@
|
|||||||
.vscode/
|
.cache/
|
||||||
*data/config/config.txt
|
|
||||||
|
*data/config/config.yaml
|
||||||
*stats.txt
|
*stats.txt
|
||||||
*.DS_Store
|
*.DS_Store
|
||||||
thumbs.db
|
thumbs.db
|
||||||
@@ -15,4 +16,13 @@ jaildoctors_dilemma*
|
|||||||
todo
|
todo
|
||||||
build/
|
build/
|
||||||
linux_utils/
|
linux_utils/
|
||||||
.claude/
|
source/version.h
|
||||||
|
resources.pack
|
||||||
|
jdd_release/
|
||||||
|
tools/pack_resources/pack_resources
|
||||||
|
tools/pack_resources/pack_resources.exe
|
||||||
|
tools/pack_resources/pack_tool
|
||||||
|
tools/pack_resources/pack_tool.exe
|
||||||
|
*.res
|
||||||
|
dist/
|
||||||
|
.claude/settings.local.json
|
||||||
|
|||||||
3
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"C_Cpp.default.compileCommands": "${workspaceFolder}/build/compile_commands.json"
|
||||||
|
}
|
||||||
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`
|
||||||
170
CHANGELOG.md
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
All notable changes to JailDoctor's Dilemma are documented here.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [v1.12] - 2026-04-02
|
||||||
|
|
||||||
|
### Novedades
|
||||||
|
- **Color del jugador configurable:** se puede cambiar desde la consola (persistente), con comprobación automática para evitar que coincida con el color de fondo
|
||||||
|
- **Skins de enemigos para el jugador:** posibilidad de usar skins de enemigos en el jugador, con cambio en caliente en el marcador
|
||||||
|
- **Indicador de trucos mejorado:** ya no usa el color del jugador, ahora se muestra en el marcador
|
||||||
|
- **Shader presets por nombre:** se puede establecer un shader preset directamente por nombre desde la consola, con autocompletado
|
||||||
|
- **Comandos externos en consola:** la consola lee los comandos desde un fichero externo
|
||||||
|
- **Gestión de paletas mejorada:**
|
||||||
|
- Nuevas paletas añadidas
|
||||||
|
- Restaurado el orden original de las paletas
|
||||||
|
- Opción de reordenar paletas automáticamente por luminosidad o parecido a la paleta de Spectrum
|
||||||
|
- Nombres "pretty" para las paletas (cambia los `-` por ` `)
|
||||||
|
- Eliminadas responsabilidades de `Options` sobre las paletas
|
||||||
|
- Nueva herramienta en Python para reordenar paletas
|
||||||
|
- **Aceleración hardware configurable:** posibilidad de desactivar la aceleración hardware desde el fichero de configuración; si no hay aceleración, se deshabilitan teclas y comandos de shaders
|
||||||
|
- **Autocompletado mejorado:** shader preset y palette autocompletan con la lista de nombres
|
||||||
|
- Reestructuración de comandos de consola
|
||||||
|
- Reestructuración del apartado de vídeo en `config.yaml`
|
||||||
|
- Optimizaciones en `Surface`
|
||||||
|
|
||||||
|
### Correcciones
|
||||||
|
- Fix: entrar y salir del modo debug mantiene el estado previo del jugador
|
||||||
|
- Corregido Makefile: migración completa a cmake, detección automática de SO para release
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [v1.11] - 2026-03-31
|
||||||
|
|
||||||
|
### Novedades
|
||||||
|
- **PaletteManager:** refactorización de `Screen`, responsabilidades de gestión de paletas extraídas a clase propia
|
||||||
|
- **Consola 2.1:** la consola puede cambiar de paleta por nombre (`Screen` devuelve lista de paletas)
|
||||||
|
- **Zoom configurable:** `Screen` permite establecer el nivel de zoom directamente desde consola
|
||||||
|
- **Autocompletar en consola:** autocompletado de comandos con Tab (incluyendo soporte para armadura de lagarto)
|
||||||
|
- Generación automática de tabla de tab-completions en la consola
|
||||||
|
|
||||||
|
### Correcciones
|
||||||
|
- Fix: al entrar a GAME con la consola abierta, el jugador no tenía los inputs deshabilitados
|
||||||
|
- Fix: al hacer restart con la música del attract mode sonando, la música no paraba al ir al logo
|
||||||
|
- Fix: en modo debug, protección para que el jugador no caiga infinitamente si sale de pantalla
|
||||||
|
- Corregido el case en algunas respuestas de la consola
|
||||||
|
- Corregido Makefile
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [v1.10] - 2026-03-30
|
||||||
|
|
||||||
|
### Novedades
|
||||||
|
- **Consola 2.0:** rediseño completo de la consola de desarrollador
|
||||||
|
- Efecto typewriter al mostrar texto
|
||||||
|
- Separación de líneas automática
|
||||||
|
- Cambio de skin
|
||||||
|
- Historial y navegación mejorada
|
||||||
|
- Comandos para cheats, control de escena, debug, audio y shaders
|
||||||
|
- Teclas de función operativas con la consola abierta
|
||||||
|
- Límite de caracteres ampliado
|
||||||
|
- La consola ya no pausa al jugador
|
||||||
|
- Reorganización del sistema de comandos y aliases (`show info`, `hide info`, etc.)
|
||||||
|
- **RenderInfo:** nueva clase con animación para mostrar info de renderizado en pantalla
|
||||||
|
- **Soporte multi-shader:** comandos y teclas para manejar el nuevo diseño de shaders (SPIRV/SPIR-V)
|
||||||
|
- **Modo kiosko:** defaults y restricciones de comandos para modo kiosk
|
||||||
|
- **Supersampling Lanczos:** implementación de escalado Lanczos en el supersampling
|
||||||
|
- **Driver GPU configurable:** permite elegir driver de GPU o ninguno desde consola
|
||||||
|
- Cheats accesibles desde la consola
|
||||||
|
- Cambio y reinicio de escena desde la consola
|
||||||
|
- Posición e habitación inicial de debug configurables desde consola y fichero
|
||||||
|
- `Debug` carga posición e habitación inicial desde fichero
|
||||||
|
- Comandos de audio configurables desde consola
|
||||||
|
- Renderizado del dispositivo GPU en info_debug
|
||||||
|
- `Screen` optimizado (`textureToRenderer()`)
|
||||||
|
- Eliminado soporte para argumentos de línea de comandos
|
||||||
|
- Eliminado `Options::console`
|
||||||
|
- Help de consola organizado
|
||||||
|
|
||||||
|
### Correcciones
|
||||||
|
- Fix: vsync off no funcionaba en Wayland
|
||||||
|
- Fix: en TITLE, la consola no bloqueaba la pulsación del 1 al 4 y entraba a opciones
|
||||||
|
- Fix: dos logs de consola con formato incorrecto
|
||||||
|
- Fix: lógica para abrir y entrar a la jail (ahora usa número de habitación, no nombre)
|
||||||
|
- Corregido `compile_spirv.cmake` y la `system_folder` para shaders
|
||||||
|
- Corregido carácter de caret que se había perdido
|
||||||
|
- Eliminados acentos en títulos de habitaciones que causaban problemas con fuentes
|
||||||
|
- Revisadas y corregidas traducciones
|
||||||
|
- Corregidos ficheros `.fnt`
|
||||||
|
- Corrección en `Screen` para `std::setprecision()` (faltaba `#include <iomanip>`)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [v1.09] - 2025-03-01
|
||||||
|
|
||||||
|
### Novedades
|
||||||
|
- **Refactorización a singletons:** `Screen`, `Input`, `Audio`, `Resource::Cache`, `Resource::List`, `Director`, `Cheevos`, `Debug` convertidos a singletons thread-safe
|
||||||
|
- **Smart pointers:** uso de `std::shared_ptr` y `std::unique_ptr` para gestión de recursos y sprites
|
||||||
|
- **Surfaces 8-bit indexadas:** nuevo sistema de renderizado con color indexado y paletas intercambiables
|
||||||
|
- **Sistema de notificaciones rediseñado:** nuevo engine de notificaciones con control de offset
|
||||||
|
- **Modos de vídeo mejorados:** la ventana mantiene posición al cambiar tamaño o activar borde; puede crecer según el escritorio
|
||||||
|
- **ItemTracker:** nuevo singleton para rastrear ítems recogidos
|
||||||
|
- **globalEvents:** nuevo sistema de eventos globales SDL
|
||||||
|
- **Barra de progreso en carga de recursos** (actualización cada 5 ítems para mayor rendimiento con vsync)
|
||||||
|
- **Métodos show/hide ventana:** métodos para mostrar u ocultar la ventana
|
||||||
|
- Afinada la clase `Options`
|
||||||
|
- Actualizada a la última versión de `jail_audio`
|
||||||
|
- Implementados shaders
|
||||||
|
- Nueva tipografía añadida
|
||||||
|
- Parametros de ficheros `.ani` migrados a snake_case
|
||||||
|
- Música de Title y attract mode restaurada
|
||||||
|
- Eliminado sistema online completo
|
||||||
|
|
||||||
|
### Correcciones
|
||||||
|
- Fix: notificaciones ya no ensucian la pantalla de carga
|
||||||
|
- Fix: no pintaba el efecto de carga del borde en `LoadingScreen`
|
||||||
|
- Fix: bug con el puntero a `ScoreboardData`
|
||||||
|
- Fix: carga de opciones y recursos corregida
|
||||||
|
- Eliminados acentos problemáticos
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [v1.08] - 2024-02-22
|
||||||
|
|
||||||
|
### Novedades
|
||||||
|
- Posibilidad de saltar la pantalla de carga ya completada desde el menú de título
|
||||||
|
- El `gamestate_title` puede empezar en diferentes estados
|
||||||
|
- Pantalla de carga con fade de paleta
|
||||||
|
- GIF loader: dibujado correcto de GIFs en pantalla
|
||||||
|
- Añadida `paleta.cpp`/`.h` y `gif.c`
|
||||||
|
|
||||||
|
### Correcciones
|
||||||
|
- Corregido bug en el fade de paleta (el canal azul no se propagaba)
|
||||||
|
- Arreglada la separación entre el título y el fade
|
||||||
|
- Online deshabilitado por defecto al crear el fichero de configuración
|
||||||
|
- Tiempo de la pantalla de carga aumentado
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [v1.07] - 2022-12-02
|
||||||
|
|
||||||
|
### Novedades
|
||||||
|
- El nombre de la habitación se pinta a partir de una textura
|
||||||
|
- Añadido Batman a FEEL THE HEAT
|
||||||
|
- Cielo de la Jail actualizado
|
||||||
|
- Retocada la pantalla de título
|
||||||
|
- Sprite de PACO modificado
|
||||||
|
- Nombre del enemigo diskette cambiado a floppy
|
||||||
|
- Cambios cosméticos en algunas habitaciones (BE CAREFUL WITH THE FUSE renombrado)
|
||||||
|
- El color de fondo de la habitación se pinta en la textura del mapa
|
||||||
|
- Optimizaciones en intro y title
|
||||||
|
- Preparación para compatibilidad con consolas
|
||||||
|
- Actualizado `jail_audio` a la última versión
|
||||||
|
- Eliminados la mayor parte de accesos a `vector::at()`
|
||||||
|
|
||||||
|
### Correcciones
|
||||||
|
- Corregido bug: en la jail se rellenaban las vidas mientras estaba activa la pausa
|
||||||
|
- Corregido memory leak en `texture.cpp`
|
||||||
|
- Corregido bug en apertura de la Jail
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [v1.0] - 2022-11-13
|
||||||
|
|
||||||
|
Versión de lanzamiento inicial.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*El formato de este changelog sigue [Keep a Changelog](https://keepachangelog.com/).*
|
||||||
394
CLAUDE.md
@@ -53,11 +53,52 @@ cmake --build build --clean-first
|
|||||||
./jaildoctors_dilemma
|
./jaildoctors_dilemma
|
||||||
```
|
```
|
||||||
|
|
||||||
**Important:** The build directory is `/Users/sergio/Gitea/jaildoctors_dilemma/build` and the output executable is placed in the project root directory.
|
**Important:** The build directory is `build/` relative to the project root and the output executable is placed in the project root directory.
|
||||||
|
|
||||||
### Linter (clang-tidy)
|
### Testing in Headless Environment (SSH/Remote Server)
|
||||||
|
|
||||||
**IMPORTANT:** Always run the linter on specific files, NOT on the entire project, to avoid long execution times and errors in unrelated files.
|
**IMPORTANT:** When working on a remote server via SSH without a physical display, the game MUST be run using Xvfb (X Virtual Framebuffer) to avoid SDL3 display initialization errors.
|
||||||
|
|
||||||
|
#### Required Setup (One-time)
|
||||||
|
```bash
|
||||||
|
# Install Xvfb
|
||||||
|
sudo apt-get install xvfb
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Running the Game in Headless Mode
|
||||||
|
|
||||||
|
**Option 1: Using xvfb-run directly (RECOMMENDED)**
|
||||||
|
```bash
|
||||||
|
xvfb-run -a ./jaildoctors_dilemma
|
||||||
|
```
|
||||||
|
|
||||||
|
**Option 2: Custom display configuration**
|
||||||
|
```bash
|
||||||
|
xvfb-run -a -s "-screen 0 1280x720x24" ./jaildoctors_dilemma
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Why This Is Critical
|
||||||
|
|
||||||
|
- **SDL3 requires a display:** The game uses SDL3 which requires X11/Wayland display
|
||||||
|
- **No code changes needed:** Xvfb simulates a virtual display without modifying the codebase
|
||||||
|
- **Full logging:** Console output and logs work normally, essential for debugging resource loading
|
||||||
|
- **Testing resource loading:** When modifying asset loading code, running with xvfb-run allows seeing all initialization logs
|
||||||
|
|
||||||
|
**ALWAYS use xvfb-run when testing on the remote server, especially when:**
|
||||||
|
- Modifying resource loading code
|
||||||
|
- Testing asset initialization
|
||||||
|
- Debugging startup issues
|
||||||
|
- Verifying configuration changes
|
||||||
|
|
||||||
|
### Static Analysis Tools (Linters)
|
||||||
|
|
||||||
|
This project uses two complementary static analysis tools for code quality:
|
||||||
|
|
||||||
|
#### clang-tidy (Modernization & Best Practices)
|
||||||
|
|
||||||
|
**Purpose:** Detects style issues, modernization opportunities, and potential bugs. Best for refactoring and applying C++20 best practices.
|
||||||
|
|
||||||
|
**IMPORTANT:** Always run on specific files, NOT on the entire project, to avoid long execution times and errors in unrelated files.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Analyze a specific file (RECOMMENDED)
|
# Analyze a specific file (RECOMMENDED)
|
||||||
@@ -73,7 +114,80 @@ tools/linter/run_clang-tidy.sh --fix source/game/entities/player.cpp
|
|||||||
tools/linter/run_clang-tidy.sh
|
tools/linter/run_clang-tidy.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
**Note:** Running the linter on the entire project can produce errors in files like `defaults.hpp` that are unrelated to your changes. Always target specific files you're working on.
|
**Common clang-tidy Checks:**
|
||||||
|
- `modernize-*`: C++ modernization (use auto, range-for, etc.)
|
||||||
|
- `readability-*`: Code readability improvements
|
||||||
|
- `performance-*`: Performance optimizations
|
||||||
|
- `bugprone-*`: Potential bug detection
|
||||||
|
|
||||||
|
**Known False Positives:**
|
||||||
|
- `defaults.hpp`: May report errors in constant definitions
|
||||||
|
- `readability-magic-numbers`: Acceptable for game constants (block sizes, speeds, etc.)
|
||||||
|
- `cppcoreguidelines-avoid-magic-numbers`: Same as above, acceptable in game code
|
||||||
|
|
||||||
|
#### cppcheck (Bug Detection & Memory Safety)
|
||||||
|
|
||||||
|
**Purpose:** Detects bugs, memory leaks, undefined behavior, and style issues. Complementary to clang-tidy.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Warning, style, and performance analysis (RECOMMENDED for daily use)
|
||||||
|
tools/linter/run_cppcheck.sh -w --path source/game/entities/player.cpp
|
||||||
|
|
||||||
|
# Exhaustive analysis (slower, more thorough)
|
||||||
|
tools/linter/run_cppcheck.sh -a --path source/game/entities/
|
||||||
|
|
||||||
|
# Detect unused functions (whole project analysis)
|
||||||
|
tools/linter/run_cppcheck.sh -u
|
||||||
|
|
||||||
|
# Analyze entire project with warning level
|
||||||
|
tools/linter/run_cppcheck.sh -w
|
||||||
|
```
|
||||||
|
|
||||||
|
**Output:** Results are saved in `tools/linter/cppcheck-result-*.txt`
|
||||||
|
|
||||||
|
**Common cppcheck Checks:**
|
||||||
|
- Memory leaks and resource management
|
||||||
|
- Null pointer dereferences
|
||||||
|
- Buffer overflows and array bounds
|
||||||
|
- Uninitialized variables
|
||||||
|
- Dead code and unused functions
|
||||||
|
|
||||||
|
**Known False Positives:**
|
||||||
|
- `unusedFunction`: May report false positives for callback functions or public API methods
|
||||||
|
- `passedByValue`: Acceptable for small types like SDL_FRect in game code
|
||||||
|
- `constParameter`: Not always applicable for API consistency
|
||||||
|
|
||||||
|
#### When to Use Each Tool
|
||||||
|
|
||||||
|
| Scenario | Tool | Reason |
|
||||||
|
|----------|------|--------|
|
||||||
|
| **Daily refactoring** | clang-tidy | Fast, auto-fixable issues |
|
||||||
|
| **Before committing** | Both | Comprehensive quality check |
|
||||||
|
| **After major changes** | cppcheck -a | Deep bug analysis |
|
||||||
|
| **Hunting memory leaks** | cppcheck | Specialized detection |
|
||||||
|
| **Code modernization** | clang-tidy --fix | Automatic C++20 upgrades |
|
||||||
|
|
||||||
|
#### Best Practices
|
||||||
|
|
||||||
|
1. **Run linters after compilation succeeds** - Fix compile errors first
|
||||||
|
2. **Analyze specific files** - Faster feedback, avoids unrelated errors
|
||||||
|
3. **Review before applying --fix** - Understand changes before accepting
|
||||||
|
4. **Context matters** - Game code may legitimately have "magic numbers" for gameplay constants
|
||||||
|
5. **Use both tools** - They catch different issues and complement each other
|
||||||
|
6. **Check suppressions file** - `tools/linter/cppcheck_suppressions` excludes external/ and system headers
|
||||||
|
|
||||||
|
#### Integration with Development Workflow
|
||||||
|
|
||||||
|
When refactoring code (especially with `/refactor-class` command):
|
||||||
|
1. Make structural changes
|
||||||
|
2. **Compile** to verify syntax
|
||||||
|
3. **Run clang-tidy** (without --fix) to identify issues
|
||||||
|
4. **Run cppcheck -w** to catch bugs
|
||||||
|
5. Review and fix legitimate issues
|
||||||
|
6. Apply automatic fixes if appropriate
|
||||||
|
7. Recompile and test
|
||||||
|
|
||||||
|
**Note:** The `/refactor-class` command automatically runs both linters after compilation and provides intelligent analysis of results.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -119,26 +233,39 @@ The architecture follows a **layered, modular design** with clear separation of
|
|||||||
source/
|
source/
|
||||||
├── core/ # Core engine systems
|
├── core/ # Core engine systems
|
||||||
│ ├── audio/ # Audio management
|
│ ├── audio/ # Audio management
|
||||||
│ │ └── audio.hpp/cpp # Audio singleton (music, sounds, volumes)
|
│ │ ├── audio.hpp/cpp # Audio singleton (music, sounds, volumes)
|
||||||
|
│ │ └── jail_audio.hpp # Custom jail_audio library wrapper
|
||||||
│ ├── input/ # Input handling
|
│ ├── input/ # Input handling
|
||||||
│ │ ├── input.hpp/cpp # Input manager (keyboard, gamepad)
|
│ │ ├── input.hpp/cpp # Input manager (keyboard, gamepad)
|
||||||
|
│ │ ├── input_types.hpp # Input type definitions
|
||||||
│ │ ├── global_inputs.hpp # Global input state
|
│ │ ├── global_inputs.hpp # Global input state
|
||||||
│ │ └── mouse.hpp # Mouse input
|
│ │ └── mouse.hpp # Mouse input
|
||||||
|
│ ├── locale/ # Localization
|
||||||
|
│ │ └── locale.hpp # Locale/language support
|
||||||
│ ├── rendering/ # Graphics rendering
|
│ ├── rendering/ # Graphics rendering
|
||||||
│ │ ├── screen.hpp/cpp # Screen/window singleton, SDL renderer
|
│ │ ├── screen.hpp/cpp # Screen/window singleton, SDL renderer
|
||||||
│ │ ├── surface.hpp/cpp # 8-bit indexed color surface abstraction
|
│ │ ├── surface.hpp/cpp # 8-bit indexed color surface abstraction
|
||||||
│ │ ├── surface_sprite.hpp # Static sprite rendering
|
│ │ ├── sprite/ # Sprite rendering classes
|
||||||
│ │ ├── surface_animated_sprite.hpp # Animated sprite with frame data
|
│ │ │ ├── sprite.hpp # Static sprite rendering
|
||||||
│ │ ├── surface_moving_sprite.hpp # Moving sprite with velocity
|
│ │ │ ├── animated_sprite.hpp # Animated sprite with frame data
|
||||||
│ │ ├── texture.hpp/cpp # SDL texture wrapper
|
│ │ │ ├── moving_sprite.hpp # Moving sprite with velocity
|
||||||
|
│ │ │ └── dissolve_sprite.hpp # Dissolve transition sprite
|
||||||
│ │ ├── text.hpp/cpp # Text rendering system
|
│ │ ├── text.hpp/cpp # Text rendering system
|
||||||
│ │ ├── gif.hpp/cpp # GIF image loader
|
│ │ ├── gif.hpp/cpp # GIF image loader
|
||||||
│ │ ├── opengl/ # OpenGL shader backend
|
│ │ ├── pixel_reveal.hpp # Pixel reveal effect
|
||||||
│ │ │ └── opengl_shader.hpp/cpp # CRT shader effects
|
│ │ ├── render_info.hpp # Render information data
|
||||||
|
│ │ ├── palette_manager.hpp # Palette management
|
||||||
|
│ │ ├── sdl3gpu/ # SDL3 GPU shader backend
|
||||||
|
│ │ │ ├── sdl3gpu_shader.hpp/cpp # CRT/post-processing shader effects
|
||||||
|
│ │ │ └── *_spv.h # Pre-compiled SPIR-V shader headers
|
||||||
│ │ └── shader_backend.hpp # Abstract shader interface
|
│ │ └── shader_backend.hpp # Abstract shader interface
|
||||||
│ ├── resources/ # Asset & Resource management
|
│ ├── resources/ # Asset & Resource management
|
||||||
│ │ ├── asset.hpp/cpp # Asset registry (file path mapping)
|
│ │ ├── resource_list.hpp # Asset path registry (O(1) lookups)
|
||||||
│ │ └── resource.hpp/cpp # Resource singleton (loads/caches assets)
|
│ │ ├── resource_cache.hpp # Resource caching singleton
|
||||||
|
│ │ ├── resource_loader.hpp # Asset loading logic
|
||||||
|
│ │ ├── resource_pack.hpp # Resource pack handling
|
||||||
|
│ │ ├── resource_helper.hpp # Resource utility functions
|
||||||
|
│ │ └── resource_types.hpp # Resource type definitions
|
||||||
│ └── system/ # System management
|
│ └── system/ # System management
|
||||||
│ ├── director.hpp/cpp # Main application controller
|
│ ├── director.hpp/cpp # Main application controller
|
||||||
│ ├── debug.hpp/cpp # Debug info overlay
|
│ ├── debug.hpp/cpp # Debug info overlay
|
||||||
@@ -149,8 +276,13 @@ source/
|
|||||||
│ │ ├── enemy.hpp/cpp # Enemy entities
|
│ │ ├── enemy.hpp/cpp # Enemy entities
|
||||||
│ │ └── item.hpp/cpp # Collectible items
|
│ │ └── item.hpp/cpp # Collectible items
|
||||||
│ ├── gameplay/ # Core gameplay systems
|
│ ├── gameplay/ # Core gameplay systems
|
||||||
│ │ ├── room.hpp/cpp # Room/level logic, tilemap, collision
|
│ │ ├── room.hpp/cpp # Room/level logic, collision
|
||||||
|
│ │ ├── room_loader.hpp/cpp # Room loading from YAML files
|
||||||
│ │ ├── room_tracker.hpp/cpp # Tracks visited rooms
|
│ │ ├── room_tracker.hpp/cpp # Tracks visited rooms
|
||||||
|
│ │ ├── collision_map.hpp/cpp # Collision map data
|
||||||
|
│ │ ├── tilemap_renderer.hpp/cpp # Tilemap rendering
|
||||||
|
│ │ ├── enemy_manager.hpp/cpp # Enemy lifecycle management
|
||||||
|
│ │ ├── item_manager.hpp/cpp # Item lifecycle management
|
||||||
│ │ ├── scoreboard.hpp/cpp # Score display & data
|
│ │ ├── scoreboard.hpp/cpp # Score display & data
|
||||||
│ │ ├── item_tracker.hpp/cpp # Tracks collected items
|
│ │ ├── item_tracker.hpp/cpp # Tracks collected items
|
||||||
│ │ ├── stats.hpp/cpp # Game statistics
|
│ │ ├── stats.hpp/cpp # Game statistics
|
||||||
@@ -165,22 +297,27 @@ source/
|
|||||||
│ │ ├── ending2.hpp/cpp # Ending sequence 2
|
│ │ ├── ending2.hpp/cpp # Ending sequence 2
|
||||||
│ │ └── credits.hpp/cpp # Credits screen
|
│ │ └── credits.hpp/cpp # Credits screen
|
||||||
│ ├── ui/ # User interface
|
│ ├── ui/ # User interface
|
||||||
│ │ └── notifier.hpp/cpp # Achievement/notification display
|
│ │ ├── notifier.hpp/cpp # Achievement/notification display
|
||||||
|
│ │ ├── console.hpp/cpp # In-game debug console
|
||||||
|
│ │ └── console_commands.hpp/cpp # Console command definitions
|
||||||
│ ├── options.hpp/cpp # Game configuration/options
|
│ ├── options.hpp/cpp # Game configuration/options
|
||||||
|
│ ├── game_control.hpp # Game control logic
|
||||||
│ ├── scene_manager.hpp # Scene flow state machine
|
│ ├── scene_manager.hpp # Scene flow state machine
|
||||||
│ ├── defaults.hpp # Game defaults constants
|
│ └── defaults.hpp # Game defaults constants
|
||||||
│ └── gameplay.hpp # Gameplay constants
|
|
||||||
├── external/ # Third-party libraries
|
├── external/ # Third-party libraries
|
||||||
│ ├── jail_audio.hpp/cpp # Custom audio library
|
│ ├── fkyaml_node.hpp # YAML parsing library
|
||||||
│ ├── jail_audio.h # C interface for jail_audio
|
|
||||||
│ ├── stb_image.h # Image loading library
|
│ ├── stb_image.h # Image loading library
|
||||||
│ └── stb_vorbis.h # OGG Vorbis audio decoding
|
│ └── stb_vorbis.h # OGG Vorbis audio decoding
|
||||||
├── utils/ # Utility code
|
├── utils/ # Utility code
|
||||||
│ ├── delta_timer.hpp/cpp # Frame-rate independent timing
|
│ ├── delta_timer.hpp/cpp # Frame-rate independent timing
|
||||||
|
│ ├── easing_functions.hpp # Easing/interpolation functions
|
||||||
│ ├── defines.hpp # Game constants (resolutions, block sizes)
|
│ ├── defines.hpp # Game constants (resolutions, block sizes)
|
||||||
│ └── utils.hpp/cpp # Helper functions (colors, math)
|
│ └── utils.hpp/cpp # Helper functions (colors, math)
|
||||||
└── main.cpp # Application entry point
|
└── main.cpp # Application entry point
|
||||||
|
|
||||||
|
config/ # Configuration files
|
||||||
|
└── assets.yaml # Asset registry (text-based configuration)
|
||||||
|
|
||||||
data/ # Game assets
|
data/ # Game assets
|
||||||
├── font/ # Bitmap fonts + descriptors
|
├── font/ # Bitmap fonts + descriptors
|
||||||
├── palette/ # Color palettes (.pal files)
|
├── palette/ # Color palettes (.pal files)
|
||||||
@@ -224,8 +361,8 @@ class Screen {
|
|||||||
- `Screen` - Rendering, window management, palette/shader effects
|
- `Screen` - Rendering, window management, palette/shader effects
|
||||||
- `Input` - Keyboard & gamepad input binding and checking
|
- `Input` - Keyboard & gamepad input binding and checking
|
||||||
- `Audio` - Music and sound effect playback
|
- `Audio` - Music and sound effect playback
|
||||||
- `Resource` - Asset loading, caching, streaming
|
- `Resource::Cache` - Asset loading, caching, streaming (with error handling)
|
||||||
- `Asset` - Asset path registry and verification
|
- `Resource::List` - Asset path registry from assets.yaml (O(1) lookups)
|
||||||
- `Director` - Main application controller
|
- `Director` - Main application controller
|
||||||
- `Cheevos` - Achievement state management
|
- `Cheevos` - Achievement state management
|
||||||
- `Debug` - Debug information overlay
|
- `Debug` - Debug information overlay
|
||||||
@@ -238,7 +375,7 @@ The game uses a scene manager to control application flow:
|
|||||||
// namespace SceneManager
|
// namespace SceneManager
|
||||||
enum class Scene {
|
enum class Scene {
|
||||||
LOGO, LOADING_SCREEN, TITLE, CREDITS, GAME, DEMO,
|
LOGO, LOADING_SCREEN, TITLE, CREDITS, GAME, DEMO,
|
||||||
GAME_OVER, ENDING, ENDING2, QUIT
|
GAME_OVER, ENDING, ENDING2, RESTART_CURRENT, QUIT
|
||||||
};
|
};
|
||||||
|
|
||||||
inline Scene current = Scene::LOGO; // Global scene state
|
inline Scene current = Scene::LOGO; // Global scene state
|
||||||
@@ -275,9 +412,10 @@ Display
|
|||||||
|
|
||||||
**Key Components:**
|
**Key Components:**
|
||||||
- `Surface` - 8-bit indexed pixel buffer with palette support
|
- `Surface` - 8-bit indexed pixel buffer with palette support
|
||||||
- `SurfaceSprite` - Renders a fixed region of a surface
|
- `Sprite` - Renders a fixed region of a surface
|
||||||
- `SurfaceAnimatedSprite` - Frame-based animation on top of sprite
|
- `AnimatedSprite` - Frame-based animation on top of sprite
|
||||||
- `SurfaceMovingSprite` - Adds velocity/position to animated sprite
|
- `MovingSprite` - Adds velocity/position to animated sprite
|
||||||
|
- `DissolveSprite` - Dissolve transition effect sprite
|
||||||
- Supports color replacement, palette swapping, and shader effects (CRT)
|
- Supports color replacement, palette swapping, and shader effects (CRT)
|
||||||
|
|
||||||
### 3.5 Tile-Based Collision System
|
### 3.5 Tile-Based Collision System
|
||||||
@@ -317,8 +455,8 @@ struct AnimationData {
|
|||||||
int counter;
|
int counter;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Loaded from .ani files (list of animation names)
|
// Loaded from .yaml animation definition files
|
||||||
// Rendered with SurfaceAnimatedSprite
|
// Rendered with AnimatedSprite
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -331,12 +469,14 @@ struct AnimationData {
|
|||||||
main()
|
main()
|
||||||
↓
|
↓
|
||||||
Director::Director() [Initialization]
|
Director::Director() [Initialization]
|
||||||
├─ Options::init() - Load game configuration
|
├─ Resource::List::init() - Initialize asset registry singleton
|
||||||
├─ Asset::init() - Register asset paths
|
├─ Director::setFileList() - Load assets.yaml via Resource::List (no verification)
|
||||||
├─ Screen::init() - Create window, SDL renderer
|
├─ Options::loadFromFile() - Load game configuration
|
||||||
├─ Audio::init() - Initialize SDL audio
|
├─ Audio::init() - Initialize SDL audio
|
||||||
|
├─ Screen::init() - Create window, SDL renderer
|
||||||
├─ Input::init() - Bind keyboard/gamepad controls
|
├─ Input::init() - Bind keyboard/gamepad controls
|
||||||
├─ Resource::init() - Load all game resources
|
├─ Resource::Cache::init() - Load ALL game resources (with verification)
|
||||||
|
│ └─ Throws exception if any required asset is missing
|
||||||
└─ Cheevos::init() - Load achievement state
|
└─ Cheevos::init() - Load achievement state
|
||||||
|
|
||||||
Director::run() [Main loop]
|
Director::run() [Main loop]
|
||||||
@@ -351,11 +491,11 @@ Director::run() [Main loop]
|
|||||||
|
|
||||||
Director::~Director() [Cleanup]
|
Director::~Director() [Cleanup]
|
||||||
├─ Options::saveToFile() - Save game settings
|
├─ Options::saveToFile() - Save game settings
|
||||||
├─ Resource::destroy()
|
├─ Resource::Cache::destroy()
|
||||||
├─ Audio::destroy()
|
├─ Audio::destroy()
|
||||||
├─ Input::destroy()
|
├─ Input::destroy()
|
||||||
├─ Screen::destroy()
|
├─ Screen::destroy()
|
||||||
└─ Asset::destroy()
|
└─ Resource::List::destroy()
|
||||||
```
|
```
|
||||||
|
|
||||||
### 4.2 Game Scene Flow (Core Gameplay Loop)
|
### 4.2 Game Scene Flow (Core Gameplay Loop)
|
||||||
@@ -386,20 +526,27 @@ Game::run() {
|
|||||||
|
|
||||||
```
|
```
|
||||||
Director::setFileList()
|
Director::setFileList()
|
||||||
├─ Asset::add(file, type) - Register all assets
|
└─ Resource::List::loadFromFile(config_path, PREFIX, system_folder_)
|
||||||
└─ Asset::check() - Verify files exist
|
├─ Read config/assets.yaml - Parse text configuration file
|
||||||
|
├─ Parse YAML structure: assets grouped by category
|
||||||
|
├─ Replace variables (${PREFIX}, ${SYSTEM_FOLDER})
|
||||||
|
└─ Store in unordered_map (O(1) lookup) - Fast asset path retrieval
|
||||||
|
|
||||||
Game Scene initialization
|
Game Scene initialization
|
||||||
└─ Resource::init() - Loads all resources
|
└─ Resource::Cache::init() - Loads all resources
|
||||||
├─ loadSounds() - WAV files
|
├─ loadSounds() - WAV files (with error handling)
|
||||||
├─ loadMusics() - OGG files
|
├─ loadMusics() - OGG files (with error handling)
|
||||||
├─ loadSurfaces() - GIF/PNG images
|
├─ loadSurfaces() - GIF/PNG images (with error handling)
|
||||||
├─ loadAnimations() - .ani animation definitions
|
├─ loadPalettes() - PAL palette files (with error handling)
|
||||||
├─ loadTileMaps() - .room tilemap data
|
├─ loadTextFiles() - Font definition files (with error handling)
|
||||||
└─ loadRooms() - Room metadata
|
├─ loadAnimations() - YAML animation definitions (with error handling)
|
||||||
|
└─ loadRooms() - Room YAML files (with error handling)
|
||||||
|
|
||||||
|
Note: Asset verification happens during actual loading.
|
||||||
|
If a required file is missing, Cache::load() throws detailed exception.
|
||||||
|
|
||||||
During gameplay
|
During gameplay
|
||||||
└─ Resource::get*(name) - Return cached resource
|
└─ Resource::Cache::get*(name) - Return cached resource
|
||||||
```
|
```
|
||||||
|
|
||||||
### 4.4 Input Flow
|
### 4.4 Input Flow
|
||||||
@@ -439,7 +586,7 @@ Game code
|
|||||||
|
|
||||||
**Classes:**
|
**Classes:**
|
||||||
- `PascalCase` for classes: `Player`, `Room`, `Screen`, `Director`
|
- `PascalCase` for classes: `Player`, `Room`, `Screen`, `Director`
|
||||||
- Suffix `Sprite` for sprite classes: `SurfaceSprite`, `SurfaceAnimatedSprite`
|
- Suffix `Sprite` for sprite classes: `Sprite`, `AnimatedSprite`, `MovingSprite`
|
||||||
|
|
||||||
**Methods:**
|
**Methods:**
|
||||||
- `get*()` for getters: `getWidth()`, `getRect()`
|
- `get*()` for getters: `getWidth()`, `getRect()`
|
||||||
@@ -450,7 +597,7 @@ Game code
|
|||||||
|
|
||||||
**Variables:**
|
**Variables:**
|
||||||
- `snake_case` for member variables with `_` suffix: `x_`, `y_`, `sprite_`
|
- `snake_case` for member variables with `_` suffix: `x_`, `y_`, `sprite_`
|
||||||
- `UPPER_CASE` for constants: `BLOCK`, `MAX_VY_`, `WIDTH_`
|
- `UPPER_CASE` for constants: `BLOCK`, `MAX_VY`, `WIDTH`
|
||||||
- Private members: `private_member_`
|
- Private members: `private_member_`
|
||||||
|
|
||||||
**Structs for Data:**
|
**Structs for Data:**
|
||||||
@@ -482,8 +629,9 @@ Provides **time scaling** for slow-motion effects.
|
|||||||
### 5.4 Palette System
|
### 5.4 Palette System
|
||||||
|
|
||||||
- 8-bit indexed color (256 colors per palette)
|
- 8-bit indexed color (256 colors per palette)
|
||||||
- Multiple palettes can be loaded and swapped
|
- Multiple palettes can be loaded and swapped via `PaletteManager`
|
||||||
- `Surface::setPalette()` changes rendering colors
|
- `Screen::setPaletteByName()` changes the active palette
|
||||||
|
- Supports palette sort modes (by luminosity, similarity to Spectrum palette, etc.)
|
||||||
- Supports color replacement per-render: `renderWithColorReplace()`
|
- Supports color replacement per-render: `renderWithColorReplace()`
|
||||||
- CRT shader effects can modify colors in real-time
|
- CRT shader effects can modify colors in real-time
|
||||||
|
|
||||||
@@ -501,7 +649,7 @@ namespace Options {
|
|||||||
inline Stats stats{}; // Game statistics
|
inline Stats stats{}; // Game statistics
|
||||||
}
|
}
|
||||||
|
|
||||||
Options::loadFromFile(path); // Load from config.txt
|
Options::loadFromFile(path); // Load from config.yaml
|
||||||
Options::saveToFile(path); // Save on exit
|
Options::saveToFile(path); // Save on exit
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -533,7 +681,7 @@ Achievements trigger notifications on unlock.
|
|||||||
| Component | Technology | Version | Role |
|
| Component | Technology | Version | Role |
|
||||||
|-----------|-----------|---------|------|
|
|-----------|-----------|---------|------|
|
||||||
| **Graphics** | SDL3 | Latest | Window, rendering, input |
|
| **Graphics** | SDL3 | Latest | Window, rendering, input |
|
||||||
| **GPU Rendering** | OpenGL | 3.2+ | Shader effects (CRT) |
|
| **GPU Rendering** | SDL3 GPU | Latest | Shader effects (CRT, post-processing via SPIR-V) |
|
||||||
| **Audio** | SDL3 Audio | Latest | Audio device, mixing |
|
| **Audio** | SDL3 Audio | Latest | Audio device, mixing |
|
||||||
| **Audio Decoding** | jail_audio (custom) | 1.x | OGG/WAV playback |
|
| **Audio Decoding** | jail_audio (custom) | 1.x | OGG/WAV playback |
|
||||||
| **Image Loading** | stb_image | v2.x | PNG/GIF image loading |
|
| **Image Loading** | stb_image | v2.x | PNG/GIF image loading |
|
||||||
@@ -567,8 +715,9 @@ Achievements trigger notifications on unlock.
|
|||||||
| `Screen` | Rendering, window, palette management | Singleton |
|
| `Screen` | Rendering, window, palette management | Singleton |
|
||||||
| `Input` | Keyboard & gamepad input | Singleton |
|
| `Input` | Keyboard & gamepad input | Singleton |
|
||||||
| `Audio` | Music and SFX playback | Singleton |
|
| `Audio` | Music and SFX playback | Singleton |
|
||||||
| `Resource` | Asset caching and loading | Singleton |
|
| `Resource::Cache` | Asset caching and loading (with detailed error messages) | Singleton |
|
||||||
| `Asset` | Asset path registry | Singleton |
|
| `Resource::List` | Asset path registry from config/assets.yaml, O(1) lookups, variable substitution | Singleton |
|
||||||
|
| `PaletteManager` | Palette loading, switching, and sorting | Managed by Screen |
|
||||||
| `Debug` | Debug overlay information | Singleton |
|
| `Debug` | Debug overlay information | Singleton |
|
||||||
| `globalEvents` | Global SDL event handling (quit, device reset, mouse) | Namespace |
|
| `globalEvents` | Global SDL event handling (quit, device reset, mouse) | Namespace |
|
||||||
|
|
||||||
@@ -578,7 +727,12 @@ Achievements trigger notifications on unlock.
|
|||||||
|-------|---------|
|
|-------|---------|
|
||||||
| `Game` | Main gameplay scene, orchestrates update/render |
|
| `Game` | Main gameplay scene, orchestrates update/render |
|
||||||
| `Player` | Player entity with physics and animation |
|
| `Player` | Player entity with physics and animation |
|
||||||
| `Room` | Level data, collision detection, tilemap rendering |
|
| `Room` | Level data, collision detection |
|
||||||
|
| `RoomLoader` | Room loading from YAML files |
|
||||||
|
| `TilemapRenderer` | Tilemap rendering |
|
||||||
|
| `CollisionMap` | Collision map data |
|
||||||
|
| `EnemyManager` | Enemy lifecycle management |
|
||||||
|
| `ItemManager` | Item lifecycle management |
|
||||||
| `Enemy` | Enemy entity behavior and rendering |
|
| `Enemy` | Enemy entity behavior and rendering |
|
||||||
| `Item` | Collectible items |
|
| `Item` | Collectible items |
|
||||||
| `Scoreboard` | HUD display data |
|
| `Scoreboard` | HUD display data |
|
||||||
@@ -591,17 +745,20 @@ Achievements trigger notifications on unlock.
|
|||||||
| Class | Purpose |
|
| Class | Purpose |
|
||||||
|-------|---------|
|
|-------|---------|
|
||||||
| `Surface` | 8-bit indexed color pixel buffer with palette |
|
| `Surface` | 8-bit indexed color pixel buffer with palette |
|
||||||
| `SurfaceSprite` | Renders a sprite region |
|
| `Sprite` | Renders a sprite region |
|
||||||
| `SurfaceAnimatedSprite` | Frame-based animation rendering |
|
| `AnimatedSprite` | Frame-based animation rendering |
|
||||||
| `SurfaceMovingSprite` | Sprite with velocity/position |
|
| `MovingSprite` | Sprite with velocity/position |
|
||||||
|
| `DissolveSprite` | Dissolve transition sprite |
|
||||||
| `Text` | Text rendering system |
|
| `Text` | Text rendering system |
|
||||||
| `OpenGLShader` | Shader compilation and effects |
|
| `Sdl3gpuShader` | SDL3 GPU shader compilation and effects |
|
||||||
|
| `PaletteManager` | Palette loading and management |
|
||||||
|
|
||||||
### Utility Classes
|
### Utility Classes
|
||||||
|
|
||||||
| Class | Purpose |
|
| Class/Header | Purpose |
|
||||||
|-------|---------|
|
|-------|---------|
|
||||||
| `DeltaTimer` | Frame-rate independent timing |
|
| `DeltaTimer` | Frame-rate independent timing |
|
||||||
|
| `easing_functions.hpp` | Easing/interpolation functions for animations |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -631,12 +788,25 @@ Achievements trigger notifications on unlock.
|
|||||||
### Adding Game Assets
|
### Adding Game Assets
|
||||||
|
|
||||||
1. Place file in `data/` directory
|
1. Place file in `data/` directory
|
||||||
2. Register in `Director::setFileList()`:
|
2. Add entry to `config/assets.yaml` under the appropriate category:
|
||||||
```cpp
|
```yaml
|
||||||
Asset::get()->add("/data/path/file.ext", AssetType::TYPE);
|
assets:
|
||||||
|
category_name: # e.g., player, enemies, music, etc.
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/path/file.ext
|
||||||
```
|
```
|
||||||
3. Resource loads automatically during `Resource::init()`
|
Available types: `DATA`, `BITMAP`, `ANIMATION`, `MUSIC`, `SOUND`, `FONT`, `ROOM`, `PALETTE`
|
||||||
4. Access via: `Resource::get()->getSurface("name")`
|
3. Optional flags can be added:
|
||||||
|
```yaml
|
||||||
|
- type: DATA
|
||||||
|
path: ${SYSTEM_FOLDER}/file.txt
|
||||||
|
required: false # Don't fail if missing
|
||||||
|
absolute: true # Path is absolute
|
||||||
|
```
|
||||||
|
4. Resource loads automatically during `Resource::init()`
|
||||||
|
5. Access via: `Resource::Cache::get()->getSurface("name")`
|
||||||
|
|
||||||
|
**Note:** No recompilation needed when adding/removing/modifying assets in `config/assets.yaml`
|
||||||
|
|
||||||
### Modifying Collision Detection
|
### Modifying Collision Detection
|
||||||
|
|
||||||
@@ -692,23 +862,82 @@ In debug builds (`#ifdef DEBUG`), renders:
|
|||||||
|
|
||||||
## 11. File Format Reference
|
## 11. File Format Reference
|
||||||
|
|
||||||
### Animation Files (.ani)
|
### Asset Configuration File (config/assets.yaml)
|
||||||
List of animation names, one per line:
|
YAML-based asset registry with grouped structure:
|
||||||
```
|
```yaml
|
||||||
default
|
# JailDoctor's Dilemma - Asset Configuration
|
||||||
jump
|
# Variables: ${PREFIX}, ${SYSTEM_FOLDER}
|
||||||
run
|
|
||||||
fall
|
assets:
|
||||||
|
# FONTS
|
||||||
|
fonts:
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/font/smb2.gif
|
||||||
|
- type: FONT
|
||||||
|
path: ${PREFIX}/data/font/smb2.fnt
|
||||||
|
|
||||||
|
# PLAYER
|
||||||
|
player:
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/player/player.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/player/player.yaml
|
||||||
|
|
||||||
|
# MUSIC
|
||||||
|
music:
|
||||||
|
- type: MUSIC
|
||||||
|
path: ${PREFIX}/data/music/title.ogg
|
||||||
|
|
||||||
|
# SYSTEM FILES (optional, absolute paths)
|
||||||
|
system:
|
||||||
|
- type: DATA
|
||||||
|
path: ${SYSTEM_FOLDER}/config.yaml
|
||||||
|
required: false
|
||||||
|
absolute: true
|
||||||
```
|
```
|
||||||
|
|
||||||
### Room Data Files (.room)
|
**Asset Structure:**
|
||||||
Key-value pairs defining room properties:
|
- Assets are organized into categories (fonts, palettes, shaders, player, enemies, etc.)
|
||||||
|
- Each asset entry contains:
|
||||||
|
- `type` - Asset type (required)
|
||||||
|
- `path` - File path with variable substitution (required)
|
||||||
|
- `required` - Whether file must exist (optional, default: `true`)
|
||||||
|
- `absolute` - Whether path is absolute (optional, default: `false`)
|
||||||
|
|
||||||
|
**Available Asset Types:**
|
||||||
|
- `DATA` - General data files (text, JSON, etc.)
|
||||||
|
- `BITMAP` - Images (GIF, PNG)
|
||||||
|
- `ANIMATION` - Animation definition files (.yaml)
|
||||||
|
- `MUSIC` - Music files (OGG)
|
||||||
|
- `SOUND` - Sound effects (WAV)
|
||||||
|
- `FONT` - Font definition files
|
||||||
|
- `ROOM` - Room data files (.yaml)
|
||||||
|
- `PALETTE` - Color palette files (.pal)
|
||||||
|
|
||||||
|
**Variables:**
|
||||||
|
- `${PREFIX}` - Replaced with `/../Resources` on macOS bundles, empty otherwise
|
||||||
|
- `${SYSTEM_FOLDER}` - Replaced with user's system config folder
|
||||||
|
|
||||||
|
### Animation Files (.yaml)
|
||||||
|
YAML-based animation definitions with frame data:
|
||||||
|
```yaml
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
frameWidth: 16
|
||||||
|
frameHeight: 16
|
||||||
|
speed: 100
|
||||||
|
loop: 0
|
||||||
|
frames: [...]
|
||||||
```
|
```
|
||||||
number=01
|
|
||||||
name=Starting Room
|
### Room Data Files (.yaml)
|
||||||
bg_color=0x000000
|
YAML-based room definitions:
|
||||||
border_color=0xFF00FF
|
```yaml
|
||||||
...
|
room:
|
||||||
|
name_en: Starting Room
|
||||||
|
bgColor: 0x000000
|
||||||
|
connections: [...]
|
||||||
|
tilemap: [...]
|
||||||
```
|
```
|
||||||
|
|
||||||
### Tilemap Files (.tmx)
|
### Tilemap Files (.tmx)
|
||||||
@@ -723,7 +952,8 @@ Binary 256-color palette format (256 × 4 bytes RGBA).
|
|||||||
|
|
||||||
### For Graphics Issues
|
### For Graphics Issues
|
||||||
- `Screen::render()` - Main rendering method
|
- `Screen::render()` - Main rendering method
|
||||||
- `Screen::setPalete()` - Palette application
|
- `Screen::setPaletteByName()` - Palette switching
|
||||||
|
- `PaletteManager` - Palette loading and sorting
|
||||||
- `Surface` class - Pixel buffer operations
|
- `Surface` class - Pixel buffer operations
|
||||||
|
|
||||||
### For Input Issues
|
### For Input Issues
|
||||||
@@ -741,9 +971,11 @@ Binary 256-color palette format (256 × 4 bytes RGBA).
|
|||||||
- `Player::update()` - Physics and movement
|
- `Player::update()` - Physics and movement
|
||||||
|
|
||||||
### For Asset Management
|
### For Asset Management
|
||||||
- `Asset::add()` - Asset registration
|
- `config/assets.yaml` - Asset configuration file (text-based, no recompilation needed)
|
||||||
- `Resource::load()` - Asset loading
|
- `Resource::List::loadFromFile()` - Loads asset registry from config file
|
||||||
- `Director::setFileList()` - Complete asset registry
|
- `Resource::List::get()` - Retrieves asset path (O(1) lookup with unordered_map)
|
||||||
|
- `Resource::Cache` - Asset loading and caching
|
||||||
|
- `Director::setFileList()` - Calls `Resource::List::loadFromFile()` with PREFIX and system_folder
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -783,6 +1015,6 @@ Binary 256-color palette format (256 × 4 bytes RGBA).
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
**Last Updated:** November 2022 (per README)
|
**Last Updated:** April 2026
|
||||||
**Original Author:** JailDesigner
|
**Original Author:** JailDesigner
|
||||||
**Repository:** Gitea (internal)
|
**Repository:** Gitea (internal)
|
||||||
|
|||||||
257
CMakeLists.txt
@@ -10,13 +10,6 @@ set(CMAKE_CXX_STANDARD_REQUIRED True)
|
|||||||
# Exportar comandos de compilación para herramientas de análisis
|
# Exportar comandos de compilación para herramientas de análisis
|
||||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||||
|
|
||||||
# Establece la política CMP0072 para indicar cómo se debe seleccionar la implementación de OpenGL.
|
|
||||||
# En este caso, se elige la opción "GLVND", que utiliza bibliotecas modernas y modulares (libOpenGL, libGLX),
|
|
||||||
# en lugar de la biblioteca OpenGL clásica (libGL). Esto mejora la compatibilidad con drivers recientes
|
|
||||||
# y evita ambigüedades cuando se encuentran múltiples implementaciones de OpenGL en el sistema.
|
|
||||||
cmake_policy(SET CMP0072 NEW)
|
|
||||||
set(OpenGL_GL_PREFERENCE GLVND)
|
|
||||||
|
|
||||||
# --- GENERACIÓN DE VERSIÓN AUTOMÁTICA ---
|
# --- GENERACIÓN DE VERSIÓN AUTOMÁTICA ---
|
||||||
find_package(Git QUIET)
|
find_package(Git QUIET)
|
||||||
if(GIT_FOUND)
|
if(GIT_FOUND)
|
||||||
@@ -41,25 +34,34 @@ set(APP_SOURCES
|
|||||||
|
|
||||||
# Core - Input
|
# Core - Input
|
||||||
source/core/input/global_inputs.cpp
|
source/core/input/global_inputs.cpp
|
||||||
|
source/core/input/input_types.cpp
|
||||||
source/core/input/input.cpp
|
source/core/input/input.cpp
|
||||||
source/core/input/mouse.cpp
|
source/core/input/mouse.cpp
|
||||||
|
|
||||||
# Core - Rendering
|
# Core - Rendering
|
||||||
source/core/rendering/gif.cpp
|
source/core/rendering/gif.cpp
|
||||||
|
source/core/rendering/palette_manager.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/sprite/animated_sprite.cpp
|
||||||
|
source/core/rendering/sprite/dissolve_sprite.cpp
|
||||||
|
source/core/rendering/sprite/moving_sprite.cpp
|
||||||
|
source/core/rendering/sprite/sprite.cpp
|
||||||
source/core/rendering/surface.cpp
|
source/core/rendering/surface.cpp
|
||||||
source/core/rendering/surface_animated_sprite.cpp
|
|
||||||
source/core/rendering/surface_moving_sprite.cpp
|
|
||||||
source/core/rendering/surface_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/asset.cpp
|
source/core/resources/resource_cache.cpp
|
||||||
source/core/resources/resource.cpp
|
source/core/resources/resource_helper.cpp
|
||||||
|
source/core/resources/resource_list.cpp
|
||||||
|
source/core/resources/resource_loader.cpp
|
||||||
|
source/core/resources/resource_pack.cpp
|
||||||
|
|
||||||
# Core - System
|
# Core - System
|
||||||
source/core/system/debug.cpp
|
|
||||||
source/core/system/director.cpp
|
source/core/system/director.cpp
|
||||||
source/core/system/global_events.cpp
|
source/core/system/global_events.cpp
|
||||||
|
|
||||||
@@ -73,23 +75,37 @@ set(APP_SOURCES
|
|||||||
|
|
||||||
# Game - Gameplay
|
# Game - Gameplay
|
||||||
source/game/gameplay/cheevos.cpp
|
source/game/gameplay/cheevos.cpp
|
||||||
|
source/game/gameplay/collision_map.cpp
|
||||||
|
source/game/gameplay/enemy_manager.cpp
|
||||||
|
source/game/gameplay/item_manager.cpp
|
||||||
source/game/gameplay/item_tracker.cpp
|
source/game/gameplay/item_tracker.cpp
|
||||||
source/game/gameplay/room.cpp
|
source/game/gameplay/room_loader.cpp
|
||||||
source/game/gameplay/room_tracker.cpp
|
source/game/gameplay/room_tracker.cpp
|
||||||
|
source/game/gameplay/room.cpp
|
||||||
source/game/gameplay/scoreboard.cpp
|
source/game/gameplay/scoreboard.cpp
|
||||||
source/game/gameplay/stats.cpp
|
source/game/gameplay/stats.cpp
|
||||||
|
source/game/gameplay/tilemap_renderer.cpp
|
||||||
|
|
||||||
# Game - Scenes
|
# Game - Scenes
|
||||||
source/game/scenes/credits.cpp
|
source/game/scenes/credits.cpp
|
||||||
source/game/scenes/ending.cpp
|
source/game/scenes/ending.cpp
|
||||||
source/game/scenes/ending2.cpp
|
source/game/scenes/ending2.cpp
|
||||||
source/game/scenes/game.cpp
|
|
||||||
source/game/scenes/game_over.cpp
|
source/game/scenes/game_over.cpp
|
||||||
|
source/game/scenes/game.cpp
|
||||||
source/game/scenes/loading_screen.cpp
|
source/game/scenes/loading_screen.cpp
|
||||||
source/game/scenes/logo.cpp
|
source/game/scenes/logo.cpp
|
||||||
source/game/scenes/title.cpp
|
source/game/scenes/title.cpp
|
||||||
|
|
||||||
|
# Game - Editor (debug only, guarded by #ifdef _DEBUG in source)
|
||||||
|
source/game/editor/map_editor.cpp
|
||||||
|
source/game/editor/editor_statusbar.cpp
|
||||||
|
source/game/editor/room_saver.cpp
|
||||||
|
source/game/editor/tile_picker.cpp
|
||||||
|
source/game/editor/mini_map.cpp
|
||||||
|
|
||||||
# Game - UI
|
# Game - UI
|
||||||
|
source/game/ui/console.cpp
|
||||||
|
source/game/ui/console_commands.cpp
|
||||||
source/game/ui/notifier.cpp
|
source/game/ui/notifier.cpp
|
||||||
|
|
||||||
# Utils
|
# Utils
|
||||||
@@ -100,22 +116,95 @@ set(APP_SOURCES
|
|||||||
source/main.cpp
|
source/main.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
# Fuentes de librerías de terceros
|
# Fuentes del sistema de renderizado (SDL3 GPU para todas las plataformas)
|
||||||
set(EXTERNAL_SOURCES
|
set(RENDERING_SOURCES
|
||||||
source/external/jail_audio.cpp
|
source/core/rendering/sdl3gpu/sdl3gpu_shader.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
# Fuentes del sistema de renderizado
|
# Fuentes de debug (solo en modo Debug)
|
||||||
set(RENDERING_SOURCES
|
set(DEBUG_SOURCES
|
||||||
source/core/rendering/opengl/opengl_shader.cpp
|
source/core/system/debug.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
# Configuración de SDL3
|
# Configuración de SDL3
|
||||||
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} ${EXTERNAL_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
|
||||||
|
target_sources(${PROJECT_NAME} PRIVATE $<$<CONFIG:Debug>:${DEBUG_SOURCES}>)
|
||||||
|
|
||||||
# --- 3. DIRECTORIOS DE INCLUSIÓN ---
|
# --- 3. DIRECTORIOS DE INCLUSIÓN ---
|
||||||
target_include_directories(${PROJECT_NAME} PUBLIC
|
target_include_directories(${PROJECT_NAME} PUBLIC
|
||||||
@@ -123,7 +212,7 @@ target_include_directories(${PROJECT_NAME} PUBLIC
|
|||||||
"${CMAKE_BINARY_DIR}"
|
"${CMAKE_BINARY_DIR}"
|
||||||
)
|
)
|
||||||
|
|
||||||
# Enlazar la librería SDL3
|
# Enlazar las librerías SDL3
|
||||||
target_link_libraries(${PROJECT_NAME} PRIVATE SDL3::SDL3)
|
target_link_libraries(${PROJECT_NAME} PRIVATE SDL3::SDL3)
|
||||||
|
|
||||||
|
|
||||||
@@ -132,31 +221,123 @@ target_link_libraries(${PROJECT_NAME} PRIVATE SDL3::SDL3)
|
|||||||
target_compile_options(${PROJECT_NAME} PRIVATE -Wall)
|
target_compile_options(${PROJECT_NAME} PRIVATE -Wall)
|
||||||
target_compile_options(${PROJECT_NAME} PRIVATE $<$<CONFIG:RELEASE>:-Os -ffunction-sections -fdata-sections>)
|
target_compile_options(${PROJECT_NAME} PRIVATE $<$<CONFIG:RELEASE>:-Os -ffunction-sections -fdata-sections>)
|
||||||
|
|
||||||
# Definir _DEBUG en modo Debug
|
# Definir _DEBUG en modo Debug y RELEASE_BUILD en modo Release
|
||||||
target_compile_definitions(${PROJECT_NAME} PRIVATE $<$<CONFIG:DEBUG>:_DEBUG>)
|
target_compile_definitions(${PROJECT_NAME} PRIVATE $<$<CONFIG:DEBUG>:_DEBUG>)
|
||||||
|
target_compile_definitions(${PROJECT_NAME} PRIVATE $<$<CONFIG:RELEASE>:RELEASE_BUILD>)
|
||||||
|
|
||||||
# Configuración específica para cada plataforma
|
# Configuración específica para cada plataforma
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
target_compile_definitions(${PROJECT_NAME} PRIVATE WINDOWS_BUILD)
|
target_compile_definitions(${PROJECT_NAME} PRIVATE WINDOWS_BUILD)
|
||||||
target_link_libraries(${PROJECT_NAME} PRIVATE ws2_32 mingw32 opengl32)
|
target_link_libraries(${PROJECT_NAME} PRIVATE ws2_32 mingw32)
|
||||||
elseif(APPLE)
|
elseif(APPLE)
|
||||||
target_compile_definitions(${PROJECT_NAME} PRIVATE MACOS_BUILD)
|
target_compile_definitions(${PROJECT_NAME} PRIVATE MACOS_BUILD)
|
||||||
target_compile_options(${PROJECT_NAME} PRIVATE -Wno-deprecated)
|
target_compile_options(${PROJECT_NAME} PRIVATE -Wno-deprecated)
|
||||||
set(CMAKE_OSX_ARCHITECTURES "arm64")
|
if(NOT CMAKE_OSX_ARCHITECTURES)
|
||||||
|
set(CMAKE_OSX_ARCHITECTURES "arm64")
|
||||||
|
endif()
|
||||||
|
if(MACOS_BUNDLE)
|
||||||
|
target_compile_definitions(${PROJECT_NAME} PRIVATE MACOS_BUNDLE)
|
||||||
|
target_link_options(${PROJECT_NAME} PRIVATE
|
||||||
|
-framework SDL3
|
||||||
|
-F ${CMAKE_SOURCE_DIR}/release/macos/frameworks/SDL3.xcframework/macos-arm64_x86_64
|
||||||
|
-rpath @executable_path/../Frameworks/
|
||||||
|
)
|
||||||
|
endif()
|
||||||
elseif(UNIX AND NOT APPLE)
|
elseif(UNIX AND NOT APPLE)
|
||||||
target_compile_definitions(${PROJECT_NAME} PRIVATE LINUX_BUILD)
|
target_compile_definitions(${PROJECT_NAME} PRIVATE LINUX_BUILD)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Configuración común para OpenGL
|
|
||||||
if(NOT WIN32)
|
|
||||||
find_package(OpenGL REQUIRED)
|
|
||||||
if(OPENGL_FOUND)
|
|
||||||
message(STATUS "OpenGL encontrado: ${OPENGL_LIBRARIES}")
|
|
||||||
target_link_libraries(${PROJECT_NAME} PRIVATE ${OPENGL_LIBRARIES})
|
|
||||||
else()
|
|
||||||
message(FATAL_ERROR "OpenGL no encontrado")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Especificar la ubicación del ejecutable
|
# Especificar la ubicación del ejecutable
|
||||||
set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR})
|
set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR})
|
||||||
|
|
||||||
|
# --- 5. STATIC ANALYSIS TARGETS ---
|
||||||
|
|
||||||
|
# Buscar herramientas de análisis estático
|
||||||
|
find_program(CLANG_TIDY_EXE NAMES clang-tidy)
|
||||||
|
find_program(CLANG_FORMAT_EXE NAMES clang-format)
|
||||||
|
|
||||||
|
# Recopilar todos los archivos fuente para formateo
|
||||||
|
file(GLOB_RECURSE ALL_SOURCE_FILES
|
||||||
|
"${CMAKE_SOURCE_DIR}/source/*.cpp"
|
||||||
|
"${CMAKE_SOURCE_DIR}/source/*.hpp"
|
||||||
|
"${CMAKE_SOURCE_DIR}/source/*.h"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Excluir directorio external del análisis
|
||||||
|
list(FILTER ALL_SOURCE_FILES EXCLUDE REGEX ".*/external/.*")
|
||||||
|
|
||||||
|
# Para clang-tidy, también excluir jail_audio.hpp
|
||||||
|
set(CLANG_TIDY_SOURCES ${ALL_SOURCE_FILES})
|
||||||
|
list(FILTER CLANG_TIDY_SOURCES EXCLUDE REGEX ".*jail_audio\\.hpp$")
|
||||||
|
list(FILTER CLANG_TIDY_SOURCES EXCLUDE REGEX ".*_spv\\.h$")
|
||||||
|
|
||||||
|
# Targets de clang-tidy
|
||||||
|
if(CLANG_TIDY_EXE)
|
||||||
|
add_custom_target(tidy
|
||||||
|
COMMAND ${CLANG_TIDY_EXE}
|
||||||
|
-p ${CMAKE_BINARY_DIR}
|
||||||
|
${CLANG_TIDY_SOURCES}
|
||||||
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||||
|
COMMENT "Running clang-tidy..."
|
||||||
|
)
|
||||||
|
|
||||||
|
add_custom_target(tidy-fix
|
||||||
|
COMMAND ${CLANG_TIDY_EXE}
|
||||||
|
-p ${CMAKE_BINARY_DIR}
|
||||||
|
--fix
|
||||||
|
${CLANG_TIDY_SOURCES}
|
||||||
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||||
|
COMMENT "Running clang-tidy with fixes..."
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
message(STATUS "clang-tidy no encontrado - targets 'tidy' y 'tidy-fix' no disponibles")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Targets de clang-format
|
||||||
|
if(CLANG_FORMAT_EXE)
|
||||||
|
add_custom_target(format
|
||||||
|
COMMAND ${CLANG_FORMAT_EXE}
|
||||||
|
-i
|
||||||
|
${ALL_SOURCE_FILES}
|
||||||
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||||
|
COMMENT "Running clang-format..."
|
||||||
|
)
|
||||||
|
|
||||||
|
add_custom_target(format-check
|
||||||
|
COMMAND ${CLANG_FORMAT_EXE}
|
||||||
|
--dry-run
|
||||||
|
--Werror
|
||||||
|
${ALL_SOURCE_FILES}
|
||||||
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||||
|
COMMENT "Checking clang-format..."
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
message(STATUS "clang-format no encontrado - targets 'format' y 'format-check' no disponibles")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# --- 6. PACK RESOURCES TARGETS ---
|
||||||
|
set(PACK_TOOL_SOURCES
|
||||||
|
${CMAKE_SOURCE_DIR}/tools/pack_resources/pack_resources.cpp
|
||||||
|
${CMAKE_SOURCE_DIR}/source/core/resources/resource_pack.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
add_executable(pack_tool ${PACK_TOOL_SOURCES})
|
||||||
|
target_include_directories(pack_tool PRIVATE ${CMAKE_SOURCE_DIR}/source)
|
||||||
|
set_target_properties(pack_tool PROPERTIES
|
||||||
|
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/tools/pack_resources
|
||||||
|
)
|
||||||
|
|
||||||
|
file(GLOB_RECURSE DATA_FILES "${CMAKE_SOURCE_DIR}/data/*")
|
||||||
|
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT "${CMAKE_SOURCE_DIR}/resources.pack"
|
||||||
|
COMMAND $<TARGET_FILE:pack_tool>
|
||||||
|
"${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/..."
|
||||||
|
)
|
||||||
|
|
||||||
|
add_custom_target(pack DEPENDS "${CMAKE_SOURCE_DIR}/resources.pack")
|
||||||
|
add_dependencies(${PROJECT_NAME} pack)
|
||||||
|
|||||||
22
LICENSE
@@ -1 +1,21 @@
|
|||||||
GNU General Public License v3.0 only
|
Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License
|
||||||
|
|
||||||
|
Copyright (c) 2022 JailDoctor's Dilemma - JailDesigner
|
||||||
|
|
||||||
|
This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
|
||||||
|
|
||||||
|
You are free to:
|
||||||
|
- Share — copy and redistribute the material in any medium or format
|
||||||
|
- Adapt — remix, transform, and build upon the material
|
||||||
|
|
||||||
|
Under the following terms:
|
||||||
|
- Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
|
||||||
|
- NonCommercial — You may not use the material for commercial purposes.
|
||||||
|
- ShareAlike — If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.
|
||||||
|
|
||||||
|
No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits.
|
||||||
|
|
||||||
|
To view a copy of this license, visit:
|
||||||
|
https://creativecommons.org/licenses/by-nc-sa/4.0/
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
394
Makefile
@@ -1,145 +1,317 @@
|
|||||||
executable = jaildoctors_dilemma
|
# ==============================================================================
|
||||||
source = source/*.cpp
|
# DIRECTORIES
|
||||||
appName = JailDoctor's Dilemma
|
# ==============================================================================
|
||||||
releaseFolder = jdd_release
|
DIR_ROOT := $(dir $(abspath $(MAKEFILE_LIST)))
|
||||||
version = v1.10
|
DIR_SOURCES := $(addsuffix /, $(DIR_ROOT)source)
|
||||||
|
DIR_BIN := $(addsuffix /, $(DIR_ROOT))
|
||||||
|
DIR_TOOLS := $(addsuffix /, $(DIR_ROOT)tools)
|
||||||
|
|
||||||
# Release names
|
# ==============================================================================
|
||||||
windowsRelease = $(executable)-$(version)-win32-x64.zip
|
# TARGET NAMES
|
||||||
macosIntelRelease = $(executable)-$(version)-macos-intel.dmg
|
# ==============================================================================
|
||||||
macosAppleSiliconRelease = $(executable)-$(version)-macos-apple-silicon.dmg
|
TARGET_NAME := jaildoctors_dilemma
|
||||||
linuxRelease = $(executable)-$(version)-linux.tar.gz
|
TARGET_FILE := $(DIR_BIN)$(TARGET_NAME)
|
||||||
|
APP_NAME := JailDoctor's Dilemma
|
||||||
|
DIST_DIR := dist
|
||||||
|
RELEASE_FOLDER := dist/_tmp
|
||||||
|
RELEASE_FILE := $(RELEASE_FOLDER)/$(TARGET_NAME)
|
||||||
|
RESOURCE_FILE := release/windows/jdd.res
|
||||||
|
|
||||||
# Specify the C++ standard
|
# ==============================================================================
|
||||||
cpp_standard = c++20
|
# TOOLS
|
||||||
|
# ==============================================================================
|
||||||
|
DIR_PACK_TOOL := $(DIR_TOOLS)pack_resources
|
||||||
|
SHADER_SCRIPT := $(DIR_ROOT)tools/shaders/compile_spirv.sh
|
||||||
|
SHADER_CMAKE := $(DIR_ROOT)tools/shaders/compile_spirv.cmake
|
||||||
|
SHADERS_DIR := $(DIR_ROOT)data/shaders
|
||||||
|
HEADERS_DIR := $(DIR_ROOT)source/core/rendering/sdl3gpu
|
||||||
|
ifeq ($(OS),Windows_NT)
|
||||||
|
GLSLC := $(shell where glslc 2>NUL)
|
||||||
|
else
|
||||||
|
GLSLC := $(shell command -v glslc 2>/dev/null)
|
||||||
|
endif
|
||||||
|
|
||||||
windows:
|
# ==============================================================================
|
||||||
@echo off
|
# VERSION (extracted from defines.hpp)
|
||||||
g++ $(source) -std=$(cpp_standard) -Wall -Os -lmingw32 -lws2_32 -lSDL2main -lSDL2 -lopengl32 -ffunction-sections -fdata-sections -Wl,--gc-sections -static-libstdc++ -Wl,-subsystem,windows -o "$(executable).exe"
|
# ==============================================================================
|
||||||
strip -s -R .comment -R .gnu.version "$(executable).exe" --strip-unneeded
|
ifeq ($(OS),Windows_NT)
|
||||||
|
VERSION := v$(shell powershell -Command "(Select-String -Path 'source/utils/defines.hpp' -Pattern 'constexpr const char\* VERSION = \"(.+?)\"').Matches.Groups[1].Value")
|
||||||
|
else
|
||||||
|
VERSION := v$(shell grep 'constexpr const char\* VERSION' source/utils/defines.hpp | sed -E 's/.*VERSION = "([^"]+)".*/\1/')
|
||||||
|
endif
|
||||||
|
|
||||||
windows_debug:
|
# ==============================================================================
|
||||||
@echo off
|
# SHELL (Windows usa cmd.exe para que las recetas con powershell funcionen igual
|
||||||
g++ $(source) -D DEBUG -std=$(cpp_standard) -Wall -Os -lmingw32 -lws2_32 -lSDL2main -lSDL2 -lopengl32 -ffunction-sections -fdata-sections -Wl,--gc-sections -static-libstdc++ -Wl,-subsystem,windows -o "$(executable)_debug.exe"
|
# desde cualquier terminal: PowerShell, cmd o git-bash)
|
||||||
strip -s -R .comment -R .gnu.version "$(executable)_debug.exe" --strip-unneeded
|
# ==============================================================================
|
||||||
|
ifeq ($(OS),Windows_NT)
|
||||||
|
SHELL := cmd.exe
|
||||||
|
endif
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# WINDOWS-SPECIFIC VARIABLES
|
||||||
|
# ==============================================================================
|
||||||
|
ifeq ($(OS),Windows_NT)
|
||||||
|
WIN_TARGET_FILE := $(DIR_BIN)$(APP_NAME)
|
||||||
|
WIN_RELEASE_FILE := $(RELEASE_FOLDER)/$(APP_NAME)
|
||||||
|
else
|
||||||
|
WIN_TARGET_FILE := $(TARGET_FILE)
|
||||||
|
WIN_RELEASE_FILE := $(RELEASE_FILE)
|
||||||
|
endif
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# RELEASE NAMES
|
||||||
|
# ==============================================================================
|
||||||
|
WINDOWS_RELEASE := $(DIST_DIR)/$(TARGET_NAME)-$(VERSION)-win32-x64.zip
|
||||||
|
MACOS_INTEL_RELEASE := $(DIST_DIR)/$(TARGET_NAME)-$(VERSION)-macos-intel.dmg
|
||||||
|
MACOS_APPLE_SILICON_RELEASE := $(DIST_DIR)/$(TARGET_NAME)-$(VERSION)-macos-apple-silicon.dmg
|
||||||
|
LINUX_RELEASE := $(DIST_DIR)/$(TARGET_NAME)-$(VERSION)-linux.tar.gz
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# PLATAFORMA
|
||||||
|
# ==============================================================================
|
||||||
|
ifeq ($(OS),Windows_NT)
|
||||||
|
FixPath = $(subst /,\\,$1)
|
||||||
|
RM := del /Q
|
||||||
|
MKDIR := mkdir
|
||||||
|
else
|
||||||
|
FixPath = $1
|
||||||
|
RMFILE := rm -f
|
||||||
|
RMDIR := rm -rdf
|
||||||
|
MKDIR := mkdir -p
|
||||||
|
UNAME_S := $(shell uname -s)
|
||||||
|
endif
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# COMPILACIÓN CON CMAKE
|
||||||
|
# ==============================================================================
|
||||||
|
all:
|
||||||
|
@cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
|
||||||
|
@cmake --build build
|
||||||
|
|
||||||
|
debug:
|
||||||
|
@cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug
|
||||||
|
@cmake --build build
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# RELEASE AUTOMÁTICO (detecta SO)
|
||||||
|
# ==============================================================================
|
||||||
|
release:
|
||||||
|
ifeq ($(OS),Windows_NT)
|
||||||
|
@"$(MAKE)" windows_release
|
||||||
|
else
|
||||||
|
ifeq ($(UNAME_S),Darwin)
|
||||||
|
@$(MAKE) macos_release
|
||||||
|
else
|
||||||
|
@$(MAKE) linux_release
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# REGLAS PARA COMPILACIÓN DE SHADERS (multiplataforma via cmake)
|
||||||
|
# ==============================================================================
|
||||||
|
compile_shaders:
|
||||||
|
ifdef GLSLC
|
||||||
|
@cmake -D GLSLC=$(GLSLC) -D SHADERS_DIR=$(SHADERS_DIR) -D HEADERS_DIR=$(HEADERS_DIR) -P $(SHADER_CMAKE)
|
||||||
|
else
|
||||||
|
@echo "glslc no encontrado - asegurate de que los headers SPIR-V precompilados existen"
|
||||||
|
endif
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# REGLAS PARA HERRAMIENTA DE EMPAQUETADO Y RESOURCES.PACK
|
||||||
|
# ==============================================================================
|
||||||
|
pack_tool:
|
||||||
|
@$(MAKE) -C $(DIR_PACK_TOOL)
|
||||||
|
|
||||||
|
resources.pack: pack_tool
|
||||||
|
@$(MAKE) -C $(DIR_PACK_TOOL) pack
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# COMPILACIÓN PARA WINDOWS (RELEASE)
|
||||||
|
# ==============================================================================
|
||||||
windows_release:
|
windows_release:
|
||||||
@echo off
|
@echo off
|
||||||
|
@echo Creando release para Windows - Version: $(VERSION)
|
||||||
|
|
||||||
# Create release folder
|
# Compila con cmake (genera shaders, resources.pack y ejecutable)
|
||||||
powershell if (Test-Path "$(releaseFolder)") {Remove-Item "$(releaseFolder)" -Recurse -Force}
|
@cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
|
||||||
powershell if (-not (Test-Path "$(releaseFolder)")) {New-Item "$(releaseFolder)" -ItemType Directory}
|
@cmake --build build
|
||||||
|
|
||||||
# Prepare data folder
|
# Crea carpeta de distribución y carpeta temporal 'RELEASE_FOLDER'
|
||||||
powershell Copy-Item -Path "data" -Destination "$(releaseFolder)" -recurse -Force
|
@powershell -Command "if (-not (Test-Path '$(DIST_DIR)')) {New-Item '$(DIST_DIR)' -ItemType Directory}"
|
||||||
powershell if (Test-Path "$(releaseFolder)\data\room\map.world") {Remove-Item "$(releaseFolder)\data\room\map.world" -Recurse -Force}
|
@powershell -Command "if (Test-Path '$(RELEASE_FOLDER)') {Remove-Item '$(RELEASE_FOLDER)' -Recurse -Force}"
|
||||||
powershell if (Test-Path "$(releaseFolder)\data\room\standard.tsx") {Remove-Item "$(releaseFolder)\data\room\standard.tsx" -Recurse -Force}
|
@powershell -Command "if (-not (Test-Path '$(RELEASE_FOLDER)')) {New-Item '$(RELEASE_FOLDER)' -ItemType Directory}"
|
||||||
|
|
||||||
# Copy root files
|
# Copia ficheros
|
||||||
powershell Copy-Item "LICENSE" -Destination "$(releaseFolder)"
|
@powershell -Command "Copy-Item -Path 'resources.pack' -Destination '$(RELEASE_FOLDER)'"
|
||||||
powershell Copy-Item "README.md" -Destination "$(releaseFolder)"
|
@powershell -Command "Copy-Item 'LICENSE' -Destination '$(RELEASE_FOLDER)'"
|
||||||
powershell Copy-Item "release\*.dll" -Destination "$(releaseFolder)"
|
@powershell -Command "Copy-Item 'README.md' -Destination '$(RELEASE_FOLDER)'"
|
||||||
|
@powershell -Command "Copy-Item 'gamecontrollerdb.txt' -Destination '$(RELEASE_FOLDER)'"
|
||||||
|
@powershell -Command "Copy-Item 'release\windows\dll\*.dll' -Destination '$(RELEASE_FOLDER)'"
|
||||||
|
@powershell -Command "Copy-Item -Path '$(TARGET_FILE)' -Destination '\"$(WIN_RELEASE_FILE).exe\"'"
|
||||||
|
strip -s -R .comment -R .gnu.version "$(WIN_RELEASE_FILE).exe" --strip-unneeded
|
||||||
|
|
||||||
# Build
|
# Crea el fichero .zip
|
||||||
g++ $(source) -std=$(cpp_standard) -Wall -Os -lmingw32 -lws2_32 -lSDL2main -lSDL2 -lopengl32 -ffunction-sections -fdata-sections -Wl,--gc-sections -static-libstdc++ -Wl,-subsystem,windows -o "$(releaseFolder)/$(executable).exe"
|
@powershell -Command "if (Test-Path '$(WINDOWS_RELEASE)') {Remove-Item '$(WINDOWS_RELEASE)'}"
|
||||||
strip -s -R .comment -R .gnu.version "$(releaseFolder)/$(executable).exe" --strip-unneeded
|
@powershell -Command "Compress-Archive -Path '$(RELEASE_FOLDER)/*' -DestinationPath '$(WINDOWS_RELEASE)'"
|
||||||
|
@echo Release creado: $(WINDOWS_RELEASE)
|
||||||
|
|
||||||
# Create ZIP
|
# Elimina la carpeta temporal 'RELEASE_FOLDER'
|
||||||
powershell if (Test-Path $(windowsRelease)) {Remove-Item $(windowsRelease)}
|
@powershell -Command "if (Test-Path '$(RELEASE_FOLDER)') {Remove-Item '$(RELEASE_FOLDER)' -Recurse -Force}"
|
||||||
powershell Compress-Archive -Path "$(releaseFolder)"/* -DestinationPath $(windowsRelease)
|
|
||||||
|
|
||||||
# Remove folder
|
|
||||||
powershell if (Test-Path "$(releaseFolder)") {Remove-Item "$(releaseFolder)" -Recurse -Force}
|
|
||||||
|
|
||||||
macos:
|
|
||||||
clang++ $(source) -std=$(cpp_standard) -Wall -Os -lSDL2 -framework OpenGL -Wno-deprecated -ffunction-sections -fdata-sections -o "$(executable)"
|
|
||||||
|
|
||||||
macos_debug:
|
|
||||||
clang++ $(source) -D DEBUG -std=$(cpp_standard) -Wall -Os -lSDL2 -framework OpenGL -Wno-deprecated -ffunction-sections -fdata-sections -o "$(executable)_debug"
|
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# COMPILACIÓN PARA MACOS (RELEASE)
|
||||||
|
# ==============================================================================
|
||||||
macos_release:
|
macos_release:
|
||||||
# Remove data and possible data from previous builds
|
@echo "Creando release para macOS - Version: $(VERSION)"
|
||||||
rm -rdf "$(releaseFolder)"
|
|
||||||
rm -rdf Frameworks
|
|
||||||
rm -f tmp.dmg
|
|
||||||
rm -f "$(macosIntelRelease)"
|
|
||||||
rm -f "$(macosAppleSiliconRelease)"
|
|
||||||
|
|
||||||
# Create folders
|
# Verificar e instalar create-dmg si es necesario
|
||||||
mkdir -p "$(releaseFolder)/$(appName).app/Contents/Frameworks"
|
@which create-dmg > /dev/null || (echo "Instalando create-dmg..." && brew install create-dmg)
|
||||||
mkdir -p "$(releaseFolder)/$(appName).app/Contents/MacOS"
|
|
||||||
mkdir -p "$(releaseFolder)/$(appName).app/Contents/Resources"
|
|
||||||
mkdir -p Frameworks
|
|
||||||
|
|
||||||
# Copy folders
|
# Compila la versión para procesadores Intel con cmake (genera shaders y resources.pack)
|
||||||
cp -R data "$(releaseFolder)/$(appName).app/Contents/Resources"
|
@cmake -S . -B build/intel -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_OSX_DEPLOYMENT_TARGET=10.15 -DMACOS_BUNDLE=ON
|
||||||
cp -R release/SDL2.framework "$(releaseFolder)/$(appName).app/Contents/Frameworks"
|
@cmake --build build/intel
|
||||||
cp -R release/SDL2.framework Frameworks
|
|
||||||
|
|
||||||
# Delete data
|
# Elimina datos de compilaciones anteriores
|
||||||
rm -f "$(releaseFolder)/$(appName).app/Contents/Resources/data/room/map.world"
|
$(RMDIR) "$(RELEASE_FOLDER)"
|
||||||
rm -f "$(releaseFolder)/$(appName).app/Contents/Resources/data/room/standard.tsx"
|
$(RMFILE) tmp.dmg
|
||||||
|
$(RMFILE) "$(DIST_DIR)"/rw.*
|
||||||
|
$(RMFILE) "$(MACOS_INTEL_RELEASE)"
|
||||||
|
$(RMFILE) "$(MACOS_APPLE_SILICON_RELEASE)"
|
||||||
|
|
||||||
# Copy files
|
# Crea la carpeta temporal para hacer el trabajo y las carpetas obligatorias para crear una app de macOS
|
||||||
cp release/*.icns "$(releaseFolder)/$(appName).app/Contents/Resources"
|
$(MKDIR) "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Frameworks"
|
||||||
cp release/Info.plist "$(releaseFolder)/$(appName).app/Contents"
|
$(MKDIR) "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/MacOS"
|
||||||
cp LICENSE "$(releaseFolder)"
|
$(MKDIR) "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Resources"
|
||||||
cp README.md "$(releaseFolder)"
|
|
||||||
|
|
||||||
# Create links
|
# Copia carpetas y ficheros
|
||||||
ln -s /Applications "$(releaseFolder)"/Applications
|
cp resources.pack "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Resources"
|
||||||
|
cp gamecontrollerdb.txt "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Resources"
|
||||||
|
cp -R release/macos/frameworks/SDL3.xcframework/macos-arm64_x86_64/SDL3.framework "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Frameworks"
|
||||||
|
cp release/icons/*.icns "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Resources"
|
||||||
|
cp release/macos/Info.plist "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents"
|
||||||
|
cp LICENSE "$(RELEASE_FOLDER)"
|
||||||
|
cp README.md "$(RELEASE_FOLDER)"
|
||||||
|
|
||||||
# Build INTEL
|
# Actualiza versión en Info.plist
|
||||||
clang++ $(source) -D MACOS_BUNDLE -std=$(cpp_standard) -Wall -Os -framework SDL2 -F ./Frameworks -framework OpenGL -Wno-deprecated -ffunction-sections -fdata-sections -o "$(releaseFolder)/$(appName).app/Contents/MacOS/$(executable)" -rpath @executable_path/../Frameworks/ -target x86_64-apple-macos10.15
|
@echo "Actualizando Info.plist con versión $(VERSION)..."
|
||||||
|
@RAW_VERSION=$$(echo "$(VERSION)" | sed 's/^v//'); \
|
||||||
|
sed -i '' '/<key>CFBundleShortVersionString<\/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"
|
||||||
|
|
||||||
# Build INTEL DMG
|
# Copia el ejecutable Intel al bundle
|
||||||
hdiutil create tmp.dmg -ov -volname "$(appName)" -fs HFS+ -srcfolder "$(releaseFolder)"
|
cp "$(TARGET_FILE)" "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/MacOS/$(TARGET_NAME)"
|
||||||
hdiutil convert tmp.dmg -format UDZO -o "$(macosIntelRelease)"
|
|
||||||
rm -f tmp.dmg
|
|
||||||
|
|
||||||
# Build APPLE SILICON
|
# Firma la aplicación
|
||||||
clang++ $(source) -D MACOS_BUNDLE -std=$(cpp_standard) -Wall -Os -framework SDL2 -F ./Frameworks -framework OpenGL -Wno-deprecated -ffunction-sections -fdata-sections -o "$(releaseFolder)/$(appName).app/Contents/MacOS/$(executable)" -rpath @executable_path/../Frameworks/ -target arm64-apple-macos11
|
codesign --deep --force --sign - --timestamp=none "$(RELEASE_FOLDER)/$(APP_NAME).app"
|
||||||
|
|
||||||
# Build APPLE SILICON DMG
|
# Empaqueta el .dmg de la versión Intel con create-dmg
|
||||||
hdiutil create tmp.dmg -ov -volname "$(appName)" -fs HFS+ -srcfolder "$(releaseFolder)"
|
@echo "Creando DMG Intel con iconos de 96x96..."
|
||||||
hdiutil convert tmp.dmg -format UDZO -o "$(macosAppleSiliconRelease)"
|
create-dmg \
|
||||||
rm -f tmp.dmg
|
--volname "$(APP_NAME)" \
|
||||||
|
--window-pos 200 120 \
|
||||||
|
--window-size 720 300 \
|
||||||
|
--icon-size 96 \
|
||||||
|
--text-size 12 \
|
||||||
|
--icon "$(APP_NAME).app" 278 102 \
|
||||||
|
--icon "LICENSE" 441 102 \
|
||||||
|
--icon "README.md" 604 102 \
|
||||||
|
--app-drop-link 115 102 \
|
||||||
|
--hide-extension "$(APP_NAME).app" \
|
||||||
|
"$(MACOS_INTEL_RELEASE)" \
|
||||||
|
"$(RELEASE_FOLDER)" || true
|
||||||
|
@echo "Release Intel creado: $(MACOS_INTEL_RELEASE)"
|
||||||
|
|
||||||
# Remove data
|
# Compila la versión para procesadores Apple Silicon con cmake
|
||||||
rm -rdf Frameworks
|
@cmake -S . -B build/arm -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 -DMACOS_BUNDLE=ON
|
||||||
rm -rdf "$(releaseFolder)"
|
@cmake --build build/arm
|
||||||
|
cp "$(TARGET_FILE)" "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/MacOS/$(TARGET_NAME)"
|
||||||
|
|
||||||
linux:
|
# Firma la aplicación
|
||||||
g++ $(source) -std=$(cpp_standard) -Wall -Os -lSDL2 -lGL -ffunction-sections -fdata-sections -Wl,--gc-sections -o "$(executable)"
|
codesign --deep --force --sign - --timestamp=none "$(RELEASE_FOLDER)/$(APP_NAME).app"
|
||||||
strip -s -R .comment -R .gnu.version "$(executable)" --strip-unneeded
|
|
||||||
|
|
||||||
linux_debug:
|
# Empaqueta el .dmg de la versión Apple Silicon con create-dmg
|
||||||
g++ $(source) -D DEBUG -std=$(cpp_standard) -Wall -Os -lSDL2 -lGL -ffunction-sections -fdata-sections -Wl,--gc-sections -o "$(executable)_debug"
|
@echo "Creando DMG Apple Silicon con iconos de 96x96..."
|
||||||
strip -s -R .comment -R .gnu.version "$(executable)_debug" --strip-unneeded
|
create-dmg \
|
||||||
|
--volname "$(APP_NAME)" \
|
||||||
|
--window-pos 200 120 \
|
||||||
|
--window-size 720 300 \
|
||||||
|
--icon-size 96 \
|
||||||
|
--text-size 12 \
|
||||||
|
--icon "$(APP_NAME).app" 278 102 \
|
||||||
|
--icon "LICENSE" 441 102 \
|
||||||
|
--icon "README.md" 604 102 \
|
||||||
|
--app-drop-link 115 102 \
|
||||||
|
--hide-extension "$(APP_NAME).app" \
|
||||||
|
"$(MACOS_APPLE_SILICON_RELEASE)" \
|
||||||
|
"$(RELEASE_FOLDER)" || true
|
||||||
|
@echo "Release Apple Silicon creado: $(MACOS_APPLE_SILICON_RELEASE)"
|
||||||
|
|
||||||
|
# Elimina las carpetas temporales
|
||||||
|
$(RMDIR) "$(RELEASE_FOLDER)"
|
||||||
|
$(RMDIR) build/intel
|
||||||
|
$(RMDIR) build/arm
|
||||||
|
$(RMFILE) "$(DIST_DIR)"/rw.*
|
||||||
|
|
||||||
|
# ==============================================================================
|
||||||
|
# COMPILACIÓN PARA LINUX (RELEASE)
|
||||||
|
# ==============================================================================
|
||||||
linux_release:
|
linux_release:
|
||||||
# Remove data
|
@echo "Creando release para Linux - Version: $(VERSION)"
|
||||||
rm -rdf "$(releaseFolder)"
|
|
||||||
|
|
||||||
# Create folders
|
# Compila con cmake (genera shaders, resources.pack y ejecutable)
|
||||||
mkdir -p "$(releaseFolder)"
|
@cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
|
||||||
|
@cmake --build build
|
||||||
|
|
||||||
# Copy data
|
# Elimina carpeta temporal previa y la recrea (crea dist/ si no existe)
|
||||||
cp -R data "$(releaseFolder)"
|
$(RMDIR) "$(RELEASE_FOLDER)"
|
||||||
cp LICENSE "$(releaseFolder)"
|
$(MKDIR) "$(RELEASE_FOLDER)"
|
||||||
cp README.md "$(releaseFolder)"
|
|
||||||
|
|
||||||
# Delete data
|
# Copia ficheros
|
||||||
rm -f "$(releaseFolder)/data/room/map.world"
|
cp resources.pack "$(RELEASE_FOLDER)"
|
||||||
rm -f "$(releaseFolder)/data/room/standard.tsx"
|
cp LICENSE "$(RELEASE_FOLDER)"
|
||||||
|
cp README.md "$(RELEASE_FOLDER)"
|
||||||
|
cp gamecontrollerdb.txt "$(RELEASE_FOLDER)"
|
||||||
|
cp "$(TARGET_FILE)" "$(RELEASE_FILE)"
|
||||||
|
strip -s -R .comment -R .gnu.version "$(RELEASE_FILE)" --strip-unneeded
|
||||||
|
|
||||||
# Build
|
# Empaqueta ficheros
|
||||||
g++ $(source) -std=$(cpp_standard) -Wall -Os -lSDL2 -lGL -ffunction-sections -fdata-sections -Wl,--gc-sections -o "$(releaseFolder)/$(executable)"
|
$(RMFILE) "$(LINUX_RELEASE)"
|
||||||
strip -s -R .comment -R .gnu.version "$(releaseFolder)/$(executable)" --strip-unneeded
|
tar -czvf "$(LINUX_RELEASE)" -C "$(RELEASE_FOLDER)" .
|
||||||
|
@echo "Release creado: $(LINUX_RELEASE)"
|
||||||
|
|
||||||
# Pack files
|
# Elimina la carpeta temporal
|
||||||
rm -f "$(linuxRelease)"
|
$(RMDIR) "$(RELEASE_FOLDER)"
|
||||||
cd "$(releaseFolder)" && tar -czvf "../$(linuxRelease)" *
|
|
||||||
|
|
||||||
# Remove data
|
# ==============================================================================
|
||||||
rm -rdf "$(releaseFolder)"
|
# REGLAS ESPECIALES
|
||||||
|
# ==============================================================================
|
||||||
|
# Regla para mostrar la versión actual
|
||||||
|
show_version:
|
||||||
|
@echo "Version actual: $(VERSION)"
|
||||||
|
|
||||||
|
# Regla de ayuda
|
||||||
|
help:
|
||||||
|
@echo "Makefile para JailDoctor's Dilemma"
|
||||||
|
@echo "Comandos disponibles:"
|
||||||
|
@echo ""
|
||||||
|
@echo " Compilacion:"
|
||||||
|
@echo " make - Compilar con cmake (Release)"
|
||||||
|
@echo " make debug - Compilar con cmake (Debug)"
|
||||||
|
@echo ""
|
||||||
|
@echo " Release:"
|
||||||
|
@echo " make release - Crear release (detecta SO automaticamente)"
|
||||||
|
@echo " make windows_release - Crear release para Windows"
|
||||||
|
@echo " make linux_release - Crear release para Linux"
|
||||||
|
@echo " make macos_release - Crear release para macOS"
|
||||||
|
@echo ""
|
||||||
|
@echo " Herramientas:"
|
||||||
|
@echo " make compile_shaders - Compilar shaders SPIR-V"
|
||||||
|
@echo " make pack_tool - Compilar herramienta de empaquetado"
|
||||||
|
@echo " make resources.pack - Generar pack de recursos desde data/"
|
||||||
|
@echo ""
|
||||||
|
@echo " Otros:"
|
||||||
|
@echo " make show_version - Mostrar version actual ($(VERSION))"
|
||||||
|
@echo " make help - Mostrar esta ayuda"
|
||||||
|
|
||||||
|
.PHONY: all debug release windows_release macos_release linux_release compile_shaders pack_tool resources.pack show_version help
|
||||||
|
|||||||
42
README.md
@@ -1,6 +1,8 @@
|
|||||||
# JailDoctor's Dilemma
|
<div align="center">
|
||||||
|
<img src="https://php.sustancia.synology.me/images/jdd/jaildoctors_dilemma_cover_web.png" width="600" alt="JailDoctor's Dilemma Cover">
|
||||||
|
</div>
|
||||||
|
|
||||||
<img src="https://php.sustancia.synology.me/images/jdd/jaildoctors_dilemma_cover_web.png" width="300" align="left" style="margin-right: 20px; margin-bottom: 10px;" alt="JailDoctor's Dilemma Cover">
|
# JailDoctor's Dilemma
|
||||||
|
|
||||||
JailDoc és un Jailer. Als Jailers els agrada començar projectes. A ningú li agrada acabar-los. Els Jailers viuen a la Jail. A la Jail s'hi va a començar projectes. A la Jail s'hi va a ensenyar els projectes. A la Jail s'hi va a aprendre com començar nous projectes. A la Jail s'hi va a ajudar els companys a començar nous projectes.
|
JailDoc és un Jailer. Als Jailers els agrada començar projectes. A ningú li agrada acabar-los. Els Jailers viuen a la Jail. A la Jail s'hi va a començar projectes. A la Jail s'hi va a ensenyar els projectes. A la Jail s'hi va a aprendre com començar nous projectes. A la Jail s'hi va a ajudar els companys a començar nous projectes.
|
||||||
|
|
||||||
@@ -28,21 +30,25 @@ Quan hages recuperat la major part de les peces, dirigeix-te a la Jail per mostr
|
|||||||
|
|
||||||
El joc permet tant l'ús del teclat com d'un comandament. Les tecles per a jugar són les següents:
|
El joc permet tant l'ús del teclat com d'un comandament. Les tecles per a jugar són les següents:
|
||||||
|
|
||||||
- **Cursors**: Per moure's a l'esquerra o dreta i per saltar. Es poden modificar les tecles en el fitxer de configuració, triant entre aquestes opcions:
|
| Tecla | Acció |
|
||||||
- O, P per moure's i Q per saltar.
|
|-------|-------|
|
||||||
- A, D per moure's i W per saltar.
|
| **←, →** | Moure's a l'esquerra o dreta |
|
||||||
|
| **↑** | Saltar |
|
||||||
|
| **Enter** | Eixir dels projectes |
|
||||||
|
| **ESC** | Cancelar / Eixir del joc |
|
||||||
|
| **F1** | Disminuir la mida de la finestra |
|
||||||
|
| **F2** | Augmentar la mida de la finestra |
|
||||||
|
| **F3** | Alternar pantalla completa |
|
||||||
|
| **F4** | Activar/desactivar els shaders |
|
||||||
|
| **F5** | Següent paleta de colors |
|
||||||
|
| **F6** | Paleta de colors anterior |
|
||||||
|
| **F7** | Activar/desactivar l'escalat exacte |
|
||||||
|
| **F8** | Activar/desactivar la música |
|
||||||
|
| **F9** | Activar/desactivar el marge de colors |
|
||||||
|
| **F10** | Activar/desactivar VSync |
|
||||||
|
| **F11** | Pausar el joc |
|
||||||
|
|
||||||
- **Tecla M**: Activa o desactiva la música.
|
**Nota:** Les tecles de moviment (←, →, ↑) es poden redefinir des del menú del joc.
|
||||||
- **Tecla P**: Pausa el joc.
|
|
||||||
- **Tecla ESC**: Ix del joc si estàs jugant. Tanca el programa en qualsevol altra circumstància.
|
|
||||||
- **Tecla F1**: Disminueix la mida de la finestra.
|
|
||||||
- **Tecla F2**: Augmenta la mida de la finestra.
|
|
||||||
- **Tecla F3**: Alterna entre el mode de pantalla completa i el mode finestra.
|
|
||||||
- **Tecla F4**: Activa o desactiva els shaders.
|
|
||||||
- **Tecla F5**: Estableix la següent paleta de colors.
|
|
||||||
- **Tecla F6**: Estableix la paleta de colors prèvia.
|
|
||||||
- **Tecla F7**: Activa o desactiva el escalat exacte.
|
|
||||||
- **Tecla B**: Activa o desactiva el marge de colors.
|
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -54,9 +60,9 @@ El programa guarda automàticament la configuració del mode de vídeo i les est
|
|||||||
|
|
||||||
- **Windows**: `C:\Users\<nom_d'usuari>\AppData\Roaming\jailgames\jaildoctors_dilemma`
|
- **Windows**: `C:\Users\<nom_d'usuari>\AppData\Roaming\jailgames\jaildoctors_dilemma`
|
||||||
- **MacOS**: `~/Library/Application Support/jailgames/jaildoctors_dilemma`
|
- **MacOS**: `~/Library/Application Support/jailgames/jaildoctors_dilemma`
|
||||||
- **Linux**: `~/.jailgames/jaildoctors_dilemma`
|
- **Linux**: `~/.config/jailgames/jaildoctors_dilemma`
|
||||||
|
|
||||||
Dins de la carpeta es troba el fitxer de configuració `config.txt`, on es pot modificar la configuració per connectar-se al servei en línia, i els fitxers `stats.csv` i `stats_buffer.csv`, que contenen informació sobre les estadístiques del joc.
|
Dins de la carpeta es troba el fitxer de configuració `config.yaml`, on es pot modificar la configuració per connectar-se al servei en línia, i els fitxers `stats.csv` i `stats_buffer.csv`, que contenen informació sobre les estadístiques del joc.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
627
config/assets.yaml
Normal file
@@ -0,0 +1,627 @@
|
|||||||
|
# JailDoctor's Dilemma - Asset Configuration
|
||||||
|
# Variables: ${PREFIX}, ${SYSTEM_FOLDER}
|
||||||
|
|
||||||
|
assets:
|
||||||
|
# FONTS
|
||||||
|
fonts:
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/font/smb2.gif
|
||||||
|
- type: FONT
|
||||||
|
path: ${PREFIX}/data/font/smb2.fnt
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/font/aseprite.gif
|
||||||
|
- type: FONT
|
||||||
|
path: ${PREFIX}/data/font/aseprite.fnt
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/font/gauntlet.gif
|
||||||
|
- type: FONT
|
||||||
|
path: ${PREFIX}/data/font/gauntlet.fnt
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/font/subatomic.gif
|
||||||
|
- type: FONT
|
||||||
|
path: ${PREFIX}/data/font/subatomic.fnt
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/font/8bithud.gif
|
||||||
|
- type: FONT
|
||||||
|
path: ${PREFIX}/data/font/8bithud.fnt
|
||||||
|
|
||||||
|
# PALETTES
|
||||||
|
palettes:
|
||||||
|
- type: PALETTE
|
||||||
|
path: ${PREFIX}/data/palette/zx-spectrum.pal
|
||||||
|
- type: PALETTE
|
||||||
|
path: ${PREFIX}/data/palette/zx-spectrum-adjusted.pal
|
||||||
|
- type: PALETTE
|
||||||
|
path: ${PREFIX}/data/palette/zxarne-5.2.pal
|
||||||
|
- type: PALETTE
|
||||||
|
path: ${PREFIX}/data/palette/black-and-white.pal
|
||||||
|
- type: PALETTE
|
||||||
|
path: ${PREFIX}/data/palette/green-phosphor.pal
|
||||||
|
- type: PALETTE
|
||||||
|
path: ${PREFIX}/data/palette/orange-screen.pal
|
||||||
|
- type: PALETTE
|
||||||
|
path: ${PREFIX}/data/palette/ruzx-spectrum.pal
|
||||||
|
- type: PALETTE
|
||||||
|
path: ${PREFIX}/data/palette/ruzx-spectrum-revision-2.pal
|
||||||
|
- type: PALETTE
|
||||||
|
path: ${PREFIX}/data/palette/pico-8.pal
|
||||||
|
- type: PALETTE
|
||||||
|
path: ${PREFIX}/data/palette/sweetie.pal
|
||||||
|
- type: PALETTE
|
||||||
|
path: ${PREFIX}/data/palette/island-joy.pal
|
||||||
|
- type: PALETTE
|
||||||
|
path: ${PREFIX}/data/palette/lost-century.pal
|
||||||
|
- type: PALETTE
|
||||||
|
path: ${PREFIX}/data/palette/na.pal
|
||||||
|
- type: PALETTE
|
||||||
|
path: ${PREFIX}/data/palette/steam-lords.pal
|
||||||
|
- type: PALETTE
|
||||||
|
path: ${PREFIX}/data/palette/winds-seed-pc98.pal
|
||||||
|
- type: PALETTE
|
||||||
|
path: ${PREFIX}/data/palette/psychic-fibre.pal
|
||||||
|
- type: PALETTE
|
||||||
|
path: ${PREFIX}/data/palette/shido-cyberneon.pal
|
||||||
|
- type: PALETTE
|
||||||
|
path: ${PREFIX}/data/palette/darkseed.pal
|
||||||
|
- type: PALETTE
|
||||||
|
path: ${PREFIX}/data/palette/antiquity.pal
|
||||||
|
- type: PALETTE
|
||||||
|
path: ${PREFIX}/data/palette/bubblegum.pal
|
||||||
|
- type: PALETTE
|
||||||
|
path: ${PREFIX}/data/palette/vanilla-milkshake.pal
|
||||||
|
- type: PALETTE
|
||||||
|
path: ${PREFIX}/data/palette/aged-terracotta.pal
|
||||||
|
- type: PALETTE
|
||||||
|
path: ${PREFIX}/data/palette/h16da.pal
|
||||||
|
|
||||||
|
# LOCALE
|
||||||
|
locale:
|
||||||
|
- type: DATA
|
||||||
|
path: ${PREFIX}/data/locale/en.yaml
|
||||||
|
- type: DATA
|
||||||
|
path: ${PREFIX}/data/locale/ca.yaml
|
||||||
|
|
||||||
|
# INPUT
|
||||||
|
input:
|
||||||
|
- type: DATA
|
||||||
|
path: ${PREFIX}/gamecontrollerdb.txt
|
||||||
|
|
||||||
|
# SYSTEM
|
||||||
|
system:
|
||||||
|
- type: DATA
|
||||||
|
path: ${SYSTEM_FOLDER}/config.yaml
|
||||||
|
required: false
|
||||||
|
absolute: true
|
||||||
|
- type: DATA
|
||||||
|
path: ${SYSTEM_FOLDER}/debug.yaml
|
||||||
|
required: false
|
||||||
|
absolute: true
|
||||||
|
- type: DATA
|
||||||
|
path: ${SYSTEM_FOLDER}/editor.yaml
|
||||||
|
required: false
|
||||||
|
absolute: true
|
||||||
|
- type: DATA
|
||||||
|
path: ${SYSTEM_FOLDER}/stats_buffer.csv
|
||||||
|
required: false
|
||||||
|
absolute: true
|
||||||
|
- type: DATA
|
||||||
|
path: ${SYSTEM_FOLDER}/stats.csv
|
||||||
|
required: false
|
||||||
|
absolute: true
|
||||||
|
- type: DATA
|
||||||
|
path: ${SYSTEM_FOLDER}/cheevos.bin
|
||||||
|
required: false
|
||||||
|
absolute: true
|
||||||
|
- type: DATA
|
||||||
|
path: ${SYSTEM_FOLDER}/shaders/postfx.yaml
|
||||||
|
required: false
|
||||||
|
absolute: true
|
||||||
|
- type: DATA
|
||||||
|
path: ${SYSTEM_FOLDER}/shaders/crtpi.yaml
|
||||||
|
required: false
|
||||||
|
absolute: true
|
||||||
|
|
||||||
|
# CONSOLE
|
||||||
|
console:
|
||||||
|
- type: DATA
|
||||||
|
path: ${PREFIX}/data/console/commands.yaml
|
||||||
|
|
||||||
|
# ROOMS
|
||||||
|
rooms:
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/01.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/02.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/03.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/04.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/05.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/06.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/07.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/08.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/09.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/10.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/11.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/12.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/13.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/14.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/15.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/16.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/17.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/18.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/19.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/20.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/21.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/22.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/23.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/24.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/25.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/26.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/27.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/28.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/29.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/30.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/31.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/32.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/33.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/34.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/35.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/36.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/37.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/38.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/39.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/40.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/41.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/42.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/43.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/44.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/45.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/46.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/47.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/48.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/49.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/50.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/51.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/52.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/53.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/54.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/55.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/56.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/57.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/58.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/59.yaml
|
||||||
|
- type: ROOM
|
||||||
|
path: ${PREFIX}/data/room/60.yaml
|
||||||
|
|
||||||
|
# TILESETS
|
||||||
|
tilesets:
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/tilesets/standard.gif
|
||||||
|
|
||||||
|
# ENEMIES
|
||||||
|
enemies:
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/abad_bell.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/abad_bell.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/abad.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/abad.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/amstrad_cs.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/amstrad_cs.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/flying_arounder.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/flying_arounder.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/stopped_arounder.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/stopped_arounder.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/walking_arounder.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/walking_arounder.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/arounders_door.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/arounders_door.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/arounders_machine.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/arounders_machine.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/bat.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/bat.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/batman_bell.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/batman_bell.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/batman_fire.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/batman_fire.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/batman.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/batman.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/bell.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/bell.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/bin.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/bin.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/bird.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/bird.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/breakout.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/breakout.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/bry.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/bry.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/chip.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/chip.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/code.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/code.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/congo.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/congo.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/crosshair.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/crosshair.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/demon.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/demon.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/dimallas.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/dimallas.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/floppy.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/floppy.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/dong.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/dong.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/guitar.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/guitar.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/heavy.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/heavy.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/jailer1.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/jailer1.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/jailer2.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/jailer2.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/jailer3.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/jailer3.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/jailbattle_alien.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/jailbattle_alien.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/jailbattle_human.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/jailbattle_human.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/jeannine.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/jeannine.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/lamp.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/lamp.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/lord_abad.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/lord_abad.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/matatunos.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/matatunos.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/mummy.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/mummy.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/paco.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/paco.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/elsa.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/elsa.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/qvoid.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/qvoid.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/robot.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/robot.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/sam.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/sam.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/shock.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/shock.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/sigmasua.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/sigmasua.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/spark.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/spark.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/special/aerojailer.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/special/aerojailer.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/special/arounder.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/special/arounder.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/special/pepe_rosita_job.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/special/pepe_rosita_job.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/special/shooting_star.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/special/shooting_star.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/spider.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/spider.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/tree_thing.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/tree_thing.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/tuno.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/tuno.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/tv_panel.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/tv_panel.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/tv.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/tv.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/upv_student.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/upv_student.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/wave.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/wave.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/enemies/z80.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/enemies/z80.gif
|
||||||
|
|
||||||
|
# PLAYER
|
||||||
|
player:
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/player/player.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/player/player.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/player/player2.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/player/player2.yaml
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/player/player_game_over.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/player/player_game_over.yaml
|
||||||
|
|
||||||
|
# ITEMS
|
||||||
|
items:
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/items/items.gif
|
||||||
|
|
||||||
|
# MUSIC
|
||||||
|
music:
|
||||||
|
- type: MUSIC
|
||||||
|
path: ${PREFIX}/data/music/title.ogg
|
||||||
|
- type: MUSIC
|
||||||
|
path: ${PREFIX}/data/music/game.ogg
|
||||||
|
- type: MUSIC
|
||||||
|
path: ${PREFIX}/data/music/loading_data1.ogg
|
||||||
|
- type: MUSIC
|
||||||
|
path: ${PREFIX}/data/music/loading_data2.ogg
|
||||||
|
- type: MUSIC
|
||||||
|
path: ${PREFIX}/data/music/loading_header.ogg
|
||||||
|
- type: MUSIC
|
||||||
|
path: ${PREFIX}/data/music/loading_screen_color.ogg
|
||||||
|
- type: MUSIC
|
||||||
|
path: ${PREFIX}/data/music/loading_screen_data.ogg
|
||||||
|
- type: MUSIC
|
||||||
|
path: ${PREFIX}/data/music/ending1.ogg
|
||||||
|
- type: MUSIC
|
||||||
|
path: ${PREFIX}/data/music/ending2.ogg
|
||||||
|
- type: MUSIC
|
||||||
|
path: ${PREFIX}/data/music/game_over.ogg
|
||||||
|
|
||||||
|
# SOUNDS
|
||||||
|
sounds:
|
||||||
|
- type: SOUND
|
||||||
|
path: ${PREFIX}/data/sound/item.wav
|
||||||
|
- type: SOUND
|
||||||
|
path: ${PREFIX}/data/sound/death.wav
|
||||||
|
- type: SOUND
|
||||||
|
path: ${PREFIX}/data/sound/notify.wav
|
||||||
|
- type: SOUND
|
||||||
|
path: ${PREFIX}/data/sound/jump1.wav
|
||||||
|
- type: SOUND
|
||||||
|
path: ${PREFIX}/data/sound/jump2.wav
|
||||||
|
- type: SOUND
|
||||||
|
path: ${PREFIX}/data/sound/jump3.wav
|
||||||
|
- type: SOUND
|
||||||
|
path: ${PREFIX}/data/sound/jump4.wav
|
||||||
|
- type: SOUND
|
||||||
|
path: ${PREFIX}/data/sound/jump5.wav
|
||||||
|
- type: SOUND
|
||||||
|
path: ${PREFIX}/data/sound/jump6.wav
|
||||||
|
- type: SOUND
|
||||||
|
path: ${PREFIX}/data/sound/jump7.wav
|
||||||
|
- type: SOUND
|
||||||
|
path: ${PREFIX}/data/sound/jump8.wav
|
||||||
|
- type: SOUND
|
||||||
|
path: ${PREFIX}/data/sound/jump9.wav
|
||||||
|
- type: SOUND
|
||||||
|
path: ${PREFIX}/data/sound/jump10.wav
|
||||||
|
- type: SOUND
|
||||||
|
path: ${PREFIX}/data/sound/jump11.wav
|
||||||
|
- type: SOUND
|
||||||
|
path: ${PREFIX}/data/sound/jump12.wav
|
||||||
|
- type: SOUND
|
||||||
|
path: ${PREFIX}/data/sound/jump13.wav
|
||||||
|
- type: SOUND
|
||||||
|
path: ${PREFIX}/data/sound/jump14.wav
|
||||||
|
- type: SOUND
|
||||||
|
path: ${PREFIX}/data/sound/jump15.wav
|
||||||
|
- type: SOUND
|
||||||
|
path: ${PREFIX}/data/sound/jump16.wav
|
||||||
|
- type: SOUND
|
||||||
|
path: ${PREFIX}/data/sound/jump17.wav
|
||||||
|
- type: SOUND
|
||||||
|
path: ${PREFIX}/data/sound/jump18.wav
|
||||||
|
- type: SOUND
|
||||||
|
path: ${PREFIX}/data/sound/jump19.wav
|
||||||
|
- type: SOUND
|
||||||
|
path: ${PREFIX}/data/sound/jump20.wav
|
||||||
|
- type: SOUND
|
||||||
|
path: ${PREFIX}/data/sound/jump21.wav
|
||||||
|
- type: SOUND
|
||||||
|
path: ${PREFIX}/data/sound/jump22.wav
|
||||||
|
- type: SOUND
|
||||||
|
path: ${PREFIX}/data/sound/jump23.wav
|
||||||
|
- type: SOUND
|
||||||
|
path: ${PREFIX}/data/sound/jump24.wav
|
||||||
|
|
||||||
|
# LOGO
|
||||||
|
logo:
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/logo/jailgames.gif
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/logo/since_1998.gif
|
||||||
|
|
||||||
|
# LOADING
|
||||||
|
loading:
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/loading/loading_screen_bn.gif
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/loading/loading_screen_color.gif
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/loading/program_jaildoc.gif
|
||||||
|
|
||||||
|
# TITLE
|
||||||
|
title:
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/title/title_logo.gif
|
||||||
|
|
||||||
|
# ENDING
|
||||||
|
ending:
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/ending/ending1.gif
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/ending/ending2.gif
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/ending/ending3.gif
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/ending/ending4.gif
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/ending/ending5.gif
|
||||||
|
|
||||||
|
# CREDITS
|
||||||
|
credits:
|
||||||
|
- type: BITMAP
|
||||||
|
path: ${PREFIX}/data/credits/shine.gif
|
||||||
|
- type: ANIMATION
|
||||||
|
path: ${PREFIX}/data/credits/shine.yaml
|
||||||
267
data/console/commands.yaml
Normal file
@@ -0,0 +1,267 @@
|
|||||||
|
# JailDoctor's Dilemma - Console Commands
|
||||||
|
# Metadata for the in-game console command system.
|
||||||
|
# Execution logic stays in C++; this file defines metadata only.
|
||||||
|
#
|
||||||
|
# Fields:
|
||||||
|
# keyword - Command name (uppercase)
|
||||||
|
# handler - C++ handler function identifier
|
||||||
|
# description - Short description for help output
|
||||||
|
# usage - Full usage string for terminal help
|
||||||
|
# instant - (optional) Skip typewriter effect (default: false)
|
||||||
|
# hidden - (optional) Hide from TAB completion (default: false)
|
||||||
|
# debug_only - (optional) Only available in debug builds (default: false)
|
||||||
|
# help_hidden - (optional) Don't show in help output (default: false)
|
||||||
|
# dynamic_completions - (optional) Completions generated at runtime (default: false)
|
||||||
|
# completions - (optional) Static TAB completion tree
|
||||||
|
# debug_extras - (optional) Overrides applied in debug builds
|
||||||
|
|
||||||
|
categories:
|
||||||
|
- name: VIDEO
|
||||||
|
commands:
|
||||||
|
- keyword: SS
|
||||||
|
handler: cmd_ss
|
||||||
|
description: Supersampling
|
||||||
|
usage: "SS [ON|OFF|SIZE|UPSCALE [NEAREST|LINEAR]|DOWNSCALE [BILINEAR|LANCZOS2|LANCZOS3]]"
|
||||||
|
completions:
|
||||||
|
SS: [ON, OFF, SIZE, UPSCALE, DOWNSCALE]
|
||||||
|
SS UPSCALE: [NEAREST, LINEAR]
|
||||||
|
SS DOWNSCALE: [BILINEAR, LANCZOS2, LANCZOS3]
|
||||||
|
|
||||||
|
- keyword: SHADER
|
||||||
|
handler: cmd_shader
|
||||||
|
description: "Toggle/select shader (F4)"
|
||||||
|
usage: "SHADER [ON|OFF|NEXT|POSTFX|CRTPI|PRESET [NEXT|PREV|<name>]]"
|
||||||
|
completions:
|
||||||
|
SHADER: [ON, OFF, NEXT, POSTFX, CRTPI, PRESET]
|
||||||
|
dynamic_completions: true
|
||||||
|
|
||||||
|
- keyword: BORDER
|
||||||
|
handler: cmd_border
|
||||||
|
description: "Decorative border (B)"
|
||||||
|
usage: "BORDER [ON|OFF]"
|
||||||
|
completions:
|
||||||
|
BORDER: [ON, OFF]
|
||||||
|
|
||||||
|
- keyword: FULLSCREEN
|
||||||
|
handler: cmd_fullscreen
|
||||||
|
description: "Fullscreen mode (F3)"
|
||||||
|
usage: "FULLSCREEN [ON|OFF]"
|
||||||
|
completions:
|
||||||
|
FULLSCREEN: [ON, OFF]
|
||||||
|
|
||||||
|
- keyword: ZOOM
|
||||||
|
handler: cmd_zoom
|
||||||
|
description: "Window zoom (F1/F2)"
|
||||||
|
usage: "ZOOM [UP|DOWN|<1-N>]"
|
||||||
|
completions:
|
||||||
|
ZOOM: [UP, DOWN]
|
||||||
|
|
||||||
|
- keyword: INTSCALE
|
||||||
|
handler: cmd_intscale
|
||||||
|
description: "Integer scaling (F7)"
|
||||||
|
usage: "INTSCALE [ON|OFF]"
|
||||||
|
completions:
|
||||||
|
INTSCALE: [ON, OFF]
|
||||||
|
|
||||||
|
- keyword: VSYNC
|
||||||
|
handler: cmd_vsync
|
||||||
|
description: "Vertical sync"
|
||||||
|
usage: "VSYNC [ON|OFF]"
|
||||||
|
completions:
|
||||||
|
VSYNC: [ON, OFF]
|
||||||
|
|
||||||
|
- keyword: DRIVER
|
||||||
|
handler: cmd_driver
|
||||||
|
description: "GPU driver (restart to apply)"
|
||||||
|
usage: "DRIVER [LIST|AUTO|NONE|<name>]"
|
||||||
|
completions:
|
||||||
|
DRIVER: [LIST, AUTO, NONE]
|
||||||
|
|
||||||
|
- keyword: PALETTE
|
||||||
|
handler: cmd_palette
|
||||||
|
description: "Color palette (F5/F6)"
|
||||||
|
usage: "PALETTE [NEXT|PREV|SORT [ORIGINAL|LUMINANCE|SPECTRUM]|DEFAULT|<name>]"
|
||||||
|
completions:
|
||||||
|
PALETTE SORT: [ORIGINAL, LUMINANCE, SPECTRUM]
|
||||||
|
dynamic_completions: true
|
||||||
|
|
||||||
|
- name: AUDIO
|
||||||
|
commands:
|
||||||
|
- keyword: AUDIO
|
||||||
|
handler: cmd_audio
|
||||||
|
description: Audio master
|
||||||
|
usage: "AUDIO [ON|OFF|VOL <0-100>]"
|
||||||
|
completions:
|
||||||
|
AUDIO: [ON, OFF, VOL]
|
||||||
|
|
||||||
|
- keyword: MUSIC
|
||||||
|
handler: cmd_music
|
||||||
|
description: Music volume
|
||||||
|
usage: "MUSIC [ON|OFF|VOL <0-100>]"
|
||||||
|
completions:
|
||||||
|
MUSIC: [ON, OFF, VOL]
|
||||||
|
|
||||||
|
- keyword: SOUND
|
||||||
|
handler: cmd_sound
|
||||||
|
description: Sound volume
|
||||||
|
usage: "SOUND [ON|OFF|VOL <0-100>]"
|
||||||
|
completions:
|
||||||
|
SOUND: [ON, OFF, VOL]
|
||||||
|
|
||||||
|
- name: GAME
|
||||||
|
commands:
|
||||||
|
- keyword: PLAYER
|
||||||
|
handler: cmd_player
|
||||||
|
description: "Player skin and color"
|
||||||
|
usage: "PLAYER SKIN <name> | PLAYER COLOR <0-15>|DEFAULT"
|
||||||
|
completions:
|
||||||
|
PLAYER: [SKIN, COLOR]
|
||||||
|
PLAYER SKIN: [DEFAULT, ABAD, BATMAN, CHIP, CONGO, JEANNINE, MUMMY, UPV_STUDENT]
|
||||||
|
PLAYER COLOR: [DEFAULT]
|
||||||
|
|
||||||
|
- keyword: RESTART
|
||||||
|
handler: cmd_restart
|
||||||
|
description: Restart from the beginning
|
||||||
|
usage: RESTART
|
||||||
|
instant: true
|
||||||
|
|
||||||
|
- keyword: KIOSK
|
||||||
|
handler: cmd_kiosk
|
||||||
|
description: Enable kiosk mode
|
||||||
|
usage: "KIOSK [ON]"
|
||||||
|
completions:
|
||||||
|
KIOSK: [ON]
|
||||||
|
|
||||||
|
- keyword: EXIT
|
||||||
|
handler: cmd_exit
|
||||||
|
description: Quit application
|
||||||
|
usage: EXIT
|
||||||
|
instant: true
|
||||||
|
|
||||||
|
- keyword: QUIT
|
||||||
|
handler: cmd_quit
|
||||||
|
description: Quit application
|
||||||
|
usage: QUIT
|
||||||
|
instant: true
|
||||||
|
help_hidden: true
|
||||||
|
|
||||||
|
- name: INFO
|
||||||
|
commands:
|
||||||
|
- keyword: SHOW
|
||||||
|
handler: cmd_show
|
||||||
|
description: Show info overlay
|
||||||
|
usage: "SHOW [INFO]"
|
||||||
|
completions:
|
||||||
|
SHOW: [INFO]
|
||||||
|
debug_extras:
|
||||||
|
description: "Show overlay/test notification"
|
||||||
|
usage: "SHOW [INFO|NOTIFICATION|CHEEVO]"
|
||||||
|
completions:
|
||||||
|
SHOW: [INFO, NOTIFICATION, CHEEVO]
|
||||||
|
|
||||||
|
- keyword: HIDE
|
||||||
|
handler: cmd_hide
|
||||||
|
description: Hide info overlay
|
||||||
|
usage: "HIDE [INFO]"
|
||||||
|
completions:
|
||||||
|
HIDE: [INFO]
|
||||||
|
|
||||||
|
- keyword: SIZE
|
||||||
|
handler: cmd_size
|
||||||
|
description: Window size in pixels
|
||||||
|
usage: SIZE
|
||||||
|
|
||||||
|
- keyword: HELP
|
||||||
|
handler: cmd_help
|
||||||
|
description: "Show this help"
|
||||||
|
usage: "HELP / ?"
|
||||||
|
|
||||||
|
- keyword: "?"
|
||||||
|
handler: cmd_help
|
||||||
|
help_hidden: true
|
||||||
|
|
||||||
|
- name: DEBUG
|
||||||
|
debug_only: true
|
||||||
|
commands:
|
||||||
|
- keyword: DEBUG
|
||||||
|
handler: cmd_debug
|
||||||
|
description: "Debug mode and start options (F12)"
|
||||||
|
usage: "DEBUG [MODE [ON|OFF]|START [HERE|ROOM|POS|SCENE <name>]]"
|
||||||
|
completions:
|
||||||
|
DEBUG: [MODE, START]
|
||||||
|
DEBUG MODE: [ON, OFF]
|
||||||
|
DEBUG START: [HERE, ROOM, POS, SCENE]
|
||||||
|
DEBUG START SCENE: [LOGO, LOADING, TITLE, CREDITS, GAME, ENDING, ENDING2]
|
||||||
|
|
||||||
|
- keyword: ITEMS
|
||||||
|
handler: cmd_items
|
||||||
|
description: "Set item count (GAME only)"
|
||||||
|
usage: "ITEMS <0-200>"
|
||||||
|
|
||||||
|
- keyword: ROOM
|
||||||
|
handler: cmd_room
|
||||||
|
description: "Change to room number (GAME only)"
|
||||||
|
usage: "ROOM <1-60>|NEXT|PREV|LEFT|RIGHT|UP|DOWN"
|
||||||
|
completions:
|
||||||
|
ROOM: [NEXT, PREV, LEFT, RIGHT, UP, DOWN]
|
||||||
|
|
||||||
|
- keyword: SCENE
|
||||||
|
handler: cmd_scene
|
||||||
|
description: Change scene
|
||||||
|
usage: "SCENE [LOGO|LOADING|TITLE|CREDITS|GAME|ENDING|ENDING2|RESTART]"
|
||||||
|
completions:
|
||||||
|
SCENE: [LOGO, LOADING, TITLE, CREDITS, GAME, ENDING, ENDING2, RESTART]
|
||||||
|
|
||||||
|
- keyword: EDIT
|
||||||
|
handler: cmd_edit
|
||||||
|
description: "Map editor mode (GAME only)"
|
||||||
|
usage: "EDIT [ON|OFF|REVERT|SHOW|HIDE|MAPBG] [...]"
|
||||||
|
dynamic_completions: true
|
||||||
|
completions:
|
||||||
|
EDIT: [ON, OFF, REVERT, SHOW, HIDE, MAPBG, MAPCONN]
|
||||||
|
EDIT SHOW: [INFO, GRID]
|
||||||
|
EDIT HIDE: [INFO, GRID]
|
||||||
|
|
||||||
|
- keyword: ENEMY
|
||||||
|
handler: cmd_enemy
|
||||||
|
description: "Add, delete or duplicate enemy (editor)"
|
||||||
|
usage: "ENEMY <ADD|DELETE|DUPLICATE>"
|
||||||
|
completions:
|
||||||
|
ENEMY: [ADD, DELETE, DUPLICATE]
|
||||||
|
|
||||||
|
- keyword: ITEM
|
||||||
|
handler: cmd_item
|
||||||
|
description: "Add, delete or duplicate item (editor)"
|
||||||
|
usage: "ITEM <ADD|DELETE|DUPLICATE>"
|
||||||
|
completions:
|
||||||
|
ITEM: [ADD, DELETE, DUPLICATE]
|
||||||
|
|
||||||
|
- keyword: SET
|
||||||
|
handler: cmd_set
|
||||||
|
description: "Set property (enemy or room, editor mode)"
|
||||||
|
usage: "SET <property> <value>"
|
||||||
|
dynamic_completions: true
|
||||||
|
completions:
|
||||||
|
SET: [ANIMATION, COLOR, VX, VY, FLIP, MIRROR, BGCOLOR, BORDER, ITEMCOLOR1, ITEMCOLOR2, CONVEYOR, TILESET, UP, DOWN, LEFT, RIGHT, TILE, COUNTER]
|
||||||
|
SET FLIP: [ON, OFF]
|
||||||
|
SET MIRROR: [ON, OFF]
|
||||||
|
SET CONVEYOR: [LEFT, NONE, RIGHT]
|
||||||
|
|
||||||
|
- name: CHEATS
|
||||||
|
commands:
|
||||||
|
- keyword: CHEAT
|
||||||
|
handler: cmd_cheat
|
||||||
|
description: "Game cheats (GAME only)"
|
||||||
|
usage: "CHEAT [INFINITE LIVES|INVINCIBILITY|OPEN THE JAIL|CLOSE THE JAIL]"
|
||||||
|
hidden: true
|
||||||
|
completions:
|
||||||
|
CHEAT: [INFINITE, INVINCIBILITY, OPEN, CLOSE]
|
||||||
|
CHEAT INFINITE: [LIVES]
|
||||||
|
CHEAT INFINITE LIVES: [ON, OFF]
|
||||||
|
CHEAT INVINCIBILITY: [ON, OFF]
|
||||||
|
CHEAT OPEN: [THE]
|
||||||
|
CHEAT OPEN THE: [JAIL]
|
||||||
|
CHEAT CLOSE: [THE]
|
||||||
|
CHEAT CLOSE THE: [JAIL]
|
||||||
|
debug_extras:
|
||||||
|
hidden: false
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=8
|
|
||||||
frame_height=8
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=6
|
|
||||||
loop=-1
|
|
||||||
frames=0,1,2,3,4,5,6,7
|
|
||||||
[/animation]
|
|
||||||
10
data/credits/shine.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# shine animation
|
||||||
|
tileSetFile: shine.gif
|
||||||
|
frameWidth: 8
|
||||||
|
frameHeight: 8
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.1
|
||||||
|
loop: -1
|
||||||
|
frames: [0, 1, 2, 3, 4, 5, 6, 7]
|
||||||
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
@@ -1,9 +0,0 @@
|
|||||||
frame_width=8
|
|
||||||
frame_height=16
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=8
|
|
||||||
loop=0
|
|
||||||
frames=0,1,2
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/abad.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# abad animation
|
||||||
|
tileSetFile: abad.gif
|
||||||
|
frameWidth: 8
|
||||||
|
frameHeight: 16
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.1333
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1, 2]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=16
|
|
||||||
frame_height=16
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=4
|
|
||||||
loop=0
|
|
||||||
frames=0,1,2,3,4,5,6,7,8,9
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/abad_bell.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# abad_bell animation
|
||||||
|
tileSetFile: abad_bell.gif
|
||||||
|
frameWidth: 16
|
||||||
|
frameHeight: 16
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.0667
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=8
|
|
||||||
frame_height=8
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=4
|
|
||||||
loop=0
|
|
||||||
frames=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/amstrad_cs.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# amstrad_cs animation
|
||||||
|
tileSetFile: amstrad_cs.gif
|
||||||
|
frameWidth: 8
|
||||||
|
frameHeight: 8
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.0667
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=16
|
|
||||||
frame_height=16
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=8
|
|
||||||
loop=0
|
|
||||||
frames=0,1,2,3,3,3,3,3,3,3,3,3,3,3,3,2,1,0,0,0
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/arounders_door.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# arounders_door animation
|
||||||
|
tileSetFile: arounders_door.gif
|
||||||
|
frameWidth: 16
|
||||||
|
frameHeight: 16
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.1333
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 1, 0, 0, 0]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=16
|
|
||||||
frame_height=16
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=4
|
|
||||||
loop=0
|
|
||||||
frames=0,1,2,3
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/arounders_machine.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# arounders_machine animation
|
||||||
|
tileSetFile: arounders_machine.gif
|
||||||
|
frameWidth: 16
|
||||||
|
frameHeight: 16
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.0667
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1, 2, 3]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=9
|
|
||||||
frame_height=7
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=3
|
|
||||||
loop=0
|
|
||||||
frames=0,1
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/bat.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# bat animation
|
||||||
|
tileSetFile: bat.gif
|
||||||
|
frameWidth: 9
|
||||||
|
frameHeight: 7
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.05
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=8
|
|
||||||
frame_height=16
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=8
|
|
||||||
loop=0
|
|
||||||
frames=0,1,2,3
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/batman.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# batman animation
|
||||||
|
tileSetFile: batman.gif
|
||||||
|
frameWidth: 8
|
||||||
|
frameHeight: 16
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.1333
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1, 2, 3]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=16
|
|
||||||
frame_height=16
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=6
|
|
||||||
loop=0
|
|
||||||
frames=0,1,2,3,4,5
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/batman_bell.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# batman_bell animation
|
||||||
|
tileSetFile: batman_bell.gif
|
||||||
|
frameWidth: 16
|
||||||
|
frameHeight: 16
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.1
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1, 2, 3, 4, 5]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=16
|
|
||||||
frame_height=16
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=4
|
|
||||||
loop=0
|
|
||||||
frames=0,1,2,3
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/batman_fire.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# batman_fire animation
|
||||||
|
tileSetFile: batman_fire.gif
|
||||||
|
frameWidth: 16
|
||||||
|
frameHeight: 16
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.0667
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1, 2, 3]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=16
|
|
||||||
frame_height=16
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=6
|
|
||||||
loop=0
|
|
||||||
frames=0,1,2,3,4,5,6,7,8,9,10,11
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/bell.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# bell animation
|
||||||
|
tileSetFile: bell.gif
|
||||||
|
frameWidth: 16
|
||||||
|
frameHeight: 16
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.1
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=16
|
|
||||||
frame_height=8
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=10
|
|
||||||
loop=0
|
|
||||||
frames=0,1,2,3,4
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/bin.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# bin animation
|
||||||
|
tileSetFile: bin.gif
|
||||||
|
frameWidth: 16
|
||||||
|
frameHeight: 8
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.1667
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1, 2, 3, 4]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=16
|
|
||||||
frame_height=16
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=8
|
|
||||||
loop=0
|
|
||||||
frames=0,1,2,3
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/bird.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# bird animation
|
||||||
|
tileSetFile: bird.gif
|
||||||
|
frameWidth: 16
|
||||||
|
frameHeight: 16
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.1333
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1, 2, 3]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=24
|
|
||||||
frame_height=32
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=6
|
|
||||||
loop=0
|
|
||||||
frames=0,1,2,3,4,5,6,7,6,5,4,3,2,1
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/breakout.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# breakout animation
|
||||||
|
tileSetFile: breakout.gif
|
||||||
|
frameWidth: 24
|
||||||
|
frameHeight: 32
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.1
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1, 2, 3, 4, 5, 6, 7, 6, 5, 4, 3, 2, 1]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=10
|
|
||||||
frame_height=16
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=6
|
|
||||||
loop=0
|
|
||||||
frames=0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,4,5,4,5,4,5,4,5,4,5,4,5,4,5,4,5,4,5,4,5,4,5,4,5
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/bry.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# bry animation
|
||||||
|
tileSetFile: bry.gif
|
||||||
|
frameWidth: 10
|
||||||
|
frameHeight: 16
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.1
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=8
|
|
||||||
frame_height=16
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=8
|
|
||||||
loop=0
|
|
||||||
frames=0,1,2,3
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/chip.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# chip animation
|
||||||
|
tileSetFile: chip.gif
|
||||||
|
frameWidth: 8
|
||||||
|
frameHeight: 16
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.1333
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1, 2, 3]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=16
|
|
||||||
frame_height=16
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=6
|
|
||||||
loop=0
|
|
||||||
frames=0,1,2,3
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/code.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# code animation
|
||||||
|
tileSetFile: code.gif
|
||||||
|
frameWidth: 16
|
||||||
|
frameHeight: 16
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.1
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1, 2, 3]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=8
|
|
||||||
frame_height=16
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=6
|
|
||||||
loop=0
|
|
||||||
frames=0,1,2,3
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/congo.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# congo animation
|
||||||
|
tileSetFile: congo.gif
|
||||||
|
frameWidth: 8
|
||||||
|
frameHeight: 16
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.1
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1, 2, 3]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=16
|
|
||||||
frame_height=16
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=6
|
|
||||||
loop=0
|
|
||||||
frames=0,1,2,3
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/crosshair.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# crosshair animation
|
||||||
|
tileSetFile: crosshair.gif
|
||||||
|
frameWidth: 16
|
||||||
|
frameHeight: 16
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.1
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1, 2, 3]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=16
|
|
||||||
frame_height=16
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=8
|
|
||||||
loop=0
|
|
||||||
frames=0,1,2,3
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/demon.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# demon animation
|
||||||
|
tileSetFile: demon.gif
|
||||||
|
frameWidth: 16
|
||||||
|
frameHeight: 16
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.1333
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1, 2, 3]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=16
|
|
||||||
frame_height=16
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=8
|
|
||||||
loop=0
|
|
||||||
frames=0,1,2,3
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/dimallas.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# dimallas animation
|
||||||
|
tileSetFile: dimallas.gif
|
||||||
|
frameWidth: 16
|
||||||
|
frameHeight: 16
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.1333
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1, 2, 3]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=22
|
|
||||||
frame_height=16
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=6
|
|
||||||
loop=0
|
|
||||||
frames=0,1,2,3,4,5
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/dong.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# dong animation
|
||||||
|
tileSetFile: dong.gif
|
||||||
|
frameWidth: 22
|
||||||
|
frameHeight: 16
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.1
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1, 2, 3, 4, 5]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=16
|
|
||||||
frame_height=16
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=6
|
|
||||||
loop=0
|
|
||||||
frames=0,1,2,3,4,5
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/elsa.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# elsa animation
|
||||||
|
tileSetFile: elsa.gif
|
||||||
|
frameWidth: 16
|
||||||
|
frameHeight: 16
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.1
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1, 2, 3, 4, 5]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=16
|
|
||||||
frame_height=16
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=8
|
|
||||||
loop=0
|
|
||||||
frames=0,1,2,3
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/floppy.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# floppy animation
|
||||||
|
tileSetFile: floppy.gif
|
||||||
|
frameWidth: 16
|
||||||
|
frameHeight: 16
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.1333
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1, 2, 3]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=7
|
|
||||||
frame_height=7
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=10
|
|
||||||
loop=0
|
|
||||||
frames=0
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/flying_arounder.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# flying_arounder animation
|
||||||
|
tileSetFile: flying_arounder.gif
|
||||||
|
frameWidth: 7
|
||||||
|
frameHeight: 7
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.1667
|
||||||
|
loop: 0
|
||||||
|
frames: [0]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=16
|
|
||||||
frame_height=16
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=8
|
|
||||||
loop=0
|
|
||||||
frames=0,1,2,3
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/guitar.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# guitar animation
|
||||||
|
tileSetFile: guitar.gif
|
||||||
|
frameWidth: 16
|
||||||
|
frameHeight: 16
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.1333
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1, 2, 3]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=16
|
|
||||||
frame_height=16
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=8
|
|
||||||
loop=0
|
|
||||||
frames=0,1,2,3
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/heavy.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# heavy animation
|
||||||
|
tileSetFile: heavy.gif
|
||||||
|
frameWidth: 16
|
||||||
|
frameHeight: 16
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.1333
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1, 2, 3]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=13
|
|
||||||
frame_height=15
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=6
|
|
||||||
loop=0
|
|
||||||
frames=0,1
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/jailbattle_alien.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# jailbattle_alien animation
|
||||||
|
tileSetFile: jailbattle_alien.gif
|
||||||
|
frameWidth: 13
|
||||||
|
frameHeight: 15
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.1
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=11
|
|
||||||
frame_height=13
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=6
|
|
||||||
loop=0
|
|
||||||
frames=0,1
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/jailbattle_human.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# jailbattle_human animation
|
||||||
|
tileSetFile: jailbattle_human.gif
|
||||||
|
frameWidth: 11
|
||||||
|
frameHeight: 13
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.1
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1]
|
||||||
|
Before Width: | Height: | Size: 224 B After Width: | Height: | Size: 224 B |
10
data/enemies/jailer1.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# jailer1 animation
|
||||||
|
tileSetFile: jailer1.gif
|
||||||
|
frameWidth: 16
|
||||||
|
frameHeight: 16
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.0667
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1, 2, 3]
|
||||||
|
Before Width: | Height: | Size: 280 B After Width: | Height: | Size: 280 B |
10
data/enemies/jailer2.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# jailer2 animation
|
||||||
|
tileSetFile: jailer2.gif
|
||||||
|
frameWidth: 16
|
||||||
|
frameHeight: 16
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.0667
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5]
|
||||||
|
Before Width: | Height: | Size: 226 B After Width: | Height: | Size: 226 B |
10
data/enemies/jailer3.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# jailer3 animation
|
||||||
|
tileSetFile: jailer3.gif
|
||||||
|
frameWidth: 16
|
||||||
|
frameHeight: 16
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.0667
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1, 2, 3]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=16
|
|
||||||
frame_height=16
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=4
|
|
||||||
loop=0
|
|
||||||
frames=0,1,2,3
|
|
||||||
[/animation]
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=16
|
|
||||||
frame_height=16
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=4
|
|
||||||
loop=0
|
|
||||||
frames=0,1,2,3,4,5,0,1,2,3,4,5,0,1,2,3,4,5,0,1,2,3,4,5,0,1,2,3,4,5,1,3,5,1,3,5,1,3,5
|
|
||||||
[/animation]
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=16
|
|
||||||
frame_height=16
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=4
|
|
||||||
loop=0
|
|
||||||
frames=0,1,2,3
|
|
||||||
[/animation]
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=8
|
|
||||||
frame_height=16
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=6
|
|
||||||
loop=0
|
|
||||||
frames=0,1,2,3
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/jeannine.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# jeannine animation
|
||||||
|
tileSetFile: jeannine.gif
|
||||||
|
frameWidth: 8
|
||||||
|
frameHeight: 16
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.1
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1, 2, 3]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=16
|
|
||||||
frame_height=16
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=4
|
|
||||||
loop=0
|
|
||||||
frames=0,1
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/lamp.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# lamp animation
|
||||||
|
tileSetFile: lamp.gif
|
||||||
|
frameWidth: 16
|
||||||
|
frameHeight: 16
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.0667
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=16
|
|
||||||
frame_height=16
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=6
|
|
||||||
loop=0
|
|
||||||
frames=0,1,2,3
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/lord_abad.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# lord_abad animation
|
||||||
|
tileSetFile: lord_abad.gif
|
||||||
|
frameWidth: 16
|
||||||
|
frameHeight: 16
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.1
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1, 2, 3]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=16
|
|
||||||
frame_height=16
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=8
|
|
||||||
loop=0
|
|
||||||
frames=0,1,2,3,4,5
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/matatunos.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# matatunos animation
|
||||||
|
tileSetFile: matatunos.gif
|
||||||
|
frameWidth: 16
|
||||||
|
frameHeight: 16
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.1333
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1, 2, 3, 4, 5]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=8
|
|
||||||
frame_height=16
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=12
|
|
||||||
loop=0
|
|
||||||
frames=0,1,2,3
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/mummy.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# mummy animation
|
||||||
|
tileSetFile: mummy.gif
|
||||||
|
frameWidth: 8
|
||||||
|
frameHeight: 16
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.2
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1, 2, 3]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=16
|
|
||||||
frame_height=16
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=4
|
|
||||||
loop=0
|
|
||||||
frames=0,1,2,3,4,5,6,7
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/paco.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# paco animation
|
||||||
|
tileSetFile: paco.gif
|
||||||
|
frameWidth: 16
|
||||||
|
frameHeight: 16
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.0667
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1, 2, 3, 4, 5, 6, 7]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=16
|
|
||||||
frame_height=16
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=8
|
|
||||||
loop=0
|
|
||||||
frames=0,1,2,3,4,5,6,7
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/qvoid.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# qvoid animation
|
||||||
|
tileSetFile: qvoid.gif
|
||||||
|
frameWidth: 16
|
||||||
|
frameHeight: 16
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.1333
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1, 2, 3, 4, 5, 6, 7]
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
frame_width=16
|
|
||||||
frame_height=32
|
|
||||||
|
|
||||||
[animation]
|
|
||||||
name=default
|
|
||||||
speed=4
|
|
||||||
loop=0
|
|
||||||
frames=0,1,2,3
|
|
||||||
[/animation]
|
|
||||||
10
data/enemies/robot.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# robot animation
|
||||||
|
tileSetFile: robot.gif
|
||||||
|
frameWidth: 16
|
||||||
|
frameHeight: 32
|
||||||
|
|
||||||
|
animations:
|
||||||
|
- name: default
|
||||||
|
speed: 0.0667
|
||||||
|
loop: 0
|
||||||
|
frames: [0, 1, 2, 3]
|
||||||