19#include <fmt/format.h>
28#include <entt/entity/entity.hpp>
32#define CQSP_MODIFIER_TARGET_LIST \
33 X(ExpertiseGain, "expertise_gain") \
34 X(MaxExpertise, "max_expertise")
38#define X(name, str) name,
57template <ModifierOp Op = ModifierOp::Multiplicative>
65 std::vector<std::pair<entt::entity, double>>
modifiers;
69 [](
double acc,
const auto& m) { return acc + m.second; });
80 operator double()
const {
return value; }
87 requires std::is_arithmetic_v<T>
89 base =
static_cast<double>(
v);
99 requires std::is_arithmetic_v<T>
101 base +=
static_cast<double>(
v);
105 template <
typename T>
106 requires std::is_arithmetic_v<T>
108 base -=
static_cast<double>(
v);
112 template <
typename T>
113 requires std::is_arithmetic_v<T>
115 base *=
static_cast<double>(
v);
119 template <
typename T>
120 requires std::is_arithmetic_v<T>
122 base /=
static_cast<double>(
v);
127 template <
typename T>
128 requires std::is_arithmetic_v<T>
130 return value ==
static_cast<double>(
v);
132 template <
typename T>
133 requires std::is_arithmetic_v<T>
135 return value !=
static_cast<double>(
v);
137 template <
typename T>
138 requires std::is_arithmetic_v<T>
140 return value < static_cast<double>(
v);
142 template <
typename T>
143 requires std::is_arithmetic_v<T>
145 return value >
static_cast<double>(
v);
147 template <
typename T>
148 requires std::is_arithmetic_v<T>
150 return value <= static_cast<double>(
v);
152 template <
typename T>
153 requires std::is_arithmetic_v<T>
155 return value >=
static_cast<double>(
v);
158 template <
typename T>
159 requires std::is_arithmetic_v<T>
161 return lhs.
value +
static_cast<double>(rhs);
163 template <
typename T>
164 requires std::is_arithmetic_v<T>
166 return static_cast<double>(lhs) + rhs.
value;
168 template <
typename T>
169 requires std::is_arithmetic_v<T>
171 return lhs.
value -
static_cast<double>(rhs);
173 template <
typename T>
174 requires std::is_arithmetic_v<T>
176 return static_cast<double>(lhs) - rhs.
value;
178 template <
typename T>
179 requires std::is_arithmetic_v<T>
181 return lhs.
value *
static_cast<double>(rhs);
183 template <
typename T>
184 requires std::is_arithmetic_v<T>
186 return static_cast<double>(lhs) * rhs.
value;
188 template <
typename T>
189 requires std::is_arithmetic_v<T>
191 return lhs.
value /
static_cast<double>(rhs);
193 template <
typename T>
194 requires std::is_arithmetic_v<T>
196 return static_cast<double>(lhs) / rhs.
value;
214template <cqsp::core::components::ModifierOp Op>
215struct fmt::formatter<
cqsp::core::components::ModifiableValue<Op>> : fmt::formatter<double> {
216 template <
typename FormatContext>
218 return fmt::formatter<double>::format(
static_cast<double>(
v), ctx);
return v
Definition: bodies.h:193
std::string_view ModifierTargetToString(ModifierTarget t)
Definition: modifier.cpp:21
ModifiableValue< ModifierOp::Additive > AdditiveModifier
Definition: modifier.h:209
std::optional< ModifierTarget > ModifierTargetFromString(std::string_view s)
Definition: modifier.cpp:32
ModifiableValue< ModifierOp::Multiplicative > MultiplicativeModifier
Definition: modifier.h:210
ModifierOp
Definition: modifier.h:51
ModifierTarget
Definition: modifier.h:37
@ CQSP_MODIFIER_TARGET_LIST
Definition: clientctx.h:27
Definition: modifier.h:58
bool operator>=(T v) const
Definition: modifier.h:154
constexpr double _combine() const
Definition: modifier.h:200
friend double operator-(T lhs, ModifiableValue rhs)
Definition: modifier.h:175
friend double operator*(T lhs, ModifiableValue rhs)
Definition: modifier.h:185
double sum
Definition: modifier.h:62
bool operator!=(T v) const
Definition: modifier.h:134
ModifiableValue & operator*=(T v)
Definition: modifier.h:114
bool operator>(T v) const
Definition: modifier.h:144
ModifiableValue & operator+=(T v)
Definition: modifier.h:100
bool operator<(T v) const
Definition: modifier.h:139
static constexpr double identity
Definition: modifier.h:59
ModifiableValue(double v)
Definition: modifier.h:84
bool operator<=(T v) const
Definition: modifier.h:149
void recalculate()
Definition: modifier.h:67
double value
Definition: modifier.h:63
ModifiableValue()=default
friend double operator-(ModifiableValue lhs, T rhs)
Definition: modifier.h:170
friend double operator+(ModifiableValue lhs, T rhs)
Definition: modifier.h:160
bool operator==(T v) const
Definition: modifier.h:129
ModifiableValue & operator-=(T v)
Definition: modifier.h:107
std::vector< std::pair< entt::entity, double > > modifiers
Definition: modifier.h:65
friend double operator/(T lhs, ModifiableValue rhs)
Definition: modifier.h:195
ModifiableValue & operator/=(T v)
Definition: modifier.h:121
double base
Definition: modifier.h:61
friend double operator*(ModifiableValue lhs, T rhs)
Definition: modifier.h:180
friend double operator+(T lhs, ModifiableValue rhs)
Definition: modifier.h:165
friend double operator/(ModifiableValue lhs, T rhs)
Definition: modifier.h:190
ModifiableValue & operator=(T v)
Definition: modifier.h:88
Definition: modifier.h:46
ModifierTarget target
Definition: modifier.h:48
double amount
Definition: modifier.h:47