66 Commits

Author SHA1 Message Date
adab0b420c - Modificada la carpeta de guardar datos al estandar de jailgames 2023-02-12 18:05:53 +01:00
4f9d8bec42 - Cambiados los textos de los creditos/instrucciones para reflejar las nuevas teclas
- Cambiados los textos de los creditos/instrucciones para la versión de consola
2023-02-12 17:44:00 +01:00
31e657d138 - Cambiadas las teclas de cambiar el tamaño de ventana para adecuarse al estandar de jailgames 2023-02-12 17:28:48 +01:00
8b3d257baf - La ventana ya no se destruye al cambiar de tamaño de ventana
- La ventana aparece centrada al cambiar de tamaño
2023-02-12 17:05:16 +01:00
d1143b9dfe - Trabajando en la creación y destrucción de la ventana
- FIX: la clase screen no liberaba la textura gameCanvas al finalizar
2023-02-10 22:55:36 +01:00
68ebff722e - FIX: cambiado el boton de guía por el de select (o back)
- Añadido flag para intercambiar los botones de start y select en consola
- Añadido botón para activar o desactivar el borde con el mando (botón X)
2023-02-10 20:31:37 +01:00
3be9d4459c - Ya se puede usar el mando en todas las secciones del juego
- Definido flag para compilar para consola de juegos (GAME_CONSOLE)
2023-02-10 20:08:06 +01:00
76e928e21d Commit para seguir programando en WSL 2023-02-10 19:07:19 +01:00
9c6924d7bb - La clase input ya admite inputs personalizados
- El juego ya utiliza el objeto input para comprobar las teclas de cambio de tamaño de ventana, pausa, etc.
2023-02-10 18:28:53 +01:00
5007bea835 Se había quedado una linea comentada 2023-01-09 09:21:22 +01:00
5e7be1c2fb Ya se guardan los logros en un fichero 2023-01-02 09:46:09 +01:00
faf2e69b63 Creando iconos para las notificaciones 2022-12-30 13:18:43 +01:00
4c3c844ccf Fix: En la secuencia del final, al pulsar ESC se cerraba el juego. Ahora vuelve al logo 2022-12-29 15:26:02 +01:00
48b8ae049a Testeados todos los logros. Los logros no funcionan con los trucos activados 2022-12-29 14:59:48 +01:00
c0d4eddde7 Colocados los disparadores de los logros en su sitio 2022-12-29 14:08:42 +01:00
f590101047 Definidos los logros 2022-12-29 13:03:10 +01:00
c7fcbd0258 Añadidos nuevos iconos para las notificaciones. Rediseñada la notificación de login. Arreglado bug: No se podia elegir un icono para las notificaciones que no fuera de la primera fila 2022-12-29 11:58:32 +01:00
b2061c86d2 Cambiado el tamaño de las notificaciones. Posibilidad de añadir un icono 2022-12-29 11:36:44 +01:00
510a6ca718 Añadido bisel a las notificaciones 2022-12-29 11:00:26 +01:00
ec8209265a Añadidos iconos a las notificaciones 2022-12-29 10:19:11 +01:00
e963251fd9 Modificadas las notificaciones a dos lineas de texto 2022-12-29 09:42:57 +01:00
a2f1efd2a6 Empezando a trabajar con los logros 2022-12-29 09:09:36 +01:00
8959b7bcce Arreglado el cambio de paleta durante la pantalla de carga optimizada 2022-12-16 11:15:13 +01:00
4d8bb46a52 Cambiada la variable section por un puntero 2022-12-16 09:32:33 +01:00
2abde36a5e Actualizadas las etiquetas a la versión 1.07 2022-12-02 19:16:00 +01:00
0a083af712 El nombre de la habitación se pinta a partir de una textura 2022-12-02 09:35:49 +01:00
f322b1b81b Eliminada una variable static que no se utilizaba 2022-12-01 22:36:41 +01:00
13fe98edb3 Arreglado un poco el metodo de apertura de la Jail 2022-12-01 22:27:23 +01:00
c90b49c8be Añadido Batman a FEEL THE HEAT 2022-12-01 22:14:51 +01:00
d3a5c0e54f Cambiado el tamaño de la textura usado para pintar el mapa 2022-12-01 22:07:03 +01:00
254ff50ef3 Merge branch 'master' of https://gitea.sustancia.synology.me/JailDesigner/jaildoctors_dilemma 2022-12-01 22:05:05 +01:00
e551206351 Actualizado el cielo de la Jail 2022-12-01 22:04:47 +01:00
b22e830dac Merge branch 'master' of https://gitea.sustancia.synology.me/JailDesigner/jaildoctors_dilemma 2022-12-01 21:05:37 +01:00
a81d42cb25 Corregido bug: en la jail se rellenaban las vidas mientras estaba activa la pausa 2022-12-01 21:05:34 +01:00
3ea0025fb4 Retocada la pantalla de titulo 2022-12-01 21:03:12 +01:00
d7c49a0578 Modificado el sprite de PACO 2022-12-01 20:15:34 +01:00
4cbe55c2d4 Actualizado jail_audio a la última versión 2022-12-01 19:51:53 +01:00
564f316586 Cambiado el nombre del enemigo diskette a floppy 2022-12-01 19:32:59 +01:00
522ab8e726 Cambios cosméticos en algunas habitaciones. Cambiado el nombre de STATIC a BE CAREFUL WITH THE FUSE 2022-12-01 19:31:35 +01:00
4911282777 El color de fondo de la habitación se pinta en la textura del mapa 2022-12-01 11:40:35 +01:00
06ecabc676 Corregido un "memory leak" en texture.cpp 2022-12-01 10:43:58 +01:00
5d89a3057e Optimizado un poco el title.cpp 2022-11-30 13:43:47 +01:00
75228cc451 Eliminado el resto de accesos a vector mediante at() 2022-11-30 12:09:45 +01:00
357eec20b1 Eliminados la mayor parte de accesos a vector mediante at() 2022-11-30 12:03:37 +01:00
62c1e2715e Preparando el juego para ser compatble con consolas 2022-11-30 11:06:27 +01:00
34fc2b6b06 Optimizada la intro 2022-11-30 10:10:10 +01:00
6557dea2bb Merge branch 'master' of https://gitea.sustancia.synology.me/JailDesigner/jaildoctors_dilemma 2022-11-30 08:27:11 +01:00
2caea7ba6e Optimizando la intro 2022-11-30 08:26:16 +01:00
d33d2e4a09 Cambiado el nombre de algunos enemigos 2022-11-29 21:26:28 +01:00
d9174dcdb9 Cambiado el nombre de algunos enemigos 2022-11-29 21:08:33 +01:00
22f7204e08 Añadidas mas dll para el release de windows 2022-11-29 19:41:14 +01:00
06fab0d457 Actualizado Makefile 2022-11-29 19:16:14 +01:00
f180f88068 Corregido error en el texto de las teclas nuevas para moverse 2022-11-29 19:12:04 +01:00
4109d6c938 Actualizado Readme.md. Cambiado LICENSE a LICENSE.txt 2022-11-29 19:11:02 +01:00
9c2264ca75 Actualizado Makefile 2022-11-29 19:07:59 +01:00
c59739c7ba Cambiado el tamaño del borde de porcentaje a valor absoluto en pixeles 2022-11-29 18:45:25 +01:00
4a430c0d5b Actualizadas las instrucciones con el método de control escogido 2022-11-29 18:22:40 +01:00
5a7f637f4b Cambiada la tecla de pausa a la tecla H (HOLD) 2022-11-29 18:07:31 +01:00
c63298b555 Posibilidad de escoger diferentes configuraciónes prefijadas de teclas de control desde el fichero de configuración 2022-11-29 18:05:38 +01:00
82aa91bead Corregida la funcion para verificar si existen los ficheros de recursos 2022-11-29 17:29:18 +01:00
f4129e109a Actualizado Makefile 2022-11-29 17:25:08 +01:00
5e8714697d Añadido un tile para poder bajar en la fase ULA HOP! 2022-11-29 17:23:12 +01:00
dd4355051f Merge branch 'master' of https://gitea.sustancia.synology.me/JailDesigner/jaildoctors_dilemma 2022-11-28 09:01:22 +01:00
160b212a43 Actualizado info.plist 2022-11-28 09:01:21 +01:00
69d3b076d7 Modificadas algunas fases para prevenir glitches 2022-11-28 07:53:07 +01:00
3817a01712 Guardado de las opciones de las notificaciones 2022-11-24 12:55:34 +01:00
114 changed files with 2357 additions and 1444 deletions

View File

