From 9c0146289db9d6dfd49071546646b95bda1f0290 Mon Sep 17 00:00:00 2001 From: DryRun Date: Mon, 13 Oct 2025 18:54:31 -0400 Subject: [PATCH 1/6] Fall 2025 restructuring --- Battle.cc | 626 ------------------ Boss.cc | 95 --- Boss.h | 65 -- Entity.cc | 284 -------- Entity.h | 164 ----- Makefile | 84 +-- MatchingHelpers.h | 38 -- Priest.h | 25 - README.md | 16 +- Rogue.h | 26 - Warrior.h | 26 - Arthas.txt => data/Arthas.txt | 0 ArthasAttacks.txt => data/ArthasAttacks.txt | 0 AshenVerdict.txt => data/AshenVerdict.txt | 0 Battle.h => interface/Battle.h | 193 +++--- interface/Boss.h | 52 ++ interface/Character.h | 156 +++++ interface/MatchingHelpers.h | 36 + interface/Priest.h | 24 + interface/Rogue.h | 23 + interface/Warrior.h | 21 + midterm.md | 5 + src/Battle.cc | 621 +++++++++++++++++ src/Boss.cc | 91 +++ src/Character.cc | 279 ++++++++ .../WorldOfTextCraft.cc | 2 +- Shemp.txt => tests/Shemp.txt | 0 ShempAttacks.txt => tests/ShempAttacks.txt | 0 StoogesBattle.txt => tests/StoogesBattle.txt | 0 ThreeStooges.txt => tests/ThreeStooges.txt | 0 test_battle.cc => tests/test_battle.cc | 61 +- test_boss.cc => tests/test_boss.cc | 53 +- test_entity.cc => tests/test_character.cc | 31 +- 33 files changed, 1528 insertions(+), 1569 deletions(-) delete mode 100644 Battle.cc delete mode 100644 Boss.cc delete mode 100644 Boss.h delete mode 100644 Entity.cc delete mode 100644 Entity.h delete mode 100644 MatchingHelpers.h delete mode 100644 Priest.h delete mode 100644 Rogue.h delete mode 100644 Warrior.h rename Arthas.txt => data/Arthas.txt (100%) rename ArthasAttacks.txt => data/ArthasAttacks.txt (100%) rename AshenVerdict.txt => data/AshenVerdict.txt (100%) rename Battle.h => interface/Battle.h (50%) create mode 100644 interface/Boss.h create mode 100644 interface/Character.h create mode 100644 interface/MatchingHelpers.h create mode 100644 interface/Priest.h create mode 100644 interface/Rogue.h create mode 100644 interface/Warrior.h create mode 100644 midterm.md create mode 100644 src/Battle.cc create mode 100644 src/Boss.cc create mode 100644 src/Character.cc rename WorldOfTextCraft.cc => src/WorldOfTextCraft.cc (98%) rename Shemp.txt => tests/Shemp.txt (100%) rename ShempAttacks.txt => tests/ShempAttacks.txt (100%) rename StoogesBattle.txt => tests/StoogesBattle.txt (100%) rename ThreeStooges.txt => tests/ThreeStooges.txt (100%) rename test_battle.cc => tests/test_battle.cc (66%) rename test_boss.cc => tests/test_boss.cc (52%) rename test_entity.cc => tests/test_character.cc (62%) diff --git a/Battle.cc b/Battle.cc deleted file mode 100644 index 0482880..0000000 --- a/Battle.cc +++ /dev/null @@ -1,626 +0,0 @@ -#include "Battle.h" -#include "MatchingHelpers.h" -#include - -void Battle::splash( std::ostream & out ) const { - - out << "|--------------------------------------------|" << std::endl; - out << "|--------------------------------------------|" << std::endl; - out << "|--------------------------------------------|" << std::endl; - out << "|--------------------------------------------|" << std::endl; - out << "| __ __ _ _ |" << std::endl; - out << "| / / /\\ \\ \\___ _ __| | __| | |" << std::endl; - out << "| \\ \\/ \\/ / _ \\| '__| |/ _` | |" << std::endl; - out << "| \\ /\\ / (_) | | | | (_| | |" << std::endl; - out << "| \\/ \\/ \\___/|_| |_|\\__,_| |" << std::endl; - out << "| |" << std::endl; - out << "| __ |" << std::endl; - out << "| ___ / _| |" << std::endl; - out << "| / _ \\| |_ |" << std::endl; - out << "| | (_) | _| |" << std::endl; - out << "| \\___/|_| |" << std::endl; - out << "| |" << std::endl; - out << "| _____ _ ___ __ _ |" << std::endl; - out << "|/__ \\_____ _| |_ / __\\ __ __ _ / _| |_ |" << std::endl; - out << "| / /\\/ _ \\ \\/ / __|/ / | '__/ _` | |_| __||" << std::endl; - out << "| / / | __/> <| |_/ /__| | | (_| | _| |_ |" << std::endl; - out << "| \\/ \\___/_/\\_\\\\__\\____/_| \\__,_|_| \\__||" << std::endl; - out << "| |" << std::endl; - out << "|--------------------------------------------|" << std::endl; - out << "|--------------------------------------------|" << std::endl; - out << "|--------------------------------------------|" << std::endl; - - out << "Welcome brave traveler..." << std::endl; - out << description_ << std::endl; - - -} - -bool Battle::readPCConfiguration( std::string filename ) -{ - - if ( pcs_.size() > 0 ) { - std::cout << "Configuration already read... skipping reading from " << filename << std::endl; - return false; - } else { - std::ifstream in(filename); - - // While not the end of file, keep looping - while ( ! in.eof() ) { - std::string line; - std::getline(in,line); - - // First check if the line is empty or a comment (starts with "!") - if ( (line.size() > 0 && line[0] == '!') || line == "" ){ - continue; - } - else { - - // Otherwise, we have a valid line. - // First read the type from the first token, and create the appropriate class (Warrior, Priest, Rogue). - // Then read in the stats from the rest of the line. - std::stringstream tokens(line); - std::string entityType; - std::getline( tokens, entityType, ';' ); - - std::shared_ptr entity; - if ( entityType == "Warrior" ) { - entity = std::shared_ptr ( new Warrior() ); - } else if ( entityType == "Priest" ) { - entity = std::shared_ptr ( new Priest() ); - } else if ( entityType == "Rogue" ) { - entity = std::shared_ptr ( new Rogue() ); - } else { - std::cout << "Entity Type not recognized: " << line << ", skipping" << std::endl; - continue; - } - entity->input( tokens ); - pcs_.push_back( entity ); - std::cout << "Added entity: " << *( pcs_.back() ) << std::endl; - } - } - - in.close(); - } - return true; -} - - - -bool Battle::readNPCConfiguration( std::string filename ) -{ - if ( npcs_.size() > 0 ) { - std::cout << "Configuration already read... skipping reading from " << filename << std::endl; - return false; - } else { - std::ifstream in(filename); - while ( ! in.eof() ) { - std::string line; - std::getline(in,line); - - if ( (line.size() > 0 && line[0] == '!') || line == "" ){ - continue; - } - else { - // The first line is the description. - if ( description_ == "" ) { - description_ = line; - } else { - std::shared_ptr boss (new Boss() ); - boss->input( line ); - npcs_.push_back( boss ); - } - } - } - } - return true; -} - - -// Load a bunch of actions from a script -bool Battle::loadActionScript( std::string filename ) -{ - if ( filename == "" ) { - std::cout << "No script file input." << std::endl; - return false; - } else { - std::ifstream in( filename ); - - std::string line; - bool success = true; - while ( !in.eof() && success ) { - - std::getline( in, line ); - if ( line[0] == '!' || line == "" ) continue; - QuickAction qa; - success = parseAction( line, qa ); - - if( !success ) { - std::cout << "Error in parseAction!" << std::endl; - return false; - } - - // If the script has any PC actions, it is scripted and not user-input - coll_type::iterator pcIt = std::find_if( pcs_.begin(), pcs_.end(), MatchSource( qa.source->name() ) ); - bool found = pcIt != pcs_.end() ; - if ( found ) { - scripted_=true; - std::cout << "Scripting input for " << (*pcIt)->name() << std::endl; - } - actions_.push_back(qa); - - - - } - in.close(); - } - - return true; - -} - -// Lines look like this: -// Shemp;attack;Moe; -// Shemp;multiattack;all; -// 1 : find the Entity in the list with "name". -// 2 : find the action they are supposed to do. -// 3 : find the target. If blank, use current target. -// 4 : Set "name's" target, perform action -bool Battle::parseAction(std::string line, QuickAction & qa) -{ - - if ( line == "" ) return false; - - std::vector tokens; - std::stringstream linestream(line); - for (std::string each=""; std::getline(linestream, each, ';'); ){ - tokens.push_back(each); - } - - if ( tokens.size() < 3 ) { - std::cout << "Improper formatting of line " << line << std::endl; - return false; - } - - // Initialize both target and source to "error" (pcs_.end() is interpreted as such) - coll_type::iterator targetIt = pcs_.end(), sourceIt = pcs_.end(); - std::shared_ptr target; - std::shared_ptr source; - - // Find the iterator with name "tokens[0]" - sourceIt = find_entity( tokens[0] ); - // Check to make sure we found an iterator - if ( sourceIt == pcs_.end() ) { - std::cout << "Error processing line " << line << std::endl; - return false; - } - source = *sourceIt; - - // Special case of Bosses attacking ALL NPCs - if ( tokens[2] == "all" ) { - target = 0; - qa.source = source; - qa.action = MULTIATTACK; - return true; - } - - // Special case of attacking current target - if ( tokens[2] == "target" ) { - target = 0; - } else { - - // Find the iterator with name "tokens[2]" - targetIt = find_entity( tokens[2] ); - // Check to make sure we found an iterator - if ( targetIt == pcs_.end() || targetIt == npcs_.end() ) { - std::cout << "Error processing line " << line << std::endl; - return false; - } - target = *targetIt; - } - - // parse the action type. - ActionType actionType = N_ACTIONS; // Error code - if ( tokens[1] == "attack") actionType = ATTACK; - else if ( tokens[1] == "heal") actionType = HEAL; - else if ( tokens[1] == "defend") actionType = DEFEND; - else { - std::cout << "Invalid action " << tokens[1] << std::endl; - return false; - } - - - // Finally, push back the action - if ( target ) { - source->setTarget(target.get()); - } - qa.source = source; - qa.action = actionType ; - return true; -} - - -// This will perform all of the actions scripted in "actions_". -bool Battle::performScriptedActions( ) { - - if ( !scripted_ ) { - std::cout << "I am expecting a player script, but you didn't give me one." << std::endl; - return false; - } - - if ( !anyPCAlive() ){ - std::cout << "Alas, your party is dead." << std::endl; - return false; - } - - if ( !anyNPCAlive() ) { - std::cout << "You already won! Hooray!" << std::endl; - return false; - } - - // Special case for first attack : all NPCs will target first PC - if ( turn_ == 0 && pcs_.size() > 1 ) { - for ( coll_type::iterator inpc = npcs_.begin(); - inpc != npcs_.end(); ++inpc ) { - (*inpc)->setTarget( pcs_.begin()->get() ); - } - } - - if ( actions_.size() == 0 ){ - std::cout << "No actions to perform" << std::endl; - return false; - } - - for ( coll_type::iterator it = npcs_.begin(); it != npcs_.end(); ++it ) { - (*it)->turn_ = turn_; - } - - for ( coll_type::iterator it = pcs_.begin(); it != pcs_.end(); ++it ) { - (*it)->turn_ = turn_; - } - - for ( std::vector::iterator it = actions_.begin(); - it != actions_.end(); ++it ){ - - if ( it->source->isDead() ) { - std::cout << it->source->name() << " is dead" << std::endl; - continue; - } - - // two special cases for bosses: - // 1. If their target dies, they pick the next target. - // 2. Must check the special case of the "Boss" ability to attack everyone. - // Since we are storing pointers to the base class, we need to - // "dynamic_cast" to the derived class to access its "multi attack" - Boss * boss = dynamic_cast (it->source.get()); - if ( boss != 0 ) { - // Attack the entire party in a "MultiAttack" - if ( it->action == MULTIATTACK ) { - for ( coll_type::iterator itarget = pcs_.begin(); - itarget != pcs_.end(); ++itarget ) { - boss->multiAttack( itarget->get() ); - } - continue; - } - // If the target is dead, switch to the next in the list. - if ( boss->getTarget() != 0 && boss->getTarget()->isDead() ) { - bool bossGotTarget = setBossTarget( boss ); - if ( !bossGotTarget ) { - return false; - } - } - } - - // Now we execute normal attacks. - if ( it->action == ATTACK ) { - it->source->attack(); - } else if ( it->action == HEAL ) { - it->source->heal(); - } else if ( it->action == DEFEND ) { - it->source->defend(); - } else { - std::cout << "Incorrect action! Returning" << std::endl; - return false; - } - - if ( !anyPCAlive() ) { - std::cout << it->source->name() << " has vanquished your party." << std::endl; - return false; - } - - - if ( !anyNPCAlive() ) { - std::cout << it->source->name() << " has vanquished your foe!!!" << std::endl; - return false; - } - - } - - - ++turn_; - - return anyPCAlive() && anyNPCAlive(); - -} - - - -// This will perform all of the actions scripted in "actions_". -bool Battle::performUserActions( std::istream & in ) { - - if ( scripted_ ) { - std::cout << "PC actions already scripted, do not give me scripted actions if you do not want to use them." << std::endl; - return false; - } - - - if ( !anyPCAlive() ){ - std::cout << "Alas, your party is dead." << std::endl; - return false; - } - - if ( !anyNPCAlive() ) { - std::cout << "You already won! Hooray!" << std::endl; - return false; - } - - // Special case for first attack : all NPCs will target first PC - if ( turn_ == 0 && pcs_.size() > 1 ) { - for ( coll_type::iterator inpc = npcs_.begin(); - inpc != npcs_.end(); ++inpc ) { - (*inpc)->setTarget( pcs_.begin()->get() ); - } - } - - // Bookkeeping - if ( actions_.size() == 0 ){ - std::cout << "No actions to perform" << std::endl; - return false; - } - for ( coll_type::iterator it = npcs_.begin(); it != npcs_.end(); ++it ) { - (*it)->turn_ = turn_; - } - for ( coll_type::iterator it = pcs_.begin(); it != pcs_.end(); ++it ) { - (*it)->turn_ = turn_; - } - - // Process the boss actions - for ( std::vector::iterator it = actions_.begin(); - it != actions_.end(); ++it ){ - - if ( it->source->isDead() ) { - std::cout << it->source->name() << " is dead" << std::endl; - continue; - } - // two special cases for bosses: - // 1. If their target dies, they pick the next target. - // 2. Must check the special case of the "Boss" ability to attack everyone. - // Since we are storing pointers to the base class, we need to - // "dynamic_cast" to the derived class to access its "multi attack" - Boss * boss = dynamic_cast (it->source.get()); - if ( boss != 0 ) { - // Attack the entire party in a "MultiAttack" - if ( it->action == MULTIATTACK ) { - for ( coll_type::iterator itarget = pcs_.begin(); - itarget != pcs_.end(); ++itarget ) { - boss->multiAttack( itarget->get() ); - } - continue; - } - // If the target is dead, switch to the next in the list. - if ( boss->getTarget() != 0 && boss->getTarget()->isDead() ) { - bool bossGotTarget = setBossTarget( boss ); - if ( !bossGotTarget ) { - return false; - } - } - } - - if ( it->action == ATTACK ) { - it->source->attack(); - } else if ( it->action == HEAL ) { - it->source->heal(); - } else if ( it->action == DEFEND ) { - it->source->defend(); - } else { - std::cout << "Incorrect action! Returning" << std::endl; - return false; - } - - - if ( !anyPCAlive() ) { - std::cout << it->source->name() << " has vanquished your party." << std::endl; - return false; - } - - } - - // Process the user actions - for ( coll_type::iterator it = pcs_.begin(); it != pcs_.end(); ++it ) { - - - if ( (*it)->isDead() ) { - std::cout << (*it)->name() << " is dead" << std::endl; - continue; - } - - - std::cout << "Action for " << (*it)->name() << ": " << std::endl; - QuickAction qa; - std::string line; - in >> line; - //std::getline( in, line ); - bool success = parseAction( line, qa ); - while ( !success ) { - std::cout << "Invalid input, try again" << std::endl; - in >> line; - success = parseAction( line, qa ); - } - if ( qa.action == ATTACK ) { - (*it)->attack(); - } else if ( qa.action == HEAL ) { - (*it)->heal(); - } else if ( qa.action == DEFEND ) { - (*it)->defend(); - } else { - std::cout << "Incorrect action! Returning" << std::endl; - return false; - } - - - if ( !anyNPCAlive() ) { - std::cout << (*it)->name() << " has vanquished your foe." << std::endl; - return false; - } - - } - - - ++turn_; - - return anyPCAlive() && anyNPCAlive(); - -} - -// Set the next Boss target. It looks for the -// first character, in order, that is not dead. -bool Battle::setBossTarget( Boss * boss ) { - - Entity const * entity = boss->getTarget(); - - if ( boss == 0 ) { - std::cout << "Boss is zero, cannot set new target" << std::endl; - return false; - } - for( coll_type::const_iterator pc = pcs_.begin(); pc != pcs_.end(); ++pc ) { - if ( (*pc)->isAlive() ) { - if ( pc->get() != entity ){ - std::cout << boss->name() << " shifts their attacks to " << (*pc)->name() << std::endl; - } - boss->setTarget( pc->get() ); - return true; - } - } - - // Here there are no targets alive. - return false; - -} - -bool Battle::anyPCAlive() const { - bool anyPCAliveRet = false; - for( coll_type::const_iterator pc = pcs_.begin(); pc != pcs_.end(); ++pc ) { - if ( (*pc)->isAlive() ) anyPCAliveRet = true; - } - return anyPCAliveRet; -} - - -bool Battle::anyNPCAlive() const { - bool anyNPCAliveRet = false; - for( coll_type::const_iterator npc = npcs_.begin(); npc != npcs_.end(); ++npc ) { - if ( (*npc)->isAlive() ) anyNPCAliveRet = true; - } - return anyNPCAliveRet; -} - - -Battle::coll_type::iterator Battle::find_entity( std::string s ) -{ - // Try to find the sources and targets: - coll_type::iterator source_pc = std::find_if( pcs_.begin(), pcs_.end(), MatchSource( s ) ); - coll_type::iterator source_npc = std::find_if( npcs_.begin(), npcs_.end(), MatchSource( s ) ); - - if ( source_pc == pcs_.end() && source_npc == npcs_.end() ) { - std::cout << "No matching source for " << s << std::endl; - return pcs_.end(); - } else if ( source_pc == pcs_.end() ) { - return source_npc; - } else { - return source_pc; - } -} - - -void Battle::printStats( std::ostream & out ) { - out << "------------------------------- Turn : " << turn_ << "-------------------------------" << std::endl; - out << "-----------------------------" << std::endl; - out << " === players:" << std::endl; - // Remember! "coll_type" is just an alias for std::vector< std::shared_ptr > - for ( coll_type::const_iterator it = pcs_.begin(); - it != pcs_.end(); ++it ) { - (*it)->printStats(out); - } - out << std::endl << " === monsters:" << std::endl; - for ( coll_type::const_iterator it = npcs_.begin(); - it != npcs_.end(); ++it ) { - (*it)->printStats(out); - } - out << "-----------------------------" << std::endl; -} - -void Battle::print( std::ostream & out ) { - out << "------------------------------- Turn : " << turn_ << "-------------------------------" << std::endl; - out << "--------------" << std::endl; - out << " === players:" << std::endl; - // Remember! "coll_type" is just an alias for std::vector< std::shared_ptr > - for ( coll_type::const_iterator it = pcs_.begin(); - it != pcs_.end(); ++it ) { - out << **it << std::endl; - } - out << std::endl << " === monsters:" << std::endl; - for ( coll_type::const_iterator it = npcs_.begin(); - it != npcs_.end(); ++it ) { - out << **it << std::endl; - } - out << "--------------" << std::endl; -} - -void Battle::printActions( std::ostream & out ) { - - out << " ----- Action list ----" << std::endl; - for ( std::vector::const_iterator it = actions_.begin(); - it != actions_.end(); ++it ) { - if ( it->source == 0 ) { - std::cout << "Configuration error." << std::endl; - return; - } - out << it->source->name() << " will perform action " << it->action << " on their target : "; - if ( it->source->getTarget() != 0) { - out << it->source->getTarget()->name() << std::endl; - } else { - out << " NO TARGET!" << std::endl; - } - } - -} - - -void Battle::printLog( std::ostream & out ) const -{ - - out << "{\"Turns\":[" << std::endl; - for ( unsigned int iturn = 0; iturn <= turn_; ++iturn ){ - - out << "{\"Turn\":" << iturn << "," << std::endl; - - for ( auto i = npcs_.begin(); i != npcs_.end(); ++i ){ - (*i)->printActions(out, iturn); - out << "," << std::endl; - } - for ( auto i = pcs_.begin(); i != pcs_.end(); ++i ){ - (*i)->printActions(out, iturn); - // json does not like trailing commas - if ( i != pcs_.end() - 1) - out << "," << std::endl; - else - out << std::endl; - } - out << "}"; - if ( iturn != turn_ ) - out << "," << std::endl; - else - out << std::endl; - } - out << "]}" << std::endl; -} diff --git a/Boss.cc b/Boss.cc deleted file mode 100644 index bdac9a1..0000000 --- a/Boss.cc +++ /dev/null @@ -1,95 +0,0 @@ -#include "Boss.h" -#include -#include - -Boss::Boss( std::string name, int attackPower, int defensePower, int healPower, int mana, int multiAttackPower ) : - Entity( "Boss", name, attackPower, defensePower, healPower, mana, false) { - multiAttackPower_ = multiAttackPower; - hitPoints_ = 500; - maxHitPoints_ = 500; -}; - - - -int Boss::multiAttack( Entity * other ) { - - Entity * originalTarget = getTarget(); - - if ( other != 0 ) { - setTarget(other); - } - int ap = this->multiAttackPower_; - - if ( getTarget() != 0 ) { - std::cout << name() << " multi-attacks " << getTarget()->name() << " with attack power " << ap<< std::endl; - int retval = getTarget()->reduceHitPoints( ap ); - setTarget(originalTarget); - if ( myAttacks_.find(turn_) == myAttacks_.end() ) - myAttacks_[turn_] = action_vector(); - myAttacks_[turn_].push_back(retval); - return retval; - } else { - std::cout << name_ << " does not have a target to attack." << std::endl; - setTarget( originalTarget); - return 0; - } -}; - - -// Print to "out" -void Boss::printStats( std::ostream & out) const { - out << std::setw(12) - << name_ << " (" << std::setw(10) << className_ << "): HP=" << std::setw(5) << hitPoints_ - << ", attack=" << std::setw(5) << attackPower_ - << ", defend=" << std::setw(5) << defensePower_ - << ", heal=" << std::setw(5) << healPower_; - if ( isMagicUser() ) { - out << ", mana = " << std::setw(5) << mana_; - } - out << ", multi =" << std::setw(5) << multiAttackPower_; - if ( target_ != 0 ) { - out << ", target=" << std::setw(12) << target_->name(); - } else { - out << ", no target"; - } -} - - -// Print to "out" -void Boss::print( std::ostream & out) const { - out << std::setw(12) - << name_ << " (" << std::setw(10) << className_ << "): HP=" << std::setw(5) << hitPoints_ - << ", mana = " << std::setw(5) << mana_; - if ( target_ != 0 ) { - out << ", target=" << std::setw(12) << target_->name(); - } else { - out << ", no target"; - } -} - - - - -void Boss::input( std::string line ) -{ - std::vector tokens; - - std::stringstream linestream(line); - for (std::string each=""; std::getline(linestream, each, ';'); ){ - tokens.push_back(each); - } - if ( tokens.size() >= 6 ) { - name_ = tokens[0]; - attackPower_ = std::atoi( tokens[1].c_str() ); - defensePower_ = std::atoi( tokens[2].c_str() ); - healPower_ = std::atoi( tokens[3].c_str() ); - mana_ = std::atoi( tokens[4].c_str() ); - multiAttackPower_ = std::atoi( tokens[5].c_str() ); - - std::cout << "Input boss: " << *this << std::endl; - } else { - std::cout << "Formatting error in input: unrecognized syntax in line : " << line << std::endl; - return; - } - -} diff --git a/Boss.h b/Boss.h deleted file mode 100644 index 1d36901..0000000 --- a/Boss.h +++ /dev/null @@ -1,65 +0,0 @@ -#ifndef Boss_h -#define Boss_h - -#include "Entity.h" -#include - - /* ____ */ - /* | _ \ */ - /* | |_) | ___ ___ ___ */ - /* | _ < / _ \/ __/ __| */ - /* | |_) | (_) \__ \__ \ */ - /* |____/ \___/|___/___/ */ -// -// This is the Boss class. -// Bosses are special entities that are stronger, -// and have the ability to attack the entire opposing party at once. -// -// In addition to the standard Entity interface, it also has -// an "attackAll" function that will attack all of the entities -// inside of a vector. -// -------------------------------------- - -class Boss : public Entity{ - public : - - friend class Battle; - - Boss( std::string name="", - int attackPower=0, - int healPower=0, - int defensePower=0, - int mana=0, - int multiAttackPower=0 ); - - // Default defend, heal, and attack - virtual int defend( Entity * other =0){ - return defaultDefend(other); - } - virtual int heal( Entity * other=0 ){ - return defaultHeal(other); - } - virtual int attack( Entity * other=0 ){ - return defaultAttack( other ); - } - - // Special multiattack to attack many at once. - virtual int multiAttack( Entity * other = 0); - - virtual void printStats(std::ostream &out) const; - virtual void print(std::ostream &out) const; - - - // Overload the input method. - virtual void input( std::string line ); - - protected: - action_map myMultiAttacks_; - - private : - int multiAttackPower_; // The attack power of a mob who can attack more than one opponent. - - -}; - -#endif diff --git a/Entity.cc b/Entity.cc deleted file mode 100644 index 61ef0ee..0000000 --- a/Entity.cc +++ /dev/null @@ -1,284 +0,0 @@ -#include "Entity.h" -#include -#include -#include -#include -#include - -// Constructor -Entity::Entity( std::string className, - std::string name, - unsigned int attackPower, - unsigned int defensePower, - unsigned int healPower, - unsigned int maxMana, - bool check - ): - className_(className), - name_(name), - hitPoints_(100), - maxHitPoints_(100), - mana_(maxMana), - attackPower_(attackPower), - defensePower_(defensePower), - healPower_(healPower), - target_(0) // uninitialized target -{ - if ( check ){ - // Check to make sure your powers aren't outrageous - checkPowers(); - } -} - -// Destructor -Entity::~Entity(){} - -// All of these default to "do nothing" and should be overriden in the derived classes. -int Entity::attack( Entity * other ) { return 0;} -int Entity::heal ( Entity * other ) { return 0;} -int Entity::defend( Entity * other ) { return 0;} - -void Entity::input( std::string line ) -{ - std::vector tokens; - - std::stringstream linestream(line); - for (std::string each=""; std::getline(linestream, each, ';'); ){ - tokens.push_back(each); - } - if ( tokens.size() >= 4 ) { - name_ = tokens[0]; - attackPower_ = std::atoi( tokens[1].c_str() ); - defensePower_ = std::atoi( tokens[2].c_str() ); - healPower_ = std::atoi( tokens[3].c_str() ); - } else { - std::cout << "Formatting error in input: unrecognized syntax in line : " << line << std::endl; - return; - } - checkPowers(); -} - -// Input from "in" -void Entity::input( std::istream &in ) { - std::string line; - std::getline( in, line ); - input(line); -}; - -// Print to "out" - -void Entity::print( std::ostream & out) const { - out << std::setw(12) - << name_ << " (" << std::setw(10) << className_ << "): HP=" << std::setw(5) << hitPoints_ - << ", mana = " << std::setw(5) << mana_; - if ( target_ != 0 ) { - out << ", target=" << std::setw(12) << target_->name(); - } else { - out << ", no target"; - } -} - - - -void Entity::printStats( std::ostream & out) const { - out << std::setw(12) - << name_ << " (" << std::setw(10) << className_ << "): HP=" << std::setw(5) << hitPoints_ - << ", attack=" << std::setw(5) << attackPower_ - << ", defend=" << std::setw(5) << defensePower_ - << ", heal=" << std::setw(5) << healPower_ - << ", mana = " << std::setw(5) << mana_; - if ( target_ != 0 ) { - out << ", target=" << std::setw(12) << target_->name(); - } else { - out << ", no target"; - } -} - - - -// Reduce the hit points of "this" entity by "attack", mitigated by "defensePower" -int Entity::reduceHitPoints( int attack ) { - int diff = (attack - defensePower_); - if ( diff < 0 ) - diff = 0; - else if ( diff >= hitPoints_) // Protect against "overkill" in the stats accounting. - diff = hitPoints_; - std::cout << name_ << " loses " << diff << " hit points after attack " << attack << " and defense " << defensePower_ << std::endl; - hitPoints_ -= diff; - if (hitPoints_ <= 0) { - hitPoints_ = 0; - std::cout << name_ << ", the brave " << className_ << ", has died." << std::endl; - } - if ( myReducedHitPoints_.find(turn_) == myReducedHitPoints_.end() ) - myReducedHitPoints_[turn_] = action_vector(); - myReducedHitPoints_[turn_].push_back(diff); - return diff; -} - -// Increase the hit points of "this" entity -int Entity::increaseHitPoints( int heal ) { - int healed = heal; // Protect against "overheal" in the stats accounting. - if ( hitPoints() + healed >= maxHitPoints_) - healed = maxHitPoints_ - hitPoints(); - hitPoints_ += healed; - if ( myIncreasedHitPoints_.find(turn_) == myIncreasedHitPoints_.end() ) - myIncreasedHitPoints_[turn_] = action_vector(); - myIncreasedHitPoints_[turn_].push_back(healed); - return healed; -} - - -// This will force the target of the other object to be "this" Entity. -int Entity::defaultDefend( Entity * other ) { - if ( other != 0 ) { - setTarget(other); - } - if ( getTarget() != 0 ) { - - if ( getTarget()->isDead() ) { - std::cout << name_ << " : target " << getTarget()->name() << " is already dead." << std::endl; - return 0; - } - std::cout << name_ << " defends against " << getTarget()->name() << " with defense mitigation " << defensePower() << std::endl; - getTarget()->setTarget(this); - } else { - std::cout << name_ << " does not have a target to defend." << std::endl; - } - if ( myDefends_.find(turn_) == myDefends_.end() ) - myDefends_[turn_] = action_vector(); - myDefends_[turn_].push_back( defensePower() ); - return 0; -} - - -// In a heal, we increase the hit points -int Entity::defaultHeal( Entity * other ) { - if ( mana_ < 10 ) { - std::cout << name() << " does not have enough mana." << std::endl; - return 0; - } - if ( other != 0 ) { - setTarget(other); - } - if ( getTarget() != 0 ){ - - if ( getTarget()->isDead() ) { - std::cout << name_ << " : target " << getTarget()->name() << " is already dead." << std::endl; - myHeals_[turn_].push_back(0); - return 0; - } - mana_ -= 10; - auto healed = getTarget()->increaseHitPoints( healPower_ ); - std::cout << name() << " healed " << getTarget()->name() << " with heal power " << healPower_ << " for " << healed << std::endl; - if ( myHeals_.find(turn_) == myHeals_.end() ) - myHeals_[turn_] = action_vector(); - myHeals_[turn_].push_back( healed ); - return healed; - } - else { - std::cout << name_ << " does not have a target to heal." << std::endl; - return 0; - } -}; - - -// In an attack, we reduce the hit points -int Entity::defaultAttack( Entity * other ) { - if ( other != 0 ) { - setTarget(other); - } - - if ( getTarget() != 0 ) { - if ( getTarget()->isDead() ) { - std::cout << name_ << " : target " << getTarget()->name() << " is already dead." << std::endl; - myAttacks_[turn_].push_back( 0 ); - return 0; - } - - int ap = attackPower_; - auto attacked = getTarget()->reduceHitPoints( ap ); - std::cout << name() << " attacked " << getTarget()->name() << " with attack power " << ap << " for damage " << attacked << std::endl; - if ( myAttacks_.find(turn_) == myAttacks_.end() ) - myAttacks_[turn_] = action_vector(); - myAttacks_[turn_].push_back( attacked ); - return attacked; - } else { - std::cout << name_ << " does not have a target to attack." << std::endl; - myAttacks_[turn_].push_back( 0 ); - return 0; - } -}; - -// This will check to ensure the input values are sensible -bool Entity::checkPowers() { - - isMagicUser_ = ( mana_ > 0); - if ( attackPower_ + defensePower_ + healPower_ > 20 ) { - std::cout << name_ << " : You cannot godmode here, your abilities can only sum to 20." << std::endl - << "To punish you, the gods set your hitpoints to 1 and make you feeble as a kitten." << std::endl; - hitPoints_ = 1; - attackPower_ = 0; - defensePower_ = 0; - healPower_ = 0; - return false; - } - if ( attackPower_ < 0 || defensePower_ < 0 || healPower_ < 0 ) { - std::cout << name_ << " : Your powers cannot be negative." << std::endl - << "To punish you, the gods set your hitpoints to 1 and make you feeble as a kitten." << std::endl; - hitPoints_ = 1; - attackPower_ = 0; - defensePower_ = 0; - healPower_ = 0; - return false; - } - - return true; -}; - -// Some operators to support << and >> -std::ostream & operator<<( std::ostream & out, Entity const & e){ e.print(out); return out; } -std::istream & operator>>( std::istream & in, Entity & e) {e.input(in); return in;} - - - - - - -void Entity::printActions(std::ostream & out, unsigned int iturn) const { - - auto allactions = { - std::make_pair( "Attacks", &myAttacks_ ), - std::make_pair( "Defends", &myDefends_ ), - std::make_pair( "Heals", &myHeals_ ), - std::make_pair( "DamageReceived", &myReducedHitPoints_ ), - std::make_pair( "HealingRecieved", &myIncreasedHitPoints_ ) - }; - - out << "\"" << name_ << "\":{"; - for ( auto iaction = allactions.begin(); iaction != allactions.end(); ++iaction){ - auto actionname = iaction->first; - auto actions = iaction->second; - out << "\"" << actionname << "\":["; - - // Check if there are any actions for this turn - auto p_action = actions->find(iturn); - if ( p_action != actions->end() ){ - auto actionvals = p_action->second; - for ( auto ival = actionvals.begin(); ival != actionvals.end(); ++ival ){ - out << *ival; - // json does not like trailing comma - if ( ival + 1 != actionvals.end() ) - out << ","; - } - } else { - out << 0; - } - out << "]"; - - if ( iaction != allactions.end() - 1 ){ - out << ","; - } - out << std::endl; - } - out << "}"; -} diff --git a/Entity.h b/Entity.h deleted file mode 100644 index d9c68e3..0000000 --- a/Entity.h +++ /dev/null @@ -1,164 +0,0 @@ -#ifndef Entity_h -#define Entity_h - -#include -#include -#include -#include - -// -------------------------------------- -/* ______ _ _ _ */ -/* | ____| | | (_) | */ -/* | |__ _ __ | |_ _| |_ _ _ */ -/* | __| | '_ \| __| | __| | | | */ -/* | |____| | | | |_| | |_| |_| | */ -/* |______|_| |_|\__|_|\__|\__, | */ -/* __/ | */ -/* |___/ */ -// -------------------------------------- -// -// This is the main base class for the Entities -// in the game. -// -// It provides access to these -// data members: -// std::string className_; // Name of this class (like, Warrior or Druid or Rogue) -// std::string name_; // Name of this particular entity (like, Lothar the Great) -// int isMagicUser_; // Can this user use magic? -// int hitPoints_; // Number of hit points left. -// int mana_; // Number of magical "mana" points are left to perform magic -// int attackPower_; // Number of hit points inflicted if I attack -// int defensePower_; // Number of hit points mitigated if someone attacks ME -// int healPower_; // Number of hit points to heal -// Entity * target_; // This Entity's current target for action -// -// These will store the history of the results of various actions -// action_map myAttacks_; -// action_map myDefends_; -// action_map myHeals_; -// action_map myReducedHitPoints_; -// action_map myIncreasedHitPoints_; -// -// The interface should be written in the base classes: -// Attack a target: virtual int attack( Entity * target=0 ); -// Heal an ally: virtual int heal ( Entity * ally=0 ); -// Defend against a target virtual int defend( Entity * target=0 ); -// -// These should make appropriate use of the helper functions -// int reduceHitPoints( int attack ); -// int increaseHitPoints( int heal ); -// -------------------------------------- -class Entity { - - public: - - Entity( std::string className, - std::string name, - unsigned int attackPower, - unsigned int healPower, - unsigned int defensePower, - unsigned int maxMana = 0, - bool check=true - ); - virtual ~Entity(); - - // The Battle class will handle the status of everyone in the fight. - // It will perform turn-based actions. - friend class Battle; - - // For recording actions - typedef std::vector action_vector; - typedef std::map< unsigned int, action_vector > action_map; - - // All of these default to "do nothing" and should be overriden in the derived classes. - virtual int attack( Entity * target=0 ); - virtual int heal ( Entity * ally=0 ); - virtual int defend( Entity * target=0 ); - - // Getter methods - std::string className() const { return className_;} - std::string name() const { return name_; } - int attackPower() const { return attackPower_; } - int defensePower() const { return defensePower_; } - int healPower() const { return healPower_; } - int hitPoints() const { return hitPoints_; } - int mana() const { return mana_; } - bool isDead() const { return hitPoints_ <= 0; } - bool isAlive() const { return !isDead(); } - - // Input and output - virtual void input( std::string instring); - virtual void input( std::istream &in ); - virtual void print( std::ostream &out) const; - virtual void printStats( std::ostream &out) const; - friend std::ostream & operator<<( std::ostream & out, Entity const & e); - friend std::istream & operator>>( std::istream & in, Entity & e); - - - - // - // Call these functions correctly in your derived classes - // when overloading "attack", "heal", and "block" - - // Reduce the hit points of "this" entity - int reduceHitPoints( int attack ); - // Increase the hit points of "this" entity - int increaseHitPoints( int heal ); - - - // Can this user use magic? - bool isMagicUser() const { return isMagicUser_; } - - // Set my current target - void setTarget( Entity * target ) { target_ = target; } - - // Get my current target - Entity * getTarget( void ) { return target_; } - - // These will store the history of the results of various actions - action_map const & myAttacks() const { return myAttacks_;} - action_map const & myDefends() const { return myDefends_;} - action_map const & myHeals() const { return myHeals_;} - action_map const & myReducedHitPoints() const { return myReducedHitPoints_;} - action_map const & myIncreasedHitPoints() const { return myIncreasedHitPoints_;} - - // Print the actions in a json format for turn "iturn". - void printActions(std::ostream & out, unsigned int iturn) const; - - protected : - unsigned int turn_; // Turn that "this" Entity is on. - std::string className_; // Name of this class (like, Warrior or Druid or Rogue) - std::string name_; // Name of this particular entity (like, Lothar the Great) - int isMagicUser_; // Can this user use magic? - int hitPoints_; // Number of hit points left. - int maxHitPoints_; // Maximum number of hit points possible - int mana_; // Number of magical "mana" points are left to perform magic - int attackPower_; // Number of hit points inflicted if I attack - int defensePower_; // Number of hit points mitigated if someone attacks ME - int healPower_; // Number of hit points to heal - - - Entity * target_; // This Entity's current target for action - - unsigned int getTurn() const { return turn_; } // return this turn. - - bool checkPowers(); // This will check to ensure the input values are sensible - - - - // Here are some default "attack", "defend", and "heal" methods. - int defaultAttack( Entity * target = 0); - int defaultHeal ( Entity * target = 0); - int defaultDefend( Entity * target = 0); - - // These will store the history of the results of various actions - action_map myAttacks_; - action_map myDefends_; - action_map myHeals_; - action_map myReducedHitPoints_; - action_map myIncreasedHitPoints_; - - -}; - -#endif diff --git a/Makefile b/Makefile index 93de626..aa1ab17 100644 --- a/Makefile +++ b/Makefile @@ -1,38 +1,48 @@ -# I am a comment, and I want to say that the variable CXX will be -# the compiler to use. -CXX=g++ -# Hey!, I am comment number 2. I want to say that CXXFLAGS will be the -# options I'll pass to the compiler. -CXX_FLAGS=-Wall -std=c++11 - - -EXEC_SRC = test_entity.cc test_boss.cc test_battle.cc WorldOfTextCraft.cc -EXEC = test_entity test_boss test_battle WorldOfTextCraft - -SRCS := $(wildcard *.cc) -SRCS := $(filter-out $(EXEC_SRC), $(SRCS)) -OBJECTS = $(SRCS:.cc=.o) - - -all: $(EXEC) - -test_entity: $(OBJECTS) test_entity.cc - $(CXX) $(CXX_FLAGS) $(OBJECTS) test_entity.cc -o test_entity - -test_boss: $(OBJECTS) test_boss.cc - $(CXX) $(CXX_FLAGS) $(OBJECTS) test_boss.cc -o test_boss - -test_battle: $(OBJECTS) test_battle.cc - $(CXX) $(CXX_FLAGS) $(OBJECTS) test_battle.cc -o test_battle - -WorldOfTextCraft: $(OBJECTS) WorldOfTextCraft.cc - $(CXX) $(CXX_FLAGS) $(OBJECTS) WorldOfTextCraft.cc -o WorldOfTextCraft - - -# To obtain object files -%.o: %.cc - $(CXX) $(CXX_FLAGS) -c $< -o $@ - -# To remove generated files +# Compiler and flags +CXX := g++ +CXXFLAGS := -std=c++17 -O2 -Wall -I./interface + +# Directories +SRC_DIR := src +INC_DIR := interface +TEST_DIR := tests +OBJ_DIR := build +BIN_DIR := bin + +# File patterns +SRC_FILES := $(filter-out src/WorldOfTextCraft.cc, $(wildcard $(SRC_DIR)/*.cc)) +OBJ_FILES := $(patsubst $(SRC_DIR)/%.cc, $(OBJ_DIR)/%.o, $(SRC_FILES)) +TEST_FILES := $(wildcard $(TEST_DIR)/*.cc) +TEST_BINS := $(patsubst $(TEST_DIR)/%.cc, $(TEST_DIR)/%.exe, $(TEST_FILES)) + +# Default target +all: bin/WorldOfTextCraft.exe $(TEST_BINS) + +# Rule to build main executable +bin/WorldOfTextCraft.exe: $(OBJ_FILES) + @echo "Linking $@..." + $(CXX) $(CXXFLAGS) -o $@ src/WorldOfTextCraft.cc $(OBJ_FILES) + +# Rule to build test executables +$(TEST_DIR)/%.exe: $(TEST_DIR)/%.cc $(OBJ_FILES) | $(BIN_DIR) + @echo "Linking $@..." + $(CXX) $(CXXFLAGS) -o $@ $< $(OBJ_FILES) + +# Rule to compile source files into object files +$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cc | $(OBJ_DIR) + @echo "Compiling $<..." + $(CXX) $(CXXFLAGS) -c $< -o $@ + +# Create directories if they don't exist +$(OBJ_DIR): + mkdir -p $(OBJ_DIR) + +$(BIN_DIR): + mkdir -p $(BIN_DIR) + +# Cleanup clean: - rm -f $(EXEC) $(OBJECTS) + rm -rf ./$(OBJ_DIR)/*.o ./$(BIN_DIR)/*.exe + +# Phony targets +.PHONY: all clean diff --git a/MatchingHelpers.h b/MatchingHelpers.h deleted file mode 100644 index 197242f..0000000 --- a/MatchingHelpers.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef MatchingHelpers_h -#define MatchingHelpers_h - -#include "Entity.h" -#include - -class MatchSource { -public : - MatchSource( std::string s ) : s_(s) {} - - bool operator() ( std::shared_ptr const & entity ) { - if ( entity->name() == s_ ) { - return true; - } - return false; - } - -protected : - std::string s_; -}; - - -class MatchTarget { -public : - MatchTarget( std::string s ) : s_(s) {} - bool operator() ( std::shared_ptr const & entity ) { - if ( entity->getTarget() != 0 && entity->getTarget()->name() == s_ ) { - return true; - } - return false; - } -protected : - std::string s_; -}; - - - -#endif diff --git a/Priest.h b/Priest.h deleted file mode 100644 index 9e450b2..0000000 --- a/Priest.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef Priest_h -#define Priest_h - - /* _____ _ _ */ - /* | __ \ (_) | | */ - /* | |__) | __ _ ___ ___| |_ */ - /* | ___/ '__| |/ _ \/ __| __| */ - /* | | | | | | __/\__ \ |_ */ - /* |_| |_| |_|\___||___/\__| */ - -class Priest : public Entity{ - public : - Priest( std::string name="", int healPower=0 ) : - Entity( "Priest", name, 0, 0, healPower, 100) { - }; - - // In a heal, we increase the hit points - virtual int heal( Entity * other=0 ) { - return defaultHeal( other ); - }; - - private : -}; - -#endif diff --git a/README.md b/README.md index e25a155..9f67bd9 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@ # WorldOfTextCraft This is a trivial turn-based role-playing fighting game, designed to teach C++. -Apologies to Blizzard Entertainment and the Three Stooges for cribbing (and butchering) their content. +Apologies to Blizzard Entertainment for cribbing (and butchering) their content. The goal was to make this "bare bones" without a complicated build so people can see for themselves what is involved in the software. This does require C++11 because of the use of a `vector< shared_ptr >` for memory management. There is a very trivial Makefile to create three executables: -- **test_entity**: test the base fighting class functionality +- **test_character**: test the base fighting class functionality - **test_boss**: test the boss functionality - **test_battle**: test a pre-scripted battle - **WorldOfTextCraft**: the actual text-based RPG. @@ -83,7 +83,7 @@ In all syntax files, lines starting with "!" will be ignored (i.e. comments) ! Test party configuration: ! Warrior, Rogue, Priest ! Fields are : - ! name, entity type, attack power, heal power, defense power + ! name, character type, attack power, heal power, defense power Rogue;Curly;20;0;0; Priest;Larry;0;0;8; Warrior;Moe;0;3;0; @@ -131,7 +131,7 @@ In all syntax files, lines starting with "!" will be ignored (i.e. comments) The game is rather simple. Initially there are three player classes, all with 100 hit points, and one Boss class, with 500 hit points. Once a character reaches 0 hit points, it dies. All characters have a common base C++ class -"Entity", and then override the functionality in that base C++ class to be player-class-specific: +"Character", and then override the functionality in that base C++ class to be player-class-specific: - Rogue: can cast "attack", which reduces the hit points of a target by 20. - Warrior: can cast "defend", which forces the target to attack the Warrior. They have a defense mitigation modifier ("defense power") that reduces the hit points lost upon an attack. The final damage is "attack_power - defense_power". @@ -152,9 +152,9 @@ You will be prompted as follows: ``` text reading PC configuration -Added entity: Fordring ( Warrior): HP= 100, mana = 0, no target -Added entity: Thrall ( Priest): HP= 100, mana = 100, no target -Added entity: Mograine ( Rogue): HP= 100, mana = 0, no target +Added character: Fordring ( Warrior): HP= 100, mana = 0, no target +Added character: Thrall ( Priest): HP= 100, mana = 100, no target +Added character: Mograine ( Rogue): HP= 100, mana = 0, no target reading NPC configuration Input boss: Arthas ( Boss): HP= 500, mana = 0, no target reading NPC action script @@ -184,7 +184,7 @@ reading NPC action script |--------------------------------------------| |--------------------------------------------| Welcome brave traveler... -You venture forth from your stronghold in Azeroth to the icy continent of Northrend, accompanied only by your fellow adventurers and your courage. You have tracked Arthas Menethil to his Frozen Throne in the plagued wastelands of Icecrown. Once a brave champion of Lordaeron, Arthas was corrupted by evil and his soul subsumed by the shaman Ner'zhul upon taking the cursed Runeblade, Frostmourne, forming the entity known as the Lich King, threatening all life in Azeroth to become mindless undead slaves of the Burning Legion. The Knights of the Ebon Blade and the Argent Crusade have now formed the Ashen Verdict, and tasked you to destroy the Lich King and end his undead plague upon Azeroth. As you reach the Frozen Throne, the Lich King's seat, you hear a voice in your head. The Lich King whispers "Young heroes, I was once like you. You have come to this place seeking to bring judgement upon the damned. But, be warned. In the end, all that awaits you is death. Only then will you understand, you've been following in my footsteps all along. So come then, you heroes! Come in all your power and glory! For in this final hour, all must serve the one... true... king... Frostmourne HUNGERS....". The battle is joined. +You venture forth from your stronghold in Azeroth to the icy continent of Northrend, accompanied only by your fellow adventurers and your courage. You have tracked Arthas Menethil to his Frozen Throne in the plagued wastelands of Icecrown. Once a brave champion of Lordaeron, Arthas was corrupted by evil and his soul subsumed by the shaman Ner'zhul upon taking the cursed Runeblade, Frostmourne, forming the character known as the Lich King, threatening all life in Azeroth to become mindless undead slaves of the Burning Legion. The Knights of the Ebon Blade and the Argent Crusade have now formed the Ashen Verdict, and tasked you to destroy the Lich King and end his undead plague upon Azeroth. As you reach the Frozen Throne, the Lich King's seat, you hear a voice in your head. The Lich King whispers "Young heroes, I was once like you. You have come to this place seeking to bring judgement upon the damned. But, be warned. In the end, all that awaits you is death. Only then will you understand, you've been following in my footsteps all along. So come then, you heroes! Come in all your power and glory! For in this final hour, all must serve the one... true... king... Frostmourne HUNGERS....". The battle is joined. Are you ready to begin? [Y/n] ``` diff --git a/Rogue.h b/Rogue.h deleted file mode 100644 index 136b07e..0000000 --- a/Rogue.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef Rogue_h -#define Rogue_h - - - /* _____ */ - /* | __ \ */ - /* | |__) |___ __ _ _ _ ___ */ - /* | _ // _ \ / _` | | | |/ _ \ */ - /* | | \ \ (_) | (_| | |_| | __/ */ - /* |_| \_\___/ \__, |\__,_|\___| */ - /* __/ | */ - /* |___/ */ - -class Rogue : public Entity{ - public : - Rogue( std::string name="", int attackPower=0 ) : - Entity( "Rogue", name, attackPower, 0, 0) { - }; - - // In an attack, we reduce the hit points - virtual int attack( Entity * other=0 ) { - return defaultAttack(other); - }; -}; - -#endif diff --git a/Warrior.h b/Warrior.h deleted file mode 100644 index 781ab92..0000000 --- a/Warrior.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef Warrior_h -#define Warrior_h - - - /* __ __ _ */ - /* \ \ / / (_) */ - /* \ \ /\ / /_ _ _ __ _ __ _ ___ _ __ */ - /* \ \/ \/ / _` | '__| '__| |/ _ \| '__| */ - /* \ /\ / (_| | | | | | | (_) | | */ - /* \/ \/ \__,_|_| |_| |_|\___/|_| */ - - -class Warrior : public Entity{ - public : - Warrior( std::string name="", int defensePower=0 ) : - Entity( "Warrior", name, 0, defensePower, 0) { - }; - - // This will force the target of the other object to be "this" Entity. - virtual int defend( Entity * other =0) { - return defaultDefend(other); - } - -}; - -#endif diff --git a/Arthas.txt b/data/Arthas.txt similarity index 100% rename from Arthas.txt rename to data/Arthas.txt diff --git a/ArthasAttacks.txt b/data/ArthasAttacks.txt similarity index 100% rename from ArthasAttacks.txt rename to data/ArthasAttacks.txt diff --git a/AshenVerdict.txt b/data/AshenVerdict.txt similarity index 100% rename from AshenVerdict.txt rename to data/AshenVerdict.txt diff --git a/Battle.h b/interface/Battle.h similarity index 50% rename from Battle.h rename to interface/Battle.h index 85da6aa..f033392 100644 --- a/Battle.h +++ b/interface/Battle.h @@ -1,14 +1,13 @@ #ifndef Battle_h #define Battle_h - // -------------------------------------- - /* ____ _ _ _ */ - /* | _ \ | | | | | | */ - /* | |_) | __ _| |_| |_| | ___ */ - /* | _ < / _` | __| __| |/ _ \ */ - /* | |_) | (_| | |_| |_| | __/ */ - /* |____/ \__,_|\__|\__|_|\___| */ +/* ____ _ _ _ */ +/* | _ \ | | | | | | */ +/* | |_) | __ _| |_| |_| | ___ */ +/* | _ < / _` | __| __| |/ _ \ */ +/* | |_) | (_| | |_| |_| | __/ */ +/* |____/ \__,_|\__|\__|_|\___| */ // -------------------------------------- // This is the main driver of the game. // @@ -16,13 +15,15 @@ // consisting of the player characters (PCs) // and the non-player characters (NPCs) in order // of attack. The battle will they play out until -// one of the parties is empty. +// one of the parties is empty. // -// The configuration files will all support comments in the form of an exclamation point ("!"). -// The configuration files will have fields separated by a semicolon (";") +// The configuration files will all support comments in the form of an +// exclamation point ("!"). The configuration files will have fields separated +// by a semicolon (";") // -// The PC configuration syntax is as follows (omit the < >, they are there for notation here only) -// ;;;;; +// The PC configuration syntax is as follows (omit the < >, they are there for +// notation here only) ;;;;; // : Name of the character as a string, like "Moe" // : Type of character as a string, like "Warrior" // : Attack power as an integer, like "20" @@ -32,32 +33,32 @@ // Curly;Rogue;0;20;0; // Moe;Warrior;20;0;0; // Larry;Priest;0;0;20; -// +// // // The NPC configuration is similar, but may have different attributes since // they have a "multi-attack power" which attacks everyone in the party. -// -// Example: +// +// Example: // Shemp;Boss;20;0;0;5; // // -// There is then a syntax for the battle itself, called a "script". It will consist of a set of -// actions your team will apply per turn. -// ;; +// There is then a syntax for the battle itself, called a "script". It will +// consist of a set of actions your team will apply per turn. +// ;; // : Name of character performing action // : Name of the action to apply (like "attack", "heal", "defend") // : Name of the target on which to perform the action // // Example: // Curly;attack;Shemp; <<--- Curly attacks Shemp -// Moe;defend;Shemp; <<--- Moe switches Shemp's target to be Moe, defends. -// Larry;heal;Moe; <<--- Larry heals moe +// Moe;defend;Shemp; <<--- Moe switches Shemp's target to be Moe, +// defends. Larry;heal;Moe; <<--- Larry heals moe // -// There is also a command-line interface that will cycle through your players and ask for -// actions prompted from "std::cin" like: -// Action for Curly? +// There is also a command-line interface that will cycle through your players +// and ask for actions prompted from "std::cin" like: Action for Curly? // (You can then type "attack;Shemp;") -// Action for Moe? +// Action for Moe? // (You can then type "defend;Shemp;") // Action for Larry? // (You can then type "heal;Moe;") @@ -67,137 +68,127 @@ // // // -// The Boss "script" will also be similarly defined, but it will contain a description and -// the boss will attack whoever the target is. -// The target of the Boss is initially set to the first person in your configuration file. -// For instance, Shemp may attack the "first" person on your list (above, this is Moe), and then -// attack everyone on your list. This will happen once per turn. Even in the command-line interface, -// the same sequence is executed once per turn. If the "defend" method is called, however, -// the target of +// The Boss "script" will also be similarly defined, but it will contain a +// description and the boss will attack whoever the target is. The target of the +// Boss is initially set to the first person in your configuration file. For +// instance, Shemp may attack the "first" person on your list (above, this is +// Moe), and then attack everyone on your list. This will happen once per turn. +// Even in the command-line interface, the same sequence is executed once per +// turn. If the "defend" method is called, however, the target of // -// Shemp;attack;target <<---- Shemp will attack the first person on your list -// Shemp;attack;all <<---- Shemp will attack your entire party with "multi_attack" -// -// Suppose that your Warrior Moe casts "defend" against Shemp, then Shemp's target will be -// Moe. +// Shemp;attack;target <<---- Shemp will attack the first person on +// your list Shemp;attack;all <<---- Shemp will attack your entire +// party with "multi_attack" +// +// Suppose that your Warrior Moe casts "defend" against Shemp, then Shemp's +// target will be Moe. // // -------------------------------------- - -#include -#include -#include -#include -#include -#include "Entity.h" #include "Boss.h" -#include "Warrior.h" -#include "Rogue.h" +#include "Character.h" #include "Priest.h" +#include "Rogue.h" +#include "Warrior.h" +#include +#include +#include +#include +#include class Battle { - public: - - - - // Create a "typedef" that sets an alias of one type to another to save typing. - typedef std::vector< std::shared_ptr > coll_type; +public: + // Create a "typedef" that sets an alias of one type to another to save + // typing. + typedef std::vector> CharacterVector; - Battle(): turn_(0), description_(""), userTurns_(false), scripted_(false) {} + Battle() : turn_(0), description_(""), user_turns_(false), scripted_(false) {} ~Battle() {} // Read the configuration for this Battle. // It will consist of the player characters, the non-player characters, - // in their order of attack. - bool readPCConfiguration ( std::string filename ); - bool readNPCConfiguration( std::string filename ); + // in their order of attack. + bool readPCConfiguration(std::string filename); + bool readNPCConfiguration(std::string filename); // Read a script of actions. It will consist of a // list of actions per turn to execute. - // This will append to the existing actions. - bool loadActionScript (std::string filename); + // This will append to the existing actions. + bool loadActionScript(std::string filename); // Clear the actions - void clearActions() { actions_.clear(); } + void clearActions() { actions_.clear(); } - // Are we letting the user work in turns? - void setUserTurns(bool userTurns=true) { userTurns_ = userTurns;} - bool userTurns() const { return userTurns_;} + // Are we letting the user work in turns? + void setUserTurns(bool user_turns = true) { user_turns_ = user_turns; } + bool user_turns() const { return user_turns_; } // Perform scripted actions bool performScriptedActions(); // For user turn-by-turn action - bool performUserActions( std::istream & in = std::cin ); - + bool performUserActions(std::istream &in = std::cin); // Print this turn - virtual void print( std::ostream & out = std::cout ); + virtual void print(std::ostream &out = std::cout); // Print all of the stats of the players in the battle - void printStats( std::ostream & out = std::cout ); + void printStats(std::ostream &out = std::cout); // Print the actions queued - void printActions( std::ostream & out = std::cout ); + void printActions(std::ostream &out = std::cout); // Return the description std::string description() const { return description_; } - // Print the splash screen - void splash( std::ostream & out = std::cout ) const; + void splash(std::ostream &out = std::cout) const; // Print the logfile of the battle - void printLog( std::ostream & out) const; - - private: - - - unsigned int turn_; // What turn is it? - std::string description_; // Fun description of battle. - bool userTurns_; // Input turn-by-turn user input? By default, no. - coll_type pcs_; // Player characters - coll_type npcs_; // Non-player characters + void printLog(std::ostream &out) const; - bool scripted_; // Is this fight scripted or user-turns? +private: + unsigned int turn_; // What turn is it? + std::string description_; // Fun description of battle. + bool user_turns_; // Input turn-by-turn user input? By default, no. + CharacterVector pcs_; // Player characters + CharacterVector npcs_; // Non-player characters + bool scripted_; // Is this fight scripted or user-turns? // // // Internal workings of "Battle": - // Each turn, Entities will perform actions on each other. + // Each turn, Entities will perform actions on each other. // However, we don't want to have to parse the text file - // over and over again, so we store the actions in a vector. + // over and over again, so we store the actions in a vector. + // // - // // Find a source named "s" - coll_type::iterator find_entity( std::string s ); - + CharacterVector::iterator find_character(std::string s); // This will enumerate the possible actions that can be taken - enum ActionType { - ATTACK=0,HEAL,DEFEND,MULTIATTACK,N_ACTIONS - }; - - // A private "struct" (i.e. a class with all public members) to store the source and action type - struct QuickAction{ - std::shared_ptr source; - ActionType action; - QuickAction(std::shared_ptr s=0, ActionType a=N_ACTIONS) : source(s), action(a) {} + enum ActionType { ATTACK = 0, HEAL, DEFEND, MULTIATTACK, N_ACTIONS }; + + // A private "struct" (i.e. a class with all public members) to store the + // source and action type + struct QuickAction { + std::shared_ptr source; + ActionType action; + QuickAction(std::shared_ptr s = 0, ActionType a = N_ACTIONS) + : source(s), action(a) {} }; - std::vector actions_; // List of scripted actions to perform per turn. - + std::vector + actions_; // List of scripted actions to perform per turn. // Add an action // in the format "source;action;target;" - bool parseAction( std::string, QuickAction & qa ); - + bool parseAction(std::string, QuickAction &qa); + bool anyNPCAlive() const; bool anyPCAlive() const; // Check if the Boss's target is dead. If so, set to the first living member - // of the party. Otherwise, return false; - bool setBossTarget( Boss * boss ); - + // of the party. Otherwise, return false; + bool setBossTarget(Boss *boss); }; - #endif diff --git a/interface/Boss.h b/interface/Boss.h new file mode 100644 index 0000000..c302c5c --- /dev/null +++ b/interface/Boss.h @@ -0,0 +1,52 @@ +#ifndef Boss_h +#define Boss_h + +#include "Character.h" +#include + +/* ____ */ +/* | _ \ */ +/* | |_) | ___ ___ ___ */ +/* | _ < / _ \/ __/ __| */ +/* | |_) | (_) \__ \__ \ */ +/* |____/ \___/|___/___/ */ +// +// This is the Boss class. +// Bosses are special entities that are stronger, +// and have the ability to attack the entire opposing party at once. +// +// In addition to the standard Character interface, it also has +// an "attackAll" function that will attack all of the entities +// inside of a vector. +// -------------------------------------- + +class Boss : public Character { +public: + friend class Battle; + + Boss(std::string name = "", int attack_power = 0, int heal_power = 0, + int defense_power = 0, int mana = 0, int multi_attack_power = 0); + + // Default defend, heal, and attack + int defend(Character *other = 0) override { return defaultDefend(other); } + int heal(Character *other = 0) override { return defaultHeal(other); } + int attack(Character *other = 0) override { return defaultAttack(other); } + + // Special multiattack to attack many at once. + virtual int multiAttack(Character *other = 0); + + void printStats(std::ostream &out) const override; + void print(std::ostream &out) const override; + + // Overload the input method. + void input(std::string line) override; + +protected: + ActionMap my_multi_attacks_; + +private: + int multi_attack_power_; // The attack power of a mob who can attack more than + // one opponent. +}; + +#endif diff --git a/interface/Character.h b/interface/Character.h new file mode 100644 index 0000000..7d2de47 --- /dev/null +++ b/interface/Character.h @@ -0,0 +1,156 @@ +#ifndef Character_h +#define Character_h + +#include +#include +#include +#include + +// ----------------------------------------------------------------// +/* _________ .__ __ */ +/* \_ ___ \| |__ _____ ____________ _____/ |_ ___________ */ +/* / \ \/| | \\__ \\_ __ \__ \ _/ ___\ __\/ __ \_ __ \ */ +/* \ \___| Y \/ __ \| | \// __ \\ \___| | \ ___/| | \/ */ +/* \______ /___| (____ /__| (____ /\___ >__| \___ >__| */ +/* \/ \/ \/ \/ \/ \/ */ +// ----------------------------------------------------------------// +// +// This is the main base class for the Characters +// in the game. +// The class is pure virtual. You must implement the following functions in +// derived classes: +// virtual int attack(Character *target = 0) = 0; +// virtual int heal(Character *ally = 0) = 0; +// virtual int defend(Character *target = 0) = 0; +// +// Data members: +// std::string class_name_; // Name of this class (like, Warrior or Druid or +// Rogue) std::string name_; // Name of this particular character (like, +// Lothar the Great) int is_magic_user_; // Can this user use magic? int +// hit_points_; // Number of hit points left. int mana_; // Number of +// magical "mana" points are left to perform magic int attack_power_; // +// Number of hit points inflicted if I attack int defense_power_; // +// Number of hit points mitigated if someone attacks ME int heal_power_; // +// Number of hit points to heal Character * target_; // This Character's +// current target for action +// +// These will store the history of the results of various actions +// ActionMap my_attacks_; +// ActionMap my_defends_; +// ActionMap my_heals_; +// ActionMap my_reduced_hit_points_; +// ActionMap my_increased_hit_points_; +// +// The interface should be written in the base classes: +// Attack a target: virtual int attack( Character * target=0 ); +// Heal an ally: virtual int heal ( Character * ally=0 ); +// Defend against a target virtual int defend( Character * target=0 ); +// +// These should make appropriate use of the helper functions +// int reduceHitPoints( int attack ); +// int increaseHitPoints( int heal ); +// -------------------------------------- +class Character { + +public: + Character(std::string class_name, std::string name, unsigned int attack_power, + unsigned int heal_power, unsigned int defense_power, + unsigned int max_mana = 0, bool check = true); + virtual ~Character(); + + // The Battle class will handle the status of everyone in the fight. + // It will perform turn-based actions. + friend class Battle; + + // For recording actions + typedef std::vector ActionVector; + typedef std::map ActionMap; + + // All of these default to "do nothing" and should be overriden in the derived + // classes. + virtual int attack(Character *target = 0) = 0; + virtual int heal(Character *ally = 0) = 0; + virtual int defend(Character *target = 0) = 0; + + // Getter methods + std::string className() const { return class_name_; } + std::string name() const { return name_; } + int attackPower() const { return attack_power_; } + int defensePower() const { return defense_power_; } + int healPower() const { return heal_power_; } + int hitPoints() const { return hit_points_; } + int mana() const { return mana_; } + bool isDead() const { return hit_points_ <= 0; } + bool isAlive() const { return !isDead(); } + + // Input and output + virtual void input(std::string instring); + virtual void input(std::istream &in); + virtual void print(std::ostream &out) const; + virtual void printStats(std::ostream &out) const; + friend std::ostream &operator<<(std::ostream &out, Character const &e); + friend std::istream &operator>>(std::istream &in, Character &e); + + // + // Call these functions correctly in your derived classes + // when overloading "attack", "heal", and "block" + + // Reduce the hit points of "this" character + int reduceHitPoints(int attack); + // Increase the hit points of "this" character + int increaseHitPoints(int heal); + + // Can this user use magic? + bool isMagicUser() const { return is_magic_user_; } + + // Set my current target + void setTarget(Character *target) { target_ = target; } + + // Get my current target + Character *getTarget(void) { return target_; } + + // These will store the history of the results of various actions + ActionMap const &myAttacks() const { return my_attacks_; } + ActionMap const &myDefends() const { return my_defends_; } + ActionMap const &myHeals() const { return my_heals_; } + ActionMap const &myReducedHitPoints() const { return my_reduced_hit_points_; } + ActionMap const &myIncreasedHitPoints() const { + return my_increased_hit_points_; + } + + // Print the actions in a json format for turn "iturn". + void printActions(std::ostream &out, unsigned int iturn) const; + +protected: + unsigned int turn_; // Turn that "this" Character is on. + std::string + class_name_; // Name of this class (like, Warrior or Druid or Rogue) + std::string name_; // Name of this particular character (like, Lothar the Great) + int is_magic_user_; // Can this user use magic? + int hit_points_; // Number of hit points left. + int max_hit_points_; // Maximum number of hit points possible + int mana_; // Number of magical "mana" points are left to perform magic + int attack_power_; // Number of hit points inflicted if I attack + int defense_power_; // Number of hit points mitigated if someone attacks me + int heal_power_; // Number of hit points to heal + + Character *target_; // This Character's current target for action + + unsigned int getTurn() const { return turn_; } // return this turn. + + bool checkPowers(); // This will check to ensure the input values are sensible + + // Here are some default "attack", "defend", and "heal" methods. + int defaultAttack(Character *target = 0); + int defaultHeal(Character *target = 0); + int defaultDefend(Character *target = 0); + + // These will store the history of the results of various actions + ActionMap my_attacks_; + ActionMap my_defends_; + ActionMap my_heals_; + ActionMap my_reduced_hit_points_; + ActionMap my_increased_hit_points_; +}; + +#endif diff --git a/interface/MatchingHelpers.h b/interface/MatchingHelpers.h new file mode 100644 index 0000000..9fc4674 --- /dev/null +++ b/interface/MatchingHelpers.h @@ -0,0 +1,36 @@ +#ifndef MatchingHelpers_h +#define MatchingHelpers_h + +#include "Character.h" +#include + +class MatchSource { +public: + MatchSource(std::string s) : s_(s) {} + + bool operator()(std::shared_ptr const &character) { + if (character->name() == s_) { + return true; + } + return false; + } + +protected: + std::string s_; +}; + +class MatchTarget { +public: + MatchTarget(std::string s) : s_(s) {} + bool operator()(std::shared_ptr const &character) { + if (character->getTarget() != 0 && character->getTarget()->name() == s_) { + return true; + } + return false; + } + +protected: + std::string s_; +}; + +#endif diff --git a/interface/Priest.h b/interface/Priest.h new file mode 100644 index 0000000..e3a3c07 --- /dev/null +++ b/interface/Priest.h @@ -0,0 +1,24 @@ +#ifndef Priest_h +#define Priest_h + +/* _____ _ _ */ +/* | __ \ (_) | | */ +/* | |__) | __ _ ___ ___| |_ */ +/* | ___/ '__| |/ _ \/ __| __| */ +/* | | | | | | __/\__ \ |_ */ +/* |_| |_| |_|\___||___/\__| */ + +class Priest : public Character { +public: + Priest(std::string name = "", int heal_power = 0) + : Character("Priest", name, 0, 0, heal_power, 100) {}; + + // In a heal, we increase the hit points + int defend(Character *other = 0) override { return defaultDefend(other); } + int heal(Character *other = 0) override { return defaultHeal(other); } + int attack(Character *other = 0) override { return defaultAttack(other); } + +private: +}; + +#endif diff --git a/interface/Rogue.h b/interface/Rogue.h new file mode 100644 index 0000000..f899e16 --- /dev/null +++ b/interface/Rogue.h @@ -0,0 +1,23 @@ +#ifndef Rogue_h +#define Rogue_h + +/* _____ */ +/* | __ \ */ +/* | |__) |___ __ _ _ _ ___ */ +/* | _ // _ \ / _` | | | |/ _ \ */ +/* | | \ \ (_) | (_| | |_| | __/ */ +/* |_| \_\___/ \__, |\__,_|\___| */ +/* __/ | */ +/* |___/ */ + +class Rogue : public Character { +public: + Rogue(std::string name = "", int attack_power = 0) + : Character("Rogue", name, attack_power, 0, 0) {}; + + int defend(Character *other = 0) override { return defaultDefend(other); } + int heal(Character *other = 0) override { return defaultHeal(other); } + int attack(Character *other = 0) override { return defaultAttack(other); } +}; + +#endif diff --git a/interface/Warrior.h b/interface/Warrior.h new file mode 100644 index 0000000..8d9c704 --- /dev/null +++ b/interface/Warrior.h @@ -0,0 +1,21 @@ +#ifndef Warrior_h +#define Warrior_h + +/* __ __ _ */ +/* \ \ / / (_) */ +/* \ \ /\ / /_ _ _ __ _ __ _ ___ _ __ */ +/* \ \/ \/ / _` | '__| '__| |/ _ \| '__| */ +/* \ /\ / (_| | | | | | | (_) | | */ +/* \/ \/ \__,_|_| |_| |_|\___/|_| */ + +class Warrior : public Character { +public: + Warrior(std::string name = "", int defense_power = 0) + : Character("Warrior", name, 0, defense_power, 0) {}; + + int defend(Character *other = 0) override { return defaultDefend(other); } + int heal(Character *other = 0) override { return defaultHeal(other); } + int attack(Character *other = 0) override { return defaultAttack(other); } +}; + +#endif diff --git a/midterm.md b/midterm.md new file mode 100644 index 0000000..fb3f117 --- /dev/null +++ b/midterm.md @@ -0,0 +1,5 @@ +### PHY410/505 midterm, fall 2025 + +This midterm will test the technical programming aspects covered so far this semester. +We've provided some C++ code for a text-based "role playing game": __World of Textcraft__. +To start, you should read `README.md` to understand the program, and run through the \ No newline at end of file diff --git a/src/Battle.cc b/src/Battle.cc new file mode 100644 index 0000000..dbca2ff --- /dev/null +++ b/src/Battle.cc @@ -0,0 +1,621 @@ +#include "Battle.h" +#include "MatchingHelpers.h" +#include + +void Battle::splash(std::ostream &out) const { + + out << "|--------------------------------------------|" << std::endl; + out << "|--------------------------------------------|" << std::endl; + out << "|--------------------------------------------|" << std::endl; + out << "|--------------------------------------------|" << std::endl; + out << "| __ __ _ _ |" << std::endl; + out << "| / / /\\ \\ \\___ _ __| | __| | |" << std::endl; + out << "| \\ \\/ \\/ / _ \\| '__| |/ _` | |" << std::endl; + out << "| \\ /\\ / (_) | | | | (_| | |" << std::endl; + out << "| \\/ \\/ \\___/|_| |_|\\__,_| |" << std::endl; + out << "| |" << std::endl; + out << "| __ |" << std::endl; + out << "| ___ / _| |" << std::endl; + out << "| / _ \\| |_ |" << std::endl; + out << "| | (_) | _| |" << std::endl; + out << "| \\___/|_| |" << std::endl; + out << "| |" << std::endl; + out << "| _____ _ ___ __ _ |" << std::endl; + out << "|/__ \\_____ _| |_ / __\\ __ __ _ / _| |_ |" << std::endl; + out << "| / /\\/ _ \\ \\/ / __|/ / | '__/ _` | |_| __||" << std::endl; + out << "| / / | __/> <| |_/ /__| | | (_| | _| |_ |" << std::endl; + out << "| \\/ \\___/_/\\_\\\\__\\____/_| \\__,_|_| \\__||" << std::endl; + out << "| |" << std::endl; + out << "|--------------------------------------------|" << std::endl; + out << "|--------------------------------------------|" << std::endl; + out << "|--------------------------------------------|" << std::endl; + + out << "Welcome brave traveler..." << std::endl; + out << description_ << std::endl; +} + +bool Battle::readPCConfiguration(std::string filename) { + + if (pcs_.size() > 0) { + std::cout << "Configuration already read... skipping reading from " + << filename << std::endl; + return false; + } else { + std::ifstream in(filename); + if (!in.is_open()) { + std::cerr << "[Battle::readPCConfiguration] File not found: " << filename << std::endl; + exit(1); + } + + // While not the end of file, keep looping + while (!in.eof()) { + std::string line; + std::getline(in, line); + + // First check if the line is empty or a comment (starts with "!") + if ((line.size() > 0 && line[0] == '!') || line == "") { + continue; + } else { + + // Otherwise, we have a valid line. + // First read the type from the first token, and create the appropriate + // class (Warrior, Priest, Rogue). Then read in the stats from the rest + // of the line. + std::stringstream tokens(line); + std::string character_type; + std::getline(tokens, character_type, ';'); + + std::shared_ptr character; + if (character_type == "Warrior") { + character = std::shared_ptr(new Warrior()); + } else if (character_type == "Priest") { + character = std::shared_ptr(new Priest()); + } else if (character_type == "Rogue") { + character = std::shared_ptr(new Rogue()); + } else { + std::cout << "Character Type not recognized: " << line << ", skipping" + << std::endl; + continue; + } + character->input(tokens); + pcs_.push_back(character); + std::cout << "Added character: " << *(pcs_.back()) << std::endl; + } + } + + in.close(); + } + return true; +} + +bool Battle::readNPCConfiguration(std::string filename) { + if (npcs_.size() > 0) { + std::cout << "Configuration already read... skipping reading from " + << filename << std::endl; + return false; + } else { + std::ifstream in(filename); + if (!in.is_open()) { + std::cerr << "[Battle::readNPCConfiguration] File not found: " << filename << std::endl; + exit(1); + } + while (!in.eof()) { + std::string line; + std::getline(in, line); + + if ((line.size() > 0 && line[0] == '!') || line == "") { + continue; + } else { + // The first line is the description. + if (description_ == "") { + description_ = line; + } else { + std::shared_ptr boss(new Boss()); + boss->input(line); + npcs_.push_back(boss); + } + } + } + } + return true; +} + +// Load a bunch of actions from a script +bool Battle::loadActionScript(std::string filename) { + if (filename == "") { + std::cout << "No script file input." << std::endl; + return false; + } else { + std::ifstream in(filename); + if (!in.is_open()) { + std::cerr << "[Battle::loadActionScript] File not found: " << filename << std::endl; + exit(1); + } + std::string line; + bool success = true; + while (!in.eof() && success) { + + std::getline(in, line); + if (line[0] == '!' || line == "") + continue; + QuickAction qa; + success = parseAction(line, qa); + + if (!success) { + std::cout << "Error in parseAction!" << std::endl; + return false; + } + + // If the script has any PC actions, it is scripted and not user-input + CharacterVector::iterator pcIt = std::find_if(pcs_.begin(), pcs_.end(), + MatchSource(qa.source->name())); + bool found = pcIt != pcs_.end(); + if (found) { + scripted_ = true; + std::cout << "Scripting input for " << (*pcIt)->name() << std::endl; + } + actions_.push_back(qa); + } + in.close(); + } + + return true; +} + +// Lines look like this: +// Shemp;attack;Moe; +// Shemp;multiattack;all; +// 1 : find the Character in the list with "name". +// 2 : find the action they are supposed to do. +// 3 : find the target. If blank, use current target. +// 4 : Set "name's" target, perform action +bool Battle::parseAction(std::string line, QuickAction &qa) { + + if (line == "") + return false; + + std::vector tokens; + std::stringstream linestream(line); + for (std::string each = ""; std::getline(linestream, each, ';');) { + tokens.push_back(each); + } + + if (tokens.size() < 3) { + std::cout << "Improper formatting of line " << line << std::endl; + return false; + } + + // Initialize both target and source to "error" (pcs_.end() is interpreted as + // such) + CharacterVector::iterator it_target = pcs_.end(), it_source = pcs_.end(); + std::shared_ptr target; + std::shared_ptr source; + + // Find the iterator with name "tokens[0]" + it_source = find_character(tokens[0]); + // Check to make sure we found an iterator + if (it_source == pcs_.end()) { + std::cout << "Error processing line " << line << std::endl; + return false; + } + source = *it_source; + + // Special case of Bosses attacking ALL NPCs + if (tokens[2] == "all") { + target = 0; + qa.source = source; + qa.action = MULTIATTACK; + return true; + } + + // Special case of attacking current target + if (tokens[2] == "target") { + target = 0; + } else { + + // Find the iterator with name "tokens[2]" + it_target = find_character(tokens[2]); + // Check to make sure we found an iterator + if (it_target == pcs_.end() || it_target == npcs_.end()) { + std::cout << "Error processing line " << line << std::endl; + return false; + } + target = *it_target; + } + + // parse the action type. + ActionType action_type = N_ACTIONS; // Error code + if (tokens[1] == "attack") + action_type = ATTACK; + else if (tokens[1] == "heal") + action_type = HEAL; + else if (tokens[1] == "defend") + action_type = DEFEND; + else { + std::cout << "Invalid action " << tokens[1] << std::endl; + return false; + } + + // Finally, push back the action + if (target) { + source->setTarget(target.get()); + } + qa.source = source; + qa.action = action_type; + return true; +} + +// This will perform all of the actions scripted in "actions_". +bool Battle::performScriptedActions() { + + if (!scripted_) { + std::cout << "I am expecting a player script, but you didn't give me one." + << std::endl; + return false; + } + + if (!anyPCAlive()) { + std::cout << "Alas, your party is dead." << std::endl; + return false; + } + + if (!anyNPCAlive()) { + std::cout << "You already won! Hooray!" << std::endl; + return false; + } + + // Special case for first attack : all NPCs will target first PC + if (turn_ == 0 && pcs_.size() > 1) { + for (CharacterVector::iterator inpc = npcs_.begin(); inpc != npcs_.end(); + ++inpc) { + (*inpc)->setTarget(pcs_.begin()->get()); + } + } + + if (actions_.size() == 0) { + std::cout << "No actions to perform" << std::endl; + return false; + } + + for (CharacterVector::iterator it = npcs_.begin(); it != npcs_.end(); ++it) { + (*it)->turn_ = turn_; + } + + for (CharacterVector::iterator it = pcs_.begin(); it != pcs_.end(); ++it) { + (*it)->turn_ = turn_; + } + + for (std::vector::iterator it = actions_.begin(); + it != actions_.end(); ++it) { + + if (it->source->isDead()) { + std::cout << it->source->name() << " is dead" << std::endl; + continue; + } + + // two special cases for bosses: + // 1. If their target dies, they pick the next target. + // 2. Must check the special case of the "Boss" ability to attack everyone. + // Since we are storing pointers to the base class, we need to + // "dynamic_cast" to the derived class to access its "multi attack" + Boss *boss = dynamic_cast(it->source.get()); + if (boss != 0) { + // Attack the entire party in a "MultiAttack" + if (it->action == MULTIATTACK) { + for (CharacterVector::iterator itarget = pcs_.begin(); itarget != pcs_.end(); + ++itarget) { + boss->multiAttack(itarget->get()); + } + continue; + } + // If the target is dead, switch to the next in the list. + if (boss->getTarget() != 0 && boss->getTarget()->isDead()) { + bool bossGotTarget = setBossTarget(boss); + if (!bossGotTarget) { + return false; + } + } + } + + // Now we execute normal attacks. + if (it->action == ATTACK) { + it->source->attack(); + } else if (it->action == HEAL) { + it->source->heal(); + } else if (it->action == DEFEND) { + it->source->defend(); + } else { + std::cout << "Incorrect action! Returning" << std::endl; + return false; + } + + if (!anyPCAlive()) { + std::cout << it->source->name() << " has vanquished your party." + << std::endl; + return false; + } + + if (!anyNPCAlive()) { + std::cout << it->source->name() << " has vanquished your foe!!!" + << std::endl; + return false; + } + } + + ++turn_; + + return anyPCAlive() && anyNPCAlive(); +} + +// This will perform all of the actions scripted in "actions_". +bool Battle::performUserActions(std::istream &in) { + + if (scripted_) { + std::cout << "PC actions already scripted, do not give me scripted actions " + "if you do not want to use them." + << std::endl; + return false; + } + + if (!anyPCAlive()) { + std::cout << "Alas, your party is dead." << std::endl; + return false; + } + + if (!anyNPCAlive()) { + std::cout << "You already won! Hooray!" << std::endl; + return false; + } + + // Special case for first attack : all NPCs will target first PC + if (turn_ == 0 && pcs_.size() > 1) { + for (CharacterVector::iterator inpc = npcs_.begin(); inpc != npcs_.end(); + ++inpc) { + (*inpc)->setTarget(pcs_.begin()->get()); + } + } + + // Bookkeeping + if (actions_.size() == 0) { + std::cout << "No actions to perform" << std::endl; + return false; + } + for (CharacterVector::iterator it = npcs_.begin(); it != npcs_.end(); ++it) { + (*it)->turn_ = turn_; + } + for (CharacterVector::iterator it = pcs_.begin(); it != pcs_.end(); ++it) { + (*it)->turn_ = turn_; + } + + // Process the boss actions + for (std::vector::iterator it = actions_.begin(); + it != actions_.end(); ++it) { + + if (it->source->isDead()) { + std::cout << it->source->name() << " is dead" << std::endl; + continue; + } + // two special cases for bosses: + // 1. If their target dies, they pick the next target. + // 2. Must check the special case of the "Boss" ability to attack everyone. + // Since we are storing pointers to the base class, we need to + // "dynamic_cast" to the derived class to access its "multi attack" + Boss *boss = dynamic_cast(it->source.get()); + if (boss != 0) { + // Attack the entire party in a "MultiAttack" + if (it->action == MULTIATTACK) { + for (CharacterVector::iterator itarget = pcs_.begin(); itarget != pcs_.end(); + ++itarget) { + boss->multiAttack(itarget->get()); + } + continue; + } + // If the target is dead, switch to the next in the list. + if (boss->getTarget() != 0 && boss->getTarget()->isDead()) { + bool bossGotTarget = setBossTarget(boss); + if (!bossGotTarget) { + return false; + } + } + } + + if (it->action == ATTACK) { + it->source->attack(); + } else if (it->action == HEAL) { + it->source->heal(); + } else if (it->action == DEFEND) { + it->source->defend(); + } else { + std::cout << "Incorrect action! Returning" << std::endl; + return false; + } + + if (!anyPCAlive()) { + std::cout << it->source->name() << " has vanquished your party." + << std::endl; + return false; + } + } + + // Process the user actions + for (CharacterVector::iterator it = pcs_.begin(); it != pcs_.end(); ++it) { + + if ((*it)->isDead()) { + std::cout << (*it)->name() << " is dead" << std::endl; + continue; + } + + std::cout << "Action for " << (*it)->name() << ": " << std::endl; + QuickAction qa; + std::string line; + in >> line; + // std::getline( in, line ); + bool success = parseAction(line, qa); + while (!success) { + std::cout << "Invalid input, try again" << std::endl; + in >> line; + success = parseAction(line, qa); + } + if (qa.action == ATTACK) { + (*it)->attack(); + } else if (qa.action == HEAL) { + (*it)->heal(); + } else if (qa.action == DEFEND) { + (*it)->defend(); + } else { + std::cout << "Incorrect action! Returning" << std::endl; + return false; + } + + if (!anyNPCAlive()) { + std::cout << (*it)->name() << " has vanquished your foe." << std::endl; + return false; + } + } + + ++turn_; + + return anyPCAlive() && anyNPCAlive(); +} + +// Set the next Boss target. It looks for the +// first character, in order, that is not dead. +bool Battle::setBossTarget(Boss *boss) { + + Character const *character = boss->getTarget(); + + if (boss == 0) { + std::cout << "Boss is zero, cannot set new target" << std::endl; + return false; + } + for (CharacterVector::const_iterator pc = pcs_.begin(); pc != pcs_.end(); ++pc) { + if ((*pc)->isAlive()) { + if (pc->get() != character) { + std::cout << boss->name() << " shifts their attacks to " + << (*pc)->name() << std::endl; + } + boss->setTarget(pc->get()); + return true; + } + } + + // Here there are no targets alive. + return false; +} + +bool Battle::anyPCAlive() const { + bool any_pc_alive = false; + for (CharacterVector::const_iterator pc = pcs_.begin(); pc != pcs_.end(); ++pc) { + if ((*pc)->isAlive()) + any_pc_alive = true; + } + return any_pc_alive; +} + +bool Battle::anyNPCAlive() const { + bool any_npc_alive = false; + for (CharacterVector::const_iterator npc = npcs_.begin(); npc != npcs_.end(); + ++npc) { + if ((*npc)->isAlive()) + any_npc_alive = true; + } + return any_npc_alive; +} + +Battle::CharacterVector::iterator Battle::find_character(std::string s) { + // Try to find the sources and targets: + CharacterVector::iterator source_pc = + std::find_if(pcs_.begin(), pcs_.end(), MatchSource(s)); + CharacterVector::iterator source_npc = + std::find_if(npcs_.begin(), npcs_.end(), MatchSource(s)); + + if (source_pc == pcs_.end() && source_npc == npcs_.end()) { + std::cout << "No matching source for " << s << std::endl; + return pcs_.end(); + } else if (source_pc == pcs_.end()) { + return source_npc; + } else { + return source_pc; + } +} + +void Battle::printStats(std::ostream &out) { + out << "------------------------------- Turn : " << turn_ + << "-------------------------------" << std::endl; + out << "-----------------------------" << std::endl; + out << " === players:" << std::endl; + // Remember! "CharacterVector" is just an alias for std::vector< + // std::shared_ptr > + for (CharacterVector::const_iterator it = pcs_.begin(); it != pcs_.end(); ++it) { + (*it)->printStats(out); + } + out << std::endl << " === monsters:" << std::endl; + for (CharacterVector::const_iterator it = npcs_.begin(); it != npcs_.end(); ++it) { + (*it)->printStats(out); + } + out << "-----------------------------" << std::endl; +} + +void Battle::print(std::ostream &out) { + out << "------------------------------- Turn : " << turn_ + << "-------------------------------" << std::endl; + out << "--------------" << std::endl; + out << " === players:" << std::endl; + // Remember! "CharacterVector" is just an alias for std::vector< + // std::shared_ptr > + for (CharacterVector::const_iterator it = pcs_.begin(); it != pcs_.end(); ++it) { + out << **it << std::endl; + } + out << std::endl << " === monsters:" << std::endl; + for (CharacterVector::const_iterator it = npcs_.begin(); it != npcs_.end(); ++it) { + out << **it << std::endl; + } + out << "--------------" << std::endl; +} + +void Battle::printActions(std::ostream &out) { + + out << " ----- Action list ----" << std::endl; + for (std::vector::const_iterator it = actions_.begin(); + it != actions_.end(); ++it) { + if (it->source == 0) { + std::cout << "Configuration error." << std::endl; + return; + } + out << it->source->name() << " will perform action " << it->action + << " on their target : "; + if (it->source->getTarget() != 0) { + out << it->source->getTarget()->name() << std::endl; + } else { + out << " NO TARGET!" << std::endl; + } + } +} + +void Battle::printLog(std::ostream &out) const { + + out << "{\"Turns\":[" << std::endl; + for (unsigned int iturn = 0; iturn <= turn_; ++iturn) { + + out << "{\"Turn\":" << iturn << "," << std::endl; + + for (auto i = npcs_.begin(); i != npcs_.end(); ++i) { + (*i)->printActions(out, iturn); + out << "," << std::endl; + } + for (auto i = pcs_.begin(); i != pcs_.end(); ++i) { + (*i)->printActions(out, iturn); + // json does not like trailing commas + if (i != pcs_.end() - 1) + out << "," << std::endl; + else + out << std::endl; + } + out << "}"; + if (iturn != turn_) + out << "," << std::endl; + else + out << std::endl; + } + out << "]}" << std::endl; +} diff --git a/src/Boss.cc b/src/Boss.cc new file mode 100644 index 0000000..c5f9d2c --- /dev/null +++ b/src/Boss.cc @@ -0,0 +1,91 @@ +#include "Boss.h" +#include +#include + +Boss::Boss(std::string name, int attack_power, int defense_power, int heal_power, + int mana, int multi_attack_power) + : Character("Boss", name, attack_power, defense_power, heal_power, mana, false) { + multi_attack_power_ = multi_attack_power; + hit_points_ = 500; + max_hit_points_ = 500; +}; + +int Boss::multiAttack(Character *other) { + + Character *originalTarget = getTarget(); + + if (other != 0) { + setTarget(other); + } + int ap = this->multi_attack_power_; + + if (getTarget() != 0) { + std::cout << name() << " multi-attacks " << getTarget()->name() + << " with attack power " << ap << std::endl; + int retval = getTarget()->reduceHitPoints(ap); + setTarget(originalTarget); + if (my_attacks_.find(turn_) == my_attacks_.end()) + my_attacks_[turn_] = ActionVector(); + my_attacks_[turn_].push_back(retval); + return retval; + } else { + std::cout << name_ << " does not have a target to attack." << std::endl; + setTarget(originalTarget); + return 0; + } +}; + +// Print to "out" +void Boss::printStats(std::ostream &out) const { + out << std::setw(12) << name_ + << " (" << std::setw(10) << class_name_ + << "): HP=" << std::setw(5) << hit_points_ + << ", attack=" << std::setw(5) << attack_power_ + << ", defend=" << std::setw(5) << defense_power_ + << ", heal=" << std::setw(5) << heal_power_; + + if (isMagicUser()) { + out << ", mana = " << std::setw(5) << mana_; + } + out << ", multi =" << std::setw(5) << multi_attack_power_; + if (target_ != 0) { + out << ", target=" << std::setw(12) << target_->name(); + } else { + out << ", no target"; + } +} + +// Print to "out" +void Boss::print(std::ostream &out) const { + out << std::setw(12) << name_ << " (" << std::setw(10) << class_name_ + << "): HP=" << std::setw(5) << hit_points_ << ", mana = " << std::setw(5) + << mana_; + if (target_ != 0) { + out << ", target=" << std::setw(12) << target_->name(); + } else { + out << ", no target"; + } +} + +void Boss::input(std::string line) { + std::vector tokens; + + std::stringstream linestream(line); + for (std::string each = ""; std::getline(linestream, each, ';');) { + tokens.push_back(each); + } + if (tokens.size() >= 6) { + name_ = tokens[0]; + attack_power_ = std::atoi(tokens[1].c_str()); + defense_power_ = std::atoi(tokens[2].c_str()); + heal_power_ = std::atoi(tokens[3].c_str()); + mana_ = std::atoi(tokens[4].c_str()); + multi_attack_power_ = std::atoi(tokens[5].c_str()); + + std::cout << "Input boss: " << *this << std::endl; + } else { + std::cout << "Formatting error in input: unrecognized syntax in line : " + << line << std::endl; + return; + } +} diff --git a/src/Character.cc b/src/Character.cc new file mode 100644 index 0000000..b3ed9da --- /dev/null +++ b/src/Character.cc @@ -0,0 +1,279 @@ +#include "Character.h" +#include +#include +#include +#include +#include + +// Constructor +Character::Character(std::string class_name, std::string name, + unsigned int attack_power, unsigned int defense_power, + unsigned int heal_power, unsigned int max_mana, bool check) + : class_name_(class_name), name_(name), hit_points_(100), max_hit_points_(100), + mana_(max_mana), attack_power_(attack_power), defense_power_(defense_power), + heal_power_(heal_power), target_(0) // uninitialized target +{ + if (check) { + // Check to make sure your powers aren't outrageous + checkPowers(); + } +} + +// Destructor +Character::~Character() {} + +void Character::input(std::string line) { + std::vector tokens; + + std::stringstream linestream(line); + for (std::string each = ""; std::getline(linestream, each, ';');) { + tokens.push_back(each); + } + if (tokens.size() >= 4) { + name_ = tokens[0]; + attack_power_ = std::atoi(tokens[1].c_str()); + defense_power_ = std::atoi(tokens[2].c_str()); + heal_power_ = std::atoi(tokens[3].c_str()); + } else { + std::cout << "Formatting error in input: unrecognized syntax in line : " + << line << std::endl; + return; + } + checkPowers(); +} + +// Input from "in" +void Character::input(std::istream &in) { + std::string line; + std::getline(in, line); + input(line); +}; + +// Print to "out" + +void Character::print(std::ostream &out) const { + out << std::setw(12) << name_ << " (" << std::setw(10) << class_name_ + << "): HP=" << std::setw(5) << hit_points_ << ", mana = " << std::setw(5) + << mana_; + if (target_ != 0) { + out << ", target=" << std::setw(12) << target_->name(); + } else { + out << ", no target"; + } +} + +void Character::printStats(std::ostream &out) const { + out << std::setw(12) << name_ << " (" << std::setw(10) << class_name_ + << "): HP=" << std::setw(5) << hit_points_ << ", attack=" << std::setw(5) + << attack_power_ << ", defend=" << std::setw(5) << defense_power_ + << ", heal=" << std::setw(5) << heal_power_ << ", mana = " << std::setw(5) + << mana_; + if (target_ != 0) { + out << ", target=" << std::setw(12) << target_->name(); + } else { + out << ", no target"; + } +} + +// Reduce the hit points of "this" entity by "attack", mitigated by +// "defense_power" +int Character::reduceHitPoints(int attack) { + int damage_taken = (attack - defense_power_); + if (damage_taken < 0) { + damage_taken = 0; + } else if (damage_taken >= hit_points_) { + // Protect against "overkill" in the stats accounting. + damage_taken = hit_points_; + } + std::cout << name_ << " loses " << damage_taken << " hit points after attack " + << attack << " and defense " << defense_power_ << std::endl; + hit_points_ -= damage_taken; + if (hit_points_ <= 0) { + hit_points_ = 0; + std::cout << name_ << ", the brave " << class_name_ << ", has died." + << std::endl; + } + if (my_reduced_hit_points_.find(turn_) == my_reduced_hit_points_.end()) + my_reduced_hit_points_[turn_] = ActionVector(); + my_reduced_hit_points_[turn_].push_back(damage_taken); + return damage_taken; +} + +// Increase the hit points of "this" entity +int Character::increaseHitPoints(int heal) { + int healed = heal; // Protect against "overheal" in the stats accounting. + if (hitPoints() + healed >= max_hit_points_) + healed = max_hit_points_ - hitPoints(); + hit_points_ += healed; + if (my_increased_hit_points_.find(turn_) == my_increased_hit_points_.end()) + my_increased_hit_points_[turn_] = ActionVector(); + my_increased_hit_points_[turn_].push_back(healed); + return healed; +} + +// This will force the target of the other object to be "this" Character. +int Character::defaultDefend(Character *other) { + if (other != 0) { + setTarget(other); + } + if (getTarget() != 0) { + + if (getTarget()->isDead()) { + std::cout << name_ << " : target " << getTarget()->name() + << " is already dead." << std::endl; + return 0; + } + std::cout << name_ << " defends against " << getTarget()->name() + << " with defense mitigation " << defensePower() << std::endl; + getTarget()->setTarget(this); + } else { + std::cout << name_ << " does not have a target to defend." << std::endl; + } + if (my_defends_.find(turn_) == my_defends_.end()) + my_defends_[turn_] = ActionVector(); + my_defends_[turn_].push_back(defensePower()); + return 0; +} + +// In a heal, we increase the hit points +int Character::defaultHeal(Character *other) { + if (mana_ < 10) { + std::cout << name() << " does not have enough mana." << std::endl; + return 0; + } + if (other != 0) { + setTarget(other); + } + if (getTarget() != 0) { + + if (getTarget()->isDead()) { + std::cout << name_ << " : target " << getTarget()->name() + << " is already dead." << std::endl; + my_heals_[turn_].push_back(0); + return 0; + } + mana_ -= 10; + auto healed = getTarget()->increaseHitPoints(heal_power_); + std::cout << name() << " healed " << getTarget()->name() + << " with heal power " << heal_power_ << " for " << healed + << std::endl; + if (my_heals_.find(turn_) == my_heals_.end()) + my_heals_[turn_] = ActionVector(); + my_heals_[turn_].push_back(healed); + return healed; + } else { + std::cout << name_ << " does not have a target to heal." << std::endl; + return 0; + } +}; + +// In an attack, we reduce the hit points +int Character::defaultAttack(Character *other) { + if (other != 0) { + setTarget(other); + } + + if (getTarget() != 0) { + if (getTarget()->isDead()) { + std::cout << name_ << " : target " << getTarget()->name() + << " is already dead." << std::endl; + my_attacks_[turn_].push_back(0); + return 0; + } + + int ap = attack_power_; + auto attacked = getTarget()->reduceHitPoints(ap); + std::cout << name() << " attacked " << getTarget()->name() + << " with attack power " << ap << " for damage " << attacked + << std::endl; + if (my_attacks_.find(turn_) == my_attacks_.end()) + my_attacks_[turn_] = ActionVector(); + my_attacks_[turn_].push_back(attacked); + return attacked; + } else { + std::cout << name_ << " does not have a target to attack." << std::endl; + my_attacks_[turn_].push_back(0); + return 0; + } +}; + +// This will check to ensure the input values are sensible +bool Character::checkPowers() { + + is_magic_user_ = (mana_ > 0); + if (attack_power_ + defense_power_ + heal_power_ > 20) { + std::cout + << name_ + << " : You cannot godmode here, your abilities can only sum to 20." + << std::endl + << "To punish you, the gods set your hitpoints to 1 and make you " + "feeble as a kitten." + << std::endl; + hit_points_ = 1; + attack_power_ = 0; + defense_power_ = 0; + heal_power_ = 0; + return false; + } + if (attack_power_ < 0 || defense_power_ < 0 || heal_power_ < 0) { + std::cout << name_ << " : Your powers cannot be negative." << std::endl + << "To punish you, the gods set your hitpoints to 1 and make you " + "feeble as a kitten." + << std::endl; + hit_points_ = 1; + attack_power_ = 0; + defense_power_ = 0; + heal_power_ = 0; + return false; + } + + return true; +}; + +// Some operators to support << and >> +std::ostream &operator<<(std::ostream &out, Character const &e) { + e.print(out); + return out; +} +std::istream &operator>>(std::istream &in, Character &e) { + e.input(in); + return in; +} + +void Character::printActions(std::ostream &out, unsigned int iturn) const { + + auto all_actions = {std::make_pair("Attacks", &my_attacks_), + std::make_pair("Defends", &my_defends_), + std::make_pair("Heals", &my_heals_), + std::make_pair("DamageReceived", &my_reduced_hit_points_), + std::make_pair("HealingRecieved", &my_increased_hit_points_)}; + + out << "\"" << name_ << "\":{"; + for (auto iaction = all_actions.begin(); iaction != all_actions.end(); + ++iaction) { + auto actionname = iaction->first; + auto actions = iaction->second; + out << "\"" << actionname << "\":["; + + // Check if there are any actions for this turn + auto p_action = actions->find(iturn); + if (p_action != actions->end()) { + auto action_vals = p_action->second; + for (auto ival = action_vals.begin(); ival != action_vals.end(); ++ival) { + out << *ival; + // json does not like trailing comma + if (ival + 1 != action_vals.end()) + out << ","; + } + } else { + out << 0; + } + out << "]"; + + if (iaction != all_actions.end() - 1) { + out << ","; + } + out << std::endl; + } + out << "}"; +} diff --git a/WorldOfTextCraft.cc b/src/WorldOfTextCraft.cc similarity index 98% rename from WorldOfTextCraft.cc rename to src/WorldOfTextCraft.cc index 2dbd14b..633d739 100644 --- a/WorldOfTextCraft.cc +++ b/src/WorldOfTextCraft.cc @@ -1,4 +1,4 @@ -#include "Entity.h" +#include "Character.h" #include "Warrior.h" #include "Rogue.h" diff --git a/Shemp.txt b/tests/Shemp.txt similarity index 100% rename from Shemp.txt rename to tests/Shemp.txt diff --git a/ShempAttacks.txt b/tests/ShempAttacks.txt similarity index 100% rename from ShempAttacks.txt rename to tests/ShempAttacks.txt diff --git a/StoogesBattle.txt b/tests/StoogesBattle.txt similarity index 100% rename from StoogesBattle.txt rename to tests/StoogesBattle.txt diff --git a/ThreeStooges.txt b/tests/ThreeStooges.txt similarity index 100% rename from ThreeStooges.txt rename to tests/ThreeStooges.txt diff --git a/test_battle.cc b/tests/test_battle.cc similarity index 66% rename from test_battle.cc rename to tests/test_battle.cc index a30d780..6e21a4e 100644 --- a/test_battle.cc +++ b/tests/test_battle.cc @@ -1,80 +1,77 @@ -#include "Entity.h" +#include "Character.h" -#include "Warrior.h" -#include "Rogue.h" -#include "Priest.h" #include "Boss.h" +#include "Priest.h" +#include "Rogue.h" +#include "Warrior.h" #include "Battle.h" -int main( int argc, char ** argv ) { +int main(int argc, char **argv) { Battle battle; - bool success = true; + bool success = true; // Read the party configurations - success = battle.readPCConfiguration( "ThreeStooges.txt" ); - if ( ! success ) { + success = battle.readPCConfiguration("ThreeStooges.txt"); + if (!success) { std::cout << "No PC configuration read" << std::endl; return 0; } - success = battle.readNPCConfiguration( "Shemp.txt"); - if ( ! success ) { + success = battle.readNPCConfiguration("Shemp.txt"); + if (!success) { std::cout << "No PC configuration read" << std::endl; return 0; } - - // Read a test sequence. + // Read a test sequence. success = battle.loadActionScript("ShempAttacks.txt"); - if ( ! success ) { + if (!success) { std::cout << "No NPC script read" << std::endl; return 0; } success = battle.loadActionScript("StoogesBattle.txt"); - if ( ! success ) { + if (!success) { std::cout << "No PC script read" << std::endl; return 0; } - battle.splash(); std::cout << "Are you ready to begin? [Y/n] " << std::endl; - char c; - std::cin >> c; - if ( c == 'y' || c == 'Y') { + std::string response; + std::getline(std::cin, response); + //std::cin >> c; + if (response == "y" || response == "Y" || response == "") { std::cout << "Excellent... let us begin..." << std::endl; } else { std::cout << "Oh well. Another time then..." << std::endl; return 0; } - - battle.printActions(); - - + battle.printActions(); // Now loop and FIGHT! do { battle.print(); std::cout << "Continue? [Y/n] " << std::endl; - std::cin >> c; - if ( c != 'y' && c != 'Y') { + std::getline(std::cin, response); + + //std::cin >> c; + if (response != "y" && response != "Y" && response != "") { std::cout << "Bye, then." << std::endl; break; - } - } - while ( battle.performScriptedActions() ); - + } + } while (battle.performScriptedActions()); std::cout << " ___ _ _ _ " << std::endl; std::cout << " / _ \\___ ___ __| | |__ _ _ ___ / \\" << std::endl; - std::cout << " / /_\\/ _ \\ / _ \\ / _` | '_ \\| | | |/ _ \\/ /" << std::endl; + std::cout << " / /_\\/ _ \\ / _ \\ / _` | '_ \\| | | |/ _ \\/ /" + << std::endl; std::cout << "/ /_\\\\ (_) | (_) | (_| | |_) | |_| | __/\\_/ " << std::endl; - std::cout << "\\____/\\___/ \\___/ \\__,_|_.__/ \\__, |\\___\\/ " << std::endl; + std::cout << "\\____/\\___/ \\___/ \\__,_|_.__/ \\__, |\\___\\/ " + << std::endl; std::cout << " |___/ " << std::endl; - - return 0; + return 0; }; diff --git a/test_boss.cc b/tests/test_boss.cc similarity index 52% rename from test_boss.cc rename to tests/test_boss.cc index 7261ccd..019f085 100644 --- a/test_boss.cc +++ b/tests/test_boss.cc @@ -1,12 +1,11 @@ -#include "Entity.h" +#include "Character.h" -#include "Warrior.h" -#include "Rogue.h" -#include "Priest.h" #include "Boss.h" +#include "Priest.h" +#include "Rogue.h" +#include "Warrior.h" - -int main( int argc, char ** argv ) { +int main(int argc, char **argv) { Warrior warrior("Larry", 3); Priest priest("Moe", 5); @@ -16,28 +15,27 @@ int main( int argc, char ** argv ) { unsigned i = 0; bool done = false; - boss.setTarget( &priest ); - warrior.setTarget( &boss ); - rogue.setTarget( &boss ); - priest.setTarget( &warrior ); + boss.setTarget(&priest); + warrior.setTarget(&boss); + rogue.setTarget(&boss); + priest.setTarget(&warrior); - std::vector party; - party.push_back( &warrior ); - party.push_back( &rogue ); - party.push_back( &priest ); - + std::vector party; + party.push_back(&warrior); + party.push_back(&rogue); + party.push_back(&priest); - while ( ! done ) { + while (!done) { std::cout << "Round " << i << std::endl; std::cout << warrior << std::endl; std::cout << priest << std::endl; std::cout << rogue << std::endl; std::cout << boss << std::endl; - if ( i % 5 == 0 ) - for ( std::vector::iterator it = party.begin(); - it != party.end(); ++it ) { - boss.multiAttack( *it ); + if (i % 5 == 0) + for (std::vector::iterator it = party.begin(); + it != party.end(); ++it) { + boss.multiAttack(*it); } else boss.attack(); @@ -45,15 +43,18 @@ int main( int argc, char ** argv ) { rogue.attack(); priest.heal(); ++i; - done = (warrior.isDead() && priest.isDead() && rogue.isDead() ) || boss.isDead(); + done = (warrior.isDead() && priest.isDead() && rogue.isDead()) || + boss.isDead(); } - - if ( warrior.isAlive() && priest.isAlive() && rogue.isAlive()) { - std::cout << "The party wins! The gods rejoice in your ferociousness!" << std::endl; + if (warrior.isAlive() && priest.isAlive() && rogue.isAlive()) { + std::cout << "The party wins! The gods rejoice in your ferociousness!" + << std::endl; } else { - std::cout << "Your quest has failed. May you drink and fight long in the mead halls of Valhalla" << std::endl; + std::cout << "Your quest has failed. May you drink and fight long in the " + "mead halls of Valhalla" + << std::endl; } - return 0; + return 0; }; diff --git a/test_entity.cc b/tests/test_character.cc similarity index 62% rename from test_entity.cc rename to tests/test_character.cc index adb3227..bba23db 100644 --- a/test_entity.cc +++ b/tests/test_character.cc @@ -1,42 +1,43 @@ -#include "Entity.h" +#include "Character.h" -#include "Warrior.h" -#include "Rogue.h" #include "Priest.h" +#include "Rogue.h" +#include "Warrior.h" - -int main( int argc, char ** argv ) { +int main(int argc, char **argv) { Warrior warrior("Larry", 10); Priest priest("Moe", 5); Rogue rogue("Curly", 15); unsigned i = 0; - bool done = false; + bool done = false; - rogue.setTarget( &priest ); - priest.setTarget( &warrior ); + rogue.setTarget(&priest); + priest.setTarget(&warrior); rogue.attack(); - while ( ! done ) { + while (!done) { std::cout << "Round " << i << std::endl; std::cout << warrior << std::endl; std::cout << priest << std::endl; std::cout << rogue << std::endl; - warrior.defend( &rogue ); + warrior.defend(&rogue); rogue.attack(); priest.heal(); ++i; done = warrior.isDead() || priest.isDead() || i >= 20; } - - if ( warrior.isAlive() && priest.isAlive() ) { - std::cout << "The party wins! The gods rejoice in your ferociousness!" << std::endl; + if (warrior.isAlive() && priest.isAlive()) { + std::cout << "The party wins! The gods rejoice in your ferociousness!" + << std::endl; } else { - std::cout << "Your quest has failed. May you drink and fight long in the mead halls of Valhalla" << std::endl; + std::cout << "Your quest has failed. May you drink and fight long in the " + "mead halls of Valhalla" + << std::endl; } - return 0; + return 0; }; From 250d0eb9ce51763c5550159215742dee40e368be Mon Sep 17 00:00:00 2001 From: David Yu Date: Tue, 14 Oct 2025 10:50:49 -0400 Subject: [PATCH 2/6] Example and docker --- .gitignore | 1 + data/example/Boss.txt | 6 ++++ data/example/BossScript.txt | 3 ++ data/example/PlayerCharacters.txt | 3 ++ runDocker.sh | 38 ++++++++++++++++++++++ runDocker_wfix.sh | 54 +++++++++++++++++++++++++++++++ 6 files changed, 105 insertions(+) create mode 100644 .gitignore create mode 100644 data/example/Boss.txt create mode 100644 data/example/BossScript.txt create mode 100644 data/example/PlayerCharacters.txt create mode 100755 runDocker.sh create mode 100755 runDocker_wfix.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b883f1f --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.exe diff --git a/data/example/Boss.txt b/data/example/Boss.txt new file mode 100644 index 0000000..5e7802d --- /dev/null +++ b/data/example/Boss.txt @@ -0,0 +1,6 @@ +!Description: +!Mercilessly butchered from http://wowwiki.wikia.com/wiki/Arthas_Menethil +You venture forth from your stronghold in Azeroth to the icy continent of Northrend, accompanied only by your fellow adventurers and your courage. You have tracked Arthas Menethil to his Frozen Throne in the plagued wastelands of Icecrown. Once a brave champion of Lordaeron, Arthas was corrupted by evil and his soul subsumed by the shaman Ner'zhul upon taking the cursed Runeblade, Frostmourne, forming the entity known as the Lich King, threatening all life in Azeroth to become mindless undead slaves of the Burning Legion. The Knights of the Ebon Blade and the Argent Crusade have now formed the Ashen Verdict, and tasked you to destroy the Lich King and end his undead plague upon Azeroth. As you reach the Frozen Throne, the Lich King's seat, you hear a voice in your head. The Lich King whispers "Young heroes, I was once like you. You have come to this place seeking to bring judgement upon the damned. But, be warned. In the end, all that awaits you is death. Only then will you understand, you've been following in my footsteps all along. So come then, you heroes! Come in all your power and glory! For in this final hour, all must serve the one... true... king... Frostmourne HUNGERS....". The battle is joined. +! Non-Player character. +!Name;AttackPower;HealPower;DefensePower;Mana;MultiAttackPower +Mallory The Boss;20;0;0;0;8; diff --git a/data/example/BossScript.txt b/data/example/BossScript.txt new file mode 100644 index 0000000..7a072cf --- /dev/null +++ b/data/example/BossScript.txt @@ -0,0 +1,3 @@ +! Test battle configuration. +Arthas;attack;target; +Arthas;attack;all; diff --git a/data/example/PlayerCharacters.txt b/data/example/PlayerCharacters.txt new file mode 100644 index 0000000..0c7ff83 --- /dev/null +++ b/data/example/PlayerCharacters.txt @@ -0,0 +1,3 @@ +Warrior;Alice The Warrior;0;10;0; +Priest;Bob The Priest;0;0;12; +Rogue;Carol The Rogue;20;0;0; diff --git a/runDocker.sh b/runDocker.sh new file mode 100755 index 0000000..f71679f --- /dev/null +++ b/runDocker.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash + +# Usage: runDocker.sh ubsuny/compphys:latest /bin/bash +# This script provides an example `docker run` command to launch the PHY410 docker container + +usage() { + echo "Usage: ./runDocker.sh ubsuny/compphys:latest" + exit 1 +} + +if [ -z "$1" ]; then + usage +fi + + +DOCKERHOME=/home/compphys +LOCALDIR=${PWD} # This should be your CompPhys folder that you checked out from Github +REMOTEDIR=$DOCKERHOME/$(basename $LOCALDIR) # Location inside the container where $LOCALDIR is mounted + +if [ "$(uname)" == "Darwin" ]; then + ip=$(ifconfig en0 | grep inet | awk '$1=="inet" {print $2}') + xhost + $ip + DISPLAYHANDLE="${DISPLAY}" +else + DISPLAYHANDLE="${ip}:0" +fi + +DOCKERCMD="docker run \ + --rm \ + -it \ + -e DISPLAY=$DISPLAYHANDLE \ + -v /tmp/.X11-unix:/tmp/.X11-unix \ + -v $LOCALDIR:$REMOTEDIR \ + -w $DOCKERHOME \ + -p 8888:8888 \ + $1 /bin/bash" +echo $DOCKERCMD +exec $DOCKERCMD diff --git a/runDocker_wfix.sh b/runDocker_wfix.sh new file mode 100755 index 0000000..b3fad2e --- /dev/null +++ b/runDocker_wfix.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash + +# Usage: runDocker.sh ubsuny/compphys:latest /bin/bash +# This script provides an example `docker run` command to launch the PHY410 docker container + +usage() { + echo "Usage: ./runDocker.sh ubsuny/compphys:latest" + exit 1 +} + +if [ -z "$1" ]; then + usage +fi + + +DOCKERHOME=/home/compphys +LOCALDIR=${PWD} # This should be your CompPhys folder that you checked out from Github +REMOTEDIR=$DOCKERHOME/$(basename $LOCALDIR) # Location inside the container where $LOCALDIR is mounted + +# Setup display variables +if [ "$(uname)" == "Darwin" ]; then + ip=$(ifconfig en0 | grep inet | awk '$1=="inet" {print $2}') + xhost + $ip + DISPLAYHANDLE="${DISPLAY}" +else + DISPLAYHANDLE="${ip}:0" +fi + +# Ensure group permissions on CompPhys folder +if [ "$(uname)" == "Darwin" ]; then + GRPW=$(stat -f "%p %N" . | awk '{print $1=substr($1,length($1)-2)}' | grep -c ".[2367].") +else + GRPW=$(stat -c "%a" . | grep -c ".[2367].") +fi +if [ $GRPW == 0 ]; then + echo "Adding group write permissions to CompPhys folder" + echo "chmod -R g+w ." + chmod -R g+w . +fi +unset GRPW + +DOCKERCMD="docker run \ + --entrypoint "/usr/local/bin/entrypoint_wfix.sh" \ + --rm \ + -it \ + -e DISPLAY=$DISPLAYHANDLE \ + -v /tmp/.X11-unix:/tmp/.X11-unix \ + -v $LOCALDIR:$REMOTEDIR \ + -w $DOCKERHOME \ + -p 8888:8888 \ + $1 \ + $(id -g $(whoami)) /bin/bash" +echo $DOCKERCMD +exec $DOCKERCMD \ No newline at end of file From 6199dcb83da7ea33f42d9fa17a6b6d82a3740182 Mon Sep 17 00:00:00 2001 From: DryRun Date: Wed, 15 Oct 2025 22:15:55 -0400 Subject: [PATCH 3/6] Nearly done --- LichKing/Arthas.txt | 5 +++++ LichKing/ArthasScript.txt | 3 +++ LichKing/PlayerActions.txt | 6 ++++++ LichKing/PlayerCharacters.txt | 4 ++++ data/LichKing.png | Bin 0 -> 43764 bytes launchJupyter.sh | 7 +++++++ midterm.pdf | Bin 0 -> 249184 bytes src/Priest.cc | 14 ++++++++++++++ src/Rogue.cc | 14 ++++++++++++++ src/Warrior.cc | 14 ++++++++++++++ tests/Boss.txt | 4 ++++ tests/BossScript.txt | 3 +++ tests/PlayerCharacters.txt | 8 ++++++++ tests/PlayerScript.txt | 4 ++++ 14 files changed, 86 insertions(+) create mode 100644 LichKing/Arthas.txt create mode 100644 LichKing/ArthasScript.txt create mode 100644 LichKing/PlayerActions.txt create mode 100644 LichKing/PlayerCharacters.txt create mode 100644 data/LichKing.png create mode 100755 launchJupyter.sh create mode 100644 midterm.pdf create mode 100644 src/Priest.cc create mode 100644 src/Rogue.cc create mode 100644 src/Warrior.cc create mode 100644 tests/Boss.txt create mode 100644 tests/BossScript.txt create mode 100644 tests/PlayerCharacters.txt create mode 100644 tests/PlayerScript.txt diff --git a/LichKing/Arthas.txt b/LichKing/Arthas.txt new file mode 100644 index 0000000..1ab9c68 --- /dev/null +++ b/LichKing/Arthas.txt @@ -0,0 +1,5 @@ +!Description: +!Mercilessly butchered from http://wowwiki.wikia.com/wiki/Arthas_Menethil +You venture forth from your stronghold in Azeroth to the icy continent of Northrend, accompanied only by your fellow adventurers and your courage. You have tracked Arthas Menethil to his Frozen Throne in the plagued wastelands of Icecrown. Once a brave champion of Lordaeron, Arthas was corrupted by evil and his soul subsumed by the shaman Ner'zhul upon taking the cursed Runeblade, Frostmourne, forming the entity known as the Lich King, threatening all life in Azeroth to become mindless undead slaves of the Burning Legion. The Knights of the Ebon Blade and the Argent Crusade have now formed the Ashen Verdict, and tasked you to destroy the Lich King and end his undead plague upon Azeroth. As you reach the Frozen Throne, the Lich King's seat, you hear a voice in your head. The Lich King whispers "Young heroes, I was once like you. You have come to this place seeking to bring judgement upon the damned. But, be warned. In the end, all that awaits you is death. Only then will you understand, you've been following in my footsteps all along. So come then, you heroes! Come in all your power and glory! For in this final hour, all must serve the one... true... king... Frostmourne HUNGERS....". The battle is joined. +! Non-Player character. Fields are "name", attack power, heal power, defense power, mana, multi attack power +Arthas;20;0;0;0;8; diff --git a/LichKing/ArthasScript.txt b/LichKing/ArthasScript.txt new file mode 100644 index 0000000..7a072cf --- /dev/null +++ b/LichKing/ArthasScript.txt @@ -0,0 +1,3 @@ +! Test battle configuration. +Arthas;attack;target; +Arthas;attack;all; diff --git a/LichKing/PlayerActions.txt b/LichKing/PlayerActions.txt new file mode 100644 index 0000000..8d0623b --- /dev/null +++ b/LichKing/PlayerActions.txt @@ -0,0 +1,6 @@ +! A list of player actions for you to copy-and-paste. +Mograine;attack;Arthas; +Fordring;defend;Arthas; +Nakha;heal;Mograine; +Nakha;heal;Fordring; +Nakha;heal;Nakha; diff --git a/LichKing/PlayerCharacters.txt b/LichKing/PlayerCharacters.txt new file mode 100644 index 0000000..7a8b48c --- /dev/null +++ b/LichKing/PlayerCharacters.txt @@ -0,0 +1,4 @@ +! class ; name ; attack power ; defense power ;heal power; +Warrior;Fordring;0;10;0; +Priest;Nakha;0;0;12; +Rogue;Mograine;20;0;0; \ No newline at end of file diff --git a/data/LichKing.png b/data/LichKing.png new file mode 100644 index 0000000000000000000000000000000000000000..ed9aa46d861afc9d41090c9b7e8a793aa8c26d72 GIT binary patch literal 43764 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 literal 0 HcmV?d00001 diff --git a/launchJupyter.sh b/launchJupyter.sh new file mode 100755 index 0000000..eacf250 --- /dev/null +++ b/launchJupyter.sh @@ -0,0 +1,7 @@ +#!/bin/bash +if [ -z $1 ]; then + JPORT=8888 +else + JPORT="${1}" +fi +jupyter-lab --ip 0.0.0.0 --port $JPORT --no-browser diff --git a/midterm.pdf b/midterm.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c9dcd1d79eda62e1c386eebb144fe4d7ce2705b8 GIT binary patch literal 249184 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

