|
|
1.1 root 1: /*
2: * score.c
3: *
4: * This source herein may be modified and/or distributed by anybody who
5: * so desires, with the following restrictions:
6: * 1.) No portion of this notice shall be removed.
7: * 2.) Credit shall not be taken for the creation of this source.
8: * 3.) This code is not to be traded, sold, or used for personal
9: * gain or profit.
10: *
11: */
12:
13: #ifndef lint
14: static char sccsid[] = "@(#)score.c 5.2 (Berkeley) 11/25/87";
15: #endif /* not lint */
16:
17: #include <stdio.h>
18: #include "rogue.h"
19:
20: extern char login_name[];
21: extern char *m_names[];
22: extern short max_level;
23: extern boolean score_only, no_skull, msg_cleared;
24: extern char *byebye_string, *nick_name;
25:
26: killed_by(monster, other)
27: object *monster;
28: short other;
29: {
30: char buf[128];
31:
32: md_ignore_signals();
33:
34: if (other != QUIT) {
35: rogue.gold = ((rogue.gold * 9) / 10);
36: }
37:
38: if (other) {
39: switch(other) {
40: case HYPOTHERMIA:
41: (void) strcpy(buf, "died of hypothermia");
42: break;
43: case STARVATION:
44: (void) strcpy(buf, "died of starvation");
45: break;
46: case POISON_DART:
47: (void) strcpy(buf, "killed by a dart");
48: break;
49: case QUIT:
50: (void) strcpy(buf, "quit");
51: break;
52: case KFIRE:
53: (void) strcpy(buf, "killed by fire");
54: break;
55: }
56: } else {
57: (void) strcpy(buf, "Killed by ");
58: if (is_vowel(m_names[monster->m_char - 'A'][0])) {
59: (void) strcat(buf, "an ");
60: } else {
61: (void) strcat(buf, "a ");
62: }
63: (void) strcat(buf, m_names[monster->m_char - 'A']);
64: }
65: (void) strcat(buf, " with ");
66: sprintf(buf+strlen(buf), "%ld gold", rogue.gold);
67: if ((!other) && (!no_skull)) {
68: clear();
69: mvaddstr(4, 32, "__---------__");
70: mvaddstr(5, 30, "_~ ~_");
71: mvaddstr(6, 29, "/ \\");
72: mvaddstr(7, 28, "~ ~");
73: mvaddstr(8, 27, "/ \\");
74: mvaddstr(9, 27, "| XXXX XXXX |");
75: mvaddstr(10, 27, "| XXXX XXXX |");
76: mvaddstr(11, 27, "| XXX XXX |");
77: mvaddstr(12, 28, "\\ @ /");
78: mvaddstr(13, 29, "--\\ @@@ /--");
79: mvaddstr(14, 30, "| | @@@ | |");
80: mvaddstr(15, 30, "| | | |");
81: mvaddstr(16, 30, "| vvVvvvvvvvVvv |");
82: mvaddstr(17, 30, "| ^^^^^^^^^^^ |");
83: mvaddstr(18, 31, "\\_ _/");
84: mvaddstr(19, 33, "~---------~");
85: center(21, nick_name);
86: center(22, buf);
87: } else {
88: message(buf, 0);
89: }
90: message("", 0);
91: put_scores(monster, other);
92: }
93:
94: win()
95: {
96: unwield(rogue.weapon); /* disarm and relax */
97: unwear(rogue.armor);
98: un_put_on(rogue.left_ring);
99: un_put_on(rogue.right_ring);
100:
101: clear();
102: mvaddstr(10, 11, "@ @ @@@ @ @ @ @ @ @@@ @ @ @");
103: mvaddstr(11, 11, " @ @ @ @ @ @ @ @ @ @ @ @@ @ @");
104: mvaddstr(12, 11, " @ @ @ @ @ @ @ @ @ @ @ @ @ @");
105: mvaddstr(13, 11, " @ @ @ @ @ @ @ @ @ @ @ @@");
106: mvaddstr(14, 11, " @ @@@ @@@ @@ @@ @@@ @ @ @");
107: mvaddstr(17, 11, "Congratulations, you have been admitted to the");
108: mvaddstr(18, 11, "Fighters' Guild. You return home, sell all your");
109: mvaddstr(19, 11, "treasures at great profit and retire into comfort.");
110: message("", 0);
111: message("", 0);
112: id_all();
113: sell_pack();
114: put_scores((object *) 0, WIN);
115: }
116:
117: quit(from_intrpt)
118: boolean from_intrpt;
119: {
120: char buf[128];
121: short i, orow, ocol;
122: boolean mc;
123:
124: md_ignore_signals();
125:
126: if (from_intrpt) {
127: orow = rogue.row;
128: ocol = rogue.col;
129:
130: mc = msg_cleared;
131:
132: for (i = 0; i < DCOLS; i++) {
133: buf[i] = mvinch(0, i);
134: }
135: }
136: check_message();
137: message("really quit?", 1);
138: if (rgetchar() != 'y') {
139: md_heed_signals();
140: check_message();
141: if (from_intrpt) {
142: for (i = 0; i < DCOLS; i++) {
143: mvaddch(0, i, buf[i]);
144: }
145: msg_cleared = mc;
146: move(orow, ocol);
147: refresh();
148: }
149: return;
150: }
151: if (from_intrpt) {
152: clean_up(byebye_string);
153: }
154: check_message();
155: killed_by((object *) 0, QUIT);
156: }
157:
158: put_scores(monster, other)
159: object *monster;
160: short other;
161: {
162: short i, n, rank = 10, x, ne = 0, found_player = -1;
163: char scores[10][82];
164: char n_names[10][30];
165: char buf[128];
166: FILE *fp;
167: long s;
168: boolean pause = score_only;
169:
170: md_lock(1);
171:
172: if ((fp = fopen(SCORE_FILE, "a+")) == NULL) {
173: message("cannot read/write/create score file", 0);
174: sf_error();
175: }
176: rewind(fp);
177: (void) xxx(1);
178:
179: for (i = 0; i < 10; i++) {
180: if (((n = fread(scores[i], sizeof(char), 80, fp)) < 80) && (n != 0)) {
181: sf_error();
182: } else if (n != 0) {
183: xxxx(scores[i], 80);
184: if ((n = fread(n_names[i], sizeof(char), 30, fp)) < 30) {
185: sf_error();
186: }
187: xxxx(n_names[i], 30);
188: } else {
189: break;
190: }
191: ne++;
192: if ((!score_only) && (found_player == -1)) {
193: if (!name_cmp(scores[i]+15, login_name)) {
194: x = 5;
195: while (scores[i][x] == ' ') {
196: x++;
197: }
198: s = lget_number(scores[i] + x);
199: if (rogue.gold < s) {
200: score_only = 1;
201: } else {
202: found_player = i;
203: }
204: }
205: }
206: }
207: if (found_player != -1) {
208: ne--;
209: for (i = found_player; i < ne; i++) {
210: (void) strcpy(scores[i], scores[i+1]);
211: (void) strcpy(n_names[i], n_names[i+1]);
212: }
213: }
214: if (!score_only) {
215: for (i = 0; i < ne; i++) {
216: x = 5;
217: while (scores[i][x] == ' ') {
218: x++;
219: }
220: s = lget_number(scores[i] + x);
221:
222: if (rogue.gold >= s) {
223: rank = i;
224: break;
225: }
226: }
227: if (ne == 0) {
228: rank = 0;
229: } else if ((ne < 10) && (rank == 10)) {
230: rank = ne;
231: }
232: if (rank < 10) {
233: insert_score(scores, n_names, nick_name, rank, ne, monster,
234: other);
235: if (ne < 10) {
236: ne++;
237: }
238: }
239: rewind(fp);
240: }
241:
242: clear();
243: mvaddstr(3, 30, "Top Ten Rogueists");
244: mvaddstr(8, 0, "Rank Score Name");
245:
246: md_ignore_signals();
247:
248: (void) xxx(1);
249:
250: for (i = 0; i < ne; i++) {
251: if (i == rank) {
252: standout();
253: }
254: if (i == 9) {
255: scores[i][0] = '1';
256: scores[i][1] = '0';
257: } else {
258: scores[i][0] = ' ';
259: scores[i][1] = i + '1';
260: }
261: nickize(buf, scores[i], n_names[i]);
262: mvaddstr(i+10, 0, buf);
263: if (rank < 10) {
264: xxxx(scores[i], 80);
265: fwrite(scores[i], sizeof(char), 80, fp);
266: xxxx(n_names[i], 30);
267: fwrite(n_names[i], sizeof(char), 30, fp);
268: }
269: if (i == rank) {
270: standend();
271: }
272: }
273: md_lock(0);
274: refresh();
275: fclose(fp);
276: message("", 0);
277: if (pause) {
278: message("", 0);
279: }
280: clean_up("");
281: }
282:
283: insert_score(scores, n_names, n_name, rank, n, monster, other)
284: char scores[][82];
285: char n_names[][30];
286: char *n_name;
287: short rank, n;
288: object *monster;
289: {
290: short i;
291: char buf[128];
292:
293: if (n > 0) {
294: for (i = n; i > rank; i--) {
295: if ((i < 10) && (i > 0)) {
296: (void) strcpy(scores[i], scores[i-1]);
297: (void) strcpy(n_names[i], n_names[i-1]);
298: }
299: }
300: }
301: sprintf(buf, "%2d %6d %s: ", rank+1, rogue.gold, login_name);
302:
303: if (other) {
304: switch(other) {
305: case HYPOTHERMIA:
306: (void) strcat(buf, "died of hypothermia");
307: break;
308: case STARVATION:
309: (void) strcat(buf, "died of starvation");
310: break;
311: case POISON_DART:
312: (void) strcat(buf, "killed by a dart");
313: break;
314: case QUIT:
315: (void) strcat(buf, "quit");
316: break;
317: case WIN:
318: (void) strcat(buf, "a total winner");
319: break;
320: case KFIRE:
321: (void) strcpy(buf, "killed by fire");
322: break;
323: }
324: } else {
325: (void) strcat(buf, "killed by ");
326: if (is_vowel(m_names[monster->m_char - 'A'][0])) {
327: (void) strcat(buf, "an ");
328: } else {
329: (void) strcat(buf, "a ");
330: }
331: (void) strcat(buf, m_names[monster->m_char - 'A']);
332: }
333: sprintf(buf+strlen(buf), " on level %d ", max_level);
334: if ((other != WIN) && has_amulet()) {
335: (void) strcat(buf, "with amulet");
336: }
337: for (i = strlen(buf); i < 79; i++) {
338: buf[i] = ' ';
339: }
340: buf[79] = 0;
341: (void) strcpy(scores[rank], buf);
342: (void) strcpy(n_names[rank], n_name);
343: }
344:
345: is_vowel(ch)
346: short ch;
347: {
348: return( (ch == 'a') ||
349: (ch == 'e') ||
350: (ch == 'i') ||
351: (ch == 'o') ||
352: (ch == 'u') );
353: }
354:
355: sell_pack()
356: {
357: object *obj;
358: short row = 2, val;
359: char buf[DCOLS];
360:
361: obj = rogue.pack.next_object;
362:
363: clear();
364: mvaddstr(1, 0, "Value Item");
365:
366: while (obj) {
367: if (obj->what_is != FOOD) {
368: obj->identified = 1;
369: val = get_value(obj);
370: rogue.gold += val;
371:
372: if (row < DROWS) {
373: sprintf(buf, "%5d ", val);
374: get_desc(obj, buf+11);
375: mvaddstr(row++, 0, buf);
376: }
377: }
378: obj = obj->next_object;
379: }
380: refresh();
381: if (rogue.gold > MAX_GOLD) {
382: rogue.gold = MAX_GOLD;
383: }
384: message("", 0);
385: }
386:
387: get_value(obj)
388: object *obj;
389: {
390: short wc;
391: int val;
392:
393: wc = obj->which_kind;
394:
395: switch(obj->what_is) {
396: case WEAPON:
397: val = id_weapons[wc].value;
398: if ((wc == ARROW) || (wc == DAGGER) || (wc == SHURIKEN) ||
399: (wc == DART)) {
400: val *= obj->quantity;
401: }
402: val += (obj->d_enchant * 85);
403: val += (obj->hit_enchant * 85);
404: break;
405: case ARMOR:
406: val = id_armors[wc].value;
407: val += (obj->d_enchant * 75);
408: if (obj->is_protected) {
409: val += 200;
410: }
411: break;
412: case WAND:
413: val = id_wands[wc].value * (obj->class + 1);
414: break;
415: case SCROL:
416: val = id_scrolls[wc].value * obj->quantity;
417: break;
418: case POTION:
419: val = id_potions[wc].value * obj->quantity;
420: break;
421: case AMULET:
422: val = 5000;
423: break;
424: case RING:
425: val = id_rings[wc].value * (obj->class + 1);
426: break;
427: }
428: if (val <= 0) {
429: val = 10;
430: }
431: return(val);
432: }
433:
434: id_all()
435: {
436: short i;
437:
438: for (i = 0; i < SCROLS; i++) {
439: id_scrolls[i].id_status = IDENTIFIED;
440: }
441: for (i = 0; i < WEAPONS; i++) {
442: id_weapons[i].id_status = IDENTIFIED;
443: }
444: for (i = 0; i < ARMORS; i++) {
445: id_armors[i].id_status = IDENTIFIED;
446: }
447: for (i = 0; i < WANDS; i++) {
448: id_wands[i].id_status = IDENTIFIED;
449: }
450: for (i = 0; i < POTIONS; i++) {
451: id_potions[i].id_status = IDENTIFIED;
452: }
453: }
454:
455: name_cmp(s1, s2)
456: char *s1, *s2;
457: {
458: short i = 0;
459: int r;
460:
461: while(s1[i] != ':') {
462: i++;
463: }
464: s1[i] = 0;
465: r = strcmp(s1, s2);
466: s1[i] = ':';
467: return(r);
468: }
469:
470: xxxx(buf, n)
471: char *buf;
472: short n;
473: {
474: short i;
475: unsigned char c;
476:
477: for (i = 0; i < n; i++) {
478:
479: /* It does not matter if accuracy is lost during this assignment */
480: c = (unsigned char) xxx(0);
481:
482: buf[i] ^= c;
483: }
484: }
485:
486: long
487: xxx(st)
488: boolean st;
489: {
490: static long f, s;
491: long r;
492:
493: if (st) {
494: f = 37;
495: s = 7;
496: return(0L);
497: }
498: r = ((f * s) + 9337) % 8887;
499: f = s;
500: s = r;
501: return(r);
502: }
503:
504: nickize(buf, score, n_name)
505: char *buf, *score, *n_name;
506: {
507: short i = 15, j;
508:
509: if (!n_name[0]) {
510: (void) strcpy(buf, score);
511: } else {
512: (void) strncpy(buf, score, 16);
513:
514: while (score[i] != ':') {
515: i++;
516: }
517:
518: (void) strcpy(buf+15, n_name);
519: j = strlen(buf);
520:
521: while (score[i]) {
522: buf[j++] = score[i++];
523: }
524: buf[j] = 0;
525: buf[79] = 0;
526: }
527: }
528:
529: center(row, buf)
530: short row;
531: char *buf;
532: {
533: short margin;
534:
535: margin = ((DCOLS - strlen(buf)) / 2);
536: mvaddstr(row, margin, buf);
537: }
538:
539: sf_error()
540: {
541: md_lock(0);
542: message("", 1);
543: clean_up("sorry, score file is out of order");
544: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.