comparison rogue5/scedit.c @ 33:f502bf60e6e4

Import Rogue 5.4 from the Roguelike Restoration Project (r1490)
author elwin
date Mon, 24 May 2010 20:10:59 +0000
parents
children 3d4252fa2ed3
comparison
equal deleted inserted replaced
32:2dcd75e6a736 33:f502bf60e6e4
1 /*
2 * score editor
3 *
4 * @(#)score.c 4.6 (Berkeley) 02/05/99
5 *
6 * Rogue: Exploring the Dungeons of Doom
7 * Copyright (C) 1980-1983, 1985, 1999 Michael Toy, Ken Arnold and Glenn Wichman
8 * All rights reserved.
9 *
10 * See the file LICENSE.TXT for full copyright and licensing information.
11 */
12
13 # include <curses.h>
14 # include <stdio.h>
15 # include <signal.h>
16 # include <ctype.h>
17
18 #ifndef TRUE
19 # define TRUE 1
20 #endif
21 # define FALSE 0
22 # define RN (((seed = seed*11109+13849) >> 16) & 0xffff)
23
24 # define MAXSTR 80
25
26 # include "score.h"
27
28 SCORE top_ten[10];
29
30 char buf[BUFSIZ],
31 *reason[] = {
32 "killed",
33 "quit",
34 "A total winner",
35 "killed with amulet",
36 };
37
38 int seed;
39 FILE *inf;
40
41 struct passwd *getpwnam();
42 int do_comm();
43 int pr_score(SCORE *, int);
44
45 int
46 main(int ac, char *av[])
47 {
48 char *scorefile;
49 FILE *outf;
50
51 if (ac == 1)
52 scorefile = "rogue54.scr";
53 else
54 scorefile = av[1];
55 seed = md_getpid();
56
57 if ((inf = fopen(scorefile, "r+")) < 0) {
58 perror(scorefile);
59 exit(1);
60 }
61 s_encread((char *) top_ten, sizeof top_ten, inf);
62
63 while (do_comm())
64 continue;
65
66 exit(0);
67 }
68
69 /*
70 * do_comm:
71 * Get and execute a command
72 */
73 int
74 do_comm(void)
75 {
76 char *sp;
77 SCORE *scp;
78 struct passwd *pp;
79 static FILE *outf = NULL;
80 static int written = TRUE;
81
82 printf("\nCommand: ");
83 while (isspace(buf[0] = getchar()) || buf[0] == '\n')
84 continue;
85 (void) fget(s&buf[1], BUFSIZ, stdin);
86 buf[strlen(buf) - 1] = '\0';
87 switch (buf[0]) {
88 case 'w':
89 if (strncmp(buf, "write", strlen(buf)))
90 goto def;
91 lseek(inf, 0L, 0);
92 if (outf == NULL && (outf = fdopen(inf, "w")) == NULL) {
93 perror("fdopen");
94 exit(1);
95 }
96 fseek(outf, 0L, 0);
97 if (s_lock_sc())
98 {
99 void (*fp)(int);
100
101 fp = signal(SIGINT, SIG_IGN);
102 s_encwrite((char *) top_ten, sizeof top_ten, outf);
103 s_unlock_sc();
104 signal(SIGINT, fp);
105 written = TRUE;
106 }
107 break;
108
109 case 'a':
110 if (strncmp(buf, "add", strlen(buf)))
111 goto def;
112 add_score();
113 written = FALSE;
114 break;
115
116 case 'd':
117 if (strncmp(buf, "delete", strlen(buf)))
118 goto def;
119 del_score();
120 written = FALSE;
121 break;
122
123 case 'p':
124 if (strncmp(buf, "print", strlen(buf)))
125 goto def;
126 printf("\nTop Ten Rogueists:\nRank\tScore\tName\n");
127 for (scp = top_ten; scp < &top_ten[10]; scp++)
128 if (!pr_score(scp, TRUE))
129 break;
130 break;
131
132 case 'q':
133 if (strncmp(buf, "quit", strlen(buf)))
134 goto def;
135 if (!written) {
136 printf("No write\n");
137 written = TRUE;
138 }
139 else
140 return FALSE;
141 break;
142
143 default:
144 def:
145 printf("Unkown command: \"%s\"\n", buf);
146 }
147 return TRUE;
148 }
149
150 /*
151 * add_score:
152 * Add a score to the score file
153 */
154
155 void
156 add_score(void)
157 {
158 SCORE *scp;
159 uid_t id = 0;
160 int i;
161 SCORE new;
162
163 printf("Name: ");
164 (void) fgets(new.sc_name, MAXSTR, stdin);
165 new.sc_name[strlen(new.sc_name) - 1] = '\0';
166 do {
167 printf("reason: ");
168 if ((new.sc_flags = getchar()) < '0' || new.sc_flags > '2') {
169 for (i = 0; i < 3; i++)
170 printf("%d: %s\n", i, reason[i]);
171 ungetc(new.sc_flags, stdin);
172 }
173 while (getchar() != '\n')
174 continue;
175 } while (new.sc_flags < '0' || new.sc_flags > '2');
176 new.sc_flags -= '0';
177 do {
178 printf("User Id: ");
179 (void) fgets(buf, BUFSIZ, stdin);
180 buf[strlen(buf) - 1] = '\0';
181 id = atoi(buf);
182 } while (id == -1);
183 new.sc_uid = id;
184 do {
185 printf("Monster: ");
186 if (!isalpha(new.sc_monster = getchar())) {
187 printf("type A-Za-z [%s]\n", unctrl(new.sc_monster));
188 ungetc(new.sc_monster, stdin);
189 }
190 while (getchar() != '\n')
191 continue;
192 } while (!isalpha(new.sc_monster));
193 printf("Score: ");
194 scanf("%d", &new.sc_score);
195 printf("level: ");
196 scanf("%d", &new.sc_level);
197 while (getchar() != '\n')
198 continue;
199 pr_score(&new, FALSE);
200 printf("Really add it? ");
201 if (getchar() != 'y')
202 return;
203 while (getchar() != '\n')
204 continue;
205 insert_score(&new);
206 }
207
208 /*
209 * pr_score:
210 * Print out a score entry. Return FALSE if last entry.
211 */
212
213 pr_score(SCORE *scp, int num)
214 {
215 if (scp->sc_score) {
216 if (num)
217 printf("%d", scp - top_ten + 1);
218 printf("\t%d\t%s: %s on level %d", scp->sc_score, scp->sc_name,
219 reason[scp->sc_flags], scp->sc_level);
220 if (scp->sc_flags == 0)
221 printf(" by %s", s_killname(scp->sc_monster, TRUE));
222
223 printf(" (%s)", md_getrealname(scp->sc_uid));
224 putchar('\n');
225 }
226 return scp->sc_score;
227 }
228
229 /*
230 * insert_score:
231 * Insert a score into the top ten list
232 */
233
234 insert_score(SCORE *new)
235 {
236 SCORE *scp, *sc2;
237 int flags, amount;
238 uid_t uid;
239
240 flags = new->sc_flags;
241 uid = new->sc_uid;
242 amount = new->sc_score;
243
244 for (scp = top_ten; scp < &top_ten[10]; scp++)
245 if (amount > scp->sc_score)
246 break;
247 else if (flags != 2 && scp->sc_uid == uid && scp->sc_flags != 2)
248 scp = &top_ten[10];
249 if (scp < &top_ten[10]) {
250 if (flags != 2)
251 for (sc2 = scp; sc2 < &top_ten[10]; sc2++) {
252 if (sc2->sc_uid == uid && sc2->sc_flags != 2)
253 break;
254 }
255 else
256 sc2 = &top_ten[9];
257 while (sc2 > scp) {
258 *sc2 = sc2[-1];
259 sc2--;
260 }
261 *scp = *new;
262 sc2 = scp;
263 }
264 }
265
266 /*
267 * del_score:
268 * Delete a score from the score list.
269 */
270 void
271 del_score(void)
272 {
273 SCORE *scp;
274 int i;
275 int num;
276
277 for (;;) {
278 printf("Which score? ");
279 (void) fgets(buf, BUFSIZ, stdin);
280 if (buf[0] == '\n')
281 return;
282 sscanf(buf, "%d", &num);
283 if (num < 1 || num > 10)
284 printf("range is 1-10\n");
285 else
286 break;
287 }
288 num--;
289 for (scp = &top_ten[num]; scp < &top_ten[9]; scp++)
290 *scp = scp[1];
291 top_ten[9].sc_score = 0;
292 for (i = 0; i < MAXSTR; i++)
293 top_ten[9].sc_name[i] = RN;
294 top_ten[9].sc_flags = RN;
295 top_ten[9].sc_level = RN;
296 top_ten[9].sc_monster = RN;
297 top_ten[9].sc_uid = RN;
298 }