100 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
ba19dcb904 Actualizar 'README.md' 2022-11-23 22:37:02 +01:00
b035b92ff4 Retocada ROAD TO THE JAIL 2022-11-23 22:32:57 +01:00
8c425f5698 Fix: De enter_id iba siempre a intro 2022-11-23 22:22:32 +01:00
d382bb6403 Optimizado el calculo del tamaño de las notificaciones 2022-11-23 20:53:01 +01:00
da64a5e082 Oculta el ratón en el modo a pantalla completa 2022-11-23 20:38:21 +01:00
7070dac482 Arreglado tamaño de las notificaciones en pantalla completa 2022-11-23 20:33:54 +01:00
ea5360ea74 Trabajando en las notificaciones 2022-11-23 20:14:53 +01:00
3aa4440390 Trabajando en las notificaciones 2022-11-23 20:05:07 +01:00
ce105e252e Trabajando en el tamaño de las notificaciones 2022-11-23 19:52:10 +01:00
1aac5b7719 Trabajando en las notificaciones 2022-11-23 18:20:29 +01:00
a8b467290f Completado el ciclo para pedir el ID online. Añadido sonido a las notificaciones. Agregado control de versión del fichero de configuración 2022-11-23 16:59:40 +01:00
706ad6f9c0 Trabajando en el escalado de las notificaciones 2022-11-23 14:11:47 +01:00
54d428ed96 Ya permite establecer el online ID desde el propio juego 2022-11-23 13:29:35 +01:00
c71adfbac4 Trabajando en la sección EnterID 2022-11-23 09:54:08 +01:00
c955543d31 Merge branch 'master' of https://gitea.sustancia.synology.me/JailDesigner/jaildoctors_dilemma 2022-11-22 16:44:27 +01:00
fae8e2d82c Actualizado Makefile 2022-11-22 16:44:23 +01:00
ff7b825cbb Actualizar 'README.md' 2022-11-22 16:39:39 +01:00
09ed0105e9 Cambiada la ubicación del fichero config.txt a la carpeta de sistema 2022-11-22 16:26:58 +01:00
07ae93fd3a Actualizado Makefile 2022-11-22 14:11:17 +01:00
72fb30b927 Actualizado Makefile 2022-11-22 13:59:41 +01:00
8d37f31a08 Cambiada una frase de castellano a ingles en el fichero de estadisticas 2022-11-22 13:35:15 +01:00
e6fb412c4d Fix: La pantalla de Game Over no mostraba Tu peor pesadilla 2022-11-22 13:34:33 +01:00
10c29eb547 Actualizado Makefile 2022-11-22 13:20:13 +01:00
1f9e36dc93 Actualizado info.plist 2022-11-22 13:07:12 +01:00
c114884de1 FIx: El logo se formaba mal despues de haber toqueteado cosas de la clase Sprite 2022-11-22 13:05:34 +01:00
d6a366555d Actualizado Makefile 2022-11-22 12:53:56 +01:00
fd0d8a05fe Actualizado Makefile 2022-11-22 12:45:47 +01:00
79d610a7d9 Actualizado Makefile 2022-11-22 12:42:25 +01:00
9060e1c92a Añadida carpeta de sistema para el modo debug 2022-11-22 12:38:09 +01:00
0d586c0827 Ya funcionan las estadísticas online 2022-11-22 10:42:30 +01:00
fd0bebf533 Trabajando en las estadisticas online 2022-11-18 20:06:07 +01:00
2665b93b70 Añadida Tu peor pesadilla a la pantalla de Game Over 2022-11-18 16:07:33 +01:00
c35be7d21c Empezado a escribir datos de estadisticas en el servidor 2022-11-19 12:07:36 +01:00
bc84968b23 Ya funcionan las notificaciones 2022-11-19 10:28:15 +01:00
122 changed files with 3357 additions and 1644 deletions

2
.gitignore vendored
View File

