#ifndef PIXELDEFENSE_GAME_STATE_H #define PIXELDEFENSE_GAME_STATE_H #include #include #include "constants.h" #include "sounds.h" #include "wave.h" typedef enum GameScreen { SCREEN_GAME, SCREEN_GAME_OVER, SCREEN_PAUSE_MENU, SCREEN_MAIN_MENU, SCREEN_SETTINGS, } GameScreen; typedef struct DrawData { Rectangle src; Rectangle dst; Vector2 origin; f32 rotation; u8 layer; bool canHaveAlpha; } DrawData; typedef struct Options { // Video bool debugMenu; bool fullscreen; bool limitFps; // Audio f32 master; f32 music; f32 sound; } Options; typedef struct GameData { Options options; } GameData; static GameData getDefaultGameData() { return (GameData) { .options = { .debugMenu = false, .fullscreen = false, .limitFps = true, .master = 0.5f, .music = 0.5f, .sound = 0.5f } }; } typedef struct PlayerResources { i64 wood; i64 food; i64 gold; i64 pop; i64 popCapacity; } PlayerResources; #define MAX_SWARM_WAYPOINTS 16 typedef struct Game { GameScreen screen; GameScreen nextScreen; GameScreen screenPrevFrame; Camera2D camera; BzTileset tileset; BzTileMap map; BzSpatialGrid *entityGrid; f32 frameDuration; Font font; GameData gameData; PlayerResources playerResources[PLAYER_COUNT]; Player player; EnemyWaves waves; WaveInfo waveInfo; ecs_entity_t keepEntity; Vector2 swarmWaypoints[MAX_SWARM_WAYPOINTS]; i32 swamNumWaypoints; Vector2 swarmSpawn; BzStackAlloc stackAlloc; struct { BzBTNode *worker; BzBTNode *unit; BzBTNode *unitEvasive; } BTs; struct { BzObjectPool *pathData; BzObjectPool *btNode; BzObjectPool *btNodeState; } pools; struct { bool drawPath; bool drawEntityColliders; bool drawMapColliders; bool drawSpatialGrid; ecs_entity_t *inspecting; } debug; f32 elapsed; ecs_query_t *drawQuery; ecs_query_t *particles0Query; ecs_query_t *particles1Query; } Game; extern ecs_world_t *ECS; static void setScreen(Game *game, GameScreen newScreen) { SoundState *soundState = ecs_singleton_get_mut(ECS, SoundState); game->nextScreen = newScreen; switch (newScreen) { case SCREEN_GAME: case SCREEN_PAUSE_MENU: if (game->screen == SCREEN_MAIN_MENU) { soundsLoadMusicStream(soundState, "assets/music/mainloop.ogg"); soundsPlayMusicStream(soundState); } break; case SCREEN_MAIN_MENU: case SCREEN_SETTINGS: if (game->screen == SCREEN_GAME || game->screen == SCREEN_PAUSE_MENU) { soundsLoadMusicStream(soundState, "assets/music/title.ogg"); soundsPlayMusicStream(soundState); } break; } } extern ECS_COMPONENT_DECLARE(Game); // defined in main.c #endif //PIXELDEFENSE_GAME_STATE_H