| @ -0,0 +1,24 @@ | |||
| CC = g++ | |||
| UserInterface.o: lib/UserInterface.cpp lib/UserInterface.hpp | |||
| g++ -c lib/UserInterface.cpp -o UserInterface.o | |||
| BattleInterface.o: lib/BattleInterface.cpp lib/BattleInterface.hpp | |||
| g++ -c lib/BattleInterface.cpp -o BattleInterface.o | |||
| Spell.o: lib/Spell.cpp lib/Spell.hpp | |||
| g++ -c lib/Spell.cpp -o Spell.o | |||
| Character.o: lib/Character.cpp lib/Character.hpp | |||
| g++ -c lib/Character.cpp -o Character.o | |||
| main: Spell.o Character.o UserInterface.o main.cpp | |||
| g++ main.cpp -o main Spell.o Character.o UserInterface.o | |||
| clean: Spell.o Character.o UserInterface.o | |||
| rm Spell.o Character.o UserInterface.o | |||
| striped: Spell.o Character.o main.cpp | |||
| g++ -s main.cpp -o main Spell.o Character.o UserInterface.o | |||
| all: Spell.o Character.o main | |||
| @ -0,0 +1 @@ | |||
| slashroot{dummy} | |||
| @ -0,0 +1,29 @@ | |||
| #ifndef SPELL_WARZ_BATTLEINTERFACE_HPP | |||
| #define SPELL_WARZ_BATTLEINTERFACE_HPP 1 | |||
| #include <iostream> | |||
| #include <thread> | |||
| #include <chrono> | |||
| #include "Character.hpp" | |||
| #include "Spell.hpp" | |||
| #include "UserInterface.hpp" | |||
| class BattleInterface | |||
| { | |||
| protected: | |||
| static const int maxTurn = 100; | |||
| static int turn; | |||
| Character *player1; | |||
| Character *player2; | |||
| public: | |||
| void battleStartAnnounce(); | |||
| void battleEndAnnouce(); | |||
| void start(); | |||
| Character *getWinner(); | |||
| }; | |||
| #endif | |||
| @ -0,0 +1,147 @@ | |||
| #include "Character.hpp" | |||
| #include <cstring> | |||
| Character::Character(char *n, int l, int e, int h, int m, int a, int d) | |||
| { | |||
| strcpy(this->name, n); | |||
| this->level = l; | |||
| this->experience = e; | |||
| this->maxHP = h; | |||
| this->curHP = maxHP; | |||
| this->maxMP = m; | |||
| this->curMP = maxMP; | |||
| this->atk = a; | |||
| this->def = d; | |||
| } | |||
| char *Character::getName() | |||
| { | |||
| return this->name; | |||
| } | |||
| int Character::getLevel() | |||
| { | |||
| return this->level; | |||
| } | |||
| int Character::getExperience() | |||
| { | |||
| return this->experience; | |||
| } | |||
| int Character::getMaxHP() | |||
| { | |||
| return this->maxHP; | |||
| } | |||
| int Character::getCurHP() | |||
| { | |||
| return this->curHP; | |||
| } | |||
| int Character::getMaxMP() | |||
| { | |||
| return this->maxMP; | |||
| } | |||
| int Character::getCurMP() | |||
| { | |||
| return this->curMP; | |||
| } | |||
| int Character::getAtk() | |||
| { | |||
| return this->atk; | |||
| } | |||
| int Character::getDef() | |||
| { | |||
| return this->def; | |||
| } | |||
| void Character::levelUp() | |||
| { | |||
| if ((this->level <= maxLevel) && this->readytoLevelUp()) | |||
| { | |||
| this->level++; | |||
| this->maxHP += 10; | |||
| this->maxMP += 5; | |||
| } | |||
| this->curHP = this->maxHP; | |||
| this->curMP = this->maxMP; | |||
| } | |||
| void Character::restoreHP(int n) | |||
| { | |||
| this->curHP += n; | |||
| if (this->curHP > this->maxHP) | |||
| { | |||
| this->curHP = this->maxHP; | |||
| } | |||
| } | |||
| void Character::restoreMP(int n) | |||
| { | |||
| this->curMP += n; | |||
| if (this->curMP > this->maxMP) | |||
| { | |||
| this->curMP = this->maxMP; | |||
| } | |||
| } | |||
| void Character::reduceHP(int n) | |||
| { | |||
| this->curHP -= n; | |||
| } | |||
| void Character::reduceMP(int n) | |||
| { | |||
| this->curMP -= n; | |||
| } | |||
| bool Character::isAlive() | |||
| { | |||
| return this->curHP > 0; | |||
| } | |||
| int Character::toNextLevel() | |||
| { | |||
| return (this->level <= maxLevel) ? ((this->level + 1) * (this->level + 1)) - this->getExperience() : 999999; | |||
| } | |||
| bool Character::readytoLevelUp() | |||
| { | |||
| return (this->toNextLevel() <= 0); | |||
| } | |||
| void Character::increaseExperience(int n) | |||
| { | |||
| this->experience += n; | |||
| if (this->experience > maxEperience) | |||
| { | |||
| this->experience = maxEperience; | |||
| } | |||
| } | |||
| bool Character::canCastSpell(Spell *s) | |||
| { | |||
| return this->curMP >= s->getCost(); | |||
| } | |||
| void Character::castSpell(Spell *s, Character *t) | |||
| { | |||
| this->reduceMP(s->getCost()); | |||
| t->reduceHP(s->getAmount()); | |||
| } | |||
| void Character::rest() | |||
| { | |||
| this->curHP = this->maxHP; | |||
| this->curMP = this->maxMP; | |||
| } | |||
| void Character::suicide() | |||
| { | |||
| this->curHP = 0; | |||
| } | |||
| @ -0,0 +1,54 @@ | |||
| #ifndef SPELL_WARZ_CHARACTER_HPP | |||
| #define SPELL_WARZ_CHARACTER_HPP 1 | |||
| #include <vector> | |||
| #include "Spell.hpp" | |||
| class Character | |||
| { | |||
| protected: | |||
| static const int maxLevel = 100; | |||
| static const int maxEperience = 999999999; | |||
| char name[16]; | |||
| int level; | |||
| int experience; | |||
| int maxHP; | |||
| int curHP; | |||
| int maxMP; | |||
| int curMP; | |||
| int atk; | |||
| int def; | |||
| void restoreHP(int); | |||
| void restoreMP(int); | |||
| void reduceHP(int); | |||
| void reduceMP(int); | |||
| public: | |||
| Character(char *, int, int, int, int, int, int); | |||
| void castSpell(Spell *, Character *); | |||
| bool canCastSpell(Spell *); | |||
| char *getName(); | |||
| int getLevel(); | |||
| int getExperience(); | |||
| int getMaxHP(); | |||
| int getCurHP(); | |||
| int getMaxMP(); | |||
| int getCurMP(); | |||
| int getAtk(); | |||
| int getDef(); | |||
| int toNextLevel(); | |||
| bool readytoLevelUp(); | |||
| bool isAlive(); | |||
| void levelUp(); | |||
| void suicide(); | |||
| void rest(); | |||
| void increaseExperience(int n); | |||
| }; | |||
| #endif | |||
| @ -0,0 +1,42 @@ | |||
| #include "Spell.hpp" | |||
| Spell::Spell(std::string n, int t, int a, int c) | |||
| { | |||
| this->name = std::string(n); | |||
| this->type = t; | |||
| this->amount = a; | |||
| this->cost = c; | |||
| } | |||
| int Spell::getType() | |||
| { | |||
| return this->type; | |||
| } | |||
| int Spell::getAmount() | |||
| { | |||
| return this->amount; | |||
| } | |||
| int Spell::getCost() | |||
| { | |||
| return this->cost; | |||
| } | |||
| std::string Spell::getName() | |||
| { | |||
| return this->name; | |||
| } | |||
| std::vector<Spell *> Spell::Book = { | |||
| new Spell("Napalm Beat", 1, 4, 1), | |||
| new Spell("Fire Ball", 1, 6, 2), | |||
| new Spell("Cold Bolt", 1, 8, 3), | |||
| new Spell("Stone curse", 1, 10, 4), | |||
| new Spell("Lightning Bolt", 1, 12, 5), | |||
| new Spell("Soul Strike", 1, 14, 6), | |||
| new Spell("Fire Wall", 1, 16, 7), | |||
| new Spell("Frost Diver", 1, 18, 8), | |||
| new Spell("Lighting Storm", 1, 20, 9), | |||
| new Spell("Asura's Strike", 1, 50, 10), | |||
| }; | |||
| @ -0,0 +1,28 @@ | |||
| #ifndef SPELL_WARZ_SPELL_CPP | |||
| #define SPELL_WARZ_SPELL_CPP 1 | |||
| #include <vector> | |||
| #include <string> | |||
| class Spell | |||
| { | |||
| protected: | |||
| std::string name; | |||
| int type; | |||
| int amount; | |||
| int cost; | |||
| public: | |||
| int TYPE_RESTORATION = 0; | |||
| int TYPE_DESTRUCTION = 1; | |||
| static std::vector<Spell *> Book; | |||
| Spell(std::string, int, int, int); | |||
| int getType(); | |||
| int getAmount(); | |||
| int getCost(); | |||
| std::string getName(); | |||
| }; | |||
| #endif | |||
| @ -0,0 +1,194 @@ | |||
| #include "UserInterface.hpp" | |||
| const int UserInterface::interval = 1000; // in ms | |||
| const int UserInterface::miniInterval = 50; // in ms | |||
| const int UserInterface::maxDay = 28; | |||
| const int UserInterface::maxMonth = 4; | |||
| const int UserInterface::maxYear = 100; | |||
| int UserInterface::day = 1; | |||
| int UserInterface::month = 1; | |||
| int UserInterface::year = 90; | |||
| bool UserInterface::gameOver = false; | |||
| std::vector<std::string> UserInterface::dayName = { | |||
| "Morndas", | |||
| "Tirdas", | |||
| "Middas", | |||
| "Turdas", | |||
| "Fredas", | |||
| "Loredas", | |||
| "Sundas", | |||
| }; | |||
| std::vector<std::string> UserInterface::monthName = { | |||
| "Morning Star", | |||
| "Sun's Dawn'", | |||
| "First Seed", | |||
| "Rain's Hand", | |||
| "Second Seed", | |||
| "Mid Year", | |||
| "Sun's Height", | |||
| "Last Seed", | |||
| "Hearthfire", | |||
| "Frostfall", | |||
| "Sun's Dusk", | |||
| "Evening Star", | |||
| }; | |||
| void UserInterface::print(std::string msg) | |||
| { | |||
| std::cout << msg << std::flush; | |||
| std::this_thread::sleep_for(std::chrono::milliseconds(UserInterface::interval)); | |||
| } | |||
| void UserInterface::print(char *msg) | |||
| { | |||
| std::cout << msg << std::flush; | |||
| std::this_thread::sleep_for(std::chrono::milliseconds(UserInterface::interval)); | |||
| } | |||
| void UserInterface::print(const char *msg) | |||
| { | |||
| std::cout << msg << std::flush; | |||
| std::this_thread::sleep_for(std::chrono::milliseconds(UserInterface::interval)); | |||
| } | |||
| void UserInterface::printByChar(const char *msg) | |||
| { | |||
| int len = strlen(msg); | |||
| for (size_t i = 0; i < len; i++) | |||
| { | |||
| std::cout << msg[i] << std::flush; | |||
| std::this_thread::sleep_for(std::chrono::milliseconds(UserInterface::miniInterval)); | |||
| } | |||
| } | |||
| void UserInterface::welcomeMessage() | |||
| { | |||
| std::cout << "+++++++++++++++++++++++++++++++++++\n" | |||
| << "+ Welcome to Spell-Warz-Again !!! +\n" | |||
| << "+++++++++++++++++++++++++++++++++++\n" | |||
| << std::flush; | |||
| } | |||
| Character *UserInterface::characterCreation() | |||
| { | |||
| char buffer[128] = {0}; | |||
| char choice = 0; | |||
| while (choice != 'y' && choice != 'Y') | |||
| { | |||
| std::cout << "Who should we call you?\n" | |||
| << ">" << std::flush; | |||
| std::cin >> buffer; | |||
| std::cout << "So you are a young mage named \"" << buffer << "\" correct? (y/N)\n" | |||
| << ">"; | |||
| std::cin >> choice; | |||
| } | |||
| return new Character( | |||
| buffer, 1, 0, 10, 10, 5, 5); | |||
| } | |||
| void UserInterface::epilogue() | |||
| { | |||
| UserInterface::printByChar( | |||
| "You are just a young mage in a mage school,\n" | |||
| "When you witnessed your arch-mage got killed by your senior...\n" | |||
| "The killer was mumbling about some flag inside a scroll,\n" | |||
| "he constantly mentioned something about a competition called CTF...\n" | |||
| "You thought to yourself: \"What the f*ck is a CTF?\"\n" | |||
| "Nevertheless, you want that scroll, you want that flag!\n" | |||
| "Defeat the new arch-mage that was once your senior to get a glimpse of that scroll!\n" | |||
| "Note: You need to do this in 10 year of in-game, otherwise you would graduate first...\n"); | |||
| } | |||
| std::string UserInterface::dateString() | |||
| { | |||
| char date[5] = {0}; | |||
| if (UserInterface::day < 21) | |||
| { | |||
| switch (UserInterface::day) | |||
| { | |||
| case 1: | |||
| sprintf(date, "1st"); | |||
| break; | |||
| case 2: | |||
| sprintf(date, "2nd"); | |||
| break; | |||
| case 3: | |||
| sprintf(date, "3rd"); | |||
| break; | |||
| default: | |||
| sprintf(date, "%dth", UserInterface::day); | |||
| break; | |||
| } | |||
| } | |||
| else | |||
| { | |||
| switch (UserInterface::day % 10) | |||
| { | |||
| case 1: | |||
| sprintf(date, "%dst", UserInterface::day); | |||
| break; | |||
| case 2: | |||
| sprintf(date, "%dnd", UserInterface::day); | |||
| break; | |||
| case 3: | |||
| sprintf(date, "%drd", UserInterface::day); | |||
| break; | |||
| default: | |||
| sprintf(date, "%dth", UserInterface::day); | |||
| break; | |||
| } | |||
| } | |||
| return std::string( | |||
| UserInterface::dayName.at((UserInterface::day % 7) - 1) + ", " + | |||
| date + " of " + UserInterface::monthName.at(UserInterface::month - 1) + | |||
| ", Year " + std::to_string(UserInterface::year)); | |||
| } | |||
| void UserInterface::menu() | |||
| { | |||
| std::cout << UserInterface::dateString() << "\n" | |||
| << "Available action:\n" | |||
| << "[1] Take a rest\n" | |||
| << "[2] Practice magic\n" | |||
| << "[3] Spar against classmate\n" | |||
| << "[4] Challenge the new Arch-Mage\n" | |||
| << "[5] Gather info about the new Arch-Mage\n" | |||
| << "[6] Meditate to your inner-self\n" | |||
| << "[0] Commit sudoku\n" | |||
| << std::flush; | |||
| } | |||
| int UserInterface::getNumber(std::string msg, int min, int max) | |||
| { | |||
| int buffer = max + 1; | |||
| while (!(buffer <= max && buffer >= min)) | |||
| { | |||
| std::cout << msg << std::flush; | |||
| std::cin >> buffer; | |||
| } | |||
| return buffer; | |||
| } | |||
| void UserInterface::nextDay() | |||
| { | |||
| if (UserInterface::day++ >= UserInterface::maxDay) | |||
| { | |||
| if (UserInterface::month++ >= UserInterface::maxMonth) | |||
| { | |||
| if (UserInterface::year++ >= UserInterface::maxYear) | |||
| { | |||
| UserInterface::gameOver = true; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| bool UserInterface::isGameOver() | |||
| { | |||
| return gameOver; | |||
| } | |||
| @ -0,0 +1,50 @@ | |||
| #ifndef SPELL_WARZ_USER_INTERFACE_HPP | |||
| #define SPELL_WARZ_USER_INTERFACE_HPP 1 | |||
| #include <iostream> | |||
| #include <thread> | |||
| #include <chrono> | |||
| #include <string> | |||
| #include <cstring> | |||
| #include "Character.hpp" | |||
| #include "Spell.hpp" | |||
| class UserInterface | |||
| { | |||
| protected: | |||
| static const int interval; // in ms | |||
| static const int miniInterval; // in ms | |||
| static const int maxDay; | |||
| static const int maxMonth; | |||
| static const int maxYear; | |||
| static std::vector<std::string> dayName; | |||
| static std::vector<std::string> monthName; | |||
| static int day; | |||
| static int month; | |||
| static int year; | |||
| static bool gameOver; | |||
| public: | |||
| static void print(std::string); | |||
| static void print(const char *); | |||
| static void print(char *); | |||
| static void printByChar(std::string); | |||
| static void printByChar(const char *); | |||
| static void printByChar(char *); | |||
| static void welcomeMessage(); | |||
| static void epilogue(); | |||
| static void menu(); | |||
| static void nextDay(); | |||
| static std::string dateString(); | |||
| static int getNumber(std::string, int, int); | |||
| static Character *characterCreation(); | |||
| static bool isGameOver(); | |||
| }; | |||
| #endif | |||
| @ -0,0 +1,49 @@ | |||
| #include <iostream> | |||
| #include <thread> | |||
| #include <chrono> | |||
| #include <random> | |||
| #include <fstream> | |||
| #include "lib/Character.hpp" | |||
| #include "lib/Spell.hpp" | |||
| #include "lib/UserInterface.hpp" | |||
| // #include "lib/BattleInterface.hpp" | |||
| std::string loadFlag() | |||
| { | |||
| return ""; | |||
| } | |||
| int main() | |||
| { | |||
| std::string flag; | |||
| Character *player; | |||
| flag = loadFlag(); | |||
| srand(time(0)); | |||
| UserInterface::welcomeMessage(); | |||
| UserInterface::epilogue(); | |||
| player = UserInterface::characterCreation(); | |||
| while (player->isAlive() && !UserInterface::isGameOver()) | |||
| { | |||
| int choice; | |||
| UserInterface::menu(); | |||
| choice = UserInterface::getNumber( | |||
| "What are you gonna do today?\n>", | |||
| 0, 0); | |||
| switch (choice) | |||
| { | |||
| case 0: | |||
| UserInterface::print("You commit sudoku...\n"); | |||
| UserInterface::print("Was it supposed to be seppuku?\n"); | |||
| UserInterface::print("Nevermind, you killed yourself.\n"); | |||
| player->suicide(); | |||
| break; | |||
| default: | |||
| break; | |||
| } | |||
| } | |||
| } | |||