Browse Source

v1.0

master
myitinos 9 months ago
parent
commit
cf8d3d5221
10 changed files with 673 additions and 21 deletions
  1. 2
    0
      .gitignore
  2. 0
    21
      LICENSE
  3. 1
    0
      flag.txt
  4. 152
    0
      lib/Character.cpp
  5. 55
    0
      lib/Character.hpp
  6. 40
    0
      lib/Spell.cpp
  7. 27
    0
      lib/Spell.hpp
  8. BIN
      main
  9. 378
    0
      main.cpp
  10. 18
    0
      makefile

+ 2
- 0
.gitignore View File

@@ -0,0 +1,2 @@
1
+.vscode
2
+*.o

+ 0
- 21
LICENSE View File

@@ -1,21 +0,0 @@
1
-MIT License
2
-
3
-Copyright (c) <year> <copyright holders>
4
-
5
-Permission is hereby granted, free of charge, to any person obtaining a copy
6
-of this software and associated documentation files (the "Software"), to deal
7
-in the Software without restriction, including without limitation the rights
8
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
-copies of the Software, and to permit persons to whom the Software is furnished
10
-to do so, subject to the following conditions:
11
-
12
-The above copyright notice and this permission notice (including the next
13
-paragraph) shall be included in all copies or substantial portions of the
14
-Software.
15
-
16
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
18
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
19
-OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
21
-OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ 1
- 0
flag.txt View File

@@ -0,0 +1 @@
1
+slashroot{n0b0dy_3xpEc7_th3_sp4n1sh_Inqu15it10n}

+ 152
- 0
lib/Character.cpp View File

@@ -0,0 +1,152 @@
1
+#include "Character.hpp"
2
+
3
+std::vector<const char *> Character::playerNames = {
4
+    "Abby",
5
+    "John",
6
+    "Adam",
7
+    "Johny",
8
+    "Christo",
9
+    "Greg",
10
+};
11
+
12
+Character::Character(const char *n, int l, int e, int h, int m, int a, int d)
13
+{
14
+    this->name = n;
15
+    this->level = l;
16
+    this->experience = e;
17
+    this->maxHP = h;
18
+    this->curHP = maxHP;
19
+    this->maxMP = m;
20
+    this->curMP = maxMP;
21
+    this->atk = a;
22
+    this->def = d;
23
+}
24
+
25
+const char *Character::getName()
26
+{
27
+    return this->name;
28
+}
29
+
30
+int Character::getLevel()
31
+{
32
+    return this->level;
33
+}
34
+
35
+int Character::getExperience()
36
+{
37
+    return this->experience;
38
+}
39
+
40
+int Character::getMaxHP()
41
+{
42
+    return this->maxHP;
43
+}
44
+
45
+int Character::getCurHP()
46
+{
47
+    return this->curHP;
48
+}
49
+
50
+int Character::getMaxMP()
51
+{
52
+    return this->maxMP;
53
+}
54
+
55
+int Character::getCurMP()
56
+{
57
+    return this->curMP;
58
+}
59
+
60
+int Character::getAtk()
61
+{
62
+    return this->atk;
63
+}
64
+
65
+int Character::getDef()
66
+{
67
+    return this->def;
68
+}
69
+
70
+void Character::levelUp()
71
+{
72
+    if ((this->level <= maxLevel) && this->readytoLevelUp())
73
+    {
74
+        this->level++;
75
+        this->maxHP += 10;
76
+        this->maxMP += 5;
77
+    }
78
+
79
+    this->curHP = this->maxHP;
80
+    this->curMP = this->maxMP;
81
+}
82
+
83
+void Character::restoreHP(int n)
84
+{
85
+    this->curHP += n;
86
+    if (this->curHP > this->maxHP)
87
+    {
88
+        this->curHP = this->maxHP;
89
+    }
90
+}
91
+
92
+void Character::restoreMP(int n)
93
+{
94
+    this->curMP += n;
95
+    if (this->curMP > this->maxMP)
96
+    {
97
+        this->curMP = this->maxMP;
98
+    }
99
+}
100
+
101
+void Character::reduceHP(int n)
102
+{
103
+    this->curHP -= n;
104
+}
105
+
106
+void Character::reduceMP(int n)
107
+{
108
+    this->curMP -= n;
109
+}
110
+
111
+std::vector<Character *> Character::Enemies = {
112
+    new Character("Red Mage", 1, 1, 10, 5, 1, 1),
113
+    new Character("Green Mage", 2, 3, 20, 10, 1, 1),
114
+    new Character("Blue Mage", 3, 7, 40, 25, 1, 1),
115
+    new Character("White Mage", 4, 11, 80, 40, 1, 1),
116
+    new Character("Black Mage", 5, 16, 160, 80, 1, 1),
117
+};
118
+
119
+bool Character::isAlive()
120
+{
121
+    return this->curHP > 0;
122
+}
123
+
124
+int Character::toNextLevel()
125
+{
126
+    return (this->level <= maxLevel) ? ((this->level + 1) * (this->level + 1)) - this->getExperience() : 999999;
127
+}
128
+
129
+bool Character::readytoLevelUp()
130
+{
131
+    return (this->toNextLevel() <= 0);
132
+}
133
+
134
+void Character::increaseExperience(int n)
135
+{
136
+    this->experience += n;
137
+    if (this->experience > maxEperience)
138
+    {
139
+        this->experience = maxEperience;
140
+    }
141
+}
142
+
143
+bool Character::canCastSpell(Spell *s)
144
+{
145
+    return this->curMP >= s->getCost();
146
+}
147
+
148
+void Character::castSpell(Spell *s, Character *t)
149
+{
150
+    this->reduceMP(s->getCost());
151
+    t->reduceHP(s->getAmount());
152
+}

