#pragma once

typedef struct Assets assets_t;
typedef struct Game game_t;

#include "entity.h"
#include "player.h"
#include "tile.h"
#include "menu.h"
#include "level.h"
#include "effect.h"
#include "door.h"

#define GAME_SCEEN_TIMER 150
#define GAME_MUSIC_VOLUME 0.7f
#define GAME_SOUND_VOLUME 1.0f

typedef enum {
  STATE_MENU,
  STATE_GAME,
} state_e;

struct Assets {
  Texture2D tiles;
  Texture2D entities;
  Texture2D font;
  Texture2D images;
  Texture2D background;
  Sound track;
  Sound win;
  Sound lose;
  Sound locked;
};

struct Game {
  state_e state;
  level_t *level;
  bool quit;
  bool defeat;
  bool victory;
  menu_t *menu;
  player_t *player;
  tile_t **tiles;
  int tiles_len;
  entity_t *entities;
  int entities_len;
  effect_t **effects;
  int effects_len;
  assets_t assets;
  Camera2D camera;
  int xp;
  int sceen_timer;
  door_t *door;
  RenderTexture2D overlay;
  bool is_muted;
};

game_t *game_create(void);
void game_update(game_t *game);
void game_draw(game_t *game);
void game_free(game_t *game);
