refactor: normalizar notificaciones a castellano, title case sin dos puntos

- Todo en castellano (Vinyeta→viñeta, Cromàtica→cromática, Complet→completo, Desactivat→desactivado, Boids→boids)
- Primera letra mayúscula, resto minúscula (MODO SANDBOX→Modo sandbox, etc.)
- Sin dos puntos separador (PostFX: X→PostFX X, Escalado: X→Escalado X, Sprite: X→Textura X)
- Separadores de miles en castellano (1,000→1.000 pelotas)
- Nombres de figura en minúscula via tolower (SPHERE→sphere → "Modo sphere")
- Ajuste valores PostFX por defecto (vignette 1.5→0.8, chroma 1.0→0.2)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-20 18:21:28 +01:00
parent e46c3eb4ba
commit f3b029c5b6
6 changed files with 50 additions and 47 deletions

View File

@@ -77,7 +77,7 @@ void BoidManager::activateBoids() {
// Mostrar notificación (solo si NO estamos en modo demo o logo) // Mostrar notificación (solo si NO estamos en modo demo o logo)
if (state_mgr_ && ui_mgr_ && state_mgr_->getCurrentMode() == AppMode::SANDBOX) { if (state_mgr_ && ui_mgr_ && state_mgr_->getCurrentMode() == AppMode::SANDBOX) {
ui_mgr_->showNotification("Modo Boids"); ui_mgr_->showNotification("Modo boids");
} }
} }
@@ -93,7 +93,7 @@ void BoidManager::deactivateBoids(bool force_gravity_on) {
// Mostrar notificación (solo si NO estamos en modo demo o logo) // Mostrar notificación (solo si NO estamos en modo demo o logo)
if (state_mgr_ && ui_mgr_ && state_mgr_->getCurrentMode() == AppMode::SANDBOX) { if (state_mgr_ && ui_mgr_ && state_mgr_->getCurrentMode() == AppMode::SANDBOX) {
ui_mgr_->showNotification("Modo Física"); ui_mgr_->showNotification("Modo física");
} }
} }

View File

@@ -32,7 +32,7 @@ constexpr Uint64 NOTIFICATION_FADE_TIME = 200; // Duración animación salida
constexpr float NOTIFICATION_BG_ALPHA = 0.7f; // Opacidad fondo semitransparente (0.0-1.0) constexpr float NOTIFICATION_BG_ALPHA = 0.7f; // Opacidad fondo semitransparente (0.0-1.0)
constexpr int NOTIFICATION_PADDING = 10; // Padding interno del fondo (píxeles físicos) constexpr int NOTIFICATION_PADDING = 10; // Padding interno del fondo (píxeles físicos)
constexpr int NOTIFICATION_TOP_MARGIN = 20; // Margen superior desde borde pantalla (píxeles físicos) constexpr int NOTIFICATION_TOP_MARGIN = 20; // Margen superior desde borde pantalla (píxeles físicos)
constexpr char KIOSK_NOTIFICATION_TEXT[] = "MODO KIOSKO"; constexpr char KIOSK_NOTIFICATION_TEXT[] = "Modo kiosko";
// Configuración de pérdida aleatoria en rebotes // Configuración de pérdida aleatoria en rebotes
constexpr float BASE_BOUNCE_COEFFICIENT = 0.75f; // Coeficiente base IGUAL para todas las pelotas constexpr float BASE_BOUNCE_COEFFICIENT = 0.75f; // Coeficiente base IGUAL para todas las pelotas

View File