@@ -1,5 +1,5 @@
.vscode .vscode
*config.txt *data/config/config.txt
*stats.txt *stats.txt
*.DS_Store *.DS_Store
thumbs.db thumbs.db

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.05 version = v1.08
# Release names # Release names
windowsRelease = $(executable)-$(version)-win32-x64.zip windowsRelease = $(executable)-$(version)-win32-x64.zip
@@ -12,31 +12,30 @@ linuxRelease = $(executable)-$(version)-linux.tar.gz
windows: windows:
@echo off @echo off
g++ $(source) -D DEBUG -std=c++11 -Wall -Os -lmingw32 -lws2_32 -lSDL2main -lSDL2 -ffunction-sections -fdata-sections -Wl,--gc-sections -static-libstdc++ -Wl,-subsystem,windows -o $(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 "$(executable).exe"
strip -s -R .comment -R .gnu.version $(executable).exe --strip-unneeded strip -s -R .comment -R .gnu.version "$(executable).exe" --strip-unneeded
windows_debug:
@echo off
g++ $(source) -D DEBUG -std=c++11 -Wall -Os -lmingw32 -lws2_32 -lSDL2main -lSDL2 -ffunction-sections -fdata-sections -Wl,--gc-sections -static-libstdc++ -Wl,-subsystem,windows -o "$(executable)_debug.exe"
strip -s -R .comment -R .gnu.version "$(executable)_debug.exe" --strip-unneeded
windows_release: windows_release:
@echo off @echo off
# Remove data # Create release folder
powershell if (Test-Path $(releaseFolder)) {Remove-Item $(releaseFolder) -Recurse -Force} powershell if (Test-Path "$(releaseFolder)") {Remove-Item "$(releaseFolder)" -Recurse -Force}
powershell if (-not (Test-Path "$(releaseFolder)")) {New-Item "$(releaseFolder)" -ItemType Directory}
# Create folders # Prepare data folder
powershell if (-not (Test-Path $(releaseFolder))) {New-Item $(releaseFolder) -ItemType Directory}
# Copy data
powershell Copy-Item -Path "data" -Destination "$(releaseFolder)" -recurse -Force powershell Copy-Item -Path "data" -Destination "$(releaseFolder)" -recurse -Force
powershell Copy-Item "LICENSE" -Destination "$(releaseFolder)"
powershell Copy-Item "README.md" -Destination "$(releaseFolder)"
powershell Copy-Item "release/SDL2.dll" -Destination "$(releaseFolder)"
# Remove data
powershell if (Test-Path "$(releaseFolder)\data\room\map.world") {Remove-Item "$(releaseFolder)\data\room\map.world" -Recurse -Force} powershell if (Test-Path "$(releaseFolder)\data\room\map.world") {Remove-Item "$(releaseFolder)\data\room\map.world" -Recurse -Force}
powershell if (Test-Path "$(releaseFolder)\data\room\standard.tsx") {Remove-Item "$(releaseFolder)\data\room\standard.tsx" -Recurse -Force} powershell if (Test-Path "$(releaseFolder)\data\room\standard.tsx") {Remove-Item "$(releaseFolder)\data\room\standard.tsx" -Recurse -Force}
powershell if (Test-Path "$(releaseFolder)\data\config") {Remove-Item "$(releaseFolder)\data\config" -Recurse -Force}
# Copy root files
# Create data powershell Copy-Item "LICENSE.txt" -Destination "$(releaseFolder)"
powershell if (-not (Test-Path "$(releaseFolder)\data\config")) {New-Item "$(releaseFolder)\data\config" -ItemType Directory} powershell Copy-Item "README.md" -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"
@@ -47,13 +46,16 @@ windows_release:
powershell Compress-Archive -Path "$(releaseFolder)"/* -DestinationPath $(windowsRelease) powershell Compress-Archive -Path "$(releaseFolder)"/* -DestinationPath $(windowsRelease)
# Remove folder # Remove folder
powershell if (Test-Path $(releaseFolder)) {Remove-Item $(releaseFolder) -Recurse -Force} powershell if (Test-Path "$(releaseFolder)") {Remove-Item "$(releaseFolder)" -Recurse -Force}
macos: macos:
clang++ $(source) -D DEBUG -std=c++11 -Wall -Os -lSDL2 -ffunction-sections -fdata-sections -o $(executable)_macos clang++ $(source) -std=c++11 -Wall -Os -lSDL2 -ffunction-sections -fdata-sections -o "$(executable)"
macos_debug:
clang++ $(source) -D DEBUG -std=c++11 -Wall -Os -lSDL2 -ffunction-sections -fdata-sections -o "$(executable)_debug"
macos_release: macos_release:
# Remove data and possible data # Remove data and possible data from previous builds
rm -rdf "$(releaseFolder)" rm -rdf "$(releaseFolder)"
rm -rdf Frameworks rm -rdf Frameworks
rm -f tmp.dmg rm -f tmp.dmg
@@ -74,17 +76,16 @@ macos_release:
# Delete data # Delete data
rm -f "$(releaseFolder)/$(appName).app/Contents/Resources/data/room/map.world" rm -f "$(releaseFolder)/$(appName).app/Contents/Resources/data/room/map.world"
rm -f "$(releaseFolder)/$(appName).app/Contents/Resources/data/room/standard.tsx" rm -f "$(releaseFolder)/$(appName).app/Contents/Resources/data/room/standard.tsx"
rm -rdf "$(releaseFolder)/$(appName).app/Contents/Resources/data/config"
# Create folders
mkdir -p "$(releaseFolder)/$(appName).app/Contents/Resources/data/config"
# 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
@@ -106,36 +107,36 @@ macos_release:
rm -rdf "$(releaseFolder)" rm -rdf "$(releaseFolder)"
linux: linux:
g++ $(source) -D DEBUG -std=c++11 -Wall -Os -lSDL2 -ffunction-sections -fdata-sections -Wl,--gc-sections -o $(executable)_linux g++ $(source) -std=c++11 -Wall -Os -lSDL2 -ffunction-sections -fdata-sections -Wl,--gc-sections -o "$(executable)"
strip -s -R .comment -R .gnu.version $(executable)_linux --strip-unneeded strip -s -R .comment -R .gnu.version "$(executable)" --strip-unneeded
linux_debug:
g++ $(source) -D DEBUG -std=c++11 -Wall -Os -lSDL2 -ffunction-sections -fdata-sections -Wl,--gc-sections -o "$(executable)_debug"
strip -s -R .comment -R .gnu.version "$(executable)_debug" --strip-unneeded
linux_release: linux_release:
# Remove data # Remove data
rm -rdf $(releaseFolder) rm -rdf "$(releaseFolder)"
# Create folders # Create folders
mkdir -p $(releaseFolder) mkdir -p "$(releaseFolder)"
# 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
rm -f "$(releaseFolder)/data/room/map.world" rm -f "$(releaseFolder)/data/room/map.world"
rm -f "$(releaseFolder)/data/room/standard.tsx" rm -f "$(releaseFolder)/data/room/standard.tsx"
rm -rdf "$(releaseFolder)/data/config"
# Create folders
mkdir -p "$(releaseFolder)/data/config"
# Build # Build
g++ $(source) -std=c++11 -Wall -Os -lSDL2 -ffunction-sections -fdata-sections -Wl,--gc-sections -o $(releaseFolder)/$(executable) g++ $(source) -std=c++11 -Wall -Os -lSDL2 -ffunction-sections -fdata-sections -Wl,--gc-sections -o "$(releaseFolder)/$(executable)"
strip -s -R .comment -R .gnu.version $(releaseFolder)/$(executable) --strip-unneeded strip -s -R .comment -R .gnu.version "$(releaseFolder)/$(executable)" --strip-unneeded
# Pack files # Pack files
rm -f $(linuxRelease) rm -f "$(linuxRelease)"
cd $(releaseFolder) && tar -czvf ../$(linuxRelease) * cd "$(releaseFolder)" && tar -czvf "../$(linuxRelease)" *
# Remove data # Remove data
rm -rdf $(releaseFolder) rm -rdf "$(releaseFolder)"

View File

@@ -1,37 +1,87 @@
# JailDoctor's Dilemma # 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.
![JailDoctor's Dilemma - Title screen](https://php.sustancia.synology.me/images/jdd_title.png) ![JailDoctor's Dilemma - Title screen](https://php.sustancia.synology.me/images/jdd_title.png)
JailDoc es un Jailer destacado entre los Jailers. Tiene más proyectos empezados que nadie y es el que más ayuda a que los demas empiecen los suyos. JailDoc es un Jailer destacado entre los Jailers. Tiene más proyectos empezados que nadie y es el que más ayuda a que los demas empiecen los suyos.
Un día, ocurrió algo. Alguien terminó un proyecto. Alguien liberó el *Puzzle Jail Facker*. Algún desaprensivo. Un día, ocurrió algo. Alguien terminó un proyecto. Alguien liberó el *Puzzle Jail Facker*. Algún desaprensivo.
Esto hizo que JailDoc decidiera terminar y entregar uno de sus proyectos, pero, ¿cual? ¿JailBattle? ¿Sigmasuá? ¿Calculín Doom? Menudo dilema. JailDoc se arremangó y decidió finalizar y entregar todos sus proyectos inacabados. ¿Lo logrará? Esto hizo que JailDoc decidiera terminar y entregar uno de sus proyectos, pero, ¿cual? ¿JailBattle? ¿Sigmasuá? ¿Calculín Doom? Menudo dilema. JailDoc se arremangó y decidió finalizar y entregar todos sus proyectos inacabados. ¿Lo logrará?
## Jugabilidad ## Jugabilidad
Ayuda a JailDoc a recuperar las partes de su proyecto que estan desperdigadas por cualquier lugar del Universo Jailer. Hay mas de **150 piezas** desperdigadas por **60 pantallas**. Algunas son un paseo, pero en otras tendras que calcular muy bien tus movimientos si no quieres acabar como un arounder del montón. Ayuda a JailDoc a recuperar las partes de su proyecto que estan desperdigadas por cualquier lugar del Universo Jailer. Hay mas de **150 piezas** desperdigadas por **60 pantallas**. Algunas son un paseo, pero en otras tendras que calcular muy bien tus movimientos si no quieres acabar como un arounder del montón.
![JailDoctor's Dilemma - Gameplay](https://php.sustancia.synology.me/images/jdd_game1.png) ![JailDoctor's Dilemma - Gameplay](https://php.sustancia.synology.me/images/jdd_game1.png)
Cuando consigas recuperar gran parte de las piezas desperdigadas, dirigete a la Jail a mostrar a los Jailers como se termina un proyecto. Ten en cuenta que Bry no te dejará entrar. Solo aquellos que han realizado un *Fire Effect* o un *Facedor de Tornejos* son dignos de tal privilegio. Cuando consigas recuperar gran parte de las piezas desperdigadas, dirigete a la Jail a mostrar a los Jailers como se termina un proyecto. Ten en cuenta que Bry no te dejará entrar. Solo aquellos que han realizado un *Fire Effect* o un *Facedor de Tornejos* son dignos de tal privilegio.
## Controles ## Controles
El juego permite tanto el uso del teclado como de un mando de control. Las teclas para manejar el juego son las siguientes: El juego permite tanto el uso del teclado como de un mando de control. Las teclas para manejar el juego son las siguientes:
- **Cursores**: Para mover a izquierda o derecha a JailDoc y para saltar
- **Tecla M**: Activa o desactiva la música
- **Tecla P**: Pone en pausa el juego - **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 ESC**: Sale del juego si estas jugando. Sale del programa en cualquier otra circunstancia
- **Tecla F**: Cambia a modo de pantalla completa o de ventana - **Tecla M**: Activa o desactiva la música
- **Teclas F1 a F4**: Cambian el tamaño de la ventana
- **Tecla B**: Activa o desactiva el borde de colores de la pantalla cuando el programa se ejecuta en modo de ventana - **Tecla P**: Pone en pausa el juego
- **Tecla ESC**: Sale del juego si estas jugando. Sale del programa en cualquier otra circunstancia
- **Tecla F**: Cambia a modo de pantalla completa o de ventana
- **Teclas F1 a F4**: Cambian el tamaño de la ventana
- **Tecla B**: Activa o desactiva el borde de colores de la pantalla cuando el programa se ejecuta en modo de ventana
![JailDoctor's Dilemma - Gameplay](https://php.sustancia.synology.me/images/jdd_game2.png) ![JailDoctor's Dilemma - Gameplay](https://php.sustancia.synology.me/images/jdd_game2.png)
## Datos del programa
El programa guarda automáticamente la configuración del modo de video y las estadísticas de juego en tu carpeta personal del sistema. Esta carpeta tiene una ubicación distinta en función del sistema operativo que utilices.
En **Windows** se encuentra en:
`C:\Users\<nombre_de_usuario>\AppData\Roaming\jaildoctors_dilemma`
En **MacOS** se encuentra en:
`~/Library/Application Support/jaildoctors_dilemma`
En **Linux** se encuentra en:
`~/.jaildoctors_dilemma`
La primera vez, el juego te pregunta por tu identificador online. Esta información se guarda para futuras partidas.
En la carpeta está el fichero de configuración `config.txt` donde se puede modificar la configuración para conectarse al servicio online y los ficheros `stats.csv` y `stats_buffer.csv` con información de las estadisticas de juego.
## Agradecimientos ## Agradecimientos
Agradecimientos como siempre a todos los Jailers por motivarme a hacer el juego y ayudarme en los momentos de duda a la hora de escribir el código. Y, como siempre, en especial a JailDoc por su unidad de Jail_Audio y cualquier otro código/ayuda/enseñanzas que haya necesitado para terminar el programa. Agradecimientos como siempre a todos los Jailers por motivarme a hacer el juego y ayudarme en los momentos de duda a la hora de escribir el código. Y, como siempre, en especial a JailDoc por su unidad de Jail_Audio y cualquier otro código/ayuda/enseñanzas que haya necesitado para terminar el programa.
Si no me he descontado, este es el cuarto juego que consigo crear. Si no me he descontado, este es el cuarto juego que consigo crear.
*13 de noviembre de 2022, JailDesigner* *13 de noviembre de 2022, JailDesigner*

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,513,190,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

BIN
data/sound/notify.wav Normal file

Binary file not shown.

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.0</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.

242
source/cheevos.cpp Normal file
View File

@@ -0,0 +1,242 @@
#include "cheevos.h"
#include <iostream>
// Constructor
Cheevos::Cheevos(Screen *screen, options_t *options, std::string file)
{
// Copia la dirección de los objetos
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
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;
}
}
}

62
source/cheevos.h Normal file
View File

@@ -0,0 +1,62 @@
#pragma once
#include <SDL2/SDL.h>
#include "common/screen.h"
#include "common/utils.h"
#include <string>
#include <vector>
#ifndef 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
{
private:
// Punteros y objetos
Screen *screen; // Objeto encargado de dibujar en pantalla
options_t *options; // Puntero a las opciones del juego
// 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:
// Constructor
Cheevos(Screen *screen, options_t *options, std::string file);
// Destructor
~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

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,24 +4,29 @@
#include <iostream> #include <iostream>
// Constructor // Constructor
Notify::Notify(SDL_Renderer *renderer, std::string bitmapFile, std::string textFile) 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);
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);
for (auto notification : notifications) for (auto notification : notifications)
{ {
@@ -35,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();
} }
} }
@@ -44,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();
@@ -97,57 +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});
// Crea el sprite // 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);
// 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);
//std::cout << "Notification " << notifications.size() << std::endl; // Reproduce el sonido de la notificación
//std::cout << "width " << width << std::endl; if (options->notifications.sound)
//std::cout << "height " << height << std::endl; {
//std::cout << "offset " << offset << std::endl; JA_PlaySound(sound);
//std::cout << "desp " << despH << std::endl; }
} }
// Indica si hay notificaciones activas // Indica si hay notificaciones activas
@@ -157,6 +262,6 @@ bool Notify::active()
{ {
return true; return true;
} }
return false; return false;
} }

View File

@@ -1,9 +1,10 @@
#pragma once #pragma once
#include <SDL2/SDL.h> #include <SDL2/SDL.h>
#include "jail_audio.h"
#include "sprite.h"
#include "text.h" #include "text.h"
#include "texture.h" #include "texture.h"
#include "sprite.h"
#include "utils.h" #include "utils.h"
#include <vector> #include <vector>
@@ -35,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;
@@ -48,13 +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_t *sound; // Sonido a reproducir cuando suena la notificación
// Elimina las notificaciones finalizadas // Elimina las notificaciones finalizadas
void clearFinishedNotifications(); void clearFinishedNotifications();
@@ -67,13 +72,13 @@ public:
void update(); void update();
// Constructor // Constructor
Notify(SDL_Renderer *renderer, std::string bitmapFile, std::string textFile); 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,14 @@ 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")); 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;
notificationLogicalHeight = gameCanvasHeight;
iniFade(); iniFade();
iniSpectrumFade(); iniSpectrumFade();
@@ -29,7 +31,10 @@ Screen::Screen(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, options
gameCanvas = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, gameCanvasWidth, gameCanvasHeight); gameCanvas = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, gameCanvasWidth, gameCanvasHeight);
if (gameCanvas == nullptr) if (gameCanvas == nullptr)
{ {
std::cout << "TitleSurface could not be created!\nSDL Error: " << SDL_GetError() << std::endl; if (options->console)
{
std::cout << "TitleSurface could not be created!\nSDL Error: " << SDL_GetError() << std::endl;
}
} }
// Establece el modo de video // Establece el modo de video
@@ -43,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
@@ -87,6 +93,12 @@ void Screen::setVideoMode(int 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;
@@ -101,14 +113,20 @@ 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
else if (videoMode == SDL_WINDOW_FULLSCREEN_DESKTOP) else if (videoMode == SDL_WINDOW_FULLSCREEN_DESKTOP)
{ {
// Oculta el puntero
SDL_ShowCursor(SDL_DISABLE);
// Obten el alto y el ancho de la ventana // Obten el alto y el ancho de la ventana
SDL_GetWindowSize(window, &windowWidth, &windowHeight); SDL_GetWindowSize(window, &windowWidth, &windowHeight);
@@ -151,13 +169,18 @@ 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
setNotificationSize();
} }
// Camibia entre pantalla completa y ventana // Camibia entre pantalla completa y ventana
@@ -174,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)
{ {
@@ -187,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
@@ -322,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);
} }
@@ -348,20 +393,44 @@ void Screen::updateNotifier()
} }
// Muestra una notificación de texto por pantalla; // Muestra una notificación de texto por pantalla;
void Screen::showText(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
void Screen::renderNotifications() void Screen::renderNotifications()
{ {
//if (!notifyActive) if (!notifyActive)
//{ {
// return; return;
//} }
//SDL_RenderSetLogicalSize(renderer, windowWidth * options->windowSize, windowHeight * options->windowSize); SDL_RenderSetLogicalSize(renderer, notificationLogicalWidth, notificationLogicalHeight);
notify->render(); notify->render();
//SDL_RenderSetLogicalSize(renderer, windowWidth, windowHeight); SDL_RenderSetLogicalSize(renderer, windowWidth, windowHeight);
}
// Establece el tamaño de las notificaciones
void Screen::setNotificationSize()
{
if (options->videoMode == 0)
{
if (options->windowSize == 3)
{
notificationLogicalWidth = (windowWidth * 3) / 2;
notificationLogicalHeight = (windowHeight * 3) / 2;
}
else
{
notificationLogicalWidth = windowWidth * 2;
notificationLogicalHeight = windowHeight * 2;
}
}
if (options->videoMode == SDL_WINDOW_FULLSCREEN_DESKTOP)
{
notificationLogicalWidth = windowWidth / 3;
notificationLogicalHeight = windowHeight / 3;
}
} }

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
@@ -24,15 +25,17 @@ private:
Notify *notify; // Dibuja notificaciones por pantalla Notify *notify; // Dibuja notificaciones por pantalla
// Variables // Variables
int windowWidth; // Ancho de la pantalla o ventana int windowWidth; // Ancho de la pantalla o ventana
int windowHeight; // Alto de la pantalla o ventana int windowHeight; // Alto de la pantalla o ventana
int gameCanvasWidth; // Resolución interna del juego. Es el ancho de la textura donde se dibuja el juego int gameCanvasWidth; // Resolución interna del juego. Es el ancho de la textura donde se dibuja el juego
int gameCanvasHeight; // Resolución interna del juego. Es el alto de la textura donde se dibuja el juego int gameCanvasHeight; // Resolución interna del juego. Es el alto de la textura donde se dibuja el juego
int borderWidth; // Anchura del borde int borderWidth; // Anchura del borde
int borderHeight; // Anltura del borde int borderHeight; // Anltura del borde
SDL_Rect dest; // Coordenadas donde se va a dibujar la textura del juego sobre la pantalla o ventana SDL_Rect dest; // Coordenadas donde se va a dibujar la textura del juego sobre la pantalla o ventana
color_t borderColor; // Color del borde añadido a la textura de juego para rellenar la pantalla color_t borderColor; // Color del borde añadido a la textura de juego para rellenar la pantalla
bool notifyActive; // Indica si hay notificaciones activas bool notifyActive; // Indica si hay notificaciones activas
int notificationLogicalWidth; // Ancho lógico de las notificaciones en relación al tamaño de pantalla
int notificationLogicalHeight; // Alto lógico de las notificaciones en relación al tamaño de pantalla
// Variables - Efectos // Variables - Efectos
bool fade; // Indica si esta activo el efecto de fade bool fade; // Indica si esta activo el efecto de fade
@@ -64,6 +67,9 @@ private:
// Dibuja las notificaciones // Dibuja las notificaciones
void renderNotifications(); void renderNotifications();
// Establece el tamaño de las notificaciones
void setNotificationSize();
public: public:
// Constructor // Constructor
Screen(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, options_t *options); Screen(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, options_t *options);
@@ -89,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);
@@ -96,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);
@@ -126,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 showText(std::string text); void showNotification(std::string text1 = "", std::string text2 = "", int icon = -1);
}; };
#endif #endif

View File

@@ -18,7 +18,7 @@ Sprite::Sprite(int x, int y, int w, int h, Texture *texture, SDL_Renderer *rende
this->texture = texture; this->texture = texture;
// Establece el rectangulo de donde coger la imagen // Establece el rectangulo de donde coger la imagen
spriteClip = {x, y, w, h}; spriteClip = {0, 0, w, h};
// Inicializa variables // Inicializa variables
enabled = true; enabled = true;
@@ -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;
@@ -41,7 +41,7 @@ Sprite::Sprite(SDL_Rect rect, Texture *texture, SDL_Renderer *renderer)
this->texture = texture; this->texture = texture;
// Establece el rectangulo de donde coger la imagen // Establece el rectangulo de donde coger la imagen
spriteClip = {x, y, w, h}; spriteClip = {0, 0, w, h};
// Inicializa variables // Inicializa variables
enabled = true; enabled = true;
@@ -83,8 +83,8 @@ int Sprite::getHeight()
// Establece la posición del objeto // Establece la posición del objeto
void Sprite::setPos(SDL_Rect rect) void Sprite::setPos(SDL_Rect rect)
{ {
x = rect.x; this->x = rect.x;
y = rect.y; this->y = rect.y;
} }
// Establece el valor de la variable // Establece el valor de la variable
@@ -166,6 +166,12 @@ void Sprite::setRenderer(SDL_Renderer *renderer)
this->renderer = renderer; this->renderer = renderer;
} }
// Obten el valor de la variable
SDL_Renderer *Sprite::getRenderer()
{
return renderer;
}
// Establece el valor de la variable // Establece el valor de la variable
void Sprite::setEnabled(bool value) void Sprite::setEnabled(bool value)
{ {

View File

@@ -81,6 +81,9 @@ public:
// Establece el valor de la variable // Establece el valor de la variable
void setRenderer(SDL_Renderer *renderer); void setRenderer(SDL_Renderer *renderer);
// Obten el valor de la variable
SDL_Renderer *getRenderer();
// Establece el valor de la variable // Establece el valor de la variable
void setEnabled(bool value); void setEnabled(bool value);

View File

@@ -94,6 +94,9 @@ Text::Text(std::string textFile, Texture *texture, SDL_Renderer *renderer)
// Crea los objetos // Crea los objetos
sprite = new Sprite({0, 0, boxWidth, boxHeight}, texture, renderer); sprite = new Sprite({0, 0, boxWidth, boxHeight}, texture, renderer);
// Inicializa variables
fixedWidth = false;
} }
// Constructor // Constructor
@@ -111,6 +114,9 @@ Text::Text(textFile_t *textFile, Texture *texture, SDL_Renderer *renderer)
// Crea los objetos // Crea los objetos
sprite = new Sprite({0, 0, boxWidth, boxHeight}, texture, renderer); sprite = new Sprite({0, 0, boxWidth, boxHeight}, texture, renderer);
// Inicializa variables
fixedWidth = false;
} }
// Destructor // Destructor
@@ -133,7 +139,8 @@ void Text::write(int x, int y, std::string text, int kerning, int lenght)
sprite->setPosX(x + shift); sprite->setPosX(x + shift);
sprite->setPosY(y); sprite->setPosY(y);
sprite->render(); sprite->render();
shift += (offset[int(text[i])].w + kerning); // shift += (offset[int(text[i])].w + kerning);
shift += fixedWidth ? boxWidth : (offset[int(text[i])].w + kerning);
} }
} }
@@ -225,4 +232,10 @@ int Text::getCharacterSize()
void Text::reLoadTexture() void Text::reLoadTexture()
{ {
sprite->getTexture()->reLoad(); sprite->getTexture()->reLoad();
}
// Establece si se usa un tamaño fijo de letra
void Text::setFixedWidth(bool value)
{
fixedWidth = value;
} }

View File

@@ -33,11 +33,12 @@ class Text
{ {
private: private:
// Objetos y punteros // Objetos y punteros
Sprite *sprite; // Objeto con los graficos para el texto Sprite *sprite; // Objeto con los graficos para el texto
// Variables // Variables
int boxWidth; // Anchura de la caja de cada caracter en el png int boxWidth; // Anchura de la caja de cada caracter en el png
int boxHeight; // Altura de la caja de cada caracter en el png int boxHeight; // Altura de la caja de cada caracter en el png
bool fixedWidth; // Indica si el texto se ha de escribir con longitud fija en todas las letras
offset_t offset[128]; // Vector con las posiciones y ancho de cada letra offset_t offset[128]; // Vector con las posiciones y ancho de cada letra
public: public:
@@ -71,6 +72,9 @@ public:
// Recarga la textura // Recarga la textura
void reLoadTexture(); void reLoadTexture();
// Establece si se usa un tamaño fijo de letra
void setFixedWidth(bool value);
}; };
#endif #endif

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

@@ -294,28 +294,6 @@ SDL_Point checkCollision(d_line_t &l1, v_line_t &l2)
return {-1, -1}; return {-1, -1};
} }
// Detector de colisiones entre una linea diagonal y una vertical
/*bool checkCollision(d_line_t &l1, v_line_t &l2)
{
// Normaliza la linea diagonal
normalizeLine(l1);
// Comprueba si la linea vertical esta a la izquierda de la linea diagonal
if (l2.x < l1.x1)
{
return false;
}
// Comprueba si la linea vertical esta a la derecha de la linea diagonal
if (l2.x > l1.x2)
{
return false;
}
// Inacabada
return true;
}*/
// Normaliza una linea diagonal // Normaliza una linea diagonal
void normalizeLine(d_line_t &l) void normalizeLine(d_line_t &l)
{ {
@@ -367,16 +345,6 @@ bool checkCollision(SDL_Point &p, d_line_t &l)
// En caso contrario, el punto está en la linea // En caso contrario, el punto está en la linea
return true; return true;
/*const int m = (l.y2 - l.y1) / (l.x2 - l.x1);
const int c = 0;
// Comprueba si p cumple la ecuación de la linea
if (p.y == ((m * p.x) + c))
return true;
return false;*/
} }
// Devuelve un color_t a partir de un string // Devuelve un color_t a partir de un string

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
@@ -81,25 +109,44 @@ struct online_t
int score; // Puntuación almacenada online int score; // Puntuación almacenada online
}; };
// Estructura para almacenar estadísticas
struct op_stats_t
{
int rooms; // Cantidad de habitaciones visitadas
int items; // Cantidad de items obtenidos
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
{ {
Uint32 videoMode; // Contiene el valor del modo de pantalla completa std::string configVersion; // Versión del programa. Sirve para saber si las opciones son compatibles
int windowSize; // Contiene el valor por el que se multiplica el tamaño de la ventana Uint32 videoMode; // Contiene el valor del modo de pantalla completa
Uint32 filter; // Filtro usado para el escalado de la imagen int windowSize; // Contiene el valor por el que se multiplica el tamaño de la ventana
bool vSync; // Indica si se quiere usar vsync o no Uint32 filter; // Filtro usado para el escalado de la imagen
int gameWidth; // Ancho de la resolucion nativa del juego bool vSync; // Indica si se quiere usar vsync o no
int gameHeight; // Alto de la resolucion nativa del juego int gameWidth; // Ancho 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 int gameHeight; // Alto de la resolucion nativa del juego
bool keepAspect; // Indica si se ha de mantener la relación de aspecto al poner 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 borderEnabled; // Indica si ha de mostrar el borde en el modo de ventana bool keepAspect; // Indica si se ha de mantener la relación de aspecto al poner el modo a pantalla completa
float borderSize; // Porcentaje de borde que se añade a lo ventana bool borderEnabled; // Indica si ha de mostrar el borde en el modo de ventana
palette_e palette; // Paleta de colores a usar en el juego int borderWidth; // 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 int borderHeight; // Cantidad de pixels que se añade en el borde de la ventana
cheat_t cheat; // Contiene trucos y ventajas para el juego palette_e palette; // Paleta de colores a usar en el juego
int rooms; // Cantidad de habitaciones visitadas bool console; // Indica si ha de mostrar información por la consola de texto
int items; // Cantidad de items obtenidos 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

@@ -57,7 +57,8 @@ const int GAMECANVAS_THIRD_QUARTER_Y = (GAMECANVAS_HEIGHT / 4) * 3;
#define SECTION_PROG_GAME_OVER 6 #define SECTION_PROG_GAME_OVER 6
#define SECTION_PROG_ENDING 7 #define SECTION_PROG_ENDING 7
#define SECTION_PROG_ENDING2 8 #define SECTION_PROG_ENDING2 8
#define SECTION_PROG_QUIT 9 #define SECTION_PROG_ENTER_ID 9
#define SECTION_PROG_QUIT 10
// Subsecciones // Subsecciones
#define SUBSECTION_LOGO_TO_INTRO 0 #define SUBSECTION_LOGO_TO_INTRO 0

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,28 +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()
{ {
if (options->palette == p_zxspectrum) options->palette = options->palette == p_zxspectrum ? p_zxarne : p_zxspectrum;
{
options->palette = p_zxarne;
}
else
{
options->palette = 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,21 +14,27 @@
// 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_GAME; section->name = SECTION_PROG_GAME;
#endif #endif
// Crea e inicializa las opciones del programa // Crea e inicializa las opciones del programa
iniOptions(); initOptions();
// Comprueba los parametros del programa // Comprueba los parametros del programa
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;
@@ -84,60 +88,41 @@ Director::~Director()
// Inicializa los servicios online // Inicializa los servicios online
void Director::initOnline() void Director::initOnline()
{ {
if (!options->online.enabled)
{
return;
}
// Obten el Jailer ID
if (options->online.jailerID == "") if (options->online.jailerID == "")
{ // Jailer ID no definido { // Jailer ID no definido
screen->showText("No ha especificado ningun Jailer ID");
std::cout << "No ha especificado ningun Jailer ID" << std::endl; options->online.enabled = false;
} }
else else
{ // Jailer ID iniciado { // Jailer ID iniciado
// Establece el servidor y el puerto if (options->online.enabled)
jscore::init(options->online.server, options->online.port); { // Establece el servidor y el puerto
jscore::init(options->online.server, options->online.port);
// Obtiene la información online const std::string caption = options->online.jailerID + " IS LOGGED IN";
if (jscore::initOnlineScore(options->online.gameID)) screen->showNotification(caption);
{ if (options->console)
screen->showText(options->online.jailerID + " ha iniciado sesion"); {
std::cout << options->online.jailerID << " ha iniciado sesion" << std::endl; std::cout << caption << std::endl;
} }
else
{
screen->showText("Fallo al conectar a " + options->online.server);
std::cout << "Fallo al conectar a " << options->online.server << std::endl;
options->online.enabled = false;
return;
}
// Obten las estadisticas online
const int points = jscore::getUserPoints(options->online.gameID, options->online.jailerID);
if (points == 0)
{ // Fallo de conexión o no hay registros
screen->showText("No se ha podido obtener la puntuacion online");
std::cout << "No se ha podido obtener la puntuacion online" << std::endl;
}
else
{
options->online.score = points;
} }
} }
} }
// Crea e inicializa las opciones del programa // Crea e inicializa las opciones del programa
void Director::iniOptions() 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;
// Inicializa valores // Version del archivo de configuración
options->configVersion = "v1.06.1";
// 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;
@@ -147,24 +132,40 @@ void Director::iniOptions()
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;
options->cheat.invincible = false; options->cheat.invincible = false;
options->cheat.jailEnabled = false; options->cheat.jailEnabled = false;
options->cheat.altSkin = false; options->cheat.altSkin = false;
options->rooms = 0; options->stats.rooms = 0;
options->items = 0; options->stats.items = 0;
// Online // Opciones online
options->online.enabled = false; options->online.enabled = true;
options->online.server = ""; options->online.sessionEnabled = false;
options->online.port = 0; options->online.server = "jaildoctor.duckdns.org";
options->online.port = 9911;
#ifdef DEBUG
options->online.gameID = "jaildoctors_dilemma_test"; options->online.gameID = "jaildoctors_dilemma_test";
#else
options->online.gameID = "jaildoctors_dilemma";
#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
@@ -209,6 +210,10 @@ bool Director::loadConfig()
// Indicador de éxito en la carga // Indicador de éxito en la carga
bool success = true; bool success = true;
// Versión actual del fichero
const std::string configVersion = options->configVersion;
options->configVersion = "";
// Variables para manejar el fichero // Variables para manejar el fichero
std::string line; std::string line;
std::ifstream file(asset->get("config.txt")); std::ifstream file(asset->get("config.txt"));
@@ -255,6 +260,13 @@ bool Director::loadConfig()
saveConfig(); saveConfig();
} }
// Si la versión de fichero no coincide, crea un fichero nuevo con los valores por defecto
if (configVersion != options->configVersion)
{
initOptions();
saveConfig();
}
// Normaliza los valores // Normaliza los valores
const bool a = options->videoMode == 0; const bool a = options->videoMode == 0;
const bool b = options->videoMode == SDL_WINDOW_FULLSCREEN; const bool b = options->videoMode == SDL_WINDOW_FULLSCREEN;
@@ -310,7 +322,25 @@ bool Director::saveConfig()
} }
// Escribe en el fichero // Escribe en el fichero
file << "## VISUAL OPTIONS\n"; file << "## VERSION\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";
if (options->videoMode == 0) if (options->videoMode == 0)
{ {
file << "videoMode=0\n"; file << "videoMode=0\n";
@@ -341,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";
@@ -350,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();
@@ -357,18 +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 _WIN32 #ifdef _WIN32
systemFolder = std::string(getenv("APPDATA")) + "/jaildoctors_dilemma"; 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/jaildoctors_dilemma"; 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) + "/.jaildoctors_dilemma"; systemFolder = std::string(homedir) + "/." + folder;
#endif #endif
struct stat st = {0}; struct stat st = {0};
@@ -388,12 +446,15 @@ void Director::createSystemFolder()
case EACCES: case EACCES:
printf("the parent directory does not allow write"); printf("the parent directory does not allow write");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
case EEXIST: case EEXIST:
printf("pathname already exists"); printf("pathname already exists");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
case ENAMETOOLONG: case ENAMETOOLONG:
printf("pathname is too long"); printf("pathname is too long");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
default: default:
perror("mkdir"); perror("mkdir");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
@@ -403,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");
@@ -419,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");
@@ -430,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");
@@ -446,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;
@@ -468,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;
@@ -493,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;
@@ -505,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");
@@ -526,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");
@@ -541,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");
@@ -568,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");
@@ -589,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");
@@ -604,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");
@@ -631,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;
@@ -655,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;
@@ -679,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");
@@ -700,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");
@@ -716,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");
@@ -760,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");
@@ -781,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");
@@ -797,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");
@@ -966,7 +1027,28 @@ bool Director::setOptions(options_t *options, std::string var, std::string value
// Indicador de éxito en la asignación // Indicador de éxito en la asignación
bool success = true; bool success = true;
if (var == "videoMode") if (var == "configVersion")
{
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")
{ {
if (value == "SDL_WINDOW_FULLSCREEN_DESKTOP") if (value == "SDL_WINDOW_FULLSCREEN_DESKTOP")
{ {
@@ -1023,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")
@@ -1071,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) == "#")
{ {
} }
@@ -1092,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
@@ -1155,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);
@@ -1224,10 +1369,17 @@ bool Director::setFileList()
asset->add(prefix + "/data/font/debug.png", t_font); asset->add(prefix + "/data/font/debug.png", t_font);
asset->add(prefix + "/data/font/debug.txt", t_font); asset->add(prefix + "/data/font/debug.txt", t_font);
// Configuración // Datos
asset->add(prefix + "/data/input/gamecontrollerdb.txt", t_data); asset->add(prefix + "/data/input/gamecontrollerdb.txt", t_data);
asset->add(prefix + "/data/config/config.txt", t_data, false);
// Ficheros de sistema
asset->add(systemFolder + "/config.txt", 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);
@@ -1364,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);
@@ -1404,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);
@@ -1434,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);
@@ -1521,6 +1673,7 @@ bool Director::setFileList()
asset->add(prefix + "/data/sound/jump22.wav", t_sound); asset->add(prefix + "/data/sound/jump22.wav", t_sound);
asset->add(prefix + "/data/sound/jump23.wav", t_sound); asset->add(prefix + "/data/sound/jump23.wav", t_sound);
asset->add(prefix + "/data/sound/jump24.wav", t_sound); asset->add(prefix + "/data/sound/jump24.wav", t_sound);
asset->add(prefix + "/data/sound/notify.wav", t_sound);
// Logo // Logo
asset->add(prefix + "/data/logo/jailgames.png", t_bitmap); asset->add(prefix + "/data/logo/jailgames.png", t_bitmap);
@@ -1551,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()
{ {
@@ -1577,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();
} }
@@ -1591,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();
} }
@@ -1609,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();
} }
@@ -1623,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();
} }
@@ -1637,12 +1772,26 @@ 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();
} }
// Ejecuta la seccion en la que se solicita al usuario su ID online
void Director::runEnterID()
{
if (options->console)
{
std::cout << "\n* SECTION: ENTER_ID" << std::endl;
}
// loadResources(section);
enterID = new EnterID(renderer, screen, asset, options, section);
enterID->run();
delete enterID;
resource->free();
}
// Ejecuta la seccion del final del juego // Ejecuta la seccion del final del juego
void Director::runEnding() void Director::runEnding()
{ {
@@ -1651,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();
} }
@@ -1665,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();
} }
@@ -1679,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();
} }
@@ -1694,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();
} }
@@ -1703,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();
@@ -1727,6 +1876,10 @@ void Director::run()
runDemo(); runDemo();
break; break;
case SECTION_PROG_ENTER_ID:
runEnterID();
break;
case SECTION_PROG_GAME: case SECTION_PROG_GAME:
runGame(); runGame();
break; break;

