diff --git a/data/config/assets.txt b/data/config/assets.txt index dfe68c7..fe2ea19 100644 --- a/data/config/assets.txt +++ b/data/config/assets.txt @@ -13,6 +13,7 @@ DATA|${PREFIX}/data/config/formations.txt DATA|${PREFIX}/data/config/gamecontrollerdb.txt DATA|${PREFIX}/data/config/param_320x240.txt DATA|${PREFIX}/data/config/param_320x256.txt +DATA|${PREFIX}/data/config/param_red.txt DATA|${PREFIX}/data/config/pools.txt DATA|${PREFIX}/data/config/stages.txt DEMODATA|${PREFIX}/data/config/demo1.bin diff --git a/data/config/param_red.txt b/data/config/param_red.txt new file mode 100644 index 0000000..60eb91f --- /dev/null +++ b/data/config/param_red.txt @@ -0,0 +1,150 @@ +# Coffee Crisis Arcade Edition - Fichero de parametros - RED THEME +# Formato: PARAMETRO VALOR + +# --- GAME --- +game.item_size 20 # Tamaño de los items del juego (en píxeles) +game.item_text_outline_color FFB8B8F0 # Color del outline del texto de los items (RGBA hex) - Rojo claro +game.width 320 # Ancho de la resolución nativa del juego (en píxeles) +game.height 256 # Alto de la resolución nativa del juego (en píxeles) +game.play_area.rect.x 0 # Posición X de la zona jugable +game.play_area.rect.y 0 # Posición Y de la zona jugable +game.play_area.rect.w 320 # Ancho de la zona jugable +game.play_area.rect.h 216 # Alto de la zona jugable +game.name_entry_idle_time 10 # Segundos para introducir el nombre al finalizar la partida si no se pulsa nada +game.name_entry_total_time 60 # Segundos totales para introducir el nombre al finalizar la partida +game.hit_stop false # Indica si debe haber un paro cuando el jugador es golpeado por un globo +game.hit_stop_ms 500 # Cantidad de milisegundos que dura el hit_stop + +# --- FADE --- +fade.color 5C1F1F # Color hexadecimal para el efecto de fundido - Rojo oscuro +fade.num_squares_width 64 # Número de cuadrados en el eje X para el fundido +fade.num_squares_height 48 # Número de cuadrados en el eje Y para el fundido +fade.random_squares_duration_ms 1200 # Duración del fade en milisegundos +fade.post_duration_ms 500 # Duración tras el fundido en milisegundos +fade.venetian_size 12 # Tamaño de las bandas para el efecto veneciano (en píxeles) + +# --- SCOREBOARD --- +scoreboard.rect.x 0 # Posición X del marcador +scoreboard.rect.y 216 # Posición Y del marcador +scoreboard.rect.w 320 # Ancho del marcador +scoreboard.rect.h 40 # Alto del marcador +scoreboard.separator_autocolor true # ¿El separador usa color automático? +scoreboard.separator_color 2B0D0D # Color del separador - Rojo muy oscuro +scoreboard.easy_color 8B4A2F # Color para la dificultad fácil - Marrón rojizo +scoreboard.normal_color 6B2F2F # Color para la dificultad normal - Rojo medio +scoreboard.hard_color A73030 # Color para la dificultad difícil - Rojo fuerte +scoreboard.text_autocolor true # ¿El texto usa color automático? +scoreboard.text_color1 FFE6E6 # Color principal del texto del marcador - Blanco rosado +scoreboard.text_color2 FFE6E6 # Color secundario del texto del marcador - Blanco rosado +scoreboard.skip_countdown_value 8 # Valor para saltar la cuenta atrás (segundos) + +# --- TITLE --- +title.press_start_position 180 # Posición Y del texto "Press Start" +title.title_duration 800 # Duración de la pantalla de título (frames) +title.arcade_edition_position 123 # Posición Y del subtítulo "Arcade Edition" +title.title_c_c_position 80 # Posición Y del título principal +title.bg_color 8B4A3A # Color de fondo en la sección titulo - Marrón rojizo + +# --- BACKGROUND --- +background.attenuate_color FF4A3A40 # Color de atenuación del fondo (RGBA hexadecimal) - Blanco rosado + +# --- BALLOONS --- +balloon.settings[0].vel 2.75f # Velocidad inicial del globo 1 +balloon.settings[0].grav 0.09f # Gravedad aplicada al globo 1 +balloon.settings[1].vel 3.70f # Velocidad inicial del globo 2 +balloon.settings[1].grav 0.10f # Gravedad aplicada al globo 2 +balloon.settings[2].vel 4.70f # Velocidad inicial del globo 3 +balloon.settings[2].grav 0.10f # Gravedad aplicada al globo 3 +balloon.settings[3].vel 5.45f # Velocidad inicial del globo 4 +balloon.settings[3].grav 0.10f # Gravedad aplicada al globo 4 + +balloon.color[0] orange # Color de creación del globo normal +balloon.color[1] red # Color del globo normal +balloon.color[2] blue # Color de creación del globo que rebota +balloon.color[3] green # Color del globo que rebota + +balloon.bouncing_sound false # Indica si los globos hacer sonido al rebotar + +# --- NOTIFICATION --- +notification.pos_v TOP # Posición vertical de la notificación (TOP/BOTTOM) +notification.pos_h LEFT # Posición horizontal de la notificación (LEFT/RIGHT) +notification.sound false # ¿La notificación reproduce sonido? +notification.color 4D1A1A # Color de fondo de la notificación - Rojo oscuro + +# --- SERVICE MENU --- +service_menu.title_color FF9966 # Color del título del menú de servicio - Naranja claro +service_menu.text_color FFE6E6 # Color del texto del menú de servicio - Blanco rosado +service_menu.selected_color FFB366 # Color de la opción seleccionada - Naranja dorado +service_menu.bg_color 331A0AF5 # Color de fondo del menú de servicio - Marrón rojizo oscuro con alpha +service_menu.drop_shadow false # ¿El menú de servicio tiene sombra? + +service_menu.window_message.bg_color 4D1A1AF0 # Color de fondo de ventanas - Rojo oscuro con alpha +service_menu.window_message.border_color CC6633FF # Color del borde de ventanas - Naranja rojizo +service_menu.window_message.title_color CC6633FF # Color del título en ventanas - Naranja rojizo +service_menu.window_message.text_color FFE6E6FF # Color del texto en ventanas - Blanco rosado +service_menu.window_message.padding 15.0f # Espaciado interno de ventanas de mensaje (píxeles) +service_menu.window_message.line_spacing 5.0f # Espaciado entre líneas de texto (píxeles) +service_menu.window_message.title_separator_spacing 20.0f # Espaciado entre título y contenido (píxeles) +service_menu.window_message.min_width 200.0f # Ancho mínimo de ventanas de mensaje (píxeles) +service_menu.window_message.min_height 32.0f # Alto mínimo de ventanas de mensaje (píxeles) +service_menu.window_message.max_width_ratio 0.8f # Ratio máximo de ancho respecto a pantalla (0.0-1.0) +service_menu.window_message.max_height_ratio 0.8f # Ratio máximo de alto respecto a pantalla (0.0-1.0) +service_menu.window_message.text_safety_margin 15.0f # Margen de seguridad para el texto (píxeles) +service_menu.window_message.animation_duration 0.3f # Duración de animaciones de ventanas (segundos) + +# --- INTRO --- +intro.bg_color B8664D # Color de fondo de la intro - Naranja tierra +intro.card_color FFE6CC # Color de las tarjetas en la intro - Crema rojizo +intro.shadow_color 66000080 # Color de la sombra de las tarjetas - Rojo muy oscuro con alpha +intro.text_distance_from_bottom 48 # Posición del texto desde la parte inferior + +# --- DEBUG --- +debug.color FF6666 # Color para elementos de depuración - Rojo claro + +# --- RESOURCE --- +resource.color FFE6E6 # Color de recursos - Blanco rosado + +# --- TABE --- +tabe.min_spawn_time 2.0f # Tiempo mínimo en segundos para que aparezca el Tabe +tabe.max_spawn_time 3.0f # Tiempo máximo en segundos para que aparezca el Tabe + +# --- PLAYER --- +# Jugador 1 - Camiseta por defecto (tonos rojos) +player.default_shirt[0].darkest B33030FF # Tono más oscuro - Rojo fuerte +player.default_shirt[0].dark CC4040FF # Tono oscuro - Rojo medio +player.default_shirt[0].base E65050FF # Tono principal - Rojo claro +player.default_shirt[0].light FF6666FF # Tono claro - Rojo muy claro + +# Jugador 2 - Camiseta por defecto (tonos naranjas) +player.default_shirt[1].darkest B36030FF # Tono más oscuro - Naranja oscuro +player.default_shirt[1].dark CC7540FF # Tono oscuro - Naranja medio +player.default_shirt[1].base E68A50FF # Tono principal - Naranja claro +player.default_shirt[1].light FF9966FF # Tono claro - Naranja muy claro + +# Jugador 1 - Camiseta con 1 café (tonos rojizos más intensos) +player.one_coffee_shirt[0].darkest 8B2635FF # Tono más oscuro - Rojo granate +player.one_coffee_shirt[0].dark A53040FF # Tono oscuro - Rojo granate claro +player.one_coffee_shirt[0].base BF3A50FF # Tono principal - Rojo vibrante +player.one_coffee_shirt[0].light D94460FF # Tono claro - Rojo vibrante claro + +# Jugador 1 - Camiseta con 2 cafés (tonos naranja dorado) +player.two_coffee_shirt[0].darkest CC6600FF # Tono más oscuro - Naranja dorado oscuro +player.two_coffee_shirt[0].dark E6750AFF # Tono oscuro - Naranja dorado +player.two_coffee_shirt[0].base FF8514FF # Tono principal - Naranja dorado claro +player.two_coffee_shirt[0].light FF991EFF # Tono claro - Naranja dorado muy claro + +# Jugador 2 - Camiseta con 1 café (tonos terracotas) +player.one_coffee_shirt[1].darkest A0472DFF # Tono más oscuro - Terracota oscuro +player.one_coffee_shirt[1].dark B8553AFF # Tono oscuro - Terracota medio +player.one_coffee_shirt[1].base D06347FF # Tono principal - Terracota claro +player.one_coffee_shirt[1].light E87154FF # Tono claro - Terracota muy claro + +# Jugador 2 - Camiseta con 2 cafés (tonos naranjas cálidos) +player.two_coffee_shirt[1].darkest CC5500FF # Tono más oscuro - Naranja intenso +player.two_coffee_shirt[1].dark E66600FF # Tono oscuro - Naranja fuerte +player.two_coffee_shirt[1].base FF7700FF # Tono principal - Naranja brillante +player.two_coffee_shirt[1].light FF8800FF # Tono claro - Naranja muy brillante + +# Colores de contorno de los jugadores +player.outline_color[0] 994D33FF # Color del contorno del Jugador 1 - Marrón rojizo +player.outline_color[1] 664433FF # Color del contorno del Jugador 2 - Marrón tierra \ No newline at end of file diff --git a/source/director.cpp b/source/director.cpp index 180287c..77b7457 100644 --- a/source/director.cpp +++ b/source/director.cpp @@ -126,7 +126,7 @@ void Director::loadParams() { #ifdef ANBERNIC const std::string paramFilePath = asset->get("param_320x240.txt"); #else - const std::string PARAM_FILE_PATH = overrides.param_file == "--320x240" ? Asset::get()->get("param_320x240.txt") : Asset::get()->get("param_320x256.txt"); + const std::string PARAM_FILE_PATH = overrides.param_file == "--320x240" ? Asset::get()->get("param_320x240.txt") : Asset::get()->get("param_red.txt"); #endif loadParamsFromFile(PARAM_FILE_PATH); } diff --git a/source/param.cpp b/source/param.cpp index b90b94e..3de54cb 100644 --- a/source/param.cpp +++ b/source/param.cpp @@ -194,11 +194,48 @@ auto setParams(const std::string& var, const std::string& value) -> bool { static const std::unordered_map> INT_PARAMS_EXTRA = {}; + // Colores válidos para globos + static const std::unordered_map VALID_BALLOON_COLORS = { + {"blue", true}, {"orange", true}, {"red", true}, {"green", true} + }; + + auto validateBalloonColor = [](const std::string& color) -> bool { + return VALID_BALLOON_COLORS.find(color) != VALID_BALLOON_COLORS.end(); + }; + static const std::unordered_map> STRING_PARAMS = { - {"balloon.color[0]", [](const std::string& v) { param.balloon.color.at(0) = v; }}, - {"balloon.color[1]", [](const std::string& v) { param.balloon.color.at(1) = v; }}, - {"balloon.color[2]", [](const std::string& v) { param.balloon.color.at(2) = v; }}, - {"balloon.color[3]", [](const std::string& v) { param.balloon.color.at(3) = v; }}}; + {"balloon.color[0]", [validateBalloonColor](const std::string& v) { + if (!validateBalloonColor(v)) { + SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION, "Color de globo inválido '%s'. Usando 'blue' por defecto.", v.c_str()); + param.balloon.color.at(0) = "blue"; + } else { + param.balloon.color.at(0) = v; + } + }}, + {"balloon.color[1]", [validateBalloonColor](const std::string& v) { + if (!validateBalloonColor(v)) { + SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION, "Color de globo inválido '%s'. Usando 'orange' por defecto.", v.c_str()); + param.balloon.color.at(1) = "orange"; + } else { + param.balloon.color.at(1) = v; + } + }}, + {"balloon.color[2]", [validateBalloonColor](const std::string& v) { + if (!validateBalloonColor(v)) { + SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION, "Color de globo inválido '%s'. Usando 'red' por defecto.", v.c_str()); + param.balloon.color.at(2) = "red"; + } else { + param.balloon.color.at(2) = v; + } + }}, + {"balloon.color[3]", [validateBalloonColor](const std::string& v) { + if (!validateBalloonColor(v)) { + SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION, "Color de globo inválido '%s'. Usando 'green' por defecto.", v.c_str()); + param.balloon.color.at(3) = "green"; + } else { + param.balloon.color.at(3) = v; + } + }}}; // Lambda para intentar cada mapa de parámetros auto try_map = [&](const auto& param_map) -> bool {