#pragma once
#include "image/image.hpp"
#include "Vec.hpp"
#include "Counter.hpp"
constexpr uint HF_LENDOWN = 1 << 0;
//! частица вызывающая марево
struct Haze {
  Counter delay = {};
  int cnt = 0; ///< число копируемых областей
  int len = 0; ///< растояние копирования
  int sz = 0; ///< размер копируемой области
  float r = 0; ///< радиус эффекта
  uint status = 0;
  Haze() = default;
  ~Haze() = default;
  Haze(CN(Haze)) = default;
  Haze& operator = (CN(Haze)) = default;
  Haze(float _delay, int _cnt,
  int _len, int _sz, float _r, uint flags = 0):
  delay(_delay), cnt(_cnt), len(_len), sz(_sz), r(_r), status(flags) {
    #ifdef DEBUG
    if (_delay < 0) a83::error("Haze: _delay < 0");
    if (_cnt <= 0) a83::error("Haze: _cnt <= 0");
    if (_r <= 0) a83::error("Haze: _r <= 0");
    if (_sz < 1) a83::error("Haze: _sz < 1");
    if (_len < 1) a83::error("Haze: _len < 1");
    #endif
  } // Haze()
  void clear() { *this = {}; }
  void update(float dt) { delay.update(dt); }
  void print(Image& dst, CN(Vec) offset) const {
    if ( !(Game::status & GF_DRAW_HAZE))
      return;
    if (delay()) // время вышло
      return;
    #ifdef DEBUG
    if ( !dst.check())
      return;
    #endif
    if (Game::status & GF_VLAGS) // мерцание при лагах
      if (Game::timer_anim & 1)
        return;
    if (delay())
      return;
    int len_ = len;
    if (status & HF_LENDOWN)
      len_ *= delay.get_ratio();
    dst.haze(offset, sz, len_, cnt, r);
  }
}; // Haze