From abd4894e31a573a7b6e9dbcbecb61a8b8b78ec8b Mon Sep 17 00:00:00 2001 From: zedarider Date: Mon, 31 Oct 2016 13:00:26 +0000 Subject: adding all necessary files --- src/cardeval.cpp | 151 ++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 128 insertions(+), 23 deletions(-) (limited to 'src/cardeval.cpp') diff --git a/src/cardeval.cpp b/src/cardeval.cpp index 6c04d29..c3ff7b9 100644 --- a/src/cardeval.cpp +++ b/src/cardeval.cpp @@ -12,6 +12,14 @@ #include "../include/cardeval.hpp" using namespace tinyxml2; +using namespace std; +using namespace cardeval; + +/* + + Constructor + + */ CardEval::CardEval() { card_doc.LoadFile("resources/CardDefs.xml"); @@ -21,10 +29,10 @@ CardEval::CardEval(int &argc, char** &argv) { // if only one argument is given if(argc == 1) { // use strncmp to compare parts of the string - if(std::strncmp(argv[0], "bin/xxx", 4) || std::strncmp(argv[0], "./bin/xxx", 6)) { + if(strncmp(argv[0], "bin/xxx", 4) || strncmp(argv[0], "./bin/xxx", 6)) { // if program is executed from main program directory card_doc.LoadFile("resources/CardDefs.xml"); - } else if(std::strncmp(argv[0], "./xxx", 2)) { + } else if(strncmp(argv[0], "./xxx", 2)) { // when program is executed directly card_doc.LoadFile("../resources/CardDefs.xml"); } @@ -35,12 +43,75 @@ CardEval::CardEval(int &argc, char** &argv) { // otherwise exit with errorcode exit_with_error(); } + + get_cards(); + get_stat_average(); } CardEval::~CardEval() { } +/* + + Public + + */ + +void CardEval::print_cards(string card_str) { + if(card_str == "minions") { + for(card_struct curr_card : minions) { + cout << curr_card.card_print_format(); + } + } else if(card_str == "spells") { + for(card_struct curr_card : spells) { + cout << curr_card.card_print_format(); + } + } else if(card_str == "weapons") { + for(card_struct curr_card : weapons) { + cout << curr_card.card_print_format(); + } + } else { + cout << "not available" << endl; + } +} + +void CardEval::print_stat_average() { + for(atk_health card_avg : card_avg_stats) { + cout << card_avg.prnt_str() << endl; + } +} + +void CardEval::set_minions(vector &card_info) { + for(card_struct cards : minions) { + card_info.push_back(cards); + } +} + +void CardEval::set_spells(vector &card_info) { + for(card_struct cards : spells) { + card_info.push_back(cards); + } +} + +void CardEval::set_weapons(vector &card_info) { + for(card_struct cards : weapons) { + card_info.push_back(cards); + } +} + +void CardEval::set_avg_stats(vector &stat_avg) { + for(atk_health stats : card_avg_stats) { + stat_avg.push_back(stats); + } +} + +/* + + Protected + + */ + void CardEval::get_cards() { // load root node from the file into memory XMLElement* root_el = card_doc.FirstChildElement("CardDefs"); @@ -55,14 +126,50 @@ void CardEval::get_cards() { for(XMLElement* tag_iterator = ent_iterator->FirstChildElement("Tag"); tag_iterator != NULL; tag_iterator = tag_iterator->NextSiblingElement("Tag")) { - card_info = set_card_info(tag_iterator); + set_card_info(tag_iterator, card_info); } + + add_card_to_vec(card_info); + } + + // makes the vectors smaller and fit to memory + minions.shrink_to_fit(); + spells.shrink_to_fit(); + weapons.shrink_to_fit(); +} + +void CardEval::get_stat_average() { + const int atk_health_size = MAX_MANA+1; + atk_health atk_health_count[atk_health_size]; + + int card_total[atk_health_size]; + for(int i = 0; i < atk_health_size; i++) { + card_total[i] = 0; + } + + for(card_struct card_info : minions) { + if(card_info.cost >= 0 && card_info.cost < atk_health_size && card_info.is_collectible) { + + atk_health_count[card_info.cost].atk += double(card_info.attack); + atk_health_count[card_info.cost].health += double(card_info.health); + + card_total[card_info.cost]++; + } + } + + for(int i = 0; i < atk_health_size; i++) { + atk_health tmp_ah; + + tmp_ah.atk = atk_health_count[i].atk / double(card_total[i]); + tmp_ah.health = atk_health_count[i].health / double(card_total[i]); + + card_avg_stats.push_back(tmp_ah); } } void CardEval::exit_with_error() { // exit the program with an error message - std::exit(EXIT_FAILURE); + exit(EXIT_FAILURE); } void CardEval::add_card_to_vec(card_struct &in_card) { @@ -78,8 +185,8 @@ void CardEval::add_card_to_vec(card_struct &in_card) { } } -char CardEval::get_type(std::string type_str) { - int type_int = std::stoi(type_str); +char CardEval::get_type(string type_str) { + int type_int = stoi(type_str); switch(type_int) { // when it is a minion @@ -97,9 +204,10 @@ char CardEval::get_type(std::string type_str) { } } -std::string CardEval::get_class(std::string class_str) { - int class_int = std::stoi(class_str); +string CardEval::get_class(string class_str) { + int class_int = stoi(class_str); + // using switch to return the string of the cardtype switch(class_int) { case 2: return "druid"; @@ -120,44 +228,41 @@ std::string CardEval::get_class(std::string class_str) { case 10: return "warrior"; default: - return ""; + return "\0"; } } -card_struct CardEval::set_card_info(XMLElement* tag_it) { - card_struct tmp_card; - +void CardEval::set_card_info(XMLElement* tag_it, card_struct &curr_card) { // add information to the cardinfo if(tag_it->Attribute("name", "CardName")) { // if tag is cardname - tmp_card.card_name = tag_it->FirstChildElement("enUS")->GetText(); + curr_card.card_name = tag_it->FirstChildElement("enUS")->GetText(); } else if(tag_it->Attribute("name", "Collectible") && tag_it->Attribute("value", "1")) { - tmp_card.is_collectible = true; + curr_card.is_collectible = true; } else if(tag_it->Attribute("name", "CardType")) { - tmp_card.card_type = get_type(tag_it->Attribute("value")); + curr_card.card_type = get_type(tag_it->Attribute("value")); } else if(tag_it->Attribute("name", "Class")) { - tmp_card.class_name = get_class(tag_it->Attribute("value")); + curr_card.class_name = get_class(tag_it->Attribute("value")); } else if(tag_it->Attribute("name", "Cost")) { - tmp_card.cost = std::stoi(tag_it->Attribute("value")); + curr_card.cost = stoi(tag_it->Attribute("value")); } else if(tag_it->Attribute("name", "Atk")) { - tmp_card.attack = std::stoi(tag_it->Attribute("value")); + curr_card.attack = stoi(tag_it->Attribute("value")); } else if(tag_it->Attribute("name", "Health")) { - tmp_card.health = std::stoi(tag_it->Attribute("value")); + curr_card.health = stoi(tag_it->Attribute("value")); } else if(tag_it->Attribute("name", "Rarity")) { - tmp_card.rarity = std::stoi(tag_it->Attribute("value")); + curr_card.rarity = stoi(tag_it->Attribute("value")); } else if(tag_it->Attribute("name", "Durability")) { - tmp_card.durability = std::stoi(tag_it->Attribute("value")); + curr_card.durability = stoi(tag_it->Attribute("value")); } else{ + // do nothing } - - return tmp_card; } -- cgit