]> jfr.im git - irc/gameservirc.git/blob - gameserv/c_forest.cpp
c20cfb43fa2aa33372b1ae82cde147457e3cf5dd
[irc/gameservirc.git] / gameserv / c_forest.cpp
1 #include "aClient.h"
2 #include <cctype>
3 #include "extern.h"
4 #include "flags.h"
5 #include "item.h"
6 #include "pouch.h"
7 #include "sockhelp.h"
8
9 void do_forest(char *u);
10 Monster *getNewMonster(Monster *m);
11 void deleteMonster(Monster *m);
12
13 void forest(char *source, char *buf)
14 {
15 char *cmd = strtok(buf, " ");
16
17 if (cmd[0] == ':')
18 cmd++;
19 if (source[0] == ':')
20 source++;
21
22 if (stricmp(cmd, "SEARCH") == 0)
23 {
24 do_forest(source);
25 } else if (stricmp(cmd, "ATTACK") == 0) {
26 do_attack(source);
27 } else if (stricmp(cmd, "RUN") == 0) {
28 do_run(source);
29 } else if (stricmp(cmd, "HEAL") == 0) {
30 do_heal(source);
31 }
32
33 source--;
34 }
35
36 void do_forest(char *u)
37 {
38 aClient *source;
39
40 if (!(source = find(u)))
41 {
42 notice(s_GameServ, u, "Fatal Error in do_forest. Contact a %S admin for help.");
43 return;
44 }
45 else if (!is_playing(source))
46 {
47 notice(s_GameServ, u, "You must be playing the game to search the forest!");
48 return;
49 }
50 Player *p = source->stats;
51
52 if (!isAlive(p))
53 {
54 notice(s_GameServ, u, "You are dead. Wait until tomorrow to search the forest some more.");
55 return;
56 }
57 else
58 {
59 updateTS(source->stats);
60 if (p->getForestFights() <= 0)
61 {
62 notice(s_GameServ, u, "You are out of forest fights for the day. Wait "\
63 "till tomorrow!");
64 return;
65 }
66 else if (!is_fighting(source))
67 {
68 int eventnum = rand() % 100;
69 p->subtractForestFights(1);
70
71 notice(s_GameServ, u, "You search the forest for something to kill...");
72
73 // 90% of forest searching turns up a monster
74 if (eventnum >= 10)
75 {
76 p->setMonster(levels[p->getLevel() - 1].randomMonster());
77
78 notice(s_GameServ, u, "You have found \ 2%s\ 2!", p->getMonster()->name.c_str());
79 if (p->getMonster()->hp < p->getMonster()->maxhp)
80 p->getMonster()->hp = p->getMonster()->maxhp;
81
82 p->delBattle(); // Just to make sure
83 p->delMaster(); // Just to make sure
84 display_monster(u);
85 }
86 else if (eventnum < 10 && eventnum >= 9) // 1% for finding potions
87 {
88 list<tavernItem>::iterator temp_tavernitem;
89
90 notice(s_GameServ, u, "Fortune smiles upon thee!");
91
92 eventnum = rand() % tavern.size();
93 temp_tavernitem = tavern.begin();
94 for (int x = 0;x < eventnum;x++)
95 {
96 temp_tavernitem++;
97 }
98 notice(s_GameServ, u, "You have found a %s", (*temp_tavernitem).getItem()->getName().c_str());
99 p->inventory->addItem((*temp_tavernitem).getItem());
100 }
101 else if (eventnum < 9 && eventnum >= 4) // 5% for the fountain
102 {
103 if (p->getHP() < p->getMaxHP())
104 {
105 notice(s_GameServ, u, "In your path lies a beautiful fountain from which flows the crystal waters of life.");
106 notice(s_GameServ, u, "You wet your lips on the cool blue waters and feel rejuvenated");
107 p->healall();
108 }
109 else
110 {
111 notice(s_GameServ, u, "In your path lies a beautiful fountain from which flows the crystal waters of life.");
112 notice(s_GameServ, u, "You are not thirsty, though, and you don't need healing. Best to leave this for the next warrior");
113 p->addForestFights(1);
114 }
115 }
116 else if (eventnum < 4) // 4 % for the wishing well
117 {
118 notice(s_GameServ, u, "You come upon a pure green emerald studded magic wishing well.");
119 if (p->getGold() == 0)
120 {
121 notice(s_GameServ, u, "Too bad you're broke. Guess you won't be having any wishes answered today.");
122 p->addForestFights(1);
123 return;
124 }
125 long newstats;
126 notice(s_GameServ, u, "You throw one of your gold pieces into the well and it vanishes into a puff of white smoke.");
127 notice(s_GameServ, u, "In an instant, the puff of smoke materializes into a gnome.");
128 notice(s_GameServ, u, "The gnome is holding something in his hand motioning for you to come closer.");
129 notice(s_GameServ, u, "It is a wand! The gnome is waving it through the air towards you!");
130 // 2% for each wishing well chance except for forest fights
131 if (eventnum < 1) // forest fights
132 {
133 newstats = (rand() % 11) + 5;
134 notice(s_GameServ, u, "%ld EXTRA FOREST FIGHTS!!",
135 newstats);
136 p->addForestFights(newstats);
137 }
138 else if (eventnum < 3)
139 {
140 newstats = levels[p->getLevel() - 1].getGold().random();
141 notice(s_GameServ, u, "A SACK WITH %ld GOLD!", newstats);
142 p->addGold(newstats);
143 }
144 else
145 {
146 newstats = levels[p->getLevel() - 1].getExp().random();
147 notice(s_GameServ, u, "Time seems to stand still for a moment.");
148 notice(s_GameServ, u, " %ld EXTRA EXPERIENCE POINTS", newstats);
149 p->addExp(newstats);
150 }
151 }
152 }
153 else if (is_fighting(u))
154 {
155 notice(s_GameServ, u, "You want to fight two monsters at once?");
156 }
157 }
158 }
159
160 Monster *getNewMonster(Monster *m)
161 {
162 if (!m)
163 return NULL;
164
165 Monster *newguy;
166 newguy = new Monster;
167 newguy->name = m->name;
168 newguy->weapon = m->weapon;
169 newguy->death = m->death;
170 newguy->strength = m->strength;
171 newguy->gold = m->gold;
172 newguy->exp = m->exp;
173 newguy->hp = m->hp;
174 newguy->maxhp = m->maxhp;
175 return newguy;
176 }