v05i032: Tron - Multiplayer Game, Part02/02
Dan Heller
argv at island.uu.net
Wed Nov 22 12:13:40 AEST 1989
Submitted-by: Helmut Hoenig <hoenig at informatik.uni-kl.de>
Posting-number: Volume 5, Issue 32
Archive-name: tron/part02
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of shell archive."
# Contents: tron_run.c helps.c texter.c header.h messages.h
# grey_maps.h
# Wrapped by hoenig at incas on Thu Nov 16 14:23:25 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'tron_run.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'tron_run.c'\"
else
echo shar: Extracting \"'tron_run.c'\" \(28406 characters\)
sed "s/^X//" >'tron_run.c' <<'END_OF_FILE'
X/* This program was written by Helmut Hoenig */
X/* in May of 1988 at the Unitversity of */
X/* Kaiserslautern, Germany. It may be copied freely. */
X
X#define NONE 255
X#define P_TYPE unsigned char
X
X#define DX 128 /* Groesse des Feldes */
X#define DY 108
X#define DYSHIFT 1
X
X#define times 0
X#define moremess 0
X#define datagramm 1
X
Xint messflag;
Xshort readshort();
X
X#define CHECK(n) printf("%s: check %d%c",my_host,n,(char)10); fflush(stdout)
X
X#include <X11/Xlib.h>
X#include <stdio.h>
X#include <strings.h>
X#include <sys/types.h>
X#include <sys/time.h>
X#include <netinet/in.h>
X#include <netdb.h>
X
X#define XK_MISCELLANY
X#define XK_LATIN1
X#include <X11/keysymdef.h>
X
X#include "grey_maps.h"
X
X#include "header.h"
X#include "messages.h"
X
X#define MAXPLAYERS 8
X#define DIMENSION 4
X
Xchar *my_host,
X *mast_host; /* host of the server, received at the start */
Xint my_count; /* count to use, when sending messages to the server */
Xshort mast_port; /* port-number of the servers master_socket */
X
Xint master, /* my own stream-socket */
X next; /* datagram socket to send pakets to the next player */
X
Xstruct sockaddr_in mast_sin,next_sin,my_sin;
Xint lastlen;
X
Xchar next_host[20]; /* address of the next player, received befor a game starts */
Xshort next_port;
X
X#if (datagramm==0)
X int last_acc,last;
X struct sockaddr_in last_sin;
X#endif
X
X/* XWindowstrukturen und -Variablen */
X
X#define FID 0
X#define MAPS 8
X
Xextern XFontStruct *(finfo[]);
Xextern Window aw;
Xextern GC gc_set,gc_clear,gc_filler,gc_copy,gc_orInverted,gc_or;
X
XDisplay *display;
XScreen *screen;
Xchar *dispname; /* received by the server */
XXEvent event;
XWindow backw, /* just a black background window, if the display-size doesn't fit */
X mw, /* main-window, where the action takes place
X **** no eposure-events executed here (too much effort) ***/
X scorew; /* window in the middle of the screen for text-outputs */
X
XXColor colors[MAPS];
XPixmap grey[MAPS];
Xlong pixels[256];
XXColor cols[DY];
Xlong planes[1];
Xint colored;
X
X/* Spielstrukturen und -Variablen */
X
X#define x_size ((DWidth / DX))
X#define y_size ((DHeight / DY))
X#define MWWidth (DX*x_size)
X#define MWHeight (DY*y_size)
X
Xint field[DX][DY];
X
XP_TYPE xmove[DX * DY];
XP_TYPE ymove[DX * DY];
Xint lastmove,actmove;
X
Xtypedef struct _Pack { /* Spielpaket */
X short mode; /* mode: SETUP / PLAY */
X short game_count; /* laufende Nummer der Paketuebertragung */
X short game_number; /* Nummer des Spiels */
X short players; /* aktuelle Zahl der Spieler */
X short ready;
X
X P_TYPE x[MAXPLAYERS][DIMENSION];
X P_TYPE y[MAXPLAYERS][DIMENSION];
X} Pack;
X
X#define SETUP 1
X#define PLAY 2
X#define GAME_OVER 4
X#define AUTO_START 8
X
XPack p; /* Buffer for the datagram-paket */
X
Xint start_flag,players;
Xint ready,wait,winner;
Xint active;
Xint game_num;
X
XP_TYPE posx,posy;
Xint dx,dy;
Xint fast,boost,jmp_count;
X
X#if (times==1)
X
X#define MAXMESS 100
X
Xint t_count;
Xstruct timeval tfield[MAXMESS+1];
Xstruct timezone zone;
X
X#endif
X
X/* Ausgabefenster */
Xstatic int lines,max_col;
Xstatic char tscreen[20][80];
X
X/* */
Xchar *getenv();
X
Xint max_time;
Xint auto_only=0;
X
Xmain(argc,argv)
Xint argc;
Xchar *argv[];
X{
Xstruct hostent *hp;
Xstruct servent *sp;
Xint buffer;
Xint help;
X
Xlong timefield;
X
X time(&timefield);
X srandom((int)timefield);
X
X if (argc!=6)
X { fprintf(stderr,"*** you must not start this directly. ***\n");
X exit(0);
X };
X
X my_host=getenv("HOST");
X mast_host=argv[1];
X sscanf(argv[2],"%d",&help);
X mast_port = htons((short)help);
X dispname = argv[3];
X sscanf(argv[4],"%d",&my_count);
X sscanf(argv[5],"%d",&messflag);
X
X#if (moremess==1)
X printf("%s: count: %d\n",my_host,my_count);
X fflush(stdout);
X#endif
X
X/* Display oeffnen */
X if (index(dispname,'-')==NULL)
X { if ((display=XOpenDisplay(dispname))==NULL)
X { fprintf(stderr,"*** %s: Can't open display.\n",my_host);
X auto_only=1;
X }
X else
X { screen=XScreenOfDisplay(display,DefaultScreen(display));
X auto_only=0;
X };
X }
X else auto_only=1;
X
X/* 2 bis 3 Sockets aufmachen */
X master=streamsocket();
X
X next=dgramsocket();
X
X/* Socketnamen fuer eigenen Socket holen */
X
X init_addr(&my_sin,my_host,htons((short)14253));
X
X while (bind(next,&my_sin,sizeof my_sin)) my_sin.sin_port++;
X
X#if (moremess==1)
X printf("%s: my port is %d.\n",my_host,(int)ntohs(my_sin.sin_port));
X fflush(stdout);
X#endif
X if (messflag)
X { printf("%s: master: %s@%d, my-port: %s@%d\n",my_host,mast_host,(int)ntohs(mast_port),my_host,(int)ntohs(my_sin.sin_port));
X fflush(stdout);
X }
X/* Verbindung zum Master aufbauen */
X connect_to(master,mast_host,mast_port);
X writeint(master,my_count);
X writeshort(master,(short)ntohs(my_sin.sin_port));
X writeint(master,auto_only);
X
X game();
X
X/* Sockets schliessen */
X close(master);
X close(next);
X}
X
X/*****************************************************
X * Initialisation *
X * + Loop, executing command-messages of the master. *
X *****************************************************/
X
Xgame()
X{
XXSetWindowAttributes attrib;
Xint i,j,t;
Xint mess;
X
Xif(!auto_only)
X{ init_texter();
X XBell(display,40);
X/* XSynchronize(display,1); */ /* Hilfe fuer Testzwecke */
X
X XFlush(display);
X
X/******************************************************
X * tries to allocate a special amount of color cells. *
X * if it fails, it continues in monochrom. *
X ******************************************************/
X if (XAllocColorCells(display,XDefaultColormapOfScreen(screen),False,planes,0,pixels,10+(DY>>DYSHIFT)))
X { int r1,g1,b1,r2,g2,b2;
X colored = True;
X
X XSetFillStyle(display,gc_filler,FillSolid);
X
X XStoreNamedColor(display,XDefaultColormapOfScreen(screen),
X "red",pixels[0],DoRed | DoGreen | DoBlue);
X XStoreNamedColor(display,XDefaultColormapOfScreen(screen),
X "blue",pixels[1],DoRed | DoGreen | DoBlue);
X XStoreNamedColor(display,XDefaultColormapOfScreen(screen),
X "violet",pixels[2],DoRed | DoGreen | DoBlue);
X XStoreNamedColor(display,XDefaultColormapOfScreen(screen),
X "green",pixels[3],DoRed | DoGreen | DoBlue);
X XStoreNamedColor(display,XDefaultColormapOfScreen(screen),
X "yellow",pixels[4],DoRed | DoGreen | DoBlue);
X XStoreNamedColor(display,XDefaultColormapOfScreen(screen),
X "cyan",pixels[5],DoRed | DoGreen | DoBlue);
X XStoreNamedColor(display,XDefaultColormapOfScreen(screen),
X "navy",pixels[6],DoRed | DoGreen | DoBlue);
X XStoreNamedColor(display,XDefaultColormapOfScreen(screen),
X "orange",pixels[7],DoRed | DoGreen | DoBlue);
X
X XStoreNamedColor(display,XDefaultColormapOfScreen(screen),
X "wheat",pixels[8],DoRed | DoGreen | DoBlue);
X XStoreNamedColor(display,XDefaultColormapOfScreen(screen),
X "dark green",pixels[9],DoRed | DoGreen | DoBlue);
X XSetState(display,gc_or,pixels[9],pixels[9],GXcopy,AllPlanes);
X
X r1 = 192 * 256; g1 = 224 * 256; b1 = 255 * 256;
X r2 = 255 * 256; g2 = 192 * 256; b2 = 192 * 256;
X
X for (i=0;i<(DY>>DYSHIFT);i++)
X { cols[i].pixel = pixels[10+i];
X cols[i].red = (unsigned short)(r1+((r2-r1)*i)/(DY>>DYSHIFT));
X cols[i].green = (unsigned short)(g1+((g2-g1)*i)/(DY>>DYSHIFT));
X cols[i].blue = (unsigned short)(b1+((b2-b1)*i)/(DY>>DYSHIFT));
X cols[i].flags = DoRed | DoGreen | DoBlue;
X }
X XStoreColors(display,XDefaultColormapOfScreen(screen),cols,(DY>>DYSHIFT));
X }
X else
X { colored = False; }
X
X
X grey[0]=XCreatePixmapFromBitmapData(display,ROOT,grey0_bits,grey0_width,grey0_height,
X 1,0,DefaultDepthOfScreen(screen));
X grey[1]=XCreatePixmapFromBitmapData(display,ROOT,grey1_bits,grey1_width,grey1_height,
X 1,0,DefaultDepthOfScreen(screen));
X grey[2]=XCreatePixmapFromBitmapData(display,ROOT,grey2_bits,grey2_width,grey2_height,
X 1,0,DefaultDepthOfScreen(screen));
X grey[3]=XCreatePixmapFromBitmapData(display,ROOT,grey3_bits,grey3_width,grey3_height,
X 1,0,DefaultDepthOfScreen(screen));
X grey[4]=XCreatePixmapFromBitmapData(display,ROOT,grey4_bits,grey4_width,grey4_height,
X 1,0,DefaultDepthOfScreen(screen));
X grey[5]=XCreatePixmapFromBitmapData(display,ROOT,grey5_bits,grey5_width,grey5_height,
X 1,0,DefaultDepthOfScreen(screen));
X grey[6]=XCreatePixmapFromBitmapData(display,ROOT,grey6_bits,grey6_width,grey6_height,
X 1,0,DefaultDepthOfScreen(screen));
X grey[7]=XCreatePixmapFromBitmapData(display,ROOT,grey7_bits,grey7_width,grey7_height,
X 1,0,DefaultDepthOfScreen(screen));
X
X backw=XCreateSimpleWindow(display,ROOT,0,0,DWidth,DHeight,
X 0,WhitePixelOfScreen(screen),BlackPixelOfScreen(screen));
X attrib.override_redirect = 1;
X XChangeWindowAttributes(display,backw,CWOverrideRedirect,&attrib);
X
X if (colored)
X { mw=XCreateSimpleWindow(display,backw,
X (DWidth-MWWidth)>>1,(DHeight-MWHeight)>>1,MWWidth,MWHeight,
X 0,WhitePixelOfScreen(screen),cols[DY>>(DYSHIFT+1)].pixel);
X }
X else
X { mw=XCreateSimpleWindow(display,backw,
X (DWidth-MWWidth)>>1,(DHeight-MWHeight)>>1,MWWidth,MWHeight,
X 0,WhitePixelOfScreen(screen),BlackPixelOfScreen(screen));
X }
X
X XSelectInput(display,mw,ExposureMask | ButtonPressMask | KeyPressMask | KeyReleaseMask );
X attrib.override_redirect = 1;
X XChangeWindowAttributes(display,mw,CWOverrideRedirect,&attrib);
X XMapRaised(display,mw);
X
X if (colored)
X { scorew=XCreateSimpleWindow(display,ROOT,0,0,DWidth,DHeight,8,pixels[9],cols[DY>>(DYSHIFT+1)].pixel);
X }
X else
X { scorew=XCreateSimpleWindow(display,ROOT,0,0,DWidth,DHeight,8,BlackPixelOfScreen(screen),WhitePixelOfScreen(screen));
X XSetWindowBorderPixmap(display,scorew,grey[5]);
X }
X XSelectInput(display,scorew,ExposureMask);
X XChangeWindowAttributes(display,scorew,CWOverrideRedirect,&attrib);
X}
X
X/*************
X * MAIN-LOOP *
X *************/
X for(;;)
X switch(mess=readint(master))
X { int len,signs;
X
X case GAMESTART:
X/* weitere Informationen zum aktuellen Spiel holen */
X players=readint(master); /* Anzahl der Spieler */
X active=readint(master); /* Flag, ob eigener Spieler rechnergesteuert */
X game_num=readint(master); /* Spielezaehler */
X
X start_flag=readint(master); /* Flag, ob man fuer das erste Datagramm im Ring sorgen soll */
X
X/* Socket-Adresse des naechsten Spielers im Ring empfangen */
X readstring(master,next_host,19);
X next_port=htons(readshort(master));
X init_addr(&next_sin,next_host,next_port);
X if (messflag)
X { printf("%s: start of game %d with %d players (start_flag=%d)\n",my_host,game_num,players,start_flag);
X printf("%s: next port is %s@%d\n",my_host,next_host,(int)ntohs(next_port));
X fflush(stdout);
X }
X prepare_to_start();
X
X#if (moremess==1)
X printf("%s: received players: %d active: %d start: %d.\n",my_host,players,active,start_flag);
X fflush(stdout);
X#endif
X
X/* ausgewaehlter Spieler initialisiert Packet-Struktur und sendet sie in den Ring */
X p.mode=(short)SETUP;
X if (start_flag)
X { p.game_count=(short)0;
X p.players=(short)players;
X p.ready=(short)0;
X p.game_number=(short)game_num;
X for (i=0;i<MAXPLAYERS;i++)
X for (j=0;j<DIMENSION;j++)
X { p.x[i][j]=posx= (P_TYPE)NONE;
X p.y[i][j]=posy= (P_TYPE)NONE;
X };
X write_p();
X }
X
X/* Schleife fuer Ausfuehrung eines Zuges */
X#if (times==0)
X while(make_move());
X#else
X /*************************************************************************
X * Testprogramm zur Messung der Umlaufzeit des Datagramms durch den Ring *
X *************************************************************************/
X
X for (t_count=0;t_count<=MAXMESS;t_count++)
X { gettimeofday(&tfield[t_count],&zone);
X while (read_p());
X write_p();
X };
X if (start_flag)
X { FILE *fopen(),*fp;
X fp=fopen("sockets/time_file","w");
X for (t_count=1;t_count<=MAXMESS;t_count++)
X { long t;
X
X t=((tfield[t_count].tv_sec & 0xffff)*1000000 + tfield[t_count].tv_usec)
X -((tfield[t_count-1].tv_sec & 0xffff)*1000000 + tfield[t_count-1].tv_usec);
X fprintf(fp,"%3d: %8ld usec\n",t_count,t);
X };
X fclose(fp);
X printf("%s: Timefile written.\n",my_host);
X fflush(stdout);
X };
X#endif
X if (!auto_only) XUngrabServer(display);
X break;
X case SCORE:
X read_scores(); /* Stringfeld lesen und ausgeben */
X if (!auto_only) redraw_scores();
X break;
X case EXIT:
X printf("%s: program ends.\n",my_host); /* Programm beenden */
X exit(0);
X break;
X case UNMAP:
X if (auto_only) break;
X XUnmapWindow(display,scorew); /* Punktefenster vom Bildschirm entfernen */
X XUnmapWindow(display,backw);
X XFlush(display);
X break;
X default:
X fprintf(stderr,"%s: received unknown instruction (%d) from master.\n",my_host,mess);
X break;
X };
X}
X
X/********************
X * Stringfeld lesen *
X ********************/
X
Xread_scores()
X{ int l;
X
X max_col=0;
X lines=readint(master);
X
X for (l=0;l<lines;l++)
X { readstring(master,&tscreen[l][0],80);
X if (strlen(tscreen[l])>max_col)
X max_col=strlen(tscreen[l]);
X };
X}
X
X/***********************
X * Stringfeld ausgeben *
X ***********************/
X
Xredraw_scores()
X{ int x_wsize,y_wsize;
X int l;
X XEvent event;
X
X if (auto_only) return;
X
X XUnmapWindow(display,scorew);
X x_wsize=CharWidth(FID) * (2+max_col);
X y_wsize=CharHeight(FID) * (2+lines);
X XMoveResizeWindow(display,scorew,(DWidth-x_wsize)>>1,(DHeight-y_wsize)>>1,x_wsize,y_wsize);
X XMapRaised(display,scorew);
X/* XWindowEvent(display,scorew,ExposureMask,&event); */
X if (colored)
X { int xw=1,i;
X int sdx=(x_wsize>>5);
X int y0,y1;
X
X y0=0;
X for (i=0;i<32;i++)
X { y1 = y_wsize*(i+1)/32;
X XSetForeground(display,gc_filler,cols[(DY>>DYSHIFT)*(31-i)/32].pixel);
X XFillRectangle(display,scorew,gc_filler,0,y0,xw*sdx,y1-y0);
X y0=y1;
X }
X do
X { XCopyArea(display,scorew,scorew,gc_filler,
X 0,0,xw*sdx,y_wsize,xw*sdx,0);
X xw<<=1;
X }
X while (xw<=32);
X }
X else
X { XClearWindow(display,scorew);
X }
X aw=scorew;
X
X for (l=0;l<lines;l++)
X { printat(1,l+1,tscreen[l],FID);
X };
X XFlush(display);
X}
X
X/**********************
X * Spielfeld loeschen *
X **********************/
X
Xempty_all()
X{ int x,y;
X
X for (x=0;x<DX;x++)
X for (y=0;y<DY;y++)
X field[x][y]=0;
X for (x=0;x<DX;x++)
X { field[x][0]= -1;
X field[x][DY-1]= -1;
X };
X for (y=0;y<DY;y++)
X { field[0][y]= -1;
X field[DX-1][y]= -1;
X };
X}
X
X/*****************************************
X * Vorbereitungen zum Spielstart treffen *
X *****************************************/
X
Xprepare_to_start()
X{ int i;
X XEvent event;
X
X empty_all();
X if (active==1)
X { XGrabServer(display);
X XMapRaised(display,backw);
X/* XWindowEvent(display,mw,ExposureMask,&event); */
X XClearWindow(display,mw);
X
X if (colored)
X { int xw = 1;
X
X for (i=0;i<(DY>>DYSHIFT);i++)
X { XSetForeground(display,gc_filler,cols[i].pixel);
X XFillRectangle(display,mw,gc_filler,0,y_size+i*(y_size<<DYSHIFT),xw*x_size,(y_size<<DYSHIFT));
X }
X do
X { XCopyArea(display,mw,mw,gc_filler,
X 0,0,xw*x_size,MWHeight,xw*x_size,0);
X xw<<=1;
X }
X while (xw<DX);
X
X XSetForeground(display,gc_filler,pixels[9]);
X XFillRectangle(display,mw,gc_filler,0,0,MWWidth,y_size-1);
X XFillRectangle(display,mw,gc_filler,0,MWHeight-y_size,MWWidth,y_size);
X XFillRectangle(display,mw,gc_filler,0,0,x_size-1,MWHeight);
X XFillRectangle(display,mw,gc_filler,MWWidth-x_size,0,x_size,MWHeight);
X }
X else
X { XFillRectangle(display,mw,gc_clear,0,0,MWWidth-1,y_size-1);
X XFillRectangle(display,mw,gc_clear,0,MWHeight-y_size,MWWidth-1,y_size-1);
X XFillRectangle(display,mw,gc_clear,0,0,x_size-1,MWHeight-1);
X XFillRectangle(display,mw,gc_clear,MWWidth-x_size,0,x_size-1,MWHeight-1);
X }
X XFlush(display);
X };
X
X writeint(master,PLAYER_READY);
X dx = 0;
X dy = 0;
X fast = 0;
X boost = 0;
X ready = 0;
X wait = 0;
X winner = 0;
X
X jmp_count = 10;
X
X lastmove=0;
X actmove=0;
X
X
X if (!auto_only)
X { XSync(display,1);
X while(XPending(display)) XNextEvent(display,&event);
X }
X
X}
X
X/*** Datagramm schreiben ***/
X
Xwrite_p()
X{
X p.mode = htons(p.mode);
X p.game_count = htons(p.game_count);
X p.game_number = htons(p.game_number);
X p.players = htons(p.players);
X p.ready = htons(p.ready);
X sendto(next,&p,sizeof (Pack),0,&next_sin,sizeof next_sin);
X p.mode = ntohs(p.mode);
X p.game_count = ntohs(p.game_count);
X p.game_number = ntohs(p.game_number);
X p.players = ntohs(p.players);
X p.ready = ntohs(p.ready);
X}
X
X/*** Datagramm lesen (Fehler bei Wartezeit>5 Sekunden) ***/
X
Xread_p()
X{
X int nfound,readfds,writefds,execptfds;
Xstruct timeval timeout;
X int fromlen=0;
X
X readfds=(1<<next);
X writefds=execptfds=0;
X /* bei angefangenem Spiel Timeout nach 5 Sekunden */
X timeout.tv_sec=(p.mode!=(short)PLAY)?(long)60:(long)5;
X timeout.tv_usec=(long)0;
X
X nfound=select(32,&readfds,&writefds,&execptfds,&timeout);
X
X if (nfound<=0) return(1);
X else
X { recvfrom(next,&p,sizeof (Pack),0,NULL,&fromlen);
X p.mode = ntohs(p.mode);
X p.game_count = ntohs(p.game_count);
X p.game_number = ntohs(p.game_number);
X p.players = ntohs(p.players);
X p.ready = ntohs(p.ready);
X return(0);
X };
X}
X
X/*****************************************
X * einen kompletten Spielzug ausfuehren: *
X * - Datagramm empfangen *
X * - Spielfeld aktualisieren *
X * - Eingabeevents auswerten *
X * - eigenen Zug ausfuehren *
X * - Datagramm senden *
X * - Bildschirm aktualisieren *
X *****************************************/
X
Xmake_move()
X{
Xint i,j;
Xint root_x,root_y,mx,my;
XWindow root,child;
Xint mask;
X
X/* Packet holen */
X do
X {
X if (read_p())
X { missing_datagram();
X return(0);
X };
X }
X while (game_num != (int)p.game_number);
X
X p.game_count++;
X
X if (p.mode & (short)GAME_OVER)
X { if (!(winner)) write_p(); /* Alle ausser dem Sieger leiten das Packet noch einmal weiter */
X return(0);
X };
X
X if (p.mode & (short)(SETUP | AUTO_START))
X { if ((p.players==(short)0) && (active==1))
X { XBell(display,0);
X XFlush(display);
X };
X
X if (start_flag)
X { if (p.game_count>(short)400) p.mode=(short)AUTO_START;
X };
X
X if (wait)
X { sleep(2);
X wait=0;
X p.mode=(short)PLAY;
X p.players=(short)players;
X };
X
X };
X
X if (active==0)
X { write_p();
X return(1);
X };
X
X/* Zug ausfuehren */
X
X/* a.) neue Positionen ins Spielfeld eintragen */
X for (i=0;i<MAXPLAYERS;i++)
X if (p.ready & (short)(1<<i))
X { if (p.x[i][0]!=(P_TYPE)NONE)
X { field[p.x[i][0]][p.y[i][0]]=i+1;
X if (p.x[i][1]!=(P_TYPE)NONE)
X { field[p.x[i][1]][p.y[i][1]]=i+1;
X if (p.x[i][2]!=(P_TYPE)NONE)
X { field[p.x[i][2]][p.y[i][2]]=i+1;
X if (p.x[i][3]!=(P_TYPE)NONE)
X field[p.x[i][3]][p.y[i][3]]=i+1;
X };
X };
X };
X }
X else
X { if (p.x[i][0]!=(P_TYPE)NONE)
X { field[p.x[i][0]][p.y[i][0]]=0;
X if (p.x[i][1]!=(P_TYPE)NONE)
X { field[p.x[i][1]][p.y[i][1]]=0;
X if (p.x[i][2]!=(P_TYPE)NONE)
X { field[p.x[i][2]][p.y[i][2]]=0;
X if (p.x[i][3]!=(P_TYPE)NONE)
X field[p.x[i][3]][p.y[i][3]]=0;
X };
X };
X };
X };
X
X/* Computerspiel ? */
X if (active==2)
X { comp_move();
X write_p();
X return(1);
X };
X
X/* b.) MausEvent auswerten */
X if (XPending(display)!=0) execute_event();
X
X/* Spieler automatisch setzen, wenn er es nicht selbst tut. */
X if ((p.mode & (short)AUTO_START) && (ready==0))
X { XQueryPointer(display,mw,&root,&child,&root_x,&root_y,&mx,&my,&mask);
X setplayer((P_TYPE)(mx / x_size),(P_TYPE)(my / y_size),1);
X };
X
X/* c.) eigenen Zug ausfuehren */
X if (p.mode & (short)PLAY)
X { if (ready)
X { move(0);
X
X/* bei gedrueckter mittlerer Taste schnellere Fahrt */
X if (fast)
X { if (XPending(display)!=0) execute_event();
X move(1);
X
X if (boost)
X { if (XPending(display)!=0) execute_event();
X move(2);
X if (XPending(display)!=0) execute_event();
X move(3);
X }
X else
X { p.x[my_count][2]= (P_TYPE)NONE;
X p.y[my_count][2]= (P_TYPE)NONE;
X p.x[my_count][3]= (P_TYPE)NONE;
X p.y[my_count][3]= (P_TYPE)NONE;
X };
X }
X else
X { p.x[my_count][1]= (P_TYPE)NONE;
X p.y[my_count][1]= (P_TYPE)NONE;
X };
X }
X else if (actmove!=lastmove) deleter();
X else p.x[my_count][0]=(P_TYPE)NONE;
X
X
X };
X
X/* Packet senden */
X write_p();
X
X/* Bildschirm bearbeiten */
X for (i=0;i<MAXPLAYERS;i++)
X if (p.ready & (short)(1<<i))
X { if (p.x[i][0]!=(P_TYPE)NONE)
X { if (colored) XSetForeground(display,gc_filler,pixels[i]);
X else XSetTile(display,gc_filler,grey[i]);
X XFillRectangle(display,mw,gc_filler,p.x[i][0]*x_size,p.y[i][0]*y_size,x_size-1,y_size-1);
X if (p.x[i][1]!=(P_TYPE)NONE)
X { XFillRectangle(display,mw,gc_filler,p.x[i][1]*x_size,p.y[i][1]*y_size,x_size-1,y_size-1);
X if (p.x[i][2]!=(P_TYPE)NONE)
X { XFillRectangle(display,mw,gc_filler,p.x[i][2]*x_size,p.y[i][2]*y_size,x_size-1,y_size-1);
X if (p.x[i][3]!=(P_TYPE)NONE)
X { XFillRectangle(display,mw,gc_filler,p.x[i][3]*x_size,p.y[i][3]*y_size,x_size-1,y_size-1);
X };
X };
X };
X };
X }
X else
X { if (colored)
X { if (p.x[i][0]!=(P_TYPE)NONE)
X { XSetForeground(display,gc_filler,cols[p.y[i][0]>>DYSHIFT].pixel);
X XFillRectangle(display,mw,gc_filler,p.x[i][0]*x_size,p.y[i][0]*y_size,x_size-1,y_size-1);
X if (p.x[i][1]!=(P_TYPE)NONE)
X { XSetForeground(display,gc_filler,cols[p.y[i][1]>>DYSHIFT].pixel);
X XFillRectangle(display,mw,gc_filler,p.x[i][1]*x_size,p.y[i][1]*y_size,x_size-1,y_size-1);
X if (p.x[i][2]!=(P_TYPE)NONE)
X { XSetForeground(display,gc_filler,cols[p.y[i][2]>>DYSHIFT].pixel);
X XFillRectangle(display,mw,gc_filler,p.x[i][2]*x_size,p.y[i][2]*y_size,x_size-1,y_size-1);
X if (p.x[i][3]!=(P_TYPE)NONE)
X { XSetForeground(display,gc_filler,cols[p.y[i][3]>>DYSHIFT].pixel);
X XFillRectangle(display,mw,gc_filler,p.x[i][3]*x_size,p.y[i][3]*y_size,x_size-1,y_size-1);
X }
X };
X };
X }
X }
X else
X { if (p.x[i][0]!=(P_TYPE)NONE)
X { XFillRectangle(display,mw,gc_set,p.x[i][0]*x_size,p.y[i][0]*y_size,x_size-1,y_size-1);
X if (p.x[i][1]!=(P_TYPE)NONE)
X { XFillRectangle(display,mw,gc_set,p.x[i][1]*x_size,p.y[i][1]*y_size,x_size-1,y_size-1);
X if (p.x[i][2]!=(P_TYPE)NONE)
X { XFillRectangle(display,mw,gc_set,p.x[i][2]*x_size,p.y[i][2]*y_size,x_size-1,y_size-1);
X if (p.x[i][3]!=(P_TYPE)NONE)
X XFillRectangle(display,mw,gc_set,p.x[i][3]*x_size,p.y[i][3]*y_size,x_size-1,y_size-1);
X };
X };
X }
X }
X };
X
X XSync(display,0);
X return(1);
X}
X
X/********************************************************************
X * Automatisches Setzen des Spielers, wenn Wartezeit ueberschritten *
X ********************************************************************/
X
Xsetplayer(mx,my,again)
X P_TYPE mx,my;
X int again;
X{
X do
X { if ((mx>0) && (mx<DX-1) && (my>0) && (my<DY-1) && (field[mx][my]==0))
X { xmove[lastmove ]= posx = p.x[my_count][0] = mx;
X ymove[lastmove++]= posy = p.y[my_count][0] = my;
X field[mx][my]=my_count+1;
X if ((--p.players) == 0) wait=1;
X else wait=0;
X ready = 1;
X p.ready |= (short)(1<<my_count);
X again = 0;
X };
X if (again)
X { if ((mx<(DX>>1)) || (again>10)) mx++;
X else mx--;
X if (my<(DY>>1)) my++;
X else my--;
X again++;
X };
X }
X while(again);
X}
X
X/********************
X * Event bearbeiten *
X ********************/
X
Xexecute_event()
X{ int help;
X
XXEvent event;
X
X int fct=0;
X
Xdo
X{
X XNextEvent(display,&event);
X
X switch (event.type)
X {
X case ButtonPress:
X switch((int)event.xbutton.button)
X {
X case Button3:
X if (!(boost)) fct=2;
X break;
X case Button2:
X if ((ready == 0) && (p.mode & (short)SETUP))
X { P_TYPE mx,my;
X setplayer((P_TYPE)(event.xbutton.x / x_size),(P_TYPE)(event.xbutton.y / y_size),0);
X }
X else
X fct=3;
X break;
X case Button1:
X if (!(boost)) fct=1;
X break;
X }; /* end switch(button) */
X break; /* end ButtonPress */
X
X case KeyPress:
X { char sign;
X KeySym keysym;
X
Xstatic Time last_time;
X
X XLookupString(&event,&sign,1,&keysym,NULL);
X
X if ((event.xkey.time==last_time) || (event.xkey.time==last_time + 1)) break;
X
X switch(keysym)
X {
X/*** KEYS to turn left ***/
X case XK_Z:
X case XK_z:
X case XK_X:
X case XK_x:
X case XK_M:
X case XK_m:
X case XK_less:
X case XK_comma:
X fct=1;
X last_time=event.xkey.time;
X break;
X
X/*** KEYS to turn right ***/
X case XK_C:
X case XK_c:
X case XK_V:
X case XK_v:
X case XK_greater:
X case XK_period:
X case XK_question:
X case XK_slash:
X fct=2;
X last_time=event.xkey.time;
X break;
X
X/*** jump ***/
X case XK_space:
X fct=3;
X break;
X/*** double speed ***/
X case XK_Shift_L:
X fast=1; boost=0; break;
X break;
X
X/*** double double speed ***/
X case XK_Control_L:
X fast=boost=((event.xkey.state & ShiftMask)?1:0);
X break;
X };
X };
X break;
X
X case KeyRelease:
X { char sign;
X KeySym keysym;
X
X XLookupString(&event,&sign,1,&keysym,NULL);
X switch(keysym)
X {
X case XK_Shift_L: fast=0; boost=0; break;
X case XK_Control_L: fast=((event.xkey.state & ShiftMask)?1:0); boost=0; break;
X };
X };
X };
X}
Xwhile ((XPending(display)) && (event.type==KeyRelease));
X
X switch(fct)
X {
X case 1:
X help= dx ;
X dx = dy ;
X dy = -help;
X break;
X case 2:
X help=dy ;
X dy =dx ;
X dx = -help;
X break;
X case 3:
X if (jmp_count == 0)
X { XBell(display,80);
X }
X else
X {
X posx += (P_TYPE)(3*dx) ;
X posy += (P_TYPE)(3*dy) ;
X jmp_count--;
X }
X break;
X }; /* end switch(fct) */
X}
X
X/********************************
X * bust - Spieler ist zerstoert *
X ********************************/
X
Xbust()
X{ if (active==1)
X { XBell(display,40);
X XFlush(display);
X };
X ready = 0;
X p.ready &= (short)~(1<<my_count);
X p.x[my_count][0]= (P_TYPE)NONE;
X
X if (--p.players==0)
X { p.mode=(short)GAME_OVER; /* falls letzter Spieler => Spiel ist aus */
X winner=1;
X };
X writeint(master,DESTROYED);
X writeint(master,(int)p.game_count);
X}
X
Xmissing_datagram()
X{
X writeint(master,ERROR);
X}
X
X/*********************************************************************************
X * Zug ausfuehren (ind = Index bei gleichzeitigen Zuegen (maxmal 4 bei boost=1)) *
X *********************************************************************************/
X
Xmove(ind)
X int ind;
X{ int root_x,root_y,mx,my;
X Window root,child;
X int mask;
X
X if ((dx == 0) && (dy == 0))
X { XQueryPointer(display,mw,&root,&child,&root_x,&root_y,&mx,&my,&mask);
X mx= (mx/x_size-posx );
X my= -(my/y_size-posy );
X if (mx>my)
X { if (mx> -my)
X { dx =1; dy =0; }
X else
X { dx =0; dy =1; }
X }
X else
X { if (mx> -my)
X { dx =0; dy = -1; }
X else
X { dx = -1; dy =0; };
X };
X fast = (mask & ShiftMask)?1:0;
X boost = ((mask & ControlMask)&&(fast))?1:0;
X };
X posx += (P_TYPE)dx ;
X posy += (P_TYPE)dy ;
X
X if ((posx!=(P_TYPE)0) && (posy!=(P_TYPE)0) && (posx<(P_TYPE)DX-1) && (posy<(P_TYPE)DY-1) && (field[posx][posy]==0) && ((p.players>(short)1) || (players==1)))
X { field[posx][posy]=my_count+1;
X xmove[lastmove] =p.x[my_count][ind]=posx;
X ymove[lastmove++]=p.y[my_count][ind]=posy;
X }
X else if (ind==0) bust();
X else
X { posx -= (P_TYPE)dx ;
X posy -= (P_TYPE)dy ;
X };
X}
X
X/************************************
X * zu loeschende Felder vorbereiten *
X ************************************/
X
Xdeleter()
X{ int i;
X
X for (i=0;i<DIMENSION;i++)
X { if (actmove<lastmove)
X { p.x[my_count][i]=xmove[actmove];
X p.y[my_count][i]=ymove[actmove++];
X }
X else
X { p.x[my_count][i]=(P_TYPE)NONE;
X p.y[my_count][i]=(P_TYPE)NONE;
X };
X }
X}
X
X/***************************
X * Computerzug-Algorithmus *
X ***************************/
X
Xchangedir()
X{ int dir[4],dir2[4],r1,r2,ok;
X
X dir2[0]=(dir[0]=(field[posx+1][posy ]==0)) & (field[posx+2][posy ]==0);
X dir2[1]=(dir[1]=(field[posx ][posy+1]==0)) & (field[posx ][posy+2]==0);
X dir2[2]=(dir[2]=(field[posx-1][posy ]==0)) & (field[posx-2][posy ]==0);
X dir2[3]=(dir[3]=(field[posx ][posy-1]==0)) & (field[posx ][posy-2]==0);
X
X r1=r2=(random() & 3);
X ok=0;
X do
X { if (dir2[r1])
X { ok=1;
X break;
X };
X }
X while ((r1= ((r1+1)&3))!=r2);
X
X if (ok==0)
X do
X { if (dir[r1]) break;
X }
X while ((r1= ((r1+1)&3))!=r2);
X
X switch(r1)
X {
X case 0: dx= 1; dy= 0; break;
X case 1: dx= 0; dy= 1; break;
X case 2: dx= -1; dy= 0; break;
X case 3:
X default: dx= 0; dy= -1; break;
X };
X
X posx+=(P_TYPE)dx;
X posy+=(P_TYPE)dy;
X}
X
Xcomp_move()
X{
X if (p.mode==(short)PLAY)
X { if (ready)
X {
X if ((dx==0) && (dy==0))
X { switch(random() & 3)
X {
X case 0: dx= 1; dy= 0; break;
X case 1: dx= 0; dy= 1; break;
X case 2: dx= -1; dy= 0; break;
X case 3:
X default: dx= 0; dy= -1; break;
X };
X };
X if ((random()%30)>0)
X { int helpx,helpy;
X
X if (field[helpx=((int)posx+dx)][helpy=((int)posy+dy)]==0)
X { if (field[helpx+dx][helpy+dy]==0)
X { posx=(P_TYPE)helpx;
X posy=(P_TYPE)helpy;
X }
X else
X changedir();
X }
X else
X changedir();
X }
X else
X changedir();
X
X if ((field[posx][posy]==0) && ((p.players>(short)1) || (players==1)))
X { field[posx][posy]=my_count+1;
X xmove[lastmove] =p.x[my_count][0]=posx;
X ymove[lastmove++]=p.y[my_count][0]=posy;
X }
X else bust();
X }
X else if (actmove!=lastmove) deleter();
X else p.x[my_count][0]=(P_TYPE)NONE;
X }
X else if ((p.mode==(short)SETUP) && (ready==0))
X {
X setplayer(1+(random()%(DX-2)),1+(random()%(DY-2)),1);
X };
X}
END_OF_FILE
if test 28406 -ne `wc -c <'tron_run.c'`; then
echo shar: \"'tron_run.c'\" unpacked with wrong size!
fi
# end of 'tron_run.c'
fi
if test -f 'helps.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'helps.c'\"
else
echo shar: Extracting \"'helps.c'\" \(2729 characters\)
sed "s/^X//" >'helps.c' <<'END_OF_FILE'
X/* This program was written by Helmut Hoenig */
X/* in May of 1988 at the Unitversity of */
X/* Kaiserslautern, Germany. It may be copied freely. */
X
X#include <stdio.h>
X#include <sys/types.h>
X#include <sys/socket.h>
X#include <netinet/in.h>
X#include <netdb.h>
X
Xchar *getenv();
X
Xint streamsocket()
X{ int s;
X
X if ((s=socket(AF_INET,SOCK_STREAM,0))<0)
X { fprintf(stderr,"*** %s: Can't create socket.\n",getenv("HOST"));
X exit(0);
X };
X return(s);
X}
X
Xint dgramsocket()
X{ int s;
X
X if ((s=socket(AF_INET,SOCK_DGRAM,0))<0)
X { fprintf(stderr,"*** %s: Can't create socket.\n",getenv("HOST"));
X exit(0);
X };
X return(s);
X}
X
Xint readint(socket)
X int socket;
X{ int buffer,signs;
X int s;
X
X signs=0;
X while(signs<sizeof buffer)
X { if ((s=read(socket,((char *)&buffer)+signs,(sizeof buffer)-signs))==0)
X { printf("** %s: BROKEN PIPE\n",getenv("HOST"));
X fflush(stdin);
X exit(0);
X };
X signs+=s;
X };
X
X buffer=ntohl(buffer);
X return(buffer);
X}
X
Xwriteint(socket,number)
X int socket,number;
X{ int buffer;
X
X buffer=htonl(number);
X write(socket,&buffer,sizeof buffer);
X}
Xshort readshort(socket)
X int socket;
X{ short buffer;
X int signs;
X int s;
X
X signs=0;
X while(signs<sizeof buffer)
X { if ((s=read(socket,((char *)&buffer)+signs,(sizeof buffer)-signs))==0)
X { printf("** %s: BROKEN PIPE\n",getenv("HOST"));
X fflush(stdin);
X exit(0);
X };
X signs+=s;
X };
X
X buffer=ntohs(buffer);
X return(buffer);
X}
X
Xwriteshort(socket,number)
X int socket;
X short number;
X{ short buffer;
X
X buffer=htons(number);
X write(socket,&buffer,sizeof buffer);
X}
X
Xwritestring(socket,string)
X int socket;
X char *string;
X{ int len;
X
X writeint(socket,len=strlen(string));
X write(socket,string,len);
X}
X
Xreadstring(socket,buffer,maxlen)
X int socket,maxlen;
X char *buffer;
X{ int len,signs;
X
X len=readint(socket);
X
X signs=0;
X while(signs<len)
X signs+=read(socket,buffer+signs,len-signs);
X buffer[len]='\0';
X}
X
Xshow_addr(host,sin)
X char *host;
X struct sockaddr_in *sin;
X{
X printf("%s: %d %d %ld\n",host,(int)(sin->sin_family),(int)(ntohs(sin->sin_port)),sin->sin_addr.s_addr);
X fflush(stdout);
X}
X
Xinit_addr(sin,hostname,port)
X struct sockaddr_in *sin;
X char *hostname;
X short port;
X{
Xstruct hostent *hp;
X
X if ((hp=gethostbyname(hostname))==NULL)
X { fprintf(stderr,"*** %s: Host not found. (%s)\n",getenv("HOST"),hostname);
X exit(0);
X };
X bzero(sin,sizeof *sin);
X sin->sin_family=AF_INET;
X sin->sin_port=port;
X bcopy(hp->h_addr,&sin->sin_addr,hp->h_length);
X}
X
Xint connect_to(socket,hostname,port)
X int socket;
X char *hostname;
X short port;
X{
Xstruct sockaddr_in sin;
X
X init_addr(&sin,hostname,port);
X if (connect(socket,&sin,sizeof sin)<0)
X { fprintf(stderr,"*** %s: Connection to %s/%d refused.\n",getenv("HOST"),hostname,(int)ntohs(port));
X exit(0);
X };
X}
END_OF_FILE
if test 2729 -ne `wc -c <'helps.c'`; then
echo shar: \"'helps.c'\" unpacked with wrong size!
fi
# end of 'helps.c'
fi
if test -f 'texter.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'texter.c'\"
else
echo shar: Extracting \"'texter.c'\" \(4239 characters\)
sed "s/^X//" >'texter.c' <<'END_OF_FILE'
X/* This program was written by Helmut Hoenig */
X/* in May of 1988 at the Unitversity of */
X/* Kaiserslautern, Germany. It may be copied freely. */
X
X#include <X11/Xlib.h>
X#include <stdio.h>
X
X#include "header.h"
X
X/*****************************
X * externe globale Variablen *
X *****************************/
X
Xextern Display *display;
Xextern Screen *screen;
X
Xextern XEvent event;
XWindow aw; /* Eingabe-/Ausgabefenster */
X
XGC gc_copy,gc_copyInverted; /* Graphik-Kontexte */
XGC gc_or,gc_orInverted,gc_xor;
XGC gc_clear,gc_set;
XGC gc_filler;
XGC gc_root;
X
X#define MAXID 2
X
XXFontStruct *finfo[MAXID]; /* Zeiger auf FontInfo-Strukturen der geladenen Fonts */
Xint floaded[MAXID];
X
X/**************
X * Prozeduren *
X **************/
X
Xopenfont(name,fid) /*f font <name> eroeffnen mit Nummer <fid> */
X char *name;
X int fid;
X
X{ if ((fid >= 0) && (fid < MAXID))
X { closefont(fid);
X if ((finfo[fid]=XLoadQueryFont(display,name)) == NULL)
X { fprintf(stderr,"** Unable to load font %s\n",name);
X exit(-1);
X };
X floaded[fid]=1;
X };
X}
X
Xclosefont(fid) /*f font mit Nummer <fid> schliessen */
X int fid;
X
X{ if ((fid >=0) && (fid < MAXID))
X if (floaded[fid]==1)
X { XFreeFont(display,finfo[fid]);
X floaded[fid]=0;
X }
X}
X
Xinit_texter()
X{
Xint reverse;
Xint mw=XRootWindowOfScreen(screen);
X
X openfont(FONT_NAME,0);
X reverse = (XBlackPixelOfScreen(screen)==0)?1:0;
X
X/* Standard-GC setzen */
X gc_copy = DefaultGCOfScreen(screen);
X XSetState(display,gc_copy,1,0,(reverse)?GXcopyInverted:GXcopy,AllPlanes);
X XSetLineAttributes(display,gc_copy,0,LineSolid,CapButt,JoinBevel);
X XSetGraphicsExposures(display,gc_copy,0);
X
X/* Invers-GC setzen */
X gc_copyInverted=XCreateGC(display,mw,(unsigned long)0,NULL);
X XCopyGC(display,gc_copy,(long)-1,gc_copyInverted);
X XSetFunction(display,gc_copyInverted,(reverse)?GXcopy:GXcopyInverted);
X
X/* GC_clear setzen */
X gc_clear=XCreateGC(display,mw,(unsigned long)0,NULL);
X XCopyGC(display,gc_copy,(long)-1,gc_clear);
X XSetFunction(display,gc_clear,(reverse)?GXset:GXclear);
X
X/* GC_set setzen */
X gc_set=XCreateGC(display,mw,(unsigned long)0,NULL);
X XCopyGC(display,gc_copy,(long)-1,gc_set);
X XSetFunction(display,gc_set,(reverse)?GXclear:GXset);
X
X/* OR-GC setzen */
X gc_or=XCreateGC(display,mw,(unsigned long)0,NULL);
X XCopyGC(display,gc_copy,(long)-1,gc_or);
X XSetFunction(display,gc_or,(reverse)?GXandInverted:GXor);
X XSetFont(display,gc_or,finfo[0]->fid);
X
X/* ORInverted-GC setzen */
X gc_orInverted=XCreateGC(display,mw,(unsigned long)0,NULL);
X XCopyGC(display,gc_or,(long)-1,gc_orInverted);
X XSetFunction(display,gc_orInverted,(reverse)?GXor:GXandInverted);
X
X/* XOR-GC setzen */
X gc_xor=XCreateGC(display,mw,(unsigned long)0,NULL);
X XCopyGC(display,gc_copy,(long)-1,gc_xor);
X XSetFunction(display,gc_xor,GXxor);
X
X/* root-GC setzen */
X gc_root=XCreateGC(display,mw,(unsigned long)0,NULL);
X XCopyGC(display,gc_xor,(long)-1,gc_root);
X XSetSubwindowMode(display,gc_root,IncludeInferiors);
X
X/* filler-GC setzen */
X gc_filler=XCreateGC(display,mw,(unsigned long)0,NULL);
X XCopyGC(display,gc_copy,(long)-1,gc_filler);
X XSetFunction(display,gc_filler,(reverse)?GXcopyInverted:GXcopy);
X XSetFillStyle(display,gc_filler,FillTiled);
X XSetTSOrigin(display,gc_filler,0,0);
X}
X
Xprintcleared(x,y,string,fid) /*f Text an Zeichenposition x,y ausgeben (Hintergrund wird geloescht) */
X int x,y,fid;
X char *string;
X{
X XFillRectangle(display,aw,gc_clear,x * CharWidth(fid),y * CharHeight(fid),StringWidth(string,fid),CharHeight(fid));
X printat(x,y,string,fid);
X}
X
Xprintat(x,y,string,fid) /*f Text an Zeichenposition x,y ausgeben */
X int x,y,fid;
X char *string;
X{
X XSetFont(display,gc_or,finfo[fid]->fid);
X XDrawString(display,aw,gc_or,
X x * CharWidth(fid),y * CharHeight(fid) + finfo[fid]->ascent,string,strlen(string));
X}
X
Xprint(x,y,string,fid) /*f Text an Position x,y ausgeben */
X int x,y,fid;
X char *string;
X{
X XSetFont(display,gc_or,finfo[fid]->fid);
X XDrawString(display,aw,gc_or,
X x,y+finfo[fid]->ascent,string,strlen(string));
X}
X
Xtext(x,y,string,fid) /*f Text zentriert ausgeben (Hintergrund loeschen) */
X int x,y,fid;
X char *string;
X
X{ int xs,ys;
X
X XSetFont(display,gc_or,finfo[fid]->fid);
X XDrawString(display,aw,gc_or,x-(StringWidth(string,fid)>>1),y+(finfo[fid]->ascent>>1),string,strlen(string));
X}
END_OF_FILE
if test 4239 -ne `wc -c <'texter.c'`; then
echo shar: \"'texter.c'\" unpacked with wrong size!
fi
# end of 'texter.c'
fi
if test -f 'header.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'header.h'\"
else
echo shar: Extracting \"'header.h'\" \(394 characters\)
sed "s/^X//" >'header.h' <<'END_OF_FILE'
X/************************
X * globale Definitionen *
X ************************/
X
X#define ROOT XRootWindowOfScreen(screen)
X#define DHeight HeightOfScreen(screen)
X#define DWidth WidthOfScreen(screen)
X
X#define CharWidth(id) (finfo[id]->max_bounds.width)
X#define CharHeight(id) (finfo[id]->descent + finfo[id]->ascent)
X#define StringWidth(string,id) XTextWidth(finfo[id],string,strlen(string))
END_OF_FILE
if test 394 -ne `wc -c <'header.h'`; then
echo shar: \"'header.h'\" unpacked with wrong size!
fi
# end of 'header.h'
fi
if test -f 'messages.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'messages.h'\"
else
echo shar: Extracting \"'messages.h'\" \(132 characters\)
sed "s/^X//" >'messages.h' <<'END_OF_FILE'
X#define EXIT 0
X#define GAMESTART 1
X#define SCORE 2
X#define PLAYER_READY 4
X#define DESTROYED 8
X#define UNMAP 16
X#define ERROR 32
END_OF_FILE
if test 132 -ne `wc -c <'messages.h'`; then
echo shar: \"'messages.h'\" unpacked with wrong size!
fi
# end of 'messages.h'
fi
if test -f 'grey_maps.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'grey_maps.h'\"
else
echo shar: Extracting \"'grey_maps.h'\" \(1804 characters\)
sed "s/^X//" >'grey_maps.h' <<'END_OF_FILE'
X#define grey0_width 16
X#define grey0_height 16
Xstatic short grey0_bits[] = {
X 0x0000, 0x0000, 0x0000, 0x0000,
X 0x0000, 0x0000, 0x0000, 0x0000,
X 0x0000, 0x0000, 0x0000, 0x0000,
X 0x0000, 0x0000, 0x0000, 0x0000};
X#define grey1_width 16
X#define grey1_height 16
Xstatic short grey1_bits[] = {
X 0x9249, 0x4924, 0x2492, 0x9249,
X 0x4924, 0x2492, 0x9249, 0x4924,
X 0x2492, 0x9249, 0x4924, 0x2492,
X 0x9249, 0x4924, 0x2492, 0x9249};
X#define grey2_width 16
X#define grey2_height 16
Xstatic short grey2_bits[] = {
X 0x6db6, 0xb6db, 0xdb6d, 0x6db6,
X 0xb6db, 0xdb6d, 0x6db6, 0xb6db,
X 0xdb6d, 0x6db6, 0xb6db, 0xdb6d,
X 0x6db6, 0xb6db, 0xdb6d, 0x6db6};
X#define grey3_width 16
X#define grey3_height 16
Xstatic short grey3_bits[] = {
X 0x3333, 0x3333, 0xcccc, 0xcccc,
X 0x3333, 0x3333, 0xcccc, 0xcccc,
X 0x3333, 0x3333, 0xcccc, 0xcccc,
X 0x3333, 0x3333, 0xcccc, 0xcccc};
X#define grey4_width 16
X#define grey4_height 16
Xstatic short grey4_bits[] = {
X 0x9249, 0x2492, 0x4924, 0x9249,
X 0x2492, 0x4924, 0x9249, 0x2492,
X 0x4924, 0x9249, 0x2492, 0x4924,
X 0x9249, 0x2492, 0x4924, 0x9249};
X#define grey5_width 16
X#define grey5_height 16
Xstatic short grey5_bits[] = {
X 0x5555, 0xaaaa, 0x5555, 0xaaaa,
X 0x5555, 0xaaaa, 0x5555, 0xaaaa,
X 0x5555, 0xaaaa, 0x5555, 0xaaaa,
X 0x5555, 0xaaaa, 0x5555, 0xaaaa};
X#define grey6_width 16
X#define grey6_height 16
Xstatic short grey6_bits[] = {
X 0xeeee, 0xbbbb, 0xeeee, 0xbbbb,
X 0xeeee, 0xbbbb, 0xeeee, 0xbbbb,
X 0xeeee, 0xbbbb, 0xeeee, 0xbbbb,
X 0xeeee, 0xbbbb, 0xeeee, 0xbbbb};
X#define grey7_width 16
X#define grey7_height 16
Xstatic char grey7_bits[] = {
X 0xd6, 0x5a, 0x29, 0xa5, 0xd6, 0x5a, 0xd6, 0x5a, 0x29, 0xa5, 0xd6, 0x5a,
X 0xd6, 0x5a, 0x29, 0xa5, 0xd6, 0x5a, 0xd6, 0x5a, 0x29, 0xa5, 0xd6, 0x5a,
X 0xd6, 0x5a, 0x29, 0xa5, 0xd6, 0x5a, 0xd6, 0x5a};
END_OF_FILE
if test 1804 -ne `wc -c <'grey_maps.h'`; then
echo shar: \"'grey_maps.h'\" unpacked with wrong size!
fi
# end of 'grey_maps.h'
fi
echo shar: End of shell archive.
echo '*** Think of changing the TRON_RUN_FILE-Macro in the makefile ! ***'
exit 0
More information about the Comp.sources.x
mailing list