+ 55
- 0
lib/Character.hpp View File

@@ -0,0 +1,55 @@
1
+#ifndef SPELL_WARZ_CHARACTER_HPP
2
+#define SPELL_WARZ_CHARACTER_HPP 1
3
+
4
+#include <vector>
5
+
6
+#include "Spell.hpp"
7
+
8
+class Character
9
+{
10
+protected:
11
+    static const int maxLevel = 100;
12
+    static const int maxEperience = 999999999;
13
+    const char *name;
14
+
15
+    int level;
16
+    int experience;
17
+    int maxHP;
18
+    int curHP;
19
+    int maxMP;
20
+    int curMP;
21
+    int atk;
22
+    int def;
23
+
24
+public:
25
+    static std::vector<Character *> Enemies;
26
+    static std::vector<const char *> playerNames;
27
+
28
+    Character(const char *, int, int, int, int, int, int);
29
+
30
+    void restoreHP(int);
31
+    void restoreMP(int);
32
+    void reduceHP(int);
33
+    void reduceMP(int);
34
+
35
+    void castSpell(Spell *, Character *);
36
+    bool canCastSpell(Spell *);
37
+
38
+    const char *getName();
39
+    int getLevel();
40
+    int getExperience();
41
+    int getMaxHP();
42
+    int getCurHP();
43
+    int getMaxMP();
44
+    int getCurMP();
45
+    int getAtk();
46
+    int getDef();
47
+    int toNextLevel();
48
+
49
+    bool readytoLevelUp();
50
+    bool isAlive();
51
+    void levelUp();
52
+    void increaseExperience(int n);
53
+};
54
+
55
+#endif

+ 40
- 0
lib/Spell.cpp View File

@@ -0,0 +1,40 @@
1
+#include "Spell.hpp"
2
+
3
+Spell::Spell(const char *n, int t, int a, int c)
4
+{
5
+    this->name = n;
6
+    this->type = t;
7
+    this->amount = a;
8
+    this->cost = c;
9
+}
10
+
11
+int Spell::getType()
12
+{
13
+    return this->type;
14
+}
15
+
16
+int Spell::getAmount()
17
+{
18
+    return this->amount;
19
+}
20
+
21
+int Spell::getCost()
22
+{
23
+    return this->cost;
24
+}
25
+
26
+const char *Spell::getName()
27
+{
28
+    return this->name;
29
+}
30
+
31
+std::vector<Spell *> Spell::Book = {
32
+    new Spell("Spanish Inquisition", 1, 111111, 0),
33
+    new Spell("Mana Bolt", 1, 5, 1),
34
+    new Spell("Flame Bolt", 1, 8, 2),
35
+    new Spell("Mana Flare", 1, 10, 3),
36
+    new Spell("Ice Spear", 1, 13, 4),
37
+    new Spell("Mana Misile", 1, 15, 5),
38
+    new Spell("Thunder Strike", 1, 18, 6),
39
+    new Spell("Mana Blast", 1, 20, 7),
40
+};