Lm%ckjl}pKm}6_1%Xb^tkRc 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

&YH?au>AEx^djjk%sz^lyI~%3N1`dk%rZ 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 literal 0 HcmV?d00001 diff --git a/src/Priest.cc b/src/Priest.cc new file mode 100644 index 0000000..3531a0c --- /dev/null +++ b/src/Priest.cc @@ -0,0 +1,14 @@ +#include "Priest.h" + +int Priest::defend(Character* other) { + return defaultDefend(other); +} + +int Priest::heal(Character* other) { + return defaultHeal(other); +} + +int Priest::attack(Character* other) { + return defaultAttack(other); +} + diff --git a/src/Rogue.cc b/src/Rogue.cc new file mode 100644 index 0000000..529e6cb --- /dev/null +++ b/src/Rogue.cc @@ -0,0 +1,14 @@ +#include "Rogue.h" + +int Rogue::defend(Character* other) { + return defaultDefend(other); +} + +int Rogue::heal(Character* other) { + return defaultHeal(other); +} + +int Rogue::attack(Character* other) { + return defaultAttack(other); +} + diff --git a/src/Warrior.cc b/src/Warrior.cc new file mode 100644 index 0000000..31f3db1 --- /dev/null +++ b/src/Warrior.cc @@ -0,0 +1,14 @@ +#include "Warrior.h" + +int Warrior::defend(Character* other) { + return defaultDefend(other); +} + +int Warrior::heal(Character* other) { + return defaultHeal(other); +} + +int Warrior::attack(Character* other) { + return defaultAttack(other); +} + diff --git a/tests/Boss.txt b/tests/Boss.txt new file mode 100644 index 0000000..d509a44 --- /dev/null +++ b/tests/Boss.txt @@ -0,0 +1,4 @@ +!Description: +Larry, Moe, and Curly are the Three Stooges. Their poor friend Shemp has been bitten by a zombie and is trying to kill them. Help Larry, Moe, and Curly put Shemp out of his misery. Nyuk Nyuk Nyuk. +! Non-Player character. Fields are "name", attack power, heal power, defense power, mana, multi attack power +Bob The Boss;20;0;0;10;5; diff --git a/tests/BossScript.txt b/tests/BossScript.txt new file mode 100644 index 0000000..521b97a --- /dev/null +++ b/tests/BossScript.txt @@ -0,0 +1,3 @@ +! Test battle configuration. +Bob The Boss;attack;target; +Bob The Boss;attack;all; diff --git a/tests/PlayerCharacters.txt b/tests/PlayerCharacters.txt new file mode 100644 index 0000000..b7da379 --- /dev/null +++ b/tests/PlayerCharacters.txt @@ -0,0 +1,8 @@ +! +! Test party configuration: +! Warrior, Rogue, Priest +! Fields are : +! class, name, attack power, defense power, heal power +Warrior;William The Warrior;0;3;0; +Priest;Poppy The Priest;0;0;8; +Rogue;Rachel The Rogue;20;0;0; diff --git a/tests/PlayerScript.txt b/tests/PlayerScript.txt new file mode 100644 index 0000000..e102345 --- /dev/null +++ b/tests/PlayerScript.txt @@ -0,0 +1,4 @@ +! Test battle configuration. +Rachel The Rogue;attack;Bob The Boss; +William The Warrior;defend;Bob The Boss; +Poppy The Priest;heal;William The Warrior; From d418b0dc98310b49e0f43556a4bf6d335ef81acc Mon Sep 17 00:00:00 2001 From: DryRun Date: Wed, 15 Oct 2025 22:17:01 -0400 Subject: [PATCH 4/6] Nearly done --- AnalyzeBattle.ipynb | 167 ------------------------- README.md | 133 +++++++++----------- data/Arthas.txt | 5 - data/ArthasAttacks.txt | 3 - data/AshenVerdict.txt | 4 - interface/Battle.h | 2 + interface/Character.h | 6 + interface/Priest.h | 8 +- interface/Rogue.h | 12 +- interface/Warrior.h | 8 +- midterm.md | 246 ++++++++++++++++++++++++++++++++++++- src/Battle.cc | 21 +++- src/Character.cc | 7 ++ src/WorldOfTextCraft.cc | 12 +- tests/Boss.txt | 4 +- tests/BossScript.txt | 4 +- tests/PlayerCharacters.txt | 6 +- tests/PlayerScript.txt | 6 +- tests/Shemp.txt | 4 - tests/ShempAttacks.txt | 3 - tests/StoogesBattle.txt | 4 - tests/ThreeStooges.txt | 8 -- tests/test_battle.cc | 8 +- tests/test_boss.cc | 8 +- tests/test_character.cc | 6 +- 25 files changed, 377 insertions(+), 318 deletions(-) delete mode 100644 AnalyzeBattle.ipynb delete mode 100644 data/Arthas.txt delete mode 100644 data/ArthasAttacks.txt delete mode 100644 data/AshenVerdict.txt delete mode 100644 tests/Shemp.txt delete mode 100644 tests/ShempAttacks.txt delete mode 100644 tests/StoogesBattle.txt delete mode 100644 tests/ThreeStooges.txt diff --git a/AnalyzeBattle.ipynb b/AnalyzeBattle.ipynb deleted file mode 100644 index e1d3c90..0000000 --- a/AnalyzeBattle.ipynb +++ /dev/null @@ -1,167 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Problem 2: Analyze battle\n", - "\n", - "In this exercise, you will be analyzing the battle script output\n", - "that is created in `json` format by the `WorldOfTextCraft` executable. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "from readbattle import readbattle\n", - "import matplotlib.pyplot as plt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Get the data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "npdata = readbattle(infile='problem2a.txt')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Make a plot of the attacks per turn" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Make plot of attacks. \n", - "plt.plot(npdata[0,:,0],label=\"Arthas\")\n", - "plt.plot(npdata[1,:,0],label=\"Fordring\")\n", - "plt.plot(npdata[2,:,0],label=\"Thrall\")\n", - "plt.plot(npdata[3,:,0],label=\"Mograine\")\n", - "plt.legend()\n", - "plt.xlabel(\"Turn\")\n", - "plt.ylabel(\"Attack\")\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Part a\n", - "\n", - "Make plots of all action types for each character: `['Attacks', 'Defends', 'Heals', 'DamageReceived', 'HealingRecieved']`. (The `Attacks` are done in the last cell as an example). Label your axes and make a legend. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "## Plot here" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "## Plot here" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "## Plot here" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "## Plot here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Part b\n", - "\n", - "Using the [matplotlib hist](https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.hist.html) function, create a single plot showing histograms of the `Attacks` for each character. Label your axes and make a legend. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "## Plot here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Part c\n", - "\n", - "Repeat part b, but this time plot the `Attacks` only for turns where the character was healed. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "## Plot here" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.4rc2" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/README.md b/README.md index 9f67bd9..a3db469 100644 --- a/README.md +++ b/README.md @@ -4,58 +4,36 @@ This is a trivial turn-based role-playing fighting game, designed to teach C++. Apologies to Blizzard Entertainment for cribbing (and butchering) their content. The goal was to make this "bare bones" without a complicated build so people can see for themselves what is involved in the software. -This does require C++11 because of the use of a `vector< shared_ptr >` for memory management. -There is a very trivial Makefile to create three executables: +This does require C++11 because of the use of a `std::vector>` for memory management. -- **test_character**: test the base fighting class functionality -- **test_boss**: test the boss functionality -- **test_battle**: test a pre-scripted battle -- **WorldOfTextCraft**: the actual text-based RPG. -= -In order to compile just type `make`. +The included Makefile automatically compiles the program as follows: +- All files matching `src/%.cc` (except for the main executable WorldOfTextCraft.cc) are compiled to `build/\*.o`. +- The tests, at `tests/%.cc`, are compiled to executables `tests/%.exe` (linked with the `build/%.o` files). +- `src/WorldOfTextCraft.cc` is compiled to `/bin/WorldOfTextCraft.exe`. + +In order to compile just type `make`. To delete your compiled stuff, type `make clean`, or just manually delete the `.exe` files. ## PHY410/505 at UB ### Docker image +This program can be run using the PHY410/505 Docker image, https://hub.docker.com/r/subsuny/compphys. From this folder, just run `./runDocker.sh ubsuny/compphys:latest` (if using WSL+Ubuntu, instead run `./runDocker_wfix.sh ubsuny/compphys:latest` to fix a permissions issue). These are the same scripts that we provide in https://github.com/ubsuny/CompPhys. -If you are using the [CompPhys](https://github.com/ubsuny/CompPhys) -repository and the [docker image](https://hub.docker.com/r/subsuny/compphys) you -should add this to the `results` folder **in your host OS**: - -``` bash -cd /your/working/directory/results -git clone git@github.com:ubsuny/WorldOfTextCraft.git -``` - -so it looks like this: - -``` bash -└── results - ├── CompPhys - └── WorldOfTextCraft -``` - -Then go to the parent folder of the `results` folder: +Remember to do your work inside the mounted folder! Files outside the mounted folder will be deleted upon exiting the container. -``` bash -cd /your/working/directory/ -./runDocker.sh ubsuny/compphys:latest 1 -``` - -This will launch the docker image, so you will be in the `/results` -folder in docker. -You can then: +## Usage +For convenience, you might want to add `WorldOfTextCraft/bin` to your path, so you can access the executable from anywhere: ``` bash cd WorldOfTextCraft -make +export PATH=$PATH:$(readlink -e bin) +# Now you can call WorldOfTextCraft.exe from anywhere ``` -## Usage +To run the program: ``` bash -./WorldOfTextCraft player_config boss_config boss_script +WorldOfTextCraft.exe player_config boss_config boss_script ``` Here, we have: @@ -67,38 +45,42 @@ Here, we have: For instance: ``` bash -./WorldOfTextCraft AshenVerdict.txt Arthas.txt ArthasAttacks.txt +cd ExampleBattle +WorldOfTextCraft.exe PlayerCharacters.txt Boss.txt BossScript.txt ``` -## Syntax +You can copy-and-paste lines from PlayerScript.txt into the game to run through the example battle. Note: after your first turn, if you hit "enter", you will execute the previous command without having to type anything. -In all syntax files, lines starting with "!" will be ignored (i.e. comments) +### Configuration files -- Player configuration - - One line per party member, syntax : `type;name;attack_power;defense_power;heal_power;` +In all configuration files, lines starting with "!" will be ignored (i.e. comments) + +- Player configuration file: + - Contains a list of party members (i.e., the characters you control) and their stats. + - One line per party member, syntax: `type;name;attack_power;defense_power;heal_power;` - Example: ``` text ! - ! Test party configuration: + ! Test party configuration: ! Warrior, Rogue, Priest - ! Fields are : - ! name, character type, attack power, heal power, defense power - Rogue;Curly;20;0;0; - Priest;Larry;0;0;8; - Warrior;Moe;0;3;0; + ! Fields are : + ! class, name, attack power, defense power, heal power + Warrior;William The Warrior;0;3;0; + Priest;Poppy The Priest;0;0;8; + Rogue;Rachel The Rogue;20;0;0; ``` -- Boss configuration : +- Boss configuration file: - First line is the description of the battle to be displayed. - Then one line per boss, syntax: `name;attack_power;heal_power;defense_power;mana;multi_attack` - Example: ``` text !Description: - Larry, Moe, and Curly are the Three Stooges. Their poor friend Shemp has been bitten by a zombie and is trying to kill them. Help Larry, Moe, and Curly put Shemp out of his misery. Nyuk Nyuk Nyuk. + William the Warrior, Poppy the Priest, and Rachel the Rogue enter their first dungeon. Alas, their poor friend Bob has been bitten by a zombie and is trying to kill them. Help William, Poppy, and Rachel put Bob out of his misert! ! Non-Player character. Fields are "name", attack power, heal power, defense power, mana, multi attack power - Shemp;20;0;0;10;5; + Bob The Boss;20;0;0;10;5; ``` - Boss script: @@ -113,7 +95,8 @@ In all syntax files, lines starting with "!" will be ignored (i.e. comments) Shemp;attack;all; ``` -- Player script: (for `test_battle` only, not for `WorldOfTextCraft`): +- Player script: + - Contains a script for player character actions. Note: this is only implemented in `test_battle.cc`, not `WorldOfTextCraft.cc`. - One line per action, syntax: `name;action;target_name` - Here, "action" can be "attack", "heal", or "defend" - "target_name" must refer to a member of the Boss party. @@ -121,18 +104,18 @@ In all syntax files, lines starting with "!" will be ignored (i.e. comments) ``` text ! Test battle configuration. - Curly;attack;Shemp; - Moe;defend;Shemp; - Larry;heal;Moe; + Rachel The Rogue;attack;Bob The Boss; + William The Warrior;defend;Bob The Boss; + Poppy The Priest;heal;William The Warrior; ``` ## Game Mechanics The game is rather simple. Initially there are three player classes, all with 100 hit points, and one Boss class, with 500 hit points. -Once a character reaches 0 hit points, it dies. All characters have a common base C++ class +Once a character reaches 0 hit points, it dies. + All characters have a common base C++ class "Character", and then override the functionality in that base C++ class to be player-class-specific: - - Rogue: can cast "attack", which reduces the hit points of a target by 20. - Warrior: can cast "defend", which forces the target to attack the Warrior. They have a defense mitigation modifier ("defense power") that reduces the hit points lost upon an attack. The final damage is "attack_power - defense_power". - Priest: can cast "heal", which increases the hit points of a target by 20. Starts with 100 mana. @@ -140,12 +123,14 @@ Once a character reaches 0 hit points, it dies. All characters have a common bas You can adjust the game mechanics to add player classes of your own! -## Playing WorldOfTextCraft : The Lich King Scenario -To execute "The Lich King" Scenario, execute: +## Playing WorldOfTextCraft : The Lich King Scenario +In the Lich King scenario, you fight the boss Arthas (the "Lich King" bit is just for flavor, it behaves more or less the same as Bob The Boss from the example). The configuration files are located at `WorldOfTextCraft/LichKing`. +To run the scenario, make sure `WorldOfTextCraft/bin` is in your path, and then execute: ``` bash -./WorldOfTextCraft AshenVerdict.txt Arthas.txt ArthasAttacks.txt +cd LichKing +WorldOfTextCraft.exe PlayerCharacters.txt Arthas.txt ArthasAttacks.txt ``` You will be prompted as follows: @@ -153,7 +138,7 @@ You will be prompted as follows: ``` text reading PC configuration Added character: Fordring ( Warrior): HP= 100, mana = 0, no target -Added character: Thrall ( Priest): HP= 100, mana = 100, no target +Added character: Tarvek ( Priest): HP= 100, mana = 100, no target Added character: Mograine ( Rogue): HP= 100, mana = 0, no target reading NPC configuration Input boss: Arthas ( Boss): HP= 500, mana = 0, no target @@ -199,7 +184,7 @@ Arthas will perform action 3 on their target : NO TARGET! -------------- === players: Fordring ( Warrior): HP= 100, mana = 0, no target - Thrall ( Priest): HP= 100, mana = 100, no target + Tarvek ( Priest): HP= 100, mana = 100, no target Mograine ( Rogue): HP= 100, mana = 0, no target === monsters: @@ -209,8 +194,8 @@ Arthas attacks Fordring with attack power 20 Fordring loses 10 hit points after attack 20 and defense 10 Arthas multi-attacks Fordring with attack power 8 Fordring loses 0 hit points after attack 8 and defense 10 -Arthas multi-attacks Thrall with attack power 8 -Thrall loses 8 hit points after attack 8 and defense 0 +Arthas multi-attacks Tarvek with attack power 8 +Tarvek loses 8 hit points after attack 8 and defense 0 Arthas multi-attacks Mograine with attack power 8 Mograine loses 8 hit points after attack 8 and defense 0 Action for Fordring: @@ -229,9 +214,9 @@ You will then have the next player. Enter the next action, and you will again see a printout of the status of your attack: ``` text -Action for Thrall: -Thrall;heal;Mograine; -Thrall heals Mograine for 12 +Action for Tarvek: +Tarvek;heal;Mograine; +Tarvek heals Mograine for 12 ``` Finally you will see your next character. @@ -250,7 +235,7 @@ This reaches the end of your turn, so the status is printed again, and it is the -------------- === players: Fordring ( Warrior): HP= 90, mana = 0, target= Arthas - Thrall ( Priest): HP= 92, mana = 90, target= Mograine + Tarvek ( Priest): HP= 92, mana = 90, target= Mograine Mograine ( Rogue): HP= 100, mana = 0, target= Arthas === monsters: @@ -260,14 +245,14 @@ Arthas attacks Fordring with attack power 20 Fordring loses 10 hit points after attack 20 and defense 10 Arthas multi-attacks Fordring with attack power 8 Fordring loses 0 hit points after attack 8 and defense 10 -Arthas multi-attacks Thrall with attack power 8 -Thrall loses 8 hit points after attack 8 and defense 0 +Arthas multi-attacks Tarvek with attack power 8 +Tarvek loses 8 hit points after attack 8 and defense 0 Arthas multi-attacks Mograine with attack power 8 Mograine loses 8 hit points after attack 8 and defense 0 Action for Fordring: ``` -You can then cycle through until your party is victorious (the Boss dies), or fails (all of you die). Then the scenario ends. To exit prematurely, simply "control-C" out. +You can then cycle through until your party is victorious (the Boss dies), or fails (all of you die). Note: after your first turn, if you hit "enter", you will execute the previous command without having to type anything. Then the scenario ends. To exit prematurely, simply "control-C" out. ## Battle Log @@ -289,7 +274,7 @@ The C++ game will create a log of actions in a "DamageReceived":[10,0], "HealingRecieved":[0] }, - "Thrall":{"Attacks":[0], # and so on + "Tarvek":{"Attacks":[0], # and so on "Defends":[0], "Heals":[8], "DamageReceived":[8], @@ -318,12 +303,12 @@ columnar like this, with the column headings printed on top: ------------ turn : 0 --------------- ==== Arthas : 26, 0, 0, 20, 0, ==== Fordring : 0, 10, 0, 10, 0, -==== Thrall : 0, 0, 8, 8, 0, +==== Tarvek : 0, 0, 8, 8, 0, ==== Mograine : 20, 0, 0, 8, 8, ------------ turn : 1 --------------- ==== Arthas : 26, 0, 0, 20, 0, ==== Fordring : 0, 10, 0, 10, 0, -==== Thrall : 0, 0, 8, 8, 0, +==== Tarvek : 0, 0, 8, 8, 0, ==== Mograine : 20, 0, 0, 8, 8, ... diff --git a/data/Arthas.txt b/data/Arthas.txt deleted file mode 100644 index 1ab9c68..0000000 --- a/data/Arthas.txt +++ /dev/null @@ -1,5 +0,0 @@ -!Description: -!Mercilessly butchered from http://wowwiki.wikia.com/wiki/Arthas_Menethil -You venture forth from your stronghold in Azeroth to the icy continent of Northrend, accompanied only by your fellow adventurers and your courage. You have tracked Arthas Menethil to his Frozen Throne in the plagued wastelands of Icecrown. Once a brave champion of Lordaeron, Arthas was corrupted by evil and his soul subsumed by the shaman Ner'zhul upon taking the cursed Runeblade, Frostmourne, forming the entity known as the Lich King, threatening all life in Azeroth to become mindless undead slaves of the Burning Legion. The Knights of the Ebon Blade and the Argent Crusade have now formed the Ashen Verdict, and tasked you to destroy the Lich King and end his undead plague upon Azeroth. As you reach the Frozen Throne, the Lich King's seat, you hear a voice in your head. The Lich King whispers "Young heroes, I was once like you. You have come to this place seeking to bring judgement upon the damned. But, be warned. In the end, all that awaits you is death. Only then will you understand, you've been following in my footsteps all along. So come then, you heroes! Come in all your power and glory! For in this final hour, all must serve the one... true... king... Frostmourne HUNGERS....". The battle is joined. -! Non-Player character. Fields are "name", attack power, heal power, defense power, mana, multi attack power -Arthas;20;0;0;0;8; diff --git a/data/ArthasAttacks.txt b/data/ArthasAttacks.txt deleted file mode 100644 index 7a072cf..0000000 --- a/data/ArthasAttacks.txt +++ /dev/null @@ -1,3 +0,0 @@ -! Test battle configuration. -Arthas;attack;target; -Arthas;attack;all; diff --git a/data/AshenVerdict.txt b/data/AshenVerdict.txt deleted file mode 100644 index da3c4f8..0000000 --- a/data/AshenVerdict.txt +++ /dev/null @@ -1,4 +0,0 @@ -Warrior;Fordring;0;10;0; -Priest;Thrall;0;0;12; -Rogue;Mograine;20;0;0; - diff --git a/interface/Battle.h b/interface/Battle.h index f033392..5600603 100644 --- a/interface/Battle.h +++ b/interface/Battle.h @@ -153,6 +153,8 @@ class Battle { bool scripted_; // Is this fight scripted or user-turns? + std::map, std::string> last_action_; // Save last action; next turn, perform as default action if input is empty + // // // Internal workings of "Battle": diff --git a/interface/Character.h b/interface/Character.h index 7d2de47..693dfed 100644 --- a/interface/Character.h +++ b/interface/Character.h @@ -5,6 +5,7 @@ #include #include #include +#include // ----------------------------------------------------------------// /* _________ .__ __ */ @@ -86,6 +87,7 @@ class Character { // Input and output virtual void input(std::string instring); virtual void input(std::istream &in); + virtual void post_input() {}; // Hook for actions after input, i.e. after stats are set virtual void print(std::ostream &out) const; virtual void printStats(std::ostream &out) const; friend std::ostream &operator<<(std::ostream &out, Character const &e); @@ -145,6 +147,10 @@ class Character { int defaultHeal(Character *target = 0); int defaultDefend(Character *target = 0); + // Random number generator + std::default_random_engine gen_; + std::poisson_distribution<> poisson_; + // These will store the history of the results of various actions ActionMap my_attacks_; ActionMap my_defends_; diff --git a/interface/Priest.h b/interface/Priest.h index e3a3c07..b728461 100644 --- a/interface/Priest.h +++ b/interface/Priest.h @@ -1,6 +1,8 @@ #ifndef Priest_h #define Priest_h +#include "Character.h" + /* _____ _ _ */ /* | __ \ (_) | | */ /* | |__) | __ _ ___ ___| |_ */ @@ -14,9 +16,9 @@ class Priest : public Character { : Character("Priest", name, 0, 0, heal_power, 100) {}; // In a heal, we increase the hit points - int defend(Character *other = 0) override { return defaultDefend(other); } - int heal(Character *other = 0) override { return defaultHeal(other); } - int attack(Character *other = 0) override { return defaultAttack(other); } + int defend(Character *other = 0) override; + int heal(Character *other = 0) override; + int attack(Character *other = 0) override; private: }; diff --git a/interface/Rogue.h b/interface/Rogue.h index f899e16..e1a4473 100644 --- a/interface/Rogue.h +++ b/interface/Rogue.h @@ -1,6 +1,8 @@ #ifndef Rogue_h #define Rogue_h +#include "Character.h" + /* _____ */ /* | __ \ */ /* | |__) |___ __ _ _ _ ___ */ @@ -13,11 +15,13 @@ class Rogue : public Character { public: Rogue(std::string name = "", int attack_power = 0) - : Character("Rogue", name, attack_power, 0, 0) {}; + : Character("Rogue", name, attack_power, 0, 0) { + }; + + int defend(Character *other = 0) override; + int heal(Character *other = 0) override; + int attack(Character *other = 0) override; - int defend(Character *other = 0) override { return defaultDefend(other); } - int heal(Character *other = 0) override { return defaultHeal(other); } - int attack(Character *other = 0) override { return defaultAttack(other); } }; #endif diff --git a/interface/Warrior.h b/interface/Warrior.h index 8d9c704..ea0d4b8 100644 --- a/interface/Warrior.h +++ b/interface/Warrior.h @@ -1,6 +1,8 @@ #ifndef Warrior_h #define Warrior_h +#include "Character.h" + /* __ __ _ */ /* \ \ / / (_) */ /* \ \ /\ / /_ _ _ __ _ __ _ ___ _ __ */ @@ -13,9 +15,9 @@ class Warrior : public Character { Warrior(std::string name = "", int defense_power = 0) : Character("Warrior", name, 0, defense_power, 0) {}; - int defend(Character *other = 0) override { return defaultDefend(other); } - int heal(Character *other = 0) override { return defaultHeal(other); } - int attack(Character *other = 0) override { return defaultAttack(other); } + int defend(Character *other = 0) override; + int heal(Character *other = 0) override; + int attack(Character *other = 0) override; }; #endif diff --git a/midterm.md b/midterm.md index fb3f117..abcca86 100644 --- a/midterm.md +++ b/midterm.md @@ -1,5 +1,247 @@ -### PHY410/505 midterm, fall 2025 +--- +geometry: +- margin=1in +mainfont: Palatino +header-includes: +- \usepackage[document]{ragged2e} +--- + +# PHY410/505 midterm, fall 2025 +*Due date: Thursday, October 23 at 11:59pm* This midterm will test the technical programming aspects covered so far this semester. We've provided some C++ code for a text-based "role playing game": __World of Textcraft__. -To start, you should read `README.md` to understand the program, and run through the \ No newline at end of file +This is a larger program than those used in assignments so far, with several classes and tests defined in addition to the main executable. +While the program does not directly involve much physics, it covers many of the technical topics introduced in the first half of this semester. +The same program structure could be used, for example, for an N-body physics simulation, where physical interactions replace the simple hit point calculations. + +## Instructions +- PHY410: Do problems 1–3. You can do problem 4 for extra credit (it will replace your lowest scoring problem from your homework problems, if higher). +- PHY505: Do all problems, 1–4. + +Accept the assignment on GitHub Classroom here: https://classroom.github.com/classrooms/46534332-compphys-fall2025. I recommend that you commit and push your progress at regular intervals (e.g. daily), which ensures your progress is backed up. Don't worry, you can commit and/or push as many times as you like; nothing is considered "submitted" until the deadline. + +To start, you should read `README.md` to understand the structure of the program. Running `make` from the top-level directory will compile the program; try running some of the test programs under `WorldOfTextCraft/tests`. + +Upload your writeup to UBLearns and push your committed code to GitHub Classroom. Your writeup should include documentation of the code you wrote, as well as the solutions to the problems in written form. Do not work with other students. + + +### Docker container +As usual, feel free to use any environment you like, including our Docker container at `ubsuny/compphys:latest`. The usual scripts (`runDocker.sh`, `runDocker_wfix.sh`, and `launchJupyter.sh`) have been copie to this repository. + +If you use the Docker container, you might find yourself in need of multiple terminal windows: one for a Jupyter server, another for compiling and running the game. There are a few ways to do this: + +- You can connect another terminal to the container using `docker exec...` as follows: + - First, look up the "contained ID" of your running container using `docker ps` (you might need sudo). It will be a random hexademical string, for example `dc07315c5228`. + - (You can directly connect with `docker exec -it dc07315c5228 /bin/bash`. The `-it` calls Docker in interactive+TTY mode, which gives you a shell prompt, and the `/bin/bash` puts you in a bash shell. However, this is not ideal for our container!) + - However, our container makes use of an "entrypoint" script that runs every time you start the container. So, you should connect to the running container using `docker exec -it dc07315c5228 /usr/local/bin/entrypoint.sh` (or `entrypoint_wfix.sh` if you are using WSL+Ubuntu). +- You can modify the `launchJupyter.sh` script to start the server in the background. Add a `&` character at the end of the `jupyter-lab` command. +- You can open a terminal inside the JupyterLab browser window. Click the "+" as if you were making a new notebook, and the button to start the terminal is down the page. + +\newpage + + +## Problem 1: Example Battle +The configuration files for this problem are located in `WorldOfTextCraft/ExampleBattle`. + +### Problem 1a +*10 points* + +Compile the program with `make` and run through the example battle. Specifically compile everything with: + +``` bash + +cd WorldOfTextCraft +make +``` + +For convenience, you can add the `bin` folder to your `$PATH` variable, which lets you execute `WorldOfTextCraft.exe` from anywhere (otherwise, you'll have to type a full relative or absolute path to the executable, which is fine but a bit painful): + +``` bash +cd WorldOfTextCraft +export PATH=$PATH:$(readlink -e bin) +``` + +To run the example battle: +``` bash +cd WorldOfTextCraft/ExampleBattle +WorldOfTextCraft.exe PlayerCharacters.txt Boss.txt BossScript.txt problem1a.txt +``` + +For your first turn, use the actions in `ExampleBattle/PlayerScript.txt` (i.e., copy-and-paste them into the interface when prompted). **On subsequent turns, you can just hit "enter" to repeat the previous action** (or you can specify a new action, for example changing the healer's target). + +Besides running the game, this will save a battle log to `problem1a.txt`. + +Did you win? Copy the outcome to your writeup, and commit `problem1a.txt` to your repository. + + +### Problem 1b +*15 points* + +You will now update the `Rogue.h` and `Rogue.cc` files to enhance your powers (since you are the developer, this is not considered cheating ;) ). The class definition is quite short, since it inherits most of its functionality from Character.h; Rogue.h simply overloads the `attack()`, `defend()`, and `heal()` methods. For `attack()` specifically, it calls a function called `defaultAttack()` which is defined in the base class (i.e., in `Character.h` and +`Character.cc`). + +For this problem, modify the `Rogue::attack()` method as follows: + +- First, copy the contents of `defaultAttack()` into `Rogue::attack()`. +- Every third turn (i.e., for turn mod 3 == 0), write a new method to do an extra 20 damage on top of the base attack power. +- Otherwise (i.e., for turn mod 3 == 1 or 2), call `defaultAttack()`. + +Ensure that `myAttacks_` is up to date! + +After updating the Rogue class and re-compiling, run the game with the following command: +``` bash +WorldOfTextCraft.exe PlayerCharacters.txt Boss.txt BossScript.txt problem1b.txt +``` + +Hints: +- The `getTurn()` method in the `Character` base class can be used to determine which turn the Rogue is on. + +Did you win now? Copy the outcome to your writeup, and commit `problem1b.txt` to your repository. + +\newpage + + +## Problem 2: The Lich King battle +![Lich King](data/LichKing.png) + +For Problem 2, we'll run through a different scenario, the Lich King boss. The configuration files are located at `WorldOfTextCraft/LichKing`. (If you quit your terminal window after the last problem, remember to re-run the PATH command so that `WorldOfTextCraft.exe` is on your PATH.) Run through this battle with the following commands, including your updated Rogue from Problem 1b: + +``` bash +cd LichKing +WorldOfTextCraft.exe PlayerCharacters.txt Arthas.txt ArthasScript.txt problem2.txt +# You can copy-and-paste action commands from LichKing/PlayerActions.txt +``` + +Commit `problem2.txt` to your repository. Now, the actual problem involves analyzing the battle log file using python. Start the Jupyter server and open the notebook `Problem2.ipynb`. You should do the whole problem in this notebook. + +### Problem 2a +*5 points* + +The notebook reads in a battle log file using a helper script in `readbattle.py`. The script puts the data into a numpy array for you. + +For each character, make a plot visualizing the actions during the battle (`['Attacks', 'Defends', 'Heals', 'DamageReceived', 'HealingReceived']`). Specifically, the x-axis should be the turn number, and the y-axis should be the number corresponding to the action (damage done, damage mitigated, amount healed, etc.), as present in the log file. Label your axes and make a legend. + +The first plot for `Attacks` is already done as an example. + +### Problem 2b +*5 points* + +Using numpy, make a single plot showing the hit points remaining at the end of each turn (y-axis) versus turn number (x-axis) for all characters. Label the axes and draw a legend. You will have to account for both DamageReceived and HealingReceived. `np.cumsum()` may help. + +### Problem 2c +*5 points* + +Using the matplotlib [hist](https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.hist.html) function, create a single plot showing histograms of the Attacks for each character. Label your +axes and make a legend. + +### Problem 2d +*10 points* +Repeat 2c, but this time plot the Attacks only for turns +where the character was healed. + +For the submission, please do the following: +- Commit the notebook to your repository. +- Export the notebook to HTML format with filename `Problem2.html`, and upload to UBLearns. + +\newpage + + +## Problem 3 +**Enter the physicist** + +The Warrior, Priest, and Rogue are clearly not getting the job done. It is time for a Physicist to enter the battle. + +### Problem 3a +*15 points* + +Let's add Isaac Newton to our party. Isaac throws apples at the Boss, which scatter elastically and do damage equal to the kinetic energy transferred to the Boss. + +Create a new class, `Physicist`, with the following specifications: + +- The Physicist is a damage dealer, so copying `Rogue.h` and `Rogue.cc` is a good starting point. +- Additionally, the Physicist has two more stats, `mana_` and `velocity_`. + - `mana_`: similar to the Priest and Boss classes. The Physicist should start with 100 mana. This does not need to be configurable. + - `apple_mass_`: this should be configurable via the configuration files. Besides adding a member variable to the class, you need to override the two `Character::input()` functions to handle one additional argument from the configuration file. (You might want to refer to the `Boss` class definition.) +- In `attack()`, calculate damage as follows. The Physicist throws an apple of mass `apple_mass_` (kg) with velocity `v = attack_power_` (m/s). The Boss has a mass of $M=200$ kg. The apple collides elastically with the Boss and bounces straight backwards (i.e. a 1D collision). The damage is equal to the kinetic energy (joules) imparted to the Boss. Write the code to calculate the kinetic energy imparted to the Boss. +- Besides creating `Physicist.h`, you will need a small addition to `Battle.cc`. + +Once you have created the new class, create a new scenario (i.e., the `.txt` configuration files) in a new folder, `LichKing2`. Copy the original `LichKing` configuration files to that folder, and add a new character to your party: + +- class = Physicist +- name = Isaac Newton +- attack power = 50 +- defense power = 0 +- heal power = 0 +- apple mass = 1.0 + +Here are some suggested commands to get started: + +``` bash +cd WorldOfTextCraft +mkdir LichKing2 +cp LichKing/*txt LichKing2 +cd LichKing2 +# Add Newton to PlayerCharacters.txt +WorldOfTextCraft.exe PlayerCharacters.txt Arthas.txt ArthasScript.txt problem3.txt +# You can copy-and-paste action commands from LichKing2/PlayerActions.txt +``` + +Did you (finally) win? Commit `problem3.txt` to your repository. + +### Problem 3b +*10 points* + +CRepeat the data analysis from Problem 2 using the log file from this battle, `LichKing2/problem3.txt`. Start by copying the notebook, `cp Problem2.ipynb Problem3.ipynb`, and remember to update the character list in the notebook. Once finished, commit the notebook to the repository and upload an HTML export of the notebook to UBLearns. + +\newpage + + +## Problem 4 +This problem is mandatory for PHY505 students. PHY410 students can also complete the problem for extra credit. + +In this problem, we will add randomness to the game. C++ has quite a few utilities for generating (pseudo)random numbers (see https://en.cppreference.com/w/cpp/numeric/random.html). In this problem, we will use the [Poisson distribution](https://en.cppreference.com/w/cpp/numeric/random/poisson_distribution.html) to randomly vary the program. + +Pseudorandom number generators are often used in programming to create a sequence of numbers that appear random, but are generated in a deterministic way. For most purposes, they can be used like real random numbers, but since the sequences are deterministic, our programs' results are fully reproducible, which is usually desired in programming (for unit tests, for example). Pseudorandom number generators are usually initialized with a "seed," which is just an integer used in some way to start the sequence. For a given seed, the generator always yields the same sequence; the seed can be varied to generate different sequences. + +We will use the `std::default_random_engine` class for our pseudorandom number generator. The random seed is obtained from `std::random_device`, which generates a true random number. Finally, in `std::poisson_distribution<>`, the pseudorandom numbers are used to sample the Poisson distribution. + +### Problem 4a +*20 points* + +Add a random number generator to the Rogue class's attack. Following closely this [example](https://en.cppreference.com/w/cpp/numeric/random/poisson_distribution.html), do the following steps to introduce random variations in the characters' actions: + +- In the Character class, add an instance of `std::default_random_engine` as a class member variable. +- In the constructor `Character::Character()`, create the generator and give it a random seed using `std::random_device`, following the example. +- In the Character class, add an instance of `std::poisson_distribution` as a class member variable. +- **Important**: you cannot initialize the `std::poisson_distribution` in the constructor, because `attack_power_` has not yet been set! Instead, initialize `poisson_` in the function `Rogue::post_input() override {...}`. This is a "hook" function declared in the base class that you can override in the derived class to run some code directly after `input()`. + - We have to use this hook because `attack_power_` is not set until `input()` is run. +- Finally, change `Rogue::attack()` to use `poisson_` to generate a random attack value, instead of using `attack_power_` directly. Make sure to preserve the modifications from Problem 1b. +- Compile with `make`. + +Once you've finished adding random numbers to the Rogue class, create a new scenario in folder `LichKing3`. Copy the configuration files from Problem 3 (`LichKing2`). (If you didn't finish Problem 3, you can copy from `LichKing` instead.) Run the scenario without any further modifications, e.g., + +``` bash +cd WorldOfTextCraft +mkdir LichKing3 +cp LichKing2/*txt LichKing3 +cd LichKing3 +WorldOfTextCraft.exe PlayerCharacters.txt Arthas.txt ArthasScript.txt problem4.txt +# You can copy-and-paste action commands from LichKing2/PlayerActions.txt +# +``` + +You should now see random values for the Rogue's damage. Commit `problem4.txt` to your repository. + + +### Problem 4b +*5 points* + +Repeat Problem 2c: start by copying the notebook, `cp Problem2.ipynb Problem4.ipynb`, and change the input to `LingKing3/problem4.txt`. Remember to update the character list. Using the matplotplib [hist](https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.hist.html) function, create a single plot showing histograms of the Attacks for each character. Label your axes and make a legend. + +You should now see a Poisson distribution for the Rogue's damage. + +Upload the notebook to your repository, and upload an HTML export of the notebook to UBLearns. + + + diff --git a/src/Battle.cc b/src/Battle.cc index dbca2ff..48b1381 100644 --- a/src/Battle.cc +++ b/src/Battle.cc @@ -78,6 +78,7 @@ bool Battle::readPCConfiguration(std::string filename) { continue; } character->input(tokens); + character->post_input(); pcs_.push_back(character); std::cout << "Added character: " << *(pcs_.back()) << std::endl; } @@ -445,15 +446,24 @@ bool Battle::performUserActions(std::istream &in) { continue; } - std::cout << "Action for " << (*it)->name() << ": " << std::endl; + std::cout << ">> Enter action for " << (*it)->name() << " : " << std::endl; + if (last_action_[(*it)] != "") { + std::cout << " (Default: " << last_action_[(*it)] << ")" << std::endl; + } QuickAction qa; std::string line; - in >> line; - // std::getline( in, line ); + //in >> line; + std::getline(in, line); + if (line == "") { + line = last_action_[(*it)]; + } bool success = parseAction(line, qa); while (!success) { std::cout << "Invalid input, try again" << std::endl; - in >> line; + std::getline(in, line); + if (line == "") { + line = last_action_[(*it)]; + } success = parseAction(line, qa); } if (qa.action == ATTACK) { @@ -471,6 +481,7 @@ bool Battle::performUserActions(std::istream &in) { std::cout << (*it)->name() << " has vanquished your foe." << std::endl; return false; } + last_action_[(*it)] = line; } ++turn_; @@ -557,7 +568,7 @@ void Battle::printStats(std::ostream &out) { } void Battle::print(std::ostream &out) { - out << "------------------------------- Turn : " << turn_ + out << std::endl << "------------------------------- Turn : " << turn_ << "-------------------------------" << std::endl; out << "--------------" << std::endl; out << " === players:" << std::endl; diff --git a/src/Character.cc b/src/Character.cc index b3ed9da..f15577c 100644 --- a/src/Character.cc +++ b/src/Character.cc @@ -17,6 +17,13 @@ Character::Character(std::string class_name, std::string name, // Check to make sure your powers aren't outrageous checkPowers(); } + + std::random_device rd; + gen_ = std::default_random_engine(rd()); + std::cout << "[Character::Character] DEBUG : Trying out gen_ a few times" << std::endl; + for (int i = 0; i < 10; ++i) { + std::cout << gen_() << std::endl; + } } // Destructor diff --git a/src/WorldOfTextCraft.cc b/src/WorldOfTextCraft.cc index 633d739..838bc71 100644 --- a/src/WorldOfTextCraft.cc +++ b/src/WorldOfTextCraft.cc @@ -47,24 +47,20 @@ int main( int argc, char ** argv ) { battle.splash(); std::cout << "Are you ready to begin? [Y/n] " << std::endl; - char c; - std::cin >> c; - if ( c == 'y' || c == 'Y') { + std::string response; + std::getline(std::cin, response); + if (response == "y" || response == "Y" || response == "") { std::cout << "Excellent... let us begin..." << std::endl; battle.printActions(); - - // Now loop and FIGHT! success= true; do { battle.print(); - success = battle.performUserActions(); - } - while ( success ); + while (success); } diff --git a/tests/Boss.txt b/tests/Boss.txt index d509a44..e878df6 100644 --- a/tests/Boss.txt +++ b/tests/Boss.txt @@ -1,4 +1,4 @@ !Description: -Larry, Moe, and Curly are the Three Stooges. Their poor friend Shemp has been bitten by a zombie and is trying to kill them. Help Larry, Moe, and Curly put Shemp out of his misery. Nyuk Nyuk Nyuk. +William the Warrior, Poppy the Priest, and Rachel the Rogue enter their first dungeon. Alas, their poor friend Bob has been bitten by a zombie and is trying to kill them. Help William, Poppy, and Rachel put Bob out of his misert! ! Non-Player character. Fields are "name", attack power, heal power, defense power, mana, multi attack power -Bob The Boss;20;0;0;10;5; +Bob;20;0;0;10;5; diff --git a/tests/BossScript.txt b/tests/BossScript.txt index 521b97a..095a3a8 100644 --- a/tests/BossScript.txt +++ b/tests/BossScript.txt @@ -1,3 +1,3 @@ ! Test battle configuration. -Bob The Boss;attack;target; -Bob The Boss;attack;all; +Bob;attack;target; +Bob;attack;all; diff --git a/tests/PlayerCharacters.txt b/tests/PlayerCharacters.txt index b7da379..62bf900 100644 --- a/tests/PlayerCharacters.txt +++ b/tests/PlayerCharacters.txt @@ -3,6 +3,6 @@ ! Warrior, Rogue, Priest ! Fields are : ! class, name, attack power, defense power, heal power -Warrior;William The Warrior;0;3;0; -Priest;Poppy The Priest;0;0;8; -Rogue;Rachel The Rogue;20;0;0; +Warrior;William;0;3;0; +Priest;Poppy;0;0;8; +Rogue;Rachel;20;0;0; diff --git a/tests/PlayerScript.txt b/tests/PlayerScript.txt index e102345..4f7c259 100644 --- a/tests/PlayerScript.txt +++ b/tests/PlayerScript.txt @@ -1,4 +1,4 @@ ! Test battle configuration. -Rachel The Rogue;attack;Bob The Boss; -William The Warrior;defend;Bob The Boss; -Poppy The Priest;heal;William The Warrior; +Rachel;attack;Bob; +William;defend;Bob; +Poppy;heal;William; diff --git a/tests/Shemp.txt b/tests/Shemp.txt deleted file mode 100644 index bfaa51a..0000000 --- a/tests/Shemp.txt +++ /dev/null @@ -1,4 +0,0 @@ -!Description: -Larry, Moe, and Curly are the Three Stooges. Their poor friend Shemp has been bitten by a zombie and is trying to kill them. Help Larry, Moe, and Curly put Shemp out of his misery. Nyuk Nyuk Nyuk. -! Non-Player character. Fields are "name", attack power, heal power, defense power, mana, multi attack power -Shemp;20;0;0;10;5; diff --git a/tests/ShempAttacks.txt b/tests/ShempAttacks.txt deleted file mode 100644 index 44a5c0c..0000000 --- a/tests/ShempAttacks.txt +++ /dev/null @@ -1,3 +0,0 @@ -! Test battle configuration. -Shemp;attack;target; -Shemp;attack;all; diff --git a/tests/StoogesBattle.txt b/tests/StoogesBattle.txt deleted file mode 100644 index c2f7ba8..0000000 --- a/tests/StoogesBattle.txt +++ /dev/null @@ -1,4 +0,0 @@ -! Test battle configuration. -Curly;attack;Shemp; -Moe;defend;Shemp; -Larry;heal;Moe; diff --git a/tests/ThreeStooges.txt b/tests/ThreeStooges.txt deleted file mode 100644 index 5587506..0000000 --- a/tests/ThreeStooges.txt +++ /dev/null @@ -1,8 +0,0 @@ -! -! Test party configuration: -! Warrior, Rogue, Priest -! Fields are : -! entity type, name, attack power, defense power, heal power -Rogue;Curly;20;0;0; -Priest;Larry;0;0;8; -Warrior;Moe;0;3;0; diff --git a/tests/test_battle.cc b/tests/test_battle.cc index 6e21a4e..5263637 100644 --- a/tests/test_battle.cc +++ b/tests/test_battle.cc @@ -14,24 +14,24 @@ int main(int argc, char **argv) { bool success = true; // Read the party configurations - success = battle.readPCConfiguration("ThreeStooges.txt"); + success = battle.readPCConfiguration("PlayerCharacters.txt"); if (!success) { std::cout << "No PC configuration read" << std::endl; return 0; } - success = battle.readNPCConfiguration("Shemp.txt"); + success = battle.readNPCConfiguration("Boss.txt"); if (!success) { std::cout << "No PC configuration read" << std::endl; return 0; } // Read a test sequence. - success = battle.loadActionScript("ShempAttacks.txt"); + success = battle.loadActionScript("BossScript.txt"); if (!success) { std::cout << "No NPC script read" << std::endl; return 0; } - success = battle.loadActionScript("StoogesBattle.txt"); + success = battle.loadActionScript("PlayerScript.txt"); if (!success) { std::cout << "No PC script read" << std::endl; return 0; diff --git a/tests/test_boss.cc b/tests/test_boss.cc index 019f085..8f2965f 100644 --- a/tests/test_boss.cc +++ b/tests/test_boss.cc @@ -7,10 +7,10 @@ int main(int argc, char **argv) { - Warrior warrior("Larry", 3); - Priest priest("Moe", 5); - Rogue rogue("Curly", 15); - Boss boss("Shemp", 15, 4, 2, 100, 8); + Warrior warrior("William The Warrior", 3); + Priest priest("Poppy The Priest", 5); + Rogue rogue("Rachel The Rogue", 15); + Boss boss("Bob The Boss", 15, 4, 2, 100, 8); unsigned i = 0; bool done = false; diff --git a/tests/test_character.cc b/tests/test_character.cc index bba23db..1ff0a98 100644 --- a/tests/test_character.cc +++ b/tests/test_character.cc @@ -6,9 +6,9 @@ int main(int argc, char **argv) { - Warrior warrior("Larry", 10); - Priest priest("Moe", 5); - Rogue rogue("Curly", 15); + Warrior warrior("William The Warrior", 10); + Priest priest("Poppy The Priest", 5); + Rogue rogue("Rachel The Rogue", 15); unsigned i = 0; bool done = false; From 8c79c6eba957bb4ddce16e8e57acb6d2ffddb083 Mon Sep 17 00:00:00 2001 From: DryRun Date: Wed, 15 Oct 2025 22:19:21 -0400 Subject: [PATCH 5/6] Add example battle --- ExampleBattle/Boss.txt | 4 ++++ ExampleBattle/BossScript.txt | 3 +++ ExampleBattle/PlayerActions.txt | 6 ++++++ ExampleBattle/PlayerCharacters.txt | 8 ++++++++ 4 files changed, 21 insertions(+) create mode 100644 ExampleBattle/Boss.txt create mode 100644 ExampleBattle/BossScript.txt create mode 100644 ExampleBattle/PlayerActions.txt create mode 100644 ExampleBattle/PlayerCharacters.txt diff --git a/ExampleBattle/Boss.txt b/ExampleBattle/Boss.txt new file mode 100644 index 0000000..a5d3fcd --- /dev/null +++ b/ExampleBattle/Boss.txt @@ -0,0 +1,4 @@ +!Description: +William the Warrior, Poppy the Priest, and Rachel the Rogue enter their first dungeon. Alas, their poor friend Bob has been bitten by a zombie and is trying to kill them. Help William, Poppy, and Rachel put Bob out of his misery! +! Non-Player character. Fields are "name", attack power, heal power, defense power, mana, multi attack power +Bob;20;0;0;10;5; diff --git a/ExampleBattle/BossScript.txt b/ExampleBattle/BossScript.txt new file mode 100644 index 0000000..095a3a8 --- /dev/null +++ b/ExampleBattle/BossScript.txt @@ -0,0 +1,3 @@ +! Test battle configuration. +Bob;attack;target; +Bob;attack;all; diff --git a/ExampleBattle/PlayerActions.txt b/ExampleBattle/PlayerActions.txt new file mode 100644 index 0000000..3a0bc7e --- /dev/null +++ b/ExampleBattle/PlayerActions.txt @@ -0,0 +1,6 @@ +! A list of player actions for you to copy-and-paste. +Rachel;attack;Bob; +William;defend;Bob; +Poppy;heal;William; +Poppy;heal;Rachel; +Poppy;heal;Poppy; diff --git a/ExampleBattle/PlayerCharacters.txt b/ExampleBattle/PlayerCharacters.txt new file mode 100644 index 0000000..62bf900 --- /dev/null +++ b/ExampleBattle/PlayerCharacters.txt @@ -0,0 +1,8 @@ +! +! Test party configuration: +! Warrior, Rogue, Priest +! Fields are : +! class, name, attack power, defense power, heal power +Warrior;William;0;3;0; +Priest;Poppy;0;0;8; +Rogue;Rachel;20;0;0; From 891b47e3f65cfe460685e5d3099ba97154daadd5 Mon Sep 17 00:00:00 2001 From: DryRun Date: Wed, 15 Oct 2025 22:20:17 -0400 Subject: [PATCH 6/6] mkdir bin --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index aa1ab17..4ea3757 100644 --- a/Makefile +++ b/Makefile @@ -19,7 +19,7 @@ TEST_BINS := $(patsubst $(TEST_DIR)/%.cc, $(TEST_DIR)/%.exe, $(TEST_FILES)) all: bin/WorldOfTextCraft.exe $(TEST_BINS) # Rule to build main executable -bin/WorldOfTextCraft.exe: $(OBJ_FILES) +bin/WorldOfTextCraft.exe: $(OBJ_FILES) | $(BIN_DIR) @echo "Linking $@..." $(CXX) $(CXXFLAGS) -o $@ src/WorldOfTextCraft.cc $(OBJ_FILES)