X-Git-Url: http://git.shiar.nl/netris.git/blobdiff_plain/c11ae0d113cc5f60bfd1bed29b47211013f8adef..4f561019fc85c2817e3a72341397d1df32bc0868:/util.c diff --git a/util.c b/util.c index b52d761..2f7c2e5 100644 --- a/util.c +++ b/util.c @@ -1,6 +1,6 @@ /* - * Netris -- A free networked version of Tetris - * Copyright (C) 1994,1995 Mark Weaver + * Netris -- A free networked version of T*tris + * Copyright (C) 1994,1995,1996 Mark H. Weaver * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * - * $Id: util.c,v 1.26 1995/07/11 08:53:32 mhw Exp $ + * $Id: util.c,v 1.29 1999/05/16 06:56:33 mhw Exp $ */ #include "netris.h" @@ -30,29 +30,13 @@ #include static MyEventType AlarmGenFunc(EventGenRec *gen, MyEvent *event); - static EventGenRec alarmGen = { &alarmGen, 0, FT_read, -1, AlarmGenFunc, EM_alarm }; static EventGenRec *nextGen = &alarmGen; -static myRandSeed = 1; - -static struct timeval baseTimeval; - -ExtFunc void InitUtil(void) -{ - if (initSeed) - SRandom(initSeed); - else - SRandom(time(0)); - signal(SIGINT, CatchInt); - ResetBaseTime(); -} +static int myRandSeed = 1; -ExtFunc void ResetBaseTime(void) -{ - gettimeofday(&baseTimeval, NULL); -} +static long baseTimeval; ExtFunc void AtExit(void (*handler)(void)) { @@ -63,78 +47,89 @@ ExtFunc void AtExit(void (*handler)(void)) #endif } +///////////// HELP MESSAGES ///////////// + +ExtFunc void Header(void) +{ + fprintf(stderr, + "NETRIS %s\t(c) 1994-1996,1999 Mark H. Weaver \n" + " \t(c) 2002 Shiar \n\n", + version_string); +} //Header + ExtFunc void Usage(void) { + Header(); fprintf(stderr, - "Netris version %s (C) 1994,1995 Mark Weaver \n" - "Usage: netris \n" - " -h Print usage information\n" - " -w Wait for connection\n" - " -c Initiate connection\n" - " -p Set port number (default is %d)\n" - " -k Remap keys. The argument is a string containing\n" - " the keys in order: left, rotate, right, drop,\n" - " down-faster, toggle-spying, pause\n" - " -i Set the step-down interval, in seconds\n" - " -r Execute (a command) as a robot controlling\n" - " the game instead of the keyboard\n" - " -F Use fair robot interface\n" - " -s Start with given random seed\n" - " -D Drops go into drop mode\n" - " This means that sliding off a cliff after a drop causes\n" - " another drop automatically\n" - " -S Disable standout mode (inverse/bold) for slow terminals\n" - " -H Show distribution and warranty information\n" - " -R Show rules\n", - version_string, DEFAULT_PORT); + "Usage: netris \n" + "\n" + " -h, --help\t\tPrint this usage information\n" + " -H, --info\t\tShow distribution and warranty information\n" + " -R, --rules\t\tShow game rules\n" + "\n" + " -S, --slowterm\tDisable inverse/bold/color for slow terminals\n" + " -a, --ascii\t\tUse ascii characters\n" + " -C, --color=0\t\tDisable color\n" + "\n" + " -c, --connect \tInitiate connection\n" + " -p, --port \tSet port number (default is %d)\n" + "\n" + " -t, --team \tJoin a team (don't receive lines from your teammates)\n" + " -l, --level \tBegin at a higher level (can be used as handicap)\n" + " -k, --keys \tRemap keys (default is \"%s\" for cursors)\n" + " -d, --dropmode\tDrops go into drop mode\n" + " -D, --instadrop\tInstant drop\n" + "\n" + " -r, --robot \tExecute program to control the game instead of keyboard\n" + " -F, --fair-robot\tUse fair robot interface\n" + "\n", DEFAULT_PORT, DEFAULT_KEYS); } ExtFunc void DistInfo(void) { + Header(); fprintf(stderr, - "Netris version %s (C) 1994,1995 Mark Weaver \n" - "\n" - "This program is free software; you can redistribute it and/or modify\n" - "it under the terms of the GNU General Public License as published by\n" - "the Free Software Foundation; either version 2 of the License, or\n" - "(at your option) any later version.\n" - "\n" - "This program is distributed in the hope that it will be useful,\n" - "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" - "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" - "GNU General Public License for more details.\n" - "\n" - "You should have received a copy of the GNU General Public License\n" - "along with this program; if not, write to the Free Software\n" - "Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n", - version_string); -} + "This program is free software; you can redistribute it and/or modify\n" + "it under the terms of the GNU General Public License as published by\n" + "the Free Software Foundation; either version 2 of the License, or\n" + "(at your option) any later version.\n" + "\n" + "This program is distributed in the hope that it will be useful,\n" + "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" + "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" + "GNU General Public License for more details.\n" + "\n" + "You should have received a copy of the GNU General Public License\n" + "along with this program; if not, write to the Free Software\n" + "Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n" + "\n"); +} //DistInfo ExtFunc void Rules(void) { + Header(); fprintf(stderr, - "Netris version %s rules\n" - "\n" - "Two player mode\n" - "---------------\n" - "It's just like normal Tetris except that when you clear more than\n" - "one row with a single piece, the other player's board is moved up\n" - "and junk rows are added to the bottom. If you clear 2, 3 or 4\n" - "rows, 1, 2 or 4 junk rows are added to your opponent's board,\n" - "respectively. The junk rows have exactly one empty column.\n" - "For each group of junk rows given, the empty columns will line\n" - "up. This is intentional.\n" - "\n" - "The longest surviving player wins the game.\n" - "\n" - "One player mode\n" - "---------------\n" - "This mode is currently very boring, because there's no scoring\n" - "and it never gets any faster. This will be rectified at some point.\n" - "I'm not very motivated to do it right now because I'm sick of one\n" - "player Tetris.\n", - version_string); -} + "One player mode\n" + "---------------\n" + "Good old Tetris. Scoring is like on the GameBoy version (so try to\n" + "remove as many lines at once as you can). After removing ten lines\n" + "you go to the next level, which will be faster thus making the game\n" + "harder to play.\n" + "\n" + "Two player mode\n" + "---------------\n" + "It's just like normal T*tris except that when you clear more than\n" + "one row with a single piece, the other player receives penalty lines\n" + "For clearing 2, 3 or 4 rows, respectively 1, 2 or 4 junk rows will\n" + "be added to the bottom of your opponent's board respectively.\n" + "The junk rows have exactly one empty column, which will line up for\n" + "multiple rows.\n" + "\n" + "The longest surviving player wins the game.\n" + "\n"); +} //Rules + +///////////// RANDOM ///////////// /* * My really crappy random number generator follows @@ -142,15 +137,17 @@ ExtFunc void Rules(void) */ ExtFunc void SRandom(int seed) { - initSeed = seed; + Game.seed = seed; myRandSeed = seed % 31751 + 1; -} +} //SRandom ExtFunc int Random(int min, int max1) -{ +{ //return a random value myRandSeed = (myRandSeed * 31751 + 15437) % 32767; return myRandSeed % (max1 - min) + min; -} +} //Random + +///////////// I/O ///////////// ExtFunc int MyRead(int fd, void *data, int len) { @@ -167,7 +164,7 @@ ExtFunc int MyRead(int fd, void *data, int len) return result; } return len; -} +} //MyRead ExtFunc int MyWrite(int fd, void *data, int len) { @@ -184,7 +181,9 @@ ExtFunc int MyWrite(int fd, void *data, int len) return result; } return len; -} +} //MyWrite + +///////////// TIME ///////////// ExtFunc void NormalizeTime(struct timeval *tv) { @@ -196,11 +195,6 @@ ExtFunc void NormalizeTime(struct timeval *tv) } } -ExtFunc void CatchInt(int sig) -{ - exit(0); -} - ExtFunc void CatchAlarm(int sig) { alarmGen.ready = 1; @@ -212,26 +206,47 @@ static MyEventType AlarmGenFunc(EventGenRec *gen, MyEvent *event) return E_alarm; } -ExtFunc long CurTimeval(void) +ExtFunc void SetTimeval(struct timeval *tv, long usec) +{ + tv->tv_sec = usec / 1000000; + tv->tv_usec = usec % 1000000; +} //SetTimeval + +ExtFunc long GetTimeval(struct timeval *tv) +{ + return tv->tv_sec * 1000000 + tv->tv_usec; +} //GetTimeval + +ExtFunc long AbsTimeval(void) { struct timeval tv; gettimeofday(&tv, NULL); - tv.tv_sec -= baseTimeval.tv_sec; - tv.tv_usec -= baseTimeval.tv_usec; return GetTimeval(&tv); -} +} //CurTimeval -ExtFunc void SetTimeval(struct timeval *tv, long usec) +ExtFunc void ResetBaseTime(void) { - tv->tv_sec = usec / 1000000; - tv->tv_usec = usec % 1000000; -} + baseTimeval = AbsTimeval(); +} //ResetBaseTime -ExtFunc long GetTimeval(struct timeval *tv) +ExtFunc void PauseTime(void) { - return tv->tv_sec * 1000000 + tv->tv_usec; -} + baseTimeval -= AbsTimeval(); +} //PauseTime + +ExtFunc void ResumeTime(void) +{ + baseTimeval += AbsTimeval(); +} //ResumeTime + +ExtFunc long CurTimeval(void) +{ + struct timeval tv; + + gettimeofday(&tv, NULL); + return GetTimeval(&tv) - baseTimeval; +} //CurTimeval static long SetITimer1(long interval, long value) { @@ -255,6 +270,8 @@ ExtFunc long SetITimer(long interval, long value) return old; } +///////////// ... ///////////// + ExtFunc volatile void die(char *msg) { perror(msg); @@ -265,7 +282,7 @@ ExtFunc volatile void fatal(char *msg) { fprintf(stderr, "%s\n", msg); exit(1); -} +} //fatal ExtFunc void BlockSignals(MySigSet *saved, ...) { @@ -292,7 +309,7 @@ ExtFunc void BlockSignals(MySigSet *saved, ...) *saved = sigblock(set); #endif va_end(args); -} +} //BlockSignals ExtFunc void RestoreSignals(MySigSet *saved, MySigSet *set) { @@ -304,33 +321,36 @@ ExtFunc void RestoreSignals(MySigSet *saved, MySigSet *set) else sigsetmask(*set); #endif -} +} //RestoreSignals + +///////////// EVENTS ///////////// ExtFunc void AddEventGen(EventGenRec *gen) { assert(gen->next == NULL); gen->next = nextGen->next; nextGen->next = gen; -} +} //AddEventGen ExtFunc void RemoveEventGen(EventGenRec *gen) { - assert(gen->next != NULL); - while (nextGen->next != gen) - nextGen = nextGen->next; - nextGen->next = gen->next; - gen->next = NULL; -} + // assert(gen->next != NULL); /* Be more forgiving, for SIGINTs */ + if (gen->next) { + while (nextGen->next != gen) + nextGen = nextGen->next; + nextGen->next = gen->next; + gen->next = NULL; + } +} //RemoveEventGen ExtFunc MyEventType WaitMyEvent(MyEvent *event, int mask) -{ +{ //poll int i, retry = 0; fd_set fds[FT_len]; EventGenRec *gen; int result, anyReady, anySet; struct timeval tv; - /* XXX In certain circumstances, this routine does polling */ for (;;) { for (i = 0; i < FT_len; ++i) FD_ZERO(&fds[i]); @@ -374,5 +394,9 @@ ExtFunc MyEventType WaitMyEvent(MyEvent *event, int mask) } while (gen != nextGen); retry = 1; } -} +} //WaitMyEvent +/* + * vi: ts=4 ai + * vim: noai si + */