Skip to content

Commit fad8b0f

Browse files
authored
Merge pull request #6 from cpp-gamedev/pokemon
Pokemon
2 parents 41a2859 + e0e549d commit fad8b0f

File tree

6 files changed

+131
-6
lines changed

6 files changed

+131
-6
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ out/
3535

3636
# Visual Studio 2015/2017 cache/options directory
3737
.vs/
38+
3839
# Uncomment if you have tasks that create the project's static files in wwwroot
3940
#wwwroot/
4041

src/main.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
#include <iostream>
22
#include <string>
3+
#include "models.hpp"
34
#include "utils.hpp"
4-
55
int main()
66
{
7-
auto name = get_user_input<std::string>("What's your name? ");
8-
std::cout << "Hello, " << name << '!' << '\n';
9-
std::cin.get();
7+
/* auto name = get_user_input<std::string>("What's your name? ");
8+
std::cout << "Hello, " << name << '!' << '\n';
9+
std::cin.get(); */
10+
1011
return 0;
1112
}

src/models.cpp

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
#include "models.hpp"
2+
#include <vector>
3+
#include "utils.hpp"
4+
5+
Move::Move(std::string move_name, const MoveTypes mt, const float accuracy, const int power)
6+
: m_move_name(std::move(move_name)), m_mt(mt), m_accuracy(accuracy), m_power(power)
7+
{
8+
}
9+
10+
Pokemon::Pokemon(std::string name, const std::int32_t level, const std::int32_t def, const std::int32_t attack, const Move next_move)
11+
: m_name(std::move(name)), m_level(level), m_hp(2 * m_level * random_range<float>(0.8, 1.2)), m_def(def), m_attack(attack), m_next_move(next_move)
12+
{
13+
}
14+
15+
Move Pokemon::make_move(Pokemon& source, Pokemon& target)
16+
{
17+
if ((random_range<int>(0, 100) <= source.m_next_move.m_accuracy) && source.m_hp > 0 && target.m_hp > 0)
18+
{
19+
switch (source.m_next_move.m_mt)
20+
{
21+
case MoveTypes::ATTACK:
22+
return attack(source, target);
23+
case MoveTypes::DEFEND:
24+
return defend(source);
25+
26+
case MoveTypes::HEAL:
27+
return heal(source);
28+
29+
case MoveTypes::NONE:
30+
return source.m_next_move;
31+
}
32+
}
33+
34+
return Move("Failed", MoveTypes::NONE, 100, 0);
35+
}
36+
37+
Move Pokemon::attack(Pokemon& source, Pokemon& target)
38+
{
39+
40+
if (target.m_hp > 0)
41+
{
42+
int attack = source.m_attack;
43+
if (random_range<int>(random_range<int>(1, 20), 100))
44+
{
45+
attack *= 2; // crit damage
46+
}
47+
/* (2 * Level / 5+2) * Attack * Power) / Defense) / 50) + 2) * random number(217-255)) / 255
48+
damage formula https://www.math.miami.edu/~jam/azure/compendium/battdam.htm*/
49+
int damage = ((((((2 * source.m_level / 5 + 2) * attack * source.m_next_move.m_power) / target.m_def) / 50) + 2) * random_range<int>(217, 255)) / 255;
50+
target.m_hp -= damage;
51+
52+
return source.m_next_move;
53+
}
54+
return Move("Failed", MoveTypes::NONE, 100, 0);
55+
}
56+
57+
Move Pokemon::defend(Pokemon& source)
58+
{
59+
60+
int defense_increase = source.m_next_move.m_power * random_range<float>(0.1, 0.3);
61+
source.m_def += defense_increase;
62+
return source.m_next_move;
63+
}
64+
65+
Move Pokemon::heal(Pokemon& source)
66+
{
67+
68+
int health_increase = source.m_next_move.m_power * random_range<float>(0.1, 0.5);
69+
if (source.m_hp + health_increase > source.m_max_hp)
70+
{
71+
source.m_hp = source.m_max_hp;
72+
}
73+
else
74+
{
75+
source.m_hp += health_increase;
76+
}
77+
return source.m_next_move;
78+
}

src/models.hpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#pragma once
2+
3+
#include <random>
4+
#include <vector>
5+
#include "utils.hpp"
6+
7+
enum class MoveTypes
8+
{
9+
NONE, // move failed or wasn't initialized
10+
ATTACK, // deals damage
11+
DEFEND, // increase pokemon defense
12+
HEAL, // Increase pokemon health or remove status effects
13+
};
14+
15+
struct Move
16+
{
17+
std::string m_move_name;
18+
MoveTypes m_mt;
19+
float m_accuracy;
20+
int m_power;
21+
Move() = default;
22+
Move(std::string move_name, MoveTypes mt, float accuracy, int power);
23+
};
24+
25+
struct Pokemon
26+
{
27+
std::string m_name;
28+
29+
std::int32_t m_level = 1;
30+
std::int32_t m_hp = 4 * m_level * random_range(0.8, 1.2);
31+
std::int32_t m_max_hp = m_hp;
32+
std::int32_t m_def{};
33+
std::int32_t m_attack{};
34+
35+
std::vector<Move> m_moveset;
36+
Move m_next_move = Move("None", MoveTypes::NONE, 100, 0);
37+
38+
Pokemon() = default; // default constructor can be compiler generated since you are using default member initialization
39+
Pokemon(std::string Name, int level, int def, int attack, Move next_move);
40+
Move make_move(Pokemon& source, Pokemon& target);
41+
Move attack(Pokemon& source, Pokemon& target);
42+
Move defend(Pokemon& source);
43+
Move heal(Pokemon& source);
44+
};

src/utils.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
#include <algorithm>
22
#include <chrono>
33
#include <iostream>
4+
#include <random>
45
#include <string>
56
#include <thread>
6-
77
#include "str_format.hpp"
88

99
void clear_screen()

src/utils.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#pragma once
22

33
#include <algorithm>
4+
#include <iostream>
45
#include <random>
56
#include <type_traits>
67
#include <vector>
@@ -9,7 +10,7 @@ template <typename T>
910
T random_range(T min, T max)
1011
{
1112
// in range of [min, max]
12-
static std::default_random_engine eng{ std::random_device{}() };
13+
static std::default_random_engine eng{std::random_device{}()};
1314
if constexpr (std::is_integral_v<T>)
1415
{
1516
std::uniform_int_distribution<T> dist(min, max);

0 commit comments

Comments
 (0)