#include "wave.h" #include "game_state.h" #include "components.h" #include "entity_factory.h" #include "utils.h" WaveInfo getWaveInfo(i32 idx) { BZ_ASSERT(idx >= 0); WaveData waveData; if (idx >= NUM_WAVES) { waveData = predefWaves[NUM_WAVES - 1]; waveData.difficultyScale += (idx - NUM_WAVES) * 0.1f; } else { waveData = predefWaves[idx]; } WaveInfo info = { .number = idx, .data = waveData, .orcsToSend = waveData.numOrcs, .goblinsToSend = waveData.numGoblins, }; info.data.timeBeforeStart /= 60; return info; } static Vector2 randomizeSpawnPos(Vector2 spawnPoint, i32 range) { spawnPoint.x += randFloatRange(-range, range); spawnPoint.y += randFloatRange(-range, range); return spawnPoint; } void updateWave(WaveInfo *wave, Game *game, f32 dt) { wave->elapsed += dt; if (wave->elapsed < wave->data.timeBeforeStart) return; wave->started = true; wave->orcsElapsed += dt; wave->goblinsElapsed += dt; f32 timeForGoblin = 1.0f / wave->data.goblinSendRate; if (wave->goblinsElapsed >= timeForGoblin) { Vector2 spawnPos = randomizeSpawnPos(game->swarmSpawn, 20); entityCreate(ENTITY_GOBLIN, spawnPos, PLAYER_ENEMY, game); wave->goblinsElapsed -= timeForGoblin; } f32 timeForOrc = 1.0f / wave->data.orcSendRate; if (wave->orcsElapsed >= timeForOrc) { Vector2 spawnPos = randomizeSpawnPos(game->swarmSpawn, 20); entityCreate(ENTITY_ORC, spawnPos, PLAYER_ENEMY, game); wave->orcsElapsed -= timeForOrc; } } bool isWaveSendingOver(const WaveInfo *wave) { return wave->orcsToSend == 0 && wave->goblinsToSend == 0; } bool isWaveOver(const WaveInfo *wave) { if (!isWaveSendingOver(wave)) return false; return wave->started && ecs_count_id(ECS, ecs_id(Swarm)) == 0; }