19 Commits

Author SHA1 Message Date
62a61ecad4 Fix: No escrivia be la configuració de pantalla completa 2025-02-17 18:58:48 +01:00
2e6436cc4e Modificada la versió en el joc a 2.3.1 2025-02-17 18:43:48 +01:00
7c50cc00fa Actualitzada la versió del Makefile 2025-02-17 18:37:13 +01:00
8f5d56af7f Afegit CMakeLists.txt 2025-02-17 18:36:34 +01:00
424c243ffc Actualitzat createSystemFolder a la nova ruta de Linux 2025-02-17 18:20:35 +01:00
78f858831f Actualitzades les rutes a les imatges del README.md 2025-02-17 18:04:48 +01:00
d3e031e8b5 Restaurat README.MD i de paso traduït al valencià 2024-10-27 17:04:54 +01:00
4792e4f91d Actualizar README.md 2024-10-27 13:36:52 +01:00
e1801a9255 Actualizar README.md 2024-10-27 09:35:21 +01:00
f0d9e39bb1 Actualizado README.md 2024-08-03 10:50:15 +02:00
eb94a17f26 Modificado Makefile 2024-08-03 10:04:31 +02:00
ea5c2c15d6 Añadido un define para poder pausar el juego y hacer capturas de pantalla 2024-08-03 10:03:43 +02:00
ff7170934e Añadido el icono de windows desde el de macos para tener todos los tamaños 2024-08-03 09:44:30 +02:00
1c1762f6b1 Actualizado Makefile 2024-07-13 14:27:24 +02:00
ee8c075213 Añadido icono para windows 2024-07-13 14:26:54 +02:00
958e9f7f75 Añadido icono para windows 2024-07-13 14:26:35 +02:00
8fda06e232 FIX: El item "disco" no aparecía nunca 2024-07-13 13:56:58 +02:00
fb2ffd58ee FIX: En el modo demo el jugador solo disparaba recto hacia arriba 2024-07-13 13:51:44 +02:00
3f183a5489 Modificado .gitignore 2024-07-13 13:50:04 +02:00
13 changed files with 179 additions and 54 deletions

5
.gitignore vendored
View File

@@ -1,4 +1,5 @@
.vscode .vscode
build/
data/config/config.txt data/config/config.txt
*.DS_Store *.DS_Store
thumbs.db thumbs.db
@@ -12,3 +13,7 @@ thumbs.db
*config.bin *config.bin
*score.bin *score.bin
coffee_crisis* coffee_crisis*
SDL2.dll
libwinpthread-1.dll
libstdc++-6.dll
libgcc_s_seh-1.dll

85
CMakeLists.txt Normal file
View File

@@ -0,0 +1,85 @@
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(coffee_crisis)
# Configuración de compilador para MinGW en Windows, si es necesario
if(WIN32 AND NOT CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
set(CMAKE_CXX_COMPILER "g++")
set(CMAKE_C_COMPILER "gcc")
endif()
# Establecer estándar de C++
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED True)
# Configuración global de flags de compilación
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Os -ffunction-sections -fdata-sections")
# Define el directorio de los archivos fuente
set(DIR_SOURCES "${CMAKE_SOURCE_DIR}/source")
# Cargar todos los archivos fuente en DIR_SOURCES de manera recursiva
file(GLOB_RECURSE SOURCES "${DIR_SOURCES}/*.cpp")
# Verificar si se encontraron archivos fuente
if(NOT SOURCES)
message(FATAL_ERROR "No se encontraron archivos fuente en ${DIR_SOURCES}. Verifica que el directorio existe y contiene archivos .cpp.")
endif()
# Configuración de SDL2
find_package(SDL2 REQUIRED)
if(SDL2_FOUND)
message(STATUS "SDL2 encontrado: ${SDL2_INCLUDE_DIRS}")
include_directories(${SDL2_INCLUDE_DIRS})
link_directories(${SDL2_LIBDIR})
else()
message(FATAL_ERROR "SDL2 no encontrado")
endif()
# Incluye rutas de SDL2 obtenidas con pkg-config
include_directories(/usr/local/include /usr/local/include/SDL2)
link_directories(/usr/local/lib)
# Definir las bibliotecas comunes
set(LIBS SDL2)
# Configuración común de salida de ejecutables en el directorio raíz
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR})
# Añadir ejecutable principal
add_executable(${PROJECT_NAME} ${SOURCES})
# Añadir definiciones de compilación dependiendo del tipo de build
target_compile_definitions(${PROJECT_NAME} PRIVATE $<$<CONFIG:DEBUG>:DEBUG VERBOSE>)
# Enlazar bibliotecas
target_link_libraries(${PROJECT_NAME} ${LIBS})
# Configuración específica para cada plataforma
if(WIN32)
target_compile_definitions(${PROJECT_NAME} PRIVATE WINDOWS_BUILD)
target_link_libraries(${PROJECT_NAME} mingw32 opengl32 gdi32 winmm imm32 ole32 version)
elseif(APPLE)
set(LIBS ${LIBS} "-framework OpenGL")
target_compile_definitions(${PROJECT_NAME} PRIVATE MACOS_BUILD)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated")
# Configurar compilación para Apple Silicon
set(CMAKE_OSX_ARCHITECTURES "arm64")
elseif(UNIX AND NOT APPLE)
set(LIBS ${LIBS} GL)
target_compile_definitions(${PROJECT_NAME} PRIVATE LINUX_BUILD)
target_link_libraries(${PROJECT_NAME} ${LIBS})
endif()
# Añadir OpenGL a las bibliotecas enlazadas
if(NOT WIN32)
find_package(OpenGL REQUIRED)
if(OPENGL_FOUND)
message(STATUS "OpenGL encontrado: ${OPENGL_LIBRARIES}")
target_link_libraries(${PROJECT_NAME} ${OPENGL_LIBRARIES})
else()
message(FATAL_ERROR "OpenGL no encontrado")
endif()
endif()

