#pragma once
#include "a83/macro.hpp"
struct Phys;
//! эмитер дымовых шлейфов
template <class enity_t>
class Smoke {
public:
  using func_t = enity_t* (*)(CN(Phys));
  struct arg_t {
    float step = 0; ///< длина шага генерации
    func_t pf = 0; ///< ссыль на генератор частицы
  };
  Vec offset = {}; ///< смещение эмитера дыма от центра объекта
  Smoke() = default;
  ~Smoke() = default;
  Smoke(CN(arg_t) data_, CN(Vec) offset_={}) { init(data_, offset_); }
  void init(CN(arg_t) data_, CN(Vec) offset_={}) { data = data_; offset = offset_; }
  void disable() { data.pf = nullptr; }
  /** определяет когда создать частицу дыма в
   * зависимости от пройденного пути.
   * @details ret 1 if particle maked */
  bool operator()(Phys cur_phys);
private:
  arg_t data = {};
  enity_t* p_enity = 0; ///< последний соспавненный партикл
}; // Smoke
class Enity;
//! определения эмитеров дыма
namespace smoke_bank {
  #define MAKE(NAME, STEP, FUNC) \
  Enity* FUNC(CN(Phys) cur_phys); \
  struct Smoke<Enity>::arg_t NAME{.step = STEP, .pf = FUNC};
  MAKE(small, 9, make_small)
  MAKE(small2, 9, make_small2) ///< медленнее small
  MAKE(big, 13.5f, make_big)
  MAKE(big2, 13.5f, make_big2) ///< большой дым верхний
  MAKE(big_plr, 13.5f, make_big_plr) ///< прозрачный большой дым снизу
  MAKE(airbomber, 13.5f, make_airbomber)
  MAKE(flame, 15, make_flame)
  #undef MAKE
} // smoke_bank ns