189 Commits

Author SHA1 Message Date
6e3cd05cd2 cppcheck 2025-11-07 17:01:29 +01:00
84b5ff05ad afegit cppcheck a tools/linter 2025-11-07 10:06:47 +01:00
cf6831206e style: elements de menu centrats verticalment en Title 2025-11-07 09:53:07 +01:00
9e3d3a7ce3 style: en Title, eliminat el submenu de controls 2025-11-07 09:35:44 +01:00
85844645ac fix: corregida la animació de Logo 2025-11-07 08:53:15 +01:00
da159f1409 correccions en fitxers .room 2025-11-06 20:54:14 +01:00
d875a2706b refinant la classe Player 2025-11-06 14:14:22 +01:00
288e01e47f treballant en la nova clase Player 2025-11-05 14:15:00 +01:00
a20ea5299d afegit player.md 2025-11-04 14:02:23 +01:00
66a580aff6 4 merdes fetes en la feina pr avorriment 2025-11-03 14:12:17 +01:00
d4030ec1bc linter 2025-11-03 09:58:19 +01:00
3f1c737247 linter 2025-11-03 09:52:54 +01:00
1409ab5bff corregida la velocitat del Logo 2025-11-02 22:50:57 +01:00
e08badbf22 afegida hotkey per activar/desactivar el vsync 2025-11-02 22:29:09 +01:00
64f0ef7349 Eliminar archivos binarios del repositorio y actualizar .gitignore
- Añadidas entradas para pack_resources y resources.pack al .gitignore
- Eliminados resources.pack y tools/pack_resources/pack_resources del repositorio
- Los archivos locales se mantienen pero ya no serán trackeados por git

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-02 22:28:10 +01:00
0d19cf18aa ja es pot redefinir el mando correctament 2025-11-02 19:07:46 +01:00
87527d01a8 ja redefinix els botons i axis, pero el axis sempre te un comportament default. corregir 2025-11-02 19:02:29 +01:00
b79f30a57b treballant en redefinir els botons i axis del joystick 2025-11-02 18:57:24 +01:00
6c766be023 el joc es pot controlar amb el primer mando que hi haja conectat 2025-11-02 18:18:12 +01:00
ee1dc70bd8 mogudes les tecles H, B i M a tecles de funció 2025-11-02 18:02:18 +01:00
eb550ab95b ja es poden redefinir les tecles
renombrat achievements a projects
2025-11-02 17:58:34 +01:00
13513384d1 treballant en redefine keys 2025-11-02 17:31:44 +01:00
f7aa6a2b8b afegit fadeout de musica en Title al passar al joc 2025-11-02 17:11:18 +01:00
ba06bccabc les tecles de control estan definides al fitxer de configuracio 2025-11-02 17:08:56 +01:00
9102c6a65e reorganitzat GlobalInputs 2025-11-02 16:42:45 +01:00
435ff5eb6a Title: codi mes ordenat. Fade quan transiciona a Credits. Esqueleto preparat per a treballar en redefine keys/joystick 2025-11-02 14:27:25 +01:00
af7420d7c7 Title: afegit fade i post_fade 2025-11-02 14:04:33 +01:00
4eac48ed78 LoadingScreen: nous efectes de so. Millores acabades 2025-11-02 11:00:09 +01:00
c5563768af LoadingScreen: la pantalla de carrega en BN ja es menja el Program 2025-11-02 10:25:25 +01:00
46f7968faf LoadingScreen: afegits picos de soroll als silencis 2025-11-02 10:08:39 +01:00
9cd1755266 LoadingScreen: implementat visualment la càrrega de headers 2025-11-02 09:48:07 +01:00
ef89a858c3 afegit make help 2025-11-02 07:58:12 +01:00
d46e2295ff style: en els update() de game/scenes 2025-11-01 22:52:56 +01:00
f91748bdf0 Merge branch 'main' of https://gitea.sustancia.synology.me/JailDesigner/jaildoctors_dilemma 2025-11-01 22:28:58 +01:00
824e7417ad migrat Input a la ultima versió
cohesionats tots els metodes update de les escenes
2025-11-01 22:28:51 +01:00
e86539eba0 Actualizar README.md 2025-11-01 19:56:33 +01:00
1dd750ba0c corregida la carrega de config.txt 2025-11-01 19:10:51 +01:00
7441fa2b6b corregides les lectures de fitxers de text en windows. fallava per culpa del final de linea 2025-11-01 18:55:07 +01:00
139d56f8b5 millores en la pantalla de càrrega de recursos 2025-11-01 18:07:55 +01:00
b80e81dab3 fix: bug de lectura en windows en Room::loadRoomTileFile() 2025-11-01 17:51:05 +01:00
b21c52092a correccions en el Makefile per a windows 2025-11-01 17:37:01 +01:00
5c5151c032 correccions en makefile i version.h 2025-11-01 09:44:31 +01:00
66c7c9dfe6 vectoritzat el icono. nova versió 2025-11-01 09:44:16 +01:00
cb09198bfe treballant en la pantalla de càrrega de recursos 2025-11-01 08:52:03 +01:00
16aa4f52aa normalitzat el audio de options, audio i jail_audio a float entre 0.0 i 1.0 2025-11-01 00:01:20 +01:00
f67bdc6f4f modificat aseprite.png a aseprite.gif 2025-11-01 00:00:52 +01:00
eb7d1bb014 optimitzats els constructors per defecte en Options 2025-10-31 23:46:07 +01:00
5f802ed6ef afegiida aseprite font 2025-10-31 23:45:06 +01:00
635efdba5e corregit el macos_release 2025-10-31 23:11:17 +01:00
8c6bea897c actualitzada la carpeta release a SDL3
migrat a resources.pack
2025-10-31 22:58:37 +01:00
70bfced50d migrat Assets a la ultima versió (fitxers no hardcoded) 2025-10-31 12:52:22 +01:00
2f20ac422e eliminats metodes deprecated
migracions finals a time based
migracions de jail_audio a Audio
2025-10-31 10:32:23 +01:00
1bb3d00e7c migrat Scoreboard a time based 2025-10-31 09:30:33 +01:00
f08b2f9193 migrat Ending2 a time based 2025-10-31 08:40:46 +01:00
3680ff3935 migrat Ending a time based 2025-10-30 22:57:43 +01:00
99893a0c83 migrat Credits a time based 2025-10-30 22:44:33 +01:00
c5cfb518a2 treballant en la classe Player 2025-10-30 22:01:20 +01:00
1041aaf385 afegides regles per reescriure la clase Player 2025-10-30 13:36:20 +01:00
c207b456f5 tractant d'entendre el codi de Player i posar ordre 2025-10-29 21:18:15 +01:00
7cd596a0b9 fix: inicialitzacions 2025-10-29 17:16:19 +01:00
89a7f197a6 fix: corregides les velocitats negatives dels enemics als fitxers .room 2025-10-29 16:42:29 +01:00
fda22dd5f2 Merge pull request 'Ja pilla el gif i el tamany del .ani, en compte de del [enemy] en les rooms.' (#20) from jailers/jaildoctors_dilemma:main into main
Reviewed-on: JailDesigner/jaildoctors_dilemma#20
2025-10-29 15:08:35 +01:00
70d6cbfaf8 [DOC:29/10/2025] la surface ara se pillarà del .ANI
Tots els arxius .ani i .room retocats per a adequarse als canvis.
2025-10-29 14:22:36 +01:00
95dd6b4f70 [DOC:29/10/2025] w i h ja no fan falta, se pilla del .ANI 2025-10-29 12:22:20 +01:00
633936c6e8 style: arreglant capçaleres 2025-10-29 12:11:37 +01:00
95b82e5f62 fix: errors de renombrat de variables 2025-10-29 11:56:34 +01:00
ead3265bfc style: arreglades capçaleres 2025-10-29 10:58:37 +01:00
8bf9da5fb6 style: organitzada la capçalera de Room 2025-10-29 09:58:49 +01:00
cd836862c0 style: corregides les capçaleres de game/entities 2025-10-29 09:21:05 +01:00
acdad8295a actualitzats els fitxers .room a pixels per segons (la velocitat dels enemics) 2025-10-28 11:03:04 +01:00
f14a1075ab migrat Enemy a time based 2025-10-28 11:02:22 +01:00
31c84f9676 migrat Game, Player i Item a time based 2025-10-28 10:52:13 +01:00
9e8c5e13df migrat Notifier a time based 2025-10-28 10:10:47 +01:00
de8c714132 migrats els fitxers .ani a segons/frame 2025-10-28 09:49:57 +01:00
da65777a5b migrades les clases Sprite a time based 2025-10-28 09:48:58 +01:00
70b76edcbf migrat GameOver a time based 2025-10-27 19:22:36 +01:00
6af2d72ea8 linter 2025-10-27 19:03:34 +01:00
5f47c88770 linter 2025-10-27 18:56:24 +01:00
3179a08dac linter 2025-10-27 18:35:53 +01:00
b1dca32a5b linter 2025-10-27 17:39:23 +01:00
aacb14149f eliminades les opcions de configuracio de posicio de les notificacions 2025-10-27 13:24:43 +01:00
cdb9bde6aa linter 2025-10-27 13:01:11 +01:00
5d8811026d linter 2025-10-27 11:53:12 +01:00
231dcd4b3b afegida carpeta tools/linter 2025-10-27 09:22:57 +01:00
17101a3da1 optimitzada la marquesina de Title 2025-10-26 23:23:33 +01:00
87370dd11d migracio de Title a time based 2025-10-26 23:07:08 +01:00
fc17131455 mogut GlobalEvenets a core/system 2025-10-26 22:33:27 +01:00
0c87612a17 treballant en les novetats de LoadingScreen 2025-10-26 21:44:16 +01:00
96506988b6 afegida la clase Audio 2025-10-26 21:43:44 +01:00
c7b07e9351 actualitzat a la ultima versió de jail_audio 2025-10-26 21:43:29 +01:00
6d2a116d15 migracio de LoadingScreen completada 2025-10-26 19:55:25 +01:00
d1acc59319 migrant LoadingScreen a delta_time i estats 2025-10-26 19:51:08 +01:00
0388adfed8 migrat Logo a time based 2025-10-26 18:01:02 +01:00
342177a751 renombrades les clases SSprite a SurfaceSprite 2025-10-26 14:56:56 +01:00
fdea094e26 corregit el logo de jailgames 2025-10-26 14:56:24 +01:00
2eadd7d8df mes reestructuracio de fitxers de codi 2025-10-26 14:46:19 +01:00
51330db998 mogut options.section a SceneManager 2025-10-26 14:18:45 +01:00
df4965a84b canviat Options de struct a namespace 2025-10-26 14:01:08 +01:00
8f49e442de redistribuida la carpeta source 2025-10-26 13:02:45 +01:00
9676e5bc2f creada carpeta source2 2025-10-26 12:31:49 +01:00
545d471654 fix: arreglades les colisions "the static cast menner" 2025-10-16 14:14:33 +02:00
9db902c024 netejat codi mort en screen.cpp 2025-10-16 13:29:25 +02:00
7fe2523221 fix: ja funcionen els shaders 2025-10-16 12:46:02 +02:00
d5ff840445 fix: faltava fer SDL_INIT_AUDIO 2025-10-16 11:51:17 +02:00
fb5fee02e9 Ja es por jugar
Estat actual: no van els shaders. Jail_audio dona errors
2025-10-16 10:22:12 +02:00
9a4b3b04a5 Corregits mil warnings de int a float
Corregit getDisplayInfo per al calcul del zoomMax
2025-10-16 10:12:03 +02:00
e811cf0a1d apegat de mala manera els shaders del CCAE i fets uns apanyets per a vore si compila 2025-10-15 12:59:17 +02:00
e4a08d2ec7 corregides cridades a SDL3 i migrat casi tot de int a float. Falta jail_shader 2025-10-15 12:16:50 +02:00
7c102e42cc corregits mes includes
llevats els errors en texture
2025-10-15 09:14:30 +02:00
78c5333144 Redistribuits els .cpp en carpetes
Actualitzat cmake
Modificats els include de SDL2 a SDL3
2025-10-15 08:28:57 +02:00
c3415fd106 Actualizar README.md 2025-06-25 21:53:41 +02:00
428fe664bd arreglada la logica d'estats en Ending2 2025-03-21 13:24:32 +01:00
0f8de0d8b5 arreglos d'estil 2025-03-21 08:42:54 +01:00
2ee2d5c45d millorat el renderitzat amb el borde activat 2025-03-21 08:27:24 +01:00
b8cde79107 fix: en windows no es calculaven be les colisions 2025-03-20 18:45:49 +01:00
0667e2105b passat el codi de pintar el mode debug de textura a surface 2025-03-20 18:02:31 +01:00
f438e8946b style: canviar border_ a enum class 2025-03-20 14:06:58 +01:00
68c97610fb style: canvis en Game 2025-03-20 13:46:31 +01:00
7746b679b4 style: canvis en Player 2025-03-20 13:44:37 +01:00
73008992e0 fix: no actualitzava correctament la caixa de colisions del jugador al canviar d'habitació 2025-03-20 13:37:17 +01:00
d4acb38c05 Merge branch 'master' of https://gitea.sustancia.synology.me/jaildesigner/jaildoctors_dilemma 2025-03-20 08:22:39 +01:00
7aae9fb5e6 arreglos d'estil en Screen 2025-03-20 08:22:25 +01:00
a63066bd68 arreglada la paleta taronja 2025-03-19 18:07:46 +01:00
0de6117ca0 afegit comptador de frames per segon 2025-03-17 14:10:07 +01:00
a43967c279 incrementat el nivell de detall en updateLoadingProgress() 2025-03-17 13:46:38 +01:00
15ecc10d8b fix: si arrancava en pantalla completa amb shaders, no reescalava be la imatge 2025-03-16 18:55:00 +01:00
0a5996f220 afegit soport per a axis del mando 2025-03-16 17:45:07 +01:00
64ee2d1e45 actualitzat gamecontrollerdb.txt a la ultima versió 2025-03-16 17:14:01 +01:00
40dcbabfe8 afegit gif.cpp i jail_shader.cpp desde coffee_crisis_arcade_edition 2025-03-16 15:44:38 +01:00
a14f6fcf6f Mil arreglos de paletes, gifs i colors transparents
El gif del jugador de game over estava mal
2025-03-08 20:04:43 +01:00
7b3f82aa34 Establit en Cheevos el temps de les notificacions 2025-03-08 11:40:22 +01:00
3a36bf6530 Optimitzats alguns bucles en les notificacions 2025-03-08 11:38:17 +01:00
195d812d2a Les notificacions ara van per milisegons.
posibilitat d'establir el tems de una notificacio (util per a allargar les dels logros)
2025-03-08 11:29:25 +01:00
fdb85ac393 Afegida tecla per a canviar el escalat sencer 2025-03-08 10:54:44 +01:00
d4e3995d71 Millorades les paletes verda i taronja
Retocada la paleta sweetie-16
Afegida política al fitxer CMakeLists.txt
2025-03-08 10:17:22 +01:00
b885aa8c9e fix: el cursor del mouse no està amagat per defecte 2025-03-07 22:44:53 +01:00
9cf0891a04 fix: la musica del mode DEMO no era la correcta 2025-03-07 22:29:17 +01:00
09ac952404 Afegit efecte de fundit a negre per a la paleta principal i per a la secundaria. Implementat en Title 2025-03-07 14:32:35 +01:00
529bfb5e3a Eliminada paleta.cpp i mig adaptada la surface que la gastava 2025-03-07 14:12:24 +01:00
ce88596d35 No se pq el ultim commit ha deixat 4 fitxers per commitar 2025-03-07 12:21:21 +01:00
6c3e231d51 Arreglats alguns colorets que havia per ahi rebolicats
fix: Credits no estava ben portat a surfaces
2025-03-07 12:20:30 +01:00
ae5c511988 fix: tamany incorrecte per a la textura de shaders quan es desactiva el borde 2025-03-06 23:20:07 +01:00
9eaf3bc134 Retocat un poc el disseny de Title
Retocades les notificacions
2025-03-06 23:12:53 +01:00
ff309168ef Ja torna a pintar de negre la pantalla al morir 2025-03-06 22:44:44 +01:00
c5c312fc51 Ja torna a funcionar el fade del logo 2025-03-06 22:36:53 +01:00
34d34a5d91 canvi de pc 2025-03-06 22:13:13 +01:00
d339fb13b0 Canviades les paletes dels .gif
Ara es poden carregar paletes desde fitxers .pal
Reajustada la pleta general
fix: la pantalla de càrrega deixava un pixel per pintar, desde sempre
Ajustat el color del borde en el Logo i el Title per a ser igual al fondo amb les paletes de 16 colors (la del Spectrum es de 15)
2025-03-06 20:04:53 +01:00
d0e06e30c9 Ja tornen a funcionar els shaders 2025-03-06 14:24:31 +01:00
982db7f75b Ja carrega la ultima paleta seleccionada 2025-03-06 14:07:47 +01:00
68e03ac1b0 La barra de progres ja torna a estar com abans 2025-03-06 13:42:52 +01:00
537150365b Retocat el render path d'Screen 2025-03-06 13:29:39 +01:00
12e27a1062 Ja torna a funcionar el borde 2025-03-06 13:14:57 +01:00
72efa0dc46 Afegides guardes en Surface::render() per a no pintar fora del destí (no estava implementat en totes les versions de render) 2025-03-06 12:27:10 +01:00
f2bfc970bc Quan canvia de RendererSurface, torna a deixar la que havia, no la de per defecte 2025-03-06 12:09:59 +01:00
60c926a9c9 Ja funciona la roda de paletes 2025-03-06 11:45:06 +01:00
10debde847 Treballant en la caché de les paletes 2025-03-05 22:58:26 +01:00
5cc163dd14 Arreglats els endings 2025-03-05 21:57:10 +01:00
241732752a i per fi ja comença a tornar tot a la normalitat 2025-03-05 20:52:34 +01:00
5a8747cc4b val! ja pinta coses en altres surfaces 2025-03-05 19:41:55 +01:00
70a50f5117 Imposible canviar la rendererSurface 2025-03-05 18:51:36 +01:00
d41b0cb31c He posat punteros dobles i tampoc va res 2025-03-05 12:31:54 +01:00
33038e8509 canvi de pc 2025-03-05 07:44:12 +01:00
57481a1e97 Ja pinta cosetes per pantalla 2025-03-04 14:24:30 +01:00
05f91b2a94 Transició a surface acabada. Ja compila 2025-03-04 12:30:19 +01:00
c4033e3663 Transició a surface: barallantme amb tots els Color que hi ha pel codi 2025-03-03 22:58:12 +01:00
b940d627d6 Transició a surface: crec que falta room.cpp 2025-03-03 21:33:59 +01:00
b320030547 Transició a surface: ending.cpp fet 2025-03-03 20:48:31 +01:00
d7e0178602 Transició a surface: game.cpp fet 2025-03-03 19:15:24 +01:00
c9e75ad5c8 bfff, a casa a meitat enfangà.. be..
Estic acabant de convertir Title
2025-03-03 14:26:07 +01:00
8f1d1df5d6 Transició a surface: vaig per title.cpp 2025-03-02 21:56:19 +01:00
db3a0d7263 Afegides classes SSprite, SMovingSprite i SAnimatedSprite 2025-03-02 19:29:48 +01:00
636b91ae6f Afegides noves funciones a Surface 2025-03-02 18:38:17 +01:00
4b820ad6b7 Modificada la llista de fitxers 2025-03-02 18:17:37 +01:00
a4db80e116 Canviats els .png per .gif 2025-03-02 18:10:58 +01:00
2ebb285a27 fix: el brillet del cor dels credits pillava mal la posició 2025-03-02 16:51:08 +01:00
d05f18ce2d fix: amb shaders no canviava be el mode de vdeo 2025-03-02 14:56:57 +01:00
0d74a8a29f fix: s'havien fotut els dos finals, pero ja estan corregits 2025-03-02 13:43:23 +01:00
cdf0b0a694 demo.cpp a fer la mar 2025-03-02 10:41:38 +01:00
82f0992116 Llevats un parell de warnings en pLoadSurface i pLoadPal 2025-03-02 09:39:48 +01:00
b1ba5e67dc Arreglos en la estructura i format del codi 2025-03-02 09:32:25 +01:00
193dac708f canvi de pc 2025-03-02 08:09:15 +01:00
cd96be80f9 Afegit Cheevos::clearUnobtainableState(); 2025-03-01 22:49:03 +01:00
aca2be98af Arreglos en la estructura i format del codi 2025-03-01 22:36:22 +01:00
360ebfd2e6 Arreglos en la estructura i format del codi 2025-03-01 20:39:44 +01:00
5c371e7517 Arreglos en la estructura i format del codi 2025-03-01 19:33:40 +01:00
31cded15cc Arreglos en la estructura i format del codi 2025-03-01 17:01:50 +01:00
3562b139c3 Arreglos en la estructura i format del codi 2025-03-01 11:02:08 +01:00
c2040d3ded Actualitzat Makefile per al release de macos amb target x86_64-apple-macos10.15
Actualitzat el numero de versió a 1.10
2025-03-01 10:20:45 +01:00
b34f4dda42 fix: llevar el text de REDEFINE KEYS 2025-03-01 09:28:17 +01:00
1012 changed files with 428897 additions and 49824 deletions

21
.clang-format Normal file
View File

@@ -0,0 +1,21 @@
BasedOnStyle: Google
IndentWidth: 4
IndentAccessModifiers: true
ColumnLimit: 0 # Sin límite de longitud de línea
BreakBeforeBraces: Attach # Llaves en la misma línea
AllowShortIfStatementsOnASingleLine: true
AllowShortBlocksOnASingleLine: true
AllowShortFunctionsOnASingleLine: All
AlignOperands: DontAlign
AlignAfterOpenBracket: DontAlign
BinPackArguments: false
BinPackParameters: false
ContinuationIndentWidth: 4
ConstructorInitializerIndentWidth: 4
IndentWrappedFunctionNames: false
Cpp11BracedListStyle: true
BreakConstructorInitializers: BeforeColon
AllowAllConstructorInitializersOnNextLine: false
PackConstructorInitializers: Never
AllowAllArgumentsOnNextLine: false
AllowAllParametersOfDeclarationOnNextLine: false

84
.clang-tidy Normal file
View File

@@ -0,0 +1,84 @@
Checks:
- readability-*
- modernize-*
- performance-*
- bugprone-unchecked-optional-access
- bugprone-sizeof-expression
- bugprone-suspicious-missing-comma
- bugprone-suspicious-index
- bugprone-undefined-memory-manipulation
- bugprone-use-after-move
- bugprone-out-of-bound-access
- -readability-identifier-length
- -readability-magic-numbers
- -bugprone-narrowing-conversions
- -performance-enum-size
- -performance-inefficient-string-concatenation
- -bugprone-integer-division
- -bugprone-easily-swappable-parameters
- -modernize-avoid-c-arrays,-warnings-as-errors
WarningsAsErrors: '*'
# Solo incluir archivos de tu código fuente
HeaderFilterRegex: '^source/(sections|ui)/.*'
FormatStyle: file
CheckOptions:
# Variables locales en snake_case
- { key: readability-identifier-naming.VariableCase, value: lower_case }
# Miembros privados en snake_case con sufijo _
- { key: readability-identifier-naming.PrivateMemberCase, value: lower_case }
- { key: readability-identifier-naming.PrivateMemberSuffix, value: _ }
# Miembros protegidos en snake_case con sufijo _
- { key: readability-identifier-naming.ProtectedMemberCase, value: lower_case }
- { key: readability-identifier-naming.ProtectedMemberSuffix, value: _ }
# Miembros públicos en snake_case (sin sufijo)
- { key: readability-identifier-naming.PublicMemberCase, value: lower_case }
# Namespaces en CamelCase
- { key: readability-identifier-naming.NamespaceCase, value: CamelCase }
# Variables estáticas privadas como miembros privados
- { key: readability-identifier-naming.StaticVariableCase, value: lower_case }
- { key: readability-identifier-naming.StaticVariableSuffix, value: _ }
# Constantes estáticas sin sufijo
- { key: readability-identifier-naming.StaticConstantCase, value: UPPER_CASE }
# Constantes globales en UPPER_CASE
- { key: readability-identifier-naming.GlobalConstantCase, value: UPPER_CASE }
# Variables constexpr globales en UPPER_CASE
- { key: readability-identifier-naming.ConstexprVariableCase, value: UPPER_CASE }
# Constantes locales en UPPER_CASE
- { key: readability-identifier-naming.LocalConstantCase, value: UPPER_CASE }
# Constexpr miembros en UPPER_CASE (sin sufijo)
- { key: readability-identifier-naming.ConstexprMemberCase, value: UPPER_CASE }
# Constexpr miembros privados/protegidos con sufijo _
- { key: readability-identifier-naming.ConstexprMethodCase, value: UPPER_CASE }
# Clases, structs y enums en CamelCase
- { key: readability-identifier-naming.ClassCase, value: CamelCase }
- { key: readability-identifier-naming.StructCase, value: CamelCase }
- { key: readability-identifier-naming.EnumCase, value: CamelCase }
# Valores de enums en UPPER_CASE
- { key: readability-identifier-naming.EnumConstantCase, value: UPPER_CASE }
# Métodos en camelBack (sin sufijos)
- { key: readability-identifier-naming.MethodCase, value: camelBack }
- { key: readability-identifier-naming.PrivateMethodCase, value: camelBack }
- { key: readability-identifier-naming.ProtectedMethodCase, value: camelBack }
- { key: readability-identifier-naming.PublicMethodCase, value: camelBack }
# Funciones en camelBack
- { key: readability-identifier-naming.FunctionCase, value: camelBack }
# Parámetros en lower_case
- { key: readability-identifier-naming.ParameterCase, value: lower_case }

11
.gitignore vendored
View File

@@ -1,4 +1,4 @@
.vscode
.vscode/
*data/config/config.txt
*stats.txt
*.DS_Store
@@ -11,8 +11,13 @@ thumbs.db
*.zip
*.app
*_debug*
sync_jail_engine.sh
jaildoctors_dilemma*
todo
build/
linux_utils/
linux_utils/
.claude/
source/version.h
resources.pack
jdd_release/
tools/pack_resources/pack_resources
tools/pack_resources/pack_resources.exe

835
CLAUDE.md Normal file
View File

@@ -0,0 +1,835 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
---
# JailDoctor's Dilemma - Codebase Architecture Guide
## Overview
**JailDoctor's Dilemma** is a retro-style 2D puzzle platformer game built in C++20 using SDL3 for graphics and audio. The game features 60+ rooms, collectible items, enemies, and an achievement system. It targets multiple platforms (Windows, macOS, Linux) with a focus on retro aesthetics and precise collision detection.
**Language:** C++20
**Graphics:** SDL3, OpenGL
**Audio:** SDL3 + custom jail_audio library
**Build:** CMake 3.10+
**Game Canvas:** 256x192 pixels (retro resolution)
---
## Build Commands
### Initial Setup & Build
```bash
# From project root
mkdir -p build
cd build
cmake ..
cmake --build .
```
### Rebuild After Changes
```bash
# From build directory
cmake --build .
# Or from project root
cmake --build build
```
### Clean Build
```bash
# From build directory
cmake --build . --clean-first
# Or from project root
cmake --build build --clean-first
```
### Run the Game
```bash
# Executable is placed in project root
./jaildoctors_dilemma
```
**Important:** The build directory is `/Users/sergio/Gitea/jaildoctors_dilemma/build` and the output executable is placed in the project root directory.
### Linter (clang-tidy)
**IMPORTANT:** Always run the linter on specific files, NOT on the entire project, to avoid long execution times and errors in unrelated files.
```bash
# Analyze a specific file (RECOMMENDED)
tools/linter/run_clang-tidy.sh source/game/entities/player.cpp
# Analyze multiple specific files
tools/linter/run_clang-tidy.sh source/game/entities/player.cpp source/game/entities/enemy.cpp
# Apply fixes automatically to a specific file
tools/linter/run_clang-tidy.sh --fix source/game/entities/player.cpp
# Analyze entire project (SLOW, may have errors in defaults.hpp)
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.
---
## 1. High-Level Architecture Overview
The architecture follows a **layered, modular design** with clear separation of concerns:
```
┌─────────────────────────────────────┐
│ Application Layer │
│ (Director, Scene Manager) │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ Game Logic Layer │
│ (Game Scene, Entities, Gameplay) │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ Core Systems Layer │
│ (Rendering, Audio, Input, Resources)│
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ SDL3 & External Libraries │
│ (jail_audio, stb_image, stb_vorbis) │
└─────────────────────────────────────┘
```
### Key Design Principles
- **Singleton Pattern:** Core systems (Director, Screen, Audio, Input, Resource, Asset) use singleton pattern for global access
- **Scene-Based Architecture:** Game flow managed through discrete scenes (Logo, Title, Loading, Game, Ending, etc.)
- **Component-Based Entities:** Player, enemies, and items are discrete entities with render/update patterns
- **Resource Management:** All assets (textures, sounds, animations, tilemaps) cached through Resource singleton
- **Delta Time:** Frame-rate independent physics using DeltaTimer class
---
## 2. Directory Structure
```
source/
├── core/ # Core engine systems
│ ├── audio/ # Audio management
│ │ └── audio.hpp/cpp # Audio singleton (music, sounds, volumes)
│ ├── input/ # Input handling
│ │ ├── input.hpp/cpp # Input manager (keyboard, gamepad)
│ │ ├── global_inputs.hpp # Global input state
│ │ └── mouse.hpp # Mouse input
│ ├── rendering/ # Graphics rendering
│ │ ├── screen.hpp/cpp # Screen/window singleton, SDL renderer
│ │ ├── surface.hpp/cpp # 8-bit indexed color surface abstraction
│ │ ├── surface_sprite.hpp # Static sprite rendering
│ │ ├── surface_animated_sprite.hpp # Animated sprite with frame data
│ │ ├── surface_moving_sprite.hpp # Moving sprite with velocity
│ │ ├── texture.hpp/cpp # SDL texture wrapper
│ │ ├── text.hpp/cpp # Text rendering system
│ │ ├── gif.hpp/cpp # GIF image loader
│ │ ├── opengl/ # OpenGL shader backend
│ │ │ └── opengl_shader.hpp/cpp # CRT shader effects
│ │ └── shader_backend.hpp # Abstract shader interface
│ ├── resources/ # Asset & Resource management
│ │ ├── asset.hpp/cpp # Asset registry (file path mapping)
│ │ └── resource.hpp/cpp # Resource singleton (loads/caches assets)
│ └── system/ # System management
│ ├── director.hpp/cpp # Main application controller
│ ├── debug.hpp/cpp # Debug info overlay
│ └── global_events.hpp/cpp # Global event broadcasting
├── game/ # Game-specific logic
│ ├── entities/ # Game objects
│ │ ├── player.hpp/cpp # Player entity with physics
│ │ ├── enemy.hpp/cpp # Enemy entities
│ │ └── item.hpp/cpp # Collectible items
│ ├── gameplay/ # Core gameplay systems
│ │ ├── room.hpp/cpp # Room/level logic, tilemap, collision
│ │ ├── room_tracker.hpp/cpp # Tracks visited rooms
│ │ ├── scoreboard.hpp/cpp # Score display & data
│ │ ├── item_tracker.hpp/cpp # Tracks collected items
│ │ ├── stats.hpp/cpp # Game statistics
│ │ └── cheevos.hpp/cpp # Achievement system
│ ├── scenes/ # Game scenes (flow states)
│ │ ├── logo.hpp/cpp # JailGames logo screen
│ │ ├── loading_screen.hpp/cpp # Resource loading progress
│ │ ├── title.hpp/cpp # Title screen & menus
│ │ ├── game.hpp/cpp # Main gameplay loop
│ │ ├── game_over.hpp/cpp # Game over screen
│ │ ├── ending.hpp/cpp # Ending sequence 1
│ │ ├── ending2.hpp/cpp # Ending sequence 2
│ │ └── credits.hpp/cpp # Credits screen
│ ├── ui/ # User interface
│ │ └── notifier.hpp/cpp # Achievement/notification display
│ ├── options.hpp/cpp # Game configuration/options
│ ├── scene_manager.hpp # Scene flow state machine
│ ├── defaults.hpp # Game defaults constants
│ └── gameplay.hpp # Gameplay constants
├── external/ # Third-party libraries
│ ├── jail_audio.hpp/cpp # Custom audio library
│ ├── jail_audio.h # C interface for jail_audio
│ ├── stb_image.h # Image loading library
│ └── stb_vorbis.h # OGG Vorbis audio decoding
├── utils/ # Utility code
│ ├── delta_timer.hpp/cpp # Frame-rate independent timing
│ ├── defines.hpp # Game constants (resolutions, block sizes)
│ └── utils.hpp/cpp # Helper functions (colors, math)
└── main.cpp # Application entry point
config/ # Configuration files
└── assets.txt # Asset registry (text-based configuration)
data/ # Game assets
├── font/ # Bitmap fonts + descriptors
├── palette/ # Color palettes (.pal files)
├── shaders/ # GLSL vertex/fragment shaders
├── room/ # Tilemaps & room definitions (01.tmx-60.tmx)
├── tilesets/ # Tileset graphics
├── enemies/ # Enemy sprites & animations
├── player/ # Player sprites & animations
├── items/ # Item sprite sheets
├── music/ # Background music (OGG)
├── sound/ # Sound effects (WAV)
├── logo/ # Logo images
├── loading/ # Loading screen graphics
├── title/ # Title screen graphics
├── ending/ # Ending sequence images
└── credits/ # Credits screen assets
```
---
## 3. Key Architectural Patterns
### 3.1 Singleton Pattern (Core Systems)
Most core systems use thread-safe singleton pattern:
```cpp
class Screen {
private:
static Screen* screen_; // Singleton instance
Screen(); // Private constructor
~Screen();
public:
static void init(); // Creates singleton
static void destroy(); // Destroys singleton
static Screen* get(); // Accesses singleton
};
```
**Singleton Systems:**
- `Screen` - Rendering, window management, palette/shader effects
- `Input` - Keyboard & gamepad input binding and checking
- `Audio` - Music and sound effect playback
- `Resource` - Asset loading, caching, streaming
- `Asset` - Asset path registry and verification
- `Director` - Main application controller
- `Cheevos` - Achievement state management
- `Debug` - Debug information overlay
### 3.2 Scene-Based State Machine
The game uses a scene manager to control application flow:
```cpp
// namespace SceneManager
enum class Scene {
LOGO, LOADING_SCREEN, TITLE, CREDITS, GAME, DEMO,
GAME_OVER, ENDING, ENDING2, QUIT
};
inline Scene current = Scene::LOGO; // Global scene state
inline Options options = ...; // Transition options
```
**Scene Hierarchy:**
- Each scene runs its own update/render loop
- `Director` switches between scenes based on `SceneManager::current`
- Scenes can request transitions via `SceneManager::current` assignment
### 3.3 Entity-Component Pattern (Simplified)
Entities (Player, Enemies, Items) have:
- **Update** - Logic, physics, animation
- **Render** - Draw to screen surface
- **Collision** - Hit detection (player collides with room, enemies, items)
### 3.4 Surface-Based Rendering Pipeline
The rendering system uses a **8-bit indexed color** pipeline:
```
SurfaceData (pixel buffer)
Surface (palette + rendering operations)
SDL_Texture (GPU texture)
SDL_Renderer (to SDL_Window)
Display
```
**Key Components:**
- `Surface` - 8-bit indexed pixel buffer with palette support
- `SurfaceSprite` - Renders a fixed region of a surface
- `SurfaceAnimatedSprite` - Frame-based animation on top of sprite
- `SurfaceMovingSprite` - Adds velocity/position to animated sprite
- Supports color replacement, palette swapping, and shader effects (CRT)
### 3.5 Tile-Based Collision System
Rooms use a sophisticated collision detection system:
```cpp
class Room {
std::vector<LineHorizontal> bottom_floors_; // Ground surfaces
std::vector<LineHorizontal> top_floors_; // Ceiling surfaces
std::vector<LineVertical> left_walls_; // Left walls
std::vector<LineVertical> right_walls_; // Right walls
std::vector<LineDiagonal> left_slopes_; // Ramps going left
std::vector<LineDiagonal> right_slopes_; // Ramps going right
std::vector<LineHorizontal> conveyor_belt_floors_; // Moving platforms
};
```
**Collision Detection:**
- Player has collision points and "feet" points for fine-grained detection
- Room provides `check*Surfaces()` methods for collision resolution
- Supports ramps, slopes, conveyor belts, and auto-surfaces
- Enemies have axis-aligned bounding boxes
### 3.6 Sprite Animation System
Animation is data-driven:
```cpp
struct AnimationData {
std::string name;
std::vector<SDL_FRect> frames; // Frame rectangles
int speed; // Milliseconds per frame
int loop; // Frame to return to (-1 = no loop)
bool completed;
int current_frame;
int counter;
};
// Loaded from .ani files (list of animation names)
// Rendered with SurfaceAnimatedSprite
```
---
## 4. System Interactions & Data Flow
### 4.1 Application Lifecycle
```
main()
Director::Director() [Initialization]
├─ Options::init() - Load game configuration
├─ Asset::init() - Register asset paths
├─ Screen::init() - Create window, SDL renderer
├─ Audio::init() - Initialize SDL audio
├─ Input::init() - Bind keyboard/gamepad controls
├─ Resource::init() - Load all game resources
└─ Cheevos::init() - Load achievement state
Director::run() [Main loop]
├─ while (SceneManager::current != QUIT)
│ ├─ Logo::run()
│ ├─ LoadingScreen::run()
│ ├─ Title::run()
│ ├─ Game::run()
│ ├─ Ending::run()
│ └─ ...
└─ return 0
Director::~Director() [Cleanup]
├─ Options::saveToFile() - Save game settings
├─ Resource::destroy()
├─ Audio::destroy()
├─ Input::destroy()
├─ Screen::destroy()
└─ Asset::destroy()
```
### 4.2 Game Scene Flow (Core Gameplay Loop)
```cpp
Game::run() {
while (game is running) {
// Update
Input::checkInput() - Get player commands
Player::update() - Physics, animation, collision
Room::update() - Enemy AI, animated tiles
checkCollisions() - Player vs enemies, items, room
checkGameOver() - Win/lose conditions
// Render
Screen::start() - Prepare for drawing
Room::renderMap() - Draw tilemap
Room::renderEnemies() - Draw enemy sprites
Room::renderItems() - Draw item sprites
Player::render() - Draw player sprite
renderScoreboard() - Draw HUD
Screen::render() - Flush to GPU
}
}
```
### 4.3 Resource Loading & Caching
```
Director::setFileList()
├─ Asset::loadFromFile(config_path, PREFIX, system_folder_)
│ ├─ Read config/assets.txt - Parse text configuration file
│ ├─ Parse each line: TYPE|PATH|OPTIONS - Extract asset information
│ ├─ Replace variables (${PREFIX}, ${SYSTEM_FOLDER})
│ └─ Store in unordered_map (O(1) lookup) - Fast asset path retrieval
└─ Asset::check() - Verify required files exist
Game Scene initialization
└─ Resource::init() - Loads all resources
├─ loadSounds() - WAV files
├─ loadMusics() - OGG files
├─ loadSurfaces() - GIF/PNG images
├─ loadAnimations() - .ani animation definitions
├─ loadTileMaps() - .room tilemap data
└─ loadRooms() - Room metadata
During gameplay
└─ Resource::get*(name) - Return cached resource
```
### 4.4 Input Flow
```
SDL_Event (from OS)
Input::checkInput(action)
├─ Check keyboard bindings - SDL_Scancode → InputAction
├─ Check gamepad bindings - SDL_GamepadButton → InputAction
└─ Return true if action active
Game logic uses checked inputs
└─ Player responds to actions
```
### 4.5 Audio Control Flow
```
Game code
├─ Audio::playMusic(name, loop)
├─ Audio::playSound(name, group)
└─ Audio::stopMusic()
Audio [wrapper/manager]
├─ Resource::getMusic(name)
├─ Resource::getSound(name)
└─ jail_audio C library
└─ SDL3 Audio device
```
---
## 5. Important Design Patterns & Conventions
### 5.1 Naming Conventions
**Classes:**
- `PascalCase` for classes: `Player`, `Room`, `Screen`, `Director`
- Suffix `Sprite` for sprite classes: `SurfaceSprite`, `SurfaceAnimatedSprite`
**Methods:**
- `get*()` for getters: `getWidth()`, `getRect()`
- `set*()` for setters: `setColor()`, `setPos()`
- `check*()` for boolean checks: `checkInput()`, `checkCollision()`
- `update()` for game logic updates
- `render()` for drawing
**Variables:**
- `snake_case` for member variables with `_` suffix: `x_`, `y_`, `sprite_`
- `UPPER_CASE` for constants: `BLOCK`, `MAX_VY`, `WIDTH`
- Private members: `private_member_`
**Structs for Data:**
- `XxxData` suffix: `PlayerData`, `RoomData`, `AnimationData`
- Used as initialization structures passed to constructors
### 5.2 Memory Management
- **Smart Pointers:** Uses `std::shared_ptr` for shared ownership (Surfaces, Sprites, Rooms)
- **Unique Pointers:** Uses `std::unique_ptr` for sole ownership (Director, local objects)
- **Raw Pointers:** Minimal use, mainly for singleton access or SDL objects
- **Static Allocation:** Singletons use static pointer pattern for RAII
### 5.3 Frame-Independent Physics
Uses `DeltaTimer` for delta time calculation:
```cpp
// In game loop
float delta = deltaTimer.tick(); // Get seconds since last frame
// Apply to physics
player.vy_ += gravity * delta;
player.y_ += player.vy_ * delta;
```
Provides **time scaling** for slow-motion effects.
### 5.4 Palette System
- 8-bit indexed color (256 colors per palette)
- Multiple palettes can be loaded and swapped
- `Surface::setPalette()` changes rendering colors
- Supports color replacement per-render: `renderWithColorReplace()`
- CRT shader effects can modify colors in real-time
### 5.5 Configuration System
Game settings stored in configuration file:
```cpp
namespace Options {
inline Video video{}; // Screen resolution, fullscreen, etc.
inline Audio audio{}; // Music/sound volumes
inline Notification notifications{};
inline Cheat cheats{}; // Cheat codes
inline ControlScheme keys{}; // Control mapping
inline Stats stats{}; // Game statistics
}
Options::loadFromFile(path); // Load from config.txt
Options::saveToFile(path); // Save on exit
```
### 5.6 Achievement System
```cpp
struct Achievement {
int id;
std::string caption;
std::string description;
int icon;
bool completed;
bool obtainable;
};
Cheevos::unlock(id); // Unlock achievement
Cheevos::setUnobtainable(id); // Lock achievement
Cheevos::saveToFile(); // Persist state
```
Achievements trigger notifications on unlock.
---
## 6. Technology Stack
### Core Technologies
| Component | Technology | Version | Role |
|-----------|-----------|---------|------|
| **Graphics** | SDL3 | Latest | Window, rendering, input |
| **GPU Rendering** | OpenGL | 3.2+ | Shader effects (CRT) |
| **Audio** | SDL3 Audio | Latest | Audio device, mixing |
| **Audio Decoding** | jail_audio (custom) | 1.x | OGG/WAV playback |
| **Image Loading** | stb_image | v2.x | PNG/GIF image loading |
| **Audio Decoding** | stb_vorbis | v1.x | OGG Vorbis support |
| **Language** | C++ | C++20 | Standard library features |
| **Build System** | CMake | 3.10+ | Cross-platform building |
### C++ Features Used
- **Smart Pointers:** `std::shared_ptr`, `std::unique_ptr`
- **Standard Containers:** `std::vector`, `std::array`
- **Modern Features:** `std::move`, lambda functions, constexpr
- **Namespaces:** Extensive use for organization
- **Inline Variables:** C++17 `inline` for global game state
### Platform Support
- **Windows:** MinGW/MSVC with SDL3
- **macOS:** Apple Clang, arm64 architecture, OpenGL
- **Linux:** GCC with SDL3 and OpenGL
---
## 7. Key Classes & Their Responsibilities
### Core System Classes
| Class | Purpose | Pattern |
|-------|---------|---------|
| `Director` | Main application controller, scene manager | Singleton |
| `Screen` | Rendering, window, palette management | Singleton |
| `Input` | Keyboard & gamepad input | Singleton |
| `Audio` | Music and SFX playback | Singleton |
| `Resource` | Asset caching and loading | Singleton |
| `Asset` | Asset path registry from config/assets.txt, O(1) lookups, variable substitution | Singleton |
| `Debug` | Debug overlay information | Singleton |
| `globalEvents` | Global SDL event handling (quit, device reset, mouse) | Namespace |
### Game Logic Classes
| Class | Purpose |
|-------|---------|
| `Game` | Main gameplay scene, orchestrates update/render |
| `Player` | Player entity with physics and animation |
| `Room` | Level data, collision detection, tilemap rendering |
| `Enemy` | Enemy entity behavior and rendering |
| `Item` | Collectible items |
| `Scoreboard` | HUD display data |
| `Cheevos` | Achievement unlock and state |
| `ItemTracker` | Tracks collected items |
| `RoomTracker` | Tracks visited rooms |
### Rendering Classes
| Class | Purpose |
|-------|---------|
| `Surface` | 8-bit indexed color pixel buffer with palette |
| `SurfaceSprite` | Renders a sprite region |
| `SurfaceAnimatedSprite` | Frame-based animation rendering |
| `SurfaceMovingSprite` | Sprite with velocity/position |
| `Text` | Text rendering system |
| `OpenGLShader` | Shader compilation and effects |
### Utility Classes
| Class | Purpose |
|-------|---------|
| `DeltaTimer` | Frame-rate independent timing |
---
## 8. Common Development Workflows
### Adding a New Input Action
1. Add to `InputAction` enum in `core/input/input.hpp`
2. Bind in `Director::initInput()`:
```cpp
Input::get()->bindKey(InputAction::NEW_ACTION, SDL_SCANCODE_X);
```
3. Check in game code:
```cpp
if (Input::get()->checkInput(InputAction::NEW_ACTION)) {
// Handle action
}
```
### Adding a New Scene
1. Create class inheriting appropriate base (usually standalone `run()` method)
2. Add to `SceneManager::Scene` enum
3. Implement in `Director::run()` switch statement
4. Set `SceneManager::current` to transition
### Adding Game Assets
1. Place file in `data/` directory
2. Add entry to `config/assets.txt`:
```
TYPE|${PREFIX}/data/path/file.ext
```
Available types: `DATA`, `BITMAP`, `ANIMATION`, `MUSIC`, `SOUND`, `FONT`, `ROOM`, `TILEMAP`, `PALETTE`
3. Optional flags can be added: `TYPE|${PREFIX}/path/file.ext|optional,absolute`
4. Resource loads automatically during `Resource::init()`
5. Access via: `Resource::get()->getSurface("name")`
**Note:** No recompilation needed when adding/removing/modifying assets in `config/assets.txt`
### Modifying Collision Detection
1. Update `Room::setBottomSurfaces()`, `setLeftSlopes()`, etc.
2. Modify Player collision point generation in `Player::updateColliderPoints()`
3. Adjust tile classification in `TileType` enum
4. Test with debug visualization (F12 key)
---
## 9. Debug Features
### Available at Runtime
- **F12** - Toggle debug info overlay (FPS, player position, collision points)
- **F1/F2** - Decrease/increase window zoom
- **F3** - Toggle fullscreen mode
- **F4** - Toggle shader effects
- **F5/F6** - Next/previous palette
- **F7** - Toggle integer scaling
- **M** - Toggle music
- **B** - Toggle border display
- **P** - Pause game
### Debug Mode Compilation
In debug builds (`#ifdef DEBUG`), renders:
- Player collision boxes
- Collision point visualization
- Debug information overlay
- Special debug event handling
---
## 10. Performance Considerations
### Optimization Points
1. **Rendering:** Uses indexed color (8-bit) to reduce memory bandwidth
2. **Surfaces:** Shared smart pointers reduce copying
3. **Collision:** Pre-computed tile surface lists avoid per-frame searches
4. **Animation:** Frame-based animation reduces computation vs. bone systems
5. **Audio:** Cached music and sound effects, no runtime decoding
6. **Delta Time:** Frame-rate independent logic for smooth gameplay
### Known Limitations
- Single-threaded architecture (SDL3 requires single-thread rendering)
- Surfaces stored entirely in CPU memory (not GPU-side textures)
- Palette system requires full surface redraw when changing colors
---
## 11. File Format Reference
### Asset Configuration File (config/assets.txt)
Text-based asset registry with pipe-delimited format:
```
# Format: TYPE|PATH [|OPTIONS]
# Comments start with # or ;
# Variables: ${PREFIX}, ${SYSTEM_FOLDER}
# Options: optional, absolute (comma-separated)
# Example entries:
BITMAP|${PREFIX}/data/player/player.gif
ANIMATION|${PREFIX}/data/player/player.ani
MUSIC|${PREFIX}/data/music/title.ogg
DATA|${SYSTEM_FOLDER}/config.txt|optional,absolute
```
**Available Asset Types:**
- `DATA` - General data files (text, JSON, etc.)
- `BITMAP` - Images (GIF, PNG)
- `ANIMATION` - Animation definition files (.ani)
- `MUSIC` - Music files (OGG)
- `SOUND` - Sound effects (WAV)
- `FONT` - Font definition files
- `ROOM` - Room data files (.room)
- `TILEMAP` - Tilemap files (.tmx)
- `PALETTE` - Color palette files (.pal)
**Options:**
- `optional` - File is not required (won't fail check if missing)
- `absolute` - Path is absolute (not relative to executable)
**Variables:**
- `${PREFIX}` - Replaced with `/../Resources` on macOS bundles, empty otherwise
- `${SYSTEM_FOLDER}` - Replaced with user's system config folder
### Animation Files (.ani)
List of animation names, one per line:
```
default
jump
run
fall
```
### Room Data Files (.room)
Key-value pairs defining room properties:
```
number=01
name=Starting Room
bg_color=0x000000
border_color=0xFF00FF
...
```
### Tilemap Files (.tmx)
Tiled map format with tileset and collision data.
### Palette Files (.pal)
Binary 256-color palette format (256 × 4 bytes RGBA).
---
## 12. Quick Reference: Main Entry Points
### For Graphics Issues
- `Screen::render()` - Main rendering method
- `Screen::setPalete()` - Palette application
- `Surface` class - Pixel buffer operations
### For Input Issues
- `Input::checkInput()` - Input state checking
- `Director::initInput()` - Binding configuration
### For Audio Issues
- `Audio::playMusic()` - Music playback
- `Audio::playSound()` - SFX playback
- `jail_audio` library - Low-level audio operations
### For Game Logic
- `Game::run()` - Main game loop
- `Room` class - Collision and level logic
- `Player::update()` - Physics and movement
### For Asset Management
- `config/assets.txt` - Asset configuration file (text-based, no recompilation needed)
- `Asset::loadFromFile()` - Loads assets from config file
- `Asset::get()` - Retrieves asset path (O(1) lookup with unordered_map)
- `Resource::load()` - Asset loading
- `Director::setFileList()` - Calls `Asset::loadFromFile()` with PREFIX and system_folder
---
## 13. Future Enhancement Points
### Identified Areas for Expansion
1. **Network Play:** Stats upload to online service
2. **More Scenes:** Additional game modes
3. **Custom Rooms:** Level editor integration
4. **Audio Streaming:** Background music without loading entire file
5. **Particle System:** Visual effects for pickups/collisions
6. **Controller Feedback:** Haptic feedback for game events
7. **Accessibility:** Font scaling, color-blind modes, key remapping UI
---
## Development Notes
- **Language:** All code comments and some variable names are in Spanish (maintaining original author style)
- **Compilation:** Use CMake - automatically handles platform differences
- **Performance Profiling:** Use debug overlay (F12) for basic metrics; consider external profilers for deeper analysis
- **Common Warnings:** The codebase has been cleaned of the `struct`/`class` forward declaration inconsistency warnings that previously appeared
### Important Code Consistency Rules
1. **Forward Declarations:** Always use `class` for forward declarations of classes defined with `class` (not `struct`). The `Surface` class is defined as `class Surface` in `surface.hpp:57`, so all forward declarations must use `class Surface;`
2. **Singleton Pattern:** When creating new singletons, follow the existing pattern:
- Private static instance pointer
- Private constructor/destructor
- Public `init()`, `destroy()`, and `get()` methods
3. **Delta Time:** Always use `DeltaTimer` for frame-rate independent physics calculations
4. **Memory Management:** Prefer `std::shared_ptr` for shared resources (Surfaces, Sprites) and `std::unique_ptr` for sole ownership
---
**Last Updated:** November 2022 (per README)
**Original Author:** JailDesigner
**Repository:** Gitea (internal)

View File

@@ -3,83 +3,164 @@
cmake_minimum_required(VERSION 3.10)
project(jaildoctors_dilemma VERSION 1.00)
# Configuración de compilador para MinGW en Windows, si es necesario
if(WIN32 AND NOT CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
set(CMAKE_CXX_COMPILER "g++")
set(CMAKE_C_COMPILER "gcc")
endif()
# Establecer estándar de C++
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED True)
# Configuración global de flags de compilación
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Os -ffunction-sections -fdata-sections")
# Exportar comandos de compilación para herramientas de análisis
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# Define el directorio de los archivos fuente
set(DIR_SOURCES "${CMAKE_SOURCE_DIR}/source")
# 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)
# Cargar todos los archivos fuente en DIR_SOURCES
file(GLOB SOURCES "${DIR_SOURCES}/*.cpp")
# Verificar si se encontraron archivos fuente
if(NOT SOURCES)
message(FATAL_ERROR "No se encontraron archivos fuente en ${DIR_SOURCES}. Verifica que el directorio existe y contiene archivos .cpp.")
endif()
# Configuración de SDL2
find_package(SDL2 REQUIRED)
if(SDL2_FOUND)
message(STATUS "SDL2 encontrado: ${SDL2_INCLUDE_DIRS}")
include_directories(${SDL2_INCLUDE_DIRS})
link_directories(${SDL2_LIBDIR})
# --- GENERACIÓN DE VERSIÓN AUTOMÁTICA ---
find_package(Git QUIET)
if(GIT_FOUND)
execute_process(
COMMAND ${GIT_EXECUTABLE} rev-parse --short=7 HEAD
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE GIT_HASH
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
else()
message(FATAL_ERROR "SDL2 no encontrado")
set(GIT_HASH "unknown")
endif()
# Incluye rutas de SDL2 obtenidas con pkg-config
include_directories(/usr/local/include /usr/local/include/SDL2)
link_directories(/usr/local/lib)
# Configurar archivo de versión
configure_file(${CMAKE_SOURCE_DIR}/source/version.h.in ${CMAKE_BINARY_DIR}/version.h @ONLY)
# Definir las bibliotecas comunes
set(LIBS SDL2)
# --- 1. LISTA EXPLÍCITA DE FUENTES ---
set(APP_SOURCES
# Core - Audio
source/core/audio/audio.cpp
# Configuración común de salida de ejecutables en el directorio raíz
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR})
# Core - Input
source/core/input/global_inputs.cpp
source/core/input/input.cpp
source/core/input/input_types.cpp
source/core/input/mouse.cpp
# Añadir ejecutable principal
add_executable(${PROJECT_NAME} ${SOURCES})
# Core - Rendering
source/core/rendering/gif.cpp
source/core/rendering/screen.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/texture.cpp
# Añadir definiciones de compilación dependiendo del tipo de build
target_compile_definitions(${PROJECT_NAME} PRIVATE $<$<CONFIG:DEBUG>:DEBUG VERBOSE>)
# Core - Resources
source/core/resources/asset.cpp
source/core/resources/resource.cpp
source/core/resources/resource_pack.cpp
source/core/resources/resource_loader.cpp
source/core/resources/resource_helper.cpp
# Enlazar bibliotecas
target_link_libraries(${PROJECT_NAME} ${LIBS})
# Core - System
source/core/system/debug.cpp
source/core/system/director.cpp
source/core/system/global_events.cpp
# Game - Entities
source/game/entities/enemy.cpp
source/game/entities/item.cpp
source/game/entities/player.cpp
# Game - Configuration
source/game/options.cpp
# Game - Gameplay
source/game/gameplay/cheevos.cpp
source/game/gameplay/item_tracker.cpp
source/game/gameplay/room.cpp
source/game/gameplay/room_tracker.cpp
source/game/gameplay/scoreboard.cpp
source/game/gameplay/stats.cpp
# Game - Scenes
source/game/scenes/credits.cpp
source/game/scenes/ending.cpp
source/game/scenes/ending2.cpp
source/game/scenes/game.cpp
source/game/scenes/game_over.cpp
source/game/scenes/loading_screen.cpp
source/game/scenes/logo.cpp
source/game/scenes/title.cpp
# Game - UI
source/game/ui/notifier.cpp
# Utils
source/utils/delta_timer.cpp
source/utils/utils.cpp
# Main
source/main.cpp
)
# Fuentes de librerías de terceros
set(EXTERNAL_SOURCES
source/external/jail_audio.cpp
)
# Fuentes del sistema de renderizado
set(RENDERING_SOURCES
source/core/rendering/opengl/opengl_shader.cpp
)
# Configuración de SDL3
find_package(SDL3 REQUIRED CONFIG REQUIRED COMPONENTS SDL3)
message(STATUS "SDL3 encontrado: ${SDL3_INCLUDE_DIRS}")
# --- 2. AÑADIR EJECUTABLE ---
add_executable(${PROJECT_NAME} ${APP_SOURCES} ${EXTERNAL_SOURCES} ${RENDERING_SOURCES})
# --- 3. DIRECTORIOS DE INCLUSIÓN ---
target_include_directories(${PROJECT_NAME} PUBLIC
"${CMAKE_SOURCE_DIR}/source"
"${CMAKE_BINARY_DIR}"
)
# Enlazar la librería SDL3
target_link_libraries(${PROJECT_NAME} PRIVATE SDL3::SDL3)
# --- 4. CONFIGURACIÓN PLATAFORMAS Y COMPILADOR ---
# Configuración de flags de compilación
target_compile_options(${PROJECT_NAME} PRIVATE -Wall)
target_compile_options(${PROJECT_NAME} PRIVATE $<$<CONFIG:RELEASE>:-Os -ffunction-sections -fdata-sections>)
# Definir _DEBUG en modo Debug
target_compile_definitions(${PROJECT_NAME} PRIVATE $<$<CONFIG:DEBUG>:_DEBUG>)
# Configuración específica para cada plataforma
if(WIN32)
target_compile_definitions(${PROJECT_NAME} PRIVATE WINDOWS_BUILD)
target_link_libraries(${PROJECT_NAME} mingw32 opengl32 gdi32 winmm imm32 ole32 version)
target_link_libraries(${PROJECT_NAME} PRIVATE ws2_32 mingw32 opengl32)
elseif(APPLE)
set(LIBS ${LIBS} "-framework OpenGL")
target_compile_definitions(${PROJECT_NAME} PRIVATE MACOS_BUILD)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated")
# Configurar compilación para Apple Silicon
target_compile_options(${PROJECT_NAME} PRIVATE -Wno-deprecated)
set(CMAKE_OSX_ARCHITECTURES "arm64")
elseif(UNIX AND NOT APPLE)
set(LIBS ${LIBS} GL)
target_compile_definitions(${PROJECT_NAME} PRIVATE LINUX_BUILD)
target_link_libraries(${PROJECT_NAME} ${LIBS})
endif()
# Añadir OpenGL a las bibliotecas enlazadas
# 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} ${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
set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR})