@@ -2,7 +2,7 @@ executable = jaildoctors_dilemma
source = source/*.cpp source/common/*.cpp source = source/*.cpp source/common/*.cpp
appName = JailDoctor's Dilemma appName = JailDoctor's Dilemma
releaseFolder = jdd_release releaseFolder = jdd_release
version = v1.06.1 version = v1.08
# Release names # Release names
windowsRelease = $(executable)-$(version)-win32-x64.zip windowsRelease = $(executable)-$(version)-win32-x64.zip
@@ -33,9 +33,9 @@ windows_release:
powershell if (Test-Path "$(releaseFolder)\data\room\standard.tsx") {Remove-Item "$(releaseFolder)\data\room\standard.tsx" -Recurse -Force} powershell if (Test-Path "$(releaseFolder)\data\room\standard.tsx") {Remove-Item "$(releaseFolder)\data\room\standard.tsx" -Recurse -Force}
# Copy root files # Copy root files
powershell Copy-Item "LICENSE" -Destination "$(releaseFolder)" powershell Copy-Item "LICENSE.txt" -Destination "$(releaseFolder)"
powershell Copy-Item "README.md" -Destination "$(releaseFolder)" powershell Copy-Item "README.md" -Destination "$(releaseFolder)"
powershell Copy-Item "release\SDL2.dll" -Destination "$(releaseFolder)" powershell Copy-Item "release\*.dll" -Destination "$(releaseFolder)"
# Build # Build
g++ $(source) -std=c++11 -Wall -Os -lmingw32 -lws2_32 -lSDL2main -lSDL2 -ffunction-sections -fdata-sections -Wl,--gc-sections -static-libstdc++ -Wl,-subsystem,windows -o "$(releaseFolder)/$(executable).exe" g++ $(source) -std=c++11 -Wall -Os -lmingw32 -lws2_32 -lSDL2main -lSDL2 -ffunction-sections -fdata-sections -Wl,--gc-sections -static-libstdc++ -Wl,-subsystem,windows -o "$(releaseFolder)/$(executable).exe"
@@ -80,9 +80,12 @@ macos_release:
# Copy files # Copy files
cp release/*.icns "$(releaseFolder)/$(appName).app/Contents/Resources" cp release/*.icns "$(releaseFolder)/$(appName).app/Contents/Resources"
cp release/Info.plist "$(releaseFolder)/$(appName).app/Contents" cp release/Info.plist "$(releaseFolder)/$(appName).app/Contents"
cp LICENSE "$(releaseFolder)" cp LICENSE.txt "$(releaseFolder)"
cp README.md "$(releaseFolder)" cp README.md "$(releaseFolder)"
# Create links
ln -s /Applications "$(releaseFolder)"/Applications
# Build INTEL # Build INTEL
clang++ $(source) -D MACOS_BUNDLE -std=c++11 -Wall -Os -framework SDL2 -F ./Frameworks -ffunction-sections -fdata-sections -o "$(releaseFolder)/$(appName).app/Contents/MacOS/$(executable)" -rpath @executable_path/../Frameworks/ -target x86_64-apple-macos10.12 clang++ $(source) -D MACOS_BUNDLE -std=c++11 -Wall -Os -framework SDL2 -F ./Frameworks -ffunction-sections -fdata-sections -o "$(releaseFolder)/$(appName).app/Contents/MacOS/$(executable)" -rpath @executable_path/../Frameworks/ -target x86_64-apple-macos10.12
@@ -120,7 +123,7 @@ linux_release:
# Copy data # Copy data
cp -R data "$(releaseFolder)" cp -R data "$(releaseFolder)"
cp LICENSE "$(releaseFolder)" cp LICENSE.txt "$(releaseFolder)"
cp README.md "$(releaseFolder)" cp README.md "$(releaseFolder)"
# Delete data # Delete data

View File

@@ -1,4 +1,4 @@
# JailDoctor's Dilemma (v1.06.1) # JailDoctor's Dilemma (v1.08)
JailDoc es un Jailer. A los Jailers les gusta empezar proyectos. A nadie le gusta terminarlos. Los Jailers viven en la Jail. A la Jail va uno a empezar proyectos. A la Jail va uno a enseñar sus proyectos. A la Jail va uno a aprender como empezar nuevos proyectos. A la Jail va uno a ayudar a sus compañeros a que empiecen nuevos proyectos. JailDoc es un Jailer. A los Jailers les gusta empezar proyectos. A nadie le gusta terminarlos. Los Jailers viven en la Jail. A la Jail va uno a empezar proyectos. A la Jail va uno a enseñar sus proyectos. A la Jail va uno a aprender como empezar nuevos proyectos. A la Jail va uno a ayudar a sus compañeros a que empiecen nuevos proyectos.
@@ -40,7 +40,7 @@ El juego permite tanto el uso del teclado como de un mando de control. Las tecla
- **Cursores**: Para mover a izquierda o derecha a JailDoc y para saltar - **Cursores**: Para mover a izquierda o derecha a JailDoc y para saltar. En el fichero de configuración se pueden cambiar las teclas por otras opciones prefijadas: O, P para moverse y Q para saltar o A, D para moverse y W para saltar.
- **Tecla M**: Activa o desactiva la música - **Tecla M**: Activa o desactiva la música

View File

Before

Width:  |  Height:  |  Size: 310 B

After

Width:  |  Height:  |  Size: 310 B

View File

Before

Width:  |  Height:  |  Size: 271 B

After

Width:  |  Height:  |  Size: 271 B

View File

Before

Width:  |  Height:  |  Size: 122 B

After

Width:  |  Height:  |  Size: 122 B

View File

Before

Width:  |  Height:  |  Size: 205 B

After

Width:  |  Height:  |  Size: 205 B

View File

Before

Width:  |  Height:  |  Size: 189 B

After

Width:  |  Height:  |  Size: 189 B

View File

Before

Width:  |  Height:  |  Size: 351 B

After

Width:  |  Height:  |  Size: 351 B

View File

Before

Width:  |  Height:  |  Size: 323 B

After

Width:  |  Height:  |  Size: 323 B

View File

Before

Width:  |  Height:  |  Size: 378 B

After

Width:  |  Height:  |  Size: 378 B

View File

@@ -3,7 +3,7 @@ frameHeight=16
[animation] [animation]
name=default name=default
speed=8 speed=4
loop=0 loop=0
frames=0,1,2,3 frames=0,1,2,3,4,5,6,7
[/animation] [/animation]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 239 B

After

Width:  |  Height:  |  Size: 357 B

View File

Before

Width:  |  Height:  |  Size: 139 B

After

Width:  |  Height:  |  Size: 139 B

View File

Before

Width:  |  Height:  |  Size: 129 B

After

Width:  |  Height:  |  Size: 129 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -9,8 +9,8 @@ roomLeft=0
roomRight=02.room roomRight=02.room
[enemy] [enemy]
tileSetFile=jailer.png tileSetFile=jailer_#1.png
animation=jailer.ani animation=jailer_#1.ani
width=16 width=16
height=16 height=16
x=1 x=1
@@ -25,8 +25,8 @@ color=white
[/enemy] [/enemy]
[enemy] [enemy]
tileSetFile=jailer3.png tileSetFile=jailer_#3.png
animation=jailer3.ani animation=jailer_#3.ani
width=16 width=16
height=16 height=16
x=4 x=4
@@ -41,8 +41,8 @@ color=white
[/enemy] [/enemy]
[enemy] [enemy]
tileSetFile=jailer.png tileSetFile=jailer_#1.png
animation=jailer.ani animation=jailer_#1.ani
width=16 width=16
height=16 height=16
x=7 x=7
@@ -57,8 +57,8 @@ color=white
[/enemy] [/enemy]
[enemy] [enemy]
tileSetFile=jailer2.png tileSetFile=jailer_#2.png
animation=jailer2.ani animation=jailer_#2.ani
width=16 width=16
height=16 height=16
x=10 x=10
@@ -73,8 +73,8 @@ color=white
[/enemy] [/enemy]
[enemy] [enemy]
tileSetFile=jailer.png tileSetFile=jailer_#1.png
animation=jailer.ani animation=jailer_#1.ani
width=16 width=16
height=16 height=16
x=13 x=13
@@ -89,8 +89,8 @@ color=white
[/enemy] [/enemy]
[enemy] [enemy]
tileSetFile=printer.png tileSetFile=elsa.png
animation=printer.ani animation=elsa.ani
width=16 width=16
height=16 height=16
x=3 x=3
@@ -105,8 +105,8 @@ color=white
[/enemy] [/enemy]
[enemy] [enemy]
tileSetFile=printer.png tileSetFile=elsa.png
animation=printer.ani animation=elsa.ani
width=16 width=16
height=16 height=16
x=6 x=6

View File

@@ -3,9 +3,9 @@
<tileset firstgid="1" source="standard.tsx"/> <tileset firstgid="1" source="standard.tsx"/>
<layer id="1" name="Capa de patrones 1" width="32" height="16"> <layer id="1" name="Capa de patrones 1" width="32" height="16">
<data encoding="csv"> <data encoding="csv">
164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164, 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,
164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,43,43,43,43,43,43,43,43,43,43,43,43,43,43,164, 168,166,185,167,166,185,166,166,168,166,166,167,166,166,185,166,166,43,43,43,43,43,43,43,43,43,43,43,43,43,43,166,
164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, 211,181,211,213,211,181,211,212,213,211,181,211,211,212,211,213,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
164,43,43,43,43,43,43,43,43,43,43,43,43,43,43,164,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, 164,43,43,43,43,43,43,43,43,43,43,43,43,43,43,164,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43, 43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,
43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34, 43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,43,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,34,

View File

@@ -1,6 +1,6 @@
name=ROAD TO THE JAIL name=ROAD TO THE JAIL
bgColor=black bgColor=black
border=cyan border=blue
tileMapFile=02.tmx tileMapFile=02.tmx
tileSetFile=standard.png tileSetFile=standard.png
roomUp=0 roomUp=0

View File

@@ -3,22 +3,22 @@
<tileset firstgid="1" source="standard.tsx"/> <tileset firstgid="1" source="standard.tsx"/>
<layer id="1" name="Capa de patrones 1" width="32" height="16"> <layer id="1" name="Capa de patrones 1" width="32" height="16">
<data encoding="csv"> <data encoding="csv">
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,43,43,43,43,43, 192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,43,43,43,43,43,
43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,25,25,25, 43,166,166,167,168,166,185,167,166,185,166,166,168,166,166,167,166,166,185,166,166,166,185,167,166,166,166,185,25,25,25,25,
43,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0, 43,43,211,212,212,211,181,211,213,211,181,211,212,213,211,181,211,211,211,211,212,213,211,181,211,213,181,211,135,0,0,0,
43,43,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0, 43,43,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,0,0,0,
43,43,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,25,25,25, 43,43,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,25,25,25,
34,34,304,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,25,25, 34,34,304,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,25,25,
34,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,303,25,25, 34,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,303,25,25,
34,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,25, 34,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,25,
34,34,0,413,413,413,413,0,0,0,0,413,413,413,413,413,0,0,0,0,413,413,413,413,413,413,413,0,0,0,25,25, 34,34,0,413,413,413,413,0,0,0,0,413,304,413,413,413,0,0,0,0,413,304,413,413,413,413,304,0,0,0,25,25,
34,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,25, 34,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,25,
34,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,387,25,25, 34,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,411,25,25,
34,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,25, 34,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,25,
34,34,389,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,387,25,25, 34,34,413,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,411,25,25,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,513,189,190,537,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,524,189,191,548,0,0,0,0,
34,34,189,190,189,190,189,190,189,190,189,190,189,190,189,190,189,190,189,191,0,0,189,190,189,190,189,190,189,190,25,25 34,34,189,190,189,190,189,190,189,190,189,190,189,190,189,190,189,190,189,191,0,0,189,190,189,190,189,190,189,191,25,25
</data> </data>
</layer> </layer>
</map> </map>

View File

@@ -11,8 +11,8 @@ itemColor1=bright_green
itemColor2=green itemColor2=green
[enemy] [enemy]
tileSetFile=diskette.png tileSetFile=floppy.png
animation=diskette.ani animation=floppy.ani
width=16 width=16
height=16 height=16
x=15 x=15

View File

@@ -10,7 +10,7 @@
134,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,117, 134,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,117,
25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,117, 25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,117,
25,0,0,0,0,0,0,0,0,0,0,417,417,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,141, 25,0,0,0,0,0,0,0,0,0,0,417,417,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,141,
25,0,0,556,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,25,25,0,0,0,0,0,0,0,0,0,387,25, 25,0,0,556,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,25,25,0,0,0,0,0,0,0,0,0,0,25,
25,25,25,25,25,25,0,0,0,417,417,0,0,0,0,0,0,0,305,31,0,0,0,0,0,0,0,0,0,0,0,305, 25,25,25,25,25,25,0,0,0,417,417,0,0,0,0,0,0,0,305,31,0,0,0,0,0,0,0,0,0,0,0,305,
0,0,0,0,305,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,417,417,0,0,0,0,0,0, 0,0,0,0,305,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,417,417,0,0,0,0,0,0,
0,0,0,0,0,0,0,417,417,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,417,417,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,0,0,0,0,0,0,

View File

@@ -18,7 +18,7 @@
0,0,0,0,0,0,0,0,531,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17, 0,0,0,0,0,0,0,0,531,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,
0,0,0,0,0,0,0,0,0,531,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17, 0,0,0,0,0,0,0,0,0,531,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,
0,0,0,0,0,0,0,0,0,0,349,349,349,349,349,349,349,349,349,349,349,538,0,0,0,0,0,0,0,0,0,17, 0,0,0,0,0,0,0,0,0,0,349,349,349,349,349,349,349,349,349,349,349,538,0,0,0,0,0,0,0,0,0,17,
0,0,0,0,0,0,0,0,0,0,0,0,0,41,41,41,41,349,349,349,349,349,349,349,349,349,349,0,0,349,349,349 563,563,563,563,563,563,563,563,563,563,0,0,0,41,41,41,41,349,349,349,349,349,349,349,349,349,349,0,0,349,349,349
</data> </data>
</layer> </layer>
</map> </map>

View File

@@ -11,8 +11,8 @@ itemColor1=red
itemColor2=magenta itemColor2=magenta
[enemy] [enemy]
tileSetFile=diskette.png tileSetFile=floppy.png
animation=diskette.ani animation=floppy.ani
width=16 width=16
height=16 height=16
x=9 x=9
@@ -27,8 +27,8 @@ color=green
[/enemy] [/enemy]
[enemy] [enemy]
tileSetFile=diskette.png tileSetFile=floppy.png
animation=diskette.ani animation=floppy.ani
width=16 width=16
height=16 height=16
x=1 x=1

View File

@@ -9,13 +9,13 @@
25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
25,0,0,0,527,25,25,25,25,25,25,25,25,25,25,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 25,0,0,0,527,25,25,25,25,25,25,25,25,25,25,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,25,25,25,0,0,0,0,0,0,0,0,0,0,0,251,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,25,25,25,0,0,0,0,0,0,0,0,0,0,0,251,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,527, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,527,25,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,25,551,0,0,0,0,0,0,0,0,0,527,25,25, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,25,551,0,0,0,0,0,0,0,0,0,527,25,25,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,25,25,25,0,0,0,0,0,25,25,25,25,25, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,25,25,25,0,0,0,0,0,25,25,25,25,25,
25,25,25,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 25,25,25,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,25,25,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,251,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,251,0,0,0,0,0,25,25,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,
0,0,0,0,395,395,395,395,395,371,395,395,395,395,395,395,395,395,395,395,395,395,395,395,395,0,0,0,0,0,0,0, 0,0,0,0,395,395,395,395,395,371,395,395,395,395,395,395,395,395,395,395,395,395,395,395,395,0,0,0,0,0,0,25,
0,0,0,0,0,0,0,0,0,323,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,323,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
25,25,551,0,0,0,0,0,0,347,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 25,25,551,0,0,0,0,0,0,347,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25 25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25

View File

@@ -30,7 +30,7 @@ flip=true
[enemy] [enemy]
tileSetFile=bat.png tileSetFile=bat.png
animation=bat.ani animation=bat.ani
width=9 width=8
height=7 height=7
x=14 x=14
y=2 y=2
@@ -46,7 +46,7 @@ color=bright_blue
[enemy] [enemy]
tileSetFile=bat.png tileSetFile=bat.png
animation=bat.ani animation=bat.ani
width=9 width=8
height=7 height=7
x=10 x=10
y=10 y=10
@@ -62,7 +62,7 @@ color=cyan
[enemy] [enemy]
tileSetFile=bat.png tileSetFile=bat.png
animation=bat.ani animation=bat.ani
width=9 width=8
height=7 height=7
x=15 x=15
y=1 y=1

View File

@@ -11,8 +11,8 @@ itemColor1=yellow
itemColor2=red itemColor2=red
[enemy] [enemy]
tileSetFile=diskette.png tileSetFile=floppy.png
animation=diskette.ani animation=floppy.ani
width=16 width=16
height=16 height=16
x=5 x=5
@@ -27,8 +27,8 @@ color=green
[/enemy] [/enemy]
[enemy] [enemy]
tileSetFile=diskette.png tileSetFile=floppy.png
animation=diskette.ani animation=floppy.ani
width=16 width=16
height=16 height=16
x=12 x=12

View File

@@ -3,16 +3,16 @@
<tileset firstgid="1" source="standard.tsx"/> <tileset firstgid="1" source="standard.tsx"/>
<layer id="1" name="Capa de patrones 1" width="32" height="16"> <layer id="1" name="Capa de patrones 1" width="32" height="16">
<data encoding="csv"> <data encoding="csv">
5,5,5,5,5,5,5,5,5,5,5,0,0,0,506,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5,0,0,0,0,0,0,506,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
5,5,5,5,5,5,5,5,0,0,0,0,0,506,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5, 5,5,5,5,5,5,5,0,0,0,0,0,0,506,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,
5,5,5,5,5,5,5,0,0,0,0,0,506,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5, 5,5,5,5,5,5,5,0,0,0,0,0,506,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,
5,5,5,5,5,5,5,0,0,0,0,506,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5, 5,5,5,5,5,5,5,0,0,0,0,506,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,
5,5,5,5,5,5,5,0,0,0,506,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5, 5,5,5,5,5,5,5,0,0,0,506,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,
0,0,0,0,0,0,134,0,0,506,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5, 5,5,5,5,173,0,134,0,0,506,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,
0,0,0,0,0,0,134,0,415,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5, 557,557,557,557,557,557,134,0,415,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,
5,5,5,5,5,5,5,415,415,415,530,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5, 5,5,5,5,5,5,5,415,415,415,530,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,
5,5,5,5,5,5,5,0,0,0,0,530,0,0,0,0,0,0,449,449,449,449,449,449,449,449,449,449,449,449,449,5, 5,5,5,5,5,5,0,0,0,0,0,530,0,0,0,0,0,0,449,449,449,449,449,449,449,449,449,449,449,449,449,5,
5,5,5,5,5,5,5,0,0,0,0,0,530,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5, 5,5,5,5,5,0,0,0,0,0,0,0,530,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,
0,0,0,0,0,0,0,0,0,0,0,0,0,530,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,517,367,5, 0,0,0,0,0,0,0,0,0,0,0,0,0,530,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,517,367,5,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,367,367,367,367,429,429,0,429,429,367,367,367,367,367,367,367,367,5, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,367,367,367,367,429,429,0,429,429,367,367,367,367,367,367,367,367,5,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,343,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,343,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,

View File

@@ -4,15 +4,15 @@
<layer id="1" name="Capa de patrones 1" width="32" height="16"> <layer id="1" name="Capa de patrones 1" width="32" height="16">
<data encoding="csv"> <data encoding="csv">
349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349, 349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,349,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,188,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,188,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,188,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,188,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,38,38,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,38,38,38,0,0,0,0,0,0,0,0,0,0,0,0,0,188,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,188,
0,0,0,0,0,0,0,0,0,0,0,241,241,0,0,0,0,0,0,241,241,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,241,241,0,0,0,0,0,0,241,241,0,0,0,0,0,0,0,0,0,0,188,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,188,
0,0,0,0,0,0,38,38,241,241,0,0,0,0,0,0,0,0,0,0,0,0,241,241,38,38,0,0,0,0,0,0, 0,0,0,0,0,0,38,38,241,241,0,0,0,0,0,0,0,0,0,0,0,0,241,241,38,38,0,0,0,0,0,188,
0,0,0,0,0,38,38,0,0,0,0,241,241,0,0,0,0,0,0,241,241,0,0,0,0,38,38,0,0,0,0,0, 0,0,0,0,0,38,38,0,0,0,0,241,241,0,0,0,0,0,0,241,241,0,0,0,0,38,38,0,0,0,0,0,
0,0,0,0,38,38,0,0,0,0,0,0,0,0,241,241,241,241,0,0,0,0,0,0,0,0,38,38,0,0,0,0, 0,0,0,0,38,38,0,0,0,0,0,0,0,0,241,241,241,241,0,0,0,0,0,0,0,0,38,38,0,0,0,0,
0,0,0,0,38,0,0,0,0,0,0,241,241,0,0,0,0,0,0,241,241,0,0,0,0,0,0,38,0,0,0,0, 0,0,0,0,38,0,0,0,0,0,0,241,241,0,0,0,0,0,0,241,241,0,0,0,0,0,0,38,0,0,0,0,

View File

@@ -9,8 +9,8 @@ roomLeft=26.room
roomRight=0 roomRight=0
#[enemy] #[enemy]
#tileSetFile=diskette.png #tileSetFile=floppy.png
#animation=diskette.ani #animation=floppy.ani
#width=16 #width=16
#height=16 #height=16
#x=2 #x=2

View File

@@ -3,17 +3,17 @@
<tileset firstgid="1" source="standard.tsx"/> <tileset firstgid="1" source="standard.tsx"/>
<layer id="1" name="Capa de patrones 1" width="32" height="16"> <layer id="1" name="Capa de patrones 1" width="32" height="16">
<data encoding="csv"> <data encoding="csv">
90,89,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,90,41,235,235,0,0,235,235,41,89,90,89, 90,89,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,94,41,235,235,0,0,235,235,41,89,90,89,
89,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,90, 89,94,215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,214,215,0,0,0,0,0,0,0,0,214,89,90,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89, 214,215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,214,89,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,235,235,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,235,235,0,0,0,0,0,214,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,235,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,235,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,235,0,0,0,0,235,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,235,0,0,0,0,235,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
89,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,235,0,0,0,0,0,0,0,0,0, 89,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,235,0,0,0,0,0,0,0,0,0,
94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,235,0,0,0,0,0, 94,215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,235,0,0,0,0,0,
89,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 89,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,415,415,415,415,415,415, 94,215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,415,415,415,415,415,415,
89,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,235,0,0,0,0,0,0,0,0,0,0, 89,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,235,0,0,0,0,0,0,0,0,0,0,
90,89,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 90,89,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
89,90,89,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 89,90,89,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

View File

@@ -11,8 +11,8 @@ itemColor1=green
itemColor2=red itemColor2=red
[enemy] [enemy]
tileSetFile=diskette.png tileSetFile=floppy.png
animation=diskette.ani animation=floppy.ani
width=16 width=16
height=16 height=16
x=20 x=20

View File

@@ -15,7 +15,7 @@
116,0,0,0,377,377,377,0,0,0,0,0,0,115,114,115,114,0,0,0,0,0,377,377,377,377,0,0,0,0,140,116, 116,0,0,0,377,377,377,0,0,0,0,0,0,115,114,115,114,0,0,0,0,0,377,377,377,377,0,0,0,0,140,116,
140,0,0,0,0,0,0,0,0,0,0,377,0,114,115,114,115,0,0,377,0,0,0,0,0,0,0,0,0,0,116,140, 140,0,0,0,0,0,0,0,0,0,0,377,0,114,115,114,115,0,0,377,0,0,0,0,0,0,0,0,0,0,116,140,
116,0,0,0,0,0,0,0,0,0,0,0,0,115,114,115,114,0,0,0,0,0,0,0,0,0,431,432,114,115,140,116, 116,0,0,0,0,0,0,0,0,0,0,0,0,115,114,115,114,0,0,0,0,0,0,0,0,0,431,432,114,115,140,116,
140,0,0,0,0,0,0,0,377,0,0,0,0,114,115,114,115,0,0,0,0,0,0,431,432,431,432,431,432,0,116,140, 140,0,0,0,0,0,0,377,377,0,0,0,0,114,115,114,115,0,0,0,0,0,0,431,432,431,432,431,432,0,116,140,
0,0,0,0,0,0,0,0,0,0,0,0,377,115,114,115,114,0,0,377,0,0,0,0,0,0,0,0,0,0,140,116, 0,0,0,0,0,0,0,0,0,0,0,0,377,115,114,115,114,0,0,377,0,0,0,0,0,0,0,0,0,0,140,116,
0,0,0,0,0,0,0,0,0,0,0,0,0,114,115,114,115,0,0,0,0,0,0,0,0,0,0,0,0,0,116,140, 0,0,0,0,0,0,0,0,0,0,0,0,0,114,115,114,115,0,0,0,0,0,0,0,0,0,0,0,0,0,116,140,
114,115,114,115,114,115,114,115,114,115,114,115,114,115,114,115,114,115,114,115,114,115,114,115,0,0,114,115,114,115,114,115 114,115,114,115,114,115,114,115,114,115,114,115,114,115,114,115,114,115,114,115,114,115,114,115,0,0,114,115,114,115,114,115

View File

@@ -1,4 +1,4 @@
name=STATIC name=BE CAREFUL WITH THE FUSE
bgColor=black bgColor=black
border=bright_cyan border=bright_cyan
tileMapFile=36.tmx tileMapFile=36.tmx

View File

@@ -9,8 +9,8 @@ roomLeft=39.room
roomRight=37.room roomRight=37.room
[enemy] [enemy]
tileSetFile=arounder_stop.png tileSetFile=stopped_arounder.png
animation=arounder_stop.ani animation=stopped_arounder.ani
width=7 width=7
height=8 height=8
x=9 x=9
@@ -25,8 +25,8 @@ color=white
[/enemy] [/enemy]
[enemy] [enemy]
tileSetFile=arounder_stop.png tileSetFile=stopped_arounder.png
animation=arounder_stop.ani animation=stopped_arounder.ani
width=7 width=7
height=8 height=8
x=18 x=18
@@ -41,8 +41,8 @@ color=white
[/enemy] [/enemy]
[enemy] [enemy]
tileSetFile=arounder_walk.png tileSetFile=walking_arounder.png
animation=arounder_walk.ani animation=walking_arounder.ani
width=5 width=5
height=8 height=8
x=12 x=12
@@ -75,8 +75,8 @@ flip=true
[/enemy] [/enemy]
[enemy] [enemy]
tileSetFile=arounder_fly.png tileSetFile=flying_arounder.png
animation=arounder_fly.ani animation=flying_arounder.ani
width=7 width=7
height=7 height=7
x=3 x=3

View File

@@ -27,8 +27,8 @@ color=white
[/enemy] [/enemy]
[enemy] [enemy]
tileSetFile=arounder_fly.png tileSetFile=flying_arounder.png
animation=arounder_fly.ani animation=flying_arounder.ani
width=7 width=7
height=7 height=7
x=9 x=9
@@ -44,8 +44,8 @@ flip=true
[/enemy] [/enemy]
[enemy] [enemy]
tileSetFile=arounder_fly.png tileSetFile=flying_arounder.png
animation=arounder_fly.ani animation=flying_arounder.ani
width=7 width=7
height=7 height=7
x=15 x=15
@@ -61,8 +61,8 @@ flip=true
[/enemy] [/enemy]
[enemy] [enemy]
tileSetFile=arounder_fly.png tileSetFile=flying_arounder.png
animation=arounder_fly.ani animation=flying_arounder.ani
width=7 width=7
height=7 height=7
x=22 x=22
@@ -78,8 +78,8 @@ flip=true
[/enemy] [/enemy]
[enemy] [enemy]
tileSetFile=arounder_fly.png tileSetFile=flying_arounder.png
animation=arounder_fly.ani animation=flying_arounder.ani
width=7 width=7
height=7 height=7
x=16 x=16

View File

@@ -25,8 +25,8 @@ color=red
[/enemy] [/enemy]
[enemy] [enemy]
tileSetFile=arounder_walk.png tileSetFile=walking_arounder.png
animation=arounder_walk.ani animation=walking_arounder.ani
width=5 width=5
height=8 height=8
x=10 x=10
@@ -42,8 +42,8 @@ flip=true
[/enemy] [/enemy]
[enemy] [enemy]
tileSetFile=arounder_walk.png tileSetFile=walking_arounder.png
animation=arounder_walk.ani animation=walking_arounder.ani
width=5 width=5
height=8 height=8
x=15 x=15
@@ -59,8 +59,8 @@ flip=true
[/enemy] [/enemy]
[enemy] [enemy]
tileSetFile=arounder_walk.png tileSetFile=walking_arounder.png
animation=arounder_walk.ani animation=walking_arounder.ani
width=5 width=5
height=8 height=8
x=20 x=20
@@ -76,8 +76,8 @@ flip=true
[/enemy] [/enemy]
[enemy] [enemy]
tileSetFile=arounder_walk.png tileSetFile=walking_arounder.png
animation=arounder_walk.ani animation=walking_arounder.ani
width=5 width=5
height=8 height=8
x=14 x=14

View File

@@ -25,8 +25,8 @@ color=bright_cyan
[/enemy] [/enemy]
[enemy] [enemy]
tileSetFile=arounder_stop.png tileSetFile=stopped_arounder.png
animation=arounder_stop.ani animation=stopped_arounder.ani
width=7 width=7
height=8 height=8
x=8 x=8
@@ -41,8 +41,8 @@ color=bright_cyan
[/enemy] [/enemy]
[enemy] [enemy]
tileSetFile=arounder_stop.png tileSetFile=stopped_arounder.png
animation=arounder_stop.ani animation=stopped_arounder.ani
width=7 width=7
height=8 height=8
x=11 x=11
@@ -57,8 +57,8 @@ color=bright_cyan
[/enemy] [/enemy]
[enemy] [enemy]
tileSetFile=arounder_stop.png tileSetFile=stopped_arounder.png
animation=arounder_stop.ani animation=stopped_arounder.ani
width=7 width=7
height=8 height=8
x=24 x=24
@@ -73,8 +73,8 @@ color=bright_cyan
[/enemy] [/enemy]
[enemy] [enemy]
tileSetFile=arounder_walk.png tileSetFile=walking_arounder.png
animation=arounder_walk.ani animation=walking_arounder.ani
width=5 width=5
height=8 height=8
x=12 x=12
@@ -90,8 +90,8 @@ flip=true
[/enemy] [/enemy]
[enemy] [enemy]
tileSetFile=arounder_walk.png tileSetFile=walking_arounder.png
animation=arounder_walk.ani animation=walking_arounder.ani
width=5 width=5
height=8 height=8
x=14 x=14
@@ -107,8 +107,8 @@ flip=true
[/enemy] [/enemy]
[enemy] [enemy]
tileSetFile=arounder_walk.png tileSetFile=walking_arounder.png
animation=arounder_walk.ani animation=walking_arounder.ani
width=5 width=5
height=8 height=8
x=14 x=14

View File

@@ -1,6 +1,6 @@
name=P.A.C.O. ON THE GO name=P.A.C.O. ON THE GO
bgColor=black bgColor=black
border=black border=blue
tileMapFile=42.tmx tileMapFile=42.tmx
tileSetFile=standard.png tileSetFile=standard.png
roomUp=0 roomUp=0
@@ -23,7 +23,7 @@ x1=10
y1=2 y1=2
x2=10 x2=10
y2=11 y2=11
color=green color=magenta
[/enemy] [/enemy]
[enemy] [enemy]

View File

@@ -11,8 +11,8 @@
36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,415,421,62, 36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,415,421,62,
36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,421,0,0,0,0,0,0,0,0, 36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,421,0,0,0,0,0,0,0,0,
36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,415,415,421,415,0,0,0,0,0,0,0,0,0,0,0, 36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,415,415,421,415,0,0,0,0,0,0,0,0,0,0,0,
36,0,0,0,0,0,0,0,305,0,0,0,0,305,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 36,0,0,0,0,0,0,0,306,0,0,0,0,306,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
36,0,0,0,305,0,0,0,0,0,0,0,0,0,0,0,0,421,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 36,0,0,0,306,0,0,0,0,0,0,0,0,0,0,0,0,421,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
36,0,415,421,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,415,415,0,0,421,415,0,0,0,0,0,0, 36,0,415,421,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,415,415,0,0,421,415,0,0,0,0,0,0,
36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

View File

@@ -11,6 +11,22 @@ itemColor1=red
itemColor2=magenta itemColor2=magenta
autoSurface=left autoSurface=left
[enemy]
tileSetFile=batman_fire.png
animation=batman_fire.ani
width=16
height=16
x=10
y=13
vx=1.3
vy=0
x1=0
y1=13
x2=29
y2=13
color=cyan
flip=true
[/enemy]
[enemy] [enemy]
tileSetFile=heavy.png tileSetFile=heavy.png

View File

@@ -11,8 +11,8 @@ itemColor1=red
itemColor2=yellow itemColor2=yellow
[enemy] [enemy]
tileSetFile=jb_alien.png tileSetFile=jailbattle_alien.png
animation=jb_alien.ani animation=jailbattle_alien.ani
width=13 width=13
height=15 height=15
x=10 x=10
@@ -28,8 +28,8 @@ flip=true
[/enemy] [/enemy]
[enemy] [enemy]
tileSetFile=jb_alien.png tileSetFile=jailbattle_alien.png
animation=jb_alien.ani animation=jailbattle_alien.ani
width=13 width=13
height=15 height=15
x=25 x=25
@@ -45,8 +45,8 @@ flip=true
[/enemy] [/enemy]
[enemy] [enemy]
tileSetFile=jb_human.png tileSetFile=jailbattle_human.png
animation=jb_human.ani animation=jailbattle_human.ani
width=11 width=11
height=13 height=13
x=7 x=7
@@ -62,8 +62,8 @@ flip=true
[/enemy] [/enemy]
[enemy] [enemy]
tileSetFile=jb_human.png tileSetFile=jailbattle_human.png
animation=jb_human.ani animation=jailbattle_human.ani
width=11 width=11
height=13 height=13
x=18 x=18

View File

@@ -11,8 +11,8 @@ itemColor1=white
itemColor2=green itemColor2=green
[enemy] [enemy]
tileSetFile=jb_human.png tileSetFile=jailbattle_human.png
animation=jb_human.ani animation=jailbattle_human.ani
width=11 width=11
height=13 height=13
x=17 x=17
@@ -28,8 +28,8 @@ flip=true
[/enemy] [/enemy]
[enemy] [enemy]
tileSetFile=jb_human.png tileSetFile=jailbattle_human.png
animation=jb_human.ani animation=jailbattle_human.ani
width=11 width=11
height=13 height=13
x=2 x=2
@@ -45,8 +45,8 @@ flip=true
[/enemy] [/enemy]
[enemy] [enemy]
tileSetFile=jb_alien.png tileSetFile=jailbattle_alien.png
animation=jb_alien.ani animation=jailbattle_alien.ani
width=11 width=11
height=13 height=13
x=24 x=24

View File

@@ -9,8 +9,8 @@ roomLeft=0
roomRight=49.room roomRight=49.room
[enemy] [enemy]
tileSetFile=diskette.png tileSetFile=floppy.png
animation=diskette.ani animation=floppy.ani
width=16 width=16
height=16 height=16
x=7 x=7
@@ -25,8 +25,8 @@ color=magenta
[/enemy] [/enemy]
[enemy] [enemy]
tileSetFile=diskette.png tileSetFile=floppy.png
animation=diskette.ani animation=floppy.ani
width=16 width=16
height=16 height=16
x=20 x=20

View File

@@ -4,7 +4,7 @@
<layer id="1" name="Capa de patrones 1" width="32" height="16"> <layer id="1" name="Capa de patrones 1" width="32" height="16">
<data encoding="csv"> <data encoding="csv">
42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42, 42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,
42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42, 42,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,42,
42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42, 42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,
42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42, 42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,
42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

View File

@@ -1,4 +1,4 @@
name=P.A.C.O WORKSHOP name=P.A.C.O. WORKSHOP
bgColor=black bgColor=black
border=yellow border=yellow
tileMapFile=53.tmx tileMapFile=53.tmx

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

@@ -23,11 +23,11 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>1.4.3</string> <string>1.0.8</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>1.0.6</string> <string>1.0.8</string>
<key>CSResourcesFileMapped</key> <key>CSResourcesFileMapped</key>
<true/> <true/>
<key>LSMinimumSystemVersion</key> <key>LSMinimumSystemVersion</key>

BIN
release/libgcc_s_seh-1.dll Normal file

Binary file not shown.

BIN
release/libstdc++-6.dll Normal file

Binary file not shown.

BIN
release/libwinpthread-1.dll Normal file

Binary file not shown.

View File

@@ -1,13 +1,242 @@
#include "cheevos.h" #include "cheevos.h"
#include <iostream>
// Constructor // Constructor
Cheevos::Cheevos(options_t *options) Cheevos::Cheevos(Screen *screen, options_t *options, std::string file)
{ {
// Copia la dirección de los objetos
this->options = options; this->options = options;
this->screen = screen;
this->file = file;
// Inicializa los logros
init();
// Inicializa variables
enabled = true;
// Carga el estado de los logros desde un fichero
loadFromFile();
} }
// Destructor // Destructor
Cheevos::~Cheevos() Cheevos::~Cheevos()
{ {
// Guarda el estado de los logros en un fichero
saveToFile();
cheevos.clear();
}
// Inicializa los logros
void Cheevos::init()
{
cheevos_t c;
c.completed = false;
c.valid = true;
c.icon = 2;
c.id = 1;
c.caption = "SHINY THINGS";
c.description = "Get 25\% of the items";
cheevos.push_back(c);
c.id = 2;
c.caption = "HALF THE WORK";
c.description = "Get 50\% of the items";
cheevos.push_back(c);
c.id = 3;
c.caption = "GETTING THERE";
c.description = "Get 75\% of the items";
cheevos.push_back(c);
c.id = 4;
c.caption = "THE COLLECTOR";
c.description = "Get 100\% of the items";
cheevos.push_back(c);
c.id = 5;
c.caption = "WANDERING AROUND";
c.description = "Visit 20 rooms";
cheevos.push_back(c);
c.id = 6;
c.caption = "I GOT LOST";
c.description = "Visit 40 rooms";
cheevos.push_back(c);
c.id = 7;
c.caption = "I LIKE TO EXPLORE";
c.description = "Visit all rooms";
cheevos.push_back(c);
c.id = 8;
c.caption = "FINISH THE GAME";
c.description = "Complete the game";
cheevos.push_back(c);
c.id = 9;
c.caption = "I WAS SUCKED BY A HOLE";
c.description = "Complete the game without entering the jail";
cheevos.push_back(c);
c.id = 10;
c.caption = "MY LITTLE PROJECTS";
c.description = "Complete the game with all items";
cheevos.push_back(c);
c.id = 11;
c.caption = "I LIKE MY MULTICOLOURED FRIENDS";
c.description = "Complete the game without dying";
cheevos.push_back(c);
c.id = 12;
c.caption = "SHIT PROJECTS DONE FAST";
c.description = "Complete the game in under 30 minutes";
cheevos.push_back(c);
}
// Busca un logro por id y devuelve el indice
int Cheevos::find(int id)
{
for (int i = 0; i < (int)cheevos.size(); ++i)
{
if (cheevos[i].id == id)
{
return i;
}
}
return -1;
}
// Desbloquea un logro
void Cheevos::unlock(int id)
{
const int index = find(id);
if (index == -1)
{
return;
}
if (!cheevos[index].valid)
{
return;
}
if (cheevos[index].completed)
{
return;
}
if (!enabled)
{
return;
}
cheevos[index].completed = true;
screen->showNotification("ACHIEVEMENT UNLOCKED!", cheevos[index].caption, cheevos[index].icon);
}
// Invalida un logro
void Cheevos::invalidate(int id)
{
const int index = find(id);
if (index == -1)
{
return;
}
cheevos[index].valid = false;
}
// Habilita o deshabilita los logros
void Cheevos::enable(bool value)
{
enabled = value;
}
// Carga el estado de los logros desde un fichero
void Cheevos::loadFromFile()
{
// Open file for reading in binary
SDL_RWops *file = SDL_RWFromFile(this->file.c_str(), "r+b");
// El fichero no existe
if (file == NULL)
{
if (options->console)
{
std::cout << "Warning: Unable to open file! SDL Error: " << SDL_GetError() << std::endl;
}
// Crea el fichero en modo escritura
file = SDL_RWFromFile(this->file.c_str(), "w+b");
if (file != NULL)
{
if (options->console)
{
std::cout << "New file created!" << std::endl;
}
// Guarda la información
for (int i = 0; i < (int)cheevos.size(); ++i)
{
SDL_RWwrite(file, &cheevos[i].completed, sizeof(bool), 1);
}
// Cierra el fichero
SDL_RWclose(file);
}
else
{
if (options->console)
{
std::cout << "Error: Unable to create file! SDL Error: " << SDL_GetError() << std::endl;
}
}
}
// El fichero existe
else
{
// Carga los datos
if (options->console)
{
std::cout << "Reading file...!" << std::endl;
}
for (int i = 0; i < (int)cheevos.size(); ++i)
{
SDL_RWread(file, &cheevos[i].completed, sizeof(bool), 1);
}
// Cierra el fichero
SDL_RWclose(file);
}
}
// Guarda el estado de los logros en un fichero
void Cheevos::saveToFile()
{
// Abre el fichero en modo escritura
SDL_RWops *file = SDL_RWFromFile(this->file.c_str(), "w+b");
if (file != NULL)
{
// Guarda la información
for (int i = 0; i < (int)cheevos.size(); ++i)
{
SDL_RWwrite(file, &cheevos[i].completed, sizeof(bool), 1);
}
// Cierra el fichero
SDL_RWclose(file);
}
else
{
if (options->console)
{
std::cout << "Error: Unable to save file! " << SDL_GetError() << std::endl;
}
}
} }

View File

@@ -1,5 +1,6 @@
#pragma once #pragma once
#include <SDL2/SDL.h> #include <SDL2/SDL.h>
#include "common/screen.h"
#include "common/utils.h" #include "common/utils.h"
#include <string> #include <string>
#include <vector> #include <vector>
@@ -7,21 +8,55 @@
#ifndef CHEEVOS_H #ifndef CHEEVOS_H
#define CHEEVOS_H #define CHEEVOS_H
struct cheevos_t
{
int id; // Identificador del logro
std::string caption; // Texto con el nombre del logro
std::string description; // Texto que describe el logro
int icon; // Indice del icono a utilizar en la notificación
bool completed; // Indica si se ha obtenido el logro
bool valid; // Indica si se puede obtener el logro
};
class Cheevos class Cheevos
{ {
private: private:
// Punteros y objetos // Punteros y objetos
options_t *options; Screen *screen; // Objeto encargado de dibujar en pantalla
options_t *options; // Puntero a las opciones del juego
// Variables // Variables
std::vector<cheevos_t> cheevos; // Listado de logros
bool enabled; // Indica si los logros se pueden obtener
std::string file; // Fichero done leer/almacenar el estado de los logros
// Inicializa los logros
void init();
// Busca un logro por id y devuelve el indice
int find(int id);
// Carga el estado de los logros desde un fichero
void loadFromFile();
// Guarda el estado de los logros en un fichero
void saveToFile();
public: public:
// Constructor // Constructor
Cheevos(options_t *options); Cheevos(Screen *screen, options_t *options, std::string file);
// Destructor // Destructor
~Cheevos(); ~Cheevos();
// Desbloquea un logro
void unlock(int id);
// Invalida un logro
void invalidate(int id);
// Habilita o deshabilita los logros
void enable(bool value);
}; };
#endif #endif

View File

@@ -222,121 +222,121 @@ int AnimatedSprite::getIndex(std::string name)
// Calcula el frame correspondiente a la animación // Calcula el frame correspondiente a la animación
void AnimatedSprite::animate() void AnimatedSprite::animate()
{ {
if (!enabled || animation.at(currentAnimation).speed == 0) if (!enabled || animation[currentAnimation].speed == 0)
{ {
return; return;
} }
// Calcula el frame actual a partir del contador // Calcula el frame actual a partir del contador
animation.at(currentAnimation).currentFrame = animation.at(currentAnimation).counter / animation.at(currentAnimation).speed; animation[currentAnimation].currentFrame = animation[currentAnimation].counter / animation[currentAnimation].speed;
// Si alcanza el final de la animación, reinicia el contador de la animación // Si alcanza el final de la animación, reinicia el contador de la animación
// en función de la variable loop y coloca el nuevo frame // en función de la variable loop y coloca el nuevo frame
if (animation.at(currentAnimation).currentFrame >= (int)animation.at(currentAnimation).frames.size()) if (animation[currentAnimation].currentFrame >= (int)animation[currentAnimation].frames.size())
{ {
if (animation.at(currentAnimation).loop == -1) if (animation[currentAnimation].loop == -1)
{ // Si no hay loop, deja el último frame { // Si no hay loop, deja el último frame
animation.at(currentAnimation).currentFrame = animation.at(currentAnimation).frames.size(); animation[currentAnimation].currentFrame = animation[currentAnimation].frames.size();
animation.at(currentAnimation).completed = true; animation[currentAnimation].completed = true;
} }
else else
{ // Si hay loop, vuelve al frame indicado { // Si hay loop, vuelve al frame indicado
animation.at(currentAnimation).counter = 0; animation[currentAnimation].counter = 0;
animation.at(currentAnimation).currentFrame = animation.at(currentAnimation).loop; animation[currentAnimation].currentFrame = animation[currentAnimation].loop;
} }
} }
// En caso contrario // En caso contrario
else else
{ {
// Escoge el frame correspondiente de la animación // Escoge el frame correspondiente de la animación
setSpriteClip(animation.at(currentAnimation).frames.at(animation.at(currentAnimation).currentFrame)); setSpriteClip(animation[currentAnimation].frames[animation[currentAnimation].currentFrame]);
// Incrementa el contador de la animacion // Incrementa el contador de la animacion
animation.at(currentAnimation).counter++; animation[currentAnimation].counter++;
} }
} }
// Obtiene el numero de frames de la animación actual // Obtiene el numero de frames de la animación actual
int AnimatedSprite::getNumFrames() int AnimatedSprite::getNumFrames()
{ {
return (int)animation.at(currentAnimation).frames.size(); return (int)animation[currentAnimation].frames.size();
} }
// Establece el frame actual de la animación // Establece el frame actual de la animación
void AnimatedSprite::setCurrentFrame(int num) void AnimatedSprite::setCurrentFrame(int num)
{ {
// Descarta valores fuera de rango // Descarta valores fuera de rango
if (num >= (int)animation.at(currentAnimation).frames.size()) if (num >= (int)animation[currentAnimation].frames.size())
{ {
num = 0; num = 0;
} }
// Cambia el valor de la variable // Cambia el valor de la variable
animation.at(currentAnimation).currentFrame = num; animation[currentAnimation].currentFrame = num;
animation.at(currentAnimation).counter = 0; animation[currentAnimation].counter = 0;
// Escoge el frame correspondiente de la animación // Escoge el frame correspondiente de la animación
setSpriteClip(animation.at(currentAnimation).frames.at(animation.at(currentAnimation).currentFrame)); setSpriteClip(animation[currentAnimation].frames[animation[currentAnimation].currentFrame]);
} }
// Establece el valor del contador // Establece el valor del contador
void AnimatedSprite::setAnimationCounter(std::string name, int num) void AnimatedSprite::setAnimationCounter(std::string name, int num)
{ {
animation.at(getIndex(name)).counter = num; animation[getIndex(name)].counter = num;
} }
// Establece la velocidad de una animación // Establece la velocidad de una animación
void AnimatedSprite::setAnimationSpeed(std::string name, int speed) void AnimatedSprite::setAnimationSpeed(std::string name, int speed)
{ {
animation.at(getIndex(name)).counter = speed; animation[getIndex(name)].counter = speed;
} }
// Establece la velocidad de una animación // Establece la velocidad de una animación
void AnimatedSprite::setAnimationSpeed(int index, int speed) void AnimatedSprite::setAnimationSpeed(int index, int speed)
{ {
animation.at(index).counter = speed; animation[index].counter = speed;
} }
// Establece si la animación se reproduce en bucle // Establece si la animación se reproduce en bucle
void AnimatedSprite::setAnimationLoop(std::string name, int loop) void AnimatedSprite::setAnimationLoop(std::string name, int loop)
{ {
animation.at(getIndex(name)).loop = loop; animation[getIndex(name)].loop = loop;
} }
// Establece si la animación se reproduce en bucle // Establece si la animación se reproduce en bucle
void AnimatedSprite::setAnimationLoop(int index, int loop) void AnimatedSprite::setAnimationLoop(int index, int loop)
{ {
animation.at(index).loop = loop; animation[index].loop = loop;
} }
// Establece el valor de la variable // Establece el valor de la variable
void AnimatedSprite::setAnimationCompleted(std::string name, bool value) void AnimatedSprite::setAnimationCompleted(std::string name, bool value)
{ {
animation.at(getIndex(name)).completed = value; animation[getIndex(name)].completed = value;
} }
// OLD - Establece el valor de la variable // OLD - Establece el valor de la variable
void AnimatedSprite::setAnimationCompleted(int index, bool value) void AnimatedSprite::setAnimationCompleted(int index, bool value)
{ {
animation.at(index).completed = value; animation[index].completed = value;
} }
// Comprueba si ha terminado la animación // Comprueba si ha terminado la animación
bool AnimatedSprite::animationIsCompleted() bool AnimatedSprite::animationIsCompleted()
{ {
return animation.at(currentAnimation).completed; return animation[currentAnimation].completed;
} }
// Devuelve el rectangulo de una animación y frame concreto // Devuelve el rectangulo de una animación y frame concreto
SDL_Rect AnimatedSprite::getAnimationClip(std::string name, Uint8 index) SDL_Rect AnimatedSprite::getAnimationClip(std::string name, Uint8 index)
{ {
return animation.at(getIndex(name)).frames.at(index); return animation[getIndex(name)].frames[index];
} }
// Devuelve el rectangulo de una animación y frame concreto // Devuelve el rectangulo de una animación y frame concreto
SDL_Rect AnimatedSprite::getAnimationClip(int indexA, Uint8 indexF) SDL_Rect AnimatedSprite::getAnimationClip(int indexA, Uint8 indexF)
{ {
return animation.at(indexA).frames.at(indexF); return animation[indexA].frames[indexF];
} }
// Carga la animación desde un vector // Carga la animación desde un vector
@@ -484,9 +484,9 @@ void AnimatedSprite::setCurrentAnimation(std::string name)
if (currentAnimation != newAnimation) if (currentAnimation != newAnimation)
{ {
currentAnimation = newAnimation; currentAnimation = newAnimation;
animation.at(currentAnimation).currentFrame = 0; animation[currentAnimation].currentFrame = 0;
animation.at(currentAnimation).counter = 0; animation[currentAnimation].counter = 0;
animation.at(currentAnimation).completed = false; animation[currentAnimation].completed = false;
} }
} }
@@ -497,9 +497,9 @@ void AnimatedSprite::setCurrentAnimation(int index)
if (currentAnimation != newAnimation) if (currentAnimation != newAnimation)
{ {
currentAnimation = newAnimation; currentAnimation = newAnimation;
animation.at(currentAnimation).currentFrame = 0; animation[currentAnimation].currentFrame = 0;
animation.at(currentAnimation).counter = 0; animation[currentAnimation].counter = 0;
animation.at(currentAnimation).completed = false; animation[currentAnimation].completed = false;
} }
} }
@@ -513,7 +513,7 @@ void AnimatedSprite::update()
// Establece el rectangulo para un frame de una animación // Establece el rectangulo para un frame de una animación
void AnimatedSprite::setAnimationFrames(Uint8 index_animation, Uint8 index_frame, int x, int y, int w, int h) void AnimatedSprite::setAnimationFrames(Uint8 index_animation, Uint8 index_frame, int x, int y, int w, int h)
{ {
animation.at(index_animation).frames.push_back({x, y, w, h}); animation[index_animation].frames.push_back({x, y, w, h});
} }
// OLD - Establece el contador para todas las animaciones // OLD - Establece el contador para todas las animaciones
@@ -528,7 +528,7 @@ void AnimatedSprite::setAnimationCounter(int value)
// Reinicia la animación // Reinicia la animación
void AnimatedSprite::resetAnimation() void AnimatedSprite::resetAnimation()
{ {
animation.at(currentAnimation).currentFrame = 0; animation[currentAnimation].currentFrame = 0;
animation.at(currentAnimation).counter = 0; animation[currentAnimation].counter = 0;
animation.at(currentAnimation).completed = false; animation[currentAnimation].completed = false;
} }

View File

@@ -114,7 +114,7 @@ bool Asset::checkFile(std::string path)
// Comprueba si existe el fichero // Comprueba si existe el fichero
const std::string filename = path.substr(path.find_last_of("\\/") + 1); const std::string filename = path.substr(path.find_last_of("\\/") + 1);
SDL_RWops *file = SDL_RWFromFile(path.c_str(), "r+b"); SDL_RWops *file = SDL_RWFromFile(path.c_str(), "rb");
if (file != nullptr) if (file != nullptr)
{ {

View File

@@ -11,12 +11,12 @@ Input::Input(std::string file)
keyBindings_t kb; keyBindings_t kb;
kb.scancode = 0; kb.scancode = 0;
kb.active = false; kb.active = false;
keyBindings.resize(17, kb); keyBindings.resize(input_number_of_inputs, kb);
GameControllerBindings_t gcb; GameControllerBindings_t gcb;
gcb.button = SDL_CONTROLLER_BUTTON_INVALID; gcb.button = SDL_CONTROLLER_BUTTON_INVALID;
gcb.active = false; gcb.active = false;
gameControllerBindings.resize(17, gcb); gameControllerBindings.resize(input_number_of_inputs, gcb);
verbose = true; verbose = true;
enabled = true; enabled = true;
@@ -34,13 +34,13 @@ void Input::update()
// Asigna inputs a teclas // Asigna inputs a teclas
void Input::bindKey(Uint8 input, SDL_Scancode code) void Input::bindKey(Uint8 input, SDL_Scancode code)
{ {
keyBindings.at(input).scancode = code; keyBindings[input].scancode = code;
} }
// Asigna inputs a botones del mando // Asigna inputs a botones del mando
void Input::bindGameControllerButton(Uint8 input, SDL_GameControllerButton button) void Input::bindGameControllerButton(Uint8 input, SDL_GameControllerButton button)
{ {
gameControllerBindings.at(input).button = button; gameControllerBindings[input].button = button;
} }
// Comprueba si un input esta activo // Comprueba si un input esta activo
@@ -65,7 +65,7 @@ bool Input::checkInput(Uint8 input, bool repeat, int device, int index)
if (repeat) if (repeat)
{ {
if (keyStates[keyBindings.at(input).scancode] != 0) if (keyStates[keyBindings[input].scancode] != 0)
{ {
successKeyboard = true; successKeyboard = true;
} }
@@ -76,11 +76,11 @@ bool Input::checkInput(Uint8 input, bool repeat, int device, int index)
} }
else else
{ {
if (!keyBindings.at(input).active) if (!keyBindings[input].active)
{ {
if (keyStates[keyBindings.at(input).scancode] != 0) if (keyStates[keyBindings[input].scancode] != 0)
{ {
keyBindings.at(input).active = true; keyBindings[input].active = true;
successKeyboard = true; successKeyboard = true;
} }
else else
@@ -90,9 +90,9 @@ bool Input::checkInput(Uint8 input, bool repeat, int device, int index)
} }
else else
{ {
if (keyStates[keyBindings.at(input).scancode] == 0) if (keyStates[keyBindings[input].scancode] == 0)
{ {
keyBindings.at(input).active = false; keyBindings[input].active = false;
successKeyboard = false; successKeyboard = false;
} }
else else
@@ -108,7 +108,7 @@ bool Input::checkInput(Uint8 input, bool repeat, int device, int index)
{ {
if (repeat) if (repeat)
{ {
if (SDL_GameControllerGetButton(connectedControllers.at(index), gameControllerBindings.at(input).button) != 0) if (SDL_GameControllerGetButton(connectedControllers[index], gameControllerBindings[input].button) != 0)
{ {
successGameController = true; successGameController = true;
} }
@@ -119,11 +119,11 @@ bool Input::checkInput(Uint8 input, bool repeat, int device, int index)
} }
else else
{ {
if (!gameControllerBindings.at(input).active) if (!gameControllerBindings[input].active)
{ {
if (SDL_GameControllerGetButton(connectedControllers.at(index), gameControllerBindings.at(input).button) != 0) if (SDL_GameControllerGetButton(connectedControllers[index], gameControllerBindings[input].button) != 0)
{ {
gameControllerBindings.at(input).active = true; gameControllerBindings[input].active = true;
successGameController = true; successGameController = true;
} }
else else
@@ -133,9 +133,9 @@ bool Input::checkInput(Uint8 input, bool repeat, int device, int index)
} }
else else
{ {
if (SDL_GameControllerGetButton(connectedControllers.at(index), gameControllerBindings.at(input).button) == 0) if (SDL_GameControllerGetButton(connectedControllers[index], gameControllerBindings[input].button) == 0)
{ {
gameControllerBindings.at(input).active = false; gameControllerBindings[input].active = false;
successGameController = false; successGameController = false;
} }
else else
@@ -163,7 +163,7 @@ bool Input::checkAnyInput(int device, int index)
for (int i = 0; i < (int)keyBindings.size(); ++i) for (int i = 0; i < (int)keyBindings.size(); ++i)
{ {
if (mKeystates[keyBindings.at(i).scancode] != 0) if (mKeystates[keyBindings[i].scancode] != 0)
{ {
return true; return true;
} }
@@ -176,7 +176,7 @@ bool Input::checkAnyInput(int device, int index)
{ {
for (int i = 0; i < (int)gameControllerBindings.size(); ++i) for (int i = 0; i < (int)gameControllerBindings.size(); ++i)
{ {
if (SDL_GameControllerGetButton(connectedControllers.at(index), gameControllerBindings.at(i).button) != 0) if (SDL_GameControllerGetButton(connectedControllers[index], gameControllerBindings[i].button) != 0)
{ {
return true; return true;
} }
@@ -277,7 +277,7 @@ std::string Input::getControllerName(int index)
{ {
if (numGamepads > 0) if (numGamepads > 0)
{ {
return controllerNames.at(index); return controllerNames[index];
} }
else else
{ {

View File

@@ -7,23 +7,31 @@
#ifndef INPUT_H #ifndef INPUT_H
#define INPUT_H #define INPUT_H
#define INPUT_NULL 0 enum inputs_e
#define INPUT_UP 1 {
#define INPUT_DOWN 2 // Inputs obligatorios
#define INPUT_LEFT 3 input_null,
#define INPUT_RIGHT 4 input_up,
#define INPUT_ACCEPT 5 input_down,
#define INPUT_CANCEL 6 input_left,
#define INPUT_BUTTON_1 7 input_right,
#define INPUT_BUTTON_2 8 input_pause,
#define INPUT_BUTTON_3 9 input_exit,
#define INPUT_BUTTON_4 10 input_accept,
#define INPUT_BUTTON_5 11 input_cancel,
#define INPUT_BUTTON_6 12
#define INPUT_BUTTON_7 13 // Inputs personalizados
#define INPUT_BUTTON_8 14 input_jump,
#define INPUT_BUTTON_PAUSE 15 input_window_fullscreen,
#define INPUT_BUTTON_ESCAPE 16 input_window_inc_size,
input_window_dec_size,
input_toggle_border,
input_switch_music,
input_swap_palette,
// Input obligatorio
input_number_of_inputs
};
#define REPEAT_TRUE true #define REPEAT_TRUE true
#define REPEAT_FALSE false #define REPEAT_FALSE false
@@ -81,7 +89,7 @@ public:
void bindGameControllerButton(Uint8 input, SDL_GameControllerButton button); void bindGameControllerButton(Uint8 input, SDL_GameControllerButton button);
// Comprueba si un input esta activo // Comprueba si un input esta activo
bool checkInput(Uint8 input, bool repeat, int device = INPUT_USE_ANY, int index = 0); bool checkInput(Uint8 input, bool repeat = true, int device = INPUT_USE_ANY, int index = 0);
// Comprueba si hay almenos un input activo // Comprueba si hay almenos un input activo
bool checkAnyInput(int device = INPUT_USE_ANY, int index = 0); bool checkAnyInput(int device = INPUT_USE_ANY, int index = 0);

View File

@@ -1,3 +1,4 @@
#ifndef JA_USESDLMIXER
#include "jail_audio.h" #include "jail_audio.h"
#include "stb_vorbis.c" #include "stb_vorbis.c"
#include <SDL2/SDL.h> #include <SDL2/SDL.h>
@@ -11,7 +12,7 @@ struct JA_Sound_t {
}; };
struct JA_Channel_t { struct JA_Channel_t {
JA_Sound sound; JA_Sound_t *sound;
int pos {0}; int pos {0};
int times {0}; int times {0};
JA_Channel_state state { JA_CHANNEL_FREE }; JA_Channel_state state { JA_CHANNEL_FREE };
@@ -25,7 +26,7 @@ struct JA_Music_t {
JA_Music_state state {JA_MUSIC_INVALID}; JA_Music_state state {JA_MUSIC_INVALID};
}; };
JA_Music current_music{NULL}; JA_Music_t *current_music{NULL};
JA_Channel_t channels[JA_MAX_SIMULTANEOUS_CHANNELS]; JA_Channel_t channels[JA_MAX_SIMULTANEOUS_CHANNELS];
int JA_freq {48000}; int JA_freq {48000};
@@ -86,7 +87,7 @@ void JA_Quit() {
sdlAudioDevice = 0; sdlAudioDevice = 0;
} }
JA_Music JA_LoadMusic(const char* filename) { JA_Music_t *JA_LoadMusic(const char* filename) {
int chan, samplerate; int chan, samplerate;
// [RZC 28/08/22] Carreguem primer el arxiu en memòria i després el descomprimim. Es algo més rapid. // [RZC 28/08/22] Carreguem primer el arxiu en memòria i després el descomprimim. Es algo més rapid.
@@ -98,7 +99,7 @@ JA_Music JA_LoadMusic(const char* filename) {
if (fread(buffer, fsize, 1, f)!=1) return NULL; if (fread(buffer, fsize, 1, f)!=1) return NULL;
fclose(f); fclose(f);
JA_Music music = new JA_Music_t(); JA_Music_t *music = new JA_Music_t();
music->samples = stb_vorbis_decode_memory(buffer, fsize, &chan, &samplerate, &music->output); music->samples = stb_vorbis_decode_memory(buffer, fsize, &chan, &samplerate, &music->output);
free(buffer); free(buffer);
@@ -121,7 +122,7 @@ JA_Music JA_LoadMusic(const char* filename) {
return music; return music;
} }
void JA_PlayMusic(JA_Music music, const int loop) { void JA_PlayMusic(JA_Music_t *music, const int loop) {
if (current_music != NULL) { if (current_music != NULL) {
current_music->pos = 0; current_music->pos = 0;
current_music->state = JA_MUSIC_STOPPED; current_music->state = JA_MUSIC_STOPPED;
@@ -153,21 +154,21 @@ JA_Music_state JA_GetMusicState() {
return current_music->state; return current_music->state;
} }
void JA_DeleteMusic(JA_Music music) { void JA_DeleteMusic(JA_Music_t *music) {
if (current_music == music) current_music = NULL; if (current_music == music) current_music = NULL;
free(music->output); free(music->output);
delete music; delete music;
} }
JA_Sound JA_NewSound(Uint8* buffer, Uint32 length) { JA_Sound_t *JA_NewSound(Uint8* buffer, Uint32 length) {
JA_Sound sound = new JA_Sound_t(); JA_Sound_t *sound = new JA_Sound_t();
sound->buffer = buffer; sound->buffer = buffer;
sound->length = length; sound->length = length;
return sound; return sound;
} }
JA_Sound JA_LoadSound(const char* filename) { JA_Sound_t *JA_LoadSound(const char* filename) {
JA_Sound sound = new JA_Sound_t(); JA_Sound_t *sound = new JA_Sound_t();
SDL_AudioSpec wavSpec; SDL_AudioSpec wavSpec;
SDL_LoadWAV(filename, &wavSpec, &sound->buffer, &sound->length); SDL_LoadWAV(filename, &wavSpec, &sound->buffer, &sound->length);
@@ -184,7 +185,7 @@ JA_Sound JA_LoadSound(const char* filename) {
return sound; return sound;
} }
int JA_PlaySound(JA_Sound sound, const int loop) { int JA_PlaySound(JA_Sound_t *sound, const int loop) {
int channel = 0; int channel = 0;
while (channel < JA_MAX_SIMULTANEOUS_CHANNELS && channels[channel].state != JA_CHANNEL_FREE) { channel++; } while (channel < JA_MAX_SIMULTANEOUS_CHANNELS && channels[channel].state != JA_CHANNEL_FREE) { channel++; }
if (channel == JA_MAX_SIMULTANEOUS_CHANNELS) channel = 0; if (channel == JA_MAX_SIMULTANEOUS_CHANNELS) channel = 0;
@@ -196,7 +197,7 @@ int JA_PlaySound(JA_Sound sound, const int loop) {
return channel; return channel;
} }
void JA_DeleteSound(JA_Sound sound) { void JA_DeleteSound(JA_Sound_t *sound) {
for (int i = 0; i < JA_MAX_SIMULTANEOUS_CHANNELS; i++) { for (int i = 0; i < JA_MAX_SIMULTANEOUS_CHANNELS; i++) {
if (channels[i].sound == sound) JA_StopChannel(i); if (channels[i].sound == sound) JA_StopChannel(i);
} }
@@ -246,4 +247,5 @@ JA_Channel_state JA_GetChannelState(const int channel) {
int JA_SetVolume(int volume) { int JA_SetVolume(int volume) {
JA_volume = volume > 128 ? 128 : volume < 0 ? 0 : volume; JA_volume = volume > 128 ? 128 : volume < 0 ? 0 : volume;
return JA_volume; return JA_volume;
} }
#endif

View File

@@ -4,27 +4,27 @@
enum JA_Channel_state { JA_CHANNEL_INVALID, JA_CHANNEL_FREE, JA_CHANNEL_PLAYING, JA_CHANNEL_PAUSED }; enum JA_Channel_state { JA_CHANNEL_INVALID, JA_CHANNEL_FREE, JA_CHANNEL_PLAYING, JA_CHANNEL_PAUSED };
enum JA_Music_state { JA_MUSIC_INVALID, JA_MUSIC_PLAYING, JA_MUSIC_PAUSED, JA_MUSIC_STOPPED }; enum JA_Music_state { JA_MUSIC_INVALID, JA_MUSIC_PLAYING, JA_MUSIC_PAUSED, JA_MUSIC_STOPPED };
typedef struct JA_Sound_t *JA_Sound; struct JA_Sound_t;
typedef struct JA_Music_t *JA_Music; struct JA_Music_t;
void JA_Init(const int freq, const SDL_AudioFormat format, const int channels); void JA_Init(const int freq, const SDL_AudioFormat format, const int channels);
void JA_Quit(); void JA_Quit();
JA_Music JA_LoadMusic(const char* filename); JA_Music_t *JA_LoadMusic(const char* filename);
void JA_PlayMusic(JA_Music music, const int loop = -1); void JA_PlayMusic(JA_Music_t *music, const int loop = -1);
void JA_PauseMusic(); void JA_PauseMusic();
void JA_ResumeMusic(); void JA_ResumeMusic();
void JA_StopMusic(); void JA_StopMusic();
JA_Music_state JA_GetMusicState(); JA_Music_state JA_GetMusicState();
void JA_DeleteMusic(JA_Music music); void JA_DeleteMusic(JA_Music_t *music);
JA_Sound JA_NewSound(Uint8* buffer, Uint32 length); JA_Sound_t *JA_NewSound(Uint8* buffer, Uint32 length);
JA_Sound JA_LoadSound(const char* filename); JA_Sound_t *JA_LoadSound(const char* filename);
int JA_PlaySound(JA_Sound sound, const int loop = 0); int JA_PlaySound(JA_Sound_t *sound, const int loop = 0);
void JA_PauseChannel(const int channel); void JA_PauseChannel(const int channel);
void JA_ResumeChannel(const int channel); void JA_ResumeChannel(const int channel);
void JA_StopChannel(const int channel); void JA_StopChannel(const int channel);
JA_Channel_state JA_GetChannelState(const int channel); JA_Channel_state JA_GetChannelState(const int channel);
void JA_DeleteSound(JA_Sound sound); void JA_DeleteSound(JA_Sound_t *sound);
int JA_SetVolume(int volume); int JA_SetVolume(int volume);

View File

@@ -0,0 +1,101 @@
#ifdef JA_USESDLMIXER
#include "jail_audio.h"
#include <SDL2/SDL.h>
#include <SDL2/SDL_mixer.h>
#include <stdio.h>
struct JA_Sound_t {}; // Dummy structs
struct JA_Music_t {};
int JA_freq {48000};
SDL_AudioFormat JA_format {AUDIO_S16};
Uint8 JA_channels {2};
void JA_Init(const int freq, const SDL_AudioFormat format, const int channels) {
JA_freq = freq;
JA_format = format;
JA_channels = channels;
Mix_OpenAudio(JA_freq, JA_format, JA_channels, 1024);
}
void JA_Quit() {
Mix_CloseAudio();
}
JA_Music_t *JA_LoadMusic(const char* filename) {
return (JA_Music_t*)Mix_LoadMUS(filename);
}
void JA_PlayMusic(JA_Music_t *music, const int loop) {
Mix_PlayMusic((Mix_Music*)music, loop);
}
void JA_PauseMusic() {
Mix_PauseMusic();
}
void JA_ResumeMusic() {
Mix_ResumeMusic();
}
void JA_StopMusic() {
Mix_HaltMusic();
}
JA_Music_state JA_GetMusicState() {
if (Mix_PausedMusic()) {
return JA_MUSIC_PAUSED;
} else if (Mix_PlayingMusic()) {
return JA_MUSIC_PLAYING;
} else {
return JA_MUSIC_STOPPED;
}
}
void JA_DeleteMusic(JA_Music_t *music) {
Mix_FreeMusic((Mix_Music*)music);
}
JA_Sound_t *JA_NewSound(Uint8* buffer, Uint32 length) {
return NULL;
}
JA_Sound_t *JA_LoadSound(const char* filename) {
JA_Sound_t *sound = (JA_Sound_t*)Mix_LoadWAV(filename);
return sound;
}
int JA_PlaySound(JA_Sound_t *sound, const int loop) {
return Mix_PlayChannel(-1, (Mix_Chunk*)sound, loop);
}
void JA_DeleteSound(JA_Sound_t *sound) {
Mix_FreeChunk((Mix_Chunk*)sound);
}
void JA_PauseChannel(const int channel) {
Mix_Pause(channel);
}
void JA_ResumeChannel(const int channel) {
Mix_Resume(channel);
}
void JA_StopChannel(const int channel) {
Mix_HaltChannel(channel);
}
JA_Channel_state JA_GetChannelState(const int channel) {
if (Mix_Paused(channel)) {
return JA_CHANNEL_PAUSED;
} else if (Mix_Playing(channel)) {
return JA_CHANNEL_PLAYING;
} else {
return JA_CHANNEL_FREE;
}
}
int JA_SetVolume(int volume) {
return Mix_Volume(-1, volume);
}
#endif

View File

@@ -458,7 +458,7 @@ void Menu::setSelectorPos(int index)
if (index < (int)item.size()) if (index < (int)item.size())
{ {
selector.index = index; selector.index = index;
selector.rect.y = selector.y = selector.originY = selector.targetY = item.at(selector.index).rect.y; selector.rect.y = selector.y = selector.originY = selector.targetY = item[selector.index].rect.y;
selector.rect.w = rectBG.rect.w; selector.rect.w = rectBG.rect.w;
selector.rect.x = rectBG.rect.x; selector.rect.x = rectBG.rect.x;
selector.originH = selector.targetH = selector.rect.h = getSelectorHeight(selector.index); selector.originH = selector.targetH = selector.rect.h = getSelectorHeight(selector.index);
@@ -486,13 +486,13 @@ void Menu::reset()
{ {
itemSelected = MENU_NO_OPTION; itemSelected = MENU_NO_OPTION;
selector.index = 0; selector.index = 0;
selector.originY = selector.targetY = selector.y = item.at(0).rect.y; selector.originY = selector.targetY = selector.y = item[0].rect.y;
selector.originH = selector.targetH = item.at(0).rect.h; selector.originH = selector.targetH = item[0].rect.h;
selector.moving = false; selector.moving = false;
selector.resizing = false; selector.resizing = false;
// Si el primer elemento no es seleccionable, incrementa el selector // Si el primer elemento no es seleccionable, incrementa el selector
if (!item.at(selector.index).selectable) if (!item[selector.index].selectable)
{ {
increaseSelectorIndex(); increaseSelectorIndex();
setSelectorPos(selector.index); setSelectorPos(selector.index);
@@ -524,18 +524,18 @@ void Menu::reorganize()
bool Menu::increaseSelectorIndex() bool Menu::increaseSelectorIndex()
{ {
// Obten las coordenadas del elemento actual // Obten las coordenadas del elemento actual
selector.y = selector.originY = item.at(selector.index).rect.y; selector.y = selector.originY = item[selector.index].rect.y;
selector.h = selector.originH = getSelectorHeight(selector.index); selector.h = selector.originH = getSelectorHeight(selector.index);
// Calcula cual es el siguiente elemento // Calcula cual es el siguiente elemento
++selector.index %= item.size(); ++selector.index %= item.size();
while (!item.at(selector.index).selectable) while (!item[selector.index].selectable)
{ {
++selector.index %= item.size(); ++selector.index %= item.size();
} }
// Establece las coordenadas y altura de destino // Establece las coordenadas y altura de destino
selector.targetY = item.at(selector.index).rect.y; selector.targetY = item[selector.index].rect.y;
selector.despY = (selector.targetY - selector.originY) / selector.numJumps; selector.despY = (selector.targetY - selector.originY) / selector.numJumps;
selector.targetH = getSelectorHeight(selector.index); selector.targetH = getSelectorHeight(selector.index);
@@ -554,7 +554,7 @@ bool Menu::increaseSelectorIndex()
bool Menu::decreaseSelectorIndex() bool Menu::decreaseSelectorIndex()
{ {
// Obten las coordenadas del elemento actual // Obten las coordenadas del elemento actual
selector.y = selector.originY = item.at(selector.index).rect.y; selector.y = selector.originY = item[selector.index].rect.y;
selector.h = selector.originH = getSelectorHeight(selector.index); selector.h = selector.originH = getSelectorHeight(selector.index);
// Calcula cual es el siguiente elemento // Calcula cual es el siguiente elemento
@@ -567,7 +567,7 @@ bool Menu::decreaseSelectorIndex()
selector.index--; selector.index--;
} }
while (!item.at(selector.index).selectable) while (!item[selector.index].selectable)
{ {
if (selector.index == 0) if (selector.index == 0)
{ {
@@ -580,7 +580,7 @@ bool Menu::decreaseSelectorIndex()
} }
// Establece las coordenadas y altura de destino // Establece las coordenadas y altura de destino
selector.targetY = item.at(selector.index).rect.y; selector.targetY = item[selector.index].rect.y;
selector.despY = (selector.targetY - selector.originY) / selector.numJumps; selector.despY = (selector.targetY - selector.originY) / selector.numJumps;
selector.targetH = getSelectorHeight(selector.index); selector.targetH = getSelectorHeight(selector.index);
@@ -630,29 +630,29 @@ void Menu::render()
if (i == selector.index) if (i == selector.index)
{ {
const color_t color = {selector.itemColor.r, selector.itemColor.g, selector.itemColor.b}; const color_t color = {selector.itemColor.r, selector.itemColor.g, selector.itemColor.b};
text->writeColored(item.at(i).rect.x, item.at(i).rect.y, item.at(i).label, color); text->writeColored(item[i].rect.x, item[i].rect.y, item[i].label, color);
} }
else if (item.at(i).selectable) else if (item[i].selectable)
{ {
text->write(item.at(i).rect.x, item.at(i).rect.y, item.at(i).label); text->write(item[i].rect.x, item[i].rect.y, item[i].label);
} }
else if (item.at(i).greyed) else if (item[i].greyed)
{ {
text->writeColored(item.at(i).rect.x, item.at(i).rect.y, item.at(i).label, colorGreyed); text->writeColored(item[i].rect.x, item[i].rect.y, item[i].label, colorGreyed);
} }
else else
{ // No seleccionable { // No seleccionable
if ((item.at(i).linkedUp) && (i == selector.index + 1)) if ((item[i].linkedUp) && (i == selector.index + 1))
{ {
const color_t color = {selector.itemColor.r, selector.itemColor.g, selector.itemColor.b}; const color_t color = {selector.itemColor.r, selector.itemColor.g, selector.itemColor.b};
text->writeColored(item.at(i).rect.x, item.at(i).rect.y, item.at(i).label, color); text->writeColored(item[i].rect.x, item[i].rect.y, item[i].label, color);
} }
else // No enlazado con el de arriba else // No enlazado con el de arriba
{ {
text->write(item.at(i).rect.x, item.at(i).rect.y, item.at(i).label); text->write(item[i].rect.x, item[i].rect.y, item[i].label);
} }
} }
} }
@@ -822,7 +822,7 @@ void Menu::addItem(std::string text, int hPaddingDown, bool selectable, bool gre
if (item.size() > 1) if (item.size() > 1)
{ {
if (item.at(item.size() - 2).linkedDown) if (item[item.size() - 2].linkedDown)
{ {
item.back().linkedUp = true; item.back().linkedUp = true;
} }
@@ -835,9 +835,9 @@ void Menu::addItem(std::string text, int hPaddingDown, bool selectable, bool gre
// Cambia el texto de un item // Cambia el texto de un item
void Menu::setItemCaption(int index, std::string text) void Menu::setItemCaption(int index, std::string text)
{ {
item.at(index).label = text; item[index].label = text;
item.at(index).rect.w = this->text->lenght(item.at(index).label); item[index].rect.w = this->text->lenght(item[index].label);
item.at(index).rect.h = this->text->getCharacterSize(); item[index].rect.h = this->text->getCharacterSize();
reorganize(); reorganize();
} }
@@ -850,7 +850,7 @@ void Menu::setDefaultActionWhenCancel(int item)
// Gestiona la entrada de teclado y mando durante el menu // Gestiona la entrada de teclado y mando durante el menu
void Menu::checkInput() void Menu::checkInput()
{ {
if (input->checkInput(INPUT_UP, REPEAT_FALSE)) if (input->checkInput(input_up, REPEAT_FALSE))
{ {
if (decreaseSelectorIndex()) if (decreaseSelectorIndex())
{ {
@@ -861,7 +861,7 @@ void Menu::checkInput()
} }
} }
if (input->checkInput(INPUT_DOWN, REPEAT_FALSE)) if (input->checkInput(input_down, REPEAT_FALSE))
{ {
if (increaseSelectorIndex()) if (increaseSelectorIndex())
{ {
@@ -872,7 +872,7 @@ void Menu::checkInput()
} }
} }
if (input->checkInput(INPUT_ACCEPT, REPEAT_FALSE)) if (input->checkInput(input_accept, REPEAT_FALSE))
{ {
itemSelected = selector.index; itemSelected = selector.index;
if (soundAccept) if (soundAccept)
@@ -881,7 +881,7 @@ void Menu::checkInput()
} }
} }
if (input->checkInput(INPUT_CANCEL, REPEAT_FALSE)) if (input->checkInput(input_cancel, REPEAT_FALSE))
{ {
itemSelected = defaultActionWhenCancel; itemSelected = defaultActionWhenCancel;
if (soundCancel) if (soundCancel)
@@ -914,42 +914,42 @@ int Menu::findHeight()
// Recoloca los elementos del menu en el eje Y // Recoloca los elementos del menu en el eje Y
void Menu::replaceElementsOnY() void Menu::replaceElementsOnY()
{ {
item.at(0).rect.y = y; item[0].rect.y = y;
for (int i = 1; i < (int)item.size(); i++) for (int i = 1; i < (int)item.size(); i++)
{ {
item.at(i).rect.y = item.at(i - 1).rect.y + item.at(i - 1).rect.h + item.at(i - 1).hPaddingDown; item[i].rect.y = item[i - 1].rect.y + item[i - 1].rect.h + item[i - 1].hPaddingDown;
} }
} }
// Establece el estado seleccionable de un item // Establece el estado seleccionable de un item
void Menu::setSelectable(int index, bool value) void Menu::setSelectable(int index, bool value)
{ {
item.at(index).selectable = value; item[index].selectable = value;
} }
// Establece el estado agrisado de un item // Establece el estado agrisado de un item
void Menu::setGreyed(int index, bool value) void Menu::setGreyed(int index, bool value)
{ {
item.at(index).greyed = value; item[index].greyed = value;
} }
// Establece el estado de enlace de un item // Establece el estado de enlace de un item
void Menu::setLinkedDown(int index, bool value) void Menu::setLinkedDown(int index, bool value)
{ {
item.at(index).linkedDown = value; item[index].linkedDown = value;
} }
// Calcula la altura del selector // Calcula la altura del selector
int Menu::getSelectorHeight(int value) int Menu::getSelectorHeight(int value)
{ {
if (item.at(value).linkedDown) if (item[value].linkedDown)
{ {
return item.at(value).rect.h + item.at(value).hPaddingDown + item.at(value + 1).rect.h; return item[value].rect.h + item[value].hPaddingDown + item[value + 1].rect.h;
} }
else else
{ {
return item.at(value).rect.h; return item[value].rect.h;
} }
} }

View File

@@ -91,9 +91,9 @@ private:
bool isCenteredOnY; // Variable para saber si el menu debe estar centrado respecto a un punto en el eje Y bool isCenteredOnY; // Variable para saber si el menu debe estar centrado respecto a un punto en el eje Y
bool areElementsCenteredOnX; // Variable para saber si los elementos van centrados en el eje X bool areElementsCenteredOnX; // Variable para saber si los elementos van centrados en el eje X
int widestItem; // Anchura del elemento más ancho int widestItem; // Anchura del elemento más ancho
JA_Sound soundAccept; // Sonido al aceptar o elegir una opción del menu JA_Sound_t* soundAccept; // Sonido al aceptar o elegir una opción del menu
JA_Sound soundCancel; // Sonido al cancelar el menu JA_Sound_t* soundCancel; // Sonido al cancelar el menu
JA_Sound soundMove; // Sonido al mover el selector JA_Sound_t* soundMove; // Sonido al mover el selector
color_t colorGreyed; // Color para los elementos agrisados color_t colorGreyed; // Color para los elementos agrisados
rectangle_t rectBG; // Rectangulo de fondo del menu rectangle_t rectBG; // Rectangulo de fondo del menu
std::vector<item_t> item; // Estructura para cada elemento del menu std::vector<item_t> item; // Estructura para cada elemento del menu

View File

@@ -4,26 +4,29 @@
#include <iostream> #include <iostream>
// Constructor // Constructor
Notify::Notify(SDL_Renderer *renderer, std::string bitmapFile, std::string textFile, std::string soundFile) Notify::Notify(SDL_Renderer *renderer, std::string iconFile, std::string bitmapFile, std::string textFile, std::string soundFile, options_t *options)
{ {
// Inicializa variables // Inicializa variables
this->renderer = renderer; this->renderer = renderer;
bgColor = {64, 64, 64}; this->options = options;
bgColor = options->notifications.color;
waitTime = 300; waitTime = 300;
// Crea objetos // Crea objetos
texture = new Texture(renderer, bitmapFile); iconTexture = new Texture(renderer, iconFile);
text = new Text(textFile, texture, renderer); textTexture = new Texture(renderer, bitmapFile);
sound = JA_LoadSound(soundFile.c_str()); text = new Text(textFile, textTexture, renderer);
sound = JA_LoadSound(soundFile.c_str());
} }
// Destructor // Destructor
Notify::~Notify() Notify::~Notify()
{ {
// Libera la memoria de los objetos // Libera la memoria de los objetos
delete texture; delete textTexture;
delete iconTexture;
delete text; delete text;
JA_DeleteSound(sound); JA_DeleteSound(sound);
for (auto notification : notifications) for (auto notification : notifications)
{ {
@@ -37,7 +40,7 @@ void Notify::render()
{ {
for (int i = (int)notifications.size() - 1; i >= 0; --i) for (int i = (int)notifications.size() - 1; i >= 0; --i)
{ {
notifications.at(i).sprite->render(); notifications[i].sprite->render();
} }
} }
@@ -46,49 +49,63 @@ void Notify::update()
{ {
for (int i = 0; i < (int)notifications.size(); ++i) for (int i = 0; i < (int)notifications.size(); ++i)
{ {
notifications.at(i).counter++; notifications[i].counter++;
// Comprueba los estados // Comprueba los estados
if (notifications.at(i).state == ns_rising) if (notifications[i].state == ns_rising)
{ {
const float step = ((float)notifications.at(i).counter / notifications.at(i).travelDist); const float step = ((float)notifications[i].counter / notifications[i].travelDist);
const int alpha = 255 * step; const int alpha = 255 * step;
notifications.at(i).rect.y++; if (options->notifications.posV == pos_top)
notifications.at(i).texture->setAlpha(alpha);
if (notifications.at(i).rect.y == notifications.at(i).y)
{ {
notifications.at(i).state = ns_stay; notifications[i].rect.y++;
notifications.at(i).texture->setAlpha(255); }
notifications.at(i).counter = 0; else
{
notifications[i].rect.y--;
}
notifications[i].texture->setAlpha(alpha);
if (notifications[i].rect.y == notifications[i].y)
{
notifications[i].state = ns_stay;
notifications[i].texture->setAlpha(255);
notifications[i].counter = 0;
} }
} }
else if (notifications.at(i).state == ns_stay) else if (notifications[i].state == ns_stay)
{ {
if (notifications.at(i).counter == waitTime) if (notifications[i].counter == waitTime)
{ {
notifications.at(i).state = ns_vanishing; notifications[i].state = ns_vanishing;
notifications.at(i).counter = 0; notifications[i].counter = 0;
} }
} }
else if (notifications.at(i).state == ns_vanishing) else if (notifications[i].state == ns_vanishing)
{ {
const float step = (notifications.at(i).counter / (float)notifications.at(i).travelDist); const float step = (notifications[i].counter / (float)notifications[i].travelDist);
const int alpha = 255 * (1 - step); const int alpha = 255 * (1 - step);
notifications.at(i).rect.y--; if (options->notifications.posV == pos_top)
notifications.at(i).texture->setAlpha(alpha);
if (notifications.at(i).rect.y == notifications.at(i).y - notifications.at(i).travelDist)
{ {
notifications.at(i).state = ns_finished; notifications[i].rect.y--;
}
else
{
notifications[i].rect.y++;
}
notifications[i].texture->setAlpha(alpha);
if (notifications[i].rect.y == notifications[i].y - notifications[i].travelDist)
{
notifications[i].state = ns_finished;
} }
} }
notifications.at(i).sprite->setRect(notifications.at(i).rect); notifications[i].sprite->setRect(notifications[i].rect);
} }
clearFinishedNotifications(); clearFinishedNotifications();
@@ -99,55 +116,143 @@ void Notify::clearFinishedNotifications()
{ {
for (int i = (int)notifications.size() - 1; i >= 0; --i) for (int i = (int)notifications.size() - 1; i >= 0; --i)
{ {
if (notifications.at(i).state == ns_finished) if (notifications[i].state == ns_finished)
{ {
delete notifications.at(i).sprite; delete notifications[i].sprite;
delete notifications.at(i).texture; delete notifications[i].texture;
notifications.erase(notifications.begin() + i); notifications.erase(notifications.begin() + i);
} }
} }
} }
// Muestra una notificación de texto por pantalla; // Muestra una notificación de texto por pantalla;
void Notify::showText(std::string text) void Notify::showText(std::string text1, std::string text2, int icon)
{ {
// Crea constantes // Inicializa variables
const int width = this->text->lenght(text) + (this->text->getCharacterSize() * 2); const int iconSize = 16;
const int height = this->text->getCharacterSize() * 2; const int padding = text->getCharacterSize();
const int despH = this->text->getCharacterSize() / 2; const int iconSpace = icon >= 0 ? iconSize + padding : 0;
const int despV = despH; const std::string txt = text1.length() > text2.length() ? text1 : text2;
const int travelDist = height + despV; const int width = text->lenght(txt) + (padding * 2) + iconSpace;
const int offset = (int)notifications.size() > 0 ? notifications.back().y + travelDist : despV; const int height = (text->getCharacterSize() * 2) + (padding * 2);
// Posición horizontal
int despH = 0;
if (options->notifications.posH == pos_left)
{
despH = padding;
}
else if (options->notifications.posH == pos_middle)
{
despH = ((options->screen.windowWidth * options->windowSize) / 2 - (width / 2));
}
else
{
despH = (options->screen.windowWidth * options->windowSize) - width - padding;
}
// Posición vertical
int despV = 0;
if (options->notifications.posV == pos_top)
{
despV = padding;
}
else
{
despV = (options->screen.windowHeight * options->windowSize) - height - padding;
}
const int travelDist = height + padding;
// Offset
int offset = 0;
if (options->notifications.posV == pos_top)
{
offset = (int)notifications.size() > 0 ? notifications.back().y + travelDist : despV;
}
else
{
offset = (int)notifications.size() > 0 ? notifications.back().y - travelDist : despV;
}
// Crea la notificacion // Crea la notificacion
notification_t n; notification_t n;
// inicializa variables // Inicializa variables
n.y = offset; n.y = offset;
n.travelDist = travelDist; n.travelDist = travelDist;
n.counter = 0; n.counter = 0;
n.state = ns_rising; n.state = ns_rising;
n.text = text; n.text1 = text1;
n.rect = {despH, offset - travelDist, width, height}; n.text2 = text2;
if (options->notifications.posV == pos_top)
{
n.rect = {despH, offset - travelDist, width, height};
}
else
{
n.rect = {despH, offset + travelDist, width, height};
}
// Crea la textura // Crea la textura
n.texture = new Texture(renderer); n.texture = new Texture(renderer);
n.texture->createBlank(renderer, width, height, SDL_TEXTUREACCESS_TARGET); n.texture->createBlank(renderer, width, height, SDL_TEXTUREACCESS_TARGET);
n.texture->setAsRenderTarget(renderer);
SDL_SetRenderDrawColor(renderer, bgColor.r, bgColor.g, bgColor.b, 255);
SDL_RenderClear(renderer);
n.texture->setBlendMode(SDL_BLENDMODE_BLEND); n.texture->setBlendMode(SDL_BLENDMODE_BLEND);
this->text->writeDX(TXT_CENTER | TXT_STROKE, width / 2, despV, text, 1, {255, 255, 255}, 1, {0, 0, 0});
// Prepara para dibujar en la textura
n.texture->setAsRenderTarget(renderer);
// Dibuja el fondo de la notificación
SDL_SetRenderDrawColor(renderer, bgColor.r, bgColor.g, bgColor.b, 255);
SDL_Rect rect;
rect = {4, 0, width - (4 * 2), height};
SDL_RenderFillRect(renderer, &rect);
rect = {4 / 2, 1, width - 4, height - 2};
SDL_RenderFillRect(renderer, &rect);
rect = {1, 4 / 2, width - 2, height - 4};
SDL_RenderFillRect(renderer, &rect);
rect = {0, 4, width, height - (4 * 2)};
SDL_RenderFillRect(renderer, &rect);
// Dibuja el icono de la notificación
if (icon >= 0)
{
Sprite *sp = new Sprite({0, 0, iconSize, iconSize}, iconTexture, renderer);
sp->setPos({padding, padding, iconSize, iconSize});
sp->setSpriteClip({iconSize * (icon % 10), iconSize * (icon / 10), iconSize, iconSize});
sp->render();
delete sp;
}
// Escribe el texto de la notificación
color_t color = {255, 255, 255};
if (text2 != "")
{ // Dos lineas de texto
text->writeColored(padding + iconSpace, padding, text1, color);
text->writeColored(padding + iconSpace, padding + text->getCharacterSize() + 1, text2, color);
}
else
{ // Una linea de texto
text->writeColored(padding + iconSpace, (height / 2) - (text->getCharacterSize() / 2), text1, color);
}
// Deja de dibujar en la textura
SDL_SetRenderTarget(renderer, nullptr); SDL_SetRenderTarget(renderer, nullptr);
// Crea el sprite // Crea el sprite de la notificación
n.sprite = new Sprite(n.rect, n.texture, renderer); n.sprite = new Sprite(n.rect, n.texture, renderer);
// Añade la notificación a la lista // Añade la notificación a la lista
notifications.push_back(n); notifications.push_back(n);
// Reproduce el sonido de la notificación // Reproduce el sonido de la notificación
JA_PlaySound(sound); if (options->notifications.sound)
{
JA_PlaySound(sound);
}
} }
// Indica si hay notificaciones activas // Indica si hay notificaciones activas

View File

@@ -36,7 +36,8 @@ private:
struct notification_t struct notification_t
{ {
std::string text; std::string text1;
std::string text2;
int counter; int counter;
notification_state_e state; notification_state_e state;
notification_position_e position; notification_position_e position;
@@ -49,14 +50,16 @@ private:
// Objetos y punteros // Objetos y punteros
SDL_Renderer *renderer; // El renderizador de la ventana SDL_Renderer *renderer; // El renderizador de la ventana
Texture *texture; // Textura para la fuente de las notificaciones Texture *textTexture; // Textura para la fuente de las notificaciones
Texture *iconTexture; // Textura para los iconos de las notificaciones
Text *text; // Objeto para dibujar texto Text *text; // Objeto para dibujar texto
options_t *options; // Variable con todas las opciones del programa
// Variables // Variables
color_t bgColor; // Color de fondo de las notificaciones color_t bgColor; // Color de fondo de las notificaciones
int waitTime; // Tiempo que se ve la notificación int waitTime; // Tiempo que se ve la notificación
std::vector<notification_t> notifications; // La lista de notificaciones activas std::vector<notification_t> notifications; // La lista de notificaciones activas
JA_Sound sound; // Sonido a reproducir cuando suena la notificación JA_Sound_t *sound; // Sonido a reproducir cuando suena la notificación
// Elimina las notificaciones finalizadas // Elimina las notificaciones finalizadas
void clearFinishedNotifications(); void clearFinishedNotifications();
@@ -69,13 +72,13 @@ public:
void update(); void update();
// Constructor // Constructor
Notify(SDL_Renderer *renderer, std::string bitmapFile, std::string textFile, std::string soundFile); Notify(SDL_Renderer *renderer, std::string iconFile, std::string bitmapFile, std::string textFile, std::string soundFile, options_t *options);
// Destructor // Destructor
~Notify(); ~Notify();
// Muestra una notificación de texto por pantalla; // Muestra una notificación de texto por pantalla;
void showText(std::string text); void showText(std::string text1 = "", std::string text2 = "", int icon = -1);
// Indica si hay notificaciones activas // Indica si hay notificaciones activas
bool active(); bool active();

View File

@@ -12,12 +12,12 @@ Screen::Screen(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, options
this->asset = asset; this->asset = asset;
// Crea los objetos // Crea los objetos
notify = new Notify(renderer, asset->get("smb2.png"), asset->get("smb2.txt"), asset->get("notify.wav")); notify = new Notify(renderer, asset->get("notify.png"), asset->get("smb2.png"), asset->get("smb2.txt"), asset->get("notify.wav"), options);
gameCanvasWidth = options->gameWidth; gameCanvasWidth = options->gameWidth;
gameCanvasHeight = options->gameHeight; gameCanvasHeight = options->gameHeight;
borderWidth = options->gameWidth * options->borderSize; borderWidth = options->borderWidth * 2;
borderHeight = options->gameHeight * options->borderSize; borderHeight = options->borderHeight * 2;
notificationLogicalWidth = gameCanvasWidth; notificationLogicalWidth = gameCanvasWidth;
notificationLogicalHeight = gameCanvasHeight; notificationLogicalHeight = gameCanvasHeight;
@@ -48,6 +48,7 @@ Screen::Screen(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, options
Screen::~Screen() Screen::~Screen()
{ {
delete notify; delete notify;
SDL_DestroyTexture(gameCanvas);
} }
// Limpia la pantalla // Limpia la pantalla
@@ -86,15 +87,18 @@ void Screen::blit()
// Establece el modo de video // Establece el modo de video
void Screen::setVideoMode(int videoMode) void Screen::setVideoMode(int videoMode)
{ {
// Muestra el puntero
SDL_ShowCursor(SDL_ENABLE);
// Aplica el modo de video // Aplica el modo de video
SDL_SetWindowFullscreen(window, videoMode); SDL_SetWindowFullscreen(window, videoMode);
// Si está activo el modo ventana quita el borde // Si está activo el modo ventana quita el borde
if (videoMode == 0) if (videoMode == 0)
{ {
// Muestra el puntero
SDL_ShowCursor(SDL_ENABLE);
// Esconde la ventana
//SDL_HideWindow(window);
if (options->borderEnabled) if (options->borderEnabled)
{ {
windowWidth = gameCanvasWidth + borderWidth; windowWidth = gameCanvasWidth + borderWidth;
@@ -109,9 +113,12 @@ void Screen::setVideoMode(int videoMode)
dest = {0, 0, gameCanvasWidth, gameCanvasHeight}; dest = {0, 0, gameCanvasWidth, gameCanvasHeight};
} }
// Modifica el tamaño del renderizador y de la ventana // Modifica el tamaño de la ventana
SDL_RenderSetLogicalSize(renderer, windowWidth, windowHeight);
SDL_SetWindowSize(window, windowWidth * options->windowSize, windowHeight * options->windowSize); SDL_SetWindowSize(window, windowWidth * options->windowSize, windowHeight * options->windowSize);
SDL_SetWindowPosition(window, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED);
// Muestra la ventana
//SDL_ShowWindow(window);
} }
// Si está activo el modo de pantalla completa añade el borde // Si está activo el modo de pantalla completa añade el borde
@@ -162,13 +169,15 @@ void Screen::setVideoMode(int videoMode)
dest.h = windowHeight; dest.h = windowHeight;
dest.x = dest.y = 0; dest.x = dest.y = 0;
} }
// Modifica el tamaño del renderizador
SDL_RenderSetLogicalSize(renderer, windowWidth, windowHeight);
} }
// Actualiza el valor de la variable // Modifica el tamaño del renderizador
SDL_RenderSetLogicalSize(renderer, windowWidth, windowHeight);
// Actualiza las opciones
options->videoMode = videoMode; options->videoMode = videoMode;
options->screen.windowWidth = windowWidth;
options->screen.windowHeight = windowHeight;
// Establece el tamaño de las notificaciones // Establece el tamaño de las notificaciones
setNotificationSize(); setNotificationSize();
@@ -188,6 +197,22 @@ void Screen::setWindowSize(int size)
setVideoMode(0); setVideoMode(0);
} }
// Reduce el tamaño de la ventana
void Screen::decWindowSize()
{
--options->windowSize;
options->windowSize = std::max(options->windowSize, 1);
setVideoMode(0);
}
// Aumenta el tamaño de la ventana
void Screen::incWindowSize()
{
++options->windowSize;
options->windowSize = std::min(options->windowSize, 4);
setVideoMode(0);
}
// Cambia el color del borde // Cambia el color del borde
void Screen::setBorderColor(color_t color) void Screen::setBorderColor(color_t color)
{ {
@@ -201,9 +226,15 @@ void Screen::setBlendMode(SDL_BlendMode blendMode)
} }
// Establece el tamaño del borde // Establece el tamaño del borde
void Screen::setBorderSize(float s) void Screen::setBorderWidth(int s)
{ {
options->borderSize = s; options->borderWidth = s;
}
// Establece el tamaño del borde
void Screen::setBorderHeight(int s)
{
options->borderHeight = s;
} }
// Establece si se ha de ver el borde en el modo ventana // Establece si se ha de ver el borde en el modo ventana
@@ -336,7 +367,7 @@ void Screen::renderSpectrumFade()
const float step = (float)spectrumFadeCounter / (float)spectrumFadeLenght; const float step = (float)spectrumFadeCounter / (float)spectrumFadeLenght;
const int max = spectrumColor.size() - 1; const int max = spectrumColor.size() - 1;
const int index = max + (0 - max) * step; const int index = max + (0 - max) * step;
const color_t c = spectrumColor.at(index); const color_t c = spectrumColor[index];
SDL_SetTextureColorMod(gameCanvas, c.r, c.g, c.b); SDL_SetTextureColorMod(gameCanvas, c.r, c.g, c.b);
} }
@@ -362,9 +393,9 @@ void Screen::updateNotifier()
} }
// Muestra una notificación de texto por pantalla; // Muestra una notificación de texto por pantalla;
void Screen::showNotification(std::string text) void Screen::showNotification(std::string text1, std::string text2, int icon)
{ {
notify->showText(text); notify->showText(text1, text2, icon);
} }
// Dibuja las notificaciones // Dibuja las notificaciones

View File

@@ -4,6 +4,7 @@
#include "asset.h" #include "asset.h"
#include "notify.h" #include "notify.h"
#include "utils.h" #include "utils.h"
#include "../const.h"
#include <vector> #include <vector>
#ifndef SCREEN_H #ifndef SCREEN_H
@@ -94,6 +95,12 @@ public:
// Cambia el tamaño de la ventana // Cambia el tamaño de la ventana
void setWindowSize(int size); void setWindowSize(int size);
// Reduce el tamaño de la ventana
void decWindowSize();
// Aumenta el tamaño de la ventana
void incWindowSize();
// Cambia el color del borde // Cambia el color del borde
void setBorderColor(color_t color); void setBorderColor(color_t color);
@@ -101,7 +108,8 @@ public:
void setBlendMode(SDL_BlendMode blendMode); void setBlendMode(SDL_BlendMode blendMode);
// Establece el tamaño del borde // Establece el tamaño del borde
void setBorderSize(float s); void setBorderWidth(int s);
void setBorderHeight(int s);
// Establece si se ha de ver el borde en el modo ventana // Establece si se ha de ver el borde en el modo ventana
void setBorderEnabled(bool value); void setBorderEnabled(bool value);
@@ -131,7 +139,7 @@ public:
void updateNotifier(); void updateNotifier();
// Muestra una notificación de texto por pantalla; // Muestra una notificación de texto por pantalla;
void showNotification(std::string text); void showNotification(std::string text1 = "", std::string text2 = "", int icon = -1);
}; };
#endif #endif

View File

@@ -27,12 +27,12 @@ Sprite::Sprite(int x, int y, int w, int h, Texture *texture, SDL_Renderer *rende
Sprite::Sprite(SDL_Rect rect, Texture *texture, SDL_Renderer *renderer) Sprite::Sprite(SDL_Rect rect, Texture *texture, SDL_Renderer *renderer)
{ {
// Establece la posición X,Y del sprite // Establece la posición X,Y del sprite
x = rect.x; this->x = rect.x;
y = rect.y; this->y = rect.y;
// Establece el alto y el ancho del sprite // Establece el alto y el ancho del sprite
w = rect.w; this->w = rect.w;
h = rect.h; this->h = rect.h;
// Establece el puntero al renderizador de la ventana // Establece el puntero al renderizador de la ventana
this->renderer = renderer; this->renderer = renderer;

View File

@@ -103,6 +103,7 @@ bool Texture::loadFromFile(std::string path, SDL_Renderer *renderer, bool verbos
} }
// Return success // Return success
stbi_image_free(data);
texture = newTexture; texture = newTexture;
return texture != nullptr; return texture != nullptr;
} }

View File

@@ -54,6 +54,33 @@ enum palette_e
p_zxarne p_zxarne
}; };
// Posiciones de las notificaciones
enum not_pos_e
{
pos_top,
pos_bottom,
pos_left,
pos_middle,
pos_right
};
// Tipos de control de teclado
enum ctrl_schem_e
{
ctrl_cursor,
ctrl_opqa,
ctrl_wasd
};
// Estructura para las opciones de las notificaciones
struct op_notification_t
{
not_pos_e posH; // Ubicación de las notificaciones en pantalla
not_pos_e posV; // Ubicación de las notificaciones en pantalla
bool sound; // Indica si las notificaciones suenan
color_t color; // Color de las notificaciones
};
// Estructura para saber la seccion y subseccion del programa // Estructura para saber la seccion y subseccion del programa
struct section_t struct section_t
{ {
@@ -74,6 +101,7 @@ struct cheat_t
struct online_t struct online_t
{ {
bool enabled; // Indica si se quiere usar el modo online o no bool enabled; // Indica si se quiere usar el modo online o no
bool sessionEnabled; // Indica ya se ha hecho login
std::string server; // Servidor para los servicios online std::string server; // Servidor para los servicios online
int port; // Puerto del servidor int port; // Puerto del servidor
std::string gameID; // Identificador del juego para los servicios online std::string gameID; // Identificador del juego para los servicios online
@@ -89,25 +117,36 @@ struct op_stats_t
std::string worstNightmare; // Habitación con más muertes acumuladas std::string worstNightmare; // Habitación con más muertes acumuladas
}; };
// Estructura con opciones de la pantalla
struct op_screen_t
{
int windowWidth; // Ancho de la ventana
int windowHeight; // Alto de la ventana
};
// Estructura con todas las opciones de configuración del programa // Estructura con todas las opciones de configuración del programa
struct options_t struct options_t
{ {
std::string configVersion; // Versión del programa. Sirve para saber si las opciones son compatibles std::string configVersion; // Versión del programa. Sirve para saber si las opciones son compatibles
Uint32 videoMode; // Contiene el valor del modo de pantalla completa Uint32 videoMode; // Contiene el valor del modo de pantalla completa
int windowSize; // Contiene el valor por el que se multiplica el tamaño de la ventana int windowSize; // Contiene el valor por el que se multiplica el tamaño de la ventana
Uint32 filter; // Filtro usado para el escalado de la imagen Uint32 filter; // Filtro usado para el escalado de la imagen
bool vSync; // Indica si se quiere usar vsync o no bool vSync; // Indica si se quiere usar vsync o no
int gameWidth; // Ancho de la resolucion nativa del juego int gameWidth; // Ancho de la resolucion nativa del juego
int gameHeight; // Alto de la resolucion nativa del juego int gameHeight; // Alto de la resolucion nativa del juego
bool integerScale; // Indica si el escalado de la imagen ha de ser entero en el modo a pantalla completa bool integerScale; // Indica si el escalado de la imagen ha de ser entero en el modo a pantalla completa
bool keepAspect; // Indica si se ha de mantener la relación de aspecto al poner el modo a pantalla completa bool keepAspect; // Indica si se ha de mantener la relación de aspecto al poner el modo a pantalla completa
bool borderEnabled; // Indica si ha de mostrar el borde en el modo de ventana bool borderEnabled; // Indica si ha de mostrar el borde en el modo de ventana
float borderSize; // Porcentaje de borde que se añade a lo ventana int borderWidth; // Cantidad de pixels que se añade en el borde de la ventana
palette_e palette; // Paleta de colores a usar en el juego int borderHeight; // Cantidad de pixels que se añade en el borde de la ventana
bool console; // Indica si ha de mostrar información por la consola de texto palette_e palette; // Paleta de colores a usar en el juego
cheat_t cheat; // Contiene trucos y ventajas para el juego bool console; // Indica si ha de mostrar información por la consola de texto
op_stats_t stats; // Datos con las estadisticas de juego cheat_t cheat; // Contiene trucos y ventajas para el juego
online_t online; // Datos del servicio online op_stats_t stats; // Datos con las estadisticas de juego
online_t online; // Datos del servicio online
op_notification_t notifications; // Opciones relativas a las notificaciones;
op_screen_t screen; // Opciones relativas a la clase screen
ctrl_schem_e keys; // Teclas usadas para jugar
}; };
// Calcula el cuadrado de la distancia entre dos puntos // Calcula el cuadrado de la distancia entre dos puntos

View File

@@ -2,14 +2,16 @@
#include <iostream> #include <iostream>
// Constructor // Constructor
Credits::Credits(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, options_t *options) Credits::Credits(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, Input *input, options_t *options, section_t *section)
{ {
// Copia la dirección de los objetos // Copia la dirección de los objetos
this->resource = resource;
this->renderer = renderer; this->renderer = renderer;
this->screen = screen; this->screen = screen;
this->resource = resource;
this->asset = asset; this->asset = asset;
this->input = input;
this->options = options; this->options = options;
this->section = section;
// Reserva memoria para los punteros // Reserva memoria para los punteros
eventHandler = new SDL_Event(); eventHandler = new SDL_Event();
@@ -20,8 +22,8 @@ Credits::Credits(SDL_Renderer *renderer, Screen *screen, Resource *resource, Ass
counter = 0; counter = 0;
counterEnabled = true; counterEnabled = true;
subCounter = 0; subCounter = 0;
section.name = SECTION_PROG_CREDITS; section->name = SECTION_PROG_CREDITS;
section.subsection = 0; section->subsection = 0;
ticks = 0; ticks = 0;
ticksSpeed = 15; ticksSpeed = 15;
sprite->setRect({194, 174, 8, 8}); sprite->setRect({194, 174, 8, 8});
@@ -74,65 +76,71 @@ void Credits::checkEventHandler()
// Evento de salida de la aplicación // Evento de salida de la aplicación
if (eventHandler->type == SDL_QUIT) if (eventHandler->type == SDL_QUIT)
{ {
section.name = SECTION_PROG_QUIT; section->name = SECTION_PROG_QUIT;
break; break;
} }
}
}
// Comprueba las teclas que se han pulsado // Comprueba las entradas
if ((eventHandler->type == SDL_KEYDOWN && eventHandler->key.repeat == 0) || (eventHandler->type == SDL_JOYBUTTONDOWN)) void Credits::checkInput()
{ {
switch (eventHandler->key.keysym.scancode)
{
case SDL_SCANCODE_ESCAPE:
section.name = SECTION_PROG_QUIT;
break;
case SDL_SCANCODE_B: if (input->checkInput(input_exit, REPEAT_FALSE))
screen->switchBorder(); {
resource->reLoadTextures(); section->name = SECTION_PROG_QUIT;
break; }
case SDL_SCANCODE_F: else if (input->checkInput(input_toggle_border, REPEAT_FALSE))
screen->switchVideoMode(); {
resource->reLoadTextures(); screen->switchBorder();
break; }
case SDL_SCANCODE_F1: else if (input->checkInput(input_window_fullscreen, REPEAT_FALSE))
screen->setWindowSize(1); {
resource->reLoadTextures(); screen->switchVideoMode();
break; }
case SDL_SCANCODE_F2: else if (input->checkInput(input_window_dec_size, REPEAT_FALSE))
screen->setWindowSize(2); {
resource->reLoadTextures(); screen->decWindowSize();
break; }
case SDL_SCANCODE_F3: else if (input->checkInput(input_window_inc_size, REPEAT_FALSE))
screen->setWindowSize(3); {
resource->reLoadTextures(); screen->incWindowSize();
break; }
case SDL_SCANCODE_F4: else if (input->checkInput(input_swap_palette, REPEAT_FALSE))
screen->setWindowSize(4); {
resource->reLoadTextures(); switchPalette();
break; }
case SDL_SCANCODE_F5: else if (input->checkInput(input_pause, REPEAT_FALSE) || input->checkInput(input_accept, REPEAT_FALSE) || input->checkInput(input_jump, REPEAT_FALSE))
switchPalette(); {
break; section->name = SECTION_PROG_TITLE;
section->subsection = 0;
default:
section.name = SECTION_PROG_TITLE;
section.subsection = 0;
break;
}
}
} }
} }
// Inicializa los textos // Inicializa los textos
void Credits::iniTexts() void Credits::iniTexts()
{ {
std::string keys = "";
if (options->keys == ctrl_cursor)
{
keys = "CURSORS";
}
else if (options->keys == ctrl_opqa)
{
keys = "O,P AND Q";
}
else
{
keys = "A,D AND W";
}
#ifndef GAME_CONSOLE
texts.clear(); texts.clear();
texts.push_back({"", stringToColor(options->palette, "white")}); texts.push_back({"", stringToColor(options->palette, "white")});
texts.push_back({"INSTRUCTIONS:", stringToColor(options->palette, "yellow")}); texts.push_back({"INSTRUCTIONS:", stringToColor(options->palette, "yellow")});
@@ -145,12 +153,12 @@ void Credits::iniTexts()
texts.push_back({"KEYS:", stringToColor(options->palette, "yellow")}); texts.push_back({"KEYS:", stringToColor(options->palette, "yellow")});
texts.push_back({"", stringToColor(options->palette, "white")}); texts.push_back({"", stringToColor(options->palette, "white")});
texts.push_back({"CURSORS TO MOVE AND JUMP", stringToColor(options->palette, "white")}); texts.push_back({keys + " TO MOVE AND JUMP", stringToColor(options->palette, "white")});
texts.push_back({"M TO TURN ON/OFF THE MUSIC", stringToColor(options->palette, "white")}); texts.push_back({"M TO SWITCH THE MUSIC", stringToColor(options->palette, "white")});
texts.push_back({"P TO PAUSE THE GAME", stringToColor(options->palette, "white")}); texts.push_back({"H TO PAUSE THE GAME", stringToColor(options->palette, "white")});
texts.push_back({"F1-F4 TO CHANGE WINDOWS SIZE", stringToColor(options->palette, "white")}); texts.push_back({"F1-F2 TO CHANGE WINDOWS SIZE", stringToColor(options->palette, "white")});
texts.push_back({"F TO SWITCH TO FULLSCREEN", stringToColor(options->palette, "white")}); texts.push_back({"F3 TO SWITCH TO FULLSCREEN", stringToColor(options->palette, "white")});
texts.push_back({"B TO SWITCH THE BORDER SCREEN", stringToColor(options->palette, "white")}); texts.push_back({"B TO TOOGLE THE BORDER SCREEN", stringToColor(options->palette, "white")});
texts.push_back({"", stringToColor(options->palette, "white")}); texts.push_back({"", stringToColor(options->palette, "white")});
texts.push_back({"", stringToColor(options->palette, "white")}); texts.push_back({"", stringToColor(options->palette, "white")});
@@ -161,6 +169,36 @@ void Credits::iniTexts()
texts.push_back({"I LOVE JAILGAMES! ", stringToColor(options->palette, "white")}); texts.push_back({"I LOVE JAILGAMES! ", stringToColor(options->palette, "white")});
texts.push_back({"", stringToColor(options->palette, "white")}); texts.push_back({"", stringToColor(options->palette, "white")});
#else
texts.clear();
texts.push_back({"", stringToColor(options->palette, "white")});
texts.push_back({"INSTRUCTIONS:", stringToColor(options->palette, "yellow")});
texts.push_back({"", stringToColor(options->palette, "white")});
texts.push_back({"HELP JAILDOC TO GET BACK ALL", stringToColor(options->palette, "white")});
texts.push_back({"HIS PROJECTS AND GO TO THE", stringToColor(options->palette, "white")});
texts.push_back({"JAIL TO FINISH THEM", stringToColor(options->palette, "white")});
texts.push_back({"", stringToColor(options->palette, "white")});
texts.push_back({"", stringToColor(options->palette, "white")});
texts.push_back({"KEYS:", stringToColor(options->palette, "yellow")});
texts.push_back({"", stringToColor(options->palette, "white")});
texts.push_back({"B TO JUMP", stringToColor(options->palette, "white")});
texts.push_back({"R TO SWITCH THE MUSIC", stringToColor(options->palette, "white")});
texts.push_back({"L TO SWAP THE COLOR PALETTE", stringToColor(options->palette, "white")});
texts.push_back({"START TO PAUSE", stringToColor(options->palette, "white")});
texts.push_back({"SELECT TO EXIT", stringToColor(options->palette, "white")});
texts.push_back({"", stringToColor(options->palette, "white")});
texts.push_back({"", stringToColor(options->palette, "white")});
texts.push_back({"", stringToColor(options->palette, "white")});
texts.push_back({"A GAME BY JAILDESIGNER", stringToColor(options->palette, "yellow")});
texts.push_back({"MADE ON SUMMER/FALL 2022", stringToColor(options->palette, "yellow")});
texts.push_back({"", stringToColor(options->palette, "white")});
texts.push_back({"", stringToColor(options->palette, "white")});
texts.push_back({"I LOVE JAILGAMES! ", stringToColor(options->palette, "white")});
texts.push_back({"", stringToColor(options->palette, "white")});
#endif
} }
// Escribe el texto en la textura // Escribe el texto en la textura
@@ -186,7 +224,7 @@ void Credits::fillTexture()
} }
// Escribe el corazón // Escribe el corazón
const int textLenght = text->lenght(texts.at(22).label, 1) - text->lenght(" ", 1); // Se resta el ultimo caracter que es un espacio const int textLenght = text->lenght(texts[22].label, 1) - text->lenght(" ", 1); // Se resta el ultimo caracter que es un espacio
const int posX = ((PLAY_AREA_WIDTH - textLenght) / 2) + textLenght; const int posX = ((PLAY_AREA_WIDTH - textLenght) / 2) + textLenght;
text->writeColored(posX, 176, "}", stringToColor(options->palette, "bright_red")); text->writeColored(posX, 176, "}", stringToColor(options->palette, "bright_red"));
@@ -245,21 +283,24 @@ void Credits::updateCounter()
// Comprueba si ha terminado la sección // Comprueba si ha terminado la sección
if (counter > 1200) if (counter > 1200)
{ {
section.name = SECTION_PROG_DEMO; section->name = SECTION_PROG_DEMO;
} }
} }
// Actualiza las variables // Actualiza las variables
void Credits::update() void Credits::update()
{ {
// Comprueba el manejador de eventos
checkEventHandler();
// Comprueba que la diferencia de ticks sea mayor a la velocidad del juego // Comprueba que la diferencia de ticks sea mayor a la velocidad del juego
if (SDL_GetTicks() - ticks > ticksSpeed) if (SDL_GetTicks() - ticks > ticksSpeed)
{ {
// Actualiza el contador de ticks // Actualiza el contador de ticks
ticks = SDL_GetTicks(); ticks = SDL_GetTicks();
// Comprueba el manejador de eventos // Comprueba las entradas
checkEventHandler(); checkInput();
// Actualiza el contador // Actualiza el contador
updateCounter(); updateCounter();
@@ -304,20 +345,18 @@ void Credits::render()
} }
// Bucle para el logo del juego // Bucle para el logo del juego
section_t Credits::run() void Credits::run()
{ {
while (section.name == SECTION_PROG_CREDITS) while (section->name == SECTION_PROG_CREDITS)
{ {
update(); update();
render(); render();
} }
return section;
} }
// Cambia la paleta // Cambia la paleta
void Credits::switchPalette() void Credits::switchPalette()
{ {
options->palette = options->palette == p_zxspectrum ? p_zxarne : p_zxspectrum; options->palette = options->palette == p_zxspectrum ? p_zxarne : p_zxspectrum;
fillTexture(); fillTexture();
} }

View File

@@ -3,6 +3,7 @@
#include <SDL2/SDL.h> #include <SDL2/SDL.h>
#include "common/animatedsprite.h" #include "common/animatedsprite.h"
#include "common/asset.h" #include "common/asset.h"
#include "common/input.h"
#include "common/jail_audio.h" #include "common/jail_audio.h"
#include "common/resource.h" #include "common/resource.h"
#include "common/screen.h" #include "common/screen.h"
@@ -30,18 +31,19 @@ private:
Screen *screen; // Objeto encargado de dibujar en pantalla Screen *screen; // Objeto encargado de dibujar en pantalla
Resource *resource; // Objeto con los recursos Resource *resource; // Objeto con los recursos
Asset *asset; // Objeto con los ficheros de recursos Asset *asset; // Objeto con los ficheros de recursos
Input *input; // Objeto pata gestionar la entrada
SDL_Event *eventHandler; // Manejador de eventos SDL_Event *eventHandler; // Manejador de eventos
Text *text; // Objeto para escribir texto en pantalla Text *text; // Objeto para escribir texto en pantalla
SDL_Texture *textTexture; // Textura para dibujar el texto SDL_Texture *textTexture; // Textura para dibujar el texto
SDL_Texture *coverTexture; // Textura para cubrir el texto SDL_Texture *coverTexture; // Textura para cubrir el texto
AnimatedSprite *sprite; // Sprite para el brillo del corazón AnimatedSprite *sprite; // Sprite para el brillo del corazón
options_t *options; // Puntero a las opciones del juego options_t *options; // Puntero a las opciones del juego
section_t *section; // Estado del bucle principal para saber si continua o se sale
// Variables // Variables
int counter; // Contador int counter; // Contador
bool counterEnabled; // Indica si esta activo el contador bool counterEnabled; // Indica si esta activo el contador
int subCounter; // Contador secundario int subCounter; // Contador secundario
section_t section; // Estado del bucle principal para saber si continua o se sale
Uint32 ticks; // Contador de ticks para ajustar la velocidad del programa Uint32 ticks; // Contador de ticks para ajustar la velocidad del programa
Uint32 ticksSpeed; // Velocidad a la que se repiten los bucles del programa Uint32 ticksSpeed; // Velocidad a la que se repiten los bucles del programa
std::vector<captions_t> texts; // Vector con los textos std::vector<captions_t> texts; // Vector con los textos
@@ -55,6 +57,9 @@ private:
// Comprueba el manejador de eventos // Comprueba el manejador de eventos
void checkEventHandler(); void checkEventHandler();
// Comprueba las entradas
void checkInput();
// Actualiza el contador // Actualiza el contador
void updateCounter(); void updateCounter();
@@ -69,13 +74,13 @@ private:
public: public:
// Constructor // Constructor
Credits(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, options_t *options); Credits(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, Input *input, options_t *options, section_t *section);
// Destructor // Destructor
~Credits(); ~Credits();
// Bucle principal // Bucle principal
section_t run(); void run();
}; };
#endif #endif

View File

@@ -1,7 +1,7 @@
#include "demo.h" #include "demo.h"
// Constructor // Constructor
Demo::Demo(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, options_t *options, Debug *debug) Demo::Demo(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, Input *input, options_t *options, section_t *section, Debug *debug)
{ {
// Inicia algunas variables // Inicia algunas variables
board.iniClock = SDL_GetTicks(); board.iniClock = SDL_GetTicks();
@@ -15,15 +15,17 @@ Demo::Demo(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *as
rooms.push_back("44.room"); rooms.push_back("44.room");
roomIndex = 0; roomIndex = 0;
currentRoom = rooms.at(roomIndex); currentRoom = rooms[roomIndex];
// Copia los punteros // Copia los punteros
this->resource = resource;
this->renderer = renderer; this->renderer = renderer;
this->asset = asset;
this->screen = screen; this->screen = screen;
this->debug = debug; this->resource = resource;
this->asset = asset;
this->input = input;
this->options = options; this->options = options;
this->section = section;
this->debug = debug;
// Crea los objetos // Crea los objetos
itemTracker = new ItemTracker(); itemTracker = new ItemTracker();
@@ -40,12 +42,12 @@ Demo::Demo(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *as
board.lives = 9; board.lives = 9;
board.items = 0; board.items = 0;
board.rooms = 1; board.rooms = 1;
board.jailEnabled = options->cheat.jailEnabled; board.jailEnabled = false;
board.music = true; board.music = true;
setScoreBoardColor(); setScoreBoardColor();
section.name = SECTION_PROG_DEMO; section->name = SECTION_PROG_DEMO;
section.subsection = 0; section->subsection = 0;
} }
Demo::~Demo() Demo::~Demo()
@@ -67,86 +69,82 @@ void Demo::checkEventHandler()
// Evento de salida de la aplicación // Evento de salida de la aplicación
if (eventHandler->type == SDL_QUIT) if (eventHandler->type == SDL_QUIT)
{ {
section.name = SECTION_PROG_QUIT; section->name = SECTION_PROG_QUIT;
screen->setBorderColor(stringToColor(options->palette, "black")); screen->setBorderColor(stringToColor(options->palette, "black"));
break; break;
} }
// Comprueba las teclas que se han pulsado
if ((eventHandler->type == SDL_KEYDOWN && eventHandler->key.repeat == 0) || (eventHandler->type == SDL_JOYBUTTONDOWN))
{
switch (eventHandler->key.keysym.scancode)
{
case SDL_SCANCODE_ESCAPE:
section.name = SECTION_PROG_QUIT;
break;
case SDL_SCANCODE_B:
screen->switchBorder();
reLoadTextures();
break;
case SDL_SCANCODE_F:
screen->switchVideoMode();
reLoadTextures();
break;
case SDL_SCANCODE_F1:
screen->setWindowSize(1);
reLoadTextures();
break;
case SDL_SCANCODE_F2:
screen->setWindowSize(2);
reLoadTextures();
break;
case SDL_SCANCODE_F3:
screen->setWindowSize(3);
reLoadTextures();
break;
case SDL_SCANCODE_F4:
screen->setWindowSize(4);
reLoadTextures();
break;
case SDL_SCANCODE_F5:
switchPalette();
break;
default:
section.name = SECTION_PROG_TITLE;
section.subsection = 0;
break;
}
}
} }
} }
// Bucle para el juego // Comprueba las entradas
section_t Demo::run() void Demo::checkInput()
{ {
while (section.name == SECTION_PROG_DEMO)
if (input->checkInput(input_exit, REPEAT_FALSE))
{
section->name = SECTION_PROG_QUIT;
}
else if (input->checkInput(input_toggle_border, REPEAT_FALSE))
{
screen->switchBorder();
reLoadTextures();
}
else if (input->checkInput(input_window_fullscreen, REPEAT_FALSE))
{
screen->switchVideoMode();
reLoadTextures();
}
else if (input->checkInput(input_window_dec_size, REPEAT_FALSE))
{
screen->decWindowSize();
reLoadTextures();
}
else if (input->checkInput(input_window_inc_size, REPEAT_FALSE))
{
screen->incWindowSize();
reLoadTextures();
}
else if (input->checkInput(input_swap_palette, REPEAT_FALSE))
{
switchPalette();
}
else if (input->checkInput(input_pause, REPEAT_FALSE) || input->checkInput(input_accept, REPEAT_FALSE) || input->checkInput(input_jump, REPEAT_FALSE))
{
section->name = SECTION_PROG_TITLE;
section->subsection = 0;
}
}
// Bucle para el juego
void Demo::run()
{
while (section->name == SECTION_PROG_DEMO)
{ {
update(); update();
render(); render();
} }
return section;
} }
// Actualiza el juego, las variables, comprueba la entrada, etc. // Actualiza el juego, las variables, comprueba la entrada, etc.
void Demo::update() void Demo::update()
{ {
// Comprueba los eventos de la cola
checkEventHandler();
// Comprueba que la diferencia de ticks sea mayor a la velocidad del juego // Comprueba que la diferencia de ticks sea mayor a la velocidad del juego
if (SDL_GetTicks() - ticks > ticksSpeed) if (SDL_GetTicks() - ticks > ticksSpeed)
{ {
// Actualiza el contador de ticks // Actualiza el contador de ticks
ticks = SDL_GetTicks(); ticks = SDL_GetTicks();
// Comprueba los eventos de la cola // Comprueba las entradas
checkEventHandler(); checkInput();
// Actualiza los objetos // Actualiza los objetos
room->update(); room->update();
@@ -164,8 +162,8 @@ void Demo::render()
{ {
// Prepara para dibujar el frame // Prepara para dibujar el frame
screen->start(); screen->start();
screen->clean(room->getBGColor());
// Dibuja los elementos del juego en orden
room->renderMap(); room->renderMap();
room->renderEnemies(); room->renderEnemies();
room->renderItems(); room->renderItems();
@@ -255,12 +253,12 @@ void Demo::checkRoomChange()
roomIndex++; roomIndex++;
if (roomIndex == (int)rooms.size()) if (roomIndex == (int)rooms.size())
{ {
section.name = SECTION_PROG_LOGO; section->name = SECTION_PROG_LOGO;
section.subsection = SUBSECTION_LOGO_TO_TITLE; section->subsection = SUBSECTION_LOGO_TO_TITLE;
} }
else else
{ {
changeRoom(rooms.at(roomIndex)); changeRoom(rooms[roomIndex]);
} }
} }
} }

View File

@@ -3,6 +3,7 @@
#include <SDL2/SDL.h> #include <SDL2/SDL.h>
#include "common/animatedsprite.h" #include "common/animatedsprite.h"
#include "common/asset.h" #include "common/asset.h"
#include "common/input.h"
#include "common/debug.h" #include "common/debug.h"
#include "common/input.h" #include "common/input.h"
#include "common/resource.h" #include "common/resource.h"
@@ -29,16 +30,17 @@ private:
Room *room; // Objeto encargado de gestionar cada habitación del juego Room *room; // Objeto encargado de gestionar cada habitación del juego
Resource *resource; // Objeto con los recursos Resource *resource; // Objeto con los recursos
Asset *asset; // Objeto con la ruta a todos los ficheros de recursos Asset *asset; // Objeto con la ruta a todos los ficheros de recursos
Input *input; // Objeto pata gestionar la entrada
Text *text; // Objeto para los textos del juego Text *text; // Objeto para los textos del juego
ScoreBoard *scoreboard; // Objeto encargado de gestionar el marcador ScoreBoard *scoreboard; // Objeto encargado de gestionar el marcador
ItemTracker *itemTracker; // Lleva el control de los objetos recogidos ItemTracker *itemTracker; // Lleva el control de los objetos recogidos
Debug *debug; // Objeto para gestionar la información de debug Debug *debug; // Objeto para gestionar la información de debug
options_t *options; // Puntero a las opciones del juego options_t *options; // Puntero a las opciones del juego
section_t *section; // Seccion actual dentro del juego
// Variables // Variables
Uint32 ticks; // Contador de ticks para ajustar la velocidad del programa Uint32 ticks; // Contador de ticks para ajustar la velocidad del programa
Uint32 ticksSpeed; // Velocidad a la que se repiten los bucles del programa Uint32 ticksSpeed; // Velocidad a la que se repiten los bucles del programa
section_t section; // Seccion actual dentro del juego
std::string currentRoom; // Fichero de la habitación actual std::string currentRoom; // Fichero de la habitación actual
board_t board; // Estructura con los datos del marcador board_t board; // Estructura con los datos del marcador
int counter; // Contador para el modo demo int counter; // Contador para el modo demo
@@ -55,6 +57,9 @@ private:
// Comprueba los eventos de la cola // Comprueba los eventos de la cola
void checkEventHandler(); void checkEventHandler();
// Comprueba las entradas
void checkInput();
// Escribe el nombre de la pantalla // Escribe el nombre de la pantalla
void renderRoomName(); void renderRoomName();
@@ -75,13 +80,13 @@ private:
public: public:
// Constructor // Constructor
Demo(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, options_t *options, Debug *debug); Demo(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, Input *input, options_t *options, section_t *section, Debug *debug);
// Destructor // Destructor
~Demo(); ~Demo();
// Bucle para el juego // Bucle para el juego
section_t run(); void run();
}; };
#endif #endif

View File

@@ -14,11 +14,12 @@
// Constructor // Constructor
Director::Director(int argc, char *argv[]) Director::Director(int argc, char *argv[])
{ {
section.name = SECTION_PROG_LOGO; section = new section_t();
section.subsection = SUBSECTION_LOGO_TO_INTRO; section->name = SECTION_PROG_LOGO;
section->subsection = SUBSECTION_LOGO_TO_INTRO;
#ifdef DEBUG #ifdef DEBUG
section.name = SECTION_PROG_LOGO; section->name = SECTION_PROG_GAME;
#endif #endif
// Crea e inicializa las opciones del programa // Crea e inicializa las opciones del programa
@@ -28,7 +29,12 @@ Director::Director(int argc, char *argv[])
checkProgramArguments(argc, argv); checkProgramArguments(argc, argv);
// Crea la carpeta del sistema donde guardar datos // Crea la carpeta del sistema donde guardar datos
createSystemFolder(); createSystemFolder("jailgames");
#ifndef DEBUG
createSystemFolder("jailgames/jaildoctors_dilemma");
#else
createSystemFolder("jailgames/jaildoctors_dilemma_debug");
#endif
// Crea el objeto que controla los ficheros de recursos // Crea el objeto que controla los ficheros de recursos
asset = new Asset(executablePath); asset = new Asset(executablePath);
@@ -57,9 +63,6 @@ Director::Director(int argc, char *argv[])
screen->setBorderColor(borderColor); screen->setBorderColor(borderColor);
debug = new Debug(renderer, screen, asset); debug = new Debug(renderer, screen, asset);
music = JA_LoadMusic(asset->get("title.ogg").c_str()); music = JA_LoadMusic(asset->get("title.ogg").c_str());
// Inicializa los servicios online
//initOnline();
} }
Director::~Director() Director::~Director()
@@ -68,6 +71,7 @@ Director::~Director()
saveConfig(); saveConfig();
// Libera la memoria // Libera la memoria
delete section;
delete options; delete options;
delete asset; delete asset;
delete input; delete input;
@@ -112,10 +116,13 @@ void Director::initOptions()
// Crea el puntero a la estructura de opciones // Crea el puntero a la estructura de opciones
options = new options_t; options = new options_t;
// Version // Version del archivo de configuración
options->configVersion = "v1.06.1"; options->configVersion = "v1.06.1";
// Opciones dee video // Opciones de control
options->keys = ctrl_cursor;
// Opciones de video
options->gameWidth = GAMECANVAS_WIDTH; options->gameWidth = GAMECANVAS_WIDTH;
options->gameHeight = GAMECANVAS_HEIGHT; options->gameHeight = GAMECANVAS_HEIGHT;
options->videoMode = 0; options->videoMode = 0;
@@ -125,9 +132,14 @@ void Director::initOptions()
options->integerScale = true; options->integerScale = true;
options->keepAspect = true; options->keepAspect = true;
options->borderEnabled = true; options->borderEnabled = true;
options->borderSize = 0.2f; options->borderWidth = 32;
options->borderHeight = 24;
options->palette = p_zxspectrum; options->palette = p_zxspectrum;
#ifdef GAME_CONSOLE
options->windowSize = 2;
#endif
// Estos valores no se guardan en el fichero de configuraci´ón // Estos valores no se guardan en el fichero de configuraci´ón
options->console = false; options->console = false;
options->cheat.infiniteLives = false; options->cheat.infiniteLives = false;
@@ -139,6 +151,7 @@ void Director::initOptions()
// Opciones online // Opciones online
options->online.enabled = true; options->online.enabled = true;
options->online.sessionEnabled = false;
options->online.server = "jaildoctor.duckdns.org"; options->online.server = "jaildoctor.duckdns.org";
options->online.port = 9911; options->online.port = 9911;
#ifdef DEBUG #ifdef DEBUG
@@ -147,6 +160,12 @@ void Director::initOptions()
options->online.gameID = "jaildoctors_dilemma"; options->online.gameID = "jaildoctors_dilemma";
#endif #endif
options->online.jailerID = ""; options->online.jailerID = "";
// Opciones de las notificaciones
options->notifications.posV = pos_top;
options->notifications.posH = pos_left;
options->notifications.sound = true;
options->notifications.color = {48, 48, 48};
} }
// Comprueba los parametros del programa // Comprueba los parametros del programa
@@ -306,6 +325,21 @@ bool Director::saveConfig()
file << "## VERSION\n"; file << "## VERSION\n";
file << "configVersion=" + options->configVersion + "\n"; file << "configVersion=" + options->configVersion + "\n";
file << "\n## CONTROL OPTIONS\n";
file << "## keys = CURSOR | OPQA | WASD\n";
if (options->keys == ctrl_cursor)
{
file << "keys=CURSOR\n";
}
else if (options->keys == ctrl_opqa)
{
file << "keys=OPQA\n";
}
else if (options->keys == ctrl_wasd)
{
file << "keys=WASD\n";
}
file << "\n## VISUAL OPTIONS\n"; file << "\n## VISUAL OPTIONS\n";
if (options->videoMode == 0) if (options->videoMode == 0)
{ {
@@ -337,7 +371,8 @@ bool Director::saveConfig()
file << "integerScale=" + boolToString(options->integerScale) + "\n"; file << "integerScale=" + boolToString(options->integerScale) + "\n";
file << "keepAspect=" + boolToString(options->keepAspect) + "\n"; file << "keepAspect=" + boolToString(options->keepAspect) + "\n";
file << "borderEnabled=" + boolToString(options->borderEnabled) + "\n"; file << "borderEnabled=" + boolToString(options->borderEnabled) + "\n";
file << "borderSize=" + std::to_string(options->borderSize) + "\n"; file << "borderWidth=" + std::to_string(options->borderWidth) + "\n";
file << "borderHeight=" + std::to_string(options->borderHeight) + "\n";
file << "palette=" + std::to_string(options->palette) + "\n"; file << "palette=" + std::to_string(options->palette) + "\n";
file << "\n## ONLINE OPTIONS\n"; file << "\n## ONLINE OPTIONS\n";
@@ -346,6 +381,33 @@ bool Director::saveConfig()
file << "port=" + std::to_string(options->online.port) + "\n"; file << "port=" + std::to_string(options->online.port) + "\n";
file << "jailerID=" + options->online.jailerID + "\n"; file << "jailerID=" + options->online.jailerID + "\n";
file << "\n## NOTIFICATION OPTIONS\n";
file << "## notifications.posV = pos_top | pos_bottom\n";
if (options->notifications.posV == pos_top)
{
file << "notifications.posV=pos_top\n";
}
else
{
file << "notifications.posV=pos_bottom\n";
}
file << "## notifications.posH = pos_left | pos_middle | pos_right\n";
if (options->notifications.posH == pos_left)
{
file << "notifications.posH=pos_left\n";
}
else if (options->notifications.posH == pos_middle)
{
file << "notifications.posH=pos_middle\n";
}
else
{
file << "notifications.posH=pos_right\n";
}
file << "notifications.sound=" + boolToString(options->notifications.sound) + "\n";
// Cierra el fichero // Cierra el fichero
file.close(); file.close();
@@ -353,24 +415,18 @@ bool Director::saveConfig()
} }
// Crea la carpeta del sistema donde guardar datos // Crea la carpeta del sistema donde guardar datos
void Director::createSystemFolder() void Director::createSystemFolder(std::string folder)
{ {
#ifdef DEBUG
const std::string folderName = "jaildoctors_dilemma_debug";
#else
const std::string folderName = "jaildoctors_dilemma";
#endif
#ifdef _WIN32 #ifdef _WIN32
systemFolder = std::string(getenv("APPDATA")) + "/" + folderName; systemFolder = std::string(getenv("APPDATA")) + "/" + folder;
#elif __APPLE__ #elif __APPLE__
struct passwd *pw = getpwuid(getuid()); struct passwd *pw = getpwuid(getuid());
const char *homedir = pw->pw_dir; const char *homedir = pw->pw_dir;
systemFolder = std::string(homedir) + "/Library/Application Support/" + folderName; systemFolder = std::string(homedir) + "/Library/Application Support" + "/" + folder;
#elif __linux__ #elif __linux__
struct passwd *pw = getpwuid(getuid()); struct passwd *pw = getpwuid(getuid());
const char *homedir = pw->pw_dir; const char *homedir = pw->pw_dir;
systemFolder = std::string(homedir) + "/." + folderName; systemFolder = std::string(homedir) + "/." + folder;
#endif #endif
struct stat st = {0}; struct stat st = {0};
@@ -408,14 +464,14 @@ void Director::createSystemFolder()
} }
// Carga los recursos // Carga los recursos
void Director::loadResources(section_t section) void Director::loadResources(section_t *section)
{ {
if (options->console) if (options->console)
{ {
std::cout << "** LOAD RESOURCES" << std::endl; std::cout << "** LOAD RESOURCES" << std::endl;
} }
if (section.name == SECTION_PROG_LOGO) if (section->name == SECTION_PROG_LOGO)
{ {
std::vector<std::string> textureList; std::vector<std::string> textureList;
textureList.push_back("jailgames.png"); textureList.push_back("jailgames.png");
@@ -424,7 +480,7 @@ void Director::loadResources(section_t section)
resource->loadTextures(textureList); resource->loadTextures(textureList);
} }
else if (section.name == SECTION_PROG_INTRO) else if (section->name == SECTION_PROG_INTRO)
{ {
std::vector<std::string> textureList; std::vector<std::string> textureList;
textureList.push_back("loading_screen_bn.png"); textureList.push_back("loading_screen_bn.png");
@@ -435,7 +491,7 @@ void Director::loadResources(section_t section)
resource->loadTextures(textureList); resource->loadTextures(textureList);
} }
else if (section.name == SECTION_PROG_TITLE) else if (section->name == SECTION_PROG_TITLE)
{ {
std::vector<std::string> textureList; std::vector<std::string> textureList;
textureList.push_back("loading_screen_color.png"); textureList.push_back("loading_screen_color.png");
@@ -451,7 +507,7 @@ void Director::loadResources(section_t section)
resource->loadOffsets(offsetsList); resource->loadOffsets(offsetsList);
} }
else if (section.name == SECTION_PROG_CREDITS) else if (section->name == SECTION_PROG_CREDITS)
{ {
// Texturas // Texturas
std::vector<std::string> textureList; std::vector<std::string> textureList;
@@ -473,7 +529,7 @@ void Director::loadResources(section_t section)
resource->loadOffsets(offsetsList); resource->loadOffsets(offsetsList);
} }
else if (section.name == SECTION_PROG_ENDING) else if (section->name == SECTION_PROG_ENDING)
{ {
// Texturas // Texturas
std::vector<std::string> textureList; std::vector<std::string> textureList;
@@ -498,7 +554,7 @@ void Director::loadResources(section_t section)
resource->loadOffsets(offsetsList); resource->loadOffsets(offsetsList);
} }
else if (section.name == SECTION_PROG_ENDING2) else if (section->name == SECTION_PROG_ENDING2)
{ {
// Texturas // Texturas
std::vector<std::string> textureList; std::vector<std::string> textureList;
@@ -510,9 +566,9 @@ void Director::loadResources(section_t section)
textureList.push_back("abad.png"); textureList.push_back("abad.png");
textureList.push_back("abad_bell.png"); textureList.push_back("abad_bell.png");
textureList.push_back("amstrad_cs.png"); textureList.push_back("amstrad_cs.png");
textureList.push_back("arounder_fly.png"); textureList.push_back("flying_arounder.png");
textureList.push_back("arounder_stop.png"); textureList.push_back("stopped_arounder.png");
textureList.push_back("arounder_walk.png"); textureList.push_back("walking_arounder.png");
textureList.push_back("arounders_door.png"); textureList.push_back("arounders_door.png");
textureList.push_back("arounders_machine.png"); textureList.push_back("arounders_machine.png");
textureList.push_back("bat.png"); textureList.push_back("bat.png");
@@ -531,14 +587,14 @@ void Director::loadResources(section_t section)
textureList.push_back("demon.png"); textureList.push_back("demon.png");
textureList.push_back("heavy.png"); textureList.push_back("heavy.png");
textureList.push_back("dimallas.png"); textureList.push_back("dimallas.png");
textureList.push_back("diskette.png"); textureList.push_back("floppy.png");
textureList.push_back("dong.png"); textureList.push_back("dong.png");
textureList.push_back("guitar.png"); textureList.push_back("guitar.png");
textureList.push_back("jb_alien.png"); textureList.push_back("jailbattle_alien.png");
textureList.push_back("jb_human.png"); textureList.push_back("jailbattle_human.png");
textureList.push_back("jailer.png"); textureList.push_back("jailer_#1.png");
textureList.push_back("jailer2.png"); textureList.push_back("jailer_#2.png");
textureList.push_back("jailer3.png"); textureList.push_back("jailer_#3.png");
textureList.push_back("jeannine.png"); textureList.push_back("jeannine.png");
textureList.push_back("lamp.png"); textureList.push_back("lamp.png");
textureList.push_back("lord_abad.png"); textureList.push_back("lord_abad.png");
@@ -546,7 +602,7 @@ void Director::loadResources(section_t section)
textureList.push_back("matatunos.png"); textureList.push_back("matatunos.png");
textureList.push_back("mummy.png"); textureList.push_back("mummy.png");
textureList.push_back("paco.png"); textureList.push_back("paco.png");
textureList.push_back("printer.png"); textureList.push_back("elsa.png");
textureList.push_back("qvoid.png"); textureList.push_back("qvoid.png");
textureList.push_back("sam.png"); textureList.push_back("sam.png");
textureList.push_back("sigmasua.png"); textureList.push_back("sigmasua.png");
@@ -573,9 +629,9 @@ void Director::loadResources(section_t section)
animationList.push_back("abad.ani"); animationList.push_back("abad.ani");
animationList.push_back("abad_bell.ani"); animationList.push_back("abad_bell.ani");
animationList.push_back("amstrad_cs.ani"); animationList.push_back("amstrad_cs.ani");
animationList.push_back("arounder_fly.ani"); animationList.push_back("flying_arounder.ani");
animationList.push_back("arounder_stop.ani"); animationList.push_back("stopped_arounder.ani");
animationList.push_back("arounder_walk.ani"); animationList.push_back("walking_arounder.ani");
animationList.push_back("arounders_door.ani"); animationList.push_back("arounders_door.ani");
animationList.push_back("arounders_machine.ani"); animationList.push_back("arounders_machine.ani");
animationList.push_back("bat.ani"); animationList.push_back("bat.ani");
@@ -594,14 +650,14 @@ void Director::loadResources(section_t section)
animationList.push_back("demon.ani"); animationList.push_back("demon.ani");
animationList.push_back("heavy.ani"); animationList.push_back("heavy.ani");
animationList.push_back("dimallas.ani"); animationList.push_back("dimallas.ani");
animationList.push_back("diskette.ani"); animationList.push_back("floppy.ani");
animationList.push_back("dong.ani"); animationList.push_back("dong.ani");
animationList.push_back("guitar.ani"); animationList.push_back("guitar.ani");
animationList.push_back("jb_alien.ani"); animationList.push_back("jailbattle_alien.ani");
animationList.push_back("jb_human.ani"); animationList.push_back("jailbattle_human.ani");
animationList.push_back("jailer.ani"); animationList.push_back("jailer_#1.ani");
animationList.push_back("jailer2.ani"); animationList.push_back("jailer_#2.ani");
animationList.push_back("jailer3.ani"); animationList.push_back("jailer_#3.ani");
animationList.push_back("jeannine.ani"); animationList.push_back("jeannine.ani");
animationList.push_back("lamp.ani"); animationList.push_back("lamp.ani");
animationList.push_back("lord_abad.ani"); animationList.push_back("lord_abad.ani");
@@ -609,7 +665,7 @@ void Director::loadResources(section_t section)
animationList.push_back("matatunos.ani"); animationList.push_back("matatunos.ani");
animationList.push_back("mummy.ani"); animationList.push_back("mummy.ani");
animationList.push_back("paco.ani"); animationList.push_back("paco.ani");
animationList.push_back("printer.ani"); animationList.push_back("elsa.ani");
animationList.push_back("qvoid.ani"); animationList.push_back("qvoid.ani");
animationList.push_back("sam.ani"); animationList.push_back("sam.ani");
animationList.push_back("sigmasua.ani"); animationList.push_back("sigmasua.ani");
@@ -636,7 +692,7 @@ void Director::loadResources(section_t section)
resource->loadOffsets(offsetsList); resource->loadOffsets(offsetsList);
} }
else if (section.name == SECTION_PROG_GAME_OVER) else if (section->name == SECTION_PROG_GAME_OVER)
{ {
// Texturas // Texturas
std::vector<std::string> textureList; std::vector<std::string> textureList;
@@ -660,7 +716,7 @@ void Director::loadResources(section_t section)
resource->loadOffsets(offsetsList); resource->loadOffsets(offsetsList);
} }
else if (section.name == SECTION_PROG_GAME || section.name == SECTION_PROG_DEMO) else if (section->name == SECTION_PROG_GAME || section->name == SECTION_PROG_DEMO)
{ {
// Texturas // Texturas
std::vector<std::string> textureList; std::vector<std::string> textureList;
@@ -684,9 +740,9 @@ void Director::loadResources(section_t section)
textureList.push_back("abad.png"); textureList.push_back("abad.png");
textureList.push_back("aerojailer.png"); textureList.push_back("aerojailer.png");
textureList.push_back("amstrad_cs.png"); textureList.push_back("amstrad_cs.png");
textureList.push_back("arounder_fly.png"); textureList.push_back("flying_arounder.png");
textureList.push_back("arounder_stop.png"); textureList.push_back("stopped_arounder.png");
textureList.push_back("arounder_walk.png"); textureList.push_back("walking_arounder.png");
textureList.push_back("arounder.png"); textureList.push_back("arounder.png");
textureList.push_back("arounders_door.png"); textureList.push_back("arounders_door.png");
textureList.push_back("arounders_machine.png"); textureList.push_back("arounders_machine.png");
@@ -705,15 +761,15 @@ void Director::loadResources(section_t section)
textureList.push_back("crosshair.png"); textureList.push_back("crosshair.png");
textureList.push_back("demon.png"); textureList.push_back("demon.png");
textureList.push_back("dimallas.png"); textureList.push_back("dimallas.png");
textureList.push_back("diskette.png"); textureList.push_back("floppy.png");
textureList.push_back("dong.png"); textureList.push_back("dong.png");
textureList.push_back("guitar.png"); textureList.push_back("guitar.png");
textureList.push_back("heavy.png"); textureList.push_back("heavy.png");
textureList.push_back("jailer.png"); textureList.push_back("jailer_#1.png");
textureList.push_back("jailer2.png"); textureList.push_back("jailer_#2.png");
textureList.push_back("jailer3.png"); textureList.push_back("jailer_#3.png");
textureList.push_back("jb_alien.png"); textureList.push_back("jailbattle_alien.png");
textureList.push_back("jb_human.png"); textureList.push_back("jailbattle_human.png");
textureList.push_back("jeannine.png"); textureList.push_back("jeannine.png");
textureList.push_back("lamp.png"); textureList.push_back("lamp.png");
textureList.push_back("lord_abad.png"); textureList.push_back("lord_abad.png");
@@ -721,7 +777,7 @@ void Director::loadResources(section_t section)
textureList.push_back("mummy.png"); textureList.push_back("mummy.png");
textureList.push_back("paco.png"); textureList.push_back("paco.png");
textureList.push_back("pepe_rosita_job.png"); textureList.push_back("pepe_rosita_job.png");
textureList.push_back("printer.png"); textureList.push_back("elsa.png");
textureList.push_back("qvoid.png"); textureList.push_back("qvoid.png");
textureList.push_back("robot.png"); textureList.push_back("robot.png");
textureList.push_back("sam.png"); textureList.push_back("sam.png");
@@ -765,9 +821,9 @@ void Director::loadResources(section_t section)
animationList.push_back("abad.ani"); animationList.push_back("abad.ani");
animationList.push_back("aerojailer.ani"); animationList.push_back("aerojailer.ani");
animationList.push_back("amstrad_cs.ani"); animationList.push_back("amstrad_cs.ani");
animationList.push_back("arounder_fly.ani"); animationList.push_back("flying_arounder.ani");
animationList.push_back("arounder_stop.ani"); animationList.push_back("stopped_arounder.ani");
animationList.push_back("arounder_walk.ani"); animationList.push_back("walking_arounder.ani");
animationList.push_back("arounder.ani"); animationList.push_back("arounder.ani");
animationList.push_back("arounders_door.ani"); animationList.push_back("arounders_door.ani");
animationList.push_back("arounders_machine.ani"); animationList.push_back("arounders_machine.ani");
@@ -786,15 +842,15 @@ void Director::loadResources(section_t section)
animationList.push_back("crosshair.ani"); animationList.push_back("crosshair.ani");
animationList.push_back("demon.ani"); animationList.push_back("demon.ani");
animationList.push_back("dimallas.ani"); animationList.push_back("dimallas.ani");
animationList.push_back("diskette.ani"); animationList.push_back("floppy.ani");
animationList.push_back("dong.ani"); animationList.push_back("dong.ani");
animationList.push_back("guitar.ani"); animationList.push_back("guitar.ani");
animationList.push_back("heavy.ani"); animationList.push_back("heavy.ani");
animationList.push_back("jailer.ani"); animationList.push_back("jailer_#1.ani");
animationList.push_back("jailer2.ani"); animationList.push_back("jailer_#2.ani");
animationList.push_back("jailer3.ani"); animationList.push_back("jailer_#3.ani");
animationList.push_back("jb_alien.ani"); animationList.push_back("jailbattle_alien.ani");
animationList.push_back("jb_human.ani"); animationList.push_back("jailbattle_human.ani");
animationList.push_back("jeannine.ani"); animationList.push_back("jeannine.ani");
animationList.push_back("lamp.ani"); animationList.push_back("lamp.ani");
animationList.push_back("lord_abad.ani"); animationList.push_back("lord_abad.ani");
@@ -802,7 +858,7 @@ void Director::loadResources(section_t section)
animationList.push_back("mummy.ani"); animationList.push_back("mummy.ani");
animationList.push_back("paco.ani"); animationList.push_back("paco.ani");
animationList.push_back("pepe_rosita_job.ani"); animationList.push_back("pepe_rosita_job.ani");
animationList.push_back("printer.ani"); animationList.push_back("elsa.ani");
animationList.push_back("qvoid.ani"); animationList.push_back("qvoid.ani");
animationList.push_back("robot.ani"); animationList.push_back("robot.ani");
animationList.push_back("sam.ani"); animationList.push_back("sam.ani");
@@ -976,6 +1032,22 @@ bool Director::setOptions(options_t *options, std::string var, std::string value
options->configVersion = value; options->configVersion = value;
} }
else if (var == "keys")
{
if (value == "OPQA")
{
options->keys = ctrl_opqa;
}
else if (value == "WASD")
{
options->keys = ctrl_wasd;
}
else
{
options->keys = ctrl_cursor;
}
}
else if (var == "videoMode") else if (var == "videoMode")
{ {
if (value == "SDL_WINDOW_FULLSCREEN_DESKTOP") if (value == "SDL_WINDOW_FULLSCREEN_DESKTOP")
@@ -1033,13 +1105,14 @@ bool Director::setOptions(options_t *options, std::string var, std::string value
options->borderEnabled = stringToBool(value); options->borderEnabled = stringToBool(value);
} }
else if (var == "borderSize") else if (var == "borderWidth")
{ {
options->borderSize = std::stof(value); options->borderWidth = std::stoi(value);
if (options->borderSize < 0.0f || options->borderSize > 0.5f) }
{
options->borderSize = 0.1f; else if (var == "borderHeight")
} {
options->borderHeight = std::stoi(value);
} }
else if (var == "palette") else if (var == "palette")
@@ -1081,6 +1154,39 @@ bool Director::setOptions(options_t *options, std::string var, std::string value
options->online.jailerID = value; options->online.jailerID = value;
} }
else if (var == "notifications.posH")
{
if (value == "pos_left")
{
options->notifications.posH = pos_left;
}
else if (value == "pos_middle")
{
options->notifications.posH = pos_middle;
}
else
{
options->notifications.posH = pos_right;
}
}
else if (var == "notifications.posV")
{
if (value == "pos_top")
{
options->notifications.posV = pos_top;
}
else
{
options->notifications.posV = pos_bottom;
}
}
else if (var == "notifications.sound")
{
options->notifications.sound = stringToBool(value);
}
else if (var == "" || var.substr(0, 1) == "#") else if (var == "" || var.substr(0, 1) == "#")
{ {
} }
@@ -1102,27 +1208,56 @@ void Director::initInput()
// Busca si hay un mando conectado // Busca si hay un mando conectado
input->discoverGameController(); input->discoverGameController();
// Asigna inputs a teclas // Teclado - Movimiento
input->bindKey(INPUT_UP, SDL_SCANCODE_UP); if (options->keys == ctrl_cursor)
input->bindKey(INPUT_DOWN, SDL_SCANCODE_DOWN); {
input->bindKey(INPUT_LEFT, SDL_SCANCODE_LEFT); input->bindKey(input_jump, SDL_SCANCODE_UP);
input->bindKey(INPUT_RIGHT, SDL_SCANCODE_RIGHT); input->bindKey(input_left, SDL_SCANCODE_LEFT);
input->bindKey(INPUT_ACCEPT, SDL_SCANCODE_RETURN); input->bindKey(input_right, SDL_SCANCODE_RIGHT);
input->bindKey(INPUT_CANCEL, SDL_SCANCODE_ESCAPE); }
input->bindKey(INPUT_BUTTON_1, SDL_SCANCODE_SPACE); else if (options->keys == ctrl_opqa)
input->bindKey(INPUT_BUTTON_2, SDL_SCANCODE_D); {
input->bindKey(INPUT_BUTTON_PAUSE, SDL_SCANCODE_ESCAPE); input->bindKey(input_jump, SDL_SCANCODE_Q);
input->bindKey(INPUT_BUTTON_ESCAPE, SDL_SCANCODE_ESCAPE); input->bindKey(input_left, SDL_SCANCODE_O);
input->bindKey(input_right, SDL_SCANCODE_P);
}
else if (options->keys == ctrl_wasd)
{
input->bindKey(input_jump, SDL_SCANCODE_W);
input->bindKey(input_left, SDL_SCANCODE_A);
input->bindKey(input_right, SDL_SCANCODE_D);
}
input->bindGameControllerButton(INPUT_UP, SDL_CONTROLLER_BUTTON_DPAD_UP); // Teclado - Otros
input->bindGameControllerButton(INPUT_DOWN, SDL_CONTROLLER_BUTTON_DPAD_DOWN); input->bindKey(input_accept, SDL_SCANCODE_RETURN);
input->bindGameControllerButton(INPUT_LEFT, SDL_CONTROLLER_BUTTON_DPAD_LEFT); input->bindKey(input_cancel, SDL_SCANCODE_ESCAPE);
input->bindGameControllerButton(INPUT_RIGHT, SDL_CONTROLLER_BUTTON_DPAD_RIGHT); input->bindKey(input_pause, SDL_SCANCODE_H);
input->bindGameControllerButton(INPUT_ACCEPT, SDL_CONTROLLER_BUTTON_B); input->bindKey(input_exit, SDL_SCANCODE_ESCAPE);
input->bindGameControllerButton(INPUT_CANCEL, SDL_CONTROLLER_BUTTON_A); input->bindKey(input_window_dec_size, SDL_SCANCODE_F1);
input->bindGameControllerButton(INPUT_BUTTON_1, SDL_CONTROLLER_BUTTON_B); input->bindKey(input_window_inc_size, SDL_SCANCODE_F2);
input->bindGameControllerButton(INPUT_BUTTON_PAUSE, SDL_CONTROLLER_BUTTON_GUIDE); input->bindKey(input_window_fullscreen, SDL_SCANCODE_F3);
input->bindGameControllerButton(INPUT_BUTTON_ESCAPE, SDL_CONTROLLER_BUTTON_GUIDE); input->bindKey(input_swap_palette, SDL_SCANCODE_F5);
input->bindKey(input_switch_music, SDL_SCANCODE_M);
input->bindKey(input_toggle_border, SDL_SCANCODE_B);
// Mando - Movimiento
input->bindGameControllerButton(input_jump, SDL_CONTROLLER_BUTTON_B);
input->bindGameControllerButton(input_left, SDL_CONTROLLER_BUTTON_DPAD_LEFT);
input->bindGameControllerButton(input_right, SDL_CONTROLLER_BUTTON_DPAD_RIGHT);
// Mando - Otros
input->bindGameControllerButton(input_accept, SDL_CONTROLLER_BUTTON_B);
input->bindGameControllerButton(input_cancel, SDL_CONTROLLER_BUTTON_A);
#ifdef GAME_CONSOLE
input->bindGameControllerButton(input_pause, SDL_CONTROLLER_BUTTON_BACK);
input->bindGameControllerButton(input_exit, SDL_CONTROLLER_BUTTON_START);
#else
input->bindGameControllerButton(input_pause, SDL_CONTROLLER_BUTTON_START);
input->bindGameControllerButton(input_exit, SDL_CONTROLLER_BUTTON_BACK);
#endif
input->bindGameControllerButton(input_swap_palette, SDL_CONTROLLER_BUTTON_LEFTSHOULDER);
input->bindGameControllerButton(input_switch_music, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER);
input->bindGameControllerButton(input_toggle_border, SDL_CONTROLLER_BUTTON_X);
} }
// Inicializa JailAudio // Inicializa JailAudio
@@ -1165,8 +1300,8 @@ bool Director::initSDL()
int incH = 0; int incH = 0;
if (options->borderEnabled) if (options->borderEnabled)
{ {
incW = options->gameWidth * options->borderSize; incW = options->borderWidth * 2;
incH = options->gameHeight * options->borderSize; incH = options->borderHeight * 2;
} }
window = SDL_CreateWindow(WINDOW_CAPTION, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, (options->gameWidth + incW) * options->windowSize, (options->gameHeight + incH) * options->windowSize, SDL_WINDOW_SHOWN | SDL_WINDOW_ALLOW_HIGHDPI); window = SDL_CreateWindow(WINDOW_CAPTION, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, (options->gameWidth + incW) * options->windowSize, (options->gameHeight + incH) * options->windowSize, SDL_WINDOW_SHOWN | SDL_WINDOW_ALLOW_HIGHDPI);
@@ -1241,6 +1376,10 @@ bool Director::setFileList()
asset->add(systemFolder + "/config.txt", t_data, false, true); asset->add(systemFolder + "/config.txt", t_data, false, true);
asset->add(systemFolder + "/stats_buffer.csv", t_data, false, true); asset->add(systemFolder + "/stats_buffer.csv", t_data, false, true);
asset->add(systemFolder + "/stats.csv", t_data, false, true); asset->add(systemFolder + "/stats.csv", t_data, false, true);
asset->add(systemFolder + "/cheevos.bin", t_data, false, true);
// Notificaciones
asset->add(prefix + "/data/notifications/notify.png", t_bitmap);
// Habitaciones // Habitaciones
asset->add(prefix + "/data/room/01.room", t_room); asset->add(prefix + "/data/room/01.room", t_room);
@@ -1377,12 +1516,12 @@ bool Director::setFileList()
asset->add(prefix + "/data/enemies/abad.png", t_bitmap); asset->add(prefix + "/data/enemies/abad.png", t_bitmap);
asset->add(prefix + "/data/enemies/amstrad_cs.ani", t_data); asset->add(prefix + "/data/enemies/amstrad_cs.ani", t_data);
asset->add(prefix + "/data/enemies/amstrad_cs.png", t_bitmap); asset->add(prefix + "/data/enemies/amstrad_cs.png", t_bitmap);
asset->add(prefix + "/data/enemies/arounder_fly.ani", t_data); asset->add(prefix + "/data/enemies/flying_arounder.ani", t_data);
asset->add(prefix + "/data/enemies/arounder_fly.png", t_bitmap); asset->add(prefix + "/data/enemies/flying_arounder.png", t_bitmap);
asset->add(prefix + "/data/enemies/arounder_stop.ani", t_data); asset->add(prefix + "/data/enemies/stopped_arounder.ani", t_data);
asset->add(prefix + "/data/enemies/arounder_stop.png", t_bitmap); asset->add(prefix + "/data/enemies/stopped_arounder.png", t_bitmap);
asset->add(prefix + "/data/enemies/arounder_walk.ani", t_data); asset->add(prefix + "/data/enemies/walking_arounder.ani", t_data);
asset->add(prefix + "/data/enemies/arounder_walk.png", t_bitmap); asset->add(prefix + "/data/enemies/walking_arounder.png", t_bitmap);
asset->add(prefix + "/data/enemies/arounders_door.ani", t_data); asset->add(prefix + "/data/enemies/arounders_door.ani", t_data);
asset->add(prefix + "/data/enemies/arounders_door.png", t_bitmap); asset->add(prefix + "/data/enemies/arounders_door.png", t_bitmap);
asset->add(prefix + "/data/enemies/arounders_machine.ani", t_data); asset->add(prefix + "/data/enemies/arounders_machine.ani", t_data);
@@ -1417,24 +1556,24 @@ bool Director::setFileList()
asset->add(prefix + "/data/enemies/demon.png", t_bitmap); asset->add(prefix + "/data/enemies/demon.png", t_bitmap);
asset->add(prefix + "/data/enemies/dimallas.ani", t_data); asset->add(prefix + "/data/enemies/dimallas.ani", t_data);
asset->add(prefix + "/data/enemies/dimallas.png", t_bitmap); asset->add(prefix + "/data/enemies/dimallas.png", t_bitmap);
asset->add(prefix + "/data/enemies/diskette.ani", t_data); asset->add(prefix + "/data/enemies/floppy.ani", t_data);
asset->add(prefix + "/data/enemies/diskette.png", t_bitmap); asset->add(prefix + "/data/enemies/floppy.png", t_bitmap);
asset->add(prefix + "/data/enemies/dong.ani", t_data); asset->add(prefix + "/data/enemies/dong.ani", t_data);
asset->add(prefix + "/data/enemies/dong.png", t_bitmap); asset->add(prefix + "/data/enemies/dong.png", t_bitmap);
asset->add(prefix + "/data/enemies/guitar.ani", t_data); asset->add(prefix + "/data/enemies/guitar.ani", t_data);
asset->add(prefix + "/data/enemies/guitar.png", t_bitmap); asset->add(prefix + "/data/enemies/guitar.png", t_bitmap);
asset->add(prefix + "/data/enemies/heavy.ani", t_data); asset->add(prefix + "/data/enemies/heavy.ani", t_data);
asset->add(prefix + "/data/enemies/heavy.png", t_bitmap); asset->add(prefix + "/data/enemies/heavy.png", t_bitmap);
asset->add(prefix + "/data/enemies/jailer.ani", t_data); asset->add(prefix + "/data/enemies/jailer_#1.ani", t_data);
asset->add(prefix + "/data/enemies/jailer.png", t_bitmap); asset->add(prefix + "/data/enemies/jailer_#1.png", t_bitmap);
asset->add(prefix + "/data/enemies/jailer2.ani", t_data); asset->add(prefix + "/data/enemies/jailer_#2.ani", t_data);
asset->add(prefix + "/data/enemies/jailer2.png", t_bitmap); asset->add(prefix + "/data/enemies/jailer_#2.png", t_bitmap);
asset->add(prefix + "/data/enemies/jailer3.ani", t_data); asset->add(prefix + "/data/enemies/jailer_#3.ani", t_data);
asset->add(prefix + "/data/enemies/jailer3.png", t_bitmap); asset->add(prefix + "/data/enemies/jailer_#3.png", t_bitmap);
asset->add(prefix + "/data/enemies/jb_alien.ani", t_data); asset->add(prefix + "/data/enemies/jailbattle_alien.ani", t_data);
asset->add(prefix + "/data/enemies/jb_alien.png", t_bitmap); asset->add(prefix + "/data/enemies/jailbattle_alien.png", t_bitmap);
asset->add(prefix + "/data/enemies/jb_human.ani", t_data); asset->add(prefix + "/data/enemies/jailbattle_human.ani", t_data);
asset->add(prefix + "/data/enemies/jb_human.png", t_bitmap); asset->add(prefix + "/data/enemies/jailbattle_human.png", t_bitmap);
asset->add(prefix + "/data/enemies/jeannine.ani", t_data); asset->add(prefix + "/data/enemies/jeannine.ani", t_data);
asset->add(prefix + "/data/enemies/jeannine.png", t_bitmap); asset->add(prefix + "/data/enemies/jeannine.png", t_bitmap);
asset->add(prefix + "/data/enemies/lamp.ani", t_data); asset->add(prefix + "/data/enemies/lamp.ani", t_data);
@@ -1447,8 +1586,8 @@ bool Director::setFileList()
asset->add(prefix + "/data/enemies/mummy.png", t_bitmap); asset->add(prefix + "/data/enemies/mummy.png", t_bitmap);
asset->add(prefix + "/data/enemies/paco.ani", t_data); asset->add(prefix + "/data/enemies/paco.ani", t_data);
asset->add(prefix + "/data/enemies/paco.png", t_bitmap); asset->add(prefix + "/data/enemies/paco.png", t_bitmap);
asset->add(prefix + "/data/enemies/printer.ani", t_data); asset->add(prefix + "/data/enemies/elsa.ani", t_data);
asset->add(prefix + "/data/enemies/printer.png", t_bitmap); asset->add(prefix + "/data/enemies/elsa.png", t_bitmap);
asset->add(prefix + "/data/enemies/qvoid.ani", t_data); asset->add(prefix + "/data/enemies/qvoid.ani", t_data);
asset->add(prefix + "/data/enemies/qvoid.png", t_bitmap); asset->add(prefix + "/data/enemies/qvoid.png", t_bitmap);
asset->add(prefix + "/data/enemies/robot.ani", t_data); asset->add(prefix + "/data/enemies/robot.ani", t_data);
@@ -1565,24 +1704,6 @@ bool Director::setFileList()
return asset->check(); return asset->check();
} }
// Obtiene el valor de la variable
Uint8 Director::getSubsection()
{
return section.subsection;
}
// Obtiene el valor de la variable
Uint8 Director::getSection()
{
return section.name;
}
// Establece el valor de la variable
void Director::setSection(section_t section)
{
this->section = section;
}
// Ejecuta la seccion de juego con el logo // Ejecuta la seccion de juego con el logo
void Director::runLogo() void Director::runLogo()
{ {
@@ -1591,8 +1712,8 @@ void Director::runLogo()
std::cout << "\n* SECTION: LOGO" << std::endl; std::cout << "\n* SECTION: LOGO" << std::endl;
} }
loadResources(section); loadResources(section);
logo = new Logo(renderer, screen, resource, asset, options, section.subsection); logo = new Logo(renderer, screen, resource, asset, input, options, section);
setSection(logo->run()); logo->run();
delete logo; delete logo;
resource->free(); resource->free();
} }
@@ -1605,8 +1726,8 @@ void Director::runIntro()
std::cout << "\n* SECTION: INTRO" << std::endl; std::cout << "\n* SECTION: INTRO" << std::endl;
} }
loadResources(section); loadResources(section);
intro = new Intro(renderer, screen, resource, asset, options); intro = new Intro(renderer, screen, resource, asset, input, options, section);
setSection(intro->run()); intro->run();
delete intro; delete intro;
resource->free(); resource->free();
} }
@@ -1623,8 +1744,8 @@ void Director::runTitle()
JA_PlayMusic(music); JA_PlayMusic(music);
} }
loadResources(section); loadResources(section);
title = new Title(renderer, screen, resource, asset, options); title = new Title(renderer, screen, resource, asset, input, options, section);
setSection(title->run()); title->run();
delete title; delete title;
resource->free(); resource->free();
} }
@@ -1637,8 +1758,8 @@ void Director::runCredits()
std::cout << "\n* SECTION: CREDITS" << std::endl; std::cout << "\n* SECTION: CREDITS" << std::endl;
} }
loadResources(section); loadResources(section);
credits = new Credits(renderer, screen, resource, asset, options); credits = new Credits(renderer, screen, resource, asset, input, options, section);
setSection(credits->run()); credits->run();
delete credits; delete credits;
resource->free(); resource->free();
} }
@@ -1651,8 +1772,8 @@ void Director::runDemo()
std::cout << "\n* SECTION: DEMO" << std::endl; std::cout << "\n* SECTION: DEMO" << std::endl;
} }
loadResources(section); loadResources(section);
demo = new Demo(renderer, screen, resource, asset, options, debug); demo = new Demo(renderer, screen, resource, asset, input, options, section, debug);
setSection(demo->run()); demo->run();
delete demo; delete demo;
resource->free(); resource->free();
} }
@@ -1666,7 +1787,7 @@ void Director::runEnterID()
} }
// loadResources(section); // loadResources(section);
enterID = new EnterID(renderer, screen, asset, options, section); enterID = new EnterID(renderer, screen, asset, options, section);
setSection(enterID->run()); enterID->run();
delete enterID; delete enterID;
resource->free(); resource->free();
} }
@@ -1679,8 +1800,8 @@ void Director::runEnding()
std::cout << "\n* SECTION: ENDING" << std::endl; std::cout << "\n* SECTION: ENDING" << std::endl;
} }
loadResources(section); loadResources(section);
ending = new Ending(renderer, screen, resource, asset, options); ending = new Ending(renderer, screen, resource, asset, input, options, section);
setSection(ending->run()); ending->run();
delete ending; delete ending;
resource->free(); resource->free();
} }
@@ -1693,8 +1814,8 @@ void Director::runEnding2()
std::cout << "\n* SECTION: ENDING2" << std::endl; std::cout << "\n* SECTION: ENDING2" << std::endl;
} }
loadResources(section); loadResources(section);
ending2 = new Ending2(renderer, screen, resource, asset, options); ending2 = new Ending2(renderer, screen, resource, asset, input, options, section);
setSection(ending2->run()); ending2->run();
delete ending2; delete ending2;
resource->free(); resource->free();
} }
@@ -1707,8 +1828,8 @@ void Director::runGameOver()
std::cout << "\n* SECTION: GAME OVER" << std::endl; std::cout << "\n* SECTION: GAME OVER" << std::endl;
} }
loadResources(section); loadResources(section);
gameOver = new GameOver(renderer, screen, resource, asset, options); gameOver = new GameOver(renderer, screen, resource, asset, input, options, section);
setSection(gameOver->run()); gameOver->run();
delete gameOver; delete gameOver;
resource->free(); resource->free();
} }
@@ -1722,8 +1843,8 @@ void Director::runGame()
} }
JA_StopMusic(); JA_StopMusic();
loadResources(section); loadResources(section);
game = new Game(renderer, screen, resource, asset, options, input, debug); game = new Game(renderer, screen, resource, asset, options, input, section, debug);
setSection(game->run()); game->run();
delete game; delete game;
resource->free(); resource->free();
} }
@@ -1731,9 +1852,9 @@ void Director::runGame()
void Director::run() void Director::run()
{ {
// Bucle principal // Bucle principal
while (getSection() != SECTION_PROG_QUIT) while (section->name != SECTION_PROG_QUIT)
{ {
switch (getSection()) switch (section->name)
{ {
case SECTION_PROG_LOGO: case SECTION_PROG_LOGO:
runLogo(); runLogo();

View File

@@ -46,10 +46,10 @@ private:
GameOver *gameOver; // Objeto para gestionar el final de la partida GameOver *gameOver; // Objeto para gestionar el final de la partida
Debug *debug; // Objeto para getsionar la información de debug Debug *debug; // Objeto para getsionar la información de debug
struct options_t *options; // Variable con todas las opciones del programa struct options_t *options; // Variable con todas las opciones del programa
section_t *section; // Sección y subsección actual del programa;
// Variables // Variables
section_t section; // Sección y subsección actual del programa; JA_Music_t *music; // Musica del titulo
JA_Music music; // Musica del titulo
std::string executablePath; // Path del ejecutable std::string executablePath; // Path del ejecutable
std::string systemFolder; // Carpeta del sistema donde guardar datos std::string systemFolder; // Carpeta del sistema donde guardar datos
@@ -69,10 +69,10 @@ private:
bool saveConfig(); bool saveConfig();
// Crea la carpeta del sistema donde guardar datos // Crea la carpeta del sistema donde guardar datos
void createSystemFolder(); void createSystemFolder(std::string folder);
// Carga los recursos // Carga los recursos
void loadResources(section_t section); void loadResources(section_t *section);
// Asigna variables a partir de dos cadenas // Asigna variables a partir de dos cadenas
bool setOptions(options_t *options, std::string var, std::string value); bool setOptions(options_t *options, std::string var, std::string value);
@@ -89,15 +89,6 @@ private:
// Crea el indice de ficheros // Crea el indice de ficheros
bool setFileList(); bool setFileList();
// Obtiene el valor de la variable
Uint8 getSubsection();
// Obtiene el valor de la variable
Uint8 getSection();
// Establece el valor de la variable
void setSection(section_t section);
// Ejecuta la seccion de juego con el logo // Ejecuta la seccion de juego con el logo
void runLogo(); void runLogo();

View File

@@ -1,14 +1,16 @@
#include "ending.h" #include "ending.h"
// Constructor // Constructor
Ending::Ending(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, options_t *options) Ending::Ending(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, Input *input, options_t *options, section_t *section)
{ {
// Copia los punteros // Copia los punteros
this->renderer = renderer; this->renderer = renderer;
this->screen = screen; this->screen = screen;
this->resource = resource; this->resource = resource;
this->asset = asset; this->asset = asset;
this->input = input;
this->options = options; this->options = options;
this->section = section;
// Reserva memoria para los punteros a objetos // Reserva memoria para los punteros a objetos
eventHandler = new SDL_Event(); eventHandler = new SDL_Event();
@@ -19,8 +21,8 @@ Ending::Ending(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset
counter = -1; counter = -1;
preCounter = 0; preCounter = 0;
coverCounter = 0; coverCounter = 0;
section.name = SECTION_PROG_ENDING; section->name = SECTION_PROG_ENDING;
section.subsection = 0; section->subsection = 0;
ticks = 0; ticks = 0;
ticksSpeed = 15; ticksSpeed = 15;
scene = 0; scene = 0;
@@ -83,14 +85,17 @@ Ending::~Ending()
// Actualiza el objeto // Actualiza el objeto
void Ending::update() void Ending::update()
{ {
// Comprueba el manejador de eventos
checkEventHandler();
// Comprueba que la diferencia de ticks sea mayor a la velocidad del juego // Comprueba que la diferencia de ticks sea mayor a la velocidad del juego
if (SDL_GetTicks() - ticks > ticksSpeed) if (SDL_GetTicks() - ticks > ticksSpeed)
{ {
// Actualiza el contador de ticks // Actualiza el contador de ticks
ticks = SDL_GetTicks(); ticks = SDL_GetTicks();
// Comprueba el manejador de eventos // Comprueba las entradas
checkEventHandler(); checkInput();
// Actualiza el contador // Actualiza el contador
updateCounters(); updateCounters();
@@ -119,16 +124,16 @@ void Ending::render()
screen->clean(stringToColor(options->palette, "black")); screen->clean(stringToColor(options->palette, "black"));
// Dibuja las imagenes de la escena // Dibuja las imagenes de la escena
spritePics.at(scene).sprite->render(); spritePics[scene].sprite->render();
spritePics.at(scene).coverSprite->render(); spritePics[scene].coverSprite->render();
// Dibuja los textos de la escena // Dibuja los textos de la escena
for (auto ti : scenes.at(scene).textIndex) for (auto ti : scenes[scene].textIndex)
{ {
if (counter > ti.trigger) if (counter > ti.trigger)
{ {
spriteTexts.at(ti.index).sprite->render(); spriteTexts[ti.index].sprite->render();
spriteTexts.at(ti.index).coverSprite->render(); spriteTexts[ti.index].coverSprite->render();
} }
} }
@@ -150,57 +155,45 @@ void Ending::checkEventHandler()
// Evento de salida de la aplicación // Evento de salida de la aplicación
if (eventHandler->type == SDL_QUIT) if (eventHandler->type == SDL_QUIT)
{ {
section.name = SECTION_PROG_QUIT; section->name = SECTION_PROG_QUIT;
break; break;
} }
}
}
// Comprueba las teclas que se han pulsado // Comprueba las entradas
if ((eventHandler->type == SDL_KEYDOWN && eventHandler->key.repeat == 0) || (eventHandler->type == SDL_JOYBUTTONDOWN)) void Ending::checkInput()
{ {
switch (eventHandler->key.keysym.scancode)
{
case SDL_SCANCODE_ESCAPE:
section.name = SECTION_PROG_QUIT;
break;
case SDL_SCANCODE_B: if (input->checkInput(input_exit, REPEAT_FALSE))
screen->switchBorder(); {
resource->reLoadTextures(); section->name = SECTION_PROG_LOGO;
break; section->subsection = SUBSECTION_LOGO_TO_INTRO;
}
case SDL_SCANCODE_F: else if (input->checkInput(input_toggle_border, REPEAT_FALSE))
screen->switchVideoMode(); {
resource->reLoadTextures(); screen->switchBorder();
break; }
case SDL_SCANCODE_F1: else if (input->checkInput(input_window_fullscreen, REPEAT_FALSE))
screen->setWindowSize(1); {
resource->reLoadTextures(); screen->switchVideoMode();
break; }
case SDL_SCANCODE_F2: else if (input->checkInput(input_window_dec_size, REPEAT_FALSE))
screen->setWindowSize(2); {
resource->reLoadTextures(); screen->decWindowSize();
break; }
case SDL_SCANCODE_F3: else if (input->checkInput(input_window_inc_size, REPEAT_FALSE))
screen->setWindowSize(3); {
resource->reLoadTextures(); screen->incWindowSize();
break; }
case SDL_SCANCODE_F4: else if (input->checkInput(input_swap_palette, REPEAT_FALSE))
screen->setWindowSize(4); {
resource->reLoadTextures(); switchPalette();
break;
case SDL_SCANCODE_F5:
switchPalette();
break;
default:
break;
}
}
} }
} }
@@ -482,11 +475,11 @@ void Ending::iniScenes()
} }
// Bucle principal // Bucle principal
section_t Ending::run() void Ending::run()
{ {
JA_PlayMusic(music); JA_PlayMusic(music);
while (section.name == SECTION_PROG_ENDING) while (section->name == SECTION_PROG_ENDING)
{ {
update(); update();
render(); render();
@@ -494,8 +487,6 @@ section_t Ending::run()
JA_StopMusic(); JA_StopMusic();
JA_SetVolume(128); JA_SetVolume(128);
return section;
} }
// Actualiza los contadores // Actualiza los contadores
@@ -511,7 +502,7 @@ void Ending::updateCounters()
counter++; counter++;
} }
if (counter > scenes.at(scene).counterEnd - 100) if (counter > scenes[scene].counterEnd - 100)
{ {
coverCounter++; coverCounter++;
} }
@@ -522,20 +513,20 @@ void Ending::updateSpriteCovers()
{ // Actualiza la cortinilla de los textos { // Actualiza la cortinilla de los textos
if (counter % 4 == 0) if (counter % 4 == 0)
{ {
for (auto ti : scenes.at(scene).textIndex) for (auto ti : scenes[scene].textIndex)
{ {
if (counter > ti.trigger) if (counter > ti.trigger)
{ {
if (spriteTexts.at(ti.index).clipDesp > 0) if (spriteTexts[ti.index].clipDesp > 0)
{ {
spriteTexts.at(ti.index).clipDesp -= 2; spriteTexts[ti.index].clipDesp -= 2;
} }
else if (spriteTexts.at(ti.index).clipHeight > 0) else if (spriteTexts[ti.index].clipHeight > 0)
{ {
spriteTexts.at(ti.index).clipHeight -= 2; spriteTexts[ti.index].clipHeight -= 2;
spriteTexts.at(ti.index).coverSprite->setPosY(spriteTexts.at(ti.index).coverSprite->getPosY() + 2); spriteTexts[ti.index].coverSprite->setPosY(spriteTexts[ti.index].coverSprite->getPosY() + 2);
} }
spriteTexts.at(ti.index).coverSprite->setSpriteClip(0, spriteTexts.at(ti.index).clipDesp, spriteTexts.at(ti.index).coverSprite->getWidth(), spriteTexts.at(ti.index).clipHeight); spriteTexts[ti.index].coverSprite->setSpriteClip(0, spriteTexts[ti.index].clipDesp, spriteTexts[ti.index].coverSprite->getWidth(), spriteTexts[ti.index].clipHeight);
} }
} }
} }
@@ -543,27 +534,27 @@ void Ending::updateSpriteCovers()
// Actualiza la cortinilla de las imagenes // Actualiza la cortinilla de las imagenes
if (counter % 2 == 0) if (counter % 2 == 0)
{ {
if (spritePics.at(scene).clipDesp > 0) if (spritePics[scene].clipDesp > 0)
{ {
spritePics.at(scene).clipDesp -= 2; spritePics[scene].clipDesp -= 2;
} }
else if (spritePics.at(scene).clipHeight > 0) else if (spritePics[scene].clipHeight > 0)
{ {
spritePics.at(scene).clipHeight -= 2; spritePics[scene].clipHeight -= 2;
if (spritePics.at(scene).clipHeight < 0) if (spritePics[scene].clipHeight < 0)
{ {
spritePics.at(scene).clipHeight = 0; spritePics[scene].clipHeight = 0;
} }
spritePics.at(scene).coverSprite->setPosY(spritePics.at(scene).coverSprite->getPosY() + 2); spritePics[scene].coverSprite->setPosY(spritePics[scene].coverSprite->getPosY() + 2);
} }
spritePics.at(scene).coverSprite->setSpriteClip(0, spritePics.at(scene).clipDesp, spritePics.at(scene).coverSprite->getWidth(), spritePics.at(scene).clipHeight); spritePics[scene].coverSprite->setSpriteClip(0, spritePics[scene].clipDesp, spritePics[scene].coverSprite->getWidth(), spritePics[scene].clipHeight);
} }
} }
// Comprueba si se ha de cambiar de escena // Comprueba si se ha de cambiar de escena
void Ending::checkChangeScene() void Ending::checkChangeScene()
{ {
if (counter > scenes.at(scene).counterEnd) if (counter > scenes[scene].counterEnd)
{ {
scene++; scene++;
counter = 0; counter = 0;
@@ -571,7 +562,7 @@ void Ending::checkChangeScene()
if (scene == 5) if (scene == 5)
{ {
// Termina el bucle // Termina el bucle
section.name = SECTION_PROG_ENDING2; section->name = SECTION_PROG_ENDING2;
// Mantiene los valores anteriores // Mantiene los valores anteriores
scene = 4; scene = 4;
@@ -639,20 +630,20 @@ void Ending::switchPalette()
{ {
options->palette = p_zxarne; options->palette = p_zxarne;
spritePics.at(0).sprite->setTexture(resource->getTexture("ending1_zxarne.png")); spritePics[0].sprite->setTexture(resource->getTexture("ending1_zxarne.png"));
spritePics.at(1).sprite->setTexture(resource->getTexture("ending2_zxarne.png")); spritePics[1].sprite->setTexture(resource->getTexture("ending2_zxarne.png"));
spritePics.at(2).sprite->setTexture(resource->getTexture("ending3_zxarne.png")); spritePics[2].sprite->setTexture(resource->getTexture("ending3_zxarne.png"));
spritePics.at(3).sprite->setTexture(resource->getTexture("ending4_zxarne.png")); spritePics[3].sprite->setTexture(resource->getTexture("ending4_zxarne.png"));
spritePics.at(4).sprite->setTexture(resource->getTexture("ending5_zxarne.png")); spritePics[4].sprite->setTexture(resource->getTexture("ending5_zxarne.png"));
} }
else else
{ {
options->palette = p_zxspectrum; options->palette = p_zxspectrum;
spritePics.at(0).sprite->setTexture(resource->getTexture("ending1.png")); spritePics[0].sprite->setTexture(resource->getTexture("ending1.png"));
spritePics.at(1).sprite->setTexture(resource->getTexture("ending2.png")); spritePics[1].sprite->setTexture(resource->getTexture("ending2.png"));
spritePics.at(2).sprite->setTexture(resource->getTexture("ending3.png")); spritePics[2].sprite->setTexture(resource->getTexture("ending3.png"));
spritePics.at(3).sprite->setTexture(resource->getTexture("ending4.png")); spritePics[3].sprite->setTexture(resource->getTexture("ending4.png"));
spritePics.at(4).sprite->setTexture(resource->getTexture("ending5.png")); spritePics[4].sprite->setTexture(resource->getTexture("ending5.png"));
} }
} }

View File

@@ -1,6 +1,7 @@
#pragma once #pragma once
#include <SDL2/SDL.h> #include <SDL2/SDL.h>
#include "common/asset.h" #include "common/asset.h"
#include "common/input.h"
#include "common/jail_audio.h" #include "common/jail_audio.h"
#include "common/resource.h" #include "common/resource.h"
#include "common/screen.h" #include "common/screen.h"
@@ -54,23 +55,24 @@ private:
Screen *screen; // Objeto encargado de dibujar en pantalla Screen *screen; // Objeto encargado de dibujar en pantalla
Resource *resource; // Objeto con los recursos Resource *resource; // Objeto con los recursos
Asset *asset; // Objeto con los ficheros de recursos Asset *asset; // Objeto con los ficheros de recursos
Input *input; // Objeto pata gestionar la entrada
options_t *options; // Puntero a las opciones del juego options_t *options; // Puntero a las opciones del juego
SDL_Event *eventHandler; // Manejador de eventos SDL_Event *eventHandler; // Manejador de eventos
Text *text; // Objeto para escribir texto en pantalla Text *text; // Objeto para escribir texto en pantalla
SDL_Texture *coverTexture; // Textura para cubrir el texto SDL_Texture *coverTexture; // Textura para cubrir el texto
section_t *section; // Estado del bucle principal para saber si continua o se sale
// Variables // Variables
int counter; // Contador int counter; // Contador
int preCounter; // Contador previo int preCounter; // Contador previo
int coverCounter; // Contador para la cortinilla int coverCounter; // Contador para la cortinilla
section_t section; // Estado del bucle principal para saber si continua o se sale
Uint32 ticks; // Contador de ticks para ajustar la velocidad del programa Uint32 ticks; // Contador de ticks para ajustar la velocidad del programa
Uint32 ticksSpeed; // Velocidad a la que se repiten los bucles del programa Uint32 ticksSpeed; // Velocidad a la que se repiten los bucles del programa
std::vector<endingTexture_t> spriteTexts; // Vector con los sprites de texto con su cortinilla std::vector<endingTexture_t> spriteTexts; // Vector con los sprites de texto con su cortinilla
std::vector<endingTexture_t> spritePics; // Vector con los sprites de texto con su cortinilla std::vector<endingTexture_t> spritePics; // Vector con los sprites de texto con su cortinilla
int scene; // Escena actual int scene; // Escena actual
std::vector<scene_t> scenes; // Vector con los textos e imagenes de cada escena std::vector<scene_t> scenes; // Vector con los textos e imagenes de cada escena
JA_Music music; // Musica que suena durante el final JA_Music_t *music; // Musica que suena durante el final
// Actualiza el objeto // Actualiza el objeto
void update(); void update();
@@ -81,6 +83,9 @@ private:
// Comprueba el manejador de eventos // Comprueba el manejador de eventos
void checkEventHandler(); void checkEventHandler();
// Comprueba las entradas
void checkInput();
// Inicializa los textos // Inicializa los textos
void iniTexts(); void iniTexts();
@@ -113,13 +118,13 @@ private:
public: public:
// Constructor // Constructor
Ending(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, options_t *options); Ending(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, Input *input, options_t *options, section_t *section);
// Destructor // Destructor
~Ending(); ~Ending();
// Bucle principal // Bucle principal
section_t run(); void run();
}; };
#endif #endif

View File

@@ -2,14 +2,16 @@
#include <algorithm> #include <algorithm>
// Constructor // Constructor
Ending2::Ending2(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, options_t *options) Ending2::Ending2(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, Input *input, options_t *options, section_t *section)
{ {
// Copia los punteros // Copia los punteros
this->renderer = renderer; this->renderer = renderer;
this->screen = screen; this->screen = screen;
this->resource = resource; this->resource = resource;
this->asset = asset; this->asset = asset;
this->input = input;
this->options = options; this->options = options;
this->section = section;
// Reserva memoria para los punteros a objetos // Reserva memoria para los punteros a objetos
eventHandler = new SDL_Event(); eventHandler = new SDL_Event();
@@ -21,8 +23,8 @@ Ending2::Ending2(SDL_Renderer *renderer, Screen *screen, Resource *resource, Ass
preCounter = 0; preCounter = 0;
postCounter = 0; postCounter = 0;
postCounterEnabled = false; postCounterEnabled = false;
section.name = SECTION_PROG_ENDING2; section->name = SECTION_PROG_ENDING2;
section.subsection = 0; section->subsection = 0;
ticks = 0; ticks = 0;
ticksSpeed = 15; ticksSpeed = 15;
distSpriteText = 8; distSpriteText = 8;
@@ -73,14 +75,17 @@ Ending2::~Ending2()
// Actualiza el objeto // Actualiza el objeto
void Ending2::update() void Ending2::update()
{ {
// Comprueba el manejador de eventos
checkEventHandler();
// Comprueba que la diferencia de ticks sea mayor a la velocidad del juego // Comprueba que la diferencia de ticks sea mayor a la velocidad del juego
if (SDL_GetTicks() - ticks > ticksSpeed) if (SDL_GetTicks() - ticks > ticksSpeed)
{ {
// Actualiza el contador de ticks // Actualiza el contador de ticks
ticks = SDL_GetTicks(); ticks = SDL_GetTicks();
// Comprueba el manejador de eventos // Comprueba las entradas
checkEventHandler(); checkInput();
// Actualiza los contadores // Actualiza los contadores
updateCounters(); updateCounters();
@@ -184,66 +189,54 @@ void Ending2::checkEventHandler()
// Evento de salida de la aplicación // Evento de salida de la aplicación
if (eventHandler->type == SDL_QUIT) if (eventHandler->type == SDL_QUIT)
{ {
section.name = SECTION_PROG_QUIT; section->name = SECTION_PROG_QUIT;
break; break;
} }
}
// Comprueba las teclas que se han pulsado }
if ((eventHandler->type == SDL_KEYDOWN && eventHandler->key.repeat == 0) || (eventHandler->type == SDL_JOYBUTTONDOWN))
{ // Comprueba las entradas
switch (eventHandler->key.keysym.scancode) void Ending2::checkInput()
{ {
case SDL_SCANCODE_ESCAPE:
section.name = SECTION_PROG_QUIT; if (input->checkInput(input_exit, REPEAT_FALSE))
break; {
section->name = SECTION_PROG_LOGO;
case SDL_SCANCODE_B: section->subsection = SUBSECTION_LOGO_TO_INTRO;
screen->switchBorder(); }
resource->reLoadTextures();
break; else if (input->checkInput(input_toggle_border, REPEAT_FALSE))
{
case SDL_SCANCODE_F: screen->switchBorder();
screen->switchVideoMode(); }
resource->reLoadTextures();
break; else if (input->checkInput(input_window_fullscreen, REPEAT_FALSE))
{
case SDL_SCANCODE_F1: screen->switchVideoMode();
screen->setWindowSize(1); }
resource->reLoadTextures();
break; else if (input->checkInput(input_window_dec_size, REPEAT_FALSE))
{
case SDL_SCANCODE_F2: screen->decWindowSize();
screen->setWindowSize(2); }
resource->reLoadTextures();
break; else if (input->checkInput(input_window_inc_size, REPEAT_FALSE))
{
case SDL_SCANCODE_F3: screen->incWindowSize();
screen->setWindowSize(3); }
resource->reLoadTextures();
break; else if (input->checkInput(input_swap_palette, REPEAT_FALSE))
{
case SDL_SCANCODE_F4: switchPalette();
screen->setWindowSize(4);
resource->reLoadTextures();
break;
case SDL_SCANCODE_F5:
switchPalette();
break;
default:
break;
}
}
} }
} }
// Bucle principal // Bucle principal
section_t Ending2::run() void Ending2::run()
{ {
JA_PlayMusic(music); JA_PlayMusic(music);
while (section.name == SECTION_PROG_ENDING2) while (section->name == SECTION_PROG_ENDING2)
{ {
update(); update();
render(); render();
@@ -251,8 +244,6 @@ section_t Ending2::run()
JA_StopMusic(); JA_StopMusic();
JA_SetVolume(128); JA_SetVolume(128);
return section;
} }
// Actualiza los contadores // Actualiza los contadores
@@ -275,8 +266,8 @@ void Ending2::updateCounters()
if (postCounter > 600) if (postCounter > 600)
{ {
section.name = SECTION_PROG_LOGO; section->name = SECTION_PROG_LOGO;
section.subsection = SUBSECTION_LOGO_TO_INTRO; section->subsection = SUBSECTION_LOGO_TO_INTRO;
} }
} }
@@ -288,14 +279,14 @@ void Ending2::iniSpriteList()
// Añade los valores // Añade los valores
spriteList.push_back("bin"); spriteList.push_back("bin");
spriteList.push_back("diskette"); spriteList.push_back("floppy");
spriteList.push_back("bird"); spriteList.push_back("bird");
spriteList.push_back("chip"); spriteList.push_back("chip");
spriteList.push_back("jeannine"); spriteList.push_back("jeannine");
spriteList.push_back("spark"); spriteList.push_back("spark");
spriteList.push_back("code"); spriteList.push_back("code");
spriteList.push_back("paco"); spriteList.push_back("paco");
spriteList.push_back("printer"); spriteList.push_back("elsa");
spriteList.push_back("z80"); spriteList.push_back("z80");
spriteList.push_back("bell"); spriteList.push_back("bell");
@@ -304,9 +295,9 @@ void Ending2::iniSpriteList()
spriteList.push_back("amstrad_cs"); spriteList.push_back("amstrad_cs");
spriteList.push_back("breakout"); spriteList.push_back("breakout");
spriteList.push_back("arounder_fly"); spriteList.push_back("flying_arounder");
spriteList.push_back("arounder_stop"); spriteList.push_back("stopped_arounder");
spriteList.push_back("arounder_walk"); spriteList.push_back("walking_arounder");
spriteList.push_back("arounders_door"); spriteList.push_back("arounders_door");
spriteList.push_back("arounders_machine"); spriteList.push_back("arounders_machine");
@@ -324,12 +315,12 @@ void Ending2::iniSpriteList()
spriteList.push_back("dimallas"); spriteList.push_back("dimallas");
spriteList.push_back("guitar"); spriteList.push_back("guitar");
spriteList.push_back("jb_alien"); spriteList.push_back("jailbattle_alien");
spriteList.push_back("jb_human"); spriteList.push_back("jailbattle_human");
spriteList.push_back("jailer"); spriteList.push_back("jailer_#1");
spriteList.push_back("jailer2"); spriteList.push_back("jailer_#2");
spriteList.push_back("jailer3"); spriteList.push_back("jailer_#3");
spriteList.push_back("bry"); spriteList.push_back("bry");
spriteList.push_back("upv_student"); spriteList.push_back("upv_student");
@@ -469,13 +460,13 @@ void Ending2::placeSprites()
{ {
const int x = i % 2 == 0 ? firstCol : secondCol; const int x = i % 2 == 0 ? firstCol : secondCol;
const int y = (i / 1) * (maxSpriteHeight + distSpriteText + text->getCharacterSize() + distSpriteSprite) + GAMECANVAS_HEIGHT + 40; const int y = (i / 1) * (maxSpriteHeight + distSpriteText + text->getCharacterSize() + distSpriteSprite) + GAMECANVAS_HEIGHT + 40;
const int w = sprites.at(i)->getAnimationClip(0, 0).w; const int w = sprites[i]->getAnimationClip(0, 0).w;
const int h = sprites.at(i)->getAnimationClip(0, 0).h; const int h = sprites[i]->getAnimationClip(0, 0).h;
const int dx = -(w / 2); const int dx = -(w / 2);
const int dy = i % 1 == 0 ? maxSpriteHeight - h : (int)(maxSpriteHeight * 1.5f) - h; const int dy = i % 1 == 0 ? maxSpriteHeight - h : (int)(maxSpriteHeight * 1.5f) - h;
sprites.at(i)->setRect({x + dx, y + dy, w, h}); sprites[i]->setRect({x + dx, y + dy, w, h});
sprites.at(i)->setVelY(despSpeed); sprites[i]->setVelY(despSpeed);
} }
// Recoloca el último sprite, que es el del jugador // Recoloca el último sprite, que es el del jugador
@@ -497,14 +488,14 @@ void Ending2::createSpriteTexts()
for (int i = 0; i < (int)spriteList.size(); ++i) for (int i = 0; i < (int)spriteList.size(); ++i)
{ {
// Calcula constantes // Calcula constantes
std::string txt = spriteList.at(i); std::string txt = spriteList[i];
std::replace(txt.begin(), txt.end(), '_', ' '); std::replace(txt.begin(), txt.end(), '_', ' ');
txt = txt == "player" ? "JAILDOCTOR" : txt; // Reemplaza el texto txt = txt == "player" ? "JAILDOCTOR" : txt; // Reemplaza el texto
const int w = text->lenght(txt, 1); const int w = text->lenght(txt, 1);
const int h = text->getCharacterSize(); const int h = text->getCharacterSize();
const int x = i % 2 == 0 ? firstCol : secondCol; const int x = i % 2 == 0 ? firstCol : secondCol;
const int dx = -(w / 2); const int dx = -(w / 2);
const int y = sprites.at(i)->getPosY() + sprites.at(i)->getHeight() + distSpriteText; const int y = sprites[i]->getPosY() + sprites[i]->getHeight() + distSpriteText;
// Cambia la posición del último sprite // Cambia la posición del último sprite
const int X = (i == (int)spriteList.size() - 1) ? GAMECANVAS_CENTER_X - (w / 2) : x + dx; const int X = (i == (int)spriteList.size() - 1) ? GAMECANVAS_CENTER_X - (w / 2) : x + dx;
@@ -536,7 +527,7 @@ void Ending2::createTexts()
for (int i = 0; i < (int)list.size(); ++i) for (int i = 0; i < (int)list.size(); ++i)
{ {
// Calcula constantes // Calcula constantes
const int w = text->lenght(list.at(i), 1); const int w = text->lenght(list[i], 1);
const int h = text->getCharacterSize(); const int h = text->getCharacterSize();
const int x = GAMECANVAS_CENTER_X; const int x = GAMECANVAS_CENTER_X;
const int dx = -(w / 2); const int dx = -(w / 2);
@@ -547,7 +538,7 @@ void Ending2::createTexts()
texture->createBlank(renderer, w, h, SDL_TEXTUREACCESS_TARGET); texture->createBlank(renderer, w, h, SDL_TEXTUREACCESS_TARGET);
texture->setAsRenderTarget(renderer); texture->setAsRenderTarget(renderer);
texture->setBlendMode(SDL_BLENDMODE_BLEND); texture->setBlendMode(SDL_BLENDMODE_BLEND);
text->write(0, 0, list.at(i)); text->write(0, 0, list[i]);
// Crea el sprite // Crea el sprite
MovingSprite *sprite = new MovingSprite(x + dx, y, w, h, 0.0f, despSpeed, 0.0f, 0.0f, texture, renderer); MovingSprite *sprite = new MovingSprite(x + dx, y, w, h, 0.0f, despSpeed, 0.0f, 0.0f, texture, renderer);
@@ -565,7 +556,7 @@ void Ending2::createTexts()
for (int i = 0; i < (int)list.size(); ++i) for (int i = 0; i < (int)list.size(); ++i)
{ {
// Calcula constantes // Calcula constantes
const int w = text->lenght(list.at(i), 1); const int w = text->lenght(list[i], 1);
const int h = text->getCharacterSize(); const int h = text->getCharacterSize();
const int x = GAMECANVAS_CENTER_X; const int x = GAMECANVAS_CENTER_X;
const int dx = -(w / 2); const int dx = -(w / 2);
@@ -576,7 +567,7 @@ void Ending2::createTexts()
texture->createBlank(renderer, w, h, SDL_TEXTUREACCESS_TARGET); texture->createBlank(renderer, w, h, SDL_TEXTUREACCESS_TARGET);
texture->setAsRenderTarget(renderer); texture->setAsRenderTarget(renderer);
texture->setBlendMode(SDL_BLENDMODE_BLEND); texture->setBlendMode(SDL_BLENDMODE_BLEND);
text->write(0, 0, list.at(i)); text->write(0, 0, list[i]);
// Crea el sprite // Crea el sprite
MovingSprite *sprite = new MovingSprite(x + dx, y, w, h, 0.0f, despSpeed, 0.0f, 0.0f, texture, renderer); MovingSprite *sprite = new MovingSprite(x + dx, y, w, h, 0.0f, despSpeed, 0.0f, 0.0f, texture, renderer);
@@ -624,7 +615,7 @@ void Ending2::updateFinalFade()
for (auto t : texts) for (auto t : texts)
{ {
t->getTexture()->setColor(colors.at(index).r, colors.at(index).g, colors.at(index).b); t->getTexture()->setColor(colors[index].r, colors[index].g, colors[index].b);
} }
} }

View File

@@ -2,6 +2,7 @@
#include <SDL2/SDL.h> #include <SDL2/SDL.h>
#include "common/animatedsprite.h" #include "common/animatedsprite.h"
#include "common/asset.h" #include "common/asset.h"
#include "common/input.h"
#include "common/jail_audio.h" #include "common/jail_audio.h"
#include "common/resource.h" #include "common/resource.h"
#include "common/screen.h" #include "common/screen.h"
@@ -25,21 +26,22 @@ private:
Screen *screen; // Objeto encargado de dibujar en pantalla Screen *screen; // Objeto encargado de dibujar en pantalla
SDL_Event *eventHandler; // Manejador de eventos SDL_Event *eventHandler; // Manejador de eventos
SDL_Renderer *renderer; // El renderizador de la ventana SDL_Renderer *renderer; // El renderizador de la ventana
Input *input; // Objeto pata gestionar la entrada
Text *text; // Objeto para escribir texto en pantalla Text *text; // Objeto para escribir texto en pantalla
options_t *options; // Puntero a las opciones del juego options_t *options; // Puntero a las opciones del juego
std::vector<AnimatedSprite *> sprites; // Vector con todos los sprites a dibujar std::vector<AnimatedSprite *> sprites; // Vector con todos los sprites a dibujar
std::vector<MovingSprite *> spriteTexts; // Vector con los sprites de texto de los sprites std::vector<MovingSprite *> spriteTexts; // Vector con los sprites de texto de los sprites
std::vector<MovingSprite *> texts; // Vector con los sprites de texto std::vector<MovingSprite *> texts; // Vector con los sprites de texto
section_t *section; // Estado del bucle principal para saber si continua o se sale
// Variables // Variables
bool counterEnabled; // Indica si está el contador habilitado bool counterEnabled; // Indica si está el contador habilitado
int preCounter; // Contador previo int preCounter; // Contador previo
int postCounter; // Contador posterior int postCounter; // Contador posterior
bool postCounterEnabled; // Indica si está habilitado el contador bool postCounterEnabled; // Indica si está habilitado el contador
section_t section; // Estado del bucle principal para saber si continua o se sale
Uint32 ticks; // Contador de ticks para ajustar la velocidad del programa Uint32 ticks; // Contador de ticks para ajustar la velocidad del programa
Uint32 ticksSpeed; // Velocidad a la que se repiten los bucles del programa Uint32 ticksSpeed; // Velocidad a la que se repiten los bucles del programa
JA_Music music; // Musica que suena durante el final JA_Music_t *music; // Musica que suena durante el final
std::vector<std::string> spriteList; // Lista con todos los sprites a dibujar std::vector<std::string> spriteList; // Lista con todos los sprites a dibujar
std::vector<color_t> colors; // Vector con los colores para el fade std::vector<color_t> colors; // Vector con los colores para el fade
int maxSpriteWidth; // El valor de ancho del sprite mas ancho int maxSpriteWidth; // El valor de ancho del sprite mas ancho
@@ -59,6 +61,9 @@ private:
// Comprueba el manejador de eventos // Comprueba el manejador de eventos
void checkEventHandler(); void checkEventHandler();
// Comprueba las entradas
void checkInput();
// Actualiza los contadores // Actualiza los contadores
void updateCounters(); void updateCounters();
@@ -115,13 +120,13 @@ private:
public: public:
// Constructor // Constructor
Ending2(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, options_t *options); Ending2(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, Input *input, options_t *options, section_t *section);
// Destructor // Destructor
~Ending2(); ~Ending2();
// Bucle principal // Bucle principal
section_t run(); void run();
}; };
#endif #endif

View File

@@ -5,13 +5,14 @@
#include <iostream> #include <iostream>
// Constructor // Constructor
EnterID::EnterID(SDL_Renderer *renderer, Screen *screen, Asset *asset, options_t *options, section_t section) EnterID::EnterID(SDL_Renderer *renderer, Screen *screen, Asset *asset, options_t *options, section_t *section)
{ {
// Copia la dirección de los objetos // Copia la dirección de los objetos
this->renderer = renderer; this->renderer = renderer;
this->screen = screen; this->screen = screen;
this->asset = asset; this->asset = asset;
this->options = options; this->options = options;
this->section = section;
// Reserva memoria para los punteros // Reserva memoria para los punteros
eventHandler = new SDL_Event(); eventHandler = new SDL_Event();
@@ -36,11 +37,10 @@ EnterID::EnterID(SDL_Renderer *renderer, Screen *screen, Asset *asset, options_t
pos = 0; pos = 0;
name[pos] = 0; name[pos] = 0;
maxLenght = 15; maxLenght = 15;
this->section.subsection = section.subsection;
if (options->online.enabled && options->online.jailerID == "") if (options->online.enabled && options->online.jailerID == "")
{ {
this->section.name = SECTION_PROG_ENTER_ID; this->section->name = SECTION_PROG_ENTER_ID;
} }
else else
{ {
@@ -60,18 +60,16 @@ EnterID::~EnterID()
} }
// Bucle para el logo del juego // Bucle para el logo del juego
section_t EnterID::run() void EnterID::run()
{ {
// Detiene la música // Detiene la música
JA_StopMusic(); JA_StopMusic();
while (section.name == SECTION_PROG_ENTER_ID) while (section->name == SECTION_PROG_ENTER_ID)
{ {
update(); update();
render(); render();
} }
return section;
} }
// Comprueba el manejador de eventos // Comprueba el manejador de eventos
@@ -83,7 +81,7 @@ void EnterID::checkEventHandler()
// Evento de salida de la aplicación // Evento de salida de la aplicación
if (eventHandler->type == SDL_QUIT) if (eventHandler->type == SDL_QUIT)
{ {
section.name = SECTION_PROG_QUIT; section->name = SECTION_PROG_QUIT;
break; break;
} }
@@ -138,7 +136,7 @@ void EnterID::checkEventHandler()
else if (eventHandler->key.keysym.scancode == SDL_SCANCODE_ESCAPE) else if (eventHandler->key.keysym.scancode == SDL_SCANCODE_ESCAPE)
{ {
section.name = SECTION_PROG_QUIT; section->name = SECTION_PROG_QUIT;
break; break;
} }
@@ -281,6 +279,11 @@ void EnterID::switchPalette()
// Inicializa los servicios online // Inicializa los servicios online
void EnterID::initOnline() void EnterID::initOnline()
{ {
if (options->online.sessionEnabled)
{ // Si ya ha iniciado la sesión, que no continue
return;
}
if (options->online.jailerID == "") if (options->online.jailerID == "")
{ // Jailer ID no definido { // Jailer ID no definido
@@ -289,11 +292,15 @@ void EnterID::initOnline()
else else
{ // Jailer ID iniciado { // Jailer ID iniciado
options->online.enabled = true; options->online.enabled = options->online.sessionEnabled = true;
jscore::init(options->online.server, options->online.port); jscore::init(options->online.server, options->online.port);
const std::string caption = options->online.jailerID + " IS LOGGED IN"; #ifdef DEBUG
screen->showNotification(caption); const std::string caption = "IS LOGGED IN (DEBUG)";
#else
const std::string caption = "IS LOGGED IN";
#endif
screen->showNotification(options->online.jailerID, caption, 12);
if (options->console) if (options->console)
{ {
std::cout << caption << std::endl; std::cout << caption << std::endl;
@@ -305,6 +312,6 @@ void EnterID::initOnline()
void EnterID::endSection() void EnterID::endSection()
{ {
initOnline(); initOnline();
section.name = (section.subsection == SUBSECTION_LOGO_TO_INTRO) ? SECTION_PROG_INTRO : SECTION_PROG_TITLE; section->name = (section->subsection == SUBSECTION_LOGO_TO_INTRO) ? SECTION_PROG_INTRO : SECTION_PROG_TITLE;
section.subsection = 0; section->subsection = 0;
} }

View File

@@ -29,10 +29,10 @@ private:
SDL_Texture *textTexture; // Textura para dibujar el texto SDL_Texture *textTexture; // Textura para dibujar el texto
Text *text; // Objeto para escribir texto en pantalla Text *text; // Objeto para escribir texto en pantalla
Texture *texture; // Textura para la fuente para el texto Texture *texture; // Textura para la fuente para el texto
section_t *section; // Estado del bucle principal para saber si continua o se sale
// Variables // Variables
int counter; // Contador int counter; // Contador
section_t section; // Estado del bucle principal para saber si continua o se sale
Uint32 ticks; // Contador de ticks para ajustar la velocidad del programa Uint32 ticks; // Contador de ticks para ajustar la velocidad del programa
Uint32 ticksSpeed; // Velocidad a la que se repiten los bucles del programa Uint32 ticksSpeed; // Velocidad a la que se repiten los bucles del programa
std::vector<captions_t> texts; // Vector con los textos std::vector<captions_t> texts; // Vector con los textos
@@ -68,13 +68,13 @@ private:
public: public:
// Constructor // Constructor
EnterID(SDL_Renderer *renderer, Screen *screen, Asset *asset, options_t *options, section_t section); EnterID(SDL_Renderer *renderer, Screen *screen, Asset *asset, options_t *options, section_t *section);
// Destructor // Destructor
~EnterID(); ~EnterID();
// Bucle principal // Bucle principal
section_t run(); void run();
}; };
#endif #endif

View File

@@ -2,15 +2,8 @@
#include <iostream> #include <iostream>
// Constructor // Constructor
Game::Game(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, options_t *options, Input *input, Debug *debug) Game::Game(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, options_t *options, Input *input, section_t *section, Debug *debug)
{ {
// Inicia algunas variables
board.iniClock = SDL_GetTicks();
currentRoom = "03.room";
const int x = 25;
const int y = 13;
spawnPoint = {x * 8, y * 8, 0, 0, 0, s_standing, SDL_FLIP_HORIZONTAL};
// Copia los punteros // Copia los punteros
this->resource = resource; this->resource = resource;
this->renderer = renderer; this->renderer = renderer;
@@ -19,15 +12,25 @@ Game::Game(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *as
this->input = input; this->input = input;
this->debug = debug; this->debug = debug;
this->options = options; this->options = options;
this->section = section;
// Inicia algunas variables
board.iniClock = SDL_GetTicks();
#ifdef DEBUG #ifdef DEBUG
currentRoom = "01.room"; currentRoom = "03.room";
const int x1 = 25; const int x = 25;
const int y1 = 13; const int y = 13;
spawnPoint = {x1 * 8, y1 * 8, 0, 0, 0, s_standing, SDL_FLIP_HORIZONTAL}; spawnPoint = {x * 8, y * 8, 0, 0, 0, s_standing, SDL_FLIP_HORIZONTAL};
debug->setEnabled(false);
#else
currentRoom = "03.room";
const int x = 25;
const int y = 13;
spawnPoint = {x * 8, y * 8, 0, 0, 0, s_standing, SDL_FLIP_HORIZONTAL};
#endif #endif
// Crea los objetos // Crea los objetos
cheevos = new Cheevos(screen, options, asset->get("cheevos.bin"));
scoreboard = new ScoreBoard(renderer, resource, asset, options, &board); scoreboard = new ScoreBoard(renderer, resource, asset, options, &board);
itemTracker = new ItemTracker(); itemTracker = new ItemTracker();
roomTracker = new RoomTracker(); roomTracker = new RoomTracker();
@@ -42,12 +45,31 @@ Game::Game(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *as
deathSound = JA_LoadSound(asset->get("death.wav").c_str()); deathSound = JA_LoadSound(asset->get("death.wav").c_str());
stats = new Stats(asset->get("stats.csv"), asset->get("stats_buffer.csv"), options); stats = new Stats(asset->get("stats.csv"), asset->get("stats_buffer.csv"), options);
// Crea la textura para poner el nombre de la habitación
roomNameTexture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, GAMECANVAS_WIDTH, text->getCharacterSize() * 2);
if (roomNameTexture == nullptr)
{
if (options->console)
{
std::cout << "Error: roomNameTexture could not be created!\nSDL Error: " << SDL_GetError() << std::endl;
}
}
// Establece el blend mode de la textura
SDL_SetTextureBlendMode(roomNameTexture, SDL_BLENDMODE_BLEND);
// Establece el destino de la textura
roomNameRect = {0, PLAY_AREA_HEIGHT, GAMECANVAS_WIDTH, text->getCharacterSize() * 2};
// Pone el nombre de la habitación en la textura
fillRoomNameTexture();
// Inicializa el resto de variables // Inicializa el resto de variables
ticks = 0; ticks = 0;
ticksSpeed = 15; ticksSpeed = 15;
board.lives = 9; board.lives = 9;
#ifdef DEBUG #ifdef DEBUG
board.lives = 0; board.lives = 9;
#endif #endif
board.items = 0; board.items = 0;
board.rooms = 1; board.rooms = 1;
@@ -61,14 +83,17 @@ Game::Game(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *as
totalItems = getTotalItems(); totalItems = getTotalItems();
initStats(); initStats();
stats->addVisit(room->getName()); stats->addVisit(room->getName());
const bool cheats = options->cheat.infiniteLives || options->cheat.invincible || options->cheat.jailEnabled;
cheevos->enable(!cheats); // Deshabilita los logros si hay trucos activados
section.name = SECTION_PROG_GAME; section->name = SECTION_PROG_GAME;
section.subsection = 0; section->subsection = 0;
} }
Game::~Game() Game::~Game()
{ {
// Libera la memoria de los objetos // Libera la memoria de los objetos
delete cheevos;
delete scoreboard; delete scoreboard;
delete itemTracker; delete itemTracker;
delete roomTracker; delete roomTracker;
@@ -78,6 +103,8 @@ Game::~Game()
delete text; delete text;
delete stats; delete stats;
SDL_DestroyTexture(roomNameTexture);
JA_DeleteMusic(music); JA_DeleteMusic(music);
JA_DeleteSound(deathSound); JA_DeleteSound(deathSound);
} }
@@ -91,7 +118,7 @@ void Game::checkEventHandler()
// Evento de salida de la aplicación // Evento de salida de la aplicación
if (eventHandler->type == SDL_QUIT) if (eventHandler->type == SDL_QUIT)
{ {
section.name = SECTION_PROG_QUIT; section->name = SECTION_PROG_QUIT;
screen->setBorderColor(stringToColor(options->palette, "black")); screen->setBorderColor(stringToColor(options->palette, "black"));
break; break;
} }
@@ -101,13 +128,10 @@ void Game::checkEventHandler()
reLoadTextures(); reLoadTextures();
} }
if ((eventHandler->type == SDL_KEYDOWN) and (eventHandler->key.repeat == 0)) if (eventHandler->type == SDL_KEYDOWN && eventHandler->key.repeat == 0)
{ {
switch (eventHandler->key.keysym.scancode) switch (eventHandler->key.keysym.scancode)
{ {
case SDL_SCANCODE_ESCAPE:
section.name = SECTION_PROG_TITLE;
break;
#ifdef DEBUG #ifdef DEBUG
case SDL_SCANCODE_G: case SDL_SCANCODE_G:
debug->switchEnabled(); debug->switchEnabled();
@@ -137,53 +161,21 @@ void Game::checkEventHandler()
break; break;
case SDL_SCANCODE_F6: case SDL_SCANCODE_F6:
screen->showNotification("MAMA MIRA! SIN MANOS!"); screen->showNotification("ACHIEVEMENT UNLOCKED!", "I LIKE MY MULTICOLOURED FRIENDS", 2);
break;
case SDL_SCANCODE_F7:
screen->showNotification("ACHIEVEMENT UNLOCKED!", "I LIKE MY MULTICOLOURED FRIENDS", 3);
break;
case SDL_SCANCODE_F8:
screen->showNotification("JAILDESIGNER IS LOGGED IN", "", 4);
break;
case SDL_SCANCODE_F9:
screen->showNotification("JAILDESIGNER IS LOGGED IN", "", 5);
break; break;
#endif #endif
case SDL_SCANCODE_M:
board.music = !board.music;
board.music ? JA_ResumeMusic() : JA_PauseMusic();
break;
case SDL_SCANCODE_P:
switchPause();
break;
case SDL_SCANCODE_B:
screen->switchBorder();
reLoadTextures();
break;
case SDL_SCANCODE_F:
screen->switchVideoMode();
reLoadTextures();
break;
case SDL_SCANCODE_F1:
screen->setWindowSize(1);
reLoadTextures();
break;
case SDL_SCANCODE_F2:
screen->setWindowSize(2);
reLoadTextures();
break;
case SDL_SCANCODE_F3:
screen->setWindowSize(3);
reLoadTextures();
break;
case SDL_SCANCODE_F4:
screen->setWindowSize(4);
reLoadTextures();
break;
case SDL_SCANCODE_F5:
switchPalette();
break;
default: default:
break; break;
} }
@@ -191,8 +183,57 @@ void Game::checkEventHandler()
} }
} }
// Comprueba el teclado
void Game::checkInput()
{
if (input->checkInput(input_exit, REPEAT_FALSE))
{
section->name = SECTION_PROG_TITLE;
}
else if (input->checkInput(input_switch_music, REPEAT_FALSE))
{
board.music = !board.music;
board.music ? JA_ResumeMusic() : JA_PauseMusic();
}
else if (input->checkInput(input_pause, REPEAT_FALSE))
{
switchPause();
}
else if (input->checkInput(input_toggle_border, REPEAT_FALSE))
{
screen->switchBorder();
reLoadTextures();
}
else if (input->checkInput(input_window_fullscreen, REPEAT_FALSE))
{
screen->switchVideoMode();
reLoadTextures();
}
else if (input->checkInput(input_window_dec_size, REPEAT_FALSE))
{
screen->decWindowSize();
reLoadTextures();
}
else if (input->checkInput(input_window_inc_size, REPEAT_FALSE))
{
screen->incWindowSize();
reLoadTextures();
}
else if (input->checkInput(input_swap_palette, REPEAT_FALSE))
{
switchPalette();
}
}
// Bucle para el juego // Bucle para el juego
section_t Game::run() void Game::run()
{ {
JA_PlayMusic(music); JA_PlayMusic(music);
if (!board.music) if (!board.music)
@@ -200,28 +241,29 @@ section_t Game::run()
JA_PauseMusic(); JA_PauseMusic();
} }
while (section.name == SECTION_PROG_GAME) while (section->name == SECTION_PROG_GAME)
{ {
update(); update();
render(); render();
} }
JA_StopMusic(); JA_StopMusic();
return section;
} }
// Actualiza el juego, las variables, comprueba la entrada, etc. // Actualiza el juego, las variables, comprueba la entrada, etc.
void Game::update() void Game::update()
{ {
// Comprueba los eventos de la cola
checkEventHandler();
// Comprueba que la diferencia de ticks sea mayor a la velocidad del juego // Comprueba que la diferencia de ticks sea mayor a la velocidad del juego
if (SDL_GetTicks() - ticks > ticksSpeed) if (SDL_GetTicks() - ticks > ticksSpeed)
{ {
// Actualiza el contador de ticks // Actualiza el contador de ticks
ticks = SDL_GetTicks(); ticks = SDL_GetTicks();
// Comprueba los eventos de la cola // Comprueba el teclado
checkEventHandler(); checkInput();
#ifdef DEBUG #ifdef DEBUG
debug->clear(); debug->clear();
@@ -237,6 +279,7 @@ void Game::update()
checkGameOver(); checkGameOver();
checkEndGame(); checkEndGame();
checkRestoringJail(); checkRestoringJail();
checkSomeCheevos();
scoreboard->update(); scoreboard->update();
input->update(); input->update();
@@ -256,8 +299,8 @@ void Game::render()
{ {
// Prepara para dibujar el frame // Prepara para dibujar el frame
screen->start(); screen->start();
screen->clean(room->getBGColor());
// Dibuja los elementos del juego en orden
room->renderMap(); room->renderMap();
room->renderEnemies(); room->renderEnemies();
room->renderItems(); room->renderItems();
@@ -317,13 +360,8 @@ void Game::renderDebugInfo()
// Escribe el nombre de la pantalla // Escribe el nombre de la pantalla
void Game::renderRoomName() void Game::renderRoomName()
{ {
// Texto en el centro de la pantalla // Dibuja la textura con el nombre de la habitación
SDL_Rect rect = {0, 16 * BLOCK, PLAY_AREA_WIDTH, BLOCK * 2}; SDL_RenderCopy(renderer, roomNameTexture, nullptr, &roomNameRect);
color_t color = stringToColor(options->palette, "white");
SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, 0xFF);
SDL_RenderFillRect(renderer, &rect);
text->writeDX(TXT_CENTER | TXT_COLOR, GAMECANVAS_CENTER_X, 16 * 8 + 4, room->getName(), 1, room->getBGColor());
} }
// Cambia de habitación // Cambia de habitación
@@ -345,6 +383,9 @@ bool Game::changeRoom(std::string file)
// Crea un objeto habitación nuevo a partir del fichero // Crea un objeto habitación nuevo a partir del fichero
room = new Room(resource->getRoom(file), renderer, screen, asset, options, itemTracker, &board.items, board.jailEnabled, debug); room = new Room(resource->getRoom(file), renderer, screen, asset, options, itemTracker, &board.items, board.jailEnabled, debug);
// Pone el nombre de la habitación en la textura
fillRoomNameTexture();
// Pone el color del marcador en función del color del borde de la habitación // Pone el color del marcador en función del color del borde de la habitación
setScoreBoardColor(); setScoreBoardColor();
@@ -413,7 +454,7 @@ void Game::checkGameOver()
{ {
if (board.lives < 0 && blackScreenCounter > 17) if (board.lives < 0 && blackScreenCounter > 17)
{ {
section.name = SECTION_PROG_GAME_OVER; section->name = SECTION_PROG_GAME_OVER;
} }
} }
@@ -434,6 +475,9 @@ void Game::killPlayer()
// Actualiza las estadisticas // Actualiza las estadisticas
stats->addDeath(room->getName()); stats->addDeath(room->getName());
// Invalida el logro de pasarse el juego sin morir
cheevos->invalidate(11);
// Destruye la habitacion y el jugador // Destruye la habitacion y el jugador
delete room; delete room;
delete this->player; delete this->player;
@@ -539,24 +583,21 @@ void Game::setScoreBoardColor()
// Comprueba si ha finalizado el juego // Comprueba si ha finalizado el juego
bool Game::checkEndGame() bool Game::checkEndGame()
{ {
const bool isOnTheRoom = room->getName() == "THE JAIL"; // Estar en la habitación que toca const bool isOnTheRoom = room->getName() == "THE JAIL"; // Estar en la habitación que toca
const bool haveTheItems = board.items >= int(totalItems * 0.9f); // Con mas del 90% de los items recogidos const bool haveTheItems = board.items >= int(totalItems * 0.9f) || options->cheat.jailEnabled; // Con mas del 90% de los items recogidos
const bool isOnTheDoor = player->getRect().x <= 128; // Y en la ubicación que toca (En la puerta) const bool isOnTheDoor = player->getRect().x <= 128; // Y en la ubicación que toca (En la puerta)
if (haveTheItems) if (haveTheItems)
{ {
board.jailEnabled = true; board.jailEnabled = true;
} }
if (isOnTheRoom && haveTheItems && isOnTheDoor) if (haveTheItems && isOnTheRoom && isOnTheDoor)
{ {
section.name = SECTION_PROG_ENDING; // Comprueba los logros de completar el juego
return true; checkEndGameCheevos();
}
if (options->cheat.jailEnabled && isOnTheRoom && isOnTheDoor) section->name = SECTION_PROG_ENDING;
{
section.name = SECTION_PROG_ENDING;
return true; return true;
} }
@@ -616,12 +657,25 @@ void Game::checkRestoringJail()
} }
static int counter = 0; static int counter = 0;
counter++;
if (!paused)
{
counter++;
}
// Incrementa el numero de vidas
if (counter == 100) if (counter == 100)
{ {
counter = 0; counter = 0;
board.lives++; board.lives++;
JA_PlaySound(deathSound); JA_PlaySound(deathSound);
// Invalida el logro de completar el juego sin entrar a la jail
const bool haveTheItems = board.items >= int(totalItems * 0.9f);
if (!haveTheItems)
{
cheevos->invalidate(9);
}
} }
} }
@@ -637,4 +691,92 @@ void Game::initStats()
} }
stats->init(); stats->init();
}
// Crea la textura con el nombre de la habitación
void Game::fillRoomNameTexture()
{
// Pone la textura como destino de renderizado
SDL_SetRenderTarget(renderer, roomNameTexture);
// Rellena la textura de color
const color_t color = stringToColor(options->palette, "white");
SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, 0xFF);
SDL_RenderClear(renderer);
// Escribe el texto en la textura
text->writeDX(TXT_CENTER | TXT_COLOR, GAMECANVAS_CENTER_X, text->getCharacterSize() / 2, room->getName(), 1, room->getBGColor());
// Deja el renderizador por defecto
SDL_SetRenderTarget(renderer, nullptr);
}
// Comprueba algunos logros
void Game::checkSomeCheevos()
{
// Logros sobre la cantidad de items
if (board.items == totalItems)
{
cheevos->unlock(4);
cheevos->unlock(3);
cheevos->unlock(2);
cheevos->unlock(1);
}
else if (board.items >= totalItems * 0.75f)
{
cheevos->unlock(3);
cheevos->unlock(2);
cheevos->unlock(1);
}
else if (board.items >= totalItems * 0.5f)
{
cheevos->unlock(2);
cheevos->unlock(1);
}
else if (board.items >= totalItems * 0.25f)
{
cheevos->unlock(1);
}
// Logros sobre las habitaciones visitadas
if (board.rooms >= 60)
{
cheevos->unlock(7);
cheevos->unlock(6);
cheevos->unlock(5);
}
else if (board.rooms >= 40)
{
cheevos->unlock(6);
cheevos->unlock(5);
}
else if (board.rooms >= 20)
{
cheevos->unlock(5);
}
}
// Comprueba los logros de completar el juego
void Game::checkEndGameCheevos()
{
// "Complete the game"
cheevos->unlock(8);
// "Complete the game without entering the jail"
cheevos->unlock(9);
// "Complete the game with all items"
if (board.items == totalItems)
{
cheevos->unlock(10);
}
// "Complete the game without dying"
cheevos->unlock(11);
// "Complete the game in under 30 minutes"
if (scoreboard->getMinutes() < 30)
{
cheevos->unlock(12);
}
} }

View File

@@ -1,6 +1,7 @@
#pragma once #pragma once
#include <SDL2/SDL.h> #include <SDL2/SDL.h>
#include "cheevos.h"
#include "common/animatedsprite.h" #include "common/animatedsprite.h"
#include "common/asset.h" #include "common/asset.h"
#include "common/debug.h" #include "common/debug.h"
@@ -26,35 +27,38 @@ class Game
{ {
private: private:
// Objetos y punteros // Objetos y punteros
SDL_Renderer *renderer; // El renderizador de la ventana SDL_Renderer *renderer; // El renderizador de la ventana
SDL_Event *eventHandler; // Manejador de eventos SDL_Event *eventHandler; // Manejador de eventos
Screen *screen; // Objeto encargado de manejar el renderizador Screen *screen; // Objeto encargado de manejar el renderizador
Room *room; // Objeto encargado de gestionar cada habitación del juego Room *room; // Objeto encargado de gestionar cada habitación del juego
Player *player; // Objeto con el jugador Player *player; // Objeto con el jugador
ItemTracker *itemTracker; // Lleva el control de los objetos recogidos ItemTracker *itemTracker; // Lleva el control de los objetos recogidos
RoomTracker *roomTracker; // Lleva el control de las habitaciones visitadas RoomTracker *roomTracker; // Lleva el control de las habitaciones visitadas
Asset *asset; // Objeto con la ruta a todos los ficheros de recursos Asset *asset; // Objeto con la ruta a todos los ficheros de recursos
Input *input; // Objeto pata gestionar la entrada Input *input; // Objeto pata gestionar la entrada
Text *text; // Objeto para los textos del juego Text *text; // Objeto para los textos del juego
ScoreBoard *scoreboard; // Objeto encargado de gestionar el marcador ScoreBoard *scoreboard; // Objeto encargado de gestionar el marcador
Resource *resource; // Objeto con los recursos Cheevos *cheevos; // Objeto encargado de gestionar los logros del juego
Debug *debug; // Objeto para gestionar la información de debug Resource *resource; // Objeto con los recursos
options_t *options; // Puntero a las opciones del juego Debug *debug; // Objeto para gestionar la información de debug
Stats *stats; // Objeto encargado de gestionar las estadísticas options_t *options; // Puntero a las opciones del juego
Stats *stats; // Objeto encargado de gestionar las estadísticas
SDL_Texture *roomNameTexture; // Textura para escribir el nombre de la habitación
section_t *section; // Seccion actual dentro del juego
// Variables // Variables
JA_Music music; // Musica que suena durante el juego JA_Music_t *music; // Musica que suena durante el juego
Uint32 ticks; // Contador de ticks para ajustar la velocidad del programa Uint32 ticks; // Contador de ticks para ajustar la velocidad del programa
Uint32 ticksSpeed; // Velocidad a la que se repiten los bucles del programa Uint32 ticksSpeed; // Velocidad a la que se repiten los bucles del programa
section_t section; // Seccion actual dentro del juego
std::string currentRoom; // Fichero de la habitación actual std::string currentRoom; // Fichero de la habitación actual
playerSpawn_t spawnPoint; // Lugar de la habitación donde aparece el jugador playerSpawn_t spawnPoint; // Lugar de la habitación donde aparece el jugador
JA_Sound deathSound; // Sonido a reproducir cuando muere el jugador JA_Sound_t *deathSound; // Sonido a reproducir cuando muere el jugador
board_t board; // Estructura con los datos del marcador board_t board; // Estructura con los datos del marcador
bool paused; // Indica si el juego se encuentra en pausa bool paused; // Indica si el juego se encuentra en pausa
bool blackScreen; // Indica si la pantalla está en negro. Se utiliza para la muerte del jugador bool blackScreen; // Indica si la pantalla está en negro. Se utiliza para la muerte del jugador
int blackScreenCounter; // Contador para temporizar la pantalla en negro int blackScreenCounter; // Contador para temporizar la pantalla en negro
int totalItems; // Cantidad total de items que hay en el mapeado del juego int totalItems; // Cantidad total de items que hay en el mapeado del juego
SDL_Rect roomNameRect; // Rectangulo donde pintar la textura con el nombre de la habitación
// Actualiza el juego, las variables, comprueba la entrada, etc. // Actualiza el juego, las variables, comprueba la entrada, etc.
void update(); void update();
@@ -79,6 +83,9 @@ private:
// Cambia de habitación // Cambia de habitación
bool changeRoom(std::string file); bool changeRoom(std::string file);
// Comprueba el teclado
void checkInput();
// Comprueba si el jugador esta en el borde de la pantalla y actua // Comprueba si el jugador esta en el borde de la pantalla y actua
void checkPlayerOnBorder(); void checkPlayerOnBorder();
@@ -133,15 +140,24 @@ private:
// Inicializa el diccionario de las estadísticas // Inicializa el diccionario de las estadísticas
void initStats(); void initStats();
// Pone el nombre de la habitación en la textura
void fillRoomNameTexture();
// Comprueba algunos logros
void checkSomeCheevos();
// Comprueba los logros de completar el juego
void checkEndGameCheevos();
public: public:
// Constructor // Constructor
Game(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, options_t *options, Input *input, Debug *debug); Game(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, options_t *options, Input *input, section_t *section, Debug *debug);
// Destructor // Destructor
~Game(); ~Game();
// Bucle para el juego // Bucle para el juego
section_t run(); void run();
}; };
#endif #endif

View File

@@ -1,14 +1,16 @@
#include "game_over.h" #include "game_over.h"
// Constructor // Constructor
GameOver::GameOver(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, options_t *options) GameOver::GameOver(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, Input *input, options_t *options, section_t *section)
{ {
// Copia los punteros // Copia los punteros
this->renderer = renderer; this->renderer = renderer;
this->screen = screen; this->screen = screen;
this->resource = resource; this->resource = resource;
this->asset = asset; this->asset = asset;
this->input = input;
this->options = options; this->options = options;
this->section = section;
// Reserva memoria para los punteros a objetos // Reserva memoria para los punteros a objetos
eventHandler = new SDL_Event(); eventHandler = new SDL_Event();
@@ -20,8 +22,8 @@ GameOver::GameOver(SDL_Renderer *renderer, Screen *screen, Resource *resource, A
// Inicializa variables // Inicializa variables
preCounter = 0; preCounter = 0;
counter = 0; counter = 0;
section.name = SECTION_PROG_GAME_OVER; section->name = SECTION_PROG_GAME_OVER;
section.subsection = 0; section->subsection = 0;
ticks = 0; ticks = 0;
ticksSpeed = 15; ticksSpeed = 15;
endSection = 400; endSection = 400;
@@ -55,14 +57,17 @@ GameOver::~GameOver()
// Actualiza el objeto // Actualiza el objeto
void GameOver::update() void GameOver::update()
{ {
// Comprueba el manejador de eventos
checkEventHandler();
// Comprueba que la diferencia de ticks sea mayor a la velocidad del juego // Comprueba que la diferencia de ticks sea mayor a la velocidad del juego
if (SDL_GetTicks() - ticks > ticksSpeed) if (SDL_GetTicks() - ticks > ticksSpeed)
{ {
// Actualiza el contador de ticks // Actualiza el contador de ticks
ticks = SDL_GetTicks(); ticks = SDL_GetTicks();
// Comprueba el manejador de eventos // Comprueba las entradas
checkEventHandler(); checkInput();
// Actualiza el color usado para renderizar los textos e imagenes // Actualiza el color usado para renderizar los textos e imagenes
updateColor(); updateColor();
@@ -83,7 +88,7 @@ void GameOver::update()
void GameOver::render() void GameOver::render()
{ {
const int y = 32; const int y = 32;
// Prepara para empezar a dibujar en la textura de juego // Prepara para empezar a dibujar en la textura de juego
screen->start(); screen->start();
@@ -121,71 +126,56 @@ void GameOver::checkEventHandler()
// Evento de salida de la aplicación // Evento de salida de la aplicación
if (eventHandler->type == SDL_QUIT) if (eventHandler->type == SDL_QUIT)
{ {
section.name = SECTION_PROG_QUIT; section->name = SECTION_PROG_QUIT;
section.subsection = 0; section->subsection = 0;
break; break;
} }
// Comprueba las teclas que se han pulsado
if ((eventHandler->type == SDL_KEYDOWN && eventHandler->key.repeat == 0) || (eventHandler->type == SDL_JOYBUTTONDOWN))
{
switch (eventHandler->key.keysym.scancode)
{
case SDL_SCANCODE_ESCAPE:
section.name = SECTION_PROG_QUIT;
break;
case SDL_SCANCODE_B:
screen->switchBorder();
resource->reLoadTextures();
break;
case SDL_SCANCODE_F:
screen->switchVideoMode();
resource->reLoadTextures();
break;
case SDL_SCANCODE_F1:
screen->setWindowSize(1);
resource->reLoadTextures();
break;
case SDL_SCANCODE_F2:
screen->setWindowSize(2);
resource->reLoadTextures();
break;
case SDL_SCANCODE_F3:
screen->setWindowSize(3);
resource->reLoadTextures();
break;
case SDL_SCANCODE_F4:
screen->setWindowSize(4);
resource->reLoadTextures();
break;
case SDL_SCANCODE_F5:
switchPalette();
break;
default:
break;
}
}
} }
} }
// Bucle principal // Comprueba las entradas
section_t GameOver::run() void GameOver::checkInput()
{ {
while (section.name == SECTION_PROG_GAME_OVER)
if (input->checkInput(input_exit, REPEAT_FALSE))
{
section->name = SECTION_PROG_QUIT;
}
else if (input->checkInput(input_toggle_border, REPEAT_FALSE))
{
screen->switchBorder();
}
else if (input->checkInput(input_window_fullscreen, REPEAT_FALSE))
{
screen->switchVideoMode();
}
else if (input->checkInput(input_window_dec_size, REPEAT_FALSE))
{
screen->decWindowSize();
}
else if (input->checkInput(input_window_inc_size, REPEAT_FALSE))
{
screen->incWindowSize();
}
else if (input->checkInput(input_swap_palette, REPEAT_FALSE))
{
switchPalette();
}
}
// Bucle principal
void GameOver::run()
{
while (section->name == SECTION_PROG_GAME_OVER)
{ {
update(); update();
render(); render();
} }
return section;
} }
// Actualiza el color usado para renderizar los textos e imagenes // Actualiza el color usado para renderizar los textos e imagenes
@@ -195,16 +185,15 @@ void GameOver::updateColor()
if (counter < half) if (counter < half)
{ {
// const float step = std::min(std::max(counter, iniFade) - iniFade, fadeLenght) / (float)fadeLenght;
const float step = std::min(counter, fadeLenght) / (float)fadeLenght; const float step = std::min(counter, fadeLenght) / (float)fadeLenght;
const int index = (colors.size() - 1) - int((colors.size() - 1) * step); const int index = (colors.size() - 1) - int((colors.size() - 1) * step);
color = colors.at(index); color = colors[index];
} }
else else
{ {
const float step = std::min(std::max(counter, iniFade) - iniFade, fadeLenght) / (float)fadeLenght; const float step = std::min(std::max(counter, iniFade) - iniFade, fadeLenght) / (float)fadeLenght;
const int index = (colors.size() - 1) * step; const int index = (colors.size() - 1) * step;
color = colors.at(index); color = colors[index];
} }
} }
@@ -240,8 +229,8 @@ void GameOver::updateCounters()
// Comprueba si ha terminado la sección // Comprueba si ha terminado la sección
else if (counter == endSection) else if (counter == endSection)
{ {
section.name = SECTION_PROG_LOGO; section->name = SECTION_PROG_LOGO;
section.subsection = SUBSECTION_LOGO_TO_TITLE; section->subsection = SUBSECTION_LOGO_TO_TITLE;
} }
} }

View File

@@ -2,6 +2,7 @@
#include <SDL2/SDL.h> #include <SDL2/SDL.h>
#include "common/animatedsprite.h" #include "common/animatedsprite.h"
#include "common/asset.h" #include "common/asset.h"
#include "common/input.h"
#include "common/jail_audio.h" #include "common/jail_audio.h"
#include "common/resource.h" #include "common/resource.h"
#include "common/screen.h" #include "common/screen.h"
@@ -23,16 +24,17 @@ private:
Screen *screen; // Objeto encargado de dibujar en pantalla Screen *screen; // Objeto encargado de dibujar en pantalla
Resource *resource; // Objeto con los recursos Resource *resource; // Objeto con los recursos
Asset *asset; // Objeto con los ficheros de recursos Asset *asset; // Objeto con los ficheros de recursos
Input *input; // Objeto pata gestionar la entrada
options_t *options; // Puntero a las opciones del juego options_t *options; // Puntero a las opciones del juego
SDL_Event *eventHandler; // Manejador de eventos SDL_Event *eventHandler; // Manejador de eventos
Text *text; // Objeto para escribir texto en pantalla Text *text; // Objeto para escribir texto en pantalla
AnimatedSprite *playerSprite; // Sprite con el jugador AnimatedSprite *playerSprite; // Sprite con el jugador
AnimatedSprite *tvSprite; // Sprite con el televisor AnimatedSprite *tvSprite; // Sprite con el televisor
section_t *section; // Estado del bucle principal para saber si continua o se sale
// Variables // Variables
int preCounter; // Contador previo int preCounter; // Contador previo
int counter; // Contador int counter; // Contador
section_t section; // Estado del bucle principal para saber si continua o se sale
Uint32 ticks; // Contador de ticks para ajustar la velocidad del programa Uint32 ticks; // Contador de ticks para ajustar la velocidad del programa
Uint32 ticksSpeed; // Velocidad a la que se repiten los bucles del programa Uint32 ticksSpeed; // Velocidad a la que se repiten los bucles del programa
std::vector<color_t> colors; // Vector con los colores para el fade std::vector<color_t> colors; // Vector con los colores para el fade
@@ -40,7 +42,7 @@ private:
int endSection; // Contador: cuando acaba la sección int endSection; // Contador: cuando acaba la sección
int iniFade; // Contador: cuando emiepza el fade int iniFade; // Contador: cuando emiepza el fade
int fadeLenght; // Contador: duración del fade int fadeLenght; // Contador: duración del fade
JA_Music music; // Musica que suena durante el juego JA_Music_t *music; // Musica que suena durante el juego
// Actualiza el objeto // Actualiza el objeto
void update(); void update();
@@ -51,6 +53,9 @@ private:
// Comprueba el manejador de eventos // Comprueba el manejador de eventos
void checkEventHandler(); void checkEventHandler();
// Comprueba las entradas
void checkInput();
// Actualiza el color usado para renderizar los textos e imagenes // Actualiza el color usado para renderizar los textos e imagenes
void updateColor(); void updateColor();
@@ -65,13 +70,13 @@ private:
public: public:
// Constructor // Constructor
GameOver(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, options_t *options); GameOver(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, Input *input, options_t *options, section_t *section);
// Destructor // Destructor
~GameOver(); ~GameOver();
// Bucle principal // Bucle principal
section_t run(); void run();
}; };
#endif #endif

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