#pragma once
#include "bank-sprite.hpp"
#include "bank-texture.hpp"
class Image;
//! текстурка сектора может быть с анимацией
struct Tile {
  int* pId = nullptr; //!< ссылка на текстуру из банка
  int count = 0; //!< число текстур в тайле
  bool masked = false; //!< если true, то текстуры ищутся в банке спрайтов
  int state = 0; //!< смещение текущего кадра анимации
  int delay = 1; //!< замедлитель анимации. Чем >, тем медленнее смена
  Tile() = default;
  explicit Tile(int id, bool msk = false, int cnt = 1, int st = 0, int del = 1);
  Tile(CN(Tile) val) { copy(val); }
  Tile& operator =(CN(Tile) val) { copy(val); return *this; }
  ~Tile();
  //! отобразить тайл
  void print(int x, int y, Image& dst, CN(BankTex) btex, CN(BankSprite) bspr,
    CN(int) anim_timer) const;
  //! задать идентификаторы кадров для анимированного спрайта
  void id_list(const int idArr[], int size);
  void copy(CN(Tile));
};
Tile::Tile(int id, bool msk, int cnt, int st, int del):
pId(new int[cnt]), count(cnt), masked(msk), 
state(st), delay(del) {
  IFERROR( !pId, "error tile ram init");
  pId[0] = id;
}
Tile::~Tile() { zdelete_arr(pId); }
void Tile::copy(CN(Tile) val) {
  masked = val.masked;
  count = val.count;
  state = val.state;
  delay = val.delay;
  if (val.pId) {
    pId = new int[count];
    memcpy(pId, val.pId, count * sizeof(int));
  }
}
void Tile::print(int x, int y, Image& dst, CN(BankTex) btex, CN(BankSprite) bspr,
CN(int) anim_timer) const {
  if ( !pId)
    return;
  int id; // id текстуры в банке
  if (count > 1) { // анимация
    const int i = (state + anim_timer / delay) % count;
    id = pId[i];
  }
  else
    id = *pId; // обычная текстура
  if (masked) // отображать спрайт
    bspr[id].print_mask_noffset(x, y, dst);
  else // отображать обычную текстуру
    btex[id].print(x, y, dst);
}
void Tile::id_list(const int idArr[], int size) {
  IFERROR( !pId, "tile is not initialized");
  IFERROR(size != count, "tile set id list error. size != count");
  for (int i = 0; i < size; ++i)
    pId[i] = idArr[i];
}