22
LICENSE
View File

@@ -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
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.

445
Makefile
View File

@@ -1,145 +1,388 @@
executable = jaildoctors_dilemma
source = source/*.cpp
appName = JailDoctor's Dilemma
releaseFolder = jdd_release
version = v1.09
# ==============================================================================
# DIRECTORIES
# ==============================================================================
DIR_ROOT := $(dir $(abspath $(MAKEFILE_LIST)))
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
macosIntelRelease = $(executable)-$(version)-macos-intel.dmg
macosAppleSiliconRelease = $(executable)-$(version)-macos-apple-silicon.dmg
linuxRelease = $(executable)-$(version)-linux.tar.gz
# ==============================================================================
# TARGET NAMES
# ==============================================================================
TARGET_NAME := jaildoctors_dilemma
TARGET_FILE := $(DIR_BIN)$(TARGET_NAME)
APP_NAME := JailDoctor's Dilemma
RELEASE_FOLDER := jdd_release
RELEASE_FILE := $(RELEASE_FOLDER)/$(TARGET_NAME)
RESOURCE_FILE := release/jdd.res
# Specify the C++ standard
cpp_standard = c++20
# ==============================================================================
# PACKING TOOL
# ==============================================================================
ifeq ($(OS),Windows_NT)
PACK_TOOL := $(DIR_TOOLS)pack_resources/pack_resources.exe
PACK_CXX := $(CXX)
else
PACK_TOOL := $(DIR_TOOLS)pack_resources/pack_resources
PACK_CXX := $(CXX)
endif
PACK_SOURCES := $(DIR_TOOLS)pack_resources/pack_resources.cpp source/core/resources/resource_pack.cpp
PACK_INCLUDES := -Isource
# ==============================================================================
# VERSION (automatic based on date)
# ==============================================================================
ifeq ($(OS),Windows_NT)
VERSION := $(shell powershell -Command "Get-Date -Format 'yyyy-MM-dd'")
else
VERSION := $(shell date +%Y-%m-%d)
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 := $(TARGET_NAME)-$(VERSION)-win32-x64.zip
MACOS_INTEL_RELEASE := $(TARGET_NAME)-$(VERSION)-macos-intel.dmg
MACOS_APPLE_SILICON_RELEASE := $(TARGET_NAME)-$(VERSION)-macos-apple-silicon.dmg
LINUX_RELEASE := $(TARGET_NAME)-$(VERSION)-linux.tar.gz
# ==============================================================================
# SOURCE FILES
# ==============================================================================
APP_SOURCES := \
source/main.cpp \
source/core/audio/audio.cpp \
source/core/input/input.cpp \
source/core/input/input_types.cpp \
source/core/input/mouse.cpp \
source/core/input/global_inputs.cpp \
source/core/rendering/screen.cpp \
source/core/rendering/surface.cpp \
source/core/rendering/surface_sprite.cpp \
source/core/rendering/surface_animated_sprite.cpp \
source/core/rendering/surface_moving_sprite.cpp \
source/core/rendering/text.cpp \
source/core/rendering/texture.cpp \
source/core/rendering/gif.cpp \
source/core/rendering/opengl/opengl_shader.cpp \
source/core/resources/asset.cpp \
source/core/resources/resource.cpp \
source/core/resources/resource_helper.cpp \
source/core/resources/resource_loader.cpp \
source/core/resources/resource_pack.cpp \
source/core/system/director.cpp \
source/core/system/debug.cpp \
source/core/system/global_events.cpp \
source/game/options.cpp \
source/game/entities/player.cpp \
source/game/entities/enemy.cpp \
source/game/entities/item.cpp \
source/game/gameplay/room.cpp \
source/game/gameplay/scoreboard.cpp \
source/game/gameplay/cheevos.cpp \
source/game/gameplay/item_tracker.cpp \
source/game/gameplay/room_tracker.cpp \
source/game/gameplay/stats.cpp \
source/game/scenes/logo.cpp \
source/game/scenes/loading_screen.cpp \
source/game/scenes/title.cpp \
source/game/scenes/game.cpp \
source/game/scenes/game_over.cpp \
source/game/scenes/ending.cpp \
source/game/scenes/ending2.cpp \
source/game/scenes/credits.cpp \
source/game/ui/notifier.cpp \
source/utils/utils.cpp \
source/utils/delta_timer.cpp \
source/external/jail_audio.cpp
# ==============================================================================
# INCLUDES
# ==============================================================================
INCLUDES := -Isource
# ==============================================================================
# COMPILER FLAGS (OS-specific)
# ==============================================================================
CPP_STANDARD := c++20
ifeq ($(OS),Windows_NT)
FixPath = $(subst /,\\,$1)
CXXFLAGS := -std=$(CPP_STANDARD) -Wall -Os -ffunction-sections -fdata-sections \
-Wl,--gc-sections -static-libstdc++ -static-libgcc \
-Wl,-subsystem,windows -DWINDOWS_BUILD
CXXFLAGS_DEBUG := -std=$(CPP_STANDARD) -Wall -g -D_DEBUG -DWINDOWS_BUILD
LDFLAGS := -lmingw32 -lws2_32 -lSDL3 -lopengl32
RM := del /Q
MKDIR := mkdir
else
FixPath = $1
CXXFLAGS := -std=$(CPP_STANDARD) -Wall -Os -ffunction-sections -fdata-sections
CXXFLAGS_DEBUG := -std=$(CPP_STANDARD) -Wall -g -D_DEBUG
LDFLAGS := -lSDL3
RMFILE := rm -f
RMDIR := rm -rdf
MKDIR := mkdir -p
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Linux)
CXXFLAGS += -DLINUX_BUILD
LDFLAGS += -lGL
endif
ifeq ($(UNAME_S),Darwin)
CXXFLAGS += -Wno-deprecated -DMACOS_BUILD
CXXFLAGS_DEBUG += -Wno-deprecated -DMACOS_BUILD
LDFLAGS += -framework OpenGL
# Configurar arquitectura (por defecto arm64)
CXXFLAGS += -arch arm64
CXXFLAGS_DEBUG += -arch arm64
endif
endif
# ==============================================================================
# REGLAS PARA HERRAMIENTA DE EMPAQUETADO Y RESOURCES.PACK
# ==============================================================================
$(PACK_TOOL): FORCE
@echo "Compilando herramienta de empaquetado..."
$(PACK_CXX) -std=$(CPP_STANDARD) -Wall -Os $(PACK_INCLUDES) $(PACK_SOURCES) -o $(PACK_TOOL)
@echo "✓ Herramienta de empaquetado lista: $(PACK_TOOL)"
pack_tool: $(PACK_TOOL)
resources.pack: $(PACK_TOOL)
@echo "Generando resources.pack desde directorio data/..."
$(PACK_TOOL) data resources.pack
@echo "✓ resources.pack generado exitosamente"
# ==============================================================================
# COMPILACIÓN PARA WINDOWS
# ==============================================================================
windows:
@echo off
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
@echo Compilando para Windows con nombre: "$(WIN_TARGET_FILE).exe"
windres release/jdd.rc -O coff -o $(RESOURCE_FILE)
g++ $(APP_SOURCES) $(RESOURCE_FILE) $(INCLUDES) $(CXXFLAGS) $(LDFLAGS) -o "$(WIN_TARGET_FILE).exe"
strip -s -R .comment -R .gnu.version "$(WIN_TARGET_FILE).exe" --strip-unneeded
windows_debug:
@echo off
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"
strip -s -R .comment -R .gnu.version "$(executable)_debug.exe" --strip-unneeded
@echo Compilando version debug para Windows: "$(WIN_TARGET_FILE)_debug.exe"
g++ $(APP_SOURCES) $(INCLUDES) -DDEBUG -DVERBOSE $(CXXFLAGS_DEBUG) $(LDFLAGS) -o "$(WIN_TARGET_FILE)_debug.exe"
windows_release:
@$(MAKE) pack_tool
@$(MAKE) resources.pack
@echo off
@echo Creando release para Windows - Version: $(VERSION)
# Create release folder
powershell if (Test-Path "$(releaseFolder)") {Remove-Item "$(releaseFolder)" -Recurse -Force}
powershell if (-not (Test-Path "$(releaseFolder)")) {New-Item "$(releaseFolder)" -ItemType Directory}
# Generate version.h from version.h.in
@echo "Generando version.h..."
@powershell -Command "$$GIT_HASH = (git rev-parse --short=7 HEAD 2>$$null); if (-not $$GIT_HASH) { $$GIT_HASH = 'unknown' }; (Get-Content source/version.h.in) -replace '@GIT_HASH@', $$GIT_HASH | Set-Content source/version.h"
# Prepare data folder
powershell Copy-Item -Path "data" -Destination "$(releaseFolder)" -recurse -Force
powershell if (Test-Path "$(releaseFolder)\data\room\map.world") {Remove-Item "$(releaseFolder)\data\room\map.world" -Recurse -Force}
powershell if (Test-Path "$(releaseFolder)\data\room\standard.tsx") {Remove-Item "$(releaseFolder)\data\room\standard.tsx" -Recurse -Force}
# Copy root files
powershell Copy-Item "LICENSE" -Destination "$(releaseFolder)"
powershell Copy-Item "README.md" -Destination "$(releaseFolder)"
powershell Copy-Item "release\*.dll" -Destination "$(releaseFolder)"
# Crea carpeta temporal 'RELEASE_FOLDER'
powershell if (Test-Path "$(RELEASE_FOLDER)") {Remove-Item "$(RELEASE_FOLDER)" -Recurse -Force}
powershell if (-not (Test-Path "$(RELEASE_FOLDER)")) {New-Item "$(RELEASE_FOLDER)" -ItemType Directory}
# Build
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"
strip -s -R .comment -R .gnu.version "$(releaseFolder)/$(executable).exe" --strip-unneeded
# Copia el archivo 'resources.pack'
powershell Copy-Item -Path "resources.pack" -Destination "$(RELEASE_FOLDER)"
# Create ZIP
powershell if (Test-Path $(windowsRelease)) {Remove-Item $(windowsRelease)}
powershell Compress-Archive -Path "$(releaseFolder)"/* -DestinationPath $(windowsRelease)
# Copia los ficheros que están en la raíz del proyecto
powershell Copy-Item "LICENSE" -Destination "$(RELEASE_FOLDER)"
powershell Copy-Item "README.md" -Destination "$(RELEASE_FOLDER)"
powershell Copy-Item "gamecontrollerdb.txt" -Destination "$(RELEASE_FOLDER)"
powershell Copy-Item "release\*.dll" -Destination "$(RELEASE_FOLDER)"
# Remove folder
powershell if (Test-Path "$(releaseFolder)") {Remove-Item "$(releaseFolder)" -Recurse -Force}
# Compila (con icono)
windres release/jdd.rc -O coff -o $(RESOURCE_FILE)
g++ $(APP_SOURCES) $(RESOURCE_FILE) $(INCLUDES) -DRELEASE_BUILD $(CXXFLAGS) $(LDFLAGS) -o "$(WIN_RELEASE_FILE).exe"
strip -s -R .comment -R .gnu.version "$(WIN_RELEASE_FILE).exe" --strip-unneeded
# Crea el fichero .zip
powershell if (Test-Path "$(WINDOWS_RELEASE)") {Remove-Item "$(WINDOWS_RELEASE)"}
powershell Compress-Archive -Path "$(RELEASE_FOLDER)"/* -DestinationPath "$(WINDOWS_RELEASE)"
@echo Release creado: $(WINDOWS_RELEASE)
# Elimina la carpeta temporal 'RELEASE_FOLDER'
powershell if (Test-Path "$(RELEASE_FOLDER)") {Remove-Item "$(RELEASE_FOLDER)" -Recurse -Force}
# ==============================================================================
# COMPILACIÓN PARA MACOS
# ==============================================================================
macos:
clang++ $(source) -std=$(cpp_standard) -Wall -Os -lSDL2 -framework OpenGL -Wno-deprecated -ffunction-sections -fdata-sections -o "$(executable)"
@echo "Compilando para macOS: $(TARGET_NAME)"
clang++ $(APP_SOURCES) $(INCLUDES) $(CXXFLAGS) $(LDFLAGS) -o "$(TARGET_FILE)"
macos_debug:
clang++ $(source) -D DEBUG -std=$(cpp_standard) -Wall -Os -lSDL2 -framework OpenGL -Wno-deprecated -ffunction-sections -fdata-sections -o "$(executable)_debug"
@echo "Compilando version debug para macOS: $(TARGET_NAME)_debug"
clang++ $(APP_SOURCES) $(INCLUDES) -DDEBUG -DVERBOSE $(CXXFLAGS_DEBUG) $(LDFLAGS) -o "$(TARGET_FILE)_debug"
macos_release:
# Remove data and possible data from previous builds
rm -rdf "$(releaseFolder)"
rm -rdf Frameworks
rm -f tmp.dmg
rm -f "$(macosIntelRelease)"
rm -f "$(macosAppleSiliconRelease)"
@$(MAKE) pack_tool
@$(MAKE) resources.pack
@echo "Creando release para macOS - Version: $(VERSION)"
# Create folders
mkdir -p "$(releaseFolder)/$(appName).app/Contents/Frameworks"
mkdir -p "$(releaseFolder)/$(appName).app/Contents/MacOS"
mkdir -p "$(releaseFolder)/$(appName).app/Contents/Resources"
mkdir -p Frameworks
# Verificar e instalar create-dmg si es necesario
@which create-dmg > /dev/null || (echo "Instalando create-dmg..." && brew install create-dmg)
# Copy folders
cp -R data "$(releaseFolder)/$(appName).app/Contents/Resources"
cp -R release/SDL2.framework "$(releaseFolder)/$(appName).app/Contents/Frameworks"
cp -R release/SDL2.framework Frameworks
# Generate version.h from version.h.in
@echo "Generando version.h..."
@GIT_HASH=$$(git rev-parse --short=7 HEAD 2>/dev/null || echo "unknown"); \
sed "s/@GIT_HASH@/$$GIT_HASH/g" source/version.h.in > source/version.h
# Delete data
rm -f "$(releaseFolder)/$(appName).app/Contents/Resources/data/room/map.world"
rm -f "$(releaseFolder)/$(appName).app/Contents/Resources/data/room/standard.tsx"
# Elimina datos de compilaciones anteriores
$(RMDIR) "$(RELEASE_FOLDER)"
$(RMDIR) Frameworks
$(RMFILE) tmp.dmg
$(RMFILE) "$(MACOS_INTEL_RELEASE)"
$(RMFILE) "$(MACOS_APPLE_SILICON_RELEASE)"
# Copy files
cp release/*.icns "$(releaseFolder)/$(appName).app/Contents/Resources"
cp release/Info.plist "$(releaseFolder)/$(appName).app/Contents"
cp LICENSE "$(releaseFolder)"
cp README.md "$(releaseFolder)"
# Crea la carpeta temporal para hacer el trabajo y las carpetas obligatorias para crear una app de macOS
$(MKDIR) "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Frameworks"
$(MKDIR) "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/MacOS"
$(MKDIR) "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Resources"
$(MKDIR) Frameworks
# Create links
ln -s /Applications "$(releaseFolder)"/Applications
# Copia carpetas y ficheros
cp resources.pack "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Resources"
cp gamecontrollerdb.txt "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Resources"
cp -R release/frameworks/SDL3.xcframework/macos-arm64_x86_64/SDL3.framework "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Frameworks"
cp -R release/frameworks/SDL3.xcframework/macos-arm64_x86_64/SDL3.framework Frameworks
cp release/*.icns "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/Resources"
cp release/Info.plist "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents"
cp LICENSE "$(RELEASE_FOLDER)"
cp README.md "$(RELEASE_FOLDER)"
# Build INTEL
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.12
# Compila la versión para procesadores Intel
clang++ $(APP_SOURCES) $(INCLUDES) -DMACOS_BUNDLE -DRELEASE_BUILD -std=$(CPP_STANDARD) -Wall -Os -framework SDL3 -F ./Frameworks -framework OpenGL -Wno-deprecated -ffunction-sections -fdata-sections -o "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/MacOS/$(TARGET_NAME)" -rpath @executable_path/../Frameworks/ -target x86_64-apple-macos10.15
# Build INTEL DMG
hdiutil create tmp.dmg -ov -volname "$(appName)" -fs HFS+ -srcfolder "$(releaseFolder)"
hdiutil convert tmp.dmg -format UDZO -o "$(macosIntelRelease)"
rm -f tmp.dmg
# Firma la aplicación
codesign --deep --force --sign - --timestamp=none "$(RELEASE_FOLDER)/$(APP_NAME).app"
# Build APPLE SILICON
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
# Empaqueta el .dmg de la versión Intel con create-dmg
@echo "Creando DMG Intel con iconos de 96x96..."
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_INTEL_RELEASE)" \
"$(RELEASE_FOLDER)" || true
@echo "Release Intel creado: $(MACOS_INTEL_RELEASE)"
# Build APPLE SILICON DMG
hdiutil create tmp.dmg -ov -volname "$(appName)" -fs HFS+ -srcfolder "$(releaseFolder)"
hdiutil convert tmp.dmg -format UDZO -o "$(macosAppleSiliconRelease)"
rm -f tmp.dmg
# Compila la versión para procesadores Apple Silicon
clang++ $(APP_SOURCES) $(INCLUDES) -DMACOS_BUNDLE -DRELEASE_BUILD -std=$(CPP_STANDARD) -Wall -Os -framework SDL3 -F ./Frameworks -framework OpenGL -Wno-deprecated -ffunction-sections -fdata-sections -o "$(RELEASE_FOLDER)/$(APP_NAME).app/Contents/MacOS/$(TARGET_NAME)" -rpath @executable_path/../Frameworks/ -target arm64-apple-macos11
# Remove data
rm -rdf Frameworks
rm -rdf "$(releaseFolder)"
# Firma la aplicación
codesign --deep --force --sign - --timestamp=none "$(RELEASE_FOLDER)/$(APP_NAME).app"
# Empaqueta el .dmg de la versión Apple Silicon con create-dmg
@echo "Creando DMG Apple Silicon con iconos de 96x96..."
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) Frameworks
$(RMDIR) "$(RELEASE_FOLDER)"
# ==============================================================================
# COMPILACIÓN PARA LINUX
# ==============================================================================
linux:
g++ $(source) -std=$(cpp_standard) -Wall -Os -lSDL2 -lGL -ffunction-sections -fdata-sections -Wl,--gc-sections -o "$(executable)"
strip -s -R .comment -R .gnu.version "$(executable)" --strip-unneeded
@echo "Compilando para Linux: $(TARGET_NAME)"
g++ $(APP_SOURCES) $(INCLUDES) $(CXXFLAGS) $(LDFLAGS) -o "$(TARGET_FILE)"
strip -s -R .comment -R .gnu.version "$(TARGET_FILE)" --strip-unneeded
linux_debug:
g++ $(source) -D DEBUG -std=$(cpp_standard) -Wall -Os -lSDL2 -lGL -ffunction-sections -fdata-sections -Wl,--gc-sections -o "$(executable)_debug"
strip -s -R .comment -R .gnu.version "$(executable)_debug" --strip-unneeded
@echo "Compilando version debug para Linux: $(TARGET_NAME)_debug"
g++ $(APP_SOURCES) $(INCLUDES) -DDEBUG -DVERBOSE $(CXXFLAGS_DEBUG) $(LDFLAGS) -o "$(TARGET_FILE)_debug"
linux_release:
# Remove data
rm -rdf "$(releaseFolder)"
@$(MAKE) pack_tool
@$(MAKE) resources.pack
@echo "Creando release para Linux - Version: $(VERSION)"
# Create folders
mkdir -p "$(releaseFolder)"
# Generate version.h from version.h.in
@echo "Generando version.h..."
@GIT_HASH=$$(git rev-parse --short=7 HEAD 2>/dev/null || echo "unknown"); \
sed "s/@GIT_HASH@/$$GIT_HASH/g" source/version.h.in > source/version.h
# Copy data
cp -R data "$(releaseFolder)"
cp LICENSE "$(releaseFolder)"
cp README.md "$(releaseFolder)"
# Elimina carpetas previas
$(RMDIR) "$(RELEASE_FOLDER)"
# Delete data
rm -f "$(releaseFolder)/data/room/map.world"
rm -f "$(releaseFolder)/data/room/standard.tsx"
# Crea la carpeta temporal para realizar el lanzamiento
$(MKDIR) "$(RELEASE_FOLDER)"
# Build
g++ $(source) -std=$(cpp_standard) -Wall -Os -lSDL2 -lGL -ffunction-sections -fdata-sections -Wl,--gc-sections -o "$(releaseFolder)/$(executable)"
strip -s -R .comment -R .gnu.version "$(releaseFolder)/$(executable)" --strip-unneeded
# Copia ficheros
cp resources.pack "$(RELEASE_FOLDER)"
cp LICENSE "$(RELEASE_FOLDER)"
cp README.md "$(RELEASE_FOLDER)"
cp gamecontrollerdb.txt "$(RELEASE_FOLDER)"
# Pack files
rm -f "$(linuxRelease)"
cd "$(releaseFolder)" && tar -czvf "../$(linuxRelease)" *
# Compila
g++ $(APP_SOURCES) $(INCLUDES) -DRELEASE_BUILD $(CXXFLAGS) $(LDFLAGS) -o "$(RELEASE_FILE)"
strip -s -R .comment -R .gnu.version "$(RELEASE_FILE)" --strip-unneeded
# Remove data
rm -rdf "$(releaseFolder)"
# Empaqueta ficheros
$(RMFILE) "$(LINUX_RELEASE)"
tar -czvf "$(LINUX_RELEASE)" -C "$(RELEASE_FOLDER)" .
@echo "Release creado: $(LINUX_RELEASE)"
# Elimina la carpeta temporal
$(RMDIR) "$(RELEASE_FOLDER)"
# ==============================================================================
# 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 " windows - Compilar para Windows"
@echo " windows_debug - Compilar debug para Windows"
@echo " windows_release - Crear release completo para Windows"
@echo " linux - Compilar para Linux"
@echo " linux_debug - Compilar debug para Linux"
@echo " linux_release - Crear release completo para Linux"
@echo " macos - Compilar para macOS"
@echo " macos_debug - Compilar debug para macOS"
@echo " macos_release - Crear release completo para macOS"
@echo " pack_tool - Compilar herramienta de empaquetado"
@echo " resources.pack - Generar pack de recursos desde data/"
@echo " show_version - Mostrar version actual ($(VERSION))"
@echo " help - Mostrar esta ayuda"
FORCE:
.PHONY: windows windows_debug windows_release macos macos_debug macos_release linux linux_debug linux_release pack_tool resources.pack show_version help

View File

@@ -1,15 +1,19 @@
<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>
# 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.
![JailDoctor's Dilemma - Pantalla de títol](https://php.sustancia.synology.me/images/jdd/jdd_title.png)
JailDoc és un Jailer destacat entre els Jailers. Té més projectes començats que ningú i és qui més ajuda als altres a iniciar els seus.
Però un dia, va passar una cosa inesperada. Algú va acabar un projecte. Algú va alliberar el *Puzzle Jail Facker*. Un autèntic desaprensiu.
Això va fer que JailDoc prenguera una decisió: acabaria i lliuraria un dels seus projectes. Però, quin? *JailBattle*? *Sigmasuá*? *Calculín Doom*? Quin dilema! Finalment, es va arromangar i va decidir acabar i lliurar **tots** els seus projectes inacabats. Ho aconseguirà?
<br clear="left">
---
## Jugabilitat
@@ -36,9 +40,11 @@ El joc permet tant l'ús del teclat com d'un comandament. Les tecles per a jugar
- **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**: Canvia la paleta de colors del joc.
- **Tecla B**: Activa o desactiva el marge de colors en 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.
![JailDoctor's Dilemma - Gameplay](https://php.sustancia.synology.me/images/jdd/jdd_game2.png)

399
config/assets.txt Normal file
View File

@@ -0,0 +1,399 @@
# JailDoctor's Dilemma - Asset Configuration
# Format: TYPE|PATH [|OPTIONS]
# Options: optional, absolute (comma-separated)
# Variables: ${PREFIX}, ${SYSTEM_FOLDER}
# ===================================================================
# FONTS
# ===================================================================
BITMAP|${PREFIX}/data/font/smb2.gif
FONT|${PREFIX}/data/font/smb2.txt
BITMAP|${PREFIX}/data/font/aseprite.gif
FONT|${PREFIX}/data/font/aseprite.txt
BITMAP|${PREFIX}/data/font/gauntlet.gif
FONT|${PREFIX}/data/font/gauntlet.txt
BITMAP|${PREFIX}/data/font/subatomic.gif
FONT|${PREFIX}/data/font/subatomic.txt
BITMAP|${PREFIX}/data/font/8bithud.gif
FONT|${PREFIX}/data/font/8bithud.txt
# ===================================================================
# PALETTES
# ===================================================================
PALETTE|${PREFIX}/data/palette/zx-spectrum.pal
PALETTE|${PREFIX}/data/palette/zx-spectrum-adjusted.pal
PALETTE|${PREFIX}/data/palette/zxarne-5-2.pal
PALETTE|${PREFIX}/data/palette/black-and-white.pal
PALETTE|${PREFIX}/data/palette/green-phosphor.pal
PALETTE|${PREFIX}/data/palette/orange-screen.pal
PALETTE|${PREFIX}/data/palette/ruzx-spectrum.pal
PALETTE|${PREFIX}/data/palette/ruzx-spectrum-revision-2.pal
PALETTE|${PREFIX}/data/palette/pico-8.pal
PALETTE|${PREFIX}/data/palette/sweetie-16.pal
PALETTE|${PREFIX}/data/palette/island-joy-16.pal
PALETTE|${PREFIX}/data/palette/lost-century.pal
PALETTE|${PREFIX}/data/palette/na16.pal
PALETTE|${PREFIX}/data/palette/steam-lords.pal
# ===================================================================
# SHADERS
# ===================================================================
DATA|${PREFIX}/data/shaders/crtpi_vertex.glsl
DATA|${PREFIX}/data/shaders/crtpi_fragment.glsl
DATA|${PREFIX}/data/shaders/crtpi_vertex_es.glsl
DATA|${PREFIX}/data/shaders/crtpi_fragment_es.glsl
# ===================================================================
# INPUT DATA (in root, not packed - SDL needs filesystem access)
# ===================================================================
DATA|${PREFIX}/gamecontrollerdb.txt
# ===================================================================
# SYSTEM FILES (optional, absolute paths)
# ===================================================================
DATA|${SYSTEM_FOLDER}/config.txt|optional,absolute
DATA|${SYSTEM_FOLDER}/stats_buffer.csv|optional,absolute
DATA|${SYSTEM_FOLDER}/stats.csv|optional,absolute
DATA|${SYSTEM_FOLDER}/cheevos.bin|optional,absolute
# ===================================================================
# ROOMS AND TILEMAPS (60 rooms)
# ===================================================================
TILEMAP|${PREFIX}/data/room/01.tmx
ROOM|${PREFIX}/data/room/01.room
TILEMAP|${PREFIX}/data/room/02.tmx
ROOM|${PREFIX}/data/room/02.room
TILEMAP|${PREFIX}/data/room/03.tmx
ROOM|${PREFIX}/data/room/03.room
TILEMAP|${PREFIX}/data/room/04.tmx
ROOM|${PREFIX}/data/room/04.room
TILEMAP|${PREFIX}/data/room/05.tmx
ROOM|${PREFIX}/data/room/05.room
TILEMAP|${PREFIX}/data/room/06.tmx
ROOM|${PREFIX}/data/room/06.room
TILEMAP|${PREFIX}/data/room/07.tmx
ROOM|${PREFIX}/data/room/07.room
TILEMAP|${PREFIX}/data/room/08.tmx
ROOM|${PREFIX}/data/room/08.room
TILEMAP|${PREFIX}/data/room/09.tmx
ROOM|${PREFIX}/data/room/09.room
TILEMAP|${PREFIX}/data/room/10.tmx
ROOM|${PREFIX}/data/room/10.room
TILEMAP|${PREFIX}/data/room/11.tmx
ROOM|${PREFIX}/data/room/11.room
TILEMAP|${PREFIX}/data/room/12.tmx
ROOM|${PREFIX}/data/room/12.room
TILEMAP|${PREFIX}/data/room/13.tmx
ROOM|${PREFIX}/data/room/13.room
TILEMAP|${PREFIX}/data/room/14.tmx
ROOM|${PREFIX}/data/room/14.room
TILEMAP|${PREFIX}/data/room/15.tmx
ROOM|${PREFIX}/data/room/15.room
TILEMAP|${PREFIX}/data/room/16.tmx
ROOM|${PREFIX}/data/room/16.room
TILEMAP|${PREFIX}/data/room/17.tmx
ROOM|${PREFIX}/data/room/17.room
TILEMAP|${PREFIX}/data/room/18.tmx
ROOM|${PREFIX}/data/room/18.room
TILEMAP|${PREFIX}/data/room/19.tmx
ROOM|${PREFIX}/data/room/19.room
TILEMAP|${PREFIX}/data/room/20.tmx
ROOM|${PREFIX}/data/room/20.room
TILEMAP|${PREFIX}/data/room/21.tmx
ROOM|${PREFIX}/data/room/21.room
TILEMAP|${PREFIX}/data/room/22.tmx
ROOM|${PREFIX}/data/room/22.room
TILEMAP|${PREFIX}/data/room/23.tmx
ROOM|${PREFIX}/data/room/23.room
TILEMAP|${PREFIX}/data/room/24.tmx
ROOM|${PREFIX}/data/room/24.room
TILEMAP|${PREFIX}/data/room/25.tmx
ROOM|${PREFIX}/data/room/25.room
TILEMAP|${PREFIX}/data/room/26.tmx
ROOM|${PREFIX}/data/room/26.room
TILEMAP|${PREFIX}/data/room/27.tmx
ROOM|${PREFIX}/data/room/27.room
TILEMAP|${PREFIX}/data/room/28.tmx
ROOM|${PREFIX}/data/room/28.room
TILEMAP|${PREFIX}/data/room/29.tmx
ROOM|${PREFIX}/data/room/29.room
TILEMAP|${PREFIX}/data/room/30.tmx
ROOM|${PREFIX}/data/room/30.room
TILEMAP|${PREFIX}/data/room/31.tmx
ROOM|${PREFIX}/data/room/31.room
TILEMAP|${PREFIX}/data/room/32.tmx
ROOM|${PREFIX}/data/room/32.room
TILEMAP|${PREFIX}/data/room/33.tmx
ROOM|${PREFIX}/data/room/33.room
TILEMAP|${PREFIX}/data/room/34.tmx
ROOM|${PREFIX}/data/room/34.room
TILEMAP|${PREFIX}/data/room/35.tmx
ROOM|${PREFIX}/data/room/35.room
TILEMAP|${PREFIX}/data/room/36.tmx
ROOM|${PREFIX}/data/room/36.room
TILEMAP|${PREFIX}/data/room/37.tmx
ROOM|${PREFIX}/data/room/37.room
TILEMAP|${PREFIX}/data/room/38.tmx
ROOM|${PREFIX}/data/room/38.room
TILEMAP|${PREFIX}/data/room/39.tmx
ROOM|${PREFIX}/data/room/39.room
TILEMAP|${PREFIX}/data/room/40.tmx
ROOM|${PREFIX}/data/room/40.room
TILEMAP|${PREFIX}/data/room/41.tmx
ROOM|${PREFIX}/data/room/41.room
TILEMAP|${PREFIX}/data/room/42.tmx
ROOM|${PREFIX}/data/room/42.room
TILEMAP|${PREFIX}/data/room/43.tmx
ROOM|${PREFIX}/data/room/43.room
TILEMAP|${PREFIX}/data/room/44.tmx
ROOM|${PREFIX}/data/room/44.room
TILEMAP|${PREFIX}/data/room/45.tmx
ROOM|${PREFIX}/data/room/45.room
TILEMAP|${PREFIX}/data/room/46.tmx
ROOM|${PREFIX}/data/room/46.room
TILEMAP|${PREFIX}/data/room/47.tmx
ROOM|${PREFIX}/data/room/47.room
TILEMAP|${PREFIX}/data/room/48.tmx
ROOM|${PREFIX}/data/room/48.room
TILEMAP|${PREFIX}/data/room/49.tmx
ROOM|${PREFIX}/data/room/49.room
TILEMAP|${PREFIX}/data/room/50.tmx
ROOM|${PREFIX}/data/room/50.room
TILEMAP|${PREFIX}/data/room/51.tmx
ROOM|${PREFIX}/data/room/51.room
TILEMAP|${PREFIX}/data/room/52.tmx
ROOM|${PREFIX}/data/room/52.room
TILEMAP|${PREFIX}/data/room/53.tmx
ROOM|${PREFIX}/data/room/53.room
TILEMAP|${PREFIX}/data/room/54.tmx
ROOM|${PREFIX}/data/room/54.room
TILEMAP|${PREFIX}/data/room/55.tmx
ROOM|${PREFIX}/data/room/55.room
TILEMAP|${PREFIX}/data/room/56.tmx
ROOM|${PREFIX}/data/room/56.room
TILEMAP|${PREFIX}/data/room/57.tmx
ROOM|${PREFIX}/data/room/57.room
TILEMAP|${PREFIX}/data/room/58.tmx
ROOM|${PREFIX}/data/room/58.room
TILEMAP|${PREFIX}/data/room/59.tmx
ROOM|${PREFIX}/data/room/59.room
TILEMAP|${PREFIX}/data/room/60.tmx
ROOM|${PREFIX}/data/room/60.room
# ===================================================================
# TILESETS
# ===================================================================
BITMAP|${PREFIX}/data/tilesets/standard.gif
# ===================================================================
# ENEMIES
# ===================================================================
ANIMATION|${PREFIX}/data/enemies/abad_bell.ani
BITMAP|${PREFIX}/data/enemies/abad_bell.gif
ANIMATION|${PREFIX}/data/enemies/abad.ani
BITMAP|${PREFIX}/data/enemies/abad.gif
ANIMATION|${PREFIX}/data/enemies/amstrad_cs.ani
BITMAP|${PREFIX}/data/enemies/amstrad_cs.gif
ANIMATION|${PREFIX}/data/enemies/flying_arounder.ani
BITMAP|${PREFIX}/data/enemies/flying_arounder.gif
ANIMATION|${PREFIX}/data/enemies/stopped_arounder.ani
BITMAP|${PREFIX}/data/enemies/stopped_arounder.gif
ANIMATION|${PREFIX}/data/enemies/walking_arounder.ani
BITMAP|${PREFIX}/data/enemies/walking_arounder.gif
ANIMATION|${PREFIX}/data/enemies/arounders_door.ani
BITMAP|${PREFIX}/data/enemies/arounders_door.gif
ANIMATION|${PREFIX}/data/enemies/arounders_machine.ani
BITMAP|${PREFIX}/data/enemies/arounders_machine.gif
ANIMATION|${PREFIX}/data/enemies/bat.ani
BITMAP|${PREFIX}/data/enemies/bat.gif
ANIMATION|${PREFIX}/data/enemies/batman_bell.ani
BITMAP|${PREFIX}/data/enemies/batman_bell.gif
ANIMATION|${PREFIX}/data/enemies/batman_fire.ani
BITMAP|${PREFIX}/data/enemies/batman_fire.gif
ANIMATION|${PREFIX}/data/enemies/batman.ani
BITMAP|${PREFIX}/data/enemies/batman.gif
ANIMATION|${PREFIX}/data/enemies/bell.ani
BITMAP|${PREFIX}/data/enemies/bell.gif
ANIMATION|${PREFIX}/data/enemies/bin.ani
BITMAP|${PREFIX}/data/enemies/bin.gif
ANIMATION|${PREFIX}/data/enemies/bird.ani
BITMAP|${PREFIX}/data/enemies/bird.gif
ANIMATION|${PREFIX}/data/enemies/breakout.ani
BITMAP|${PREFIX}/data/enemies/breakout.gif
ANIMATION|${PREFIX}/data/enemies/bry.ani
BITMAP|${PREFIX}/data/enemies/bry.gif
ANIMATION|${PREFIX}/data/enemies/chip.ani
BITMAP|${PREFIX}/data/enemies/chip.gif
ANIMATION|${PREFIX}/data/enemies/code.ani
BITMAP|${PREFIX}/data/enemies/code.gif
ANIMATION|${PREFIX}/data/enemies/congo.ani
BITMAP|${PREFIX}/data/enemies/congo.gif
ANIMATION|${PREFIX}/data/enemies/crosshair.ani
BITMAP|${PREFIX}/data/enemies/crosshair.gif
ANIMATION|${PREFIX}/data/enemies/demon.ani
BITMAP|${PREFIX}/data/enemies/demon.gif
ANIMATION|${PREFIX}/data/enemies/dimallas.ani
BITMAP|${PREFIX}/data/enemies/dimallas.gif
ANIMATION|${PREFIX}/data/enemies/floppy.ani
BITMAP|${PREFIX}/data/enemies/floppy.gif
ANIMATION|${PREFIX}/data/enemies/dong.ani
BITMAP|${PREFIX}/data/enemies/dong.gif
ANIMATION|${PREFIX}/data/enemies/guitar.ani
BITMAP|${PREFIX}/data/enemies/guitar.gif
ANIMATION|${PREFIX}/data/enemies/heavy.ani
BITMAP|${PREFIX}/data/enemies/heavy.gif
ANIMATION|${PREFIX}/data/enemies/jailer_#1.ani
BITMAP|${PREFIX}/data/enemies/jailer_#1.gif
ANIMATION|${PREFIX}/data/enemies/jailer_#2.ani
BITMAP|${PREFIX}/data/enemies/jailer_#2.gif
ANIMATION|${PREFIX}/data/enemies/jailer_#3.ani
BITMAP|${PREFIX}/data/enemies/jailer_#3.gif
ANIMATION|${PREFIX}/data/enemies/jailbattle_alien.ani
BITMAP|${PREFIX}/data/enemies/jailbattle_alien.gif
ANIMATION|${PREFIX}/data/enemies/jailbattle_human.ani
BITMAP|${PREFIX}/data/enemies/jailbattle_human.gif
ANIMATION|${PREFIX}/data/enemies/jeannine.ani
BITMAP|${PREFIX}/data/enemies/jeannine.gif
ANIMATION|${PREFIX}/data/enemies/lamp.ani
BITMAP|${PREFIX}/data/enemies/lamp.gif
ANIMATION|${PREFIX}/data/enemies/lord_abad.ani
BITMAP|${PREFIX}/data/enemies/lord_abad.gif
ANIMATION|${PREFIX}/data/enemies/matatunos.ani
BITMAP|${PREFIX}/data/enemies/matatunos.gif
ANIMATION|${PREFIX}/data/enemies/mummy.ani
BITMAP|${PREFIX}/data/enemies/mummy.gif
ANIMATION|${PREFIX}/data/enemies/paco.ani
BITMAP|${PREFIX}/data/enemies/paco.gif
ANIMATION|${PREFIX}/data/enemies/elsa.ani
BITMAP|${PREFIX}/data/enemies/elsa.gif
ANIMATION|${PREFIX}/data/enemies/qvoid.ani
BITMAP|${PREFIX}/data/enemies/qvoid.gif
ANIMATION|${PREFIX}/data/enemies/robot.ani
BITMAP|${PREFIX}/data/enemies/robot.gif
ANIMATION|${PREFIX}/data/enemies/sam.ani
BITMAP|${PREFIX}/data/enemies/sam.gif
ANIMATION|${PREFIX}/data/enemies/shock.ani
BITMAP|${PREFIX}/data/enemies/shock.gif
ANIMATION|${PREFIX}/data/enemies/sigmasua.ani
BITMAP|${PREFIX}/data/enemies/sigmasua.gif
ANIMATION|${PREFIX}/data/enemies/spark.ani
BITMAP|${PREFIX}/data/enemies/spark.gif
ANIMATION|${PREFIX}/data/enemies/special/aerojailer.ani
BITMAP|${PREFIX}/data/enemies/special/aerojailer.gif
ANIMATION|${PREFIX}/data/enemies/special/arounder.ani
BITMAP|${PREFIX}/data/enemies/special/arounder.gif
ANIMATION|${PREFIX}/data/enemies/special/pepe_rosita_job.ani
BITMAP|${PREFIX}/data/enemies/special/pepe_rosita_job.gif
ANIMATION|${PREFIX}/data/enemies/special/shooting_star.ani
BITMAP|${PREFIX}/data/enemies/special/shooting_star.gif
ANIMATION|${PREFIX}/data/enemies/spider.ani
BITMAP|${PREFIX}/data/enemies/spider.gif
ANIMATION|${PREFIX}/data/enemies/tree_thing.ani
BITMAP|${PREFIX}/data/enemies/tree_thing.gif
ANIMATION|${PREFIX}/data/enemies/tuno.ani
BITMAP|${PREFIX}/data/enemies/tuno.gif
ANIMATION|${PREFIX}/data/enemies/tv_panel.ani
BITMAP|${PREFIX}/data/enemies/tv_panel.gif
ANIMATION|${PREFIX}/data/enemies/tv.ani
BITMAP|${PREFIX}/data/enemies/tv.gif
ANIMATION|${PREFIX}/data/enemies/upv_student.ani
BITMAP|${PREFIX}/data/enemies/upv_student.gif
ANIMATION|${PREFIX}/data/enemies/wave.ani
BITMAP|${PREFIX}/data/enemies/wave.gif
ANIMATION|${PREFIX}/data/enemies/z80.ani
BITMAP|${PREFIX}/data/enemies/z80.gif
# ===================================================================
# PLAYER
# ===================================================================
BITMAP|${PREFIX}/data/player/player.gif
ANIMATION|${PREFIX}/data/player/player.ani
BITMAP|${PREFIX}/data/player/player2.gif
ANIMATION|${PREFIX}/data/player/player2.ani
BITMAP|${PREFIX}/data/player/player_game_over.gif
ANIMATION|${PREFIX}/data/player/player_game_over.ani
# ===================================================================
# ITEMS
# ===================================================================
BITMAP|${PREFIX}/data/items/items.gif
# ===================================================================
# MUSIC
# ===================================================================
MUSIC|${PREFIX}/data/music/title.ogg
MUSIC|${PREFIX}/data/music/game.ogg
MUSIC|${PREFIX}/data/music/loading_data1.ogg
MUSIC|${PREFIX}/data/music/loading_data2.ogg
MUSIC|${PREFIX}/data/music/loading_header.ogg
MUSIC|${PREFIX}/data/music/loading_screen_color.ogg
MUSIC|${PREFIX}/data/music/loading_screen_data.ogg
MUSIC|${PREFIX}/data/music/ending1.ogg
MUSIC|${PREFIX}/data/music/ending2.ogg
MUSIC|${PREFIX}/data/music/game_over.ogg
# ===================================================================
# SOUND EFFECTS
# ===================================================================
SOUND|${PREFIX}/data/sound/item.wav
SOUND|${PREFIX}/data/sound/death.wav
SOUND|${PREFIX}/data/sound/notify.wav
# Jump sounds (1-24)
SOUND|${PREFIX}/data/sound/jump1.wav
SOUND|${PREFIX}/data/sound/jump2.wav
SOUND|${PREFIX}/data/sound/jump3.wav
SOUND|${PREFIX}/data/sound/jump4.wav
SOUND|${PREFIX}/data/sound/jump5.wav
SOUND|${PREFIX}/data/sound/jump6.wav
SOUND|${PREFIX}/data/sound/jump7.wav
SOUND|${PREFIX}/data/sound/jump8.wav
SOUND|${PREFIX}/data/sound/jump9.wav
SOUND|${PREFIX}/data/sound/jump10.wav
SOUND|${PREFIX}/data/sound/jump11.wav
SOUND|${PREFIX}/data/sound/jump12.wav
SOUND|${PREFIX}/data/sound/jump13.wav
SOUND|${PREFIX}/data/sound/jump14.wav
SOUND|${PREFIX}/data/sound/jump15.wav
SOUND|${PREFIX}/data/sound/jump16.wav
SOUND|${PREFIX}/data/sound/jump17.wav
SOUND|${PREFIX}/data/sound/jump18.wav
SOUND|${PREFIX}/data/sound/jump19.wav
SOUND|${PREFIX}/data/sound/jump20.wav
SOUND|${PREFIX}/data/sound/jump21.wav
SOUND|${PREFIX}/data/sound/jump22.wav
SOUND|${PREFIX}/data/sound/jump23.wav
SOUND|${PREFIX}/data/sound/jump24.wav
# ===================================================================
# LOGO
# ===================================================================
BITMAP|${PREFIX}/data/logo/jailgames.gif
BITMAP|${PREFIX}/data/logo/since_1998.gif
# ===================================================================
# LOADING SCREEN
# ===================================================================
BITMAP|${PREFIX}/data/loading/loading_screen_bn.gif
BITMAP|${PREFIX}/data/loading/loading_screen_color.gif
BITMAP|${PREFIX}/data/loading/program_jaildoc.gif
# ===================================================================
# TITLE SCREEN
# ===================================================================
BITMAP|${PREFIX}/data/title/title_logo.gif
# ===================================================================
# ENDING SCREENS
# ===================================================================
BITMAP|${PREFIX}/data/ending/ending1.gif
BITMAP|${PREFIX}/data/ending/ending2.gif
BITMAP|${PREFIX}/data/ending/ending3.gif
BITMAP|${PREFIX}/data/ending/ending4.gif
BITMAP|${PREFIX}/data/ending/ending5.gif
# ===================================================================
# CREDITS
# ===================================================================
BITMAP|${PREFIX}/data/credits/shine.gif
ANIMATION|${PREFIX}/data/credits/shine.ani

View File

@@ -1,9 +1,10 @@
tileSetFile=shine.gif
frame_width=8
frame_height=8
[animation]
name=default
speed=6
speed=0.1000
loop=-1
frames=0,1,2,3,4,5,6,7
[/animation]

BIN
data/credits/shine.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 148 B

BIN
data/ending/ending1.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1014 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

BIN
data/ending/ending2.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

BIN
data/ending/ending3.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

BIN
data/ending/ending4.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

BIN
data/ending/ending5.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -1,9 +1,10 @@
tileSetFile=abad.gif
frame_width=8
frame_height=16
[animation]
name=default
speed=8
speed=0.1333
loop=0
frames=0,1,2
[/animation]

BIN
data/enemies/abad.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 267 B

View File

@@ -1,9 +1,10 @@
tileSetFile=abad_bell.gif
frame_width=16
frame_height=16
[animation]
name=default
speed=4
speed=0.0667
loop=0
frames=0,1,2,3,4,5,6,7,8,9
[/animation]

BIN
data/enemies/abad_bell.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 384 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 555 B

View File

@@ -1,9 +1,10 @@
tileSetFile=amstrad_cs.gif
frame_width=8
frame_height=8
[animation]
name=default
speed=4
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
[/animation]

BIN
data/enemies/amstrad_cs.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

View File

@@ -1,9 +1,10 @@
tileSetFile=arounders_door.gif
frame_width=16
frame_height=16
[animation]
name=default
speed=8
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
[/animation]

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 250 B

View File

@@ -1,9 +1,10 @@
tileSetFile=arounders_machine.gif
frame_width=16
frame_height=16
[animation]
name=default
speed=4
speed=0.0667
loop=0
frames=0,1,2,3
[/animation]

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 234 B

View File

@@ -1,9 +1,10 @@
tileSetFile=bat.gif
frame_width=9
frame_height=7
[animation]
name=default
speed=3
speed=0.0500
loop=0
frames=0,1
[/animation]

BIN
data/enemies/bat.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 B

View File

@@ -1,9 +1,10 @@
tileSetFile=batman.gif
frame_width=8
frame_height=16
[animation]
name=default
speed=8
speed=0.1333
loop=0
frames=0,1,2,3
[/animation]

BIN
data/enemies/batman.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 241 B

View File

@@ -1,9 +1,10 @@
tileSetFile=batman_bell.gif
frame_width=16
frame_height=16
[animation]
name=default
speed=6
speed=0.1000
loop=0
frames=0,1,2,3,4,5
[/animation]

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 415 B

View File

@@ -1,9 +1,10 @@
tileSetFile=batman_fire.gif
frame_width=16
frame_height=16
[animation]
name=default
speed=4
speed=0.0667
loop=0
frames=0,1,2,3
[/animation]

Binary file not shown.

After

Width:  |  Height:  |  Size: 213 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 343 B

View File

@@ -1,9 +1,10 @@
tileSetFile=bell.gif
frame_width=16
frame_height=16
[animation]
name=default
speed=6
speed=0.1000
loop=0
frames=0,1,2,3,4,5,6,7,8,9,10,11
[/animation]

BIN
data/enemies/bell.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 412 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 509 B

View File

@@ -1,9 +1,10 @@
tileSetFile=bin.gif
frame_width=16
frame_height=8
[animation]
name=default
speed=10
speed=0.1667
loop=0
frames=0,1,2,3,4
[/animation]

BIN
data/enemies/bin.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 174 B

View File

@@ -1,9 +1,10 @@
tileSetFile=bird.gif
frame_width=16
frame_height=16
[animation]
name=default
speed=8
speed=0.1333
loop=0
frames=0,1,2,3
[/animation]

BIN
data/enemies/bird.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 306 B

View File

@@ -1,9 +1,10 @@
tileSetFile=breakout.gif
frame_width=24
frame_height=32
[animation]
name=default
speed=6
speed=0.1000
loop=0
frames=0,1,2,3,4,5,6,7,6,5,4,3,2,1
[/animation]

BIN
data/enemies/breakout.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 180 B

View File

@@ -1,9 +1,10 @@
tileSetFile=bry.gif
frame_width=10
frame_height=16
[animation]
name=default
speed=6
speed=0.1000
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]

BIN
data/enemies/bry.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 253 B

View File

@@ -1,9 +1,10 @@
tileSetFile=chip.gif
frame_width=8
frame_height=16
[animation]
name=default
speed=8
speed=0.1333
loop=0
frames=0,1,2,3
[/animation]

BIN
data/enemies/chip.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 208 B

View File

@@ -1,9 +1,10 @@
tileSetFile=code.gif
frame_width=16
frame_height=16
[animation]
name=default
speed=6
speed=0.1000
loop=0
frames=0,1,2,3
[/animation]

BIN
data/enemies/code.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 319 B

View File

@@ -1,9 +1,10 @@
tileSetFile=congo.gif
frame_width=8
frame_height=16
[animation]
name=default
speed=6
speed=0.1000
loop=0
frames=0,1,2,3
[/animation]

BIN
data/enemies/congo.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 231 B

View File

@@ -1,9 +1,10 @@
tileSetFile=crosshair.gif
frame_width=16
frame_height=16
[animation]
name=default
speed=6
speed=0.1000
loop=0
frames=0,1,2,3
[/animation]

BIN
data/enemies/crosshair.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 213 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 288 B

View File

@@ -1,9 +1,10 @@
tileSetFile=demon.gif
frame_width=16
frame_height=16
[animation]
name=default
speed=8
speed=0.1333
loop=0
frames=0,1,2,3
[/animation]

BIN
data/enemies/demon.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 213 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 329 B

View File

@@ -1,9 +1,10 @@
tileSetFile=dimallas.gif
frame_width=16
frame_height=16
[animation]
name=default
speed=8
speed=0.1333
loop=0
frames=0,1,2,3
[/animation]

BIN
data/enemies/dimallas.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 212 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 298 B

View File

@@ -1,9 +1,10 @@
tileSetFile=dong.gif
frame_width=22
frame_height=16
[animation]
name=default
speed=6
speed=0.1000
loop=0
frames=0,1,2,3,4,5
[/animation]

BIN
data/enemies/dong.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 355 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 630 B

View File

@@ -1,9 +1,10 @@
tileSetFile=elsa.gif
frame_width=16
frame_height=16
[animation]
name=default
speed=6
speed=0.1000
loop=0
frames=0,1,2,3,4,5
[/animation]

BIN
data/enemies/elsa.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 310 B

View File

@@ -1,9 +1,10 @@
tileSetFile=floppy.gif
frame_width=16
frame_height=16
[animation]
name=default
speed=8
speed=0.1333
loop=0
frames=0,1,2,3
[/animation]

BIN
data/enemies/floppy.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 271 B

View File

@@ -1,9 +1,10 @@
tileSetFile=flying_arounder.gif
frame_width=7
frame_height=7
[animation]
name=default
speed=10
speed=0.1667
loop=0
frames=0
[/animation]

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 B

View File

@@ -1,9 +1,10 @@
tileSetFile=guitar.gif
frame_width=16
frame_height=16
[animation]
name=default
speed=8
speed=0.1333
loop=0
frames=0,1,2,3
[/animation]

Some files were not shown because too many files have changed in this diff Show More