View File

@@ -12,13 +12,14 @@
#include "const.h" #include "const.h"
#include "credits.h" #include "credits.h"
#include "demo.h" #include "demo.h"
#include "ending.h"
#include "ending2.h"
#include "enter_id.h"
#include "game_over.h"
#include "game.h" #include "game.h"
#include "intro.h" #include "intro.h"
#include "logo.h" #include "logo.h"
#include "title.h" #include "title.h"
#include "game_over.h"
#include "ending.h"
#include "ending2.h"
#ifndef DIRECTOR_H #ifndef DIRECTOR_H
#define DIRECTOR_H #define DIRECTOR_H
@@ -39,24 +40,25 @@ private:
Intro *intro; // Objeto para gestionar la introducción del juego Intro *intro; // Objeto para gestionar la introducción del juego
Credits *credits; // Objeto para gestionar los creditos del juego Credits *credits; // Objeto para gestionar los creditos del juego
Demo *demo; // Objeto para gestionar el modo demo, en el que se ven pantallas del juego Demo *demo; // Objeto para gestionar el modo demo, en el que se ven pantallas del juego
EnterID *enterID; // Objeto para gestionar la sección donde se solicita el ID online al usuario
Ending *ending; // Objeto para gestionar el final del juego Ending *ending; // Objeto para gestionar el final del juego
Ending2 *ending2; // Objeto para gestionar el final del juego Ending2 *ending2; // Objeto para gestionar el final del juego
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
JA_Music music; // Musica del titulo JA_Music_t *music; // Musica del titulo
std::string executablePath; // Path del ejecutable std::string executablePath; // Path del ejecutable
section_t section; // Sección y subsección actual del programa;
std::string systemFolder; // Carpeta del sistema donde guardar datos std::string systemFolder; // Carpeta del sistema donde guardar datos
// Crea e inicializa las opciones del programa
void initOptions();
// Inicializa los servicios online // Inicializa los servicios online
void initOnline(); void initOnline();
// Crea e inicializa las opciones del programa
void iniOptions();
// Comprueba los parametros del programa // Comprueba los parametros del programa
void checkProgramArguments(int argc, char *argv[]); void checkProgramArguments(int argc, char *argv[]);
@@ -67,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);
@@ -87,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();
@@ -111,6 +104,9 @@ private:
// Ejecuta la seccion de la demo, donde se ven pantallas del juego // Ejecuta la seccion de la demo, donde se ven pantallas del juego
void runDemo(); void runDemo();
// Ejecuta la seccion en la que se solicita al usuario su ID online
void runEnterID();
// Ejecuta la seccion del final del juego // Ejecuta la seccion del final del juego
void runEnding(); void runEnding();

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);
} }
} }

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