feat: limitar modo BOIDS a escenarios con ≤1.000 bolas

Pulsar B en escenarios 6-8 (o custom >1K) no activa boids y muestra
notificación. Cambiar de escenario estando en BOIDS queda bloqueado
si el destino supera BOIDS_MAX_BALLS (= SCENE_BALLS_5).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-21 01:13:17 +01:00
parent e1f6fd0f39
commit 9ae851d5b6
3 changed files with 25 additions and 0 deletions

View File

@@ -74,6 +74,8 @@ constexpr int BALL_COUNT_SCENARIOS[SCENARIO_COUNT] = {
SCENE_BALLS_5, SCENE_BALLS_6, SCENE_BALLS_7, SCENE_BALLS_8 SCENE_BALLS_5, SCENE_BALLS_6, SCENE_BALLS_7, SCENE_BALLS_8
}; };
constexpr int BOIDS_MAX_BALLS = SCENE_BALLS_5; // 1 000 bolas máximo en modo BOIDS
// Límites de escenario para modos automáticos (índices en BALL_COUNT_SCENARIOS) // Límites de escenario para modos automáticos (índices en BALL_COUNT_SCENARIOS)
// 0 1 2 3 4 5 6 7 // 0 1 2 3 4 5 6 7
constexpr int DEMO_AUTO_MIN_SCENARIO = 2; // mínimo 100 bolas constexpr int DEMO_AUTO_MIN_SCENARIO = 2; // mínimo 100 bolas

View File

@@ -564,7 +564,21 @@ void Engine::toggleDepthZoom() {
} }
// Boids (comportamiento de enjambre) // Boids (comportamiento de enjambre)
bool Engine::isScenarioAllowedForBoids(int scenario_id) const {
int ball_count = (scenario_id == CUSTOM_SCENARIO_IDX)
? custom_scenario_balls_
: BALL_COUNT_SCENARIOS[scenario_id];
return ball_count <= BOIDS_MAX_BALLS;
}
void Engine::toggleBoidsMode(bool force_gravity_on) { void Engine::toggleBoidsMode(bool force_gravity_on) {
if (current_mode_ != SimulationMode::BOIDS) {
// Intentando activar BOIDS — verificar escenario actual
if (!isScenarioAllowedForBoids(scene_manager_->getCurrentScenario())) {
showNotificationForAction("Boids: máximo 1.000 pelotas");
return;
}
}
if (current_mode_ == SimulationMode::BOIDS) { if (current_mode_ == SimulationMode::BOIDS) {
// Salir del modo boids // Salir del modo boids
current_mode_ = SimulationMode::PHYSICS; current_mode_ = SimulationMode::PHYSICS;
@@ -654,6 +668,12 @@ void Engine::setCustomScenario(int balls) {
// Escenarios (número de pelotas) // Escenarios (número de pelotas)
void Engine::changeScenario(int scenario_id, const char* notification_text) { void Engine::changeScenario(int scenario_id, const char* notification_text) {
if (current_mode_ == SimulationMode::BOIDS) {
if (!isScenarioAllowedForBoids(scenario_id)) {
showNotificationForAction("Boids: máximo 1.000 pelotas");
return;
}
}
// Pasar el modo actual al SceneManager para inicialización correcta // Pasar el modo actual al SceneManager para inicialización correcta
scene_manager_->changeScenario(scenario_id, current_mode_); scene_manager_->changeScenario(scenario_id, current_mode_);

View File

@@ -269,6 +269,9 @@ class Engine {
// PostFX helper // PostFX helper
void applyPostFXPreset(int mode); void applyPostFXPreset(int mode);
// Boids: comprueba si un escenario tiene ≤ BOIDS_MAX_BALLS bolas
bool isScenarioAllowedForBoids(int scenario_id) const;
// GPU helpers // GPU helpers
bool loadGpuSpriteTexture(size_t index); // Upload one sprite texture to GPU bool loadGpuSpriteTexture(size_t index); // Upload one sprite texture to GPU
void recreateOffscreenTexture(); // Recreate when resolution changes void recreateOffscreenTexture(); // Recreate when resolution changes