Mercurial > ~darius > hgwebdir.cgi > paradise_server
diff src/snake.c @ 6:8c6d5731234d
First entry of Paradise Server 2.9 patch 10 Beta
author | darius |
---|---|
date | Sat, 06 Dec 1997 04:37:04 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/snake.c Sat Dec 06 04:37:04 1997 +0000 @@ -0,0 +1,395 @@ +/*-------------------------------------------------------------------------- +NETREK II -- Paradise + +Permission to use, copy, modify, and distribute this software and its +documentation, or any derivative works thereof, for any NON-COMMERCIAL +purpose and without fee is hereby granted, provided that this copyright +notice appear in all copies. No representations are made about the +suitability of this software for any purpose. This software is provided +"as is" without express or implied warranty. + + Xtrek Copyright 1986 Chris Guthrie + Netrek (Xtrek II) Copyright 1989 Kevin P. Smith + Scott Silvey + Paradise II (Netrek II) Copyright 1993 Larry Denys + Kurt Olsen + Brandon Gillespie +--------------------------------------------------------------------------*/ + + +char binary[] = "@(#)snake"; + +#include "config.h" +#include <stdio.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/file.h> +#include <sys/time.h> +#include <signal.h> +#include <setjmp.h> +#include "defs.h" +#include "struct.h" +#include "data.h" +#include "shmem.h" + +#ifndef linux +double atof(); +#endif +extern void (*r_signal()) (); + +struct player *perfs[2]; +int printsnakeUsage(); +int num_perfs = 2; +int debug = 0; +int target = -1; +int berserk = 0; +int patrol = 0; +int noSmush = 0; +int plan_guard = 0; /* KAO */ +int planet1, planet2; /* KAO */ +int team1 = 0, team2 = 0; +int length = MAXTORP; /* how many pairs of torps in the snake */ + +struct itimerval udt; /* derived from frequency RF */ +int lastm; +int tno = 0; + +int +choose_team(team) +{ + if (tno < 0) + tno = team; + if (!team1) + team1 = 1 << team; + else if (!team2) + team2 = 1 << team; +} + +main(argc, argv) + int argc; + char **argv; +{ + register int i; + int snakemove(), exitSnake(); + int pno; + char str[80], tlet; + int pc = 0; + int usage = 0; + double frequency = 10; /* default of 10 updates per second */ + + argv0 = argv[0]; + tno = -1; + + srand48(getpid() + time((time_t *) 0)); + memset(perfs, 0, sizeof(perfs)); + + for (; argc > 1 && argv[1][0] == '-'; argc--, argv++) + { + switch (argv[1][1]) + { + case 'p': + patrol++; + break; + case 'n': + noSmush = 1; + break; + case 's': + noSmush = -1; + break; + case 'g': /* KAO */ + plan_guard++; /* KAO */ + argv++; /* KAO */ + argc--; + planet1 = atoi(argv[1]); /* KAO */ + argc--; + argv++; /* KAO */ + planet2 = atoi(argv[1]); /* KAO */ + break; /* KAO */ + case 'b': + berserk++; + break; + case 'd': + debug++; + break; + case 't': + { /* target */ + char c; + c = argv[1][2]; + target = -1; + if (c == '\0') + { + fprintf(stderr, "Must specify target. e.g. -t3.\n"); + exit(1); + } + if ((c >= '0') && (c <= '9')) + target = c - '0'; + else if ((c >= 'a') && (c <= 'z')) + target = c - 'a' + 10; + else + { + fprintf(stderr, "Must specify target. e.g. -t3.\n"); + exit(1); + } + } + break; + + case 'T': /* team */ + tlet = argv[1][2]; + if (isupper(tlet)) + tlet = tolower(tlet); + switch (tlet) + { + case 'f': + choose_team(0); + break; + case 'r': + choose_team(1); + break; + case 'k': + choose_team(2); + break; + case 'o': + choose_team(3); + break; + case 'i': + tno = 4; + break; + default: + fprintf(stderr, "Unknown team type. Usage -Tx where x is [frkoi]\n"); + exit(1); + } /* end switch argv */ + break; + + case 'l': + length = atoi(argv[1] + 2); + if (length < 1) + { + length = 1; + } + else if (length > MAXTORP) + { + length = MAXTORP; + } + break; + case 'f': + frequency = atof(argv[1] + 2); + if (frequency < 0) + { + frequency = 1; + } + break; + default: + fprintf(stderr, "Unknown option '%c'\n", argv[1][1]); + usage++; + exit(1); + } /* end switch argv[1][1] */ + } /* end for */ + + if (usage) + { + printsnakeUsage(); + exit(1); + } + + /* if -T wasn't specified default to FED */ + if (tno < 0) + tno = lrand48() % 4; + + /* XX -- teams imply patrol */ + if (team1 && team2) + patrol++; + +#ifdef nodef + /* debug */ + if (patrol) + { + printf("snake (%s): patrolling %s,%s\n", teamshort[1 << tno], + teamshort[team1], + teamshort[team2]); + } + fflush(stdout); +#endif + + /* readsysdefaults(); */ + + (void) r_signal(SIGHUP, exitSnake); + (void) r_signal(SIGINT, exitSnake); + (void) r_signal(SIGBUS, exitSnake); + (void) r_signal(SIGSEGV, exitSnake); + openmem(0, 0); + + lastm = mctl->mc_current; + + for (i = 0; i < 2; i++) + { /* two players per snake */ + pno = findrslot(); + if (pno < 0) + { + fprintf(stderr, "snake: no room in game\n"); + if (i > 0) + perfs[0]->p_status = PFREE; + exit(1); + } + me = &players[pno]; + + perfs[i] = me; + + me->p_no = pno; + myship = &me->p_ship; + mystats = &me->p_stats; + + strcpy(pseudo, "The Snake"); + strcpy(login, "SnkeChrmr"); + + strcpy(me->p_name, pseudo); + me->p_name[sizeof(me->p_name) - 1] = '\0'; + + (void) strncpy(me->p_login, login, sizeof(me->p_login)); + me->p_login[sizeof(me->p_login) - 1] = '\0'; + (void) strncpy(me->p_monitor, "Server", sizeof(me->p_monitor)); + me->p_monitor[sizeof(me->p_monitor) - 1] = '\0'; + /* enter(tno, 0, pno, class, -1); */ + + me->p_team = (tno < 4) ? (1 << tno) : 0; + config(); + + me->p_pos = -1; + me->p_flags |= PFROBOT; /* Mark as a robot */ + me->p_flags |= PFSNAKE; /* Mark as snake */ + if (berserk) + me->p_hostile = FED | ROM | ORI | KLI; + } + + r_signal(SIGALRM, snakemove); + + { + double period = 1 / frequency; + udt.it_interval.tv_sec = period; /* get the whole part */ + period -= udt.it_interval.tv_sec; /* get the fractional part */ + udt.it_interval.tv_usec = 1e6 * period; + udt.it_value.tv_sec = 1; + udt.it_value.tv_usec = 0; + } + + if (setitimer(ITIMER_REAL, &udt, 0) < 0) + { + perror("setitimer"); + for (i = 0; i < num_perfs; i++) + { + if (perfs[i]) + perfs[i]->p_status = PFREE; + } + exit(1); + } +#ifndef SVR4 + /* allows robots to be forked by the daemon -- Evil ultrix bullshit */ + sigsetmask(0); +#endif /* SVR4 */ + + /* NOTE: snakes do not become alive. */ + + while (1) + { + pause(); + } +} + +findtestslot() +{ + register int i; + + for (i = MAXPLAYER - configvals->ntesters; i < MAXPLAYER; i++) + { + if (players[i].p_status == PFREE) + { /* We have a free slot */ + players[i].p_status = POUTFIT; /* possible race code */ + break; + } + } + if (i == MAXPLAYER) + { + return -1; /* no room in tester slots */ + } + memset(&players[i].p_stats, 0, sizeof(struct stats)); + players[i].p_stats.st_tticks = 1; + return (i); +} + +findrslot() +{ + register int i; + + /* look for tester slot first */ + i = findtestslot(); + if (i > -1) + return i; + + for (i = 0; i < MAXPLAYER; i++) + { + if (players[i].p_status == PFREE) + { /* We have a free slot */ + players[i].p_status = POUTFIT; /* possible race code */ + break; + } + } + if ((i == MAXPLAYER) || (i == -1)) + { + if (debug) + { + fprintf(stderr, "No more room in game\n"); + } + return -1; + } + memset(&players[i].p_stats, 0, sizeof(struct stats)); + players[i].p_stats.st_tticks = 1; + return (i); +} + +void +warning(mess) + char *mess; +{ + if (debug) + fprintf(stderr, "warning: %s\n", mess); +} + +config() +{ + /* mostly not used */ +#if 0 + /* what the heck is this procedure for ? */ + myship->s_phasercost = 0; + myship->s_torpcost = 0; + myship->s_cloakcost = 0; + myship->s_torpfuse = 1000000; + myship->s_torpdamage = 10; + myship->s_plasmadamage = 50; + myship->s_plasmacost = 0; + myship->s_plasmaturns = 0; + myship->s_plasmaspeed = 10; + myship->s_plasmafuse = 1000000; + myship->s_wpncoolrate = 100; + myship->s_egncoolrate = 100; +#endif +} + +/*---------------------[ prints the usage of snake ]---------------------*/ + +printsnakeUsage() +{ + printf("Usage: snake [options]\n"); + printf("Options:\n\ + -u -- this usage message\n\ + -p -- patrol\n\ + -s -- noSmush (?)\n\ + -b -- berserk\n\ + -d -- debug\n\ + -t -- target <player number>\n\ + -T -- team [frkoi]\n\ + -l -- length (in torps)\n\ + -f -- frequency\n\ + -g -- guardian: -g <planet1> <planet2> (must be 2 planets listed,\n\ + by number).\n"); +} + +/*--------------------------[ printsnakeUsage ]--------------------------*/