143 lines
3.1 KiB
C
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
|