[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     ! 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