Lamthai/game/logic/combat.cpp

194 lines
6.4 KiB
C++

#include <iostream>
#include <vector>
#include "../define.h"
#include "utilities.h"
#include "player.h"
#include "ennemy.h"
#include "spells.h"
#include "../interface/interfaces.h"
#include "../interface/combat_interface.h"
#include "combat.h"
const int BUTTON_BOOK_SPELL = KEY_B;
const int BUTTON_CAST_SPELL = KEY_C;
const int BUTTON_INVENTORY = KEY_I;
const int BUTTON_ESCAPE = KEY_E;
const int BUTTON_UP = KEY_UP;
const int BUTTON_DOWN = KEY_DOWN;
const int BUTTON_RIGHT = KEY_RIGHT;
const int BUTTON_LEFT = KEY_LEFT;
const int BUTTON_CONFIRM_SPELL = KEY_ENTER;
const int BUTTON_FIRST_ENNEMI = KEY_KP_1;
const int BUTTON_SECOND_ENNEMI = KEY_KP_2;
const int BUTTON_THIRD_ENNEMI = KEY_KP_3;
const int BUTTON_FOURTH_ENNEMI = KEY_KP_4;
void init_combat(Player& player_arg, std::vector<Ennemy> ennemies_arg, const std::vector<float>& screen_arg) {
std::vector<Ennemy> combat_ennemies;
combat_ennemies.push_back(ennemies_arg[0]);
std::vector<Ennemy_stats> ennemies_stats;
Player_stats player_stats;
create_combat_interface(player_arg, combat_ennemies, screen_arg, ennemies_stats, player_stats);
combat(player_arg, player_stats, combat_ennemies, ennemies_stats);
}
void combat(Player& player_arg, Player_stats& player_stats_arg, std::vector<Ennemy>& ennemies_arg, std::vector<Ennemy_stats>& ennemies_stats_arg) {
bool combat_loop = 1;
while (combat_loop) {
inc_speed(player_arg, -1);
if (player_arg.speed == 0) {
player_turn(player_arg, player_stats_arg, ennemies_arg, ennemies_stats_arg, combat_loop);
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) {
display_combat_interface(player_arg, player_stats_arg, ennemies_arg, ennemies_stats_arg);
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) {
std::cout << "You are dead" << std::endl;
combat_loop = 0;
}
int i = 0;
for(Ennemy& ennemy: ennemies_arg) {
if (ennemy.health == 0) {
std::cout << ennemy.name << " is dead" << std::endl;
ennemies_arg.erase(ennemies_arg.begin() + i);
}
i++;
}
if (ennemies_arg.empty()) {
std::cout << "You won" << std::endl;
combat_loop = 0;
}
}
void player_turn(Player& player_arg, Player_stats& player_stats_arg, std::vector<Ennemy>& ennemies_arg, std::vector<Ennemy_stats>& ennemies_stats_arg, bool& combat_loop_arg) {
bool take_action = 1;
while (take_action) {
display_combat_interface(player_arg, player_stats_arg, ennemies_arg, ennemies_stats_arg);
if(IsKeyPressed(BUTTON_BOOK_SPELL)) {
print_spell_book(player_arg.spell_book);
take_action = 0;
} else if (IsKeyPressed(BUTTON_CAST_SPELL)) {
attack(player_arg, player_stats_arg, ennemies_arg, ennemies_stats_arg);
take_action = 0;
} else if (IsKeyPressed(BUTTON_INVENTORY)) {
take_action = 0;
} else if (IsKeyPressed(BUTTON_ESCAPE)) {
if(escape(player_arg, ennemies_arg)) {
std::cout << "Escape succesfully" << std::endl;
combat_loop_arg = 0;
} else {
std::cout << "Escape not succesfully" << std::endl;
}
take_action = 0;
}
}
}
void casting_spell(Player& player_arg, Player_stats& player_stats_arg, std::vector<Ennemy>& ennemies_arg, std::vector<Ennemy_stats>& ennemies_stats_arg) {
std::vector<int> spell;
int spell_segment;
bool is_casting_spell = 1;
while(is_casting_spell) {
display_combat_interface(player_arg, player_stats_arg, ennemies_arg, ennemies_stats_arg);
if (IsKeyPressed(BUTTON_UP)) {
if (cast_spell(player_arg, player_stats_arg, spell, UP, ennemies_arg, ennemies_stats_arg)) {
is_casting_spell = 0;
}
} else if (IsKeyPressed(BUTTON_DOWN)) {
if (cast_spell(player_arg, player_stats_arg, spell, DOWN, ennemies_arg, ennemies_stats_arg)) {
is_casting_spell = 0;
}
} else if (IsKeyPressed(BUTTON_RIGHT)) {
if (cast_spell(player_arg, player_stats_arg, spell, RIGHT, ennemies_arg, ennemies_stats_arg)) {
is_casting_spell = 0;
}
} else if (IsKeyPressed(BUTTON_LEFT)) {
if (cast_spell(player_arg, player_stats_arg, spell, LEFT, ennemies_arg, ennemies_stats_arg)) {
is_casting_spell = 0;
}
} else if (IsKeyPressed(BUTTON_CONFIRM_SPELL)) {
if (cast_spell(player_arg, player_stats_arg, spell, END_SPELL, ennemies_arg, ennemies_stats_arg)) {
is_casting_spell = 0;
}
}
}
}
Ennemy& choose_target(Player& player_arg, Player_stats& player_stats_arg, std::vector<Ennemy>& ennemies_arg, std::vector<Ennemy_stats>& ennemies_stats_arg) {
std::cout << "Selecting target ennemi" << std::endl;
int arg;
bool selecting_ennemi = 1;
while(selecting_ennemi) {
display_combat_interface(player_arg, player_stats_arg, ennemies_arg, ennemies_stats_arg);
if (IsKeyPressed(BUTTON_FIRST_ENNEMI)) {
std::cout << "NUMPAD1" << std::endl;
if (ennemies_arg.size() >= 1) {
arg = 0;
selecting_ennemi = 0;
}
} else if (IsKeyPressed(BUTTON_SECOND_ENNEMI)) {
std::cout << "NUMPAD1" << std::endl;
if (ennemies_arg.size() >= 2) {
arg = 1;
selecting_ennemi = 0;
}
} else if (IsKeyPressed(BUTTON_THIRD_ENNEMI)) {
std::cout << "NUMPAD1" << std::endl;
if (ennemies_arg.size() >= 3) {
arg = 2;
selecting_ennemi = 0;
}
} else if (IsKeyPressed(BUTTON_FOURTH_ENNEMI)) {
std::cout << "NUMPAD1" << std::endl;
if (ennemies_arg.size() >= 4) {
arg = 3;
selecting_ennemi = 0;
}
}
}
std::cout << ennemies_arg[arg].name << " is selected" << std::endl;
return ennemies_arg[arg];
}
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, Player_stats& player_stats_arg, std::vector<Ennemy>& ennemies_arg, std::vector<Ennemy_stats>& ennemies_stats_arg){
if(player_arg.job == MAGE) {
casting_spell(player_arg, player_stats_arg, ennemies_arg, ennemies_stats_arg);
}
}
bool 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);
}