From 6b93b21afc7f2a9ae008b6a61cdac370304732f0 Mon Sep 17 00:00:00 2001 From: CaNaRdEoS Date: Sat, 12 Jul 2025 12:33:24 +0200 Subject: [PATCH] Mage combat back init --- game/Makefile | 22 ++++ game/combat.cpp | 110 ++++++++++++++++++ game/combat.h | 15 +++ game/ennemy.cpp | 82 ++++++++++++++ game/ennemy.h | 25 ++++ game/interfaces.cpp | 37 ++++++ game/interfaces.h | 5 + game/main.cpp | 40 +++++++ game/player.cpp | 78 +++++++++++++ game/player.h | 15 +++ game/release | Bin 0 -> 155152 bytes game/spells.cpp | 269 ++++++++++++++++++++++++++++++++++++++++++++ game/spells.h | 23 ++++ game/structs.h | 27 +++++ game/utilities.cpp | 17 +++ game/utilities.h | 3 + 16 files changed, 768 insertions(+) create mode 100644 game/Makefile create mode 100644 game/combat.cpp create mode 100644 game/combat.h create mode 100644 game/ennemy.cpp create mode 100644 game/ennemy.h create mode 100644 game/interfaces.cpp create mode 100644 game/interfaces.h create mode 100644 game/main.cpp create mode 100644 game/player.cpp create mode 100644 game/player.h create mode 100755 game/release create mode 100644 game/spells.cpp create mode 100644 game/spells.h create mode 100644 game/structs.h create mode 100644 game/utilities.cpp create mode 100644 game/utilities.h diff --git a/game/Makefile b/game/Makefile new file mode 100644 index 0000000..5aeb1cc --- /dev/null +++ b/game/Makefile @@ -0,0 +1,22 @@ +all: build run clean clear + +newrelease: release runrelease clear +play: runrelease clear + +build: + g++ main.cpp utilities.cpp player.cpp ennemy.cpp spells.cpp interfaces.cpp combat.cpp -o main + +release: + g++ main.cpp utilities.cpp player.cpp ennemy.cpp spells.cpp interfaces.cpp combat.cpp -o release + +runrelease: + ./release + +run: + ./main + +clean: + rm main + +clear: + clear \ No newline at end of file diff --git a/game/combat.cpp b/game/combat.cpp new file mode 100644 index 0000000..2b0be8a --- /dev/null +++ b/game/combat.cpp @@ -0,0 +1,110 @@ +#include +#include +#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 ennemies_arg) { + std::vector ennemies; + ennemies.push_back(ennemies_arg[1]); + ennemies.push_back(ennemies_arg[2]); + + combat(player_arg, ennemies); +} + +void combat(Player& player_arg, std::vector& 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& 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& 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& 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 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& ennemies_arg){ + if(player_arg.job == 0) { + casting_spell(player_arg, ennemies_arg); + } +} + +bool player_escape(const Player& player_arg, std::vector& 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); +} \ No newline at end of file diff --git a/game/combat.h b/game/combat.h new file mode 100644 index 0000000..c21457d --- /dev/null +++ b/game/combat.h @@ -0,0 +1,15 @@ + +void init_combat(Player& player_arg, std::vector ennemies_arg); +void combat(Player& player_arg, std::vector& ennemies_arg); + +void check_deads(Player& player_arg, std::vector& ennemies_arg, bool& combat_loop); + +void player_turn(Player& player_arg, std::vector& ennemies_arg, bool& combat_loop_arg, int& arg); +void select_combat_action(int arg, Player& player_arg, bool& combat_loop_arg, std::vector& ennemies_arg); + +Spell choose_spell(const Ennemy& ennemy_arg); +void ennemy_turn(Player& player_arg, Ennemy& ennemy_arg); + +void attack(Player& player_arg, std::vector& ennemies_arg); +bool player_escape(const Player& player_arg, std::vector& ennemies_arg); +bool escape(const Ennemy& ennemy_arg); \ No newline at end of file diff --git a/game/ennemy.cpp b/game/ennemy.cpp new file mode 100644 index 0000000..3638459 --- /dev/null +++ b/game/ennemy.cpp @@ -0,0 +1,82 @@ +#include +#include +#include +#include "structs.h" +#include "ennemy.h" +#include "spells.h" + +void init_ennemy(Ennemy& ennemy_arg, + std::string name_arg, + int xp_arg, + int max_health_arg, + int max_shield_arg, + int max_speed_arg, + int max_tame_arg, + float escape_arg, + float menace_arg, + std::vector spells_arg +) { + ennemy_arg.name = name_arg; + ennemy_arg.xp = xp_arg; + ennemy_arg.max_health = max_health_arg; + ennemy_arg.max_shield = max_shield_arg; + ennemy_arg.max_speed = max_speed_arg; + ennemy_arg.max_tame = max_tame_arg; + init_stats(ennemy_arg); + ennemy_arg.escape = escape_arg; + ennemy_arg.menace = menace_arg; + ennemy_arg.spells = spells_arg; +} + +void init_speed(Ennemy& ennemy_arg) { + ennemy_arg.speed = ennemy_arg.max_speed; +} +void init_stats(Ennemy& ennemy_arg) { + ennemy_arg.health = ennemy_arg.max_health; + ennemy_arg.shield = ennemy_arg.max_shield; + ennemy_arg.speed = ennemy_arg.max_speed; + ennemy_arg.tame = ennemy_arg.max_tame; +} + +void create_ennemies(std::vector& ennemies_arg) { + std::vector all_spells; + init_spells(all_spells); + + Ennemy emplialin; + init_ennemy(emplialin, "Emplialin", 60, 40, 50, 20, 50, 0.8, 0.6, std::vector{all_spells[0], all_spells[2], all_spells[4]}); + ennemies_arg.push_back(emplialin); + + Ennemy arzkalin; + init_ennemy(arzkalin, "Arzkalin", 60, 70, 60, 10, 100, 1.0, 0.5, std::vector{all_spells[1], all_spells[3], all_spells[4]}); + ennemies_arg.push_back(arzkalin); + + Ennemy coindithai; + init_ennemy(coindithai, "Coindithaï", 32, 30, 15, 20, 10, 0.9, 0.8, std::vector{all_spells[5]}); + ennemies_arg.push_back(coindithai); +} + +void inc_health(Ennemy& ennemy_arg, int value_arg){ + ennemy_arg.health += value_arg; +} +void inc_shield(Ennemy& ennemy_arg, int value_arg){ + ennemy_arg.shield += value_arg; +} +void inc_speed(Ennemy& ennemy_arg, int value_arg){ + ennemy_arg.speed += value_arg; +} + +void print_ennemy(const Ennemy& ennemy_arg) { + std::cout << ennemy_arg.name << std::endl; + std::cout << "Xp: " << ennemy_arg.xp << std::endl; + std::cout << "Health: " << ennemy_arg.health << "/"<< ennemy_arg.max_health << std::endl; + std::cout << "Shield: " << ennemy_arg.shield << "/"<< ennemy_arg.max_shield << std::endl; + std::cout << "Speed: " << ennemy_arg.speed << "/"<< ennemy_arg.max_speed << std::endl; + std::cout << "Speed: " << ennemy_arg.tame << "/"<< ennemy_arg.max_tame << std::endl; + std::cout << "Escape: " << ennemy_arg.escape * 100 << "%"<< std::endl; + std::cout << "Menace: " << ennemy_arg.menace * 100 << "%"<< std::endl; + std::cout << "Spells: "; + for (Spell spell: ennemy_arg.spells) { + std::cout << spell.name << ", "; + } + std::cout << std::endl << std::endl; +} \ No newline at end of file diff --git a/game/ennemy.h b/game/ennemy.h new file mode 100644 index 0000000..15c5c35 --- /dev/null +++ b/game/ennemy.h @@ -0,0 +1,25 @@ + +void init_ennemy(Ennemy& ennemy_arg, + std::string name_arg, + int xp_arg, + int health_arg, + int shield_arg, + int speed_arg, + int tame_arg, + int max_health_arg, + int max_shield_arg, + int max_speed_arg, + int max_tame_arg, + float escape_arg, + float menace_arg, + std::vector spells_arg +); +void init_speed(Ennemy& ennemy_arg); +void init_stats(Ennemy& ennemy_arg); +void create_ennemies(std::vector& ennemies_arg); + +void inc_health(Ennemy& ennemy_arg, int value_arg); +void inc_shield(Ennemy& ennemy_arg, int value_arg); +void inc_speed(Ennemy& ennemy_arg, int value_arg); + +void print_ennemy(const Ennemy& ennemy_arg); \ No newline at end of file diff --git a/game/interfaces.cpp b/game/interfaces.cpp new file mode 100644 index 0000000..9470556 --- /dev/null +++ b/game/interfaces.cpp @@ -0,0 +1,37 @@ +#include +#include +#include "structs.h" +#include "player.h" +#include "ennemy.h" +#include "interfaces.h" + +void display_menu() { + std::cout << "1. Search ennemies" << std::endl; + std::cout << "2. Quit" << std::endl; + std::cout << std::endl; +} + +void display_combat_menu(const Player& player_arg, const std::vector& ennemies_arg) { + std::cout << std::endl; + print_player(player_arg); + for (Ennemy ennemy: ennemies_arg) { + print_ennemy(ennemy); + } + std::cout << "1. Spell book" << std::endl; + std::cout << "2. Cast spell" << std::endl; + std::cout << "3. Escape" << std::endl; + std::cout << std::endl; +} + +void display_ennemi_turn(const Ennemy& ennemy_arg) { + std::cout << ennemy_arg.name << "'s turn" << std::endl; +} + +void display_ennemies(const std::vector& ennemies_arg) { + int i = 0; + for(Ennemy ennemy: ennemies_arg) { + std::cout << i << ", " << ennemy.name << std::endl; + i++; + } + std::cout << std::endl; +} \ No newline at end of file diff --git a/game/interfaces.h b/game/interfaces.h new file mode 100644 index 0000000..2a432ef --- /dev/null +++ b/game/interfaces.h @@ -0,0 +1,5 @@ + +void display_menu(); +void display_combat_menu(const Player& player_arg, const std::vector& ennemies_arg); +void display_ennemi_turn(const Ennemy& ennemy_arg); +void display_ennemies(const std::vector& ennemies_arg); \ No newline at end of file diff --git a/game/main.cpp b/game/main.cpp new file mode 100644 index 0000000..1fa1eb0 --- /dev/null +++ b/game/main.cpp @@ -0,0 +1,40 @@ +#include +#include +#include "structs.h" +#include "player.h" +#include "ennemy.h" +#include "spells.h" +#include "interfaces.h" +#include "combat.h" + +void select_menu(int arg, Player& player_arg, std::vector& ennemies_arg, bool& game_loop_arg); + +void select_menu(int arg, Player& player_arg, std::vector& ennemies_arg, bool& game_loop_arg) { + switch (arg){ + case 1: + init_combat(player_arg, ennemies_arg); + break; + case 2: + game_loop_arg = 0; + break; + default: + game_loop_arg = 0; + break; + } +} + +int main() { + Player mage; + init_default_mage(mage); + std::vector ennemies; + create_ennemies(ennemies); + + int arg; + bool game_loop = 1; + while (game_loop) { + display_menu(); + std::cin >> arg; + select_menu(arg, mage, ennemies, game_loop); + } + return 0; +} \ No newline at end of file diff --git a/game/player.cpp b/game/player.cpp new file mode 100644 index 0000000..084350d --- /dev/null +++ b/game/player.cpp @@ -0,0 +1,78 @@ +#include +#include +#include +#include "structs.h" +#include "utilities.h" +#include "player.h" +#include "spells.h" + +const int MAGE = 0; +const int ALCHIMIST = 1; +const int WARRIOR = 2; +const int ENGINEER = 3; +const int ARCHER = 4; +const int TAMER = 5; + + +void init_default_mage(Player& player_arg) { + player_arg.name = "Liam le dieu"; + player_arg.job = MAGE; + player_arg.xp = 0; + player_arg.max_health = 50; + player_arg.max_shield = 20; + player_arg.max_speed = 10; + player_arg.max_mana = 50; + player_arg.max_energy = 0; + init_stats(player_arg); + init_spells(player_arg.spell_book); + player_arg.escape = 1.0; + player_arg.menace = 0.7; +} + +void init_speed(Player& player_arg) { + player_arg.speed = player_arg.max_speed; +} + +void init_stats(Player& player_arg) { + player_arg.health = player_arg.max_health; + player_arg.shield = player_arg.max_shield; + player_arg.speed = player_arg.max_speed; + player_arg.mana = player_arg.max_mana; + player_arg.energy = player_arg.max_energy; +} + +void inc_health(Player& player_arg, int value_arg){ + player_arg.health += value_arg; +} +void inc_shield(Player& player_arg, int value_arg){ + player_arg.shield += value_arg; +} +void inc_speed(Player& player_arg, int value_arg){ + player_arg.speed += value_arg; +} +void inc_mana(Player& player_arg, int value_arg){ + player_arg.mana += value_arg; +} +void inc_energy(Player& player_arg, int value_arg){ + player_arg.energy += value_arg; +} + +void level_up(Player& player_arg, int xp_arg){ + player_arg.xp += xp_arg; +} + +void print_player(const Player& player_arg) { + std::vector jobs = {"Mage", "Alchimist", "Warrior", "Engineer", "Archer", "Tamer"}; + + std::cout << player_arg.name << std::endl; + std::cout << jobs[player_arg.job] << std::endl; + std::cout << "Xp: " << player_arg.xp << std::endl; + std::cout << "Health: " << player_arg.health << "/"<< player_arg.max_health << std::endl; + std::cout << "Shield: " << player_arg.shield << "/"<< player_arg.max_shield << std::endl; + std::cout << "Mana: " << player_arg.mana << "/"<< player_arg.max_mana << std::endl; + std::cout << "Energy: " << player_arg.energy << "/"<< player_arg.max_energy << std::endl; + std::cout << "Speed: " << player_arg.speed << "/"<< player_arg.max_speed << std::endl; + std::cout << "Escape: " << player_arg.escape * 100 << "%"<< std::endl; + std::cout << "Menace: " << player_arg.menace * 100 << "%"<< std::endl; + std::cout << std::endl; +} \ No newline at end of file diff --git a/game/player.h b/game/player.h new file mode 100644 index 0000000..fb48a35 --- /dev/null +++ b/game/player.h @@ -0,0 +1,15 @@ + +void init_default_mage(Player& player_arg); + +void init_speed(Player& player_arg); +void init_stats(Player& player_arg); + +void inc_health(Player& player_arg, int value_arg); +void inc_shield(Player& player_arg, int value_arg); +void inc_speed(Player& player_arg, int value_arg); +void inc_mana(Player& player_arg, int value_arg); +void inc_energy(Player& player_arg, int value_arg); + +void level_up(Player& player_arg, int xp_arg); + +void print_player(const Player& player_arg); \ No newline at end of file diff --git a/game/release b/game/release new file mode 100755 index 0000000000000000000000000000000000000000..6b143c3e10257c05b388d3d2a375b635b1b6963f GIT binary patch literal 155152 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 VC3o$2|E_8-)lgkvxxw?*`hOMn85{rr literal 0 HcmV?d00001 diff --git a/game/spells.cpp b/game/spells.cpp new file mode 100644 index 0000000..2cf3afa --- /dev/null +++ b/game/spells.cpp @@ -0,0 +1,269 @@ +#include +#include +#include +#include "utilities.h" +#include "structs.h" +#include "player.h" +#include "ennemy.h" +#include "interfaces.h" +#include "spells.h" + + +// Elements +const int FIRE = 0; +const int AIR = 1; +const int WATER = 2; +const int EARTH = 3; +const int EATHER = 4; +const std::vector elements = {"Fire", "Air", "Water", "Earth", "Eather"}; + +// Combinaisons +const int UP = 0; +const int RIGHT = 1; +const int DOWN = 2; +const int LEFT = 3; +const int END_SPELL = 5; +const std::vector arrows = {"↑", "→", "↓", "←"}; + +void init_spell(Spell& spell_arg, const std::string& name_arg, int damage_arg, int cost_arg, float precision_arg, bool zone_arg, std::vector elements_arg, std::vector combinaison_arg) { + spell_arg.name = name_arg; + spell_arg.damage = damage_arg; + spell_arg.cost_mana = cost_arg; + spell_arg.cost_health = 0; + spell_arg.precision = precision_arg; + spell_arg.zone = zone_arg; + spell_arg.elements = elements_arg; + spell_arg.combinaison = combinaison_arg; +} + +void init_spells(std::vector& spell_book_arg) { + Spell fire_ball; + init_spell( + fire_ball, + "Fire Ball", + 10, + 5, + 0.8, + 1, + std::vector{FIRE}, + std::vector{UP, RIGHT, UP} + ); + spell_book_arg.push_back(fire_ball); + + Spell tsunami; + init_spell( + tsunami, + "Tsunami", + 15, + 8, + 1, + 1, + std::vector{WATER}, + std::vector{UP, DOWN, RIGHT} + ); + spell_book_arg.push_back(tsunami); + + Spell tailwind_css; + init_spell( + tailwind_css, + "Tailwind CSS", + 8, + 4, + 0.8, + 0, + std::vector{AIR}, + std::vector{UP, UP, UP} + ); + spell_book_arg.push_back(tailwind_css); + + Spell rolling_rock; + init_spell( + rolling_rock, + "Rolling Rock", + 15, + 13, + 0.7, + 0, + std::vector{EARTH}, + std::vector{DOWN, UP, LEFT} + ); + spell_book_arg.push_back(rolling_rock); + + Spell lightning; + init_spell( + lightning, + "Lightning", + 20, + 10, + 0.8, + 0, + std::vector{AIR, FIRE}, + std::vector{DOWN, UP, LEFT, UP} + ); + spell_book_arg.push_back(lightning); + + Spell bubble; + init_spell( + bubble, + "Bubble", + 5, + 2, + 1, + 0, + std::vector{AIR, WATER}, + std::vector{UP, UP, UP, UP} + ); + spell_book_arg.push_back(bubble); +} + +//Return -1 if no spells, 0 if a spell is totally completed and the only possible, else the number of spells possible +int possible_spell(const std::vector& spell_book_arg, const std::vector& spell_arg) { + int spells_count = 0; + for (const Spell& spell: spell_book_arg) { + if (spell.combinaison.size() >= spell_arg.size()) { + std::vector actual_spell(spell.combinaison.begin(), spell.combinaison.begin() + spell_arg.size()); + if (actual_spell == spell_arg) { + spells_count++; + } + } + } + return spells_count; +} + +Spell find_spell_by_combinaison(const std::vector& spell_book_arg, const std::vector& spell_arg) { + for (const Spell& spell: spell_book_arg) { + if (spell.combinaison == spell_arg) { + return spell; + } + } + return spell_book_arg[0]; +} + +//Return true if the player still can cast a spell +bool cast_spell(Player& player_arg, std::vector& spell_arg, int spell_segment_arg, std::vector& ennemies_arg) { + + std::vector spell_book = player_arg.spell_book; + + if (spell_segment_arg == END_SPELL) { + Spell casted_spell = find_spell_by_combinaison(spell_book, spell_arg); + if (spell_arg.size() == casted_spell.combinaison.size()) { + use_spell(casted_spell, player_arg, ennemies_arg); + } + return 0; + } else { + spell_arg.push_back(spell_segment_arg); + int count_spell = possible_spell(spell_book, spell_arg); + if (count_spell <= 1) { + if (count_spell == 1) { + Spell casted_spell = find_spell_by_combinaison(spell_book, spell_arg); + if (spell_arg.size() == casted_spell.combinaison.size()) { + use_spell(casted_spell, player_arg, ennemies_arg); + } else { + return 1; + } + } else if (count_spell == 0) { + std::cout << "Spell doesn't exist" << std::endl; + } + spell_arg = {}; + return 0; + } + } + return 1; +} + +void casting_spell(Player& player_arg, std::vector& ennemies_arg) { + std::vector spell; + int spell_segment; + do { + std::cin >> spell_segment; + } while (cast_spell(player_arg, spell, spell_segment, ennemies_arg)); + +} + +void use_spell(const Spell& spell_arg, Player& player_arg, std::vector& ennemies_arg) { + if (player_arg.mana - spell_arg.cost_mana >= 0) { + inc_health(player_arg, -spell_arg.cost_health); + inc_mana(player_arg, -spell_arg.cost_mana); + if(spell_arg.zone) { + for(Ennemy& ennemy: ennemies_arg) { + spell_damage(ennemy, spell_arg); + } + } else { + Ennemy& ennemy = choose_target(ennemies_arg); + spell_damage(ennemy, spell_arg); + } + std::cout << player_arg.name<< " casts " << spell_arg.name << std::endl; + } else { + std::cout << "Not enough mana" << std::endl; + } +} + +void spell_damage(Ennemy& ennemy_arg, const Spell& spell_arg) { + if(ennemy_arg.shield >= spell_arg.damage) { + inc_shield(ennemy_arg, -spell_arg.damage); + } else if(ennemy_arg.shield > 0) { + inc_health(ennemy_arg, ennemy_arg.shield - spell_arg.damage); + inc_shield(ennemy_arg, -ennemy_arg.shield); + } else if(ennemy_arg.health >= spell_arg.damage) { + inc_health(ennemy_arg, -spell_arg.damage); + } else { + inc_health(ennemy_arg, -ennemy_arg.health); + } +} + +Ennemy& choose_target(std::vector& ennemies_arg) { + display_ennemies(ennemies_arg); + int arg; + std::cin >> arg; + return ennemies_arg[arg]; +} + +void ennemy_use_spell(const Spell& spell_arg, Player& player_arg, Ennemy& ennemy_arg) { + inc_health(ennemy_arg, -spell_arg.cost_health); + + if(random_success(spell_arg.precision)) { + if(player_arg.shield >= spell_arg.damage) { + inc_shield(player_arg, -spell_arg.damage); + } else if(player_arg.shield > 0) { + inc_health(player_arg, player_arg.shield - spell_arg.damage); + inc_shield(player_arg, -player_arg.shield); + } else if(player_arg.health >= spell_arg.damage) { + inc_health(player_arg, -spell_arg.damage); + } else { + inc_health(player_arg, -player_arg.health); + } + std::cout << ennemy_arg.name<< " casts " << spell_arg.name << std::endl; + } else { + std::cout << ennemy_arg.name<< " fails " << spell_arg.name << std::endl; + } +} + +void print_spell(const Spell& spell_arg) { + std::cout << spell_arg.name << std::endl; + std::cout << "Damage : " << spell_arg.damage << std::endl; + std::cout << "Mana cost : " << spell_arg.cost_mana << std::endl; + if(spell_arg.cost_health > 0) { + std::cout << "Health cost : " << spell_arg.cost_health << std::endl; + } + std::cout << "Precision : " << spell_arg.damage << std::endl; + std::cout << "Elements : "; + for (int element: spell_arg.elements) { + std::cout << elements[element] << " "; + } + std::cout << std::endl; + if (spell_arg.zone) { + std::cout << "Zone" << std::endl; + } + std::cout << "Combinaison : "; + + for (int arrow: spell_arg.combinaison) { + std::cout << arrows[arrow] << " "; + } + std::cout << std::endl << std::endl; +} + +void print_spell_book(const std::vector& spell_book_arg) { + for (Spell spell: spell_book_arg) { + print_spell(spell); + } +} \ No newline at end of file diff --git a/game/spells.h b/game/spells.h new file mode 100644 index 0000000..70f6e77 --- /dev/null +++ b/game/spells.h @@ -0,0 +1,23 @@ + +void init_spell(Spell& spell_arg, + const std::string& name_arg, + int damage_arg, + int cost_arg, + float precision_arg, + bool zone_arg, + std::vector elements_arg, + std::vector combinaison_arg +); +void init_spells(std::vector& spell_book_arg); + +int possible_spell(const std::vector& spell_book_arg, const std::vector& spell_arg); +Spell find_spell_by_combinaison(const std::vector& spell_book_arg, const std::vector& spell_arg); +bool cast_spell(Player& player_arg, std::vector& spell_arg, std::vector& ennemies_arg); +void casting_spell(Player& player_arg, std::vector& ennemies_arg); +void use_spell(const Spell& spell_arg, Player& player_arg, std::vector& ennemies_arg); +void spell_damage(Ennemy& ennemy_arg, const Spell& spell_arg); +Ennemy& choose_target(std::vector& ennemies_arg); +void ennemy_use_spell(const Spell& spell_arg, Player& player_arg, Ennemy& ennemy_arg); + +void print_spell(const Spell& spell_arg); +void print_spell_book(const std::vector& spell_book_arg); diff --git a/game/structs.h b/game/structs.h new file mode 100644 index 0000000..b45d2f8 --- /dev/null +++ b/game/structs.h @@ -0,0 +1,27 @@ + +struct Spell { + std::string name; + int damage; + int cost_health, cost_mana; + float precision; + bool zone; + std::vector elements, combinaison; +}; + +struct Ennemy { + std::string name; + int xp; + int health, shield, speed, tame; + int max_health, max_shield, max_speed, max_tame; + float escape, menace; //Menace comlpexifies the escape, the higher the value is, the less menace it is + std::vector spells; +}; + +struct Player { + std::string name; + int job, xp; + int health, shield, speed, mana, energy; + int max_health, max_shield, max_speed, max_mana, max_energy; + float escape, menace; + std::vector spell_book; +}; \ No newline at end of file diff --git a/game/utilities.cpp b/game/utilities.cpp new file mode 100644 index 0000000..5223fb7 --- /dev/null +++ b/game/utilities.cpp @@ -0,0 +1,17 @@ +#include +#include +#include "utilities.h" + +bool random_success(float probability) { + std::random_device rd; + std::mt19937 gen(rd()); + std::bernoulli_distribution dist(probability); + return dist(gen); +} + +int random_choice(std::vector list) { + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_int_distribution<> dis(0, list.size() - 1); + return dis(gen); +} \ No newline at end of file diff --git a/game/utilities.h b/game/utilities.h new file mode 100644 index 0000000..427da96 --- /dev/null +++ b/game/utilities.h @@ -0,0 +1,3 @@ + +bool random_success(float probability); +int random_choice(std::vector list); \ No newline at end of file