View File

@@ -2,7 +2,8 @@ executable = coffee_crisis
source = source/*.cpp source/common/*.cpp source = source/*.cpp source/common/*.cpp
appName = Coffee Crisis appName = Coffee Crisis
releaseFolder = cc_release releaseFolder = cc_release
version = v2.3 version = v2.3.1
resource_file = release/coffee.res
# Release names # Release names
windowsRelease = $(executable)-$(version)-win32-x64.zip windowsRelease = $(executable)-$(version)-win32-x64.zip
@@ -12,12 +13,13 @@ linuxRelease = $(executable)-$(version)-linux.tar.gz
windows: windows:
@echo off @echo off
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" windres release/coffee.rc -O coff -o $(resource_file)
g++ $(source) $(resource_file) -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: windows_debug:
@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)_debug.exe" g++ $(source) -D DEBUG -D PAUSE -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 strip -s -R .comment -R .gnu.version "$(executable)_debug.exe" --strip-unneeded
windows_release: windows_release:
@@ -36,7 +38,7 @@ windows_release:
powershell Copy-Item "release\*.dll" -Destination "$(releaseFolder)" powershell Copy-Item "release\*.dll" -Destination "$(releaseFolder)"
# Build # Build
g++ $(source) -std=c++11 -Wall -Os -lmingw32 -lws2_32 -lSDL2main -lSDL2 -ffunction-sections -fdata-sections -Wl,--gc-sections -static-libstdc++ -Wl,-subsystem,windows -o "$(releaseFolder)/$(executable).exe" g++ $(source) $(resource_file) -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"
strip -s -R .comment -R .gnu.version "$(releaseFolder)/$(executable).exe" --strip-unneeded strip -s -R .comment -R .gnu.version "$(releaseFolder)/$(executable).exe" --strip-unneeded
# Create ZIP # Create ZIP
@@ -50,7 +52,7 @@ macos:
clang++ $(source) -std=c++11 -Wall -Os -lSDL2 -ffunction-sections -fdata-sections -o "$(executable)" clang++ $(source) -std=c++11 -Wall -Os -lSDL2 -ffunction-sections -fdata-sections -o "$(executable)"
macos_debug: macos_debug:
clang++ $(source) -D DEBUG -std=c++11 -Wall -Os -lSDL2 -ffunction-sections -fdata-sections -o "$(executable)_debug" clang++ $(source) -D DEBUG -D PAUSE -std=c++11 -Wall -Os -lSDL2 -ffunction-sections -fdata-sections -o "$(executable)_debug"
macos_release: macos_release:
# Remove data and possible data from previous builds # Remove data and possible data from previous builds
@@ -105,7 +107,7 @@ linux:
strip -s -R .comment -R .gnu.version "$(executable)" --strip-unneeded strip -s -R .comment -R .gnu.version "$(executable)" --strip-unneeded
linux_debug: linux_debug:
g++ $(source) -D DEBUG -std=c++11 -Wall -Os -lSDL2 -ffunction-sections -fdata-sections -Wl,--gc-sections -o "$(executable)_debug" g++ $(source) -D DEBUG -D PAUSE -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 strip -s -R .comment -R .gnu.version "$(executable)_debug" --strip-unneeded
linux_release: linux_release:

View File

@@ -1,35 +1,34 @@
# Coffee Crisis # Coffee Crisis
Coffee Crisis es un juego arcade que pondrá a prueba tus reflejos. Empezado durante el verano de 2020 y terminado un año despues, en el verano de 2021. Intenta conseguir todos los puntos que puedas con una sola vida a traves de los 10 niveles de juego y ayuda a Bal1 a defender la UPV de la invasión de la cafeína esférica y saltarina. Coffee Crisis és un joc arcade que posarà a prova els teus reflexos. Començat durant l'estiu de 2020 i acabat un any després a l'estiu de 2021. Intenta aconseguir tots els punts que pugues amb una sola vida a través dels 10 nivells de joc i ajuda a Bal1 a defensar la UPV de la invasió de la cafeïna esfèrica i saltarina.
![alt text](https://php.sustancia.synology.me/images/cc1.png) ![alt text](https://php.sustancia.synology.me/images/cc/cc1.png)
## Teclado ## Teclat
El juego se maneja con teclado, aunque tambien se puede conectar un mando de control.
Las teclas son las siguientes:
* **Cursores**: Mover al personaje, moverse por los menus El joc es maneja amb teclat, encara que també es pot connectar un comandament de control.
* **Q, W, E**: Disparar a la izquierda, al centro y a la derecha respectivamente Les tecles són les següents:
* **ESCAPE**: Pone en pausa el juego durante la partida. Sale de los menus. Cierra el juego * **Fletxes**: Moure el personatge, moure's pels menús
* **ENTER**: Acepta las opciones en los menus * **Q, W, E**: Disparar a l'esquerra, al centre i a la dreta respectivament
* **ESCAPE**: Posa en pausa el joc durant la partida. Surt dels menús. Tanca el joc
* **ENTER**: Accepta les opcions en els menús
![alt text](https://php.sustancia.synology.me/images/cc2.png) ![alt text](https://php.sustancia.synology.me/images/cc/cc2.png)
## Compilar ## Compilar
Para compilar el código se necesitan tener las librerías SDL instaladas en el sistema y el compilador g++. Per compilar el codi cal tindre les biblioteques SDL instal·lades al sistema i el compilador g++.
En Linux: En Linux:
```bash ```bash
sudo apt install libsdl2-dev g++ sudo apt install libsdl2-dev g++
``` ```
En macOS se pueden instalar fácilmente con [brew](https://brew.sh): En macOS es poden instal·lar fàcilment amb [brew](https://brew.sh):
```bash ```bash
brew install sdl2 g++ brew install sdl2 g++
``` ```
Una vez instaladas las librerías SDL, se puede compilar utilizando el fichero Makefile suministrado. Un cop instal·lades les biblioteques SDL, es pot compilar utilitzant el fitxer Makefile subministrat.
En Linux: En Linux:
```bash ```bash
@@ -40,11 +39,11 @@ En macOS:
```bash ```bash
make macos make macos
``` ```
![alt text](https://php.sustancia.synology.me/images/cc3.png) ![alt text](https://php.sustancia.synology.me/images/cc/cc3.png)
## Como ejecutar ## Com executar
Para ejecutar el juego hay que escribir en la terminal la orden que se muestra a continuación. Per executar el joc cal escriure a la terminal l'ordre que es mostra a continuació.
En Linux: En Linux:
```bash ```bash
@@ -56,12 +55,12 @@ En macOS:
./coffee_crisis_macos ./coffee_crisis_macos
``` ```
En macOS tambien puedes hacer doble click sobre el archivo coffee_crisis_macos En macOS també pots fer doble clic sobre l'arxiu coffee_crisis_macos
## Agradecimientos ## Agraïments
A los jailers y a la jail. Y entre ellos, a JailDoctor por estar siempre ahí apoyándonos/obligándonos a sacar un Jailgame más. Als jailers i a la jail. I entre ells, a JailDoctor per estar sempre donant-nos suport/obligant-nos a traure un Jailgame més.
Y por supuesto a ti por estar aquí. I per descomptat a tu per estar aquí.
## Licencia ## Llicència
Usa el código para lo que quieras: aprender, reirte, curiosear... excepto para sacar beneficio económico. Si lo consigues, por favor avísame y vamos a medias. Utilitza el codi per a el que vulgues: aprendre, riure't, tafanejar... excepte per treure'n benefici econòmic. Si ho aconsegueixes, si us plau avisa'm i anem a mitges.

1
release/coffee.rc Normal file
View File

@@ -0,0 +1 @@
id ICON "icon.ico"

BIN
release/coffee.res Normal file

Binary file not shown.

BIN
release/icon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

View File

@@ -435,7 +435,7 @@ void Director::checkProgramArguments(int argc, char *argv[])
} }
// Crea la carpeta del sistema donde guardar datos // Crea la carpeta del sistema donde guardar datos
void Director::createSystemFolder(std::string folder) void Director::createSystemFolder(const std::string &folder)
{ {
#ifdef _WIN32 #ifdef _WIN32
systemFolder = std::string(getenv("APPDATA")) + "/" + folder; systemFolder = std::string(getenv("APPDATA")) + "/" + folder;
@@ -446,7 +446,18 @@ void Director::createSystemFolder(std::string 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) + "/." + folder; systemFolder = std::string(homedir) + "/.config/" + folder;
{
// Intenta crear ".config", per si no existeix
std::string config_base_folder = std::string(homedir) + "/.config";
int ret = mkdir(config_base_folder.c_str(), S_IRWXU);
if (ret == -1 && errno != EEXIST)
{
printf("ERROR CREATING CONFIG BASE FOLDER.");
exit(EXIT_FAILURE);
}
}
#endif #endif
struct stat st = {0}; struct stat st = {0};
@@ -590,12 +601,12 @@ bool Director::saveConfigFile()
else if (options->videoMode == SDL_WINDOW_FULLSCREEN) else if (options->videoMode == SDL_WINDOW_FULLSCREEN)
{ {
file << "fullScreenMode=SDL_WINDOW_FULLSCREEN\n"; file << "videoMode=SDL_WINDOW_FULLSCREEN\n";
} }
else if (options->videoMode == SDL_WINDOW_FULLSCREEN_DESKTOP) else if (options->videoMode == SDL_WINDOW_FULLSCREEN_DESKTOP)
{ {
file << "fullScreenMode=SDL_WINDOW_FULLSCREEN_DESKTOP\n"; file << "videoMode=SDL_WINDOW_FULLSCREEN_DESKTOP\n";
} }
file << "windowSize=" + std::to_string(options->windowSize) + "\n"; file << "windowSize=" + std::to_string(options->windowSize) + "\n";

View File

@@ -81,10 +81,7 @@ private:
void checkProgramArguments(int argc, char *argv[]); void checkProgramArguments(int argc, char *argv[]);
// Crea la carpeta del sistema donde guardar datos // Crea la carpeta del sistema donde guardar datos
void createSystemFolder(std::string folder); void createSystemFolder(const std::string &folder);
// Establece el valor de la variable
void setSection(section_t section);
// Ejecuta la seccion de juego con el logo // Ejecuta la seccion de juego con el logo
void runLogo(); void runLogo();

View File

@@ -16,7 +16,11 @@ Game::Game(int numPlayers, int currentStage, SDL_Renderer *renderer, Screen *scr
// Pasa variables // Pasa variables
this->demo.enabled = demo; this->demo.enabled = demo;
this->numPlayers = numPlayers; this->numPlayers = numPlayers;
#ifdef PAUSE
this->currentStage = 3;
#else
this->currentStage = currentStage; this->currentStage = currentStage;
#endif
lastStageReached = currentStage; lastStageReached = currentStage;
if (numPlayers == 1) if (numPlayers == 1)
{ // Si solo juega un jugador, permite jugar tanto con teclado como con mando { // Si solo juega un jugador, permite jugar tanto con teclado como con mando
@@ -57,6 +61,9 @@ Game::Game(int numPlayers, int currentStage, SDL_Renderer *renderer, Screen *scr
// Inicializa las variables necesarias para la sección 'Game' // Inicializa las variables necesarias para la sección 'Game'
init(); init();
#ifdef PAUSE
pause = false;
#endif
} }
Game::~Game() Game::~Game()
@@ -2552,7 +2559,7 @@ Uint8 Game::dropItem()
// Crea un objeto item // Crea un objeto item
void Game::createItem(Uint8 kind, float x, float y) void Game::createItem(Uint8 kind, float x, float y)
{ {
Item *item = new Item(kind, x, y, itemTextures[kind], itemAnimations[kind], renderer); Item *item = new Item(kind, x, y, itemTextures[kind - 1], itemAnimations[kind - 1], renderer);
items.push_back(item); items.push_back(item);
} }
@@ -3066,7 +3073,7 @@ void Game::checkGameInput()
if (players[index]->canFire()) if (players[index]->canFire())
{ {
players[index]->setInput(input_fire_left); players[index]->setInput(input_fire_left);
createBullet(players[index]->getPosX() + (players[index]->getWidth() / 2) - 4, players[index]->getPosY() + (players[index]->getHeight() / 2), BULLET_UP, players[index]->isPowerUp(), index); createBullet(players[index]->getPosX() + (players[index]->getWidth() / 2) - 4, players[index]->getPosY() + (players[index]->getHeight() / 2), BULLET_LEFT, players[index]->isPowerUp(), index);
players[index]->setFireCooldown(10); players[index]->setFireCooldown(10);
} }
} }
@@ -3076,7 +3083,7 @@ void Game::checkGameInput()
if (players[index]->canFire()) if (players[index]->canFire())
{ {
players[index]->setInput(input_fire_right); players[index]->setInput(input_fire_right);
createBullet(players[index]->getPosX() + (players[index]->getWidth() / 2) - 4, players[index]->getPosY() + (players[index]->getHeight() / 2), BULLET_UP, players[index]->isPowerUp(), index); createBullet(players[index]->getPosX() + (players[index]->getWidth() / 2) - 4, players[index]->getPosY() + (players[index]->getHeight() / 2), BULLET_RIGHT, players[index]->isPowerUp(), index);
players[index]->setFireCooldown(10); players[index]->setFireCooldown(10);
} }
} }
@@ -3367,8 +3374,13 @@ void Game::run()
} }
} }
#ifdef PAUSE
if (!pause)
update();
#else
// Actualiza la lógica del juego // Actualiza la lógica del juego
update(); update();
#endif
// Comprueba los eventos que hay en cola // Comprueba los eventos que hay en cola
checkEvents(); checkEvents();
@@ -3869,6 +3881,16 @@ void Game::checkEvents()
section->subsection = SUBSECTION_GAME_PAUSE; section->subsection = SUBSECTION_GAME_PAUSE;
} }
} }
#ifdef PAUSE
else if (eventHandler->type == SDL_KEYDOWN)
{
if (eventHandler->key.keysym.scancode == SDL_SCANCODE_P)
{
pause = !pause;
}
}
#endif
} }
} }

View File

@@ -238,6 +238,9 @@ private:
int cloudsSpeed; // Velocidad a la que se desplazan las nubes int cloudsSpeed; // Velocidad a la que se desplazan las nubes
int pauseCounter; // Contador para salir del menu de pausa y volver al juego int pauseCounter; // Contador para salir del menu de pausa y volver al juego
bool leavingPauseMenu; // Indica si esta saliendo del menu de pausa para volver al juego bool leavingPauseMenu; // Indica si esta saliendo del menu de pausa para volver al juego
#ifdef PAUSE
bool pause;
#endif
// Actualiza el juego // Actualiza el juego
void update(); void update();

View File

@@ -8,12 +8,12 @@
#define ITEM_H #define ITEM_H
// Tipos de objetos // Tipos de objetos
#define ITEM_POINTS_1_DISK 0 #define ITEM_POINTS_1_DISK 1
#define ITEM_POINTS_2_GAVINA 1 #define ITEM_POINTS_2_GAVINA 2
#define ITEM_POINTS_3_PACMAR 2 #define ITEM_POINTS_3_PACMAR 3
#define ITEM_CLOCK 3 #define ITEM_CLOCK 4
#define ITEM_COFFEE 4 #define ITEM_COFFEE 5
#define ITEM_COFFEE_MACHINE 5 #define ITEM_COFFEE_MACHINE 6
// Clase Item // Clase Item
class Item class Item

View File

@@ -23,7 +23,7 @@
#define TITLE_H #define TITLE_H
// Textos // Textos
#define TEXT_COPYRIGHT "@2020,2023 JailDesigner (v2.3)" #define TEXT_COPYRIGHT "@2020,2023 JailDesigner (v2.3.1)"
// Contadores // Contadores
#define TITLE_COUNTER 800 #define TITLE_COUNTER 800