[BACK]Return to scedit.c CVS log [TXT][DIR] Up to [contributed] / early-roguelike / rogue5

Annotation of early-roguelike/rogue5/scedit.c, Revision 1.1.1.1

1.1       rubenllo    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_random_seed();
                     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: }

CVSweb