/
Vibek
/
First_Game
Обзор
Документация
Войти
/
Vibek
/
First_Game
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
controllers/wave_manager.py
103 строки
4 KB
Vibek
Добавлен сюжет
21 июн 2026, 20:20
21 июн 2026, 20:20
422c0e0
Код
Авторство
О чём код?
""" WaveManager: Контроллер управления волнами. Отвечает за: расчет бюджета, генерацию состава волны, отслеживание смерти врагов, сигнализацию о завершении волны и восстановление ресурсов. """ from core.events import EventBus from core.config import Config from controllers.algorithms.budget_composer import BudgetWaveComposer class WaveManager: def __init__(self, bus: EventBus): self.bus = bus self.current_wave = 0 self.enemies_alive = 0 self.is_wave_active = False self.forbidden_hashes = set() self.bus.subscribe(Config.EVT_APP_NEW_GAME_SESSION, self.reset) self.bus.subscribe(Config.EVT_WAVE_START_NEXT, self._on_start_next_wave) self.bus.subscribe(Config.EVT_ENTITY_DIED, self._on_entity_died) def _on_start_next_wave(self, payload: dict = None): """Инициация новой волны""" if self.current_wave >= Config.TOTAL_WAVES: print(f"[WaveManager] All {Config.TOTAL_WAVES} waves completed! Victory!") self.bus.emit(Config.EVT_APP_VICTORY, {"wave_index": self.current_wave}) return self.current_wave += 1 self.is_wave_active = True # 1. Расчет прогрессивного бюджета (Квадратичная формула) budget = Config.WAVE_BASE_BUDGET + (self.current_wave ** 2) * Config.WAVE_DIFFICULTY_MULTIPLIER # 2. Генерация состава волны (Алгоритм 1) try: wave_composition = BudgetWaveComposer.generate_wave( budget=budget, wave_index=self.current_wave, forbidden_hashes=self.forbidden_hashes ) except ValueError as e: print(f"CRITICAL WAVE ERROR: {e}") wave_composition = [] # 3. Подсчет врагов для отслеживания завершения волны self.enemies_alive = sum(enemy["count"] for enemy in wave_composition) # 4. Запрос на спавн (PlayingState услышит это и создаст объекты) self.bus.emit(Config.EVT_WAVE_SPAWN_REQUEST, { "wave_index": self.current_wave, "composition": wave_composition }) def _on_entity_died(self, payload: dict): """Реакция на смерть сущности""" if not self.is_wave_active: return target_type = payload.get("type") # Guard Clause: Нас интересуют только враги. Смерть игрока обрабатывается FSM. if target_type not in ("dummy", "enemy"): return self.enemies_alive -= 1 if self.enemies_alive <= 0: self._complete_wave() def _complete_wave(self): """Логика завершения волны""" self.is_wave_active = False if self.current_wave >= Config.TOTAL_WAVES: print(f"[WaveManager] All {Config.TOTAL_WAVES} waves completed! Victory!") self.bus.emit(Config.EVT_APP_VICTORY, {"wave_index": self.current_wave}) return show_upgrade = (self.current_wave % Config.UPGRADE_INTERVAL == 0) self.bus.emit(Config.EVT_WAVE_COMPLETED, { "wave_index": self.current_wave, "show_upgrade": show_upgrade }) self.bus.emit(Config.EVT_RESOURCE_RESTORE, { "stamina": Config.STAMINA_MAX, "force_percent": Config.FORCE_RESTORE_BETWEEN_WAVES }) def cleanup(self): """Отписка от событий при уничтожении менеджера""" self.bus.unsubscribe(Config.EVT_APP_GAME_START, self.reset) self.bus.unsubscribe(Config.EVT_WAVE_START_NEXT, self._on_start_next_wave) self.bus.unsubscribe(Config.EVT_ENTITY_DIED, self._on_entity_died) def reset(self, _data=None): """Сброс состояния менеджера волн для новой игры.""" self.current_wave = 0 self.enemies_alive = 0 self.is_wave_active = False self.forbidden_hashes.clear() print("[WaveManager] Reset for new game.")