Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
7.3 kB
4
Indexable
Never
#include <iostream>

class Ability {

	std::string mName;
	std::string mResourceUsed;
	uint16_t mResourceCost;
	uint16_t mDamageDone;
	uint16_t mHealingDone;

public:

	Ability(std::string mName, const std::string& mResourceUsed, uint16_t mResourceCost, uint16_t mHealingDone, uint16_t mDamageDone) {

		this -> mName = mName;
		this -> mResourceUsed = mResourceUsed;
		this->mResourceCost = mResourceCost;
		this->mHealingDone = mHealingDone;
		this->mDamageDone = mDamageDone;

	}

	std::string getName() const {

		return this -> mName;

	}

	std::string getResourceUsed() const {

		return this->mResourceUsed;

	}

	uint16_t getResourceCost() const {

		return this->mResourceCost;

	}

	uint16_t getHealingDone() const {

		return this->mHealingDone;

	}

	uint16_t getDamageDone() const {

		return this->mDamageDone;

	}


};

class Character {

protected:

	std::string mName;
	uint16_t mMaxHitPoints;
	uint16_t mHitPoints;
	uint8_t mFaction;
	uint16_t Resources;

public:


	Character(const std::string& mName, uint16_t mMaxHitPoints, uint8_t mFaction) {

		this->mName = mName;
		this->mMaxHitPoints = mMaxHitPoints;
		this->mHitPoints = mMaxHitPoints;
		this->mFaction = mFaction;

	}

	std::string getName() const {

		return this->mName;

	}

	uint16_t getMaxHitPoints() const {

		return this->mMaxHitPoints;

	}

	uint16_t getHitPoints() const {

		return this->mHitPoints;

	}

	uint8_t getFaction() const {

		return this->mFaction;

	}

	uint16_t getResources() const {

		return this->Resources;

	}


	virtual void useAbility(const Ability& ability, Character* target) const = 0;


	bool isDead() const {

		if (this->getHitPoints() == 0) {

			return true;

		}

		return false;

	}

	virtual void revive() {

		this->mHitPoints = mMaxHitPoints;

	}

	void operator +=(int32_t mHitPoints) {

		this->mHitPoints += mHitPoints;

	}

	void operator -=(int32_t mHitPoints) {

		this->mHitPoints -= mHitPoints;

	}

	void setHitPoints(int32_t mHitPoints) {

		this->mHitPoints = mHitPoints;

	}


};


class Tank : Character {

private:

	uint16_t mRage;
	uint16_t mMaxRage;

public:

	Tank(const std::string& mName, uint16_t mMaxHitPoints, uint8_t mFaction, uint16_t mMaxRage) : Character(mName, mMaxHitPoints, mFaction) {

		this->mRage = mMaxRage;
		this->mMaxRage = mMaxRage;

	}

    virtual void useAbility(const Ability& ability, Character* target) const override {

		if (ability.getResourceCost() <= this->getResources()) {

			if (this->getFaction() == target->getFaction()) {

				target += ability.getHealingDone();

				if (target->getHitPoints() > target->getMaxHitPoints()) {

					target->setHitPoints(target->getMaxHitPoints());

				}

				std::cout << this->mName << " casts " << ability.getName() << " on " << target->getName() << " and deals " << ability.getHealingDone() << " healing.\n";

			}
			else {

				if (target->getHitPoints() != 0) {

					target-= ability.getDamageDone();

					if (target->getHitPoints() < 0) {

						target->setHitPoints( 0 );


					}
					if (target->getHitPoints() == 0) {

						std::cout << target->getName() << "dies!\n";

					}

					std::cout << this->mName << " casts " << ability.getName() << " on " << target->getName() << " and deals " << ability.getDamageDone() << " damage.\n";

				}
				else {

					std::cout << this->mName << " fails to cast " << ability.getName() << " on " << target->getName() << ". Target is dead.\n ";

				}


			}

		}
		else {

			std::cout << this->mName << " fails to cast " << ability.getName() << " on " << target->getName() << ".\n";

		}


	}

	virtual void revive() {

		this->mRage = mMaxRage;

	}

};

class Healer : Character {

private:

	uint16_t mMana;
	uint16_t mMaxMana;

public:

	Healer(const std::string& mName, uint16_t mMaxHitPoints, uint8_t mFaction, uint16_t mMaxMana) : Character(mName, mMaxHitPoints, mFaction) {

		this->mMana = mMaxMana;
		this->mMaxMana = mMaxMana;

	}

	virtual void useAbility(const Ability& ability, Character* target) const override {

		if (ability.getResourceCost() <= this->getResources()) {

			if (this->getFaction() == target->getFaction()) {

				target += ability.getHealingDone();

				if (target->getHitPoints() > target->getMaxHitPoints()) {

					target->setHitPoints(target->getMaxHitPoints());

				}

				std::cout << this->mName << " casts " << ability.getName() << " on " << target->getName() << " and deals " << ability.getHealingDone() << " healing.\n";

			}
			else {

				if (target->getHitPoints() != 0) {

					target -= ability.getDamageDone();

					if (target->getHitPoints() < 0) {

						target->setHitPoints(0);


					}
					if (target->getHitPoints() == 0) {

						std::cout << target->getName() << "dies!\n";

					}

					std::cout << this->mName << " casts " << ability.getName() << " on " << target->getName() << " and deals " << ability.getDamageDone() << " damage.\n";

				}
				else {

					std::cout << this->mName << " fails to cast " << ability.getName() << " on " << target->getName() << ". Target is dead.\n ";

				}


			}

		}
		else {

			std::cout << this->mName << " fails to cast " << ability.getName() << " on " << target->getName() << ".\n";

		}


	}

	void revive() {

		this->mMana = mMaxMana;

	}


};

class DamageDealer : Character {

private:

	uint16_t mEnergy;
	uint16_t mMaxEnergy;
	

public:

	DamageDealer(const std::string& mName, uint16_t mMaxHitPoints, uint8_t mFaction, uint16_t mMaxEnergy) : Character(mName, mMaxHitPoints, mFaction) {

		this->mEnergy = mMaxEnergy;
		this->mMaxEnergy = mMaxEnergy;

	}

	virtual void useAbility(const Ability& ability, Character* target) const override {

		if (ability.getResourceCost() <= this->getResources()) {

			if (this->getFaction() == target->getFaction()) {

				target += ability.getHealingDone();

				if (target->getHitPoints() > target->getMaxHitPoints()) {

					target->setHitPoints(target->getMaxHitPoints());

				}

				std::cout << this->mName << " casts " << ability.getName() << " on " << target->getName() << " and deals " << ability.getHealingDone() << " healing.\n";

			}
			else {

				if (target->getHitPoints() != 0) {

					target -= ability.getDamageDone();

					if (target->getHitPoints() < 0) {

						target->setHitPoints(0);


					}
					if (target->getHitPoints() == 0) {

						std::cout << target->getName() << "dies!\n";

					}

					std::cout << this->mName << " casts " << ability.getName() << " on " << target->getName() << " and deals " << ability.getDamageDone() << " damage.\n";

				}
				else {

					std::cout << this->mName << " fails to cast " << ability.getName() << " on " << target->getName() << ". Target is dead.\n ";

				}


			}

		}
		else {

			std::cout << this->mName << " fails to cast " << ability.getName() << " on " << target->getName() << ".\n";

		}


	}

	void revive() {

		this->mEnergy = mMaxEnergy;

	}


};


int main()
{


}