#pragma once
#include "game-input.hpp"
#include "game-event.hpp"
#include "game-const.hpp"
#include "font/font.hpp"
#include "scene/scene-state.hpp"
#include "diffculty.hpp"
#include "resize.hpp"
#include <stack>
#include <atomic>
// флаги управления игрой:
constexpr uint GF_INAIR = 1 << 0; ///<игрок в атмосфере
constexpr uint GF_HIGH_DETAILED = 1 << 1; ///< множество граф-х деталей
constexpr uint GF_PRINT_FPS = 1 << 2; ///< показывать FPS. Key F1
constexpr uint GF_FULLSCREEN = 1 << 3; ///< вкл/выкл полный экран
constexpr uint GF_VSYNC = 1 << 4; ///< опция верт. синхр-и в игре
constexpr uint GF_VLAGS = 1 << 5; ///< if 1, visual lag
constexpr uint GF_NORENDER = 1 << 6; ///< if 1, disable rendering
constexpr uint GF_DRAW_HAZE = 1 << 7; ///< рисовать марево
constexpr uint GF_DRAW_LIGHT = 1 << 8; ///< рисовать вспышки
constexpr uint GF_BLINK_OPTMZ = 1 << 9; ///< использовать оптимизацию миганием
namespace Game {
  std::atomic_bool gameover = true; ///< если 1, то из игры надо выйти
  constx std::intmax_t UPS = 60; ///< game updates per second 
  constx int FPS_PREC = 2;
  constx std::intmax_t FPS = 60; ///< ограничитель FPS при VSync
  constx std::intmax_t BAD_FPS = 54; ///< значение, ниже которго включается оптимизация
  int64_t host_loop_mcs = 0; ///< time one frame
  //! 4 fps calc func
  constx int64_t bad_frame_mcs = 1000000 / BAD_FPS;
  ResizeCtx wnd = {}; ///< параметры масштабирования окна игры
  int frame_skip = 0; ///< if > 0, drop frame
  float fps_min = num_max(float);
  float fps_max = 0;
  float fps = 0;
  float cur_dt = 0; ///< delta time
  Image screen = {}; ///< экранный буффер игры
  a83::Str current_dir = {}; ///< текущая директория запуска
  Input input = {}; ///< нажатия кнопок получают от платформы
  Input input_prev = {}; ///< состояние кнопок в предыдушем тике
  Font *font = 0; ///< основной шрифт
  Difficulty difficulty = Difficulty::NORMAL; ///< ур. слож.
  uint timer_anim = 0;
  float game_time = 0;
  std::stack<scene_st> scene_state = {}; ///< управление сценами
  std::stack<Event> events = {}; ///< сюда игра кидает вызовы в платформу
  uint status = 0; ///< флаги игры
  //! проверка нажатия клавиши в меню
  bool menu_press(InputReg key)
    { return input.test(key) && !input_prev.test(key); }
} // Game ns