v12i049: stank, Part02/03
Jonathan Wesener
jojo at key.COM
Wed Mar 20 21:42:54 AEST 1991
Submitted-by: jojo at key.COM (Jonathan Wesener)
Posting-number: Volume 12, Issue 49
Archive-name: stank/part02
Submitted by: jojo at largo
Archive-name: stank/part 2
#!/bin/sh
# this is stank.02 (part 2 of stank)
# do not concatenate these parts, unpack them in order with /bin/sh
# file stank/expl.c continued
#
touch 2>&1 | fgrep '[-amc]' > /tmp/s3_touch$$
if [ -s /tmp/s3_touch$$ ]
then
TOUCH=can
else
TOUCH=cannot
fi
rm -f /tmp/s3_touch$$
CurArch=2
if test ! -r s3_seq_.tmp
then echo "Please unpack part 1 first!"
exit 1; fi
( read Scheck
if test "$Scheck" != $CurArch
then echo "Please unpack part $Scheck next!"
exit 1;
else exit 0; fi
) < s3_seq_.tmp || exit 1
echo "x - Continuing file stank/expl.c"
sed 's/^X//' << 'SHAR_EOF' >> stank/expl.c
X#define ESMALLSTART 4
X#define EXPLDELAY 30
X
Xexplode(tp,ktp,dmg,x,y)
X tank_t *tp;
X tank_t *ktp;
X int dmg;
X{
X expl_t *ep;
X int esize = ESMALL;
X
X
X /* see if we're blowing up a tank */
X if( tp ) {
X tp->t_damage -= dmg;
X
X if( tp->t_damage < 0 ) {
X Totenergy += tp->t_energy;
X esize = EBIG;
X tp->t_dead++;
X tank_reset(tp,EXPLDELAY);
X field[tp->t_x][tp->t_y] = FSPACE;
X fpts[tp->t_x][tp->t_y] = NULL;
X place_bonus(tp,x,y);
X place_tank(tp);
X if( ktp )
X ktp->t_kills++;
X }
X }
X
X /* if we're out of explosions, just continue */
X if( !Efree )
X return;
X
X ep = Efree;
X Efree = ep->e_next;
X
X ep->e_x = x;
X ep->e_y = y;
X ep->e_frm = (esize == ESMALL) ? ESMALLSTART : 0;
X ep->e_size = esize;
X ep->e_pri = EXPLPRI;
X
X ep->e_next = Evalid;
X Evalid = ep;
X}
X
X
Xcheckexpls()
X{
X expl_t *ep, *er, *en;
X
X
X /* walk down the list */
X for( ep = Evalid ; ep ; ep = er ) {
X
X er = ep->e_next;
X
X if( ++(ep->e_pri) < EXPLPRI )
X continue;
X
X ep->e_pri = 0;
X
X
X Servstate |= SSCUDFRC;
X
X if( ++(ep->e_frm) < EXPCNT )
X continue;
X
X /* remove the explosion */
X if( Evalid == ep )
X Evalid = ep->e_next;
X else {
X for( en = Evalid ; en->e_next != ep ; en = en->e_next );
X en->e_next = ep->e_next;
X }
X
X /* add to free list */
X ep->e_next = Efree;
X Efree = ep;
X }
X}
X
X/* Lint Output
X*/
SHAR_EOF
echo "File stank/expl.c is complete"
chmod 0400 stank/expl.c || echo "restore of stank/expl.c fails"
if [ $TOUCH = can ]
then
touch -am 0319105291 stank/expl.c
fi
set `wc -c stank/expl.c`;Wc_c=$1
if test "$Wc_c" != "2020"
then echo original size 2020, current size $Wc_c;fi
# ============= stank/heat.c ==============
echo "x - extracting stank/heat.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > stank/heat.c &&
X
X/*
X * Copyright (c) 1991 Jon Wesener
X * Gaming Software
X *
X * Permission to use, copy, modify, and distribute this
X * software and its documentation for any purpose and without
X * fee is hereby granted, provided that the above copyright
X * notice appear in all copies and that both that copyright
X * notice and this permission notice appear in supporting
X * documentation. No representations are made about the
X * suitability of this software for any purpose. It is
X * provided "as is" without express or implied warranty.
X *
X */
X
X#ident "@(#)heat.c 1.7 :/usr/key/jojow/X/src/guts/SCCS/s.heat.c 3/19/91 10:15:51 "
X
X/* heat.c - routines for handling heat seekers */
X
X#include "server.h"
X
X
X#define HEATRANGE 10
X
Xcheckheats()
X{
X register heat_t *hp;
X heat_t *hr;
X
X for( hp = Hvalid ; hp ; hp = hr ) {
X
X hr = hp->h_next;
X
X /* is it time to move the shell */
X if( ++(hp->h_pri) < HEATPRI )
X continue;
X
X hp->h_pri = 0;
X
X moveheat(hp);
X Servstate |= SSCUDFRC;
X }
X}
X
X
Xstatic int xmv[] = {0,1,0,-1};
Xstatic int ymv[] = {-1,0,1,0};
X
Xmoveheat(hp)
X register heat_t *hp;
X{
X int nx, ny;
X int dead = 0;
X tank_t *tp;
X
X
X nx = hp->h_x + xmv[hp->h_dir];
X ny = hp->h_y + ymv[hp->h_dir];
X
X /* aged missile */
X if( ++(hp->h_life) >= HEATLIFE )
X dead = 1;
X /* hit a wall? */
X else if( field[nx][ny] == FWALL ) {
X
X /* randomly change direction */
X if( rand() & 0x2)
X hp->h_dir++;
X else
X hp->h_dir += 3;
X
X hp->h_dir %= MAXDIR;
X nx = hp->h_x;
X ny = hp->h_y;
X }
X /* hit a tank? */
X else if( field[nx][ny] == FTANK ) {
X
X tp = (tank_t *)fpts[nx][ny];
X if( !TANKSAFE(tp) ) {
X dead = 1;
X
X explode(tp,hp->h_own,Heatdmg,nx,ny);
X }
X }
X /* change direction for other reasons? */
X else {
X int d = HEATRANGE, nd, dx, dy, dxs, dys;
X tank_t *ts = NULL;
X
X
X for( tp = Tvalid ; tp ; tp = tp->t_next ) {
X /* can we seek this tank? */
X if( (hp->h_own == tp) || TANKHID(tp) )
X continue;
X
X /* find the distance */
X nd = abs( dx = (tp->t_x - nx) ) + abs( dy = (tp->t_y - ny) );
X if( nd >= d )
X continue;
X
X d = nd;
X ts = tp;
X dxs = dx;
X dys = dy;
X }
X
X if( ts ) {
X int xdir, ydir, odir;
X
X xdir = ( dxs > 0 ) ? 1 : 3;
X ydir = ( dys > 0 ) ? 2 : 0;
X
X odir = hp->h_dir;
X
X if( !dxs )
X hp->h_dir = ydir;
X else if( !dys )
X hp->h_dir = xdir;
X else if( (xdir != odir) && (ydir != odir) )
X hp->h_dir = (abs(dxs) > abs(dys))? ydir: xdir;
X
X#if NOTDEF
X /* see if changing the direction dead ends the missile */
X if( field[nx+xmv[hp->h_dir]][ny+ymv[hp->h_dir]] == FWALL )
X hp->h_dir = odir;
X#endif /* NOTDEF */
X }
X }
X
X if( !dead ) {
X hp->h_x = nx;
X hp->h_y = ny;
X }
X /* shell gone? */
X else {
X heat_t *hr;
X
X
X hp->h_own->t_heatf--;
X
X /* kill it */
X if( Hvalid == hp )
X Hvalid = hp->h_next;
X else {
X for( hr = Hvalid ; hr->h_next != hp ; hr = hr->h_next );
X hr->h_next = hp->h_next;
X }
X
X hp->h_next = Hfree;
X Hfree = hp;
X }
X}
X
X
Xfire_heat(tp)
X register tank_t *tp;
X{
X heat_t *hp;
X
X
X /* any shells to fire? */
X if( tp->t_energy < Heatcost )
X return;
X
X tp->t_energy -= Heatcost;
X Totenergy += Heatcost;
X
X hp = Hfree;
X Hfree = hp->h_next;
X
X tp->t_heatf++;
X
X hp->h_x = tp->t_x;
X hp->h_y = tp->t_y;
X hp->h_dir = tp->t_dir;
X hp->h_pri = 0;
X hp->h_life = 0;
X hp->h_own = tp;
X
X hp->h_next = Hvalid;
X Hvalid = hp;
X}
X
X
Xrm_heats(tp)
X tank_t *tp;
X{
X heat_t *hp, *hr, *hn;
X
X /* remove all the mines belonging to tp */
X for( hp = Hvalid ; hp ; hp = hn ) {
X
X hn = hp->h_next;
X
X if( hp->h_own != tp )
X continue;
X
X /* kill it */
X if( Hvalid == hp )
X Hvalid = hp->h_next;
X else {
X for( hr = Hvalid ; hr->h_next != hp ; hr = hr->h_next );
X hr->h_next = hp->h_next;
X }
X
X hp->h_next = Hfree;
X Hfree = hp;
X }
X}
X
X
Xheatdest()
X{
X register heat_t *hp, *hr;
X
X
X /* Walk down the list and remove them */
X for( hr = hp = Hvalid ; hp ; hp = hp->h_next ) {
X hr = hp;
X
X hp->h_own->t_heatf--;
X }
X
X if( Hvalid ) {
X hr->h_next = Hfree;
X Hfree = Hvalid;
X Hvalid = NULL;
X }
X}
X
X
X/* Lint Output
X*/
SHAR_EOF
chmod 0400 stank/heat.c || echo "restore of stank/heat.c fails"
if [ $TOUCH = can ]
then
touch -am 0319105291 stank/heat.c
fi
set `wc -c stank/heat.c`;Wc_c=$1
if test "$Wc_c" != "3931"
then echo original size 3931, current size $Wc_c;fi
# ============= stank/mine.c ==============
echo "x - extracting stank/mine.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > stank/mine.c &&
X
X/*
X * Copyright (c) 1991 Jon Wesener
X * Gaming Software
X *
X * Permission to use, copy, modify, and distribute this
X * software and its documentation for any purpose and without
X * fee is hereby granted, provided that the above copyright
X * notice appear in all copies and that both that copyright
X * notice and this permission notice appear in supporting
X * documentation. No representations are made about the
X * suitability of this software for any purpose. It is
X * provided "as is" without express or implied warranty.
X *
X */
X
X#ident "@(#)mine.c 1.7 :/usr/key/jojow/X/src/guts/SCCS/s.mine.c 3/19/91 10:15:55 "
X
X/* mine.c - routines for handling mines */
X
X#include "server.h"
X
X
Xmineblow(tp,mp,nx,ny)
X tank_t *tp;
X mine_t *mp;
X int nx, ny;
X{
X mine_t *mr;
X tank_t *to;
X
X
X /* remove the mine */
X to = mp->m_own;
X to->t_minef--;
X
X /* kill it */
X if( Mvalid == mp )
X Mvalid = mp->m_next;
X else {
X for( mr = Mvalid ; mr->m_next != mp ; mr = mr->m_next );
X mr->m_next = mp->m_next;
X }
X
X field[nx][ny] = FSPACE;
X fpts[nx][ny] = (void *)NULL;
X
X mp->m_next = Mfree;
X Mfree = mp;
X
X explode(tp,mp->m_own,(tp && TANKSAFE(tp))?0:Minedmg,nx,ny);
X}
X
X
Xarm_mine(tp)
X register tank_t *tp;
X{
X /* can we afford it? */
X if( (tp->t_energy < Minecost) || (tp->t_state & TMINE) )
X return;
X
X tp->t_energy -= Minecost;
X Totenergy += Minecost;
X
X tp->t_state |= TMINE;
X
X tp->t_minef++;
X Servstate |= SSCUDFRC;
X}
X
X
Xdrop_mine(tp,x,y)
X register tank_t *tp;
X int x,y;
X{
X mine_t *mp;
X
X
X tp->t_state &= ~TMINE;
X
X mp = Mfree;
X Mfree = mp->m_next;
X
X mp->m_x = x;
X mp->m_y = y;
X mp->m_own = tp;
X field[x][y] = FMINE;
X fpts[x][y] = (void *)mp;
X
X mp->m_next = Mvalid;
X Mvalid = mp;
X
X Servstate |= SSCUDFRC;
X}
X
X
Xrm_mines(tp)
X tank_t *tp;
X{
X mine_t *mp, *mr, *mn;
X int nx, ny;
X
X
X /* remove all the mines belonging to tp */
X for( mp = Mvalid ; mp ; mp = mn ) {
X
X mn = mp->m_next;
X
X if( mp->m_own != tp )
X continue;
X
X /* kill it */
X if( Mvalid == mp )
X Mvalid = mp->m_next;
X else {
X for( mr = Mvalid ; mr->m_next != mp ; mr = mr->m_next );
X mr->m_next = mp->m_next;
X }
X
X mp->m_next = Mfree;
X Mfree = mp;
X
X /* remove the mine from the field */
X nx = mp->m_x;
X ny = mp->m_y;
X field[nx][ny] = FSPACE;
X fpts[nx][ny] = (void *)NULL;
X }
X}
X
X
Xminedest()
X{
X register mine_t *mp, *mr;
X
X
X /* Walk down the list and remove them */
X for( mp = Mvalid ; mp ; mp = mr ) {
X mr = mp->m_next;
X
X mineblow((tank_t *)NULL,mp,mp->m_x,mp->m_y);
X }
X}
X
X/* Lint Output
X*/
SHAR_EOF
chmod 0400 stank/mine.c || echo "restore of stank/mine.c fails"
if [ $TOUCH = can ]
then
touch -am 0319105291 stank/mine.c
fi
set `wc -c stank/mine.c`;Wc_c=$1
if test "$Wc_c" != "2441"
then echo original size 2441, current size $Wc_c;fi
# ============= stank/pow.c ==============
echo "x - extracting stank/pow.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > stank/pow.c &&
X
X/*
X * Copyright (c) 1991 Jon Wesener
X * Gaming Software
X *
X * Permission to use, copy, modify, and distribute this
X * software and its documentation for any purpose and without
X * fee is hereby granted, provided that the above copyright
X * notice appear in all copies and that both that copyright
X * notice and this permission notice appear in supporting
X * documentation. No representations are made about the
X * suitability of this software for any purpose. It is
X * provided "as is" without express or implied warranty.
X *
X */
X
X#ident "@(#)pow.c 1.6 :/usr/key/jojow/X/src/guts/SCCS/s.pow.c 3/19/91 10:15:59 "
X
X/* pow.c - routines for handling power pellets */
X
X#include "server.h"
X
X#define ENERGYSTORM 200
X
Xpowblow(tp,pp,x,y)
X tank_t *tp;
X pow_t *pp;
X int x, y;
X{
X if( tp->t_energy < Tmaxenergy )
X tp->t_energy += pp->p_val;
X else
X Totenergy += pp->p_val;
X
X /* remove it from the list */
X if( Pvalid == pp )
X Pvalid = pp->p_next;
X else {
X pow_t *pr;
X
X for( pr = Pvalid ; pr->p_next != pp ; pr = pr->p_next );
X pr->p_next = pp->p_next;
X }
X
X pp->p_next = Pfree;
X Pfree = pp;
X
X field[x][y] = FSPACE;
X fpts[x][y] = NULL;
X}
X
X
X#define VALCNT 10
Xstatic int powposvals[VALCNT] = {1,10,10,10,20,20,50,50,75,100};
X
Xcheckpows()
X{
X pow_t *pp;
X int x, y, pv;
X
X
X if( Totenergy < ENERGYSTORM )
X return;
X
X while( Totenergy >= 0 ) {
X if( !(pp = Pfree) )
X break;
X
X Pfree = pp->p_next;
X
X do {
X x = random() % MAZE_XL;
X y = random() % MAZE_YL;
X } while( field[x][y] != FSPACE );
X
X field[x][y] = FPOW;
X fpts[x][y] = (void *)pp;
X pp->p_x = x;
X pp->p_y = y;
X pv = random() % VALCNT;
X pp->p_val = powposvals[pv];
X Totenergy -= powposvals[pv];
X
X pp->p_next = Pvalid;
X Pvalid = pp;
X }
X}
X
Xpowdest(tp)
X tank_t *tp;
X{
X register pow_t *pp, *pr = NULL;
X
X
X /* Walk down the list and remove them */
X for( pr = pp = Pvalid ; pp ; pp = pp->p_next ) {
X pr = pp;
X tp->t_energy += pp->p_val;
X field[pp->p_x][pp->p_y] = FSPACE;
X fpts[pp->p_x][pp->p_y] = NULL;
X }
X
X /* move the entire list */
X if( Pvalid ) {
X pr->p_next = Pfree;
X Pfree = Pvalid;
X Pvalid = NULL;
X }
X}
X
X/* Lint Output
X*/
SHAR_EOF
chmod 0400 stank/pow.c || echo "restore of stank/pow.c fails"
if [ $TOUCH = can ]
then
touch -am 0319105291 stank/pow.c
fi
set `wc -c stank/pow.c`;Wc_c=$1
if test "$Wc_c" != "2094"
then echo original size 2094, current size $Wc_c;fi
# ============= stank/server.c ==============
echo "x - extracting stank/server.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > stank/server.c &&
X
X/*
X * Copyright (c) 1991 Jon Wesener
X * Gaming Software
X *
X * Permission to use, copy, modify, and distribute this
X * software and its documentation for any purpose and without
X * fee is hereby granted, provided that the above copyright
X * notice appear in all copies and that both that copyright
X * notice and this permission notice appear in supporting
X * documentation. No representations are made about the
X * suitability of this software for any purpose. It is
X * provided "as is" without express or implied warranty.
X *
X */
X
X#ident "@(#)server.c 1.25 :/usr/key/jojow/X/src/guts/SCCS/s.server.c 3/19/91 10:16:03 "
X
X/* server.c - tank server */
X
X
X#include <stdio.h>
X#include <rpc/rpc.h>
X#include <sys/time.h>
X#include <strings.h>
X
X#define SERVER 1
X
X#include "server.h"
X#include "tankmsg.h"
X
X#define MASK 0x40
X
Xstruct timeval ctv, ntv;
X
Xint Playercnt = 0;
X
Xchar maze[MAZE_XL*MAZE_YL + 1];
X
X/* Initialize and array and pass it in to initstate. */
Xstatic long state1[32] = { 3, 0x9a319039,
X 0x32d9c024, 0x9b663182, 0x5da1f342, 0x7449e56b,
X 0xbeb1dbb0, 0xab5c5918, 0x946554fd, 0x8c2e680f,
X 0xeb3d799f, 0xb11ee0b7, 0x2d436b86, 0xda672e2a,
X 0x1588ca88, 0xe369735d, 0x904f35f7, 0xd7158fd6,
X 0x6fa6f051, 0x616e6b96, 0xac94efdc, 0xde3b81e0,
X 0xdf0a6fb5, 0xf103bc02, 0x48f340fb, 0x36413f93,
X 0xc622c298, 0xf5a42ab8, 0x8a88d77b, 0xf5ad9d0e,
X 0x8999220b, 0x27fb47b9 };
X
Xchar *initstate(), *setstate();
X
X
Xserverinit()
X{
X unsigned seed = 1;
X int n = 128;
X int i;
X extern char *Mazefnm;
X
X
X /* load the maze */
X if( load_field(Mazefnm) ) {
X (void)fprintf(stderr,"serverinit: unable to load maze\n");
X exit( 1 );
X }
X
X Totenergy = 0;
X Svalid = Sfree = NULL;
X Mvalid = Mfree = NULL;
X Hvalid = Hfree = NULL;
X Evalid = Efree = NULL;
X Tvalid = Tfree = NULL;
X Pvalid = Pfree = NULL;
X Bvalid = Bfree = NULL;
X
X /* set up tanks */
X for( i = 0 ; i < MAXTANK ; i++ ) {
X tanks[i].t_id = i;
X tanks[i].t_msg = tanks[i].t_msgb;
X tanks[i].t_next = Tfree;
X Tfree = &tanks[i];
X }
X
X /* set up shells */
X for( i = 0 ; i < MAXSHELL ; i++ ) {
X shells[i].s_next = Sfree;
X Sfree = &shells[i];
X }
X
X /* set up mines */
X for( i = 0 ; i < MAXMINE ; i++ ) {
X mines[i].m_next = Mfree;
X Mfree = &mines[i];
X }
X
X /* set up heats */
X for( i = 0 ; i < MAXHEAT ; i++ ) {
X heats[i].h_next = Hfree;
X Hfree = &heats[i];
X }
X
X /* set up expls */
X for( i = 0 ; i < MAXEXPL ; i++ ) {
X expls[i].e_next = Efree;
X Efree = &expls[i];
X }
X
X /* set up pows */
X for( i = 0 ; i < MAXPOW ; i++ ) {
X pows[i].p_next = Pfree;
X Pfree = &pows[i];
X }
X
X /* set up bonus's */
X for( i = 0 ; i < MAXBON ; i++ ) {
X bons[i].b_next = Bfree;
X Bfree = &bons[i];
X }
X
X Servstate = 0;
X
X (void)gettimeofday(&ctv,(struct timezone *)NULL);
X nextupdtime();
X
X /* I am having greivous problems with this fucking random
X * number generator... */
X (void)initstate(seed, (char *)state1, n);
X (void)setstate((char *)state1);
X (void)srandom((int)ctv.tv_sec & 0xf);
X}
X
X
X/* to enter, pass in username */
Xchar **
Xtenter_1(msg)
X char **msg;
X{
X tank_t *tp;
X static char *failres;
X
X
X /* first ever initialization */
X if( !Playercnt )
X serverinit();
X
X /* see if we can fit player into the game */
X if( !Tfree ) {
X failres = "iF";
X return &failres;
X }
X
X /* set up the new player */
X tp = Tfree;
X Tfree = tp->t_next;
X
X tp->t_state = TVALID;
X tp->t_kills = tp->t_dead = 0;
X tp->t_dir = 0;
X tp->t_cmd = 0;
X tp->t_shellf = tp->t_minef = tp->t_heatf = 0;
X tp->t_hbmiss = tp->t_hbxs = 0;
X (void)strncpy(tp->t_name,*msg,MAXNM);
X
X place_tank(tp);
X tank_reset(tp,0);
X
X /* send back the id */
X (void)sprintf(tp->t_msgb,"i%c",tp->t_id+'0');
X
X (void)fprintf(stdout,"%s entering game with id = %d\n",*msg,tp->t_id);
X (void)fflush(stdout);
X
X /* link it into the game */
X tp->t_next = Tvalid;
X Tvalid = tp;
X
X Servstate |= SSCUDFRC | SSTUDFRC;
X
X Playercnt++;
X
X Totenergy += Energypt + Tenergy + Tenergy;
X
X return &tp->t_msg;
X}
X
X
X/* ARGSUSED */
Xint *
Xgetplyrcnt_1(dum)
X void *dum;
X{
X return &Playercnt;
X}
X
X
Xchar **
Xtexit_1(msg)
X char **msg;
X{
X int id;
X char *mp = *msg;
X tank_t *tp, *tr;
X
X id = mp[1] - '0';
X
X if( (id >= MAXTANK) || !(tanks[id].t_state & TVALID) ) {
X static char *fail = "Messed up!";
X
X (void)printf("texit_1: invalid id %d\n",id);
X return &fail;
X }
X
X tp = &tanks[id];
X
X (void)fprintf(stdout,"%s leaving game\n",tp->t_name);
X (void)fflush(stdout);
X
X explode(tp,(tank_t *)NULL,tp->t_damage + 1,tp->t_x,tp->t_y);
X
X tp->t_state = 0;
X
X /* remove from the valid queue */
X if( tp == Tvalid )
X Tvalid = tp->t_next;
X else {
X for( tr = Tvalid ; tr->t_next != tp ; tr = tr->t_next );
X tr->t_next = tp->t_next;
X }
X
X tp->t_next = Tfree;
X Tfree = tp;
X
X field[tp->t_x][tp->t_y] = FSPACE;
X fpts[tp->t_x][tp->t_y] = NULL;
X
X (void)sprintf(tp->t_msgb,"%s: died %d, kills %d\n",
X tp->t_name,tp->t_dead - 1, tp->t_kills);
X
X Servstate |= SSCUDFRC | SSTUDFRC;
X
X Playercnt--;
X
X Totenergy -= (Energypt + Tenergy);
X
X /* remove players resources */
X tank_cleanup(tp);
X
X return &tp->t_msg;
X}
X
X
X/* ARGSUSED */
Xchar **
Xgetmaze_1(msg)
X int **msg;
X{
X static char *mazep = maze;
X
X return &mazep;
X}
X
X
Xchar **
Xgetpos_1(msg)
X char **msg;
X{
X int id = 0;
X char *mp = *msg;
X tank_t *tp;
X
X /* find out who we are talking to */
X id = mp[1] - '0';
X
X#if DEBUG
X if( (id >= MAXTANK) || !(tanks[id].t_state & TVALID) ) {
X static char *failres;
X
X (void)printf("getpos_1: invalid id %d\n",id);
X failres = "T";
X return &failres;
X }
X#endif /* DEBUG */
X
X tp = &tanks[id];
X
X /* save away their move */
X if( mp[2] )
X tp->t_cmd = mp[2];
X
X tp->t_state |= THRTBEAT;
X
X /* time to update the screen? */
X if( timecheck() )
X recompute_screen();
X
X if( Servstate & SSCUDFRC ) {
X update_screen();
X Servstate &= ~SSCUDFRC;
X }
X
X /* send back screen info */
X if( tp->t_state & TSCUD )
X tp->t_state &= ~TSCUD;
X else
X tp->t_msgb[0] = '\0';
X
X return &tp->t_msg;
X}
X
X
Xnextupdtime()
X{
X /* add TIMESTEP to ctv */
X ntv.tv_usec = ctv.tv_usec + TIMESTEP;
X
X ntv.tv_sec = ctv.tv_sec;
X
X if( ntv.tv_usec > 1000000L ) {
X ntv.tv_usec -= 1000000L;
X ntv.tv_sec++;
X }
X}
X
X
Xtimecheck()
X{
X (void)gettimeofday(&ctv,(struct timezone *)NULL);
X
X if( ((ctv.tv_sec == ntv.tv_sec) && ctv.tv_usec > ntv.tv_usec) ||
X (ctv.tv_sec > ntv.tv_sec) ) {
X nextupdtime();
X return 1;
X }
X
X return 0;
X}
X
X
Xrecompute_screen()
X{
X checktanks();
X checkshells();
X checkheats();
X checkpows();
X checkexpls();
X checkbons();
X}
X
X
Xupdate_screen()
X{
X register char *cp;
X register tank_t *tp;
X register shell_t *sp;
X register mine_t *mp;
X register heat_t *hp;
X register expl_t *ep;
X register pow_t *pp;
X bon_t *bp;
X char pbuf[MAXBUF];
X int i = 0;
X static int status = 0;
X
X
X cp = pbuf;
X
X /* draw tanks and explosions */
X for( tp = Tvalid ; tp ; tp = tp->t_next ) {
X
X /* clear the current screen message */
X tp->t_msgb[0] = '\0';
X
X if( tp->t_state & (TEXP | TCLOAK) )
X continue;
X
X if( !(tp->t_state & TSAFE) || (tp->t_pri & 2) ) {
X
X *cp++ = 't';
X *cp++ = tp->t_x | CSAFE;
X *cp++ = tp->t_y | CSAFE;
X *cp++ = (tp->t_id & 3) | CSAFE;
X *cp++ = tp->t_dir | CSAFE;
X }
X }
X
X /* draw shells */
X for( sp = Svalid ; sp ; sp = sp->s_next ) {
X *cp++ = 's';
X *cp++ = sp->s_x | CSAFE;
X *cp++ = sp->s_y | CSAFE;
X *cp++ = '-';
X *cp++ = sp->s_dir | CSAFE;
X }
X
X /* draw heats */
X for( hp = Hvalid ; hp ; hp = hp->h_next ) {
X *cp++ = 'h';
X *cp++ = hp->h_x | CSAFE;
X *cp++ = hp->h_y | CSAFE;
X *cp++ = '-';
X *cp++ = hp->h_dir | CSAFE;
X }
X
X /* draw bonus's */
X for( bp = Bvalid ; bp ; bp = bp->b_next ) {
X *cp++ = 'b';
X *cp++ = bp->b_x | CSAFE;
X *cp++ = bp->b_y | CSAFE;
X *cp++ = '-';
X *cp++ = ((Bonfrm)?1:0) | CSAFE;
X }
X
X /* draw expls */
X for( ep = Evalid ; ep ; ep = ep->e_next ) {
X *cp++ = 'e';
X *cp++ = ep->e_x | CSAFE;
X *cp++ = ep->e_y | CSAFE;
X *cp++ = '-';
X *cp++ = ep->e_frm | CSAFE;
X }
X
X /* draw power pellets */
X for( pp = Pvalid ; pp ; pp = pp->p_next ) {
X *cp++ = 'p';
X *cp++ = pp->p_x | CSAFE;
X *cp++ = pp->p_y | CSAFE;
X *cp++ = '-';
X *cp++ = pp->p_val | CSAFE;
X }
X
X /* display status of tanks */
X *cp = '\0';
X
X if( status++ > STATUPD ) {
X *cp++ = 'S';
X *cp = '\0';
X for( tp = Tvalid ; tp ; tp = tp->t_next ) {
X i = strlen(pbuf);
X (void)sprintf(&pbuf[i],"%c%s#",tp->t_id | CSAFE,tp->t_name);
X i = strlen(pbuf);
X (void)sprintf(&pbuf[i],"killed %d died %d#",tp->t_kills,tp->t_dead);
X }
X (void)strcat(pbuf,"$");
X status = 0;
X }
X
X if( strlen(pbuf) > MAXBUF ) {
X (void)fprintf(stderr,"pbuf overrun\n");
X exit( 1 );
X }
X
X /* draw players cloaked tanked and their energy */
X for( tp = Tvalid ; tp ; tp = tp->t_next ) {
X cp = tp->t_msgb;
X if( (tp->t_state & TCLOAK) && (tp->t_pri & 1) ) {
X *cp++ = 't';
X *cp++ = tp->t_x | CSAFE;
X *cp++ = tp->t_y | CSAFE;
X *cp++ = (tp->t_id & 3) | CSAFE;
X *cp++ = tp->t_dir | CSAFE;
X }
X (void)sprintf(cp,"EEnergy %d Dmg %d #",tp->t_energy,tp->t_damage);
X }
X
X
X /* draw players own mines on the field */
X for( mp = Mvalid ; mp ; mp = mp->m_next ) {
X tp = mp->m_own;
X i = strlen(tp->t_msgb);
X cp = &tp->t_msgb[i];
X *cp++ = 'm';
X *cp++ = mp->m_x | CSAFE;
X *cp++ = mp->m_y | CSAFE;
X *cp++ = '-';
X *cp++ = '-';
X *cp = '\0';
X }
X
X /* set up individual tank buffers */
X for( tp = Tvalid ; tp ; tp = tp->t_next ) {
X (void)strcat(tp->t_msgb,pbuf);
X if( !(tp->t_msgb[0]) )
X (void)strcpy(tp->t_msgb,"FORCE");
X tp->t_state |= TSCUD;
X }
X}
X
X
Xload_field(mazenm)
X char *mazenm;
X{
X int x, y, off;
X char buf[128];
X FILE *fp;
X
X
X /* read maze */
X if( !(fp = fopen(mazenm,"r")) ) {
X (void)printf("init_field: unable to open maze\n");
X return 1;
X }
X
X off = 0;
X for( y = 0 ; y < MAZE_YL ; y++ ) {
X
X if( !fgets(buf,128,fp) ) {
X (void)printf("init_field: short maze file\n");
X return 1;
X }
X
X if( strlen(buf) != (MAZE_XL + 1) ) {
X (void)printf("init_field: invalid maze item\n");
X return 1;
X }
X
X for( x = 0 ; x < MAZE_XL ; x++ ) {
X if( buf[x] == '#' ) {
X field[x][y] = FWALL;
X maze[off] = 'w';
X }
X else {
X field[x][y] = FSPACE;
X maze[off] = ' ';
X }
X
X /* clear the field ptrs */
X fpts[x][y] = NULL;
X
X off++;
X }
X
X }
X (void)fclose(fp);
X maze[off] = '\0';
X
X return 0;
X}
X
X
Xload_profile(profnm)
X char *profnm;
X{
X FILE *fp;
X char pstr[64];
X int pvar, vcnt, ln = 1;
X
X
X /* read profile */
X if( !(fp = fopen(profnm,"r")) ) {
X (void)printf("init_field: unable to open maze\n");
X return 1;
X }
X
X while( (vcnt = fscanf(fp,"%s %d\n",pstr,&pvar)) != EOF ) {
X if( vcnt != 2 ) {
X (void)fprintf(stderr,"load_profile: line %d invalid\n",ln);
X continue;
X }
X
X /* slowly walk through the list and assign values */
X if( !strcmp(pstr,"CLOAKCOST") )
X Cloakcost = pvar;
X else if( !strcmp(pstr,"SHELLCOST") )
X Shellcost = pvar;
X else if( !strcmp(pstr,"MINECOST") )
X Minecost = pvar;
X else if( !strcmp(pstr,"HEATCOST") )
X Heatcost = pvar;
X else if( !strcmp(pstr,"SHELLDMG") )
X Shelldmg = pvar;
X else if( !strcmp(pstr,"MINEDMG") )
X Minedmg = pvar;
X else if( !strcmp(pstr,"HEATDMG") )
X Heatdmg = pvar;
X else if( !strcmp(pstr,"TANKENERGY") )
X Tenergy = pvar;
X else if( !strcmp(pstr,"ENERGYPERTANK") )
X Energypt = pvar;
X else if( !strcmp(pstr,"TANKDAMAGE") )
X Tdamage = pvar;
X else if( !strcmp(pstr,"TANKMAXENERGY") )
X Tmaxenergy = pvar;
X else if( !strcmp(pstr,"DMGREGENPRI") )
X Regenpri = pvar;
X else if( !strcmp(pstr,"DMGREGENAMT") )
X Regenamt = pvar;
X else
X (void)fprintf(stderr,"load_profile: line %d invalid\n",ln);
X
X ln++;
X }
X
X (void)fclose(fp);
X return 0;
X}
X
X/* Lint Output
X*/
SHAR_EOF
chmod 0400 stank/server.c || echo "restore of stank/server.c fails"
if [ $TOUCH = can ]
then
touch -am 0319105291 stank/server.c
fi
set `wc -c stank/server.c`;Wc_c=$1
if test "$Wc_c" != "11344"
then echo original size 11344, current size $Wc_c;fi
# ============= stank/server.h ==============
echo "x - extracting stank/server.h (Text)"
sed 's/^X//' << 'SHAR_EOF' > stank/server.h &&
X
X/*
X * Copyright (c) 1991 Jon Wesener
X * Gaming Software
X *
X * Permission to use, copy, modify, and distribute this
X * software and its documentation for any purpose and without
X * fee is hereby granted, provided that the above copyright
X * notice appear in all copies and that both that copyright
X * notice and this permission notice appear in supporting
X * documentation. No representations are made about the
X * suitability of this software for any purpose. It is
X * provided "as is" without express or implied warranty.
X *
X */
X
X#ident "@(#)server.h 1.20 :/usr/key/jojow/X/src/guts/SCCS/s.server.h 3/19/91 10:16:09 "
X
X/* server.h - server specific includes */
X#include "tank.h"
X
X
X/* DEFS */
X
X/* screen object speeds */
X#define TANKPRI 4
X#define HEATPRI 3
X#define SHELLPRI 1
X#define EXPLPRI 4
X#define MINEPRI 2
X#define BONUSPRI 3
X#define STATUPD 40
X
X#define MAXNM 40
X#define MAXBUF 512
X
X#define MAXSHELLF 4
X#define MAXSHELL (MAXSHELLF * MAXTANK)
X
X#define MAXMINEF 10
X#define MAXMINE (MAXMINEF * MAXTANK)
X
X#define MAXHEATF 3
X#define MAXHEAT (MAXHEATF * MAXTANK)
X
X#define MAXEXPL 130
X#define MAXHBMISS 100
X#define MAXPOW 30
X#define HEATLIFE 20
X#define MAXBON 5
X
X#define CSAFE 0x40
X
X#define TSAFECNT 60
X
X
X/* field items */
X#define FWALL '#'
X#define FSPACE ' '
X#define FTANK 'T'
X#define FMINE 'M'
X#define FPOW 'P'
X#define FBON 'B'
X
X
X/* server state flags */
X#define SSCUDFRC 0x2
X#define SSTUDFRC 0x4
X
X#define TIMESTEP 40000L
X
Xstruct bon {
X char b_x;
X char b_y; /* position */
X struct bon *b_next; /* chain */
X};
Xtypedef struct bon bon_t;
X
Xstruct pow {
X char p_x;
X char p_y; /* position */
X char p_val; /* amount of energy */
X struct pow *p_next; /* chain */
X};
Xtypedef struct pow pow_t;
X
Xstruct expl {
X char e_x;
X char e_y; /* position */
X char e_pri; /* priority */
X char e_frm; /* expl frame */
X char e_size; /* size of explosion */
X struct expl *e_next; /* chain */
X};
Xtypedef struct expl expl_t;
X
Xstruct mine {
X char m_x;
X char m_y; /* position */
X char m_id; /* mine id */
X struct mine *m_next; /* chain */
X struct tank *m_own; /* owner (leash?) */
X};
Xtypedef struct mine mine_t;
X
Xstruct heat {
X char h_x;
X char h_y; /* position */
X char h_dir; /* direction shell is moving */
X char h_pri; /* shell speed/priority */
X char h_life; /* max distance */
X struct heat *h_next; /* chain */
X struct tank *h_own; /* owner (leash?) */
X};
Xtypedef struct heat heat_t;
X
Xstruct shell {
X char s_x;
X char s_y; /* position */
X char s_dir; /* direction shell is moving */
X char s_pri; /* shell speed/priority */
X struct shell *s_next; /* chain */
X struct tank *s_own; /* owner (leash?) */
X};
Xtypedef struct shell shell_t;
X
Xstruct tank {
X int t_state; /* tank state */
X#define TSCUD 0x1
X#define THRTBEAT 0x2
X#define TVALID 0x4
X#define TEXP 0x8
X#define TSAFE 0x10
X#define TCLOAK 0x40
X#define TMINE 0x100
X int t_kills; /* Number of kills */
X int t_dead; /* Number of times killed */
X int t_wait; /* time to wait for explosion */
X int t_energy; /* players energy count */
X int t_damage; /* allowable damage */
X char t_id; /* id number */
X char t_x;
X char t_y; /* position */
X char t_dir; /* direction tank is facing */
X char t_cmd; /* players requested command */
X char t_shellf; /* number of shells fired */
X char t_minef; /* number of mines fired */
X char t_heatf; /* number of heats fired */
X char t_safe; /* period of time tank is safe */
X char t_pri; /* tank speed/priority */
X char t_regpri; /* damage regen priority */
X char t_hbmiss; /* Number of missed heart beats */
X char t_hbxs; /* Number of heart beats/period */
X char t_name[MAXNM]; /* players name and host */
X char t_msgb[MAXBUF]; /* reply message buffer */
X char *t_msg; /* pointer to reply message */
X struct tank *t_next; /* chain */
X};
Xtypedef struct tank tank_t;
X
X#define TANKSAFE(tp) ((tp)->t_state & (TSAFE|TEXP))
X#define TANKHID(tp) ((tp)->t_state & (TSAFE|TEXP|TCLOAK))
X
X
X#if SERVER
X
X/* EXTERNALS */
Xtank_t tanks[MAXTANK];
Xheat_t heats[MAXHEAT];
Xshell_t shells[MAXSHELL];
Xmine_t mines[MAXMINE];
Xexpl_t expls[MAXEXPL];
Xpow_t pows[MAXPOW];
Xbon_t bons[MAXBON];
Xtank_t *Tfree, *Tvalid;
Xshell_t *Svalid, *Sfree;
Xmine_t *Mvalid, *Mfree;
Xheat_t *Hvalid, *Hfree;
Xexpl_t *Evalid, *Efree;
Xpow_t *Pvalid, *Pfree;
Xbon_t *Bvalid, *Bfree;
Xchar field[MAZE_XL][MAZE_YL];
Xvoid *fpts[MAZE_XL][MAZE_YL];
Xint Servstate;
Xint Totenergy;
Xint Bonfrm = 0;
X
Xint Cloakcost = 3;
Xint Shellcost = 1;
Xint Shelldmg = 10;
Xint Minecost = 5;
Xint Minedmg = 20;
Xint Heatcost = 15;
Xint Heatdmg = 10;
Xint Tenergy = 100;
Xint Energypt = 300;
Xint Tdamage = 100;
Xint Tmaxenergy = 300;
Xint Regenpri = 80;
Xint Regenamt = 3;
X
X#else
X
Xextern tank_t tanks[MAXTANK];
Xextern heat_t heats[MAXHEAT];
Xextern shell_t shells[MAXSHELL];
Xextern mine_t mines[MAXMINE];
Xextern expl_t expls[MAXEXPL];
Xextern pow_t pows[MAXPOW];
Xextern bon_t bons[MAXBON];
Xextern tank_t *Tfree, *Tvalid;
Xextern shell_t *Svalid, *Sfree;
Xextern mine_t *Mvalid, *Mfree;
Xextern heat_t *Hvalid, *Hfree;
Xextern expl_t *Evalid, *Efree;
Xextern pow_t *Pvalid, *Pfree;
Xextern bon_t *Bvalid, *Bfree;
Xextern char field[MAZE_XL][MAZE_YL];
Xextern void *fpts[MAZE_XL][MAZE_YL];
Xextern int Servstate;
Xextern int Totenergy;
Xextern int Bonfrm;
X
Xextern int Cloakcost;
Xextern int Shellcost;
Xextern int Shelldmg;
Xextern int Minecost;
Xextern int Minedmg;
Xextern int Heatcost;
Xextern int Heatdmg;
Xextern int Tenergy;
Xextern int Energypt;
Xextern int Tdamage;
Xextern int Tmaxenergy;
Xextern int Regenpri;
Xextern int Regenamt;
X
X#endif /* SERVER */
X
X#ifndef NULL
X#define NULL 0
X#endif /* NULL */
X
Xextern char *sprintf();
Xextern long random();
SHAR_EOF
chmod 0400 stank/server.h || echo "restore of stank/server.h fails"
if [ $TOUCH = can ]
then
touch -am 0319105291 stank/server.h
fi
set `wc -c stank/server.h`;Wc_c=$1
if test "$Wc_c" != "5643"
then echo original size 5643, current size $Wc_c;fi
# ============= stank/shell.c ==============
echo "x - extracting stank/shell.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > stank/shell.c &&
X
X/*
X * Copyright (c) 1991 Jon Wesener
X * Gaming Software
X *
X * Permission to use, copy, modify, and distribute this
X * software and its documentation for any purpose and without
X * fee is hereby granted, provided that the above copyright
X * notice appear in all copies and that both that copyright
X * notice and this permission notice appear in supporting
X * documentation. No representations are made about the
X * suitability of this software for any purpose. It is
X * provided "as is" without express or implied warranty.
X *
X */
X
X#ident "@(#)shell.c 1.6 :/usr/key/jojow/X/src/guts/SCCS/s.shell.c 3/19/91 10:16:16 "
X
X/* shell.c - routines for handling shells */
X
X#include "server.h"
X
X
Xcheckshells()
X{
X register shell_t *sp;
X shell_t *sr;
X
X for( sp = Svalid ; sp ; sp = sr ) {
X
X sr = sp->s_next;
X
X /* is it time to move the shell */
X if( ++(sp->s_pri) < SHELLPRI )
X continue;
X
X sp->s_pri = 0;
X
X moveshell(sp);
X Servstate |= SSCUDFRC;
X }
X}
X
X
Xstatic int xmv[] = {0,1,0,-1};
Xstatic int ymv[] = {-1,0,1,0};
X
Xmoveshell(sp)
X register shell_t *sp;
X{
X int nx, ny;
X int dead = 0;
X tank_t *tp;
X
X
X nx = sp->s_x + xmv[sp->s_dir];
X ny = sp->s_y + ymv[sp->s_dir];
X
X /* check new position */
X if( field[nx][ny] == FWALL )
X dead = 1;
X else if( field[nx][ny] == FTANK ) {
X
X tp = (tank_t *)fpts[nx][ny];
X if( !TANKSAFE(tp) ) {
X dead = 1;
X explode(tp,sp->s_own,Shelldmg,nx,ny);
X }
X }
X
X if( !dead ) {
X sp->s_x = nx;
X sp->s_y = ny;
X }
X /* shell gone? */
X else {
X shell_t *sr;
X
X
X /* remove from active list */
X if( Svalid == sp )
X Svalid = sp->s_next;
X else {
X for( sr = Svalid ; sr->s_next != sp ; sr = sr->s_next );
X sr->s_next = sp->s_next;
X }
X
X /* put it back on the free list */
X sp->s_next = Sfree;
X sp->s_own->t_shellf--;
X Sfree = sp;
X }
X}
X
X
Xfire_shell(tp)
X register tank_t *tp;
X{
X shell_t *sp;
X
X
X /* any shells to fire? */
X if( tp->t_energy < Shellcost )
X return;
X
X tp->t_energy -= Shellcost;
X Totenergy += Shellcost;
X tp->t_shellf++;
X
X sp = Sfree;
X Sfree = sp->s_next;
X
X sp->s_x = tp->t_x;
X sp->s_y = tp->t_y;
X sp->s_dir = tp->t_dir;
X sp->s_pri = 0;
X sp->s_own = tp;
X
X sp->s_next = Svalid;
X Svalid = sp;
X}
X
X
Xrm_shells(tp)
X tank_t *tp;
X{
X shell_t *sp, *sr, *sn;
X
X /* remove all the mines belonging to tp */
X for( sp = Svalid ; sp ; sp = sn ) {
X
X sn = sp->s_next;
X
X if( sp->s_own != tp )
X continue;
X
X /* kill it */
X if( Svalid == sp )
X Svalid = sp->s_next;
X else {
X for( sr = Svalid ; sr->s_next != sp ; sr = sr->s_next );
X sr->s_next = sp->s_next;
X }
X
X sp->s_next = Sfree;
X Sfree = sp;
X }
X}
X
X
Xshelldest()
X{
X register shell_t *sp, *sr;
X
X
X /* Walk down the list and remove them */
X for( sr = sp = Svalid ; sp ; sp = sp->s_next ) {
X sr = sp;
X
X sp->s_own->t_shellf--;
X }
X
X if( Svalid ) {
X sr->s_next = Sfree;
X Sfree = Svalid;
X Svalid = NULL;
X }
X}
X
X/* Lint Output
X*/
SHAR_EOF
chmod 0400 stank/shell.c || echo "restore of stank/shell.c fails"
if [ $TOUCH = can ]
then
touch -am 0319105291 stank/shell.c
fi
set `wc -c stank/shell.c`;Wc_c=$1
if test "$Wc_c" != "2813"
then echo original size 2813, current size $Wc_c;fi
# ============= stank/tank.c ==============
echo "x - extracting stank/tank.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > stank/tank.c &&
X
X/*
X * Copyright (c) 1991 Jon Wesener
X * Gaming Software
X *
X * Permission to use, copy, modify, and distribute this
X * software and its documentation for any purpose and without
X * fee is hereby granted, provided that the above copyright
X * notice appear in all copies and that both that copyright
X * notice and this permission notice appear in supporting
X * documentation. No representations are made about the
X * suitability of this software for any purpose. It is
X * provided "as is" without express or implied warranty.
X *
X */
X
X#ident "@(#)tank.c 1.11 :/usr/key/jojow/X/src/guts/SCCS/s.tank.c 3/19/91 10:16:20 "
X
X/* tank.c - routines for handling tanks */
X
X#include "server.h"
X
X
Xchecktanks()
X{
X register tank_t *tp, *tr;
X
X for( tp = Tvalid ; tp ; tp = tr ) {
X
X tr = tp->t_next;
X
X /* wait to enter */
X if( (tp->t_state & TEXP) ) {
X if( --(tp->t_wait) )
X continue;
X tp->t_state &= ~TEXP;
X }
X
X /* check for dropped players */
X if( tp->t_state & THRTBEAT )
X tp->t_hbmiss = 0;
X
X else if( ++(tp->t_hbmiss) > MAXHBMISS ){
X (void)printf("recompute: dropping player %s\n",tp->t_name);
X (void)sprintf(tp->t_msgb,"i%c",tp->t_id+'0');
X (void)texit_1(&tp->t_msg);
X continue;
X }
X
X tp->t_state &= ~THRTBEAT;
X
X /* turn off safety period */
X if( tp->t_state & (TSAFE | TCLOAK) ) {
X Servstate |= SSCUDFRC;
X if( !(--(tp->t_safe)) )
X tp->t_state &= ~TSAFE;
X }
X
X /* regenerate damage */
X if( ++(tp->t_regpri) >= Regenpri ) {
X if( (tp->t_damage < Tdamage) &&
X (tp->t_damage += Regenamt) > Tdamage )
X tp->t_damage = Tdamage;
X tp->t_regpri = 0;
X }
X
X /* is it time to move the tank */
X if( ++(tp->t_pri) < TANKPRI )
X continue;
X
X tp->t_pri = 0;
X
X if( movetank(tp) )
X Servstate |= SSCUDFRC;
X }
X}
X
X
Xmovetank(tp)
X register tank_t *tp;
X{
X int nx, ny, cmd;
X int ox, oy;
X
X
X /* time to cloak? */
X if( tp->t_state & TCLOAK ) {
X if( tp->t_energy > Cloakcost ) {
X tp->t_energy -= Cloakcost;
X Totenergy += Cloakcost;
X }
X else
X tp->t_state &= ~TCLOAK;
X Servstate |= SSCUDFRC;
X }
X
X ox = nx = tp->t_x;
X oy = ny = tp->t_y;
X
X cmd = tp->t_cmd;
X tp->t_cmd = 0;
X switch (cmd) {
X case 'h':
X if( tp->t_dir != 3) {
X tp->t_dir = 3;
X return 1;
X }
X nx--;
X break;
X case 'j':
X if( tp->t_dir != 2) {
X tp->t_dir = 2;
X return 1;
X }
X ny++;
X break;
X case 'k':
X if( tp->t_dir != 0) {
X tp->t_dir = 0;
X return 1;
X }
X ny--;
X break;
X case 'l':
X if( tp->t_dir != 1) {
X tp->t_dir = 1;
X return 1;
X }
X nx++;
X break;
X case 'f':
X case ' ':
X tp->t_state &= ~TCLOAK;
X if( !TANKSAFE(tp) && (tp->t_shellf < MAXSHELLF) )
X fire_shell(tp);
X return 0;
X case 'd':
X if( !TANKSAFE(tp) && (tp->t_minef < MAXMINEF) )
X arm_mine(tp);
X return 0;
X case 's':
X tp->t_state &= ~TCLOAK;
X if( !TANKSAFE(tp) && (tp->t_heatf < MAXHEATF) )
X fire_heat(tp);
X return 0;
X case 'c':
X if( !(tp->t_state & TSAFE) )
X cloak_mode(tp);
X return 0;
X case 0 :
X return 0;
X default:
X (void)printf("invalid command %c - %d\n",cmd,cmd);
X return 0;
X }
X
X /* check out the new position */
X switch( (int)field[nx][ny] ) {
X
Xnowspace:
X /* no problem! */
X case FSPACE:
X if( !(tp->t_state & TEXP) ) {
X field[nx][ny] = FTANK;
X fpts[nx][ny] = (void *)tp;
X tp->t_x = nx;
X tp->t_y = ny;
X }
X field[ox][oy] = FSPACE;
X fpts[ox][oy] = NULL;
X
X
X if( tp->t_state & TMINE )
X drop_mine(tp,ox,oy);
X
X return 1;
X
X /* toe poppers */
X case FMINE:
X mineblow(tp,(mine_t *)fpts[nx][ny],nx,ny);
X goto nowspace;
X
X /* power pellet */
X case FPOW:
X powblow(tp,(pow_t *)fpts[nx][ny],nx,ny);
X goto nowspace;
X
X case FBON:
X bonblow(tp,(bon_t *)fpts[nx][ny],nx,ny);
X goto nowspace;
X
X /* Don't move */
X default:
X return 0;
X }
X}
X
X
Xplace_tank(tp)
X tank_t *tp;
X{
X int x, y;
X
X do {
X x = random() % MAZE_XL;
X y = random() % MAZE_YL;
X } while( field[x][y] != FSPACE );
X
X tp->t_x = x;
X tp->t_y = y;
X field[x][y] = FTANK;
X fpts[x][y] = (void *)tp;
X}
X
X
Xcloak_mode(tp)
X tank_t *tp;
X{
X /* turn it on or off? */
X if( tp->t_state & TCLOAK) {
X tp->t_state &= ~TCLOAK;
X return;
X }
X
X /* enough energy for the drain? */
X if( tp->t_energy < Cloakcost )
X return;
X
X tp->t_energy -= Cloakcost;
X Totenergy += Cloakcost;
X tp->t_state |= TCLOAK;
X
X Servstate |= SSCUDFRC;
X}
X
Xtank_reset(tp,delay)
X tank_t *tp;
X int delay;
X{
X if( tp->t_state & TMINE )
X tp->t_minef--;
X
X tp->t_state = TVALID | TSAFE;
X
X if( delay ) {
X tp->t_state |= TEXP;
X tp->t_wait = delay;
X }
X
X tp->t_safe = TSAFECNT;
X tp->t_pri = 0;
X
X tp->t_energy = Tenergy;
X tp->t_damage = Tdamage;
X Totenergy -= Tenergy;
X}
X
X
Xtank_cleanup(tp)
X tank_t *tp;
X{
X /* remove mines */
X rm_mines(tp);
X
X /* remove shells */
X rm_shells(tp);
X
X /* remove heats */
X rm_heats(tp);
X}
X
X
Xtankdest(tp)
X tank_t *tp;
X{
X register tank_t *tr;
X
X for( tr = Tvalid ; tr ; tr = tr->t_next ) {
X if( tr != tp )
X explode(tr,tp,tr->t_damage+1,tr->t_x,tr->t_y);
X }
X}
X
X/* Lint Output
X*/
SHAR_EOF
chmod 0400 stank/tank.c || echo "restore of stank/tank.c fails"
if [ $TOUCH = can ]
then
touch -am 0319105291 stank/tank.c
fi
set `wc -c stank/tank.c`;Wc_c=$1
if test "$Wc_c" != "4881"
then echo original size 4881, current size $Wc_c;fi
# ============= stank/tank.h ==============
echo "x - extracting stank/tank.h (Text)"
sed 's/^X//' << 'SHAR_EOF' > stank/tank.h &&
X
X/*
X * Copyright (c) 1991 Jon Wesener
X * Gaming Software
X *
X * Permission to use, copy, modify, and distribute this
X * software and its documentation for any purpose and without
X * fee is hereby granted, provided that the above copyright
X * notice appear in all copies and that both that copyright
X * notice and this permission notice appear in supporting
X * documentation. No representations are made about the
X * suitability of this software for any purpose. It is
X * provided "as is" without express or implied warranty.
X *
X */
X
X#ident "@(#)tank.h 1.10 :/usr/key/jojow/X/src/guts/SCCS/s.tank.h 3/19/91 10:16:24 "
X
X/* tank.h - common defs for server and client */
X
X#define TANK_LEN 16
X/* #define WIN_LEN 32 */
X#define MAZE_XL 32
X#define MAZE_YL 32
X#define STAT_XL 150
X#define WIN_XL (MAZE_XL * TANK_LEN + STAT_XL)
X#define WIN_YL (MAZE_YL * TANK_LEN)
X#define EXPCNT 7
X#define BONCNT 2
X#define MAXDIR 4
X#define MAXTANK 8
X#define MAXWALL 16
X#define MAXSTRLEN 40
X#define MAXMINEANIM 2
X#define MAXSTAT (MAXTANK * 2)
SHAR_EOF
chmod 0400 stank/tank.h || echo "restore of stank/tank.h fails"
if [ $TOUCH = can ]
then
touch -am 0319105291 stank/tank.h
fi
set `wc -c stank/tank.h`;Wc_c=$1
if test "$Wc_c" != "1029"
then echo original size 1029, current size $Wc_c;fi
# ============= stank/tankmsg.h ==============
echo "x - extracting stank/tankmsg.h (Text)"
sed 's/^X//' << 'SHAR_EOF' > stank/tankmsg.h &&
X
X/*
X * Copyright (c) 1991 Jon Wesener
X * Gaming Software
X *
X * Permission to use, copy, modify, and distribute this
X * software and its documentation for any purpose and without
X * fee is hereby granted, provided that the above copyright
X * notice appear in all copies and that both that copyright
X * notice and this permission notice appear in supporting
X * documentation. No representations are made about the
X * suitability of this software for any purpose. It is
X * provided "as is" without express or implied warranty.
X *
X */
X
X#ident "@(#)tankmsg.h 1.1 :/usr/key/jojow/X/src/guts/SCCS/s.tankmsg.h 3/19/91 10:14:43 "
X
X#define MESSAGEPROG ((u_long)0x20000002)
X#define MESSAGEVERS ((u_long)1)
X#define TENTER ((u_long)1)
Xextern char **tenter_1();
X#define GETPOS ((u_long)2)
Xextern char **getpos_1();
X#define GETMAZE ((u_long)3)
Xextern char **getmaze_1();
X#define TEXIT ((u_long)4)
Xextern char **texit_1();
X#define GETPLYRCNT ((u_long)5)
Xextern int *getplyrcnt_1();
X
SHAR_EOF
chmod 0400 stank/tankmsg.h || echo "restore of stank/tankmsg.h fails"
if [ $TOUCH = can ]
then
touch -am 0319105291 stank/tankmsg.h
fi
set `wc -c stank/tankmsg.h`;Wc_c=$1
if test "$Wc_c" != "973"
then echo original size 973, current size $Wc_c;fi
# ============= stank/tankmsg.x ==============
echo "x - extracting stank/tankmsg.x (Text)"
sed 's/^X//' << 'SHAR_EOF' > stank/tankmsg.x &&
X
X/*
X * Copyright (c) 1991 Jon Wesener
X * Gaming Software
X *
X * Permission to use, copy, modify, and distribute this
X * software and its documentation for any purpose and without
X * fee is hereby granted, provided that the above copyright
X * notice appear in all copies and that both that copyright
X * notice and this permission notice appear in supporting
X * documentation. No representations are made about the
X * suitability of this software for any purpose. It is
X * provided "as is" without express or implied warranty.
X *
X */
X
X#ident "@(#)tankmsg.x 1.7 :/usr/key/jojow/X/src/guts/SCCS/s.tankmsg.x 3/19/91 10:16:29 "
X
X/* msg.x: remote message printing protocol */
X
Xprogram MESSAGEPROG {
X version MESSAGEVERS {
X string TENTER(string) = 1;
X string GETPOS(string) = 2;
X string GETMAZE(int) = 3;
X string TEXIT(string) = 4;
X int GETPLYRCNT(void) = 5;
X } = 1;
X} = 0x20000002;
SHAR_EOF
chmod 0400 stank/tankmsg.x || echo "restore of stank/tankmsg.x fails"
if [ $TOUCH = can ]
then
touch -am 0319105291 stank/tankmsg.x
fi
set `wc -c stank/tankmsg.x`;Wc_c=$1
if test "$Wc_c" != "885"
then echo original size 885, current size $Wc_c;fi
# ============= stank/tankmsg_clnt.c ==============
echo "x - extracting stank/tankmsg_clnt.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > stank/tankmsg_clnt.c &&
X
X/*
X * Copyright (c) 1991 Jon Wesener
X * Gaming Software
X *
X * Permission to use, copy, modify, and distribute this
X * software and its documentation for any purpose and without
X * fee is hereby granted, provided that the above copyright
X * notice appear in all copies and that both that copyright
X * notice and this permission notice appear in supporting
X * documentation. No representations are made about the
X * suitability of this software for any purpose. It is
X * provided "as is" without express or implied warranty.
X *
X */
X
X#ident "@(#)tankmsg_clnt.c 1.2 :/usr/key/jojow/X/src/guts/SCCS/s.tankmsg_clnt.c 3/19/91 10:16:32 "
X
X#include <rpc/rpc.h>
X#include <sys/time.h>
X#include "tankmsg.h"
X
X/* Default timeout can be changed using clnt_control() */
Xstatic struct timeval TIMEOUT = { 25, 0 };
X
Xchar **
Xtenter_1(argp, clnt)
X char **argp;
X CLIENT *clnt;
X{
X static char *res;
X
X bzero((char *)&res, sizeof(res));
X if (clnt_call(clnt, TENTER, xdr_wrapstring, argp, xdr_wrapstring, &res, TIMEOUT) != RPC_SUCCESS) {
X return (NULL);
X }
X return (&res);
X}
X
X
Xchar **
Xgetpos_1(argp, clnt)
X char **argp;
X CLIENT *clnt;
X{
X static char *res;
X
X bzero((char *)&res, sizeof(res));
X if (clnt_call(clnt, GETPOS, xdr_wrapstring, argp, xdr_wrapstring, &res, TIMEOUT) != RPC_SUCCESS) {
X return (NULL);
X }
X return (&res);
X}
X
X
Xchar **
Xgetmaze_1(argp, clnt)
X int *argp;
X CLIENT *clnt;
X{
X static char *res;
X
X bzero((char *)&res, sizeof(res));
X if (clnt_call(clnt, GETMAZE, xdr_int, argp, xdr_wrapstring, &res, TIMEOUT) != RPC_SUCCESS) {
X return (NULL);
X }
X return (&res);
X}
X
X
Xchar **
Xtexit_1(argp, clnt)
X char **argp;
X CLIENT *clnt;
X{
X static char *res;
X
X bzero((char *)&res, sizeof(res));
X if (clnt_call(clnt, TEXIT, xdr_wrapstring, argp, xdr_wrapstring, &res, TIMEOUT) != RPC_SUCCESS) {
X return (NULL);
X }
X return (&res);
X}
X
X
Xint *
Xgetplyrcnt_1(argp, clnt)
X void *argp;
X CLIENT *clnt;
X{
X static int res;
X
X bzero((char *)&res, sizeof(res));
X if (clnt_call(clnt, GETPLYRCNT, xdr_void, argp, xdr_int, &res, TIMEOUT) != RPC_SUCCESS) {
X return (NULL);
X }
X return (&res);
X}
X
SHAR_EOF
chmod 0400 stank/tankmsg_clnt.c || echo "restore of stank/tankmsg_clnt.c fails"
if [ $TOUCH = can ]
then
touch -am 0319105291 stank/tankmsg_clnt.c
fi
set `wc -c stank/tankmsg_clnt.c`;Wc_c=$1
if test "$Wc_c" != "2060"
then echo original size 2060, current size $Wc_c;fi
# ============= stank/tankmsg_svc.c ==============
echo "x - extracting stank/tankmsg_svc.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > stank/tankmsg_svc.c &&
X
X/*
X * Copyright (c) 1991 Jon Wesener
X * Gaming Software
X *
X * Permission to use, copy, modify, and distribute this
X * software and its documentation for any purpose and without
X * fee is hereby granted, provided that the above copyright
X * notice appear in all copies and that both that copyright
X * notice and this permission notice appear in supporting
X * documentation. No representations are made about the
X * suitability of this software for any purpose. It is
X * provided "as is" without express or implied warranty.
X *
X */
X
X#ident "@(#)tankmsg_svc.c 1.4 :/usr/key/jojow/X/src/guts/SCCS/s.tankmsg_svc.c 3/19/91 10:16:36 "
X
X#include <stdio.h>
X#include <rpc/rpc.h>
X#include "tankmsg.h"
X
Xstatic void messageprog_1();
Xchar *Mazefnm;
X
Xmain(ac,av)
X int ac;
X char *av[];
X{
X SVCXPRT *transp;
X
X /* usage line */
X if( ac < 2 ) {
X (void)fprintf(stderr,"usage: %s maze [profile]\n",av[0]);
X exit( 1 );
X }
X
X Mazefnm = av[1];
X
X /* load the profile */
X if( (ac >= 3) && load_profile(av[2]) ) {
X (void)fprintf(stderr,"%s: invalid profile\n",av[0]);
X exit( 1 );
X }
X
X (void)pmap_unset(MESSAGEPROG, MESSAGEVERS);
X
X transp = svcudp_create(RPC_ANYSOCK);
X if (transp == NULL) {
X (void)fprintf(stderr, "cannot create udp service.\n");
X exit(1);
X }
X if (!svc_register(transp, MESSAGEPROG, MESSAGEVERS, messageprog_1, IPPROTO_UDP)) {
X (void)fprintf(stderr, "unable to register (MESSAGEPROG, MESSAGEVERS, udp).\n");
X exit(1);
X }
X
X transp = svctcp_create(RPC_ANYSOCK, 0, 0);
X if (transp == NULL) {
X (void)fprintf(stderr, "cannot create tcp service.\n");
X exit(1);
X }
X if (!svc_register(transp, MESSAGEPROG, MESSAGEVERS, messageprog_1, IPPROTO_TCP)) {
X (void)fprintf(stderr, "unable to register (MESSAGEPROG, MESSAGEVERS, tcp).\n");
X exit(1);
X }
X svc_run();
X (void)fprintf(stderr, "svc_run returned\n");
X exit(1);
X}
X
Xstatic void
Xmessageprog_1(rqstp, transp)
X struct svc_req *rqstp;
X SVCXPRT *transp;
X{
X union {
X char *tenter_1_arg;
X char *getpos_1_arg;
X int getmaze_1_arg;
X char *texit_1_arg;
X } argument;
X char *result;
X bool_t (*xdr_argument)(), (*xdr_result)();
X char *(*local)();
X
X switch (rqstp->rq_proc) {
X case NULLPROC:
X (void)svc_sendreply(transp, xdr_void, (char *)NULL);
X return;
X
X case TENTER:
X xdr_argument = xdr_wrapstring;
X xdr_result = xdr_wrapstring;
X local = (char *(*)()) tenter_1;
X break;
X
X case GETPOS:
X xdr_argument = xdr_wrapstring;
X xdr_result = xdr_wrapstring;
X local = (char *(*)()) getpos_1;
X break;
X
X case GETMAZE:
X xdr_argument = xdr_int;
X xdr_result = xdr_wrapstring;
X local = (char *(*)()) getmaze_1;
X break;
X
X case TEXIT:
X xdr_argument = xdr_wrapstring;
X xdr_result = xdr_wrapstring;
X local = (char *(*)()) texit_1;
X break;
X
X case GETPLYRCNT:
X xdr_argument = xdr_void;
X xdr_result = xdr_int;
X local = (char *(*)()) getplyrcnt_1;
X break;
X
X default:
X svcerr_noproc(transp);
X return;
X }
X bzero((char *)&argument, sizeof(argument));
X if (!svc_getargs(transp, xdr_argument, &argument)) {
X svcerr_decode(transp);
X return;
X }
X result = (*local)(&argument, rqstp);
X if (result != NULL && !svc_sendreply(transp, xdr_result, result)) {
X svcerr_systemerr(transp);
X }
X if (!svc_freeargs(transp, xdr_argument, &argument)) {
X (void)fprintf(stderr, "unable to free arguments\n");
SHAR_EOF
echo "End of stank part 2"
echo "File stank/tankmsg_svc.c is continued in part 3"
echo "3" > s3_seq_.tmp
exit 0
--
"The bear new nine songs; all of them on honey."
jojo at key.com
--
Dan Heller
------------------------------------------------
O'Reilly && Associates Z-Code Software
Senior Writer President
argv at ora.com argv at zipcode.com
------------------------------------------------
General Email: argv at sun.com
Comp-sources-x stuff: comp-sources.x at uunet.uu.net
More information about the Comp.sources.x
mailing list