Files
orni-attack/source/game/systems/demo_pilot.hpp
T

59 lines
2.0 KiB
C++

// demo_pilot.hpp - IA de piloto para el attract mode (demo jugándose sola)
// © 2026 JailDesigner
//
// Calcula, cada frame, los controles de la nave (rotar/empujar/disparar) leyendo
// el estado de juego en solo-lectura. No lee Input ni muta entidades: GameScene
// aplica el Control resultante via Ship::applyMovement + fireBullet.
//
// El comportamiento busca parecer "humano", no óptimo: apuntado con lead y un
// pequeño error, cadencia de disparo con cooldown, esquiva por radio de peligro
// y sesgo hacia el centro para no pegarse a las paredes.
#pragma once
#include <SDL3/SDL.h>
#include <array>
#include <cstdint>
#include "core/system/scene_context.hpp"
#include "game/constants.hpp"
#include "game/entities/enemy.hpp"
#include "game/entities/ship.hpp"
namespace Systems::Demo {
// Stages de arranque de cada escenario curado (se ciclan en attract mode).
// Elegidos por variedad visual: pinwheels, stars, squares/mix.
inline constexpr std::array<std::uint8_t, SceneManager::SceneContext::DEMO_SCENARIO_COUNT>
SCENARIO_STAGES = {2, 5, 7};
// Stage de arranque para el índice de escenario dado.
[[nodiscard]] inline auto scenarioStage(std::uint8_t index) -> std::uint8_t {
return SCENARIO_STAGES.at(index % SCENARIO_STAGES.size());
}
// Control de la nave para un frame.
struct Control {
bool left{false};
bool right{false};
bool thrust{false};
bool shoot{false};
};
class DemoPilot {
public:
[[nodiscard]] auto compute(const Ship& ship,
const std::array<Enemy, Constants::MAX_ORNIS>& enemies,
const SDL_FRect& play_area,
float delta_time) -> Control;
private:
float retarget_timer_{0.0F}; // re-evalúa objetivo cada RETARGET_INTERVAL
float fire_cooldown_{0.0F}; // tiempo restante hasta poder disparar
float aim_jitter_{0.0F}; // error de apuntado, refrescado al retargetar
int target_idx_{-1}; // índice del enemigo objetivo (o -1)
};
} // namespace Systems::Demo