#pragma once
#include "a83/string-util.hpp"
#include "a83/path.hpp"
#include "point.hpp"
#include "Cord.hpp"
struct Phys;
//! база для уровней
class Level {
protected:
  a83::Str file_name = {}; ///< назвыание файла с уровнем
public:
  Level() = default;
  virtual ~Level() { };
  virtual void init(CN(a83::Str) fname) { 
    IFERROR(fname.empty(), "level file name is empty");
    auto fname_ = fname;
    a83::convSep(fname_);
    file_name = fname_;
    Game::game_time = 0;
  }
  virtual void print_d(Image& dst) { (void)dst; };
  virtual void print_u(Image& dst) { (void)dst; };
  virtual void update(CN(Phys) motion_offset, float dt) {
    (void)motion_offset;
    (void)dt;
  }
  //! перезапуск уровня
  void reset() { init(file_name); }
  //! сохранение уровня в файл
  virtual void save(CN(a83::Str) fname) { (void)fname; }
  //! преобразует корды объекта в пиксели экрана относительно камеры
  Point pos2pix(CN(Cord) cam, Cord pos) {
    pos -= cam;
    pos.fix();
    return {
      pos.xs * Sector::XP + int(pos.x),
      pos.ys * Sector::YP + int(pos.y) };
  }
private:
  nocopy(Level);
}; // Level
namespace { Level *p_level = nullptr; }