Skip to content

Instantly share code, notes, and snippets.

@azrakreborn
Last active January 5, 2016 06:14
Show Gist options
  • Save azrakreborn/5cd7360e4fd653970df1 to your computer and use it in GitHub Desktop.
Save azrakreborn/5cd7360e4fd653970df1 to your computer and use it in GitHub Desktop.
// SimpleDungeon.cpp : Simplified version of D20 system
#include "stdafx.h"
#include <iostream>
#include <string>
#include <cstdlib>
#include <random>
#include <ctime>
using namespace std;
//*************************************************************************************
// Functions
//
//*************************************************************************************
// Dice function
int roll(int di) {
default_random_engine generator((int)time(NULL));
uniform_int_distribution<int> dice(1, di);
return dice(generator);
}// end Function(roll)
int getStatMod(int stat) {
if (stat >= 28)
return 9;
else if (stat >= 26 && stat < 28)
return 8;
else if (stat >= 24 && stat < 26)
return 7;
else if (stat >= 22 && stat < 26)
return 6;
else if (stat >= 20 && stat < 22)
return 5;
else if (stat >= 18 && stat < 20)
return 4;
else if (stat >= 16 && stat < 18)
return 3;
else if (stat >= 14 && stat < 16)
return 2;
else if (stat >= 12 && stat < 14)
return 1;
else if (stat >= 10 && stat < 12)
return 0;
else if (stat >= 8 && stat < 10)
return -1;
else if (stat >= 6 && stat < 8)
return -2;
else if (stat >= 4 && stat < 6)
return -3;
else if (stat >= 2 && stat < 4)
return -4;
else if (stat >= 0 && stat < 2)
return -5;
else if (stat >= -2 && stat < 0)
return -6;
else if (stat >= -4 && stat < -2)
return -8;
else if (stat >= -6 && stat < -4)
return -9;
else
return -10;
}// end getStatMod(int)
//****************************************************************************************
// User Input Functions
//
//****************************************************************************************
int getPositiveInt(string prompt, int maxValue) {
string userInput;
int number = 0;
do {
cout << prompt;
cin >> userInput;
try {
number = stoi(userInput);
}// end try
catch (invalid_argument) {
cout << "Invalid entry typed.";
}// end catch
} while (number < 1 || number > maxValue);
return number;
}// end getPositiveInt(string, int)
int getPositiveIntOrGoBack(string prompt, int maxValue) {
string userInput;
int number = 0;
do {
cout << prompt;
cin >> userInput;
try {
number = stoi(userInput);
}// end try
catch (invalid_argument) {
cout << "Invalid entry typed.";
}// end catch
} while ((number < 1 && number != -1) || number > maxValue);
return number;
}// end getPositiveIntOrGoBack(string, int)
//*************************************************************************************
// Equipment Classes
//
//*************************************************************************************
class Item {
protected:
string name;
string type;
long value;
public:
Item();
Item(string, long);
~Item();
string getName() { return name; }
string getType() { return type; }
long getValue() { return value; }
string toString();
};// end class Item
Item::Item() {
}// end constructor(Item())
Item::~Item() {
}// end destructor(~Item())
Item::Item(string name, long value) {
this->name = name;
type = "Item";
this->value = value;
}// end constructor(Item(string))
string Item::toString() {
return "Name: " + name + "\nValue: " + to_string(value) + "\n\n";
}// end toString()
// Quest Item
class QuestItem : public Item {
public:
QuestItem();
~QuestItem();
QuestItem(string);
};// end class QuestItem
QuestItem::QuestItem() {
type = "NULL";
}// end constructor(QuestItem())
QuestItem::~QuestItem() {
}// end destructor(~QuestItem())
QuestItem::QuestItem(string name) : Item(name, 0) {
type = "Quest";
}// end constructor(QuestItem())
// Armor
// Class Armor(Non-Magic)
class Armor : public Item {
protected :
int defense;
bool isMagic;
string armorType;
int strBonus;
int dexBonus;
int conBonus;
int defenseBonus;
int attackBonus;
int hpBonus;
public :
Armor();
Armor(string, int, string, long);
~Armor();
int getDefense() { return defense; }
bool isArmorMagic() { return isMagic; }
string getArmorType() { return armorType; }
int getStrBonus() { return strBonus; }
int getDexBonus() { return dexBonus; }
int getConBonus() { return conBonus; }
int getDefenseBonus() { return defenseBonus; }
int getAttackBonus() { return attackBonus; }
int getHpBonus() { return hpBonus; }
string toString();
};// end class Armor
Armor::Armor(string name, int defense, string type, long value) : Item(name, value) {
this->defense = defense;
armorType = type;
isMagic = false;
strBonus = 0;
dexBonus = 0;
conBonus = 0;
defenseBonus = 0;
attackBonus = 0;
hpBonus = 0;
type = "Armor";
}// end constructor(Armor)
Armor::Armor() {
}// end constructor(Armor())
Armor::~Armor() {
}// end destructor(Armor)
string Armor::toString() {
return "Name: " + name + "\nDefense: " + to_string(defense) +
"\nType: " + armorType + "\n";
}// end toString
// Class MagicArmor(Magic)
class MagicArmor : public Armor {
public:
MagicArmor::MagicArmor();
MagicArmor(string, int, string, long, int, int, int, int, int, int);
~MagicArmor();
};// end class MagicArmor
MagicArmor::MagicArmor() {
}// end constructor(MagicArmor())
MagicArmor::MagicArmor(string name, int defense, string type, long value, int strBonus, int conBonus, int dexBonus,
int defenseBonus, int attackBonus, int hpBonus) : Armor(name, defense, type, value) {
this->strBonus = strBonus;
this->dexBonus = dexBonus;
this->conBonus = conBonus;
this->defenseBonus = defenseBonus;
this->attackBonus = attackBonus;
this->hpBonus = hpBonus;
isMagic = true;
}// end constructor(MagicArmor)
MagicArmor::~MagicArmor() {
}// end deconstructor(~MagicArmor())
// Weapons
// Class Weapon(Non-Magic)
class Weapon : public Item {
protected :
int damage;
bool isMagic;
int strBonus;
int dexBonus;
int conBonus;
int defenseBonus;
int attackBonus;
int hpBonus;
string damageType;
public :
Weapon();
Weapon(string, int, string, long);
~Weapon();
int getDamage() { return damage; }
bool isWeaponMagic() { return isMagic; }
string getDamageType() { return damageType; }
int getStrBonus() { return strBonus; }
int getDexBonus() { return dexBonus; }
int getConBonus() { return conBonus; }
int getDefenseBonus() { return defenseBonus; }
int getAttackBonus() { return attackBonus; }
int getHpBonus() { return hpBonus; }
string toString();
};// end class Weapon
Weapon::Weapon() {
}// end constructor(Weapon())
Weapon::Weapon(string name, int damage, string type, long value) : Item(name, value) {
this->damage = damage;
damageType = type;
isMagic = false;
strBonus = 0;
dexBonus = 0;
conBonus = 0;
defenseBonus = 0;
attackBonus = 0;
hpBonus = 0;
this->type = "Weapon";
}// end constructor(Weapon(string. int, string))
Weapon::~Weapon() {
}// end destructor(~Weapon())
string Weapon::toString() {
return "Name: " + name + "\nDamage: " + to_string(damage) +
"\nType: " + damageType + "\n";
}// end toString
// Class MagicWeapon(Magic)
class MagicWeapon : public Weapon {
public :
MagicWeapon();
MagicWeapon(string, int, string, long, int, int, int, int, int, int);
~MagicWeapon();
};// end class MagicWeapon
MagicWeapon::MagicWeapon() {
}// end constructor(MagicWeapon())
MagicWeapon::MagicWeapon(string name, int damage, string type, long value, int strBonus, int conBonus, int dexBonus,
int defenseBonus, int attackBonus, int hpBonus) : Weapon(name, damage, type, value) {
this->strBonus = strBonus;
this->dexBonus = dexBonus;
this->conBonus = conBonus;
this->defenseBonus = defenseBonus;
this->attackBonus = attackBonus;
this->hpBonus = hpBonus;
isMagic = true;
}// end constructor(MagicWeapon)
MagicWeapon::~MagicWeapon() {
}// end destructor(~MagicWeapon)
//*********************************************************************************************
// Potion Class
//
//*********************************************************************************************
class Potion : public Item {
private:
int amountHealed;
public:
Potion(string, int, long);
Potion();
~Potion();
int getAmountHealed() { return amountHealed; }
string toString();
};// end class Potion
Potion::Potion() {
}// end constructor(Potion())
Potion::~Potion() {
}// end destructor(~Potion)
Potion::Potion(string name, int amountHealed, long value) : Item(name, value) {
this->amountHealed = amountHealed;
type = "Potion";
}// end constructor(Potion(string int))
string Potion::toString() {
return "Name: " + name + "\nAmount Healed: " + to_string(amountHealed) + "\n";
}// end toString()
//*********************************************************************************************
// Inventory Class
//
//*********************************************************************************************
class Inventory {
protected:
Potion potions[100];
int potionsIndex;
Armor armors[100];
int armorsIndex;
Weapon weapons[100];
int weaponsIndex;
QuestItem questItems[100];
int questItemsIndex;
public:
Inventory();
~Inventory();
void add(Potion potion) { potions[++potionsIndex] = potion; }
void remove(Potion);
int getPotionsIndex() { return potionsIndex; }
Potion* getPotions() { return potions; }
Potion selectPotion();
void add(Armor armor) { armors[++armorsIndex] = armor; }
int getArmorIndex() { return armorsIndex; }
Armor* getArmor() { return armors; }
void remove(Armor);
Armor selectArmor();
void add(Weapon weapon) { weapons[++weaponsIndex] = weapon; }
int getWeaponsIndex() { return weaponsIndex; }
Weapon* getWeapons() { return weapons; }
void remove(Weapon);
Weapon selectWeapon();
QuestItem* getQuestItems() { return questItems; }
int getQuestItemsIndex() { return questItemsIndex; }
void remove(QuestItem);
void add(QuestItem questItem) { questItems[++questItemsIndex] = questItem; }
void displayInventory();
void displayWeapons();
void displayArmor();
void displayPotions();
};// end class Inventory
Inventory::Inventory() {
potionsIndex = -1;
armorsIndex = -1;
weaponsIndex = -1;
questItemsIndex = -1;
}// end constructor(Inventory())
Inventory::~Inventory() {
}// end destructor(~Inventory())
void Inventory::remove(Potion potion) {
int indexPotionToRemove = -1;
for (int i = 0; i <= potionsIndex; i++) {
if (potions[i].getName() == potion.getName())
indexPotionToRemove = i;
}// end for
if (indexPotionToRemove != potionsIndex) {
for (int i = indexPotionToRemove; i <= potionsIndex; i++) {
potions[i] = potions[i + 1];
}// end for
}// end if
potionsIndex--;
}// end removePotion(Potion)
void Inventory::displayPotions() {
for (int i = 0; i <= potionsIndex; i++) {
cout << "\n" << i + 1 << ".\n" << potions[i].toString();
}// end for
cout << endl;
}// end displayPotions()
Potion Inventory::selectPotion() {
int choice;
cout << "Choose a potion to use:\n";
displayPotions();
choice = getPositiveInt("Enter the number of the potion: ", potionsIndex + 1);
return potions[choice - 1];
}// end selectPotion
void Inventory::displayArmor() {
for (int i = 0; i <= armorsIndex; i++) {
cout << "\n" << i + 1 << ".\n" << armors[i].toString();
}// end for
cout << endl;
}// end displayArmor()
Armor Inventory::selectArmor() {
int choice;
cout << "Select a set of armor:\n";
displayArmor();
choice = getPositiveInt("Enter the number of the set of armor: ", armorsIndex + 1);
return armors[choice - 1];
}// end selectArmor()
void Inventory::remove(Armor armor) {
int indexArmorToRemove = -1;
for (int i = 0; i <= armorsIndex; i++) {
if (armors[i].getName() == armor.getName())
indexArmorToRemove = i;
}// end for
if (indexArmorToRemove != armorsIndex) {
for (int i = indexArmorToRemove; i <= armorsIndex; i++) {
armors[i] = armors[i + 1];
}// end for
}// end if
armorsIndex--;
}// end removeArmor(Armor)
void Inventory::displayWeapons() {
for (int i = 0; i <= weaponsIndex; i++) {
cout << "\n" << i + 1 << ".\n" << weapons[i].toString();
}// end for
cout << endl;
}// end displayWeapons()
Weapon Inventory::selectWeapon() {
int choice;
cout << "Select a weapon:\n";
displayWeapons();
choice = getPositiveInt("Enter the number of the weapon: ", weaponsIndex + 1);
return weapons[choice - 1];
}// end selectWeapon()
void Inventory::remove(Weapon weapon) {
int indexWeaponToRemove = -1;
for (int i = 0; i <= weaponsIndex; i++) {
if (weapons[i].getName() == weapon.getName())
indexWeaponToRemove = i;
}// end for
if (indexWeaponToRemove != weaponsIndex) {
for (int i = indexWeaponToRemove; i <= weaponsIndex; i++) {
weapons[i] = weapons[i + 1];
}// end for
}// end if
weaponsIndex--;
}// end removeWeapon(Weapon)
void Inventory::displayInventory() {
cout << "\nInventory\n\n";
for (int i = 0; i <= armorsIndex; i++) {
cout << armors[i].toString() << endl << endl;
}// end for
for (int i = 0; i <= weaponsIndex; i++) {
cout << weapons[i].toString() << endl << endl;
}// end for
for (int i = 0; i <= potionsIndex; i++) {
cout << potions[i].toString() << endl << endl;
}// end for
for (int i = 0; i <= questItemsIndex; i++) {
cout << questItems[i].toString() << endl << endl;
}// end for
}// end displayInventory()
void Inventory::remove(QuestItem questItem) {
int indexQuestItemToRemove = -1;
for (int i = 0; i <= questItemsIndex; i++) {
if (questItems[i].getName() == questItem.getName())
indexQuestItemToRemove = i;
}// end for
if (indexQuestItemToRemove != questItemsIndex) {
for (int i = indexQuestItemToRemove; i <= questItemsIndex; i++) {
questItems[i] = questItems[i + 1];
}// end for
}// end if
questItemsIndex--;
}// end removeQuestItem(QuestItem)
//******************************************************************************************
// Monster Types (Classes)
//
//******************************************************************************************
// Monster Class
class Monster {
protected :
string race;
int hitPoints;
int maxHitPoints;
int strength;
int dexterity;
int constitution;
int level;
int hitPointMod;
Weapon weapon;
Armor armor;
public :
Monster();
Monster(int, int, int, int, int, Armor armor, Weapon weapon);
~Monster();
int getHitPoints() { return hitPoints; }
int getMaxHitPoints() { return maxHitPoints; }
virtual string getRace() { return race; }
int getAttack() {
return level + getStatMod(getFullStrength()) + getItemsAttackBonus();
}// end getAttack()
int getDefense() {
return 10 + getStatMod(getFullDexterity()) + armor.getDefense() + getItemsDefenseBonus();
}// end getDefense()
int getDexMod() { return dexterity; }
int getStrength() { return strength; }
int getConstitution() { return constitution; }
int getLevel() { return level; }
int getHitPointMod() { return hitPointMod; }
Weapon getWeapon() { return weapon; }
Armor getArmor() { return armor; }
string toString();
void takeDamage(int dmg) { hitPoints -= dmg; }
bool isAlive() { return hitPoints > 0; }
void heal(int);
string getStatus();
int getFullStrength() { return strength + armor.getStrBonus() + weapon.getStrBonus(); }
int getFullConstitution() { return constitution + armor.getConBonus() + weapon.getConBonus(); }
int getFullDexterity() { return dexterity + armor.getDexBonus() + weapon.getDexBonus(); }
int getItemsHitPointBonus() { return weapon.getHpBonus() + armor.getHpBonus(); }
int getItemsDefenseBonus() { return weapon.getDefenseBonus() + armor.getDefenseBonus(); }
int getItemsAttackBonus() { return weapon.getAttackBonus() + armor.getAttackBonus(); }
};// end class Monster
string Monster::getStatus() {
return race + "\nLevel: " + to_string(level) + "\nHit Points: " + to_string(hitPoints);
}// end getStatus()
string Monster::toString() {
return race + "\nHit Points: " + to_string(maxHitPoints) + "\nArmor Class: " +
to_string(getDefense()) + "\nLevel: " + to_string(level) + "\nStrength: " +
to_string(getFullStrength()) + "\nConstitution: " + to_string(getFullConstitution()) +
"\nDexterity: " + to_string(getFullDexterity()) + "\n\nArmor\n" + armor.toString() +
"\n\nWeapon\n" + weapon.toString() + "\n";
}// end toString()
Monster::~Monster() {
}// end destructor(~Monster)
Monster::Monster() {
}// end constructor(Monster)
Monster::Monster(int hitPointMod, int strength, int dexterity, int constitution, int level,
Armor armor, Weapon weapon) {
this->hitPointMod = hitPointMod;
this->strength = strength;
this->dexterity = dexterity;
this->constitution = constitution;
this->level = level;
this->armor = armor;
this->weapon = weapon;
maxHitPoints = hitPointMod + getStatMod(getFullConstitution());
// Generate a random number between 1 and the hitPointMod and add it to the
// monsters hitpoints for every level.
for (int i = 1; i < level; i++) {
maxHitPoints += roll(hitPointMod) + getStatMod(getFullConstitution());
}// end for
maxHitPoints += getItemsHitPointBonus();
hitPoints = maxHitPoints;
}// end constructor(Monster)
void Monster::heal(int health) {
if (hitPoints + health <= maxHitPoints)
hitPoints += health;
else
hitPoints = maxHitPoints;
}// end heal(int)
// Class Goblin
class Goblin : public Monster {
public:
Goblin(int, Armor, Weapon);
};// end class Goblin
Goblin::Goblin(int level, Armor armor, Weapon weapon) : Monster(6, 10, 10, 10, level, armor, weapon) {
race = "Goblin";
}// end constructor(Goblin(int, Armor, Weapon))
//*********************************************************************************************
// Character Races
//
//********************************************************************************************
// Race Base Class
class Race {
protected:
string name;
int strBonus;
int dexBonus;
int conBonus;
int defenseBonus;
int attackBonus;
public:
Race();
~Race();
string getName() { return name; }
int getStrBonus() { return strBonus; }
int getDexBonus() { return dexBonus; }
int getConBonus() { return conBonus; }
int getDefenseBonus() { return defenseBonus; }
int getAttackBonus() { return attackBonus; }
};// end class Race
Race::Race() {
}// end constructor(Race())
Race::~Race() {
}// end destructor(~Race())
// Human
class Human : public Race {
public:
Human();
~Human();
};// end class Human
Human::Human() {
name = "Human";
strBonus = 2;
dexBonus = 0;
conBonus = 2;
defenseBonus = 0;
attackBonus = 0;
}// end constructor(Human())
Human::~Human() {
}// end destructor(~Human())
// Dwarf
class Dwarf : public Race {
public:
Dwarf();
~Dwarf();
};// end class Dwarf
Dwarf::Dwarf() {
name = "Dwarf";
strBonus = 0;
dexBonus = 0;
conBonus = 2;
defenseBonus = 1;
attackBonus = 0;
}// end constructor(Human())
Dwarf::~Dwarf() {
}// end destructor(~Dwarf())
// Half-Orc
class HalfOrc : public Race {
public:
HalfOrc();
~HalfOrc();
};// end class HalfOrc
HalfOrc::HalfOrc() {
name = "Half-Orc";
strBonus = 2;
conBonus = 1;
dexBonus = -2;
defenseBonus = 0;
attackBonus = 1;
}// end constructor(HalfOrc())
HalfOrc::~HalfOrc() {
}// end destructor(~HalfOrc())
// Halfling
class Halfling : public Race {
public:
Halfling();
~Halfling();
};// end class Halfling
Halfling::Halfling() {
name = "Halfling";
strBonus = 0;
conBonus = 0;
dexBonus = 2;
defenseBonus = 0;
attackBonus = 1;
}// end constructor(Halfling())
Halfling::~Halfling() {
}// end destructor(~Halfling())
// Gnome
class Gnome : public Race {
public:
Gnome();
~Gnome();
};// end class Gnome
Gnome::Gnome() {
name = "Gnome";
strBonus = -1;
conBonus = 2;
dexBonus = 2;
defenseBonus = 0;
attackBonus = 0;
}// end constructor(Gnome())
Gnome::~Gnome() {
}// end destructor(~Gnome())
// Drow
class Drow : public Race {
public:
Drow();
~Drow();
};// end class Drow
Drow::Drow() {
name = "Drow";
strBonus = -1;
conBonus = -1;
dexBonus = 2;
defenseBonus = 0;
attackBonus = 1;
}// end constructor(Drow())
Drow::~Drow() {
}// end destructor(~Drow())
// Elf
class Elf : public Race {
public:
Elf();
~Elf();
};// end class Elf
Elf::Elf() {
name = "Elf";
strBonus = -1;
conBonus = -1;
dexBonus = 2;
defenseBonus = 0;
attackBonus = 1;
}// end constructor(Elf())
Elf::~Elf() {
}// end destructor(~Elf())
// Half-Elf
class HalfElf : public Race {
public:
HalfElf();
~HalfElf();
};// end class HalfElf
HalfElf::HalfElf() {
name = "HalfElf";
strBonus = 1;
conBonus = 1;
dexBonus = 1;
defenseBonus = 0;
attackBonus = 0;
}// end constructor(HalfElf())
HalfElf::~HalfElf() {
}// end destructor(~HalfElf())
//**********************************************************************************************
// Reward Class
//
//**********************************************************************************************
class Reward {
protected:
Weapon weapon1;
bool hasWeapon1;
Weapon weapon2;
bool hasWeapon2;
Armor armor1;
bool hasArmor1;
Armor armor2;
bool hasArmor2;
Potion potion;
bool hasPotion;
int numberOfPotions;
int gold;
bool hasRewardBeenGiven;
public:
Reward();
~Reward();
Weapon getWeapon1() { return weapon1; }
Weapon getWeapon2() { return weapon2; }
Armor getArmor1() { return armor1; }
Armor getArmor2() { return armor2; }
Potion getPotion() { return potion; }
bool getHasWeapon1() { return hasWeapon1; }
bool getHasWeapon2() { return hasWeapon2; }
bool getHasArmor1() { return hasArmor1; }
bool getHasArmor2() { return hasArmor2; }
bool getHasPotion() { return hasPotion; }
int getNumberOfPotions() { return numberOfPotions; }
int getGold() { return gold; }
bool getHasRewardBeenGiven() { return hasRewardBeenGiven; }
void setHasRewardBeenGivenTrue() { hasRewardBeenGiven = true; }
void addGold(int gold) { this->gold += gold; }
void removePotion() { hasPotion = false; }
void changePotion(Potion potion) { this->potion = potion; }
void changeArmor1(Armor armor) { armor1 = armor; }
void changeArmor2(Armor armor) { armor2 = armor; }
void changeWeapon1(Weapon weapon) { weapon1 = weapon; }
void changeWeapon2(Weapon weapon) { weapon2 = weapon; }
void removeWeapon1() { hasWeapon1 = false; }
void removeWeapon2() { hasWeapon2 = false; }
void removeArmor1() { hasArmor1 = false; }
void removeArmor2() { hasArmor2 = false; }
void addWeapon(Weapon);
void addArmor(Armor);
void addPotion(Potion);
string toString();
};// end class Reward
Reward::Reward() {
hasArmor1 = false;
hasArmor2 = false;
hasWeapon1 = false;
hasWeapon2 = false;
hasPotion = false;
numberOfPotions = 0;
gold = 0;
hasRewardBeenGiven = false;
}// end constructor(Reward())
Reward::~Reward() {
}// end destructor(~Reward())
void Reward::addWeapon(Weapon weapon) {
if (!hasWeapon1) {
this->weapon1 = weapon;
hasWeapon1 = true;
}// end if
else if (!hasWeapon2) {
this->weapon2 = weapon;
hasWeapon2 = true;
}// end else if
}// end addWeapon(Weapon)
void Reward::addArmor(Armor armor) {
if (!hasArmor1) {
armor1 = armor;
hasArmor1 = true;
}// end if
else if (!hasArmor2) {
armor2 = armor;
hasArmor2 = true;
}// end else if
}// end addArmor(Armor)
void Reward::addPotion(Potion potion) {
if (!hasPotion) {
this->potion = potion;
numberOfPotions++;
hasPotion = true;
}// end if
else if (this->potion.getName() == potion.getName()) {
numberOfPotions++;
}// end else if
}// end addPotion()
string Reward::toString() {
string output;
output += "\nReward:\n\nGold: " + to_string(gold) + "\n\n";
if (hasWeapon1 && hasWeapon2)
output += "Weapon:\n" + weapon1.toString() + "OR\n" + weapon2.toString() + "\n";
else if (hasWeapon1)
output += "Weapon:\n" + weapon1.toString() + "\n";
else if (hasWeapon2)
output += "Weapon:\n" + weapon2.toString() + "\n";
if (hasArmor1 && hasArmor2)
output += "Armor:\n" + armor1.toString() + "OR\n" + armor2.toString() + "\n";
else if (hasArmor1)
output += "Armor:\n" + armor1.toString() + "\n";
else if (hasArmor2)
output += "Armor:\n" + armor2.toString() + "\n";
if (hasPotion)
output += "Number of Potions: " + to_string(numberOfPotions) + "\nPotion:\n" + potion.toString() + "\n";
return output;
}// end toString()
//**********************************************************************************************
// Quest Class
//
//**********************************************************************************************
class Quest {
protected:
bool isQuestKill;
bool isQuestCollect;
string dialogue;
int killNumber;
int killCount;
QuestItem itemToCollect;
int numberOfItemsToCollect;
int itemCount;
Monster monsterToKill;
bool isQuestComplete;
Reward reward;
public:
Quest();
~Quest();
Quest(string, int, Monster&, Reward);
Quest(string, QuestItem, Reward);
Quest(string, int, QuestItem, Reward);
Reward& getReward() { return reward; }
void setIsQuestCompleteTrue() { isQuestComplete = true; }
bool getIsQuestKill() { return isQuestKill; }
bool getIsQuestCollect() { return isQuestCollect; }
string getDialogue() { return dialogue; }
int getKillNumber() { return killNumber; }
int getKillCount() { return killCount; }
bool getIsQuestComplete() { return isQuestComplete; }
QuestItem& getItemToCollect() { return itemToCollect; }
int getItemCount() { return itemCount; }
Monster& getMonsterToKill() { return monsterToKill; }
int getNumberOfItemsToCollect() { return numberOfItemsToCollect; }
void updateKillCount();
void updateItemCount();
void checkMonsterKilled(Monster&);
void checkQuestItem(QuestItem);
};// end class Quest
Quest::Quest() {
isQuestKill = false;
isQuestCollect = false;
isQuestComplete = false;
}// end constructor(Quest())
Quest::~Quest() {
}// end destructor(~Quest())
Quest::Quest(string dialogue, int killNumber, Monster& monsterToKill, Reward reward) {
this->dialogue = dialogue;
this->killNumber = killNumber;
this->monsterToKill = monsterToKill;
this->reward = reward;
isQuestKill = true;
isQuestCollect = false;
killCount = 0;
isQuestComplete = false;
}// end constructor(Quest(string, int, Monster&, Reward))
Quest::Quest(string dialogue, QuestItem itemToCollect, Reward reward) {
this->dialogue = dialogue;
this->itemToCollect = itemToCollect;
this->reward = reward;
numberOfItemsToCollect = 1;
itemCount = 0;
isQuestCollect = true;
isQuestKill = false;
isQuestComplete = false;
}// end constructor(Quest(string, QuestItem, Reward))
Quest::Quest(string dialogue, int numberOfItemsToCollect, QuestItem item, Reward reward) {
this->dialogue = dialogue;
this->numberOfItemsToCollect = numberOfItemsToCollect;
this->reward = reward;
itemToCollect = item;
itemCount = 0;
isQuestComplete = false;
isQuestCollect = true;
isQuestKill = false;
}// end constructor(Quest(string, int, QuestItem, Reward))
void Quest::checkMonsterKilled(Monster& monster) {
if (monster.getRace() == monsterToKill.getRace())
updateKillCount();
}// end checkMonsterKilled(Monster&)
void Quest::checkQuestItem(QuestItem questItem) {
if (questItem.getName() == itemToCollect.getName())
updateItemCount();
}// end checkQuestItem(QuestItem)
void Quest::updateKillCount() {
if (killCount < killNumber)
killCount++;
if (killCount == killNumber)
isQuestComplete = true;
}// end updateKillCount()
void Quest::updateItemCount() {
if (itemCount < numberOfItemsToCollect)
itemCount++;
}// end updateItemCount()
//*************************************************************************************
// Player Classes
//
//*************************************************************************************
class Character {
protected:
string name;
int level;
Armor armor;
Weapon weapon;
long gold;
int hitPoints;
int strength;
int constitution;
int dexterity;
int hitPointMod;
Race race;
//Quest quest;
//bool onQuest;
public:
Character();
~Character();
Character(string, int, int, int, int, int, long, Armor, Weapon, Race);
string getName() { return name; }
int getLevel() { return level; }
Armor getArmor() { return armor; }
Weapon getWeapon() { return weapon; }
long getGold() { return gold; }
int getHitPoints() { return hitPoints; }
int getStrength() { return strength; }
int getDexMod() { return dexterity; }
int getHitPointMod() { return hitPointMod; }
int getItemsHitPointBonus() { return weapon.getHpBonus() + armor.getHpBonus(); }
void takeDamage(int dmg) { hitPoints -= dmg; }
bool isAlive() { return hitPoints > 0; }
void heal(int);
int getAttack();
int getDefense();
int getMaxHitPoints();
int getFullDefenseBonus();
int getFullAttackBonus();
int getFullStrength();
int getFullConstitution();
int getFullDexterity();
string getStatus();
string toString();
};// end class Character
Character::Character() {
}// end constructor(Character())
Character::~Character() {
}// end destructor(~Character())
Character::Character(string name, int hitPointMod, int level, int strength, int constitution, int dexterity,
long gold, Armor armor, Weapon weapon, Race race) {
this->name = name;
this->hitPointMod = hitPointMod;
this->level = level;
this->strength = strength;
this->constitution = constitution;
this->dexterity = dexterity;
this->gold = gold;
this->armor = armor;
this->weapon = weapon;
this->race = race;
hitPoints = ((level * hitPointMod) + (level * getStatMod(getFullConstitution())))
+ getItemsHitPointBonus();
}// end constructor(Character(string))
void Character::heal(int health) {
if (hitPoints + health <= getMaxHitPoints())
hitPoints += health;
else
hitPoints = getMaxHitPoints();
}// end heal(int)
string Character::toString() {
return "Name: " + name + "\nLevel: " + to_string(level) + "\nHit Points: " + to_string(getMaxHitPoints()) +
"\nArmor Class: " + to_string(getDefense()) + "\nStrength: " + to_string(getFullStrength()) +
"\nConstitution: " + to_string(getFullConstitution()) + "\nDexterity: " + to_string(getFullDexterity()) +
"\nGold: " + to_string(gold) + "\n\nArmor\n" + armor.toString() +
"\n\nWeapon\n" + weapon.toString() + "\n";
}// end toString()
string Character::getStatus() {
return "Name: " + name + "\nLevel: " + to_string(level) + "\nHit Points: " + to_string(hitPoints);
}// end getStatus()
int Character::getAttack() {
return level + getStatMod(strength) + getItemsHitPointBonus();
}// end getAttack()
int Character::getDefense() {
return 10 + getStatMod(getFullDexterity()) + armor.getDefense() + getFullDefenseBonus();
}// end getDefense()
int Character::getMaxHitPoints() {
return ((level * hitPointMod) + (level * getStatMod(getFullConstitution())))
+ getItemsHitPointBonus();
}// end getMaxHitPoints()
int Character::getFullStrength() {
return strength + armor.getStrBonus() + weapon.getStrBonus() + race.getStrBonus();
}// end getFullStrength()
int Character::getFullConstitution() {
return constitution + armor.getConBonus() + weapon.getConBonus() + race.getConBonus();
}// end getFullConstitution()
int Character::getFullDexterity() {
return dexterity + armor.getDexBonus() + weapon.getDexBonus() + race.getDexBonus();
}// end getFullDexterity()
int Character::getFullDefenseBonus() {
return weapon.getDefenseBonus() + armor.getDefenseBonus() + race.getDefenseBonus();
}// end getFullDefenseBonus()
int Character::getFullAttackBonus() {
return weapon.getAttackBonus() + armor.getAttackBonus() + race.getAttackBonus();
}// end getFullAttackBonus()
//**********************************************************************************************************
// Player
//
//***********************************************************************************************************
class Player : public Character {
protected:
long experience;
Inventory inventory;
Quest quest1;
Quest quest2;
Quest quest3;
bool hasQuest1;
bool hasQuest2;
bool hasQuest3;
public:
Player();
~Player();
Player(string, int, int, int, int, int, long, Armor, Weapon, Race);
bool getHasQuest1() { return hasQuest1; }
bool getHasQuest2() { return hasQuest2; }
bool getHasQuest3() { return hasQuest3; }
Quest& getQuest1() { return quest1; }
Quest& getQuest2() { return quest2; }
Quest& getQuest3() { return quest3; }
long getExperience() { return experience; }
void gainLevel();
bool hasGainedLevel();
void addExperience(long exp) { experience += exp; }
void setUpExperience();
void checkLevel();
void setArmor(Armor armor) { this->armor = armor; }
void setWeapon(Weapon weapon) { this->weapon = weapon; }
Inventory& getInventory() { return inventory; }
void usePotion(Potion potion) { heal(potion.getAmountHealed()); inventory.remove(potion); }
string toString();
void equipWeapon();
void equipArmor();
void spendGold(long gold);
void gainGold(long gold) { this->gold += gold; }
void addQuest(Quest);
void addToInventory(Weapon weapon) { inventory.add(weapon); }
void addToInventory(Armor armor) { inventory.add(armor); }
void addToInventory(Potion potion) { inventory.add(potion); }
void addToInventory(QuestItem);
void checkMonsterKilled(Monster&);
void checkQuestItemLooted(QuestItem);
bool hasRoomForQuest();
};// end class Player
Player::Player(string name, int hitPointMod, int level, int strength, int constitution, int dexterity, long gold,
Armor armor, Weapon weapon, Race race) : Character(name, hitPointMod, level, strength, constitution,
dexterity, gold, armor, weapon, race) {
setUpExperience();
hasQuest1 = false;
hasQuest2 = false;
hasQuest3 = false;
}// end constructor(Player(string, int, int, int, int, long, Armor, Weapon))
Player::Player() {
}// end constructor(Player)
Player::~Player() {
}// end destructor(~Player)
void Player::setUpExperience() {
experience = level * 1000;
}// end setUpExperience()
bool Player::hasGainedLevel() {
if (experience == (level * 1000) + 1000)
return true;
else
return false;
}// end hasGainedLevel()
void Player::checkLevel() {
if (hasGainedLevel())
gainLevel();
}// end checkLevel()
void Player::gainLevel() {
level++;
heal(hitPointMod + getStatMod(getFullConstitution()));
}// end gainlevel()
string Player::toString() {
return "Name: " + name + "\nLevel: " + to_string(level) + "\nHit Points: " + to_string(getMaxHitPoints()) +
"\nArmor Class: " + to_string(getDefense()) + "\nStrength: " + to_string(getFullStrength()) +
"\nConstitution: " + to_string(getFullConstitution()) + "\nDexterity: " + to_string(getFullDexterity()) +
"\nGold: " + to_string(gold) + "\nExperience: " + to_string(experience) + "\n\nArmor\n" + armor.toString() +
"\n\nWeapon\n" + weapon.toString() + "\n";
}// end toString()
void Player::equipWeapon() {
if (inventory.getWeaponsIndex() > -1) {
Weapon temp1 = this->weapon;
Weapon temp2 = inventory.selectWeapon();
this->weapon = temp2;
inventory.remove(temp2);
inventory.add(temp1);
}// end if
else {
cout << "You do not currently have any weapons in your inventory.\n";
}// end else
}// end equipWeapon(Weapon)
void Player::equipArmor() {
if (inventory.getArmorIndex() > -1) {
Armor temp1 = this->armor;
Armor temp2 = inventory.selectArmor();
this->armor = temp2;
inventory.remove(temp2);
inventory.add(temp1);
}// end if
else {
cout << "You do not currently have any armor in your inventory.\n";
}// end else
}// end equipArmor(Armor)
void Player::spendGold(long gold) {
if (this->gold - gold > 0)
this->gold -= gold;
}// end spendGold(long)
void Player::addQuest(Quest quest) {
if (!hasQuest1 || (quest1.getIsQuestComplete() && quest1.getReward().getHasRewardBeenGiven())) {
quest1 = quest;
hasQuest1 = true;
}// end if
else if (!hasQuest2 || (quest2.getIsQuestComplete() && quest2.getReward().getHasRewardBeenGiven())) {
quest2 = quest;
hasQuest2 = true;
}// end else if
else if (!hasQuest3 || (quest3.getIsQuestComplete() && quest3.getReward().getHasRewardBeenGiven())) {
quest3 = quest;
hasQuest3 = true;
}// end else if
}// end addQuest(Quest)
void Player::addToInventory(QuestItem questItem) {
inventory.add(questItem);
checkQuestItemLooted(questItem);
}// end addToInventory(QuestItem)
void Player::checkMonsterKilled(Monster& monster) {
if (quest1.getIsQuestKill())
quest1.checkMonsterKilled(monster);
if (quest2.getIsQuestKill())
quest2.checkMonsterKilled(monster);
if (quest3.getIsQuestKill())
quest3.checkMonsterKilled(monster);
}// end checkMonsterKilled(Monster&)
void Player::checkQuestItemLooted(QuestItem questItem) {
// add to a loot function later
if (quest1.getIsQuestCollect())
quest1.checkQuestItem(questItem);
if (quest2.getIsQuestCollect())
quest2.checkQuestItem(questItem);
if (quest3.getIsQuestCollect())
quest3.checkQuestItem(questItem);
}// end checkQuestItemLooted(QuestItem)
bool Player::hasRoomForQuest() {
if (!hasQuest1 || (quest1.getIsQuestComplete() && quest1.getReward().getHasRewardBeenGiven()))
return true;
else if (!hasQuest2 || (quest2.getIsQuestComplete() && quest2.getReward().getHasRewardBeenGiven()))
return true;
else if (!hasQuest3 || (quest3.getIsQuestComplete() && quest3.getReward().getHasRewardBeenGiven()))
return true;
else
return false;
}// end hasRoomForQuest()
//*************************************************************************************
// Non-Player Character (NPC)
//
//*************************************************************************************
class NonPlayerCharacter {
protected:
string name;
string dialogue;
public:
~NonPlayerCharacter();
NonPlayerCharacter();
NonPlayerCharacter(string);
NonPlayerCharacter(string, string);
string getName() { return name; }
void greeting(Player);
};// end class NonPlayerCharacter
NonPlayerCharacter::NonPlayerCharacter() {
}// end constructor(NonPlayerCharacter())
NonPlayerCharacter::NonPlayerCharacter(string name) {
this->name = name;
dialogue = " ";
}// end constructor(NonPlayerCharacter(string))
NonPlayerCharacter::~NonPlayerCharacter() {
}// end destructor(~NonPlayerCharacter())
NonPlayerCharacter::NonPlayerCharacter(string name, string dialogue) {
this->name = name;
this->dialogue = dialogue;
}// end constructor(NonPlayerCharacter(string, string))
void NonPlayerCharacter::greeting(Player player) {
if (!(dialogue == " "))
cout << "Hello, " << player.getName() << ". " << dialogue << "\n";
else
cout << "Hello, I am " << name << ". Lovely weather, isn't it?\n";
}// end greeting(Player)
//************************************************************************************
// Quest NPC
//
//************************************************************************************
class QuestNPC : public NonPlayerCharacter {
protected:
Quest quest1;
bool hasQuest1;
bool hasQuest1BeenAccepted;
Quest quest2;
bool hasQuest2;
bool hasQuest2BeenAccepted;
Quest quest3;
bool hasQuest3;
bool hasQuest3BeenAccepted;
public:
QuestNPC();
~QuestNPC();
QuestNPC(string);
Quest& getQuest1() { return quest1; }
void addQuest(Quest);
void triggerQuest(Player&);
void bestowQuest(Quest&, Player&);
bool acceptQuest();
void updateStatus(Player&, Quest&);
void updateQuestStatus(Player&);
void interactWithPC(Player&);
bool removeQuestItems(Player&, Quest&);
void updateAndReward(Player&);
Weapon selectWeapon(Player, Quest);
Armor selectArmor(Player, Quest);
void bestowReward(Player&, Quest&);
};// end class QuestNPC
QuestNPC::QuestNPC() {
hasQuest1 = false;
hasQuest1BeenAccepted = false;
hasQuest2 = false;
hasQuest2BeenAccepted = false;
hasQuest3 = false;
hasQuest3BeenAccepted = false;
}// end constructor(QuestNPC())
QuestNPC::~QuestNPC() {
}// end destructor(~QuestNPC())
QuestNPC::QuestNPC(string dialogue) : NonPlayerCharacter(dialogue) {
hasQuest1 = false;
hasQuest1BeenAccepted = false;
hasQuest2 = false;
hasQuest2BeenAccepted = false;
hasQuest3 = false;
hasQuest3BeenAccepted = false;
}// end constructor(QuestNPC(string))
void QuestNPC::addQuest(Quest quest) {
if (!hasQuest1) {
quest1 = quest;
hasQuest1 = true;
}// end if
else if (!hasQuest2) {
quest2 = quest;
hasQuest2 = true;
}// end else if
else if (!hasQuest3) {
quest3 = quest;
hasQuest3 = true;
}// end else if
}// end addQuest(Quest, Reward)
void QuestNPC::triggerQuest(Player& player) {
if (player.hasRoomForQuest()) {
if (hasQuest1 && !hasQuest1BeenAccepted) {
cout << "\n" << quest1.getDialogue() << "\n";
cout << quest1.getReward().toString() << "\n";
if (acceptQuest()) {
hasQuest1BeenAccepted = true;
bestowQuest(quest1, player);
}// end if
}// end if
else if (hasQuest2 && !hasQuest2BeenAccepted) {
cout << "\n" << quest2.getDialogue() << "\n";
cout << quest2.getReward().toString() << "\n";
if (acceptQuest()) {
hasQuest2BeenAccepted = true;
bestowQuest(quest2, player);
}// end if
}// end else if
else if (hasQuest3 && !hasQuest3BeenAccepted) {
cout << "\n" << quest3.getDialogue() << "\n";
cout << quest3.getReward().toString() << "\n";
if (acceptQuest()) {
hasQuest3BeenAccepted = true;
bestowQuest(quest3, player);
}// end if
}// end else if
}// end if
else {
cout << "\nReturn to me later when you are less busy.\n\n";
}// end else
}// end triggerQuest(Player&)
bool QuestNPC::acceptQuest() {
int choice;
choice = getPositiveInt("Do you accept the quest?\nType 1 for yes and 2 for no.\n", 2);
if (choice == 1)
return true;
else
return false;
}// end acceptQuest()
void QuestNPC::bestowQuest(Quest& quest, Player& player) {
player.addQuest(quest);
}// end bestowQuest(Quest, Player&)
// Remove Quest Items From Player Inventory
bool QuestNPC::removeQuestItems(Player& player, Quest& quest) {
int count = 0;
for (int i = 0; i <= player.getInventory().getQuestItemsIndex(); i++) {
if (quest.getItemToCollect().getName() == player.getInventory().getQuestItems()[i].getName())
count++;
}// end for
if (count == quest.getNumberOfItemsToCollect()) {
for (int i = 0; i < quest.getNumberOfItemsToCollect(); i++) {
player.getInventory().remove(quest.getItemToCollect());
}// end for
return true;
}// end if
else {
return false;
}// end else
}// end removeQuestItems(Player&, Quest&)
void QuestNPC::updateAndReward(Player& player) {
updateQuestStatus(player);
if (player.getQuest1().getIsQuestComplete())
bestowReward(player, player.getQuest1());
if (player.getQuest2().getIsQuestComplete())
bestowReward(player, player.getQuest2());
if (player.getQuest3().getIsQuestComplete())
bestowReward(player, player.getQuest3());
}// end updateAndReward(Player&)
void QuestNPC::updateStatus(Player& player, Quest& quest) {
if (quest.getItemCount() == quest.getNumberOfItemsToCollect()) {
bool questItemsRemoved = removeQuestItems(player, quest);
if (questItemsRemoved)
quest.setIsQuestCompleteTrue();
}// end if
}// end checkQuest1Status(Player)
void QuestNPC::updateQuestStatus(Player& player) {
if (!player.getQuest1().getIsQuestComplete() && player.getQuest1().getIsQuestCollect())
updateStatus(player, player.getQuest1());
if (!player.getQuest2().getIsQuestComplete() && player.getQuest2().getIsQuestCollect())
updateStatus(player, player.getQuest2());
if (!player.getQuest3().getIsQuestComplete() && player.getQuest3().getIsQuestCollect())
updateStatus(player, player.getQuest3());
}// end checkQuestStatus(Player)
Weapon QuestNPC::selectWeapon(Player player, Quest quest) {
string output;
int choice;
output = "Which weapon do you want as a reward?\n\n1.\n" + quest.getReward().getWeapon1().toString() +
"\n2.\n" + quest.getReward().getWeapon2().toString() + "\n";
choice = getPositiveInt(output, 2);
if (choice == 1)
return quest.getReward().getWeapon1();
else
return quest.getReward().getWeapon2();
}// end selectWeapon(Player)
// Assumes that the quest has been completed.
void QuestNPC::bestowReward(Player& player, Quest& quest) {
// Reward Gold
player.gainGold(quest.getReward().getGold());
//Reward weapon
if (quest.getReward().getHasWeapon1() && quest.getReward().getHasWeapon2())
player.getInventory().add(selectWeapon(player, quest));
else if (quest.getReward().getHasWeapon1())
player.getInventory().add(quest.getReward().getWeapon1());
else if (quest.getReward().getHasWeapon2())
player.getInventory().add(quest.getReward().getWeapon2());
// Reward armor
if (quest.getReward().getHasArmor1() && quest.getReward().getHasArmor2())
player.getInventory().add(selectArmor(player, quest));
else if (quest.getReward().getHasArmor1())
player.getInventory().add(quest.getReward().getArmor1());
else if (quest.getReward().getHasArmor2())
player.getInventory().add(quest.getReward().getArmor2());
// Reward potion
if (quest.getReward().getHasPotion()) {
for (int i = 0; i < quest.getReward().getNumberOfPotions(); i++) {
player.getInventory().add(quest.getReward().getPotion());
}// end for
}// end if
quest.getReward().setHasRewardBeenGivenTrue();
}// end bestowReward(Player&)
Armor QuestNPC::selectArmor(Player player, Quest quest) {
string output;
int choice;
output = "Which set of armor do you want as a reward?\n\n1.\n" + quest.getReward().getArmor1().toString() +
"\n2.\n" + quest.getReward().getArmor2().toString() + "\n";
choice = getPositiveInt(output, 2);
if (choice == 1)
return quest.getReward().getArmor1();
else
return quest.getReward().getArmor2();
}// end selectArmor(Player)
void QuestNPC::interactWithPC(Player& player) {
updateAndReward(player);
triggerQuest(player);
}// end interactWithPC(Player&)
//******************************************************************************************
// Merchant Class
//
//******************************************************************************************
class Merchant {
protected:
string name;
Inventory inventory;
double priceMod;
public:
Merchant();
~Merchant();
Merchant(string, Inventory, double);
string getName() { return name; }
Inventory& getInventory() { return inventory; }
double getPriceMod() { return priceMod; }
void greeting(Player&);
void armorMenu(Player&);
void weaponsMenu(Player&);
void potionsMenu(Player&);
void sell(Player&, Armor);
void sell(Player&, Potion);
void sell(Player&, Weapon);
void displayArmor();
void displayWeapons();
void displayPotions();
void menu(Player&);
void buyMenu(Player&);
void buyArmorMenu(Player&);
void buyWeaponsMenu(Player&);
void buyPotionsMenu(Player&);
void displayPlayersArmor(Player&);
void displayPlayersWeapons(Player&);
void displayPlayersPotions(Player&);
void buy(Player& player, Armor armor);
void buy(Player& player, Weapon weapon);
void buy(Player& player, Potion potion);
};// end class Merchant
Merchant::Merchant() {
}// end constructor(Merchant())
Merchant::~Merchant() {
}// end constructor(~Merchant())
Merchant::Merchant(string name, Inventory inventory, double priceMod) {
this->name = name;
this->inventory = inventory;
this->priceMod = priceMod;
}// end constructor(Merchant(string, Inventory))
void Merchant::menu(Player& player) {
int choice = 0;
bool loop = true;
do {
choice = getPositiveInt("Would you like to:\n1. Browse Armor\n2. Browse Weapons\n"
"3. Browse Potions\n4. Sell\n5. Leave\n", 5);
switch (choice) {
case 1:
if (inventory.getArmorIndex() > -1)
armorMenu(player);
else
cout << "\nI am not currently selling any armor. Please check again at a later date.\n\n";
break;
case 2:
if (inventory.getWeaponsIndex() > -1)
weaponsMenu(player);
else
cout << "\nI am not current selling any weapons. Please check again at a later date.\n\n";
break;
case 3:
if (inventory.getPotionsIndex() > -1)
potionsMenu(player);
else
cout << "\nI am not currently selling any potions. Please check again at a later date.\n\n";
break;
case 4:
buyMenu(player);
break;
case 5:
loop = false;
break;
default: break;
}// end switch(choice)
} while (loop);
}// end menu()
void Merchant::greeting(Player& player) {
int choice = 0;
cout << "\nHello, I am Merchant " << name << ".\n\n";
menu(player);
}// end greeting()
// Methods for selling to a player.
void Merchant::armorMenu(Player& player) {
int indexOfArmorChosen = -2;
do {
displayArmor();
cout << "\nGold: " << player.getGold() << "\n";
indexOfArmorChosen = getPositiveIntOrGoBack("Enter the number of the armor that you wish to"
" buy or type -1 to return to the previous menu.\n", inventory.getArmorIndex() + 1);
if (indexOfArmorChosen != -1) {
if (player.getGold() >=
(long)(inventory.getArmor()[indexOfArmorChosen - 1].getValue() * priceMod + 0.43)) {
sell(player, inventory.getArmor()[indexOfArmorChosen - 1]);
}// end if
else {
cout << "\nYou do not have enough gold to purchase the armor.\n\n";
}// end else
}// end if
} while (indexOfArmorChosen != -1 && inventory.getArmorIndex() != -1);
}// end armorMenu(Player&)
void Merchant::displayArmor() {
cout << "\nArmor that I have available for purchase:\n\n";
for (int i = 0; i <= inventory.getArmorIndex(); i++) {
cout << (i + 1) << ".\n" << inventory.getArmor()[i].toString() << "Price: " <<
to_string((long)(inventory.getArmor()[i].getValue() * priceMod + 0.43)) << "\n\n";
}// end for
}// end displayArmor()
void Merchant::sell(Player& player, Armor armor) {
player.spendGold((long)(armor.getValue() * priceMod + 0.43));
player.getInventory().add(armor);
inventory.remove(armor);
cout << endl << armor.getName() << " successfully purchased.\n\n";
}// end sellArmor(Player, Armor)
void Merchant::weaponsMenu(Player& player) {
int indexOfWeaponChosen = -2;
do {
displayWeapons();
cout << "\nGold: " << player.getGold() << "\n";
indexOfWeaponChosen = getPositiveIntOrGoBack("Enter the number of the weapon that you wish to"
" buy or type -1 to return to the previous menu.\n", inventory.getWeaponsIndex() + 1);
if (indexOfWeaponChosen != -1) {
if (player.getGold() >=
(long)(inventory.getWeapons()[indexOfWeaponChosen - 1].getValue() * priceMod + 0.43)) {
sell(player, inventory.getWeapons()[indexOfWeaponChosen - 1]);
}// end if
else {
cout << "\nYou do not have enough gold to purchase the weapon.\n\n";
}// end else
}// end if
} while (indexOfWeaponChosen != -1 && inventory.getWeaponsIndex() != -1);
}// end displayWeapons(Player)
void Merchant::displayWeapons() {
cout << "\nWeapons that I have available for purchase:\n\n";
for (int i = 0; i <= inventory.getWeaponsIndex(); i++) {
cout << (i + 1) << ".\n" << inventory.getWeapons()[i].toString() << "Price: " <<
to_string((long)(inventory.getWeapons()[i].getValue() * priceMod + 0.43)) << "\n\n";
}// end for
}// end displayWeapons()
void Merchant::sell(Player& player, Weapon weapon) {
player.spendGold((long)(weapon.getValue() * priceMod + 0.43));
player.getInventory().add(weapon);
inventory.remove(weapon);
cout << endl << weapon.getName() << " successfully purchased.\n\n";
}// end sellWeapon(Player, Weapon)
void Merchant::potionsMenu(Player& player) {
int indexOfPotionChosen = -2;
do {
displayPotions();
cout << "\nGold: " << player.getGold() << "\n";
indexOfPotionChosen = getPositiveIntOrGoBack("Enter the number of the potion that you wish to"
" buy or type -1 to return to the previous menu.\n", inventory.getPotionsIndex() + 1);
if (indexOfPotionChosen != -1) {
if (player.getGold() >=
(long)(inventory.getPotions()[indexOfPotionChosen - 1].getValue() * priceMod + 0.43)) {
sell(player, inventory.getPotions()[indexOfPotionChosen - 1]);
}// end if
else {
cout << "\nYou do not have enough gold to purchase the potion.\n\n";
}// end else
}// end if
} while (indexOfPotionChosen != -1 && inventory.getPotionsIndex() != -1);
}// end displayPotions(Player)
void Merchant::displayPotions() {
cout << "\nPotions that I have available for purchase:\n\n";
for (int i = 0; i <= inventory.getPotionsIndex(); i++) {
cout << (i + 1) << ".\n" << inventory.getPotions()[i].toString() << "Price: " <<
to_string((long)(inventory.getPotions()[i].getValue() * priceMod + 0.43)) << "\n\n";
}// end for
}// end displayPotions()
void Merchant::sell(Player& player, Potion potion) {
player.spendGold((long)(potion.getValue() * priceMod + 0.43));
player.getInventory().add(potion);
inventory.remove(potion);
cout << endl << potion.getName() << " successfully purchased.\n\n";
}// end sellPotion(Player, Potion)
// Methods for buying from a player.
void Merchant::buyMenu(Player& player) {
int sellChoice = -5;
bool loop = true;
do {
sellChoice = getPositiveInt("\nWould you like to sell\n1. Armor\n2. Weapons"
"\n3. Potions\n4. Return to the previous menu.\n", 4);
switch (sellChoice) {
case 1:
if (player.getInventory().getArmorIndex() > -1)
buyArmorMenu(player);
else
cout << "\n\nYou do not have any armor in your inventory to sell.\n\n";
break;
case 2:
if (player.getInventory().getWeaponsIndex() > -1)
buyWeaponsMenu(player);
else
cout << "\n\nYou do not have any weapons in your inventory to sell.\n\n";
break;
case 3:
if (player.getInventory().getPotionsIndex() > -1)
buyPotionsMenu(player);
else
cout << "\n\nYou do not have any potions in your inventory to sell.\n\n";
break;
case 4:
loop = false;
break;
default: break;
}// end switch(sellChoice)
} while (loop);
}// end buyMenu(Player&)
void Merchant::buyArmorMenu(Player& player) {
int indexOfArmorToBuy = -2;
do {
displayPlayersArmor(player);
cout << "\nGold: " << player.getGold() << "\n";
indexOfArmorToBuy = getPositiveIntOrGoBack("Enter the number of the armor that you wish to sell or"
" type -1 to return to the previous menu.\n", player.getInventory().getArmorIndex() + 1);
if (indexOfArmorToBuy != -1)
buy(player, player.getInventory().getArmor()[indexOfArmorToBuy - 1]);
} while (indexOfArmorToBuy != -1 && player.getInventory().getArmorIndex() > -1);
}// end buyArmorMenu(Player&)
void Merchant::buy(Player& player, Armor armor) {
player.getInventory().remove(armor);
inventory.add(armor);
player.gainGold((long)(((armor.getValue() / 2) * (priceMod + 0.25))));
}// end buyArmor(Player&, Armor)
void Merchant::displayPlayersArmor(Player& player) {
cout << "\nArmor that you have available to sell:\n\n";
for (int i = 0; i <= player.getInventory().getArmorIndex(); i++) {
cout << (i + 1) << ".\n" << player.getInventory().getArmor()[i].toString() << "Price: "<<
to_string((long)((player.getInventory().getArmor()[i].getValue() / 2) * (priceMod + 0.25)))
<< "\n\n";
}// end for
}// end displayPlayersArmor(Player&)
void Merchant::buyWeaponsMenu(Player& player) {
int indexOfWeaponToBuy = -2;
do {
displayPlayersWeapons(player);
cout << "\nGold: " << player.getGold() << "\n";
indexOfWeaponToBuy = getPositiveIntOrGoBack("Enter the number of the weapon that you wish to sell or"
" type -1 to return to the previous menu.\n", player.getInventory().getWeaponsIndex() + 1);
if (indexOfWeaponToBuy != -1)
buy(player, player.getInventory().getWeapons()[indexOfWeaponToBuy - 1]);
} while (indexOfWeaponToBuy != -1 && player.getInventory().getWeaponsIndex() > -1);
}// end buyWeaponsMenu(Player&)
void Merchant::buy(Player& player, Weapon weapon) {
player.getInventory().remove(weapon);
inventory.add(weapon);
player.gainGold((long)(((weapon.getValue() / 2) * (priceMod + 0.25))));
}// end buyWeapon(Player&, Weapon)
void Merchant::displayPlayersWeapons(Player& player) {
cout << "\nWeapons that you have available to sell:\n\n";
for (int i = 0; i <= player.getInventory().getWeaponsIndex(); i++) {
cout << (i + 1) << ".\n" << player.getInventory().getWeapons()[i].toString() << "Price: " <<
to_string((long)((player.getInventory().getWeapons()[i].getValue() / 2) * (priceMod + 0.25)))
<< "\n\n";
}// end for
}// end displayPlayersWeapons(Player&)
void Merchant::buyPotionsMenu(Player& player) {
int indexOfPotionToBuy = -2;
do {
displayPlayersPotions(player);
cout << "\nGold: " << player.getGold() << "\n";
indexOfPotionToBuy = getPositiveIntOrGoBack("Enter the number of the potion that you wish to sell or"
" type -1 to return to the previous menu.\n", player.getInventory().getPotionsIndex() + 1);
if (indexOfPotionToBuy != -1)
buy(player, player.getInventory().getPotions()[indexOfPotionToBuy - 1]);
} while (indexOfPotionToBuy != -1 && player.getInventory().getPotionsIndex() > -1);
}// end buyPotionsMenu(Player&)
void Merchant::buy(Player& player, Potion potion) {
player.getInventory().remove(potion);
inventory.add(potion);
player.gainGold((long)(((potion.getValue() / 2) * (priceMod + 0.25))));
}// end buyPotion(Player&, Potion)
void Merchant::displayPlayersPotions(Player& player) {
cout << "\nPotions that you have available to sell:\n\n";
for (int i = 0; i <= player.getInventory().getPotionsIndex(); i++) {
cout << (i + 1) << ".\n" << player.getInventory().getPotions()[i].toString() << "Price: " <<
to_string((long)((player.getInventory().getPotions()[i].getValue() / 2) *(priceMod + 0.25)))
<< "\n\n";
}// end for
}// end displayPlayersPotions(Player&)
//*************************************************************************************
// Functions
//
//*************************************************************************************
// Generate Weapon Function
void fillWeaponArray(Weapon weaponry[], int& weaponryIndex) {
weaponry[++weaponryIndex] = Weapon("Khatar", 4, "Martial", 10);
weaponry[++weaponryIndex] = Weapon("Dagger", 4, "Piercing", 15);
weaponry[++weaponryIndex] = Weapon("Short Sword", 6, "Slashing", 25);
weaponry[++weaponryIndex] = Weapon("Long Sword", 8, "Slashing", 35);
}// end Function(fillWeaponArray(Weapon[], int&))
// Generate Armor Function
void fillArmorArray(Armor armory[], int& armoryIndex) {
armory[++armoryIndex] = Armor("Cloth Shirt", 0, "Cloth", 2);
armory[++armoryIndex] = Armor("Padded Armor", 1, "Cloth", 20);
armory[++armoryIndex] = Armor("Hide Armor", 2, "Leather", 30);
armory[++armoryIndex] = Armor("Studded Hide Armor", 3, "Leather", 55);
armory[++armoryIndex] = Armor("Ring Mail", 4, "Chain", 85);
armory[++armoryIndex] = Armor("Chain Mail", 4, "Chain", 65);
armory[++armoryIndex] = Armor("Scale Mail", 5, "Plate", 75);
armory[++armoryIndex] = Armor("Banded Mail", 5, "Plate", 55);
armory[++armoryIndex] = Armor("Plate Mail", 6, "Plate", 105);
}// end Function(fillArmorArray(Armor[], int&))
// Generate Potions Function
void fillPotionsArray(Potion potions[], int& potionsIndex) {
potions[++potionsIndex] = Potion("Potion of Minor Healing", 4, 15);
potions[++potionsIndex] = Potion("Potion of Lesser Healing", 8, 30);
}// end Function(fillPotionsArray(Potion[], int&))
//****************************************************************************************
// Battle Functions
//
//****************************************************************************************
// Player Attacks a Monster
void attack(Player& player, Monster& monster) {
if ((roll(20) + player.getAttack()) >= monster.getDefense())
monster.takeDamage(roll(player.getWeapon().getDamage()) + getStatMod(player.getFullStrength()));
}//end attack(Player&, Monster&)
void attack(Player& player, Monster& monster1, Monster& monster2) {
int npcToAttack;
if (monster1.isAlive() && monster2.isAlive()) {
cout << "Do you wish to attack...\n1. " << monster1.getStatus() <<
"\n\n2. " << monster2.getStatus() << endl;
npcToAttack = getPositiveInt("", 2);
if (npcToAttack == 1)
attack(player, monster1);
else
attack(player, monster2);
}// end if
else if (monster1.isAlive()) {
attack(player, monster1);
}// end else if
else {
attack(player, monster2);
}// end else
}// end attack(Player, Monster, Monster)
// Monster attacks a player.
void attack(Monster& monster, Player& player) {
if ((roll(20) + monster.getAttack()) >= player.getDefense())
player.takeDamage(roll(monster.getWeapon().getDamage()) + getStatMod(monster.getFullStrength()));
}// end attack(Monster&, Player&)
// battle switch
void battleSwitch(Player& player, Monster& monster, bool& run) {
int choice;
bool loop = true;
int result = 0;
do {
choice = getPositiveInt("Choose an option.\n\n1. Attack\n2. Drink a potion\n3. Run\n", 3);
switch (choice) {
case 1: attack(player, monster); loop = false; break;
case 2: if (player.getInventory().getPotionsIndex() >= 0) {
player.usePotion(player.getInventory().selectPotion());
loop = false;
}// end if
else {
cout << "You do not have any potions.\n";
}// end else
break;
case 3: result = roll(10);
if (result < 9) { run = true; }
loop = false;
break;
default: loop = false; break;
}// end switch
} while (loop);
}// end battleSwitch(Player&, Monster&)
void battleSwitch(Player& player, Monster& monster1, Monster& monster2, bool& run) {
int choice;
bool loop = true;
int result = 0;
do {
choice = getPositiveInt("Choose an option.\n\n1. Attack\n2. Drink a potion\n3. Run\n", 3);
switch (choice) {
case 1:
if (monster1.isAlive() && monster2.isAlive()) {
attack(player, monster1, monster2);
}// end if
else if (monster1.isAlive()) {
attack(player, monster1);
}// end else if
else {
attack(player, monster2);
}// end else
loop = false; break;
case 2:
if (player.getInventory().getPotionsIndex() >= 0) {
player.usePotion(player.getInventory().selectPotion());
loop = false;
}// end if
else {
cout << "You do not have any potions.\n";
}// end else
break;
case 3: result = roll(10);
if (result < 9) { run = true; }
loop = false;
break;
default: loop = false; break;
}// end switch
} while (loop);
}// end battleSwitch(Player&, Monster&, Monster&)
// Fight until the death.
void battle(Player& player, Monster& monster1, Monster& monster2) {
bool run = false;
do {
battleSwitch(player, monster1, monster2, run);
if (monster1.isAlive() && player.isAlive() && !run) attack(monster1, player);
if (monster2.isAlive() && player.isAlive() && !run) attack(monster2, player);
cout << player.getStatus() << endl << endl;
cout << monster1.getStatus() << endl << endl;
cout << monster2.getStatus() << endl << endl;
} while ( (player.isAlive() && (monster1.isAlive() || monster2.isAlive()) ) && !run);
if (run) cout << "You were sucessful in your attempt to run.\n\n";
}// end battle(Player&, Monster&, Monster&)
void battle(Player& player, Monster& monster) {
bool run = false;
do {
battleSwitch(player, monster, run);
if (monster.isAlive() && !run) attack(monster, player);
cout << player.getStatus() << endl << endl;
cout << monster.getStatus() << endl << endl;
} while ((player.isAlive() && monster.isAlive()) && !run);
if (run) cout << "You were sucessful in your attempt to run.\n\n";
}// end battle(Player&, Monster&)
string btos(bool value) {
return value ? "true" : "false";
}// end btos(bool)
//************************************************************************************
// Main
//
//************************************************************************************
int main()
{
//*********************************************************************
// TESTING
//
//*********************************************************************
// Test fillArmorArray
Armor armory[25];
int armorArrayIndex = -1;
int& armoryIndex = armorArrayIndex;
fillArmorArray(armory, armoryIndex);
//for (int i = 0; i <= armoryIndex; i++) {
// cout << armory[i].toString();
//}// end for
//cout << endl;
// Test fillWeaponArray
Weapon weaponry[25];
int weaponryArrayIndex = -1;
int& weaponryIndex = weaponryArrayIndex;
fillWeaponArray(weaponry, weaponryIndex);
//for (int i = 0; i <= weaponryIndex; i++ ) {
// cout << weaponry[i].toString();
//}// end for
//cout << endl;
// Test fillPotionsArray
Potion potions[15];
int potionsArrayIndex = -1;
int& potionsIndex = potionsArrayIndex;
fillPotionsArray(potions, potionsIndex);
//for (int i = 0; i <= potionsIndex; i++) {
// cout << potions[i].toString();
//}// end for
//cout << endl;
// Test Races
Human h1 = Human();
HalfOrc h2 = HalfOrc();
Halfling h3 = Halfling();
Gnome gn1 = Gnome();
Elf e1 = Elf();
HalfElf h4 = HalfElf();
Dwarf d1 = Dwarf();
Drow d2 = Drow();
// Test Player
Player p1("Ndayin", 10, 3, 15, 15, 15, 300, armory[4], weaponry[3], d1);
Player p2("Talin", 10, 3, 15, 15, 15, 100, armory[6], weaponry[3], d2);
// Test Monster
Goblin g1(3, armory[0], weaponry[0]);
Goblin g2(3, armory[0], weaponry[0]);
// Test add potions to player inventory
p1.getInventory().add(potions[0]);
p1.getInventory().add(potions[0]);
p1.getInventory().add(potions[1]);
p1.getInventory().add(potions[1]);
p2.getInventory().add(potions[0]);
p2.getInventory().add(potions[0]);
p2.getInventory().add(potions[0]);
p2.getInventory().add(potions[1]);
p2.getInventory().add(potions[1]);
// Test adding weapons and armor to player inventory
p1.getInventory().add(armory[0]);
p1.getInventory().add(armory[0]);
p1.getInventory().add(armory[0]);
p1.getInventory().add(armory[7]);
p1.getInventory().add(weaponry[0]);
p1.getInventory().add(weaponry[0]);
p1.getInventory().add(weaponry[3]);
// Test Player.equipArmor()
//p1.equipArmor();
//p1.getInventory().displayInventory();
// Test Player.equipWeapon()
//p1.equipWeapon();
//p1.getInventory().displayInventory();
// Test Battle 1
//cout << p1.toString() << endl << endl << endl << endl;
//cout << g1.toString() << endl << endl << endl << endl;
//battle(p1, g1);
// Test Battle 2
//cout << p2.toString() << endl << endl << endl << endl;
//cout << g2.toString() << endl << endl << endl << endl;
//battle(p2, g1, g2);
// Inventory
Inventory i1 = Inventory();
i1.add(armory[1]);
i1.add(armory[2]);
i1.add(armory[3]);
i1.add(armory[4]);
i1.add(armory[5]);
i1.add(armory[6]);
i1.add(armory[7]);
i1.add(armory[8]);
i1.add(weaponry[0]);
i1.add(weaponry[1]);
i1.add(weaponry[2]);
i1.add(weaponry[3]);
i1.add(potions[0]);
i1.add(potions[0]);
i1.add(potions[0]);
i1.add(potions[0]);
i1.add(potions[1]);
i1.add(potions[1]);
i1.add(potions[1]);
i1.add(potions[1]);
// Test Merchant
//Merchant m1 = Merchant("Tekram", i1, 1.08);
//m1.greeting(p1);
//p1.getInventory().displayInventory();
// Test Reward
Reward r1 = Reward();
r1.addPotion(potions[0]);
r1.addPotion(potions[0]);
r1.addPotion(potions[0]);
r1.addPotion(potions[0]);
r1.addPotion(potions[0]);
r1.addArmor(armory[1]);
r1.addArmor(armory[2]);
r1.addWeapon(weaponry[1]);
r1.addWeapon(weaponry[0]);
// Test Reward.bestowReward()
//p1.getInventory().displayInventory();
//r1.bestowReward(p1);
//p1.getInventory().displayInventory();
//cout<<r1.toString();
// QuestItem
QuestItem qI1 = QuestItem("Amulet of Undead Turning");
//p1.getInventory().add(qI1);
// Test Quest
Quest q1 = Quest("Testing Quest Class 1", 10, g1, r1);
//cout << "\n" << q1.getKillCount();
//cout << q1.getIsQuestComplete() << "\n";
Quest q2 = Quest("Testing Quest Class 2", 1, qI1, r1);
//q2.updateCollectMissionStatus(qI1);
//q2.updateCollectMissionStatus(qI);
//cout << q2.getItemCount() << "\n";
//cout << q2.getIsQuestComplete() << "\n";
// Test Quest NPC
QuestNPC qNPC1 = QuestNPC("The local population has suffered long enough from the goblin bandits.");
qNPC1.addQuest(q1);
qNPC1.addQuest(q2);
qNPC1.interactWithPC(p1);
//cout << btos(p1.getQuest1().getIsQuestCollect()) << endl << endl;
p1.checkMonsterKilled(g1);
p1.checkMonsterKilled(g1);
p1.checkMonsterKilled(g1);
p1.checkMonsterKilled(g1);
p1.checkMonsterKilled(g1);
p1.checkMonsterKilled(g1);
p1.checkMonsterKilled(g1);
p1.checkMonsterKilled(g1);
p1.checkMonsterKilled(g1);
p1.checkMonsterKilled(g1);
//cout << p1.getQuest1().getKillCount() << "\n\n";
//qNPC1.bestowReward(p1, qNPC1.getQuest1());
//cout << btos(p1.getQuest1().getIsQuestComplete()) << endl;
//cout << btos(p1.getHasQuest2()) << endl << endl;
qNPC1.interactWithPC(p1);
p1.addToInventory(qI1);
//cout << btos(p1.getHasQuest2()) << endl;
//p1.getInventory().displayInventory();A
//p1.getInventory().displayInventory();
qNPC1.interactWithPC(p1);
cout << btos(p1.getQuest1().getReward().getHasRewardBeenGiven()) << endl;
//cout << btos(p1.getQuest2().getReward().getHasRewardBeenGiven()) << endl;
system("PAUSE");
return 0;
}// end main
@azrakreborn
Copy link
Author

Updated 1/4/2016 at 11:23pm *** Quest System in progress

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment