misc.c revision 1.4 1 1.4 veego /* $NetBSD: misc.c,v 1.4 1998/08/30 09:19:39 veego Exp $ */
2 1.2 cgd
3 1.1 jtc /*
4 1.1 jtc * misc.c Phantasia miscellaneous support routines
5 1.1 jtc */
6 1.1 jtc
7 1.1 jtc #include "include.h"
8 1.1 jtc
9 1.1 jtc
10 1.3 lukem void
11 1.1 jtc movelevel()
12 1.1 jtc {
13 1.3 lukem struct charstats *statptr; /* for pointing into Stattable */
14 1.3 lukem double new; /* new level */
15 1.3 lukem double inc; /* increment between new and old levels */
16 1.3 lukem
17 1.3 lukem Changed = TRUE;
18 1.3 lukem
19 1.3 lukem if (Player.p_type == C_EXPER)
20 1.3 lukem /* roll a type to use for increment */
21 1.3 lukem statptr = &Stattable[(int) ROLL(C_MAGIC, C_HALFLING - C_MAGIC + 1)];
22 1.3 lukem else
23 1.3 lukem statptr = Statptr;
24 1.1 jtc
25 1.3 lukem new = explevel(Player.p_experience);
26 1.3 lukem inc = new - Player.p_level;
27 1.3 lukem Player.p_level = new;
28 1.3 lukem
29 1.3 lukem /* add increments to statistics */
30 1.3 lukem Player.p_strength += statptr->c_strength.increase * inc;
31 1.3 lukem Player.p_mana += statptr->c_mana.increase * inc;
32 1.3 lukem Player.p_brains += statptr->c_brains.increase * inc;
33 1.3 lukem Player.p_magiclvl += statptr->c_magiclvl.increase * inc;
34 1.3 lukem Player.p_maxenergy += statptr->c_energy.increase * inc;
35 1.1 jtc
36 1.3 lukem /* rest to maximum upon reaching new level */
37 1.3 lukem Player.p_energy = Player.p_maxenergy + Player.p_shield;
38 1.3 lukem
39 1.3 lukem if (Player.p_crowns > 0 && Player.p_level >= 1000.0)
40 1.3 lukem /* no longer able to be king -- turn crowns into cash */
41 1.1 jtc {
42 1.3 lukem Player.p_gold += ((double) Player.p_crowns) * 5000.0;
43 1.3 lukem Player.p_crowns = 0;
44 1.1 jtc }
45 1.3 lukem if (Player.p_level >= 3000.0 && Player.p_specialtype < SC_COUNCIL)
46 1.3 lukem /* make a member of the council */
47 1.1 jtc {
48 1.3 lukem mvaddstr(6, 0, "You have made it to the Council of the Wise.\n");
49 1.3 lukem addstr("Good Luck on your search for the Holy Grail.\n");
50 1.1 jtc
51 1.3 lukem Player.p_specialtype = SC_COUNCIL;
52 1.1 jtc
53 1.3 lukem /* no rings for council and above */
54 1.3 lukem Player.p_ring.ring_type = R_NONE;
55 1.3 lukem Player.p_ring.ring_duration = 0;
56 1.1 jtc
57 1.3 lukem Player.p_lives = 3; /* three extra lives */
58 1.1 jtc }
59 1.3 lukem if (Player.p_level > 9999.0 && Player.p_specialtype != SC_VALAR)
60 1.3 lukem death("Old age");
61 1.1 jtc }
62 1.1 jtc
63 1.3 lukem char *
64 1.1 jtc descrlocation(playerp, shortflag)
65 1.3 lukem struct player *playerp;
66 1.3 lukem bool shortflag;
67 1.1 jtc {
68 1.3 lukem double circle; /* corresponding circle for coordinates */
69 1.3 lukem int quadrant; /* quandrant of grid */
70 1.3 lukem char *label; /* pointer to place name */
71 1.3 lukem static char *nametable[4][4] = /* names of places */
72 1.3 lukem {
73 1.3 lukem {"Anorien", "Ithilien", "Rohan", "Lorien"},
74 1.3 lukem {"Gondor", "Mordor", "Dunland", "Rovanion"},
75 1.3 lukem {"South Gondor", "Khand", "Eriador", "The Iron Hills"},
76 1.3 lukem {"Far Harad", "Near Harad", "The Northern Waste", "Rhun"}
77 1.1 jtc };
78 1.1 jtc
79 1.3 lukem if (playerp->p_specialtype == SC_VALAR)
80 1.3 lukem return (" is in Valhala");
81 1.1 jtc else
82 1.3 lukem if ((circle = CIRCLE(playerp->p_x, playerp->p_y)) >= 1000.0) {
83 1.3 lukem if (MAX(fabs(playerp->p_x), fabs(playerp->p_y)) > D_BEYOND)
84 1.3 lukem label = "The Point of No Return";
85 1.3 lukem else
86 1.3 lukem label = "The Ashen Mountains";
87 1.3 lukem } else
88 1.3 lukem if (circle >= 55)
89 1.3 lukem label = "Morannon";
90 1.3 lukem else
91 1.3 lukem if (circle >= 35)
92 1.3 lukem label = "Kennaquahair";
93 1.3 lukem else
94 1.3 lukem if (circle >= 20)
95 1.3 lukem label = "The Dead Marshes";
96 1.3 lukem else
97 1.3 lukem if (circle >= 9)
98 1.3 lukem label = "The Outer Waste";
99 1.3 lukem else
100 1.3 lukem if (circle >= 5)
101 1.3 lukem label = "The Moors Adventurous";
102 1.3 lukem else {
103 1.3 lukem if (playerp->p_x == 0.0 && playerp->p_y == 0.0)
104 1.3 lukem label = "The Lord's Chamber";
105 1.3 lukem else {
106 1.3 lukem /* this
107 1.3 lukem *
108 1.3 lukem * expr
109 1.3 lukem * essi
110 1.3 lukem * on
111 1.3 lukem * is
112 1.3 lukem * spli
113 1.3 lukem * t
114 1.3 lukem * to
115 1.3 lukem * prev
116 1.3 lukem * ent
117 1.3 lukem * comp
118 1.3 lukem * iler
119 1.3 lukem *
120 1.3 lukem * loop
121 1.3 lukem *
122 1.3 lukem * with
123 1.3 lukem *
124 1.3 lukem * some
125 1.3 lukem *
126 1.3 lukem * comp
127 1.3 lukem * iler
128 1.3 lukem * s */
129 1.3 lukem quadrant = ((playerp->p_x > 0.0) ? 1 : 0);
130 1.3 lukem quadrant += ((playerp->p_y >= 0.0) ? 2 : 0);
131 1.3 lukem label = nametable[((int) circle) - 1][quadrant];
132 1.3 lukem }
133 1.3 lukem }
134 1.3 lukem
135 1.3 lukem if (shortflag)
136 1.3 lukem sprintf(Databuf, "%.29s", label);
137 1.1 jtc else
138 1.3 lukem sprintf(Databuf, " is in %s (%.0f,%.0f)", label, playerp->p_x, playerp->p_y);
139 1.1 jtc
140 1.3 lukem return (Databuf);
141 1.3 lukem }
142 1.1 jtc
143 1.3 lukem void
144 1.1 jtc tradingpost()
145 1.1 jtc {
146 1.3 lukem double numitems; /* number of items to purchase */
147 1.3 lukem double cost; /* cost of purchase */
148 1.3 lukem double blessingcost; /* cost of blessing */
149 1.3 lukem int ch; /* input */
150 1.3 lukem int size; /* size of the trading post */
151 1.3 lukem int loop; /* loop counter */
152 1.3 lukem int cheat = 0; /* number of times player has tried to cheat */
153 1.3 lukem bool dishonest = FALSE; /* set when merchant is dishonest */
154 1.1 jtc
155 1.3 lukem Player.p_status = S_TRADING;
156 1.3 lukem writerecord(&Player, Fileloc);
157 1.1 jtc
158 1.3 lukem clear();
159 1.3 lukem addstr("You are at a trading post. All purchases must be made with gold.");
160 1.3 lukem
161 1.3 lukem size = sqrt(fabs(Player.p_x / 100)) + 1;
162 1.3 lukem size = MIN(7, size);
163 1.1 jtc
164 1.3 lukem /* set up cost of blessing */
165 1.3 lukem blessingcost = 1000.0 * (Player.p_level + 5.0);
166 1.1 jtc
167 1.3 lukem /* print Menu */
168 1.3 lukem move(7, 0);
169 1.3 lukem for (loop = 0; loop < size; ++loop)
170 1.3 lukem /* print Menu */
171 1.3 lukem {
172 1.3 lukem if (loop == 6)
173 1.3 lukem cost = blessingcost;
174 1.1 jtc else
175 1.3 lukem cost = Menu[loop].cost;
176 1.3 lukem printw("(%d) %-12s: %6.0f\n", loop + 1, Menu[loop].item, cost);
177 1.3 lukem }
178 1.1 jtc
179 1.3 lukem mvprintw(5, 0, "L:Leave P:Purchase S:Sell Gems ? ");
180 1.1 jtc
181 1.3 lukem for (;;) {
182 1.3 lukem adjuststats(); /* truncate any bad values */
183 1.1 jtc
184 1.3 lukem /* print some important statistics */
185 1.3 lukem mvprintw(1, 0, "Gold: %9.0f Gems: %9.0f Level: %6.0f Charms: %6d\n",
186 1.3 lukem Player.p_gold, Player.p_gems, Player.p_level, Player.p_charms);
187 1.3 lukem printw("Shield: %9.0f Sword: %9.0f Quicksilver:%3.0f Blessed: %s\n",
188 1.3 lukem Player.p_shield, Player.p_sword, Player.p_quksilver,
189 1.3 lukem (Player.p_blessing ? " True" : "False"));
190 1.3 lukem printw("Brains: %9.0f Mana: %9.0f", Player.p_brains, Player.p_mana);
191 1.1 jtc
192 1.3 lukem move(5, 36);
193 1.3 lukem ch = getanswer("LPS", FALSE);
194 1.3 lukem move(15, 0);
195 1.3 lukem clrtobot();
196 1.3 lukem switch (ch) {
197 1.3 lukem case 'L': /* leave */
198 1.3 lukem case '\n':
199 1.3 lukem altercoordinates(0.0, 0.0, A_NEAR);
200 1.3 lukem return;
201 1.3 lukem
202 1.3 lukem case 'P': /* make purchase */
203 1.3 lukem mvaddstr(15, 0, "What what would you like to buy ? ");
204 1.3 lukem ch = getanswer(" 1234567", FALSE);
205 1.3 lukem move(15, 0);
206 1.3 lukem clrtoeol();
207 1.3 lukem
208 1.3 lukem if (ch - '0' > size)
209 1.3 lukem addstr("Sorry, this merchant doesn't have that.");
210 1.3 lukem else
211 1.3 lukem switch (ch) {
212 1.3 lukem case '1':
213 1.3 lukem printw("Mana is one per %.0f gold piece. How many do you want (%.0f max) ? ",
214 1.3 lukem Menu[0].cost, floor(Player.p_gold / Menu[0].cost));
215 1.3 lukem cost = (numitems = floor(infloat())) * Menu[0].cost;
216 1.3 lukem
217 1.3 lukem if (cost > Player.p_gold || numitems < 0)
218 1.3 lukem ++cheat;
219 1.3 lukem else {
220 1.3 lukem cheat = 0;
221 1.3 lukem Player.p_gold -= cost;
222 1.3 lukem if (drandom() < 0.02)
223 1.3 lukem dishonest = TRUE;
224 1.3 lukem else
225 1.3 lukem Player.p_mana += numitems;
226 1.3 lukem }
227 1.3 lukem break;
228 1.3 lukem
229 1.3 lukem case '2':
230 1.3 lukem printw("Shields are %.0f per +1. How many do you want (%.0f max) ? ",
231 1.3 lukem Menu[1].cost, floor(Player.p_gold / Menu[1].cost));
232 1.3 lukem cost = (numitems = floor(infloat())) * Menu[1].cost;
233 1.3 lukem
234 1.3 lukem if (numitems == 0.0)
235 1.3 lukem break;
236 1.3 lukem else
237 1.3 lukem if (cost > Player.p_gold || numitems < 0)
238 1.3 lukem ++cheat;
239 1.3 lukem else
240 1.3 lukem if (numitems < Player.p_shield)
241 1.3 lukem NOBETTER();
242 1.3 lukem else {
243 1.3 lukem cheat = 0;
244 1.3 lukem Player.p_gold -= cost;
245 1.3 lukem if (drandom() < 0.02)
246 1.3 lukem dishonest = TRUE;
247 1.3 lukem else
248 1.3 lukem Player.p_shield = numitems;
249 1.3 lukem }
250 1.3 lukem break;
251 1.3 lukem
252 1.3 lukem case '3':
253 1.3 lukem printw("A book costs %.0f gp. How many do you want (%.0f max) ? ",
254 1.3 lukem Menu[2].cost, floor(Player.p_gold / Menu[2].cost));
255 1.3 lukem cost = (numitems = floor(infloat())) * Menu[2].cost;
256 1.3 lukem
257 1.3 lukem if (cost > Player.p_gold || numitems < 0)
258 1.3 lukem ++cheat;
259 1.3 lukem else {
260 1.3 lukem cheat = 0;
261 1.3 lukem Player.p_gold -= cost;
262 1.3 lukem if (drandom() < 0.02)
263 1.3 lukem dishonest = TRUE;
264 1.3 lukem else
265 1.3 lukem if (drandom() * numitems > Player.p_level / 10.0
266 1.3 lukem && numitems != 1) {
267 1.3 lukem printw("\nYou blew your mind!\n");
268 1.3 lukem Player.p_brains /= 5;
269 1.3 lukem } else {
270 1.3 lukem Player.p_brains += floor(numitems) * ROLL(20, 8);
271 1.3 lukem }
272 1.3 lukem }
273 1.3 lukem break;
274 1.3 lukem
275 1.3 lukem case '4':
276 1.3 lukem printw("Swords are %.0f gp per +1. How many + do you want (%.0f max) ? ",
277 1.3 lukem Menu[3].cost, floor(Player.p_gold / Menu[3].cost));
278 1.3 lukem cost = (numitems = floor(infloat())) * Menu[3].cost;
279 1.3 lukem
280 1.3 lukem if (numitems == 0.0)
281 1.3 lukem break;
282 1.3 lukem else
283 1.3 lukem if (cost > Player.p_gold || numitems < 0)
284 1.3 lukem ++cheat;
285 1.3 lukem else
286 1.3 lukem if (numitems < Player.p_sword)
287 1.3 lukem NOBETTER();
288 1.3 lukem else {
289 1.3 lukem cheat = 0;
290 1.3 lukem Player.p_gold -= cost;
291 1.3 lukem if (drandom() < 0.02)
292 1.3 lukem dishonest = TRUE;
293 1.3 lukem else
294 1.3 lukem Player.p_sword = numitems;
295 1.3 lukem }
296 1.3 lukem break;
297 1.3 lukem
298 1.3 lukem case '5':
299 1.3 lukem printw("A charm costs %.0f gp. How many do you want (%.0f max) ? ",
300 1.3 lukem Menu[4].cost, floor(Player.p_gold / Menu[4].cost));
301 1.3 lukem cost = (numitems = floor(infloat())) * Menu[4].cost;
302 1.3 lukem
303 1.3 lukem if (cost > Player.p_gold || numitems < 0)
304 1.3 lukem ++cheat;
305 1.3 lukem else {
306 1.3 lukem cheat = 0;
307 1.3 lukem Player.p_gold -= cost;
308 1.3 lukem if (drandom() < 0.02)
309 1.3 lukem dishonest = TRUE;
310 1.3 lukem else
311 1.3 lukem Player.p_charms += numitems;
312 1.3 lukem }
313 1.3 lukem break;
314 1.3 lukem
315 1.3 lukem case '6':
316 1.3 lukem printw("Quicksilver is %.0f gp per +1. How many + do you want (%.0f max) ? ",
317 1.3 lukem Menu[5].cost, floor(Player.p_gold / Menu[5].cost));
318 1.3 lukem cost = (numitems = floor(infloat())) * Menu[5].cost;
319 1.3 lukem
320 1.3 lukem if (numitems == 0.0)
321 1.3 lukem break;
322 1.3 lukem else
323 1.3 lukem if (cost > Player.p_gold || numitems < 0)
324 1.3 lukem ++cheat;
325 1.3 lukem else
326 1.3 lukem if (numitems < Player.p_quksilver)
327 1.3 lukem NOBETTER();
328 1.3 lukem else {
329 1.3 lukem cheat = 0;
330 1.3 lukem Player.p_gold -= cost;
331 1.3 lukem if (drandom() < 0.02)
332 1.3 lukem dishonest = TRUE;
333 1.3 lukem else
334 1.3 lukem Player.p_quksilver = numitems;
335 1.3 lukem }
336 1.3 lukem break;
337 1.3 lukem
338 1.3 lukem case '7':
339 1.3 lukem if (Player.p_blessing) {
340 1.3 lukem addstr("You already have a blessing.");
341 1.3 lukem break;
342 1.3 lukem }
343 1.3 lukem printw("A blessing requires a %.0f gp donation. Still want one ? ", blessingcost);
344 1.3 lukem ch = getanswer("NY", FALSE);
345 1.3 lukem
346 1.4 veego if (ch == 'Y') {
347 1.3 lukem if (Player.p_gold < blessingcost)
348 1.3 lukem ++cheat;
349 1.3 lukem else {
350 1.3 lukem cheat = 0;
351 1.3 lukem Player.p_gold -= blessingcost;
352 1.3 lukem if (drandom() < 0.02)
353 1.3 lukem dishonest = TRUE;
354 1.3 lukem else
355 1.3 lukem Player.p_blessing = TRUE;
356 1.3 lukem }
357 1.4 veego }
358 1.3 lukem break;
359 1.1 jtc }
360 1.3 lukem break;
361 1.1 jtc
362 1.3 lukem case 'S': /* sell gems */
363 1.3 lukem mvprintw(15, 0, "A gem is worth %.0f gp. How many do you want to sell (%.0f max) ? ",
364 1.3 lukem (double) N_GEMVALUE, Player.p_gems);
365 1.3 lukem numitems = floor(infloat());
366 1.1 jtc
367 1.3 lukem if (numitems > Player.p_gems || numitems < 0)
368 1.1 jtc ++cheat;
369 1.3 lukem else {
370 1.1 jtc cheat = 0;
371 1.3 lukem Player.p_gems -= numitems;
372 1.3 lukem Player.p_gold += numitems * N_GEMVALUE;
373 1.1 jtc }
374 1.3 lukem }
375 1.1 jtc
376 1.3 lukem if (cheat == 1)
377 1.3 lukem mvaddstr(17, 0, "Come on, merchants aren't stupid. Stop cheating.\n");
378 1.1 jtc else
379 1.3 lukem if (cheat == 2) {
380 1.3 lukem mvaddstr(17, 0, "You had your chance. This merchant happens to be\n");
381 1.3 lukem printw("a %.0f level magic user, and you made %s mad!\n",
382 1.3 lukem ROLL(Circle * 20.0, 40.0), (drandom() < 0.5) ? "him" : "her");
383 1.3 lukem altercoordinates(0.0, 0.0, A_FAR);
384 1.3 lukem Player.p_energy /= 2.0;
385 1.3 lukem ++Player.p_sin;
386 1.3 lukem more(23);
387 1.3 lukem return;
388 1.3 lukem } else
389 1.3 lukem if (dishonest) {
390 1.3 lukem mvaddstr(17, 0, "The merchant stole your money!");
391 1.3 lukem refresh();
392 1.3 lukem altercoordinates(Player.p_x - Player.p_x / 10.0,
393 1.3 lukem Player.p_y - Player.p_y / 10.0, A_SPECIFIC);
394 1.3 lukem sleep(2);
395 1.3 lukem return;
396 1.3 lukem }
397 1.1 jtc }
398 1.1 jtc }
399 1.1 jtc
400 1.3 lukem void
401 1.1 jtc displaystats()
402 1.1 jtc {
403 1.3 lukem mvprintw(0, 0, "%s%s\n", Player.p_name, descrlocation(&Player, FALSE));
404 1.3 lukem mvprintw(1, 0, "Level :%7.0f Energy :%9.0f(%9.0f) Mana :%9.0f Users:%3d\n",
405 1.3 lukem Player.p_level, Player.p_energy, Player.p_maxenergy + Player.p_shield,
406 1.3 lukem Player.p_mana, Users);
407 1.3 lukem mvprintw(2, 0, "Quick :%3.0f(%3.0f) Strength:%9.0f(%9.0f) Gold :%9.0f %s\n",
408 1.3 lukem Player.p_speed, Player.p_quickness + Player.p_quksilver, Player.p_might,
409 1.3 lukem Player.p_strength + Player.p_sword, Player.p_gold, descrstatus(&Player));
410 1.3 lukem }
411 1.1 jtc
412 1.3 lukem void
413 1.1 jtc allstatslist()
414 1.1 jtc {
415 1.3 lukem static char *flags[] = /* to print value of some bools */
416 1.3 lukem {
417 1.3 lukem "False",
418 1.3 lukem " True"
419 1.3 lukem };
420 1.3 lukem
421 1.3 lukem mvprintw(8, 0, "Type: %s\n", descrtype(&Player, FALSE));
422 1.1 jtc
423 1.3 lukem mvprintw(10, 0, "Experience: %9.0f", Player.p_experience);
424 1.3 lukem mvprintw(11, 0, "Brains : %9.0f", Player.p_brains);
425 1.3 lukem mvprintw(12, 0, "Magic Lvl : %9.0f", Player.p_magiclvl);
426 1.3 lukem mvprintw(13, 0, "Sin : %9.5f", Player.p_sin);
427 1.3 lukem mvprintw(14, 0, "Poison : %9.5f", Player.p_poison);
428 1.3 lukem mvprintw(15, 0, "Gems : %9.0f", Player.p_gems);
429 1.3 lukem mvprintw(16, 0, "Age : %9d", Player.p_age);
430 1.3 lukem mvprintw(10, 40, "Holy Water: %9d", Player.p_holywater);
431 1.3 lukem mvprintw(11, 40, "Amulets : %9d", Player.p_amulets);
432 1.3 lukem mvprintw(12, 40, "Charms : %9d", Player.p_charms);
433 1.3 lukem mvprintw(13, 40, "Crowns : %9d", Player.p_crowns);
434 1.3 lukem mvprintw(14, 40, "Shield : %9.0f", Player.p_shield);
435 1.3 lukem mvprintw(15, 40, "Sword : %9.0f", Player.p_sword);
436 1.3 lukem mvprintw(16, 40, "Quickslver: %9.0f", Player.p_quksilver);
437 1.3 lukem
438 1.3 lukem mvprintw(18, 0, "Blessing: %s Ring: %s Virgin: %s Palantir: %s",
439 1.3 lukem flags[(int)Player.p_blessing],
440 1.3 lukem flags[Player.p_ring.ring_type != R_NONE],
441 1.3 lukem flags[(int)Player.p_virgin],
442 1.3 lukem flags[(int)Player.p_palantir]);
443 1.3 lukem }
444 1.3 lukem
445 1.3 lukem char *
446 1.1 jtc descrtype(playerp, shortflag)
447 1.3 lukem struct player *playerp;
448 1.3 lukem bool shortflag;
449 1.1 jtc {
450 1.3 lukem int type; /* for caluculating result subscript */
451 1.3 lukem static char *results[] =/* description table */
452 1.3 lukem {
453 1.3 lukem " Magic User", " MU",
454 1.3 lukem " Fighter", " F ",
455 1.3 lukem " Elf", " E ",
456 1.3 lukem " Dwarf", " D ",
457 1.3 lukem " Halfling", " H ",
458 1.3 lukem " Experimento", " EX",
459 1.3 lukem " Super", " S ",
460 1.3 lukem " King", " K ",
461 1.3 lukem " Council of Wise", " CW",
462 1.3 lukem " Ex-Valar", " EV",
463 1.3 lukem " Valar", " V ",
464 1.3 lukem " ? ", " ? "
465 1.3 lukem };
466 1.1 jtc
467 1.3 lukem type = playerp->p_type;
468 1.1 jtc
469 1.3 lukem switch (playerp->p_specialtype) {
470 1.1 jtc case SC_NONE:
471 1.3 lukem type = playerp->p_type;
472 1.3 lukem break;
473 1.1 jtc
474 1.1 jtc case SC_KING:
475 1.3 lukem type = 7;
476 1.3 lukem break;
477 1.1 jtc
478 1.1 jtc case SC_COUNCIL:
479 1.3 lukem type = 8;
480 1.3 lukem break;
481 1.1 jtc
482 1.1 jtc case SC_EXVALAR:
483 1.3 lukem type = 9;
484 1.3 lukem break;
485 1.1 jtc
486 1.1 jtc case SC_VALAR:
487 1.3 lukem type = 10;
488 1.3 lukem break;
489 1.1 jtc }
490 1.1 jtc
491 1.3 lukem type *= 2; /* calculate offset */
492 1.1 jtc
493 1.3 lukem if (type > 20)
494 1.3 lukem /* error */
495 1.3 lukem type = 22;
496 1.3 lukem
497 1.3 lukem if (shortflag)
498 1.3 lukem /* use short descriptions */
499 1.3 lukem ++type;
500 1.3 lukem
501 1.3 lukem if (playerp->p_crowns > 0) {
502 1.3 lukem strcpy(Databuf, results[type]);
503 1.3 lukem Databuf[0] = '*';
504 1.3 lukem return (Databuf);
505 1.3 lukem } else
506 1.3 lukem return (results[type]);
507 1.1 jtc }
508 1.1 jtc
509 1.1 jtc long
510 1.1 jtc findname(name, playerp)
511 1.3 lukem char *name;
512 1.3 lukem struct player *playerp;
513 1.1 jtc {
514 1.3 lukem long loc = 0; /* location in the file */
515 1.1 jtc
516 1.3 lukem fseek(Playersfp, 0L, 0);
517 1.3 lukem while (fread((char *) playerp, SZ_PLAYERSTRUCT, 1, Playersfp) == 1) {
518 1.3 lukem if (strcmp(playerp->p_name, name) == 0) {
519 1.3 lukem if (playerp->p_status != S_NOTUSED || Wizard)
520 1.3 lukem /* found it */
521 1.3 lukem return (loc);
522 1.3 lukem }
523 1.3 lukem loc += SZ_PLAYERSTRUCT;
524 1.1 jtc }
525 1.1 jtc
526 1.3 lukem return (-1);
527 1.1 jtc }
528 1.1 jtc
529 1.1 jtc long
530 1.1 jtc allocrecord()
531 1.1 jtc {
532 1.3 lukem long loc = 0L; /* location in file */
533 1.1 jtc
534 1.3 lukem fseek(Playersfp, 0L, 0);
535 1.3 lukem while (fread((char *) &Other, SZ_PLAYERSTRUCT, 1, Playersfp) == 1) {
536 1.3 lukem if (Other.p_status == S_NOTUSED)
537 1.3 lukem /* found an empty record */
538 1.3 lukem return (loc);
539 1.3 lukem else
540 1.3 lukem loc += SZ_PLAYERSTRUCT;
541 1.1 jtc }
542 1.1 jtc
543 1.3 lukem /* make a new record */
544 1.3 lukem initplayer(&Other);
545 1.3 lukem Player.p_status = S_OFF;
546 1.3 lukem writerecord(&Other, loc);
547 1.1 jtc
548 1.3 lukem return (loc);
549 1.3 lukem }
550 1.3 lukem
551 1.3 lukem void
552 1.1 jtc freerecord(playerp, loc)
553 1.3 lukem struct player *playerp;
554 1.3 lukem long loc;
555 1.1 jtc {
556 1.3 lukem playerp->p_name[0] = CH_MARKDELETE;
557 1.3 lukem playerp->p_status = S_NOTUSED;
558 1.3 lukem writerecord(playerp, loc);
559 1.3 lukem }
560 1.1 jtc
561 1.3 lukem void
562 1.1 jtc leavegame()
563 1.1 jtc {
564 1.1 jtc
565 1.3 lukem if (Player.p_level < 1.0)
566 1.3 lukem /* delete character */
567 1.3 lukem freerecord(&Player, Fileloc);
568 1.3 lukem else {
569 1.3 lukem Player.p_status = S_OFF;
570 1.3 lukem writerecord(&Player, Fileloc);
571 1.1 jtc }
572 1.1 jtc
573 1.3 lukem cleanup(TRUE);
574 1.3 lukem /* NOTREACHED */
575 1.1 jtc }
576 1.1 jtc
577 1.3 lukem void
578 1.1 jtc death(how)
579 1.3 lukem char *how;
580 1.1 jtc {
581 1.3 lukem FILE *fp; /* for updating various files */
582 1.3 lukem int ch; /* input */
583 1.3 lukem static char *deathmesg[] =
584 1.1 jtc /* add more messages here, if desired */
585 1.1 jtc {
586 1.3 lukem "You have been wounded beyond repair. ",
587 1.3 lukem "You have been disemboweled. ",
588 1.3 lukem "You've been mashed, mauled, and spit upon. (You're dead.)\n",
589 1.3 lukem "You died! ",
590 1.3 lukem "You're a complete failure -- you've died!!\n",
591 1.3 lukem "You have been dealt a fatal blow! "
592 1.1 jtc };
593 1.1 jtc
594 1.3 lukem clear();
595 1.1 jtc
596 1.3 lukem if (strcmp(how, "Stupidity") != 0) {
597 1.3 lukem if (Player.p_level > 9999.0)
598 1.3 lukem /* old age */
599 1.3 lukem addstr("Characters must be retired upon reaching level 10000. Sorry.");
600 1.3 lukem else
601 1.3 lukem if (Player.p_lives > 0)
602 1.3 lukem /* extra lives */
603 1.3 lukem {
604 1.3 lukem addstr("You should be more cautious. You've been killed.\n");
605 1.3 lukem printw("You only have %d more chance(s).\n", --Player.p_lives);
606 1.3 lukem more(3);
607 1.3 lukem Player.p_energy = Player.p_maxenergy;
608 1.3 lukem return;
609 1.3 lukem } else
610 1.3 lukem if (Player.p_specialtype == SC_VALAR) {
611 1.3 lukem addstr("You had your chances, but Valar aren't totally\n");
612 1.3 lukem addstr("immortal. You are now left to wither and die . . .\n");
613 1.3 lukem more(3);
614 1.3 lukem Player.p_brains = Player.p_level / 25.0;
615 1.3 lukem Player.p_energy = Player.p_maxenergy /= 5.0;
616 1.3 lukem Player.p_quksilver = Player.p_sword = 0.0;
617 1.3 lukem Player.p_specialtype = SC_COUNCIL;
618 1.3 lukem return;
619 1.3 lukem } else
620 1.3 lukem if (Player.p_ring.ring_inuse &&
621 1.3 lukem (Player.p_ring.ring_type == R_DLREG || Player.p_ring.ring_type == R_NAZREG))
622 1.3 lukem /* good ring in use - saved
623 1.3 lukem * from death */
624 1.3 lukem {
625 1.3 lukem mvaddstr(4, 0, "Your ring saved you from death!\n");
626 1.3 lukem refresh();
627 1.3 lukem Player.p_ring.ring_type = R_NONE;
628 1.3 lukem Player.p_energy = Player.p_maxenergy / 12.0 + 1.0;
629 1.3 lukem if (Player.p_crowns > 0)
630 1.3 lukem --Player.p_crowns;
631 1.3 lukem return;
632 1.3 lukem } else
633 1.3 lukem if (Player.p_ring.ring_type == R_BAD
634 1.3 lukem || Player.p_ring.ring_type == R_SPOILED)
635 1.3 lukem /* bad ring in
636 1.3 lukem * possession; name
637 1.3 lukem * idiot after player */
638 1.3 lukem {
639 1.3 lukem mvaddstr(4, 0,
640 1.3 lukem "Your ring has taken control of you and turned you into a monster!\n");
641 1.3 lukem fseek(Monstfp, 13L * SZ_MONSTERSTRUCT, 0);
642 1.3 lukem fread((char *) &Curmonster, SZ_MONSTERSTRUCT, 1, Monstfp);
643 1.3 lukem strcpy(Curmonster.m_name, Player.p_name);
644 1.3 lukem fseek(Monstfp, 13L * SZ_MONSTERSTRUCT, 0);
645 1.3 lukem fwrite((char *) &Curmonster, SZ_MONSTERSTRUCT, 1, Monstfp);
646 1.3 lukem fflush(Monstfp);
647 1.3 lukem }
648 1.3 lukem }
649 1.3 lukem enterscore(); /* update score board */
650 1.3 lukem
651 1.3 lukem /* put info in last dead file */
652 1.3 lukem fp = fopen(_PATH_LASTDEAD, "w");
653 1.3 lukem fprintf(fp, "%s (%s, run by %s, level %.0f, killed by %s)",
654 1.3 lukem Player.p_name, descrtype(&Player, TRUE),
655 1.3 lukem Player.p_login, Player.p_level, how);
656 1.3 lukem fclose(fp);
657 1.1 jtc
658 1.3 lukem /* let other players know */
659 1.3 lukem fp = fopen(_PATH_MESS, "w");
660 1.3 lukem fprintf(fp, "%s was killed by %s.", Player.p_name, how);
661 1.3 lukem fclose(fp);
662 1.1 jtc
663 1.3 lukem freerecord(&Player, Fileloc);
664 1.1 jtc
665 1.3 lukem clear();
666 1.3 lukem move(10, 0);
667 1.3 lukem addstr(deathmesg[(int) ROLL(0.0, (double) sizeof(deathmesg) / sizeof(char *))]);
668 1.3 lukem addstr("Care to give it another try ? ");
669 1.3 lukem ch = getanswer("NY", FALSE);
670 1.3 lukem
671 1.3 lukem if (ch == 'Y') {
672 1.3 lukem cleanup(FALSE);
673 1.3 lukem execl(_PATH_GAMEPROG, "phantasia", "-s",
674 1.3 lukem (Wizard ? "-S" : (char *) NULL), 0);
675 1.3 lukem exit(0);
676 1.3 lukem /* NOTREACHED */
677 1.1 jtc }
678 1.3 lukem cleanup(TRUE);
679 1.3 lukem /* NOTREACHED */
680 1.1 jtc }
681 1.1 jtc
682 1.3 lukem void
683 1.1 jtc writerecord(playerp, place)
684 1.3 lukem struct player *playerp;
685 1.3 lukem long place;
686 1.1 jtc {
687 1.3 lukem fseek(Playersfp, place, 0);
688 1.3 lukem fwrite((char *) playerp, SZ_PLAYERSTRUCT, 1, Playersfp);
689 1.3 lukem fflush(Playersfp);
690 1.3 lukem }
691 1.1 jtc
692 1.1 jtc double
693 1.1 jtc explevel(experience)
694 1.3 lukem double experience;
695 1.1 jtc {
696 1.3 lukem if (experience < 1.1e7)
697 1.3 lukem return (floor(pow((experience / 1000.0), 0.4875)));
698 1.3 lukem else
699 1.3 lukem return (floor(pow((experience / 1250.0), 0.4865)));
700 1.3 lukem }
701 1.1 jtc
702 1.3 lukem void
703 1.1 jtc truncstring(string)
704 1.3 lukem char *string;
705 1.1 jtc {
706 1.3 lukem int length; /* length of string */
707 1.1 jtc
708 1.3 lukem length = strlen(string);
709 1.3 lukem while (string[--length] == ' ')
710 1.3 lukem string[length] = '\0';
711 1.3 lukem }
712 1.1 jtc
713 1.3 lukem void
714 1.1 jtc altercoordinates(xnew, ynew, operation)
715 1.3 lukem double xnew;
716 1.3 lukem double ynew;
717 1.3 lukem int operation;
718 1.3 lukem {
719 1.3 lukem switch (operation) {
720 1.3 lukem case A_FORCED: /* move with no checks */
721 1.3 lukem break;
722 1.3 lukem
723 1.3 lukem case A_NEAR: /* pick random coordinates near */
724 1.3 lukem xnew = Player.p_x + ROLL(1.0, 5.0);
725 1.3 lukem ynew = Player.p_y - ROLL(1.0, 5.0);
726 1.3 lukem /* fall through for check */
727 1.1 jtc
728 1.1 jtc case A_SPECIFIC: /* just move player */
729 1.3 lukem if (Beyond && fabs(xnew) < D_BEYOND && fabs(ynew) < D_BEYOND)
730 1.3 lukem /*
731 1.3 lukem * cannot move back from point of no return
732 1.3 lukem * pick the largest coordinate to remain unchanged
733 1.3 lukem */
734 1.1 jtc {
735 1.3 lukem if (fabs(xnew) > fabs(ynew))
736 1.3 lukem xnew = SGN(Player.p_x) * MAX(fabs(Player.p_x), D_BEYOND);
737 1.3 lukem else
738 1.3 lukem ynew = SGN(Player.p_y) * MAX(fabs(Player.p_y), D_BEYOND);
739 1.1 jtc }
740 1.3 lukem break;
741 1.1 jtc
742 1.3 lukem case A_FAR: /* pick random coordinates far */
743 1.3 lukem xnew = Player.p_x + SGN(Player.p_x) * ROLL(50 * Circle, 250 * Circle);
744 1.3 lukem ynew = Player.p_y + SGN(Player.p_y) * ROLL(50 * Circle, 250 * Circle);
745 1.3 lukem break;
746 1.1 jtc }
747 1.1 jtc
748 1.3 lukem /* now set location flags and adjust coordinates */
749 1.3 lukem Circle = CIRCLE(Player.p_x = floor(xnew), Player.p_y = floor(ynew));
750 1.3 lukem
751 1.3 lukem /* set up flags based upon location */
752 1.3 lukem Throne = Marsh = Beyond = FALSE;
753 1.3 lukem
754 1.3 lukem if (Player.p_x == 0.0 && Player.p_y == 0.0)
755 1.3 lukem Throne = TRUE;
756 1.3 lukem else
757 1.3 lukem if (Circle < 35 && Circle >= 20)
758 1.3 lukem Marsh = TRUE;
759 1.3 lukem else
760 1.3 lukem if (MAX(fabs(Player.p_x), fabs(Player.p_y)) >= D_BEYOND)
761 1.3 lukem Beyond = TRUE;
762 1.3 lukem
763 1.3 lukem Changed = TRUE;
764 1.3 lukem }
765 1.3 lukem
766 1.3 lukem void
767 1.1 jtc readrecord(playerp, loc)
768 1.3 lukem struct player *playerp;
769 1.3 lukem long loc;
770 1.1 jtc {
771 1.3 lukem fseek(Playersfp, loc, 0);
772 1.3 lukem fread((char *) playerp, SZ_PLAYERSTRUCT, 1, Playersfp);
773 1.1 jtc }
774 1.1 jtc
775 1.3 lukem void
776 1.1 jtc adjuststats()
777 1.1 jtc {
778 1.3 lukem double dtemp; /* for temporary calculations */
779 1.1 jtc
780 1.3 lukem if (explevel(Player.p_experience) > Player.p_level)
781 1.3 lukem /* move one or more levels */
782 1.1 jtc {
783 1.3 lukem movelevel();
784 1.3 lukem if (Player.p_level > 5.0)
785 1.3 lukem Timeout = TRUE;
786 1.3 lukem }
787 1.3 lukem if (Player.p_specialtype == SC_VALAR)
788 1.3 lukem /* valar */
789 1.3 lukem Circle = Player.p_level / 5.0;
790 1.3 lukem
791 1.3 lukem /* calculate effective quickness */
792 1.3 lukem dtemp = ((Player.p_gold + Player.p_gems / 2.0) - 1000.0) / Statptr->c_goldtote
793 1.3 lukem - Player.p_level;;
794 1.3 lukem dtemp = MAX(0.0, dtemp);/* gold slows player down */
795 1.3 lukem Player.p_speed = Player.p_quickness + Player.p_quksilver - dtemp;
796 1.3 lukem
797 1.3 lukem /* calculate effective strength */
798 1.3 lukem if (Player.p_poison > 0.0)
799 1.3 lukem /* poison makes player weaker */
800 1.3 lukem {
801 1.3 lukem dtemp = 1.0 - Player.p_poison * Statptr->c_weakness / 800.0;
802 1.3 lukem dtemp = MAX(0.1, dtemp);
803 1.3 lukem } else
804 1.3 lukem dtemp = 1.0;
805 1.3 lukem Player.p_might = dtemp * Player.p_strength + Player.p_sword;
806 1.3 lukem
807 1.3 lukem /* insure that important things are within limits */
808 1.3 lukem Player.p_quksilver = MIN(99.0, Player.p_quksilver);
809 1.3 lukem Player.p_mana = MIN(Player.p_mana,
810 1.3 lukem Player.p_level * Statptr->c_maxmana + 1000.0);
811 1.3 lukem Player.p_brains = MIN(Player.p_brains,
812 1.3 lukem Player.p_level * Statptr->c_maxbrains + 200.0);
813 1.3 lukem Player.p_charms = MIN(Player.p_charms, Player.p_level + 10.0);
814 1.3 lukem
815 1.3 lukem /*
816 1.3 lukem * some implementations have problems with floating point compare
817 1.3 lukem * we work around it with this stuff
818 1.3 lukem */
819 1.3 lukem Player.p_gold = floor(Player.p_gold) + 0.1;
820 1.3 lukem Player.p_gems = floor(Player.p_gems) + 0.1;
821 1.3 lukem Player.p_mana = floor(Player.p_mana) + 0.1;
822 1.3 lukem
823 1.3 lukem if (Player.p_ring.ring_type != R_NONE)
824 1.3 lukem /* do ring things */
825 1.3 lukem {
826 1.3 lukem /* rest to max */
827 1.3 lukem Player.p_energy = Player.p_maxenergy + Player.p_shield;
828 1.3 lukem
829 1.3 lukem if (Player.p_ring.ring_duration <= 0)
830 1.3 lukem /* clean up expired rings */
831 1.3 lukem switch (Player.p_ring.ring_type) {
832 1.3 lukem case R_BAD: /* ring drives player crazy */
833 1.3 lukem Player.p_ring.ring_type = R_SPOILED;
834 1.3 lukem Player.p_ring.ring_duration = (short) ROLL(10.0, 25.0);
835 1.3 lukem break;
836 1.1 jtc
837 1.3 lukem case R_NAZREG: /* ring disappears */
838 1.3 lukem Player.p_ring.ring_type = R_NONE;
839 1.3 lukem break;
840 1.1 jtc
841 1.3 lukem case R_SPOILED: /* ring kills player */
842 1.3 lukem death("A cursed ring");
843 1.3 lukem break;
844 1.1 jtc
845 1.3 lukem case R_DLREG: /* this ring doesn't expire */
846 1.3 lukem Player.p_ring.ring_duration = 0;
847 1.3 lukem break;
848 1.3 lukem }
849 1.1 jtc }
850 1.3 lukem if (Player.p_age / N_AGE > Player.p_degenerated)
851 1.3 lukem /* age player slightly */
852 1.1 jtc {
853 1.3 lukem ++Player.p_degenerated;
854 1.3 lukem if (Player.p_quickness > 23.0)
855 1.3 lukem Player.p_quickness *= 0.99;
856 1.3 lukem Player.p_strength *= 0.97;
857 1.3 lukem Player.p_brains *= 0.95;
858 1.3 lukem Player.p_magiclvl *= 0.97;
859 1.3 lukem Player.p_maxenergy *= 0.95;
860 1.3 lukem Player.p_quksilver *= 0.95;
861 1.3 lukem Player.p_sword *= 0.93;
862 1.3 lukem Player.p_shield *= 0.93;
863 1.1 jtc }
864 1.1 jtc }
865 1.1 jtc
866 1.3 lukem void
867 1.1 jtc initplayer(playerp)
868 1.3 lukem struct player *playerp;
869 1.1 jtc {
870 1.3 lukem playerp->p_experience =
871 1.3 lukem playerp->p_level =
872 1.3 lukem playerp->p_strength =
873 1.3 lukem playerp->p_sword =
874 1.3 lukem playerp->p_might =
875 1.3 lukem playerp->p_energy =
876 1.3 lukem playerp->p_maxenergy =
877 1.3 lukem playerp->p_shield =
878 1.3 lukem playerp->p_quickness =
879 1.3 lukem playerp->p_quksilver =
880 1.3 lukem playerp->p_speed =
881 1.3 lukem playerp->p_magiclvl =
882 1.3 lukem playerp->p_mana =
883 1.3 lukem playerp->p_brains =
884 1.3 lukem playerp->p_poison =
885 1.3 lukem playerp->p_gems =
886 1.3 lukem playerp->p_sin =
887 1.3 lukem playerp->p_1scratch =
888 1.3 lukem playerp->p_2scratch = 0.0;
889 1.3 lukem
890 1.3 lukem playerp->p_gold = ROLL(50.0, 75.0) + 0.1; /* give some gold */
891 1.3 lukem
892 1.3 lukem playerp->p_x = ROLL(-125.0, 251.0);
893 1.3 lukem playerp->p_y = ROLL(-125.0, 251.0); /* give random x, y */
894 1.3 lukem
895 1.3 lukem /* clear ring */
896 1.3 lukem playerp->p_ring.ring_type = R_NONE;
897 1.3 lukem playerp->p_ring.ring_duration = 0;
898 1.3 lukem playerp->p_ring.ring_inuse = FALSE;
899 1.3 lukem
900 1.3 lukem playerp->p_age = 0L;
901 1.3 lukem
902 1.3 lukem playerp->p_degenerated = 1; /* don't degenerate initially */
903 1.3 lukem
904 1.3 lukem playerp->p_type = C_FIGHTER; /* default */
905 1.3 lukem playerp->p_specialtype = SC_NONE;
906 1.3 lukem playerp->p_lives =
907 1.3 lukem playerp->p_crowns =
908 1.3 lukem playerp->p_charms =
909 1.3 lukem playerp->p_amulets =
910 1.3 lukem playerp->p_holywater =
911 1.3 lukem playerp->p_lastused = 0;
912 1.3 lukem playerp->p_status = S_NOTUSED;
913 1.3 lukem playerp->p_tampered = T_OFF;
914 1.3 lukem playerp->p_istat = I_OFF;
915 1.3 lukem
916 1.3 lukem playerp->p_palantir =
917 1.3 lukem playerp->p_blessing =
918 1.3 lukem playerp->p_virgin =
919 1.3 lukem playerp->p_blindness = FALSE;
920 1.3 lukem
921 1.3 lukem playerp->p_name[0] =
922 1.3 lukem playerp->p_password[0] =
923 1.3 lukem playerp->p_login[0] = '\0';
924 1.3 lukem }
925 1.1 jtc
926 1.3 lukem void
927 1.1 jtc readmessage()
928 1.1 jtc {
929 1.3 lukem move(3, 0);
930 1.3 lukem clrtoeol();
931 1.3 lukem fseek(Messagefp, 0L, 0);
932 1.3 lukem if (fgets(Databuf, SZ_DATABUF, Messagefp) != NULL)
933 1.3 lukem addstr(Databuf);
934 1.3 lukem }
935 1.1 jtc
936 1.3 lukem void
937 1.1 jtc error(whichfile)
938 1.3 lukem char *whichfile;
939 1.1 jtc {
940 1.3 lukem int (*funcp) __P((const char *,...));
941 1.1 jtc
942 1.3 lukem if (Windows) {
943 1.3 lukem funcp = printw;
944 1.3 lukem clear();
945 1.3 lukem } else
946 1.3 lukem funcp = printf;
947 1.3 lukem
948 1.3 lukem (*funcp) ("An unrecoverable error has occurred reading %s. (errno = %d)\n", whichfile, errno);
949 1.3 lukem (*funcp) ("Please run 'setup' to determine the problem.\n");
950 1.3 lukem cleanup(TRUE);
951 1.3 lukem /* NOTREACHED */
952 1.3 lukem }
953 1.1 jtc
954 1.1 jtc double
955 1.1 jtc distance(x1, x2, y1, y2)
956 1.3 lukem double x1, x2, y1, y2;
957 1.1 jtc {
958 1.3 lukem double deltax, deltay;
959 1.1 jtc
960 1.3 lukem deltax = x1 - x2;
961 1.3 lukem deltay = y1 - y2;
962 1.3 lukem return (sqrt(deltax * deltax + deltay * deltay));
963 1.3 lukem }
964 1.1 jtc
965 1.3 lukem void
966 1.1 jtc ill_sig(whichsig)
967 1.3 lukem int whichsig;
968 1.1 jtc {
969 1.3 lukem clear();
970 1.3 lukem if (!(whichsig == SIGINT || whichsig == SIGQUIT))
971 1.3 lukem printw("Error: caught signal # %d.\n", whichsig);
972 1.3 lukem cleanup(TRUE);
973 1.3 lukem /* NOTREACHED */
974 1.3 lukem }
975 1.1 jtc
976 1.3 lukem char *
977 1.1 jtc descrstatus(playerp)
978 1.3 lukem struct player *playerp;
979 1.1 jtc {
980 1.3 lukem switch (playerp->p_status) {
981 1.1 jtc case S_PLAYING:
982 1.3 lukem if (playerp->p_energy < 0.2 * (playerp->p_maxenergy + playerp->p_shield))
983 1.3 lukem return ("Low Energy");
984 1.3 lukem else
985 1.3 lukem if (playerp->p_blindness)
986 1.3 lukem return ("Blind");
987 1.3 lukem else
988 1.3 lukem return ("In game");
989 1.1 jtc
990 1.1 jtc case S_CLOAKED:
991 1.3 lukem return ("Cloaked");
992 1.1 jtc
993 1.1 jtc case S_INBATTLE:
994 1.3 lukem return ("In Battle");
995 1.1 jtc
996 1.1 jtc case S_MONSTER:
997 1.3 lukem return ("Encounter");
998 1.1 jtc
999 1.1 jtc case S_TRADING:
1000 1.3 lukem return ("Trading");
1001 1.1 jtc
1002 1.1 jtc case S_OFF:
1003 1.3 lukem return ("Off");
1004 1.1 jtc
1005 1.1 jtc case S_HUNGUP:
1006 1.3 lukem return ("Hung up");
1007 1.1 jtc
1008 1.1 jtc default:
1009 1.3 lukem return ("");
1010 1.1 jtc }
1011 1.1 jtc }
1012 1.1 jtc
1013 1.1 jtc double
1014 1.1 jtc drandom()
1015 1.1 jtc {
1016 1.3 lukem if (sizeof(int) != 2)
1017 1.3 lukem /* use only low bits */
1018 1.3 lukem return ((double) (random() & 0x7fff) / 32768.0);
1019 1.3 lukem else
1020 1.3 lukem return ((double) random() / 32768.0);
1021 1.3 lukem }
1022 1.1 jtc
1023 1.3 lukem void
1024 1.1 jtc collecttaxes(gold, gems)
1025 1.3 lukem double gold;
1026 1.3 lukem double gems;
1027 1.1 jtc {
1028 1.3 lukem FILE *fp; /* to update Goldfile */
1029 1.3 lukem double dtemp; /* for temporary calculations */
1030 1.3 lukem double taxes; /* tax liability */
1031 1.3 lukem
1032 1.3 lukem /* add to cache */
1033 1.3 lukem Player.p_gold += gold;
1034 1.3 lukem Player.p_gems += gems;
1035 1.1 jtc
1036 1.3 lukem /* calculate tax liability */
1037 1.3 lukem taxes = N_TAXAMOUNT / 100.0 * (N_GEMVALUE * gems + gold);
1038 1.1 jtc
1039 1.3 lukem if (Player.p_gold < taxes)
1040 1.3 lukem /* not enough gold to pay taxes, must convert some gems to
1041 1.3 lukem * gold */
1042 1.1 jtc {
1043 1.3 lukem dtemp = floor(taxes / N_GEMVALUE + 1.0); /* number of gems to
1044 1.3 lukem * convert */
1045 1.1 jtc
1046 1.3 lukem if (Player.p_gems >= dtemp)
1047 1.3 lukem /* player has enough to convert */
1048 1.3 lukem {
1049 1.3 lukem Player.p_gems -= dtemp;
1050 1.3 lukem Player.p_gold += dtemp * N_GEMVALUE;
1051 1.3 lukem } else
1052 1.3 lukem /* take everything; this should never happen */
1053 1.3 lukem {
1054 1.3 lukem Player.p_gold += Player.p_gems * N_GEMVALUE;
1055 1.3 lukem Player.p_gems = 0.0;
1056 1.3 lukem taxes = Player.p_gold;
1057 1.3 lukem }
1058 1.1 jtc }
1059 1.3 lukem Player.p_gold -= taxes;
1060 1.1 jtc
1061 1.3 lukem if ((fp = fopen(_PATH_GOLD, "r+")) != NULL)
1062 1.3 lukem /* update taxes */
1063 1.1 jtc {
1064 1.3 lukem dtemp = 0.0;
1065 1.3 lukem fread((char *) &dtemp, sizeof(double), 1, fp);
1066 1.3 lukem dtemp += floor(taxes);
1067 1.3 lukem fseek(fp, 0L, 0);
1068 1.3 lukem fwrite((char *) &dtemp, sizeof(double), 1, fp);
1069 1.3 lukem fclose(fp);
1070 1.1 jtc }
1071 1.1 jtc }
1072