#pragma once
#include "level.hpp"
#include "Layer.hpp"
#include "common/ini.hpp"
//! тестовый уровень
class Level_dummy: public Level {
protected:
  BankTex b_tex = {}; ///< банк текстур
  BankSprite b_spr = {}; ///< банк спрайтов
  vp_layer_t v_layers = {}; ///< слои тайлов
public:
  Level_dummy() = default;
  explicit Level_dummy(CN(a83::Str) fname)
    { _init(fname); }
  void init(CN(a83::Str) fname) override
    { _init(fname); }
  ~Level_dummy() { free(); }
  void free() {
    b_tex.free();
    b_spr.free();
    vp_delete(v_layers);
  }
  void print(Image& dst) override {
    for (cnauto layer: v_layers)
      if ( layer)
        layer->print(dst, b_tex, b_spr, Game::timer_anim);
  }
  void update(CN(Vec) motion) override {
    for (cnauto layer: v_layers)
      if ( layer)
        layer->move(motion);
  }
private:
  nocopy(Level_dummy);
  void _init(CN(a83::Str) fname) {
    using namespace a83;
    free();
    Level::init(fname);
    b_tex.init(2);
    b_tex[0].free(); // zero pic
    b_spr.init(4);
    b_spr[0].free(); // zero sprite
    Game::status |= GF_INAIR; // включение тряски игрока в воздухе
    // загрузка инфы из ini файла
    INI ini(file_name);
    cnauto DIR = get_filedir(file_name) + '/';
    Str tile_name;
    float speed;
    index_t id = 0;
    Sector* sector = nullptr;
    v_layers.resize(3, nullptr);
    #define MAKE_LAYER(NUM, IS_SPR) \
    tile_name = DIR + ini.getStr("tile_" #NUM, "tile", {}); \
    speed = ini.getFloat("tile_"#NUM, "speed", 1); \
    id = 1 + NUM; \
    if (IS_SPR) \
      b_spr[id].init(tile_name); \
    else \
      b_tex[id].init(tile_name); \
    sector = new SectorMono(id, IS_SPR); \
    v_layers[NUM] = new Layer(1, 1, 4); \
    v_layers[NUM]->bank_set(id, sector); \
    v_layers[NUM]->map_set(0, 0, id); \
    v_layers[NUM]->speed = speed; \
    v_layers[NUM]->flags |= LAYER_XlOOP | LAYER_YlOOP;  
    MAKE_LAYER(0, false); // layer 0 - нижний
    MAKE_LAYER(1, true); // layer 1 - свердний
    MAKE_LAYER(2, true); // layer 2 - верхний
    #undef MAKE_LAYER
    enemy_spawn();
  }
  //! расстановка вражин
  void enemy_spawn() {
    p_ene_sys->add(new Enemy_fighter_1({0, 150.0f}, 90.0f));
  }
};