@@ -472,20 +472,20 @@ void Engine::handleGravityToggle() {
toggleBoidsMode(false); // Cambiar a PHYSICS sin activar gravedad (preserva inercia) toggleBoidsMode(false); // Cambiar a PHYSICS sin activar gravedad (preserva inercia)
// NO llamar a forceBallsGravityOff() porque aplica impulsos que destruyen la inercia de BOIDS // NO llamar a forceBallsGravityOff() porque aplica impulsos que destruyen la inercia de BOIDS
// La gravedad ya está desactivada por BoidManager::activateBoids() y se mantiene al salir // La gravedad ya está desactivada por BoidManager::activateBoids() y se mantiene al salir
showNotificationForAction("Modo Física - Gravedad Off"); showNotificationForAction("Modo física, gravedad off");
return; return;
} }
// Si estamos en modo figura, salir a modo física SIN GRAVEDAD // Si estamos en modo figura, salir a modo física SIN GRAVEDAD
if (current_mode_ == SimulationMode::SHAPE) { if (current_mode_ == SimulationMode::SHAPE) {
toggleShapeModeInternal(false); // Desactivar figura sin forzar gravedad ON toggleShapeModeInternal(false); // Desactivar figura sin forzar gravedad ON
showNotificationForAction("Gravedad Off"); showNotificationForAction("Gravedad off");
} else { } else {
scene_manager_->switchBallsGravity(); // Toggle normal en modo física scene_manager_->switchBallsGravity(); // Toggle normal en modo física
// Determinar estado actual de gravedad (gravity_force_ != 0.0f significa ON) // Determinar estado actual de gravedad (gravity_force_ != 0.0f significa ON)
const Ball* first_ball = scene_manager_->getFirstBall(); const Ball* first_ball = scene_manager_->getFirstBall();
bool gravity_on = (first_ball == nullptr) ? true : (first_ball->getGravityForce() != 0.0f); bool gravity_on = (first_ball == nullptr) ? true : (first_ball->getGravityForce() != 0.0f);
showNotificationForAction(gravity_on ? "Gravedad On" : "Gravedad Off"); showNotificationForAction(gravity_on ? "Gravedad on" : "Gravedad off");
} }
} }
@@ -679,9 +679,9 @@ void Engine::toggleDemoMode() {
// Mostrar notificación según el modo resultante // Mostrar notificación según el modo resultante
if (new_mode == AppMode::SANDBOX && prev_mode != AppMode::SANDBOX) { if (new_mode == AppMode::SANDBOX && prev_mode != AppMode::SANDBOX) {
showNotificationForAction("MODO SANDBOX"); showNotificationForAction("Modo sandbox");
} else if (new_mode == AppMode::DEMO && prev_mode != AppMode::DEMO) { } else if (new_mode == AppMode::DEMO && prev_mode != AppMode::DEMO) {
showNotificationForAction("MODO DEMO"); showNotificationForAction("Modo demo");
} }
} }
@@ -692,9 +692,9 @@ void Engine::toggleDemoLiteMode() {
// Mostrar notificación según el modo resultante // Mostrar notificación según el modo resultante
if (new_mode == AppMode::SANDBOX && prev_mode != AppMode::SANDBOX) { if (new_mode == AppMode::SANDBOX && prev_mode != AppMode::SANDBOX) {
showNotificationForAction("MODO SANDBOX"); showNotificationForAction("Modo sandbox");
} else if (new_mode == AppMode::DEMO_LITE && prev_mode != AppMode::DEMO_LITE) { } else if (new_mode == AppMode::DEMO_LITE && prev_mode != AppMode::DEMO_LITE) {
showNotificationForAction("MODO DEMO LITE"); showNotificationForAction("Modo demo lite");
} }
} }
@@ -705,9 +705,9 @@ void Engine::toggleLogoMode() {
// Mostrar notificación según el modo resultante // Mostrar notificación según el modo resultante
if (new_mode == AppMode::SANDBOX && prev_mode != AppMode::SANDBOX) { if (new_mode == AppMode::SANDBOX && prev_mode != AppMode::SANDBOX) {
showNotificationForAction("MODO SANDBOX"); showNotificationForAction("Modo sandbox");
} else if (new_mode == AppMode::LOGO && prev_mode != AppMode::LOGO) { } else if (new_mode == AppMode::LOGO && prev_mode != AppMode::LOGO) {
showNotificationForAction("MODO LOGO"); showNotificationForAction("Modo logo");
} }
} }
@@ -1052,10 +1052,10 @@ void Engine::toggleRealFullscreen() {
void Engine::applyPostFXPreset(int mode) { void Engine::applyPostFXPreset(int mode) {
static constexpr float presets[4][3] = { static constexpr float presets[4][3] = {
{1.5f, 0.0f, 0.0f}, // 0: Vinyeta {0.8f, 0.0f, 0.0f}, // 0: Vinyeta
{1.5f, 0.0f, 0.8f}, // 1: Scanlines {0.8f, 0.0f, 0.8f}, // 1: Scanlines
{1.5f, 1.0f, 0.0f}, // 2: Cromàtica {0.8f, 0.2f, 0.0f}, // 2: Cromàtica
{1.5f, 1.0f, 0.8f}, // 3: Complet {0.8f, 0.2f, 0.8f}, // 3: Complet
}; };
postfx_uniforms_.vignette_strength = presets[mode][0]; postfx_uniforms_.vignette_strength = presets[mode][0];
postfx_uniforms_.chroma_strength = presets[mode][1]; postfx_uniforms_.chroma_strength = presets[mode][1];
@@ -1071,8 +1071,8 @@ void Engine::handlePostFXCycle() {
void Engine::handlePostFXToggle() { void Engine::handlePostFXToggle() {
static constexpr const char* names[4] = { static constexpr const char* names[4] = {
"PostFX: Vinyeta", "PostFX: Scanlines", "PostFX viñeta", "PostFX scanlines",
"PostFX: Cromàtica", "PostFX: Complet" "PostFX cromática", "PostFX completo"
}; };
postfx_enabled_ = !postfx_enabled_; postfx_enabled_ = !postfx_enabled_;
if (postfx_enabled_) { if (postfx_enabled_) {
@@ -1082,7 +1082,7 @@ void Engine::handlePostFXToggle() {
postfx_uniforms_.vignette_strength = 0.0f; postfx_uniforms_.vignette_strength = 0.0f;
postfx_uniforms_.chroma_strength = 0.0f; postfx_uniforms_.chroma_strength = 0.0f;
postfx_uniforms_.scanline_strength = 0.0f; postfx_uniforms_.scanline_strength = 0.0f;
showNotificationForAction("PostFX: Desactivat"); showNotificationForAction("PostFX desactivado");
} }
} }
@@ -1103,8 +1103,8 @@ void Engine::setPostFXParamOverrides(float vignette, float chroma) {
void Engine::cycleShader() { void Engine::cycleShader() {
static const char* names[5] = { static const char* names[5] = {
"PostFX: Desactivat", "PostFX: Vinyeta", "PostFX: Scanlines", "PostFX desactivado", "PostFX viñeta", "PostFX scanlines",
"PostFX: Cromàtica", "PostFX: Complet" "PostFX cromática", "PostFX completo"
}; };
postfx_cycle_idx_ = (postfx_cycle_idx_ + 1) % 5; postfx_cycle_idx_ = (postfx_cycle_idx_ + 1) % 5;
int cycle = postfx_cycle_idx_; int cycle = postfx_cycle_idx_;
@@ -1136,13 +1136,13 @@ void Engine::toggleIntegerScaling() {
break; break;
} }
const char* mode_name = "INTEGER"; const char* mode_name = "entero";
switch (current_scaling_mode_) { switch (current_scaling_mode_) {
case ScalingMode::INTEGER: mode_name = "INTEGER"; break; case ScalingMode::INTEGER: mode_name = "entero"; break;
case ScalingMode::LETTERBOX: mode_name = "LETTERBOX"; break; case ScalingMode::LETTERBOX: mode_name = "letterbox"; break;
case ScalingMode::STRETCH: mode_name = "STRETCH"; break; case ScalingMode::STRETCH: mode_name = "stretch"; break;
} }
showNotificationForAction(std::string("Escalado: ") + mode_name); showNotificationForAction(std::string("Escalado ") + mode_name);
} }
void Engine::addSpriteToBatch(float x, float y, float w, float h, int r, int g, int b, float scale) { void Engine::addSpriteToBatch(float x, float y, float w, float h, int r, int g, int b, float scale) {
@@ -1306,8 +1306,8 @@ void Engine::switchTextureInternal(bool show_notification) {
// Mostrar notificación con el nombre de la textura (solo si se solicita) // Mostrar notificación con el nombre de la textura (solo si se solicita)
if (show_notification) { if (show_notification) {
std::string texture_name = texture_names_[current_texture_index_]; std::string texture_name = texture_names_[current_texture_index_];
std::transform(texture_name.begin(), texture_name.end(), texture_name.begin(), ::toupper); std::transform(texture_name.begin(), texture_name.end(), texture_name.begin(), ::tolower);
showNotificationForAction("Sprite: " + texture_name); showNotificationForAction("Textura " + texture_name);
} }
} }

View File

@@ -8,8 +8,8 @@
// MSL binding: constant PostFXUniforms& u [[buffer(0)]] // MSL binding: constant PostFXUniforms& u [[buffer(0)]]
// ============================================================================ // ============================================================================
struct PostFXUniforms { struct PostFXUniforms {
float vignette_strength; // 0 = none, 1.5 = default subtle float vignette_strength; // 0 = none, 0.8 = default subtle
float chroma_strength; // 0 = off, 1 = full chromatic aberration float chroma_strength; // 0 = off, 0.2 = default chromatic aberration
float scanline_strength; // 0 = off, 1 = full scanlines float scanline_strength; // 0 = off, 1 = full scanlines
float time; // accumulated seconds (for future animations) float time; // accumulated seconds (for future animations)
}; };

View File

@@ -38,19 +38,19 @@ bool InputHandler::processEvents(Engine& engine) {
// Controles de dirección de gravedad con teclas de cursor // Controles de dirección de gravedad con teclas de cursor
case SDLK_UP: case SDLK_UP:
engine.handleGravityDirectionChange(GravityDirection::UP, "Gravedad Arriba"); engine.handleGravityDirectionChange(GravityDirection::UP, "Gravedad arriba");
break; break;
case SDLK_DOWN: case SDLK_DOWN:
engine.handleGravityDirectionChange(GravityDirection::DOWN, "Gravedad Abajo"); engine.handleGravityDirectionChange(GravityDirection::DOWN, "Gravedad abajo");
break; break;
case SDLK_LEFT: case SDLK_LEFT:
engine.handleGravityDirectionChange(GravityDirection::LEFT, "Gravedad Izquierda"); engine.handleGravityDirectionChange(GravityDirection::LEFT, "Gravedad izquierda");
break; break;
case SDLK_RIGHT: case SDLK_RIGHT:
engine.handleGravityDirectionChange(GravityDirection::RIGHT, "Gravedad Derecha"); engine.handleGravityDirectionChange(GravityDirection::RIGHT, "Gravedad derecha");
break; break;
case SDLK_V: case SDLK_V:
@@ -193,40 +193,40 @@ bool InputHandler::processEvents(Engine& engine) {
// Cambio de número de pelotas (escenarios 1-8) // Cambio de número de pelotas (escenarios 1-8)
case SDLK_1: case SDLK_1:
engine.changeScenario(0, "10 Pelotas"); engine.changeScenario(0, "10 pelotas");
break; break;
case SDLK_2: case SDLK_2:
engine.changeScenario(1, "50 Pelotas"); engine.changeScenario(1, "50 pelotas");
break; break;
case SDLK_3: case SDLK_3:
engine.changeScenario(2, "100 Pelotas"); engine.changeScenario(2, "100 pelotas");
break; break;
case SDLK_4: case SDLK_4:
engine.changeScenario(3, "500 Pelotas"); engine.changeScenario(3, "500 pelotas");
break; break;
case SDLK_5: case SDLK_5:
engine.changeScenario(4, "1,000 Pelotas"); engine.changeScenario(4, "1.000 pelotas");
break; break;
case SDLK_6: case SDLK_6:
engine.changeScenario(5, "5,000 Pelotas"); engine.changeScenario(5, "5.000 pelotas");
break; break;
case SDLK_7: case SDLK_7:
engine.changeScenario(6, "10,000 Pelotas"); engine.changeScenario(6, "10.000 pelotas");
break; break;
case SDLK_8: case SDLK_8:
engine.changeScenario(7, "50,000 Pelotas"); engine.changeScenario(7, "50.000 pelotas");
break; break;
case SDLK_9: case SDLK_9:
if (engine.isCustomScenarioEnabled()) { if (engine.isCustomScenarioEnabled()) {
std::string custom_notif = std::to_string(engine.getCustomScenarioBalls()) + " Pelotas"; std::string custom_notif = std::to_string(engine.getCustomScenarioBalls()) + " pelotas";
engine.changeScenario(CUSTOM_SCENARIO_IDX, custom_notif.c_str()); engine.changeScenario(CUSTOM_SCENARIO_IDX, custom_notif.c_str());
} }
break; break;

View File

@@ -1,6 +1,7 @@
#include "shape_manager.hpp" #include "shape_manager.hpp"
#include <algorithm> // for std::min, std::max #include <algorithm> // for std::min, std::max, std::transform
#include <cctype> // for ::tolower
#include <cstdlib> // for rand #include <cstdlib> // for rand
#include <string> // for std::string #include <string> // for std::string
@@ -93,7 +94,7 @@ void ShapeManager::toggleShapeMode(bool force_gravity_on_exit) {
// Mostrar notificación (solo si NO estamos en modo demo o logo) // Mostrar notificación (solo si NO estamos en modo demo o logo)
if (state_mgr_ && ui_mgr_ && state_mgr_->getCurrentMode() == AppMode::SANDBOX) { if (state_mgr_ && ui_mgr_ && state_mgr_->getCurrentMode() == AppMode::SANDBOX) {
ui_mgr_->showNotification("Modo Física"); ui_mgr_->showNotification("Modo física");
} }
} }
} }
@@ -136,7 +137,7 @@ void ShapeManager::toggleDepthZoom() {
// Mostrar notificación si está en modo SANDBOX // Mostrar notificación si está en modo SANDBOX
if (ui_mgr_ && state_mgr_ && state_mgr_->getCurrentMode() == AppMode::SANDBOX) { if (ui_mgr_ && state_mgr_ && state_mgr_->getCurrentMode() == AppMode::SANDBOX) {
ui_mgr_->showNotification(depth_zoom_enabled_ ? "Profundidad On" : "Profundidad Off"); ui_mgr_->showNotification(depth_zoom_enabled_ ? "Profundidad on" : "Profundidad off");
} }
} }
} }
@@ -277,7 +278,9 @@ void ShapeManager::activateShapeInternal(ShapeType type) {
// Mostrar notificación con nombre de figura (solo si NO estamos en modo demo o logo) // Mostrar notificación con nombre de figura (solo si NO estamos en modo demo o logo)
if (active_shape_ && state_mgr_ && ui_mgr_ && state_mgr_->getCurrentMode() == AppMode::SANDBOX) { if (active_shape_ && state_mgr_ && ui_mgr_ && state_mgr_->getCurrentMode() == AppMode::SANDBOX) {
std::string notification = std::string("Modo ") + active_shape_->getName(); std::string shape_name = active_shape_->getName();
std::transform(shape_name.begin(), shape_name.end(), shape_name.begin(), ::tolower);
std::string notification = std::string("Modo ") + shape_name;
ui_mgr_->showNotification(notification); ui_mgr_->showNotification(notification);
} }
} }