Peoplemon  0.1.0
Peoplemon 3 game source documentation
Stats.hpp
Go to the documentation of this file.
1 #ifndef CORE_PEOPLEMON_STATS_HPP
2 #define CORE_PEOPLEMON_STATS_HPP
3 
4 #include <BLIB/Serialization.hpp>
6 #include <array>
7 
8 namespace core
9 {
10 namespace pplmn
11 {
19 struct Stats {
20  int hp;
21  int atk;
22  int def;
23  int spatk;
24  int spdef;
25  int spd;
26 
31  Stats();
32 
39  Stats(Stat stat, int points);
40 
46  int sum() const;
47 
52  void randomize();
53 
60  void addEVs(const Stats& evs);
61 
66  int& get(Stat stat);
67 
72  int get(Stat stat) const;
73 
80  static float stageMultiplier(int stage);
81 
92  static Stats computeStats(const Stats& base, const Stats& evs, const Stats& ivs,
93  unsigned int level, const Stats& stages = {});
94 
101  static const char* statToString(Stat stat);
102 
104  static const std::array<Stat, 6> IterableStats;
105 
107  static constexpr int MaxEVSum = 510;
108 
110  static constexpr int MaxEVStat = 255;
111 
113  static constexpr int MaxIVStat = 31;
114 };
115 
116 } // namespace pplmn
117 } // namespace core
118 
119 namespace bl
120 {
121 namespace serial
122 {
123 namespace binary
124 {
125 using core::pplmn::Stats;
126 
127 template<>
128 struct Serializer<Stats> {
129  static bool serialize(OutputStream& output, const Stats& v) {
130  if (!output.write<std::int16_t>(v.hp)) return false;
131  if (!output.write<std::int16_t>(v.atk)) return false;
132  if (!output.write<std::int16_t>(v.def)) return false;
133  if (!output.write<std::int16_t>(v.spatk)) return false;
134  if (!output.write<std::int16_t>(v.spdef)) return false;
135  if (!output.write<std::int16_t>(v.spd)) return false;
136  return true;
137  }
138 
139  static bool deserialize(InputStream& input, Stats& v) {
140  std::int16_t val = 0;
141  if (!input.read<std::int16_t>(val)) return false;
142  v.hp = val;
143  if (!input.read<std::int16_t>(val)) return false;
144  v.atk = val;
145  if (!input.read<std::int16_t>(val)) return false;
146  v.def = val;
147  if (!input.read<std::int16_t>(val)) return false;
148  v.spatk = val;
149  if (!input.read<std::int16_t>(val)) return false;
150  v.spdef = val;
151  if (!input.read<std::int16_t>(val)) return false;
152  v.spd = val;
153  return true;
154  }
155 
156  static std::size_t size(const Stats&) { return sizeof(std::int16_t) * 6; }
157 };
158 
159 } // namespace binary
160 
161 template<>
162 struct SerializableObject<core::pplmn::Stats> : public SerializableObjectBase {
164 
165  SerializableField<1, Stats, int> hp;
166  SerializableField<2, Stats, int> atk;
167  SerializableField<3, Stats, int> def;
168  SerializableField<4, Stats, int> spd;
169  SerializableField<5, Stats, int> spatk;
170  SerializableField<6, Stats, int> spdef;
171 
173  : SerializableObjectBase("Stats")
174  , hp("hp", *this, &Stats::hp, SerializableFieldBase::Required{})
175  , atk("atk", *this, &Stats::atk, SerializableFieldBase::Required{})
176  , def("def", *this, &Stats::def, SerializableFieldBase::Required{})
177  , spd("spd", *this, &Stats::spd, SerializableFieldBase::Required{})
178  , spatk("spatk", *this, &Stats::spatk, SerializableFieldBase::Required{})
179  , spdef("spdef", *this, &Stats::spdef, SerializableFieldBase::Required{}) {}
180 };
181 
182 } // namespace serial
183 } // namespace bl
184 
185 #endif
std::uint32_t base
Definition: WildIntro.cpp:26
Stat
Represents a single stat. Used as an offset to access Stats as an array.
Definition: Stat.hpp:16
Core classes and functionality for both the editor and game.
bl::serial::json::Serializer< Player > Serializer
Definition: Player.cpp:27
Stats for Peoplemon. This struct is used for base stats, EVs, IVs, battle increases/decreases,...
Definition: Stats.hpp:19
void randomize()
Generates random IV stats.
Definition: Stats.cpp:27
static constexpr int MaxEVStat
The maximum amount that a single EV can be.
Definition: Stats.hpp:110
Stats()
Initializes all members to 0.
Definition: Stats.cpp:12
static constexpr int MaxIVStat
The maximum amount that a single IV can be.
Definition: Stats.hpp:113
int & get(Stat stat)
Returns a reference to the given stat.
Definition: Stats.cpp:39
static const std::array< Stat, 6 > IterableStats
Helper array to iterate over stats in loop.
Definition: Stats.hpp:104
static float stageMultiplier(int stage)
Returns the multiplier for a given stat increase/decrease.
Definition: Stats.cpp:66
static Stats computeStats(const Stats &base, const Stats &evs, const Stats &ivs, unsigned int level, const Stats &stages={})
Helper method to compute a Peoplemon's current stats.
Definition: Stats.cpp:49
void addEVs(const Stats &evs)
Adds the given EV points to this set of stats while obeying the constraints on EV values and sums.
Definition: Stats.cpp:31
static const char * statToString(Stat stat)
Converts the given stat to its string representation.
Definition: Stats.cpp:74
static constexpr int MaxEVSum
The maximum amount that EVs or IVs can sum to.
Definition: Stats.hpp:107
int sum() const
Returns the sum of the 6 stats that are used for EV calculations.
Definition: Stats.cpp:25
static std::size_t size(const Stats &)
Definition: Stats.hpp:156
static bool serialize(OutputStream &output, const Stats &v)
Definition: Stats.hpp:129
static bool deserialize(InputStream &input, Stats &v)
Definition: Stats.hpp:139
SerializableField< 1, Stats, int > hp
Definition: Stats.hpp:165
SerializableField< 4, Stats, int > spd
Definition: Stats.hpp:168
SerializableField< 2, Stats, int > atk
Definition: Stats.hpp:166
SerializableField< 6, Stats, int > spdef
Definition: Stats.hpp:170
SerializableField< 5, Stats, int > spatk
Definition: Stats.hpp:169
SerializableField< 3, Stats, int > def
Definition: Stats.hpp:167