110 lines
2.8 KiB
C++
110 lines
2.8 KiB
C++
#include <iostream>
|
|
#include <vector>
|
|
#include "structs.h"
|
|
#include "utilities.h"
|
|
#include "player.h"
|
|
#include "ennemy.h"
|
|
#include "spells.h"
|
|
#include "interfaces.h"
|
|
#include "combat.h"
|
|
|
|
void init_combat(Player& player_arg, std::vector<Ennemy> ennemies_arg) {
|
|
std::vector<Ennemy> ennemies;
|
|
ennemies.push_back(ennemies_arg[1]);
|
|
ennemies.push_back(ennemies_arg[2]);
|
|
|
|
combat(player_arg, ennemies);
|
|
}
|
|
|
|
void combat(Player& player_arg, std::vector<Ennemy>& ennemies_arg) {
|
|
int arg;
|
|
bool combat_loop = 1;
|
|
while (combat_loop) {
|
|
inc_speed(player_arg, -1);
|
|
if (player_arg.speed == 0) {
|
|
player_turn(player_arg, ennemies_arg, combat_loop, arg);
|
|
check_deads(player_arg, ennemies_arg, combat_loop);
|
|
init_speed(player_arg);
|
|
}
|
|
for (Ennemy& ennemy: ennemies_arg) {
|
|
inc_speed(ennemy, -1);
|
|
if (ennemy.speed == 0) {
|
|
ennemy_turn(player_arg, ennemy);
|
|
check_deads(player_arg, ennemies_arg, combat_loop);
|
|
init_speed(ennemy);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
void check_deads(Player& player_arg, std::vector<Ennemy>& ennemies_arg, bool& combat_loop) {
|
|
if (player_arg.health == 0) {
|
|
combat_loop = 0;
|
|
}
|
|
int i = 0;
|
|
for(Ennemy& ennemy: ennemies_arg) {
|
|
if (ennemy.health == 0) {
|
|
ennemies_arg.erase(ennemies_arg.begin() + i);
|
|
}
|
|
i++;
|
|
}
|
|
}
|
|
|
|
void player_turn(Player& player_arg, std::vector<Ennemy>& ennemies_arg, bool& combat_loop_arg, int& arg) {
|
|
display_combat_menu(player_arg, ennemies_arg);
|
|
std::cin >> arg;
|
|
select_combat_action(arg, player_arg, combat_loop_arg, ennemies_arg);
|
|
}
|
|
|
|
void select_combat_action(int arg, Player& player_arg, bool& combat_loop_arg, std::vector<Ennemy>& ennemies_arg) {
|
|
switch (arg){
|
|
case 1:
|
|
print_spell_book(player_arg.spell_book);
|
|
break;
|
|
case 2:
|
|
attack(player_arg, ennemies_arg);
|
|
break;
|
|
case 3:
|
|
if(player_escape(player_arg, ennemies_arg)) {
|
|
std::cout << "Escape succesfully" << std::endl;
|
|
combat_loop_arg = 0;
|
|
} else {
|
|
std::cout << "Escape not succesfully" << std::endl;
|
|
}
|
|
break;
|
|
default:
|
|
combat_loop_arg = 0;
|
|
break;
|
|
}
|
|
}
|
|
|
|
Spell choose_spell(const Ennemy& ennemy_arg) {
|
|
std::vector<int> spells(ennemy_arg.spells.size());
|
|
int i = random_choice(spells);
|
|
return ennemy_arg.spells[i];
|
|
}
|
|
|
|
void ennemy_turn(Player& player_arg, Ennemy& ennemy_arg) {
|
|
display_ennemi_turn(ennemy_arg);
|
|
Spell spell = choose_spell(ennemy_arg);
|
|
ennemy_use_spell(spell, player_arg, ennemy_arg);
|
|
}
|
|
|
|
void attack(Player& player_arg, std::vector<Ennemy>& ennemies_arg){
|
|
if(player_arg.job == 0) {
|
|
casting_spell(player_arg, ennemies_arg);
|
|
}
|
|
}
|
|
|
|
bool player_escape(const Player& player_arg, std::vector<Ennemy>& ennemies_arg) {
|
|
float min = 1;
|
|
for(Ennemy& ennemy: ennemies_arg) {
|
|
if(ennemy.menace < min) {
|
|
min = ennemy.menace;
|
|
}
|
|
}
|
|
return random_success(player_arg.escape * min);
|
|
}
|
|
|
|
bool escape(const Ennemy& ennemy_arg) {
|
|
return random_success(ennemy_arg.escape);
|
|
} |