Mercurial > hg > early-roguelike
diff rogue5/scmisc.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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rogue5/scmisc.c Mon May 24 20:10:59 2010 +0000 @@ -0,0 +1,231 @@ +/* + * copies of several routines needed for score + * + * @(#)smisc.c 4.7 (Berkeley) 02/05/99 + * + * Rogue: Exploring the Dungeons of Doom + * Copyright (C) 1980-1983, 1985, 1999 Michael Toy, Ken Arnold and Glenn Wichman + * All rights reserved. + * + * See the file LICENSE.TXT for full copyright and licensing information. + */ + +# include <stdio.h> +# include <sys/types.h> +# include <sys/stat.h> +# include <ctype.h> + +# define TRUE 1 +# define FALSE 0 +# define MAXSTR 80 +# define when break;case +# define otherwise break;default + +typedef struct { + char *m_name; +} MONST; + +char *s_vowelstr(); + +char *lockfile = "/tmp/.fredlock"; + +char prbuf[MAXSTR]; /* buffer for sprintfs */ + +MONST monsters[] = { + { "aquator" }, { "bat" }, { "centaur" }, { "dragon" }, { "emu" }, + { "venus flytrap" }, { "griffin" }, { "hobgoblin" }, { "ice monster" }, + { "jabberwock" }, { "kobold" }, { "leprechaun" }, { "medusa" }, + { "nymph" }, { "orc" }, { "phantom" }, { "quasit" }, { "rattlesnake" }, + { "snake" }, { "troll" }, { "ur-vile" }, { "vampire" }, { "wraith" }, + { "xeroc" }, { "yeti" }, { "zombie" } +}; + +/* + * s_lock_sc: + * lock the score file. If it takes too long, ask the user if + * they care to wait. Return TRUE if the lock is successful. + */ +int +s_lock_sc(void) +{ + int cnt; + struct stat sbuf; + +over: + close(8); /* just in case there are no files left */ + if (creat(lockfile, 0000) >= 0) + return TRUE; + for (cnt = 0; cnt < 5; cnt++) + { + md_sleep(1); + if (creat(lockfile, 0000) >= 0) + return TRUE; + } + if (stat(lockfile, &sbuf) < 0) + { + creat(lockfile, 0000); + return TRUE; + } + if (time(NULL) - sbuf.st_mtime > 10) + { + if (md_unlink(lockfile) < 0) + return FALSE; + goto over; + } + else + { + printf("The score file is very busy. Do you want to wait longer\n"); + printf("for it to become free so your score can get posted?\n"); + printf("If so, type \"y\"\n"); + (void) fgets(prbuf, MAXSTR, stdin); + if (prbuf[0] == 'y') + for (;;) + { + if (creat(lockfile, 0000) >= 0) + return TRUE; + if (stat(lockfile, &sbuf) < 0) + { + creat(lockfile, 0000); + return TRUE; + } + if (time(NULL) - sbuf.st_mtime > 10) + { + if (md_unlink(lockfile) < 0) + return FALSE; + } + md_sleep(1); + } + else + return FALSE; + } +} + +/* + * s_unlock_sc: + * Unlock the score file + */ +void +s_unlock_sc(void) +{ + md_unlink(lockfile); +} + +/* + * s_encwrite: + * Perform an encrypted write + */ +void +s_encwrite(char *start, size_t size, FILE *outf) +{ + char *e1, *e2, fb; + int temp; + + e1 = encstr; + e2 = statlist; + fb = 0; + + while (size--) + { + putc(*start++ ^ *e1 ^ *e2 ^ fb, outf); + temp = *e1++; + fb += temp * *e2++; + if (*e1 == '\0') + e1 = encstr; + if (*e2 == '\0') + e2 = statlist; + } +} + +/* + * s_encread: + * Perform an encrypted read + */ + +s_encread(char *start, size_t size, int inf) +{ + char *e1, *e2, fb; + int temp; + int read_size; + + fb = 0; + + if ((read_size = read(inf, start, size)) == 0 || read_size == -1) + return; + + e1 = encstr; + e2 = statlist; + + while (size--) + { + *start++ ^= *e1 ^ *e2 ^ fb; + temp = *e1++; + fb += temp * *e2++; + if (*e1 == '\0') + e1 = encstr; + if (*e2 == '\0') + e2 = statlist; + } +} + +/* + * s_killname: + * Convert a code to a monster name + */ +char * +s_killname(int monst, int doart) +{ + char *sp; + int article; + + article = TRUE; + switch (monst) + { + case 'a': + sp = "arrow"; + when 'b': + sp = "bolt"; + when 'd': + sp = "dart"; + when 's': + sp = "starvation"; + article = FALSE; + when 'h': + sp = "hypothermia"; + article = FALSE; + otherwise: + if (isupper(monst)) + sp = monsters[monst-'A'].m_name; + else + { + sp = "God"; + article = FALSE; + } + } + if (doart && article) + sprintf(prbuf, "a%s ", s_vowelstr(sp)); + else + prbuf[0] = '\0'; + strcat(prbuf, sp); + return prbuf; +} + +/* + * s_vowelstr: + * For printfs: if string starts with a vowel, return "n" for an + * "an". + */ +char * +s_vowelstr(char *str) +{ + switch (*str) + { + case 'a': case 'A': + case 'e': case 'E': + case 'i': case 'I': + case 'o': case 'O': + case 'u': case 'U': + return "n"; + default: + return ""; + } +}