Horizon Official Technical Documentation
Horizon::Zone::Traits::PeriodicChanges Class Reference

#include <Attribute.hpp>

+ Collaboration diagram for Horizon::Zone::Traits::PeriodicChanges:

Classes

struct  s_periodic_change
 

Public Member Functions

 PeriodicChanges (Attribute *attr)
 
void add_change (s_attribute_change_values change, uint64_t duration, uint64_t interval, std::string source)
 
void remove_change (std::string source)
 
void update (uint64_t delta)
 

Private Attributes

std::vector< s_periodic_change_changes
 
Attribute_attr
 

Constructor & Destructor Documentation

◆ PeriodicChanges()

Horizon::Zone::Traits::PeriodicChanges::PeriodicChanges ( Attribute attr)
inline
209: _attr(attr) {}
Attribute * _attr
Definition: Attribute.hpp:229

Member Function Documentation

◆ add_change()

void PeriodicChanges::add_change ( s_attribute_change_values  change,
uint64_t  duration,
uint64_t  interval,
std::string  source 
)
146{
147 _changes.push_back({ change, duration, interval, source });
148}
std::vector< s_periodic_change > _changes
Definition: Attribute.hpp:228

Referenced by Horizon::Zone::Traits::Attribute::add_periodic_change().

+ Here is the caller graph for this function:

◆ remove_change()

void PeriodicChanges::remove_change ( std::string  source)
151{
152 _changes.erase(std::remove_if(_changes.begin(), _changes.end(), [source](s_periodic_change const &change) { return change.source == source; }), _changes.end());
153}

Referenced by Horizon::Zone::Traits::Attribute::remove_periodic_change().

+ Here is the caller graph for this function:

◆ update()

void PeriodicChanges::update ( uint64_t  delta)
156{
157 for (auto &change : _changes)
158 {
159 if (change.duration && std::chrono::duration_cast<std::chrono::milliseconds>(change.start_time.time_since_epoch() + std::chrono::milliseconds(change.duration)).count() < delta)
160 {
161 remove_change(change.source);
162 continue;
163 }
164
165 // Temporary changes are applied to the base attribute which is first calculated via the compute() function where set_base is called to set the initial value.
166 // Post the initial value, the temporary changes are applied to the base value of the attribute.
167 // The base value is again reset if compute is called, so we don't use compute() in this function as it is not required.
168 if (std::chrono::duration_cast<std::chrono::milliseconds>(change.last_update.time_since_epoch() + std::chrono::milliseconds(change.interval)).count() < delta)
169 {
170 std::function<bool(int, int, int)> over_min = [](int attr, int change, int min) { return (attr - change) < min; };
171 std::function<bool(int, int, int)> over_max = [](int attr, int change, int max) { return (attr + change) > max; };
172
173 if (_attr->unit() && _attr->unit()->is_dead() == true)
174 return;
175
176 change.change.update_with_live_attribute();
177
178 bool changed = false;
179 if (change.change.get_base() > 0) {
180 if (!over_max(_attr->get_base(), change.change.get_base(), change.change.get_max())) {
181 _attr->add_base(change.change.get_base(), false);
182 changed = true;
183 } else {
184 _attr->add_base(change.change.get_max() - _attr->get_base(), false);
185 changed = (change.change.get_max() - _attr->get_base() > 0);
186 }
187 }
188 else if (change.change.get_base() < 0) {
189 if (!over_min(_attr->get_base(), change.change.get_base(), change.change.get_min())) {
190 _attr->sub_base(change.change.get_base(), false);
191 changed = true;
192 } else {
193 _attr->sub_base(_attr->get_base() - change.change.get_min(), false);
194 changed = (_attr->get_base() - change.change.get_min() > 0);
195 }
196 }
197
198 if (change.change.get_equip() > 0) {
199 if (!over_max(_attr->get_equip(), change.change.get_equip(), change.change.get_max())) {
200 _attr->add_equip(change.change.get_equip(), false);
201 changed = true;
202 } else {
203 _attr->add_equip(change.change.get_max() - _attr->get_equip(), false);
204 changed = (change.change.get_max() - _attr->get_equip()) > 0;
205 }
206 }
207 else if (change.change.get_equip() < 0) {
208 if (!over_min(_attr->get_equip(), change.change.get_equip(), change.change.get_min())) {
209 _attr->sub_equip(change.change.get_equip(), false);
210 changed = true;
211 } else {
212 _attr->sub_equip(_attr->get_equip() - change.change.get_min(), false);
213 changed = (_attr->get_equip() - change.change.get_min()) > 0;
214 }
215 }
216
217 if (change.change.get_status() > 0) {
218 if (!over_max(_attr->get_status(), change.change.get_status(), change.change.get_max())) {
219 _attr->add_status(change.change.get_status(), false);
220 changed = true;
221 } else {
222 _attr->add_status(change.change.get_max() - _attr->get_status(), false);
223 changed = (change.change.get_max() - _attr->get_status()) > 0;
224 }
225 }
226 else if (change.change.get_status() < 0) {
227 if (!over_min(_attr->get_status(), change.change.get_status(), change.change.get_min())) {
228 _attr->sub_status(change.change.get_status(), false);
229 changed = true;
230 } else {
231 _attr->sub_status(_attr->get_status() - change.change.get_min(), false);
232 changed = (_attr->get_status() - change.change.get_min()) > 0;
233 }
234 }
235
236 if (changed)
237 change.change.client_notify_function(change.change);
238
239 change.last_update = std::chrono::high_resolution_clock::now();
240 }
241 }
242}
virtual void sub_equip(int32_t val, bool notify=true)
Definition: Attribute.cpp:256
virtual void sub_status(int32_t val, bool notify=true)
Definition: Attribute.cpp:264
virtual void add_base(int32_t val, bool notify=true)
Definition: Attribute.cpp:244
virtual int32_t get_equip() const
Definition: Attribute.hpp:278
std::shared_ptr< Unit > unit()
Definition: Attribute.hpp:259
virtual void sub_base(int32_t val, bool notify=true)
Definition: Attribute.cpp:248
virtual int32_t get_status() const
Definition: Attribute.hpp:287
virtual void add_equip(int32_t val, bool notify=true)
Definition: Attribute.cpp:252
virtual int32_t get_base() const
Definition: Attribute.hpp:269
virtual void add_status(int32_t val, bool notify=true)
Definition: Attribute.cpp:260
void remove_change(std::string source)
Definition: Attribute.cpp:150

Referenced by Horizon::Zone::Traits::Attribute::update().

+ Here is the caller graph for this function:

Member Data Documentation

◆ _attr

Attribute* Horizon::Zone::Traits::PeriodicChanges::_attr
private

◆ _changes

std::vector<s_periodic_change> Horizon::Zone::Traits::PeriodicChanges::_changes
private

The documentation for this class was generated from the following files: