Files
PixelDefense/game/game_state.h

143 lines
3.1 KiB
C

#ifndef PIXELDEFENSE_GAME_STATE_H
#define PIXELDEFENSE_GAME_STATE_H
#include <breeze.h>
#include <flecs.h>
#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