+ 27
- 0
lib/Spell.hpp View File

@@ -0,0 +1,27 @@
1
+#ifndef SPELL_WARZ_SPELL_CPP
2
+#define SPELL_WARZ_SPELL_CPP 1
3
+
4
+#include <vector>
5
+
6
+class Spell
7
+{
8
+protected:
9
+    const char *name;
10
+
11
+    int type;
12
+    int amount;
13
+    int cost;
14
+
15
+public:
16
+    int TYPE_RESTORATION = 0;
17
+    int TYPE_DESTRUCTION = 1;
18
+    static std::vector<Spell *> Book;
19
+
20
+    Spell(const char *, int, int, int);
21
+    int getType();
22
+    int getAmount();
23
+    int getCost();
24
+    const char *getName();
25
+};
26
+
27
+#endif

BIN
main View File


+ 378
- 0
main.cpp View File

@@ -0,0 +1,378 @@
1
+
2
+#include <iostream>
3
+#include <thread>
4
+#include <chrono>
5
+#include <random>
6
+#include <fstream>
7
+
8
+#include "lib/Character.hpp"
9
+#include "lib/Spell.hpp"
10
+
11
+#define INTERVAL 1000
12
+#define FLAG_INTERVAL 250
13
+
14
+void sleep(int ms)
15
+{
16
+    std::this_thread::sleep_for(std::chrono::milliseconds(ms));
17
+}
18
+
19
+int strlen(const char *msg)
20
+{
21
+    int i = 0;
22
+    while (msg[i] != '\x00')
23
+    {
24
+        i++;
25
+    }
26
+    return i;
27
+}
28
+
29
+int getLowest(int a, int b)
30
+{
31
+    return (a < b) ? a : b;
32
+}
33
+
34
+int getHighest(int a, int b)
35
+{
36
+    return (a > b) ? a : b;
37
+}
38
+
39
+void intervalPrint(const char *msg, int interval = 1000, int len = 0)
40
+{
41
+    if (len <= 0)
42
+    {
43
+        len = strlen(msg);
44
+    }
45
+
46
+    for (int i = 0; i < len; i++)
47
+    {
48
+        std::cout << msg[i] << std::flush;
49
+        std::this_thread::sleep_for(std::chrono::milliseconds(interval));
50
+    }
51
+    std::cout << std::endl;
52
+}
53
+void intervalPrint(std::string &msg, int interval = 1000, int len = 0)
54
+{
55
+    if (len <= 0)
56
+    {
57
+        len = msg.length();
58
+    }
59
+
60
+    for (int i = 0; i < len; i++)
61
+    {
62
+        std::cout << msg.at(i) << std::flush;
63
+        std::this_thread::sleep_for(std::chrono::milliseconds(interval));
64
+    }
65
+    std::cout << std::endl;
66
+}
67
+
68
+int getNumber(const char *prompt, int min, int max)
69
+{
70
+    int tmp = 0;
71
+    std::cout << prompt;
72
+    while (!(std::cin >> tmp) && (tmp >= min && tmp <= max))
73
+    {
74
+        if (std::cin.eofbit)
75
+        {
76
+            exit(1);
77
+        }
78
+        std::cin.get();
79
+        std::cin.clear();
80
+        std::cin.ignore(4096, '\x00');
81
+        // std::cin.ignore(4096, '\n');
82
+        std::cout << prompt;
83
+    }
84
+    return tmp;
85
+}
86
+
87
+Character *chooseEnemy()
88
+{
89
+    std::cout << "List of challenger:" << std::endl;
90
+    for (int i = 0; i < Character::Enemies.size(); i++)
91
+    {
92
+        std::cout << "[" << i << "] " << Character::Enemies[i]->getName() << std::endl;
93
+    }
94
+
95
+    int choice = 0;
96
+    do
97
+    {
98
+        choice = getNumber("Choose your enemy: ", 0, Character::Enemies.size());
99
+    } while (!(choice >= 0 && choice < Character::Enemies.size()));
100
+    return Character::Enemies[choice];
101
+}
102
+
103
+Character *generatePlayer()
104
+{
105
+    Character *tmp = new Character(
106
+        Character::playerNames[std::rand() % Character::playerNames.size()],
107
+        1,
108
+        1,
109
+        100,
110
+        50,
111
+        1,
112
+        1);
113
+
114
+    return tmp;
115
+}
116
+
117
+std::string loadFlag()
118
+{
119
+    std::string tmp;
120
+    std::ifstream flagFile("flag.txt");
121
+    if (flagFile.is_open())
122
+    {
123
+        flagFile >> tmp;
124
+    }
125
+    return tmp;
126
+}
127
+
128
+void printCharacterInfo(Character *c)
129
+{
130
+    std::cout << "Name : " << c->getName() << std::endl
131
+              << "HP   : " << c->getCurHP() << "/" << c->getMaxHP() << std::endl
132
+              << "MP   : " << c->getCurMP() << "/" << c->getMaxMP() << std::endl;
133
+}
134
+
135
+void printCharacterFullInfo(Character *c)
136
+{
137
+    std::cout << "Name : " << c->getName() << std::endl
138
+              << "Level: " << c->getLevel() << std::endl
139
+              << "Exp  : " << c->getExperience() << " | next: " << c->toNextLevel() << std::endl
140
+              << "HP   : " << c->getCurHP() << "/" << c->getMaxHP() << std::endl
141
+              << "MP   : " << c->getCurMP() << "/" << c->getMaxMP() << std::endl;
142
+}
143
+
144
+Character *startBattle(Character *p1, Character *p2)
145
+{
146
+    int maxTurn = 1000;
147
+    int turn = 0;
148
+    std::cout << "===== BATTLE START ======" << std::endl;
149
+    while ((p1->isAlive() && p2->isAlive()) && (++turn <= maxTurn))
150
+    {
151
+        std::cout << "== Turn " << turn << " ==" << std::endl;
152
+        std::cout << "Player =====" << std::endl;
153
+        printCharacterInfo(p1);
154
+
155
+        std::cout << "Enemy ======" << std::endl;
156
+        printCharacterInfo(p2);
157
+
158
+        std::cout << "===== Spell Books =====" << std::endl;
159
+        for (int i = 1; i <= p1->getLevel() && i < Spell::Book.size(); i++)
160
+        {
161
+            std::cout << "[" << i << "] " << Spell::Book[i]->getName() << std::endl;
162
+        }
163
+
164
+        int p1Choice = getNumber("Choose your spell: ", 0, getLowest(p1->getLevel(), Spell::Book.size() - 1));
165
+        int p2Choice = (std::rand() % getLowest(p2->getLevel(), Spell::Book.size() - 1)) + 1;
166
+
167
+        Spell *p1Spell = Spell::Book[p1Choice];
168
+        Spell *p2Spell = Spell::Book[p2Choice];
169
+
170
+        if (p1->canCastSpell(p1Spell))
171
+        {
172
+            p1->castSpell(p1Spell, p2);
173
+            std::cout << p1->getName() << " cast " << p1Spell->getName() << std::endl;
174
+            sleep(INTERVAL);
175
+            std::cout << p2->getName() << " took " << p1Spell->getAmount() << " damage" << std::endl;
176
+            sleep(INTERVAL);
177
+        }
178
+        else
179
+        {
180
+            std::cout << p1->getName() << " failed to cast " << p1Spell->getName() << std::endl;
181
+            sleep(INTERVAL);
182
+            std::cout << p1->getName() << " does not have enough MP to cast it!" << std::endl;
183
+            sleep(INTERVAL);
184
+        }
185
+
186
+        if (p2->canCastSpell(p2Spell))
187
+        {
188
+            p2->castSpell(p2Spell, p1);
189
+            std::cout << p2->getName() << " cast " << p2Spell->getName() << std::endl;
190
+            sleep(INTERVAL);
191
+            std::cout << p1->getName() << " took " << p2Spell->getAmount() << " damage" << std::endl;
192
+            sleep(INTERVAL);
193
+        }
194
+        else
195
+        {
196
+            std::cout << p2->getName() << " failed to cast " << p2Spell->getName() << std::endl;
197
+            sleep(INTERVAL);
198
+            std::cout << p2->getName() << " does not have enough MP to cast it!" << std::endl;
199
+            sleep(INTERVAL);
200
+        }
201
+    }
202
+
203
+    Character *winner;
204
+
205
+    if (turn >= maxTurn)
206
+    {
207
+        std::cout << "The battle took too long, a winner has to be decided." << std::endl;
208
+        winner = (p1->getCurHP() > p2->getCurHP()) ? p1 : p2;
209
+    }
210
+    else
211
+    {
212
+        winner = (p1->isAlive()) ? p1 : p2;
213
+    }
214
+
215
+    return winner;
216
+}
217
+
218
+int main()
219
+{
220
+    std::srand(std::time(0));
221
+    std::string flag = loadFlag();
222
+    Character *player = generatePlayer();
223
+    Character *archMage = new Character("Arch-Mage", 999, 999999, 999999, 999999, 1, 1);
224
+
225
+    std::cout << "Welcome to SpellWarz!" << std::endl;
226
+    sleep(INTERVAL);
227
+    std::cout << "You are a young mage named '" << player->getName() << "'" << std::endl;
228
+    sleep(INTERVAL);
229
+    std::cout << "Here's your flag: ";
230
+
231
+    intervalPrint(flag, FLAG_INTERVAL, 10);
232
+
233
+    std::cout << "Oh no!" << std::endl;
234
+    sleep(INTERVAL);
235
+    std::cout << "The Arch-Mage took your flag!" << std::endl;
236
+    sleep(INTERVAL);
237
+    std::cout << "He said you are not worthy of it," << std::endl;
238
+    sleep(INTERVAL);
239
+    std::cout << "defeat him to get it back!" << std::endl;
240
+    sleep(INTERVAL);
241
+
242
+    while (player->isAlive())
243
+    {
244
+        std::cout << "========================================" << std::endl;
245
+        printCharacterFullInfo(player);
246
+
247
+        std::cout << "========================================" << std::endl
248
+                  << "[1] Sleep" << std::endl
249
+                  << "[2] Meditate" << std::endl
250
+                  << "[3] Spar with other mages" << std::endl
251
+                  << "[4] Search info about Arch-Mage" << std::endl
252
+                  << "[5] Challenge the Arch-Mage" << std::endl
253
+                  << "[0] Give up on life" << std::endl;
254
+
255
+        int choice = getNumber("Choose your action: ", 0, 5);
256
+        std::cout << "========================================" << std::endl;
257
+
258
+        if (choice == 0)
259
+        {
260
+            std::cout << "Farewell young mage, see you in the afterlife..." << std::endl;
261
+            player->reduceHP(player->getMaxHP());
262
+        }
263
+        if (choice == 1)
264
+        {
265
+            std::cout << "You take a rest in your dormitory..." << std::endl;
266
+            sleep(INTERVAL);
267
+            std::cout << "You recovered to full HP and MP" << std::endl;
268
+            sleep(INTERVAL);
269
+            player->restoreHP(player->getMaxHP());
270
+            player->restoreMP(player->getMaxMP());
271
+        }
272
+        if (choice == 2)
273
+        {
274
+            int tmp;
275
+            tmp = (rand() % 10) + 1;
276
+            std::cout << "You meditate on your mana..." << std::endl;
277
+            sleep(INTERVAL);
278
+            std::cout << "And got " << tmp << " experience!" << std::endl;
279
+            sleep(INTERVAL);
280
+            player->increaseExperience(tmp);
281
+            if (player->readytoLevelUp())
282
+            {
283
+                std::cout << "Congratulations, you leveled up!" << std::endl;
284
+                while (player->readytoLevelUp())
285
+                {
286
+                    player->levelUp();
287
+                }
288
+                sleep(200);
289
+            }
290
+        }
291
+        if (choice == 3)
292
+        {
293
+            Character *enemy = new Character(*chooseEnemy());
294
+            Character *winner = startBattle(player, enemy);
295
+            if (winner == player)
296
+            {
297
+                std::cout << "You win! You got " << enemy->getExperience() << "exp" << std::endl;
298
+                sleep(INTERVAL);
299
+                player->increaseExperience(enemy->getExperience());
300
+                if (player->readytoLevelUp())
301
+                {
302
+                    std::cout << "Congratulations, you leveled up!" << std::endl;
303
+                    while (player->readytoLevelUp())
304
+                    {
305
+                        player->levelUp();
306
+                    }
307
+                    sleep(200);
308
+                }
309
+            }
310
+            else
311
+            {
312
+                while (!player->isAlive())
313
+                {
314
+                    player->restoreHP(1);
315
+                }
316
+                std::cout << "You lose the fight, it was a fair fight." << std::endl;
317
+                sleep(INTERVAL);
318
+            }
319
+        }
320
+        if (choice == 4)
321
+        {
322
+            std::cout << "You are searching info about the Arch-Mage..." << std::endl;
323
+            sleep(INTERVAL);
324
+            std::cout << "Here's some info about the Arch-Mage:" << std::endl;
325
+            printCharacterFullInfo(archMage);
326
+        }
327
+        if (choice == 5)
328
+        {
329
+            if (archMage->isAlive())
330
+            {
331
+                std::cout << "You are challenging the Arch-Mage" << std::endl;
332
+                sleep(INTERVAL);
333
+                std::cout << "Arch-Mage: ";
334
+                sleep(INTERVAL);
335
+                intervalPrint("so you have come to challenge me. Prepare to die!", 200);
336
+
337
+                Character *winner = startBattle(player, archMage);
338
+                if (winner == player)
339
+                {
340
+                    std::cout << "You win! You got " << archMage->getExperience() << "exp" << std::endl;
341
+                    player->increaseExperience(archMage->getExperience());
342
+                    sleep(INTERVAL);
343
+                    if (player->readytoLevelUp())
344
+                    {
345
+                        std::cout << "Congratulations, you leveled up!" << std::endl;
346
+                        while (player->readytoLevelUp())
347
+                        {
348
+                            player->levelUp();
349
+                        }
350
+                        sleep(200);
351
+                    }
352
+                    std::cout << "You did a good job! Now you are the Arch-Mage!" << std::endl;
353
+                    sleep(INTERVAL);
354
+                    std::cout << "Here's the flag the previous Arch-Mage took from you: " << std::endl;
355
+                    sleep(INTERVAL);
356
+                    intervalPrint(flag, FLAG_INTERVAL);
357
+                }
358
+                else
359
+                {
360
+                    std::cout << "You lose the fight..." << std::endl;
361
+                    sleep(INTERVAL);
362
+                    std::cout << "Unfortunately, the Arch-Mage was serious about this fight..." << std::endl;
363
+                    sleep(INTERVAL);
364
+                    std::cout << "You were killed in battle..." << std::endl;
365
+                    intervalPrint("GAME OVER", 250);
366
+                }
367
+            }
368
+            else
369
+            {
370
+                std::cout << "You are the Arch-Mage now." << std::endl;
371
+                sleep(INTERVAL);
372
+                std::cout << "Here's your flag:";
373
+                sleep(INTERVAL);
374
+                intervalPrint(flag, FLAG_INTERVAL);
375
+            }
376
+        }
377
+    }
378
+}

+ 18
- 0
makefile View File

@@ -0,0 +1,18 @@
1
+CC = g++
2
+
3
+Spell.o: lib/Spell.cpp lib/Spell.hpp
4
+	g++ -c lib/Spell.cpp -o Spell.o
5
+
6
+Character.o: lib/Character.cpp lib/Character.hpp
7
+	g++ -c lib/Character.cpp -o Character.o
8
+
9
+main: Spell.o Character.o main.cpp lib/Character.hpp lib/Spell.hpp
10
+	g++ main.cpp -o main Spell.o Character.o
11
+
12
+clean: Spell.o Character.o
13
+	rm Spell.o Character.o
14
+
15
+striped: Spell.o Character.o main.cpp lib/Character.hpp lib/Spell.hpp
16
+	g++ -s main.cpp -o main Spell.o Character.o
17
+
18
+all: Spell.o Character.o main

Loading…
Cancel
Save