[comp.sources.x] v09i073: acm, X aerial combat simulation, Part05/05

riley@mipsdal.mips.com (Riley Rainey) (10/08/90)

Submitted-by: riley@mipsdal.mips.com (Riley Rainey)
Posting-number: Volume 9, Issue 73
Archive-name: acm/part05

echo x - ./fsim/server.c
sed 's/^X//' >./fsim/server.c <<'*-*-END-of-./fsim/server.c-*-*'
X/*
X *	xflight : an aerial combat simulator for X
X *
X *	Written by Riley Rainey,  riley@mips.com
X *
X *	Permission to use, copy, modify and distribute (without charge) this
X *	software, documentation, images, etc. is granted, provided that this 
X *	comment and the author's name is retained.
X *
X */
X 
X#include "manifest.h"
X#include <sys/types.h>
X#include <stdio.h>
X#include <pwd.h>
X#include <signal.h>
X#include <sys/socket.h>
X#include <sys/ioctl.h>
X#include <sys/time.h>
X#include <netinet/in.h>
X#include <netdb.h>
X#include <setjmp.h>
X
Xextern struct servent *getservent();
Xint sdebug = 1;
Xint listen_socket;
X
Xvoid parseinfo (s, a, b, c)
Xchar *s, *a, *b, *c; {
X
X	char	*p;
X
X	for (p=a; *s; ++s, ++p)
X		if ((*p = *s) == ' ') {
X			*p = '\0';
X			break;
X		}
X
X	++ s;
X
X	for (p=b; *s; ++s, ++p)
X		if ((*p = *s) == ' ') {
X			*p = '\0';
X			break;
X		}
X
X	++ s;
X
X	strcpy (c, s);
X
X	return;
X}
X
Xmain (argc, argv)
Xint	argc;
Xchar	*argv[]; {
X
X	struct sockaddr_in sin;
X	struct	servent *sp;
X	int	on = 1;
X	int	i, background = 0;
X
X/*
X *  parse arguments
X */
X
X	for (i=1; i<argc; ++i) {
X
X		if (*argv[i] == '-')
X			switch (*(argv[i]+1)) {
X
X			case 'b':
X				background = 1;
X				break;
X
X			default:
X				fprintf (stderr, "Invalid switch \"%s\"\n", argv[i]);
X				break;
X			}
X	}
X
X	if (sdebug) {
X/*
X		if ((sp = getservbyname ("acm", "tcp");
X			fprintf (stderr, "can't find acm service\n");
X			exit (1);
X		}
X*/
X
X		if ((listen_socket = socket (AF_INET, SOCK_STREAM, 0)) < 0) {
X			perror ("socket");
X			exit (1);
X		}
X
X		sin.sin_family = AF_INET;
X		sin.sin_addr.s_addr = INADDR_ANY;
X		sin.sin_port = htons(ACM_PORT);
X
X		if (bind (listen_socket, &sin, sizeof(sin)) < 0) {
X			perror ("bind");
X			exit (1);
X		}
X	}
X	else {
X		listen_socket = 0;		/* inetd sets this up for us */
X/*		freopen ("/people/riley/acm.error", "a", stderr); */
X	}
X
X    	(void) setsockopt(listen_socket, SOL_SOCKET, SO_REUSEADDR,
X		(char *) &on, sizeof on);
X	(void) setsockopt(listen_socket, SOL_SOCKET, SO_KEEPALIVE,
X		(char *) &on, sizeof on);
X	ioctl(listen_socket, FIONBIO, (char *) &on);
X
X	if (listen (listen_socket, 5) < 0) {
X		perror ("listen");
X		close (listen_socket);
X		exit (1);
X	}
X
X	if (background)
X#ifdef SYSV
X		setpgrp (1);
X#else
X		setpgrp (0, 1);
X#endif
X
X	init ();
X	input();
X
X}
X
Xint peerdied = 0;
X
Xdeadpeer () {
X	fprintf (stderr, "SIGPIPE\n");
X	peerdied = 1;
X}
X
Xstruct	sigvec	alrm, pipe;
Xint doUpdate = 0;
X
Xmyalarm () {
X	doUpdate++;
X	sigvec (SIGALRM, &alrm, (struct sigvec *) 0);
X}
X
Xinput () {
X
X	fd_set	fdset, ofdset;
X	int	nplayers = 0, news = -1, playerchange = 0, n, pno, addrlen;
X	int	on = 1;
X	struct	sockaddr addr;
X	struct	itimerval update;
X	char	*bp, buf[128], name[64], display[64], args[128];
X
X	alrm.sv_handler = myalarm;
X	alrm.sv_mask = 0;
X	alrm.sv_flags = SV_INTERRUPT;
X	sigvec (SIGALRM, &alrm, (struct sigvec *) 0);
X
X/*
X *  Set real time clock to interrupt us every UPDATE_INTERVAL usecs.
X */
X
X	update.it_interval.tv_sec = 0;
X	update.it_interval.tv_usec = UPDATE_INTERVAL;
X	update.it_value.tv_sec = 0;
X	update.it_value.tv_usec = UPDATE_INTERVAL;
X	setitimer (ITIMER_REAL, &update, 0);
X
X	pipe.sv_handler = SIG_DFL;
X	pipe.sv_mask = 0;
X	pipe.sv_flags = SV_INTERRUPT;
X	sigvec (SIGPIPE, &pipe, (struct sigvec *) 0);
X
X	FD_ZERO (&ofdset);
X	FD_ZERO (&fdset);
X	FD_SET (listen_socket, &ofdset);
X
X	for (;;) {
X
X		sigsetmask (0);
X
X		fdset = ofdset;
X		pno = select (32, &fdset, (fd_set *) NULL, (fd_set *) NULL,
X			(struct itimerval *) NULL);
X
X		sigblock (SIGALRM);
X
X		if (pno < 0) {
X			FD_CLR (listen_socket, &fdset);
X			if (news > 0)
X				FD_CLR (news, &fdset);
X		}
X
X		if (FD_ISSET (listen_socket, &fdset) ||
X			(news > 0 && FD_ISSET(news, &fdset))) {
X			if (news == -1) {
X				addrlen = sizeof (addr);
X				news = accept(listen_socket, &addr, &addrlen);
X				if (news > 0) {
X					peerdied = 0;
X					pipe.sv_handler = deadpeer;
X					sigvec(SIGPIPE, &pipe, (struct sigvec *) 0);
X					ioctl (news, FIONBIO, &on);
X					FD_SET (news, &ofdset);
X					bp = buf;
X				}
X			}
X			if (news > 0) {
X				if ((n = read (news, bp, 1)) > 0) {
X					if (*bp == '\n') {
X						*bp = '\0';
X						parseinfo (buf, display,
X							name, args);
X						if (newPlayer (news,
X							display, name, args) == 0)
X							write (news, "Ready.\n", 7);
X							printf ("%s\n", display);
X						close (news);
X						news = -1;
X					}
X					else
X						bp++;
X					playerchange = 1;
X				}
X				if (n == 0)
X					peerdied = 1;
X			}
X		}
X
X		if (playerchange) {
X			FD_ZERO (&ofdset);
X			FD_SET (listen_socket, &ofdset);
X			if (news >= 0)
X				FD_SET (news, &ofdset);
X			pipe.sv_handler = SIG_DFL;
X			sigvec (SIGPIPE, &pipe, (struct sigvec *) 0);
X			playerchange = 0;
X		}
X
X		if (doUpdate) {
X			doUpdate = 0;
X			redraw ();
X		}
X
X	}
X}
*-*-END-of-./fsim/server.c-*-*
echo x - ./fsim/scale.h
sed 's/^X//' >./fsim/scale.h <<'*-*-END-of-./fsim/scale.h-*-*'
Xtypedef struct {
X	int	xorg;		/* x loc of bottom of scale */
X	int	yorg;		/* y loc of bottom of scale */
X	int	length;		/* length of scale (pixels) */
X	int	orientation;	/* orientation flags */
X	double	scale;		/* units per pixel */
X	int	minorInterval;	/* units per minor tick */
X	int	minorSize;	/* width of minor ticks (pixels) */
X	int	majorInterval;	/* units per major tick */
X	int	majorSize;	/* width of major ticks (pixels) */
X	int	indexSize;	/* width of index (pixels) */
X	double	divisor;	/* divisor on digit scale */
X	char	*format;	/* output format */
X	}	scaleControl;
X
X#define orientRight		1
X#define orientHorizontal	2
*-*-END-of-./fsim/scale.h-*-*
echo x - ./fsim/eng.xbm
sed 's/^X//' >./fsim/eng.xbm <<'*-*-END-of-./fsim/eng.xbm-*-*'
X#define eng_width 64
X#define eng_height 64
X#define eng_x_hot 31
X#define eng_y_hot 31
Xstatic char eng_bits[] = {
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc,
X   0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x01, 0x00, 0x00,
X   0x00, 0x00, 0xf8, 0x03, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x36, 0xc0,
X   0x01, 0x36, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xc0, 0x01, 0x58, 0x00, 0x00,
X   0x00, 0xc0, 0x03, 0x80, 0x00, 0xe0, 0x01, 0x00, 0x00, 0xe0, 0x00, 0x80,
X   0x00, 0x80, 0x03, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00,
X   0x00, 0x14, 0x00, 0xc0, 0x00, 0x00, 0x14, 0x00, 0x00, 0x0a, 0x00, 0x20,
X   0x01, 0x00, 0x28, 0x00, 0x00, 0x05, 0x00, 0x20, 0x01, 0x00, 0x52, 0x00,
X   0x00, 0x03, 0x00, 0x20, 0x01, 0x00, 0x64, 0x00, 0x80, 0x01, 0x00, 0x20,
X   0x01, 0x00, 0xce, 0x00, 0xc0, 0x00, 0x00, 0x20, 0x01, 0x00, 0x83, 0x01,
X   0xc0, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x80, 0x01, 0x60, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x03, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
X   0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x28, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x0a, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
X   0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
X   0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0c, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x18, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
X   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x06, 0x62, 0x0c, 0x00,
X   0x00, 0x80, 0x31, 0x30, 0x06, 0x93, 0x12, 0x00, 0x00, 0x40, 0x48, 0x30,
X   0x76, 0x92, 0x12, 0x00, 0x00, 0x40, 0x48, 0x37, 0x56, 0x92, 0x12, 0x80,
X   0x00, 0x80, 0x49, 0x35, 0x76, 0x92, 0x12, 0x00, 0x00, 0x40, 0x4a, 0x37,
X   0x06, 0x92, 0x12, 0x00, 0x00, 0x40, 0x4a, 0x30, 0x06, 0x67, 0x0c, 0x00,
X   0x00, 0x80, 0x31, 0x30, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
X   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0c, 0x00, 0x00, 0xe7,
X   0x44, 0x00, 0x00, 0x18, 0x0c, 0x00, 0x00, 0x29, 0x45, 0x00, 0x00, 0x18,
X   0x0c, 0x00, 0x00, 0x29, 0x6d, 0x00, 0x00, 0x18, 0x0c, 0x00, 0x00, 0xe7,
X   0x54, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x23, 0x54, 0x00, 0x00, 0x0c,
X   0x18, 0x00, 0x00, 0x2d, 0x44, 0x00, 0x00, 0x0c, 0x28, 0x00, 0x00, 0x29,
X   0x44, 0x00, 0x00, 0x0a, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
X   0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x60, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x80, 0x01,
X   0xc0, 0x40, 0x00, 0x30, 0x06, 0x00, 0x81, 0x01, 0x80, 0x69, 0x00, 0x48,
X   0x09, 0x00, 0xcb, 0x00, 0x00, 0x33, 0x00, 0x48, 0x09, 0x00, 0x66, 0x00,
X   0x00, 0x25, 0x00, 0x30, 0x09, 0x00, 0x52, 0x00, 0x00, 0x0a, 0x00, 0x48,
X   0x09, 0x00, 0x28, 0x00, 0x00, 0x14, 0x00, 0x48, 0x09, 0x00, 0x14, 0x00,
X   0x00, 0x38, 0x00, 0x30, 0x06, 0x00, 0x0e, 0x00, 0x00, 0xe0, 0x00, 0x80,
X   0x00, 0x80, 0x03, 0x00, 0x00, 0xc0, 0x03, 0x80, 0x00, 0xe0, 0x01, 0x00,
X   0x00, 0x00, 0x0d, 0x40, 0x01, 0x58, 0x00, 0x00, 0x00, 0x00, 0x36, 0xc0,
X   0x01, 0x36, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x03, 0xe0, 0x0f, 0x00, 0x00,
X   0x00, 0x00, 0xc0, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc,
X   0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
*-*-END-of-./fsim/eng.xbm-*-*
echo x - ./fsim/getStick.c
sed 's/^X//' >./fsim/getStick.c <<'*-*-END-of-./fsim/getStick.c-*-*'
X/*
X *	xflight : an aerial combat simulator for X
X *
X *	Written by Riley Rainey,  riley@mips.com
X *
X *	Permission to use, copy, modify and distribute (without charge) this
X *	software, documentation, images, etc. is granted, provided that this 
X *	comment and the author's name is retained.
X *
X */
X 
X#include "pm.h"
X#include <math.h>
X
X/*
X *  getStick :  get stick input from mouse
X *		inputs Sa and Se range from -1.0 to 1.0.
X */
X
Xint getStick (c, u)
Xcraft *c;
Xviewer *u; {
X
X	int	rootX, rootY, x, y;
X	Window	root, child;
X	unsigned int mask;
X	double	d, fuzz;
X
X	if (XQueryPointer (u->dpy, u->win, &root, &child, &rootX, &rootY,
X		&x, &y, &mask) == True) {
X
X		if (x >= 0 && y >= 0 && x < u->width && y < u->height) {
X
X			fuzz = (double) u->width / 48.0;
X			x = x - u->xCenter;
X			y = y - u->yCenter;
X			d = sqrt ((double)(x*x + y*y));
X
X			if (d > fuzz) {
X				c->Sa=(double) x / (double) u->xCenter * (d-fuzz) / d;
X				c->Se=(double) y / (double) u->yCenter * (d-fuzz) / d;
X#ifndef LINEAR_CONTROL_RESPONSE
X				if (c->Sa < 0.0)
X					c->Sa =  - c->Sa * c->Sa;
X				else
X					c->Sa = c->Sa * c->Sa;
X
X				if (c->Se < 0.0)
X					c->Se = - c->Se * c->Se;
X				else
X					c->Se = c->Se * c->Se;
X#endif
X			}
X			else {
X				c->Sa = 0.0;
X				c->Se = 0.0;
X			}
X			return 1;
X
X		}
X	}
X
X	return 0;
X}
*-*-END-of-./fsim/getStick.c-*-*
echo x - ./fsim/header
sed 's/^X//' >./fsim/header <<'*-*-END-of-./fsim/header-*-*'
X/*
X *	xflight : an aerial combat simulator for X
X *
X *	Written by Riley Rainey,  riley@mips.com
X *
X *	Permission to use, copy, modify and distribute (without charge) this
X *	software, documentation, images, etc. is granted, provided that this 
X *	comment and the author's name is retained.
X *
*-*-END-of-./fsim/header-*-*
echo x - ./fsim/rwy2
sed 's/^X//' >./fsim/rwy2 <<'*-*-END-of-./fsim/rwy2-*-*'
XRunway
X4 1
X1 0 -75.000000 0
X2 12000 -75 0
X3 12000 75.000000 0
X4 0 75.000000 0
X#b7b19f 4  1 2 3 4
*-*-END-of-./fsim/rwy2-*-*
echo x - ./fsim/droneCalculations.c
sed 's/^X//' >./fsim/droneCalculations.c <<'*-*-END-of-./fsim/droneCalculations.c-*-*'
X/*
X *	xflight : an aerial combat simulator for X
X *
X *	Written by Riley Rainey,  riley@mips.com
X *
X *	Permission to use, copy, modify and distribute (without charge) this
X *	software, documentation, images, etc. is granted, provided that this 
X *	comment and the author's name is retained.
X *
X */
X
X#include "pm.h"
X
X/*
X *  Drone flight management
X */
X
Xint droneCalculations (c)
Xcraft *c; {
X
X	c->prevSg = c->Sg;
X
X	c->Sg.x += c->Cg.x * deltaT;
X	c->Sg.y += c->Cg.y * deltaT;
X	c->Sg.z += c->Cg.z * deltaT;
X
X/*
X *  Don't let drones get above 60 thousand feet
X */
X
X	if (c->Sg.z < -60000.0)
X		return 1;
X
X/*
X *  Drone crash detection
X */
X
X	if (c->Sg.z > 0.0)
X		return 1;
X
X	return 0;
X}
*-*-END-of-./fsim/droneCalculations.c-*-*
echo x - ./fsim/flaps1.xbm
sed 's/^X//' >./fsim/flaps1.xbm <<'*-*-END-of-./fsim/flaps1.xbm-*-*'
X#define flaps1_width 64
X#define flaps1_height 32
X#define flaps1_x_hot -1
X#define flaps1_y_hot -1
Xstatic char flaps1_bits[] = {
X   0x00, 0xf0, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x80, 0xde, 0xdd, 0xfd,
X   0x1f, 0x00, 0x00, 0x00, 0x60, 0xef, 0xee, 0xee, 0xee, 0xff, 0x03, 0x00,
X   0x70, 0x77, 0x77, 0x77, 0x77, 0xf7, 0x3f, 0x00, 0x58, 0xbb, 0xbb, 0xbb,
X   0xbb, 0x7b, 0x01, 0x00, 0x48, 0xdf, 0xdd, 0xdd, 0xdd, 0x3d, 0x0f, 0x00,
X   0xe8, 0xfe, 0xff, 0xff, 0xff, 0x9f, 0x3f, 0x00, 0x38, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x07,
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x00};
*-*-END-of-./fsim/flaps1.xbm-*-*
echo x - ./fsim/aim-9
sed 's/^X//' >./fsim/aim-9 <<'*-*-END-of-./fsim/aim-9-*-*'
X#
X63 4
X1 -0.9167 0 0
X2 -0.9167 0.0833 0
X3 -1 0.1667 0
X4 -1.6667 0.25 0
X5 -1.8333 0.25 0
X6 -2.3333 0.8333 0
X7 -2.4167 1 0
X8 -2.4167 0.25 0
X9 -7.5833 0.25 0
X10 -8 1 0
X11 -9 1 0
X12 -9 -1 0
X13 -8 -1 0
X14 -7.5833 -0.25 0
X15 -2.4167 -0.25 0
X16 -2.4167 -1 0
X17 -2.3333 -0.8333 0
X18 -1.8333 -0.25 0
X19 -1.6667 -0.25 0
X20 -1 -0.1667 0
X21 -0.9167 -0.0833 0
X1 -0.9167 0 0
X2 -0.9167 0 0.0833
X3 -1 0 0.1667
X4 -1.6667 0 0.25
X5 -1.8333 0 0.25
X6 -2.3333 0 0.8333
X7 -2.4167 0 1
X8 -2.4167 0 0.25
X9 -7.5833 0 0.25
X10 -8 0 1
X11 -9 0 1
X12 -9 0 -1
X13 -8 0 -1
X14 -7.5833 0 -0.25
X15 -2.4167 0 -0.25
X16 -2.4167 0 -1
X17 -2.3333 0 -0.8333
X18 -1.8333 0 -0.25
X19 -1.6667 0 -0.25
X20 -1 0 -0.1667
X21 -0.9167 0 -0.0833
X43 -9 0.25 0
X44 -9 0.1768 0.1768
X45 -9 0 0.25
X46 -9 -0.1768 0.1768
X47 -9 -0.25 0
X48 -9 -0.1768 -0.1768
X49 -9 0 -0.25
X50 -9 0.1768 -0.1768
X51 -9 -0.25 0
X52 -9.75 -0.5 0
X53 -12 -0.75 0
X54 -13.5 -0.75 0
X55 -12.75 -0.5 0
X56 -15.25 -0.5 0
X57 -19.9167 0 0
X58 -15.0833 0.4167 0
X59 -15.75 0.5 0
X60 -12.5833 0.6667 0
X61 -12.0833 0.5833 0
X62 -9.833 0.5 0
X63 -9 0.25 0
Xwhite 21 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
Xwhite 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
Xwhite 8 43 44 45 46 47 48 49 50
Xwhite 13 51 52 53 54 55 56 57 58 59 60 61 62 63
*-*-END-of-./fsim/aim-9-*-*
echo x - ./fsim/missileCalculations.c
sed 's/^X//' >./fsim/missileCalculations.c <<'*-*-END-of-./fsim/missileCalculations.c-*-*'
X/*
X *	xflight : an aerial combat simulator for X
X *
X *	Written by Riley Rainey,  riley@mips.com
X *
X *	Permission to use, copy, modify and distribute (without charge) this
X *	software, documentation, images, etc. is granted, provided that this 
X *	comment and the author's name is retained.
X *
X */
X 
X#include <stdio.h>
X#include <math.h>
X#include "pm.h"
X
Xint mdebug = 0;
Xextern double calcRho();
X
Xint  missileCalculations (c)
Xcraft *c; {
X
X	double	q, rho, CLift, CDrag;
X	double	FLift, FDrag, FWeight;
X	double	Vmag, angle;
X	double  deltaRoll, deltaPitch, deltaYaw;
X	VPoint	F, Fg, tmpPt, r;
X	VMatrix turn, tmpMatrix, mtx;
X
X/*
X *  Check for ground impact.  We do this at the beginning to permit us to
X *  kill ground targets.
X */
X
X	if (c->Sg.z > 0.0) {
X		killMissile (c);
X		return 1;
X	}
X
X	trackTarget (c);
X
X	-- c->armFuse;
X
X/*
X *  Re-orient the body of the missile towards it's intended target.
X */
X
X	c->prevSg = c->Sg;
X
X	rho = calcRho (-(c->Sg.z));
X
X/*
X *  Compute the resultant force vector on the missile.
X */
X
X	Vmag = mag(c->Cg);
X	q = rho * c->cinfo->wingS * Vmag * Vmag * 0.5;
X	FLift = 0.0;
X	FDrag = c->cinfo->CDOrigin * q;
X
X	if (mdebug) {
X	printf ("rho = %g, FLift = %g, FDrag = %g\n", rho, FLift, FDrag);
X	printf ("FThrust = %g\n", c->curThrust);
X	}
X
X	F.x = c->curThrust - FDrag;
X	F.y = 0.0; 
X	F.z = 0.0; 
X
X/*
X *  Now calculate changes in position (Sg) and velocity (Cg).
X */
X
X	if ((c->fuel -= fuelUsed(c)) <= 0.0) {
X		if (c->curThrust > 0.0)
X			if (mdebug)
X			printf ("Missile burnout; velocity = %g fps (%g kts)\n", Vmag,
X				FPStoKTS(Vmag));
X		c->fuel = 0.0;
X		c->curThrust = 0.0;
X	}
X
X/*
X *  Normalize picth and heading Euler angles
X */
X
X	if (c->curPitch > pi / 2.0) {
X		c->curPitch = pi - c->curPitch;	
X		c->curHeading = (c->curHeading > pi) ?
X			c->curHeading - pi : c->curHeading + pi;
X		c->curRoll = pi - c->curRoll;
X	}
X	else if (c->curPitch < -pi/2.0) {
X		c->curPitch = -pi - c->curPitch;
X		c->curHeading = (c->curHeading > pi) ?
X			c->curHeading - pi : c->curHeading + pi;
X		c->curRoll = pi - c->curRoll;
X        }
X
X	if (c->curHeading < 0.0) {
X		c->curHeading += 2.0 * pi;
X	}
X	else if (c->curHeading > 2.0 * pi) {
X		c->curHeading -= 2.0 * pi;
X	}
X
X/*
X *  Compute transformation matricies
X */
X
X        VIdentMatrix (&mtx);
X        if (c->curRoll != 0.0)
X                VRotate (&mtx, XRotation, c->curRoll);
X	if (c->curPitch != 0.0)
X                VRotate (&mtx, YRotation, -c->curPitch);
X        if (c->curHeading != 0.0)
X                VRotate (&mtx, ZRotation, c->curHeading);
X	c->trihedral = mtx;
X
X	transpose (&c->trihedral, &c->Itrihedral);
X
X	craftToGround (c, &F, &Fg);
X	FWeight = c->cinfo->emptyWeight + c->fuel;
X	Fg.z += FWeight;
X
X	if (mdebug) {
X	    	printf ("v = %g, Fg = { %g, %g, %g }\n", FPStoKTS(Vmag),
X			Fg.x, Fg.y, Fg.z);
X	    	printf ("F = { %g, %g, %g }\n", F.x, F.y, F.z);
X	}
X
X
X
X/*
X *  Update the missile's position and velocity.
X */
X
X
X	c->Sg.x += c->Cg.x * deltaT + Fg.x / FWeight * a * halfDeltaTSquared;
X	c->Sg.y += c->Cg.y * deltaT + Fg.y / FWeight * a * halfDeltaTSquared;
X	c->Sg.z += c->Cg.z * deltaT + Fg.z / FWeight * a * halfDeltaTSquared;
X
X	c->Cg.x += Fg.x / FWeight * a * deltaT;
X	c->Cg.y += Fg.y / FWeight * a * deltaT;
X	c->Cg.z += Fg.z / FWeight * a * deltaT;
X
X
X	if (mdebug) {
X		printf ("Altitude = %g\n", -c->Sg.z);
X		printf ("Euler angles { %g, %g, %g }\n", RADtoDEG(c->curRoll),
X			RADtoDEG(c->curPitch), RADtoDEG(c->curHeading));
X		printf ("Cg = { %g, %g, %g }\n", c->Cg.x, c->Cg.y, c->Cg.z);
X		printf ("Sg = { %g, %g, %g }\n", c->Sg.x, c->Sg.y, c->Sg.z);
X	}
X
X	return 0;
X}
*-*-END-of-./fsim/missileCalculations.c-*-*
echo x - ./fsim/flaps2.xbm
sed 's/^X//' >./fsim/flaps2.xbm <<'*-*-END-of-./fsim/flaps2.xbm-*-*'
X#define flaps2_width 64
X#define flaps2_height 32
X#define flaps2_x_hot -1
X#define flaps2_y_hot -1
Xstatic char flaps2_bits[] = {
X   0x00, 0xf0, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xdd, 0xfd,
X   0x1f, 0x00, 0x00, 0x00, 0x20, 0xef, 0xee, 0xee, 0xee, 0xff, 0x03, 0x00,
X   0x30, 0x77, 0x77, 0x77, 0x77, 0xf7, 0x3f, 0x00, 0x38, 0xbb, 0xbb, 0xbb,
X   0xbb, 0x7b, 0x00, 0x00, 0x28, 0xdf, 0xdd, 0xdd, 0xdd, 0x3d, 0x0e, 0x00,
X   0x6c, 0xfe, 0xff, 0xff, 0xff, 0x1f, 0x1e, 0x00, 0x3c, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x3c, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00,
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x00};
*-*-END-of-./fsim/flaps2.xbm-*-*
echo x - ./fsim/flaps.c
sed 's/^X//' >./fsim/flaps.c <<'*-*-END-of-./fsim/flaps.c-*-*'
X/*
X *	xflight : an aerial combat simulator for X
X *
X *	Written by Riley Rainey,  riley@mips.com
X *
X *	Permission to use, copy, modify and distribute (without charge) this
X *	software, documentation, images, etc. is granted, provided that this 
X *	comment and the author's name is retained.
X *
X */
X 
X#include "pm.h"
X
Xint	flapsDown (c)
Xcraft	*c; {
X
X	c->flapSetting += 10.0 * pi / 180.0;
X	if (c->flapSetting > c->cinfo->maxFlap)
X		c->flapSetting = c->cinfo->maxFlap;
X	return 0;
X}
X
Xint	flapsUp (c)
Xcraft	*c; {
X
X	c->flapSetting -= 10.0 * pi / 180.0;
X	if (c->flapSetting < 0.0)
X		c->flapSetting = 0.0;
X	return 0;
X}
X
Xvoid	flapControl (c)
Xcraft	*c; {
X
X	if (c->flapSetting > c->curFlap) {
X		c->curFlap += c->cinfo->flapRate * deltaT;
X		if (c->curFlap > c->flapSetting)
X			c->curFlap = c->flapSetting;
X	}
X	else if (c->flapSetting < c->curFlap) {
X		c->curFlap -= c->cinfo->flapRate * deltaT;
X		if (c->curFlap < c->flapSetting)
X			c->curFlap = c->flapSetting;
X	}
X
X	if (c->speedBrakeSetting > c->curSpeedBrake) {
X		c->curSpeedBrake += c->cinfo->speedBrakeRate * deltaT;
X		if (c->curSpeedBrake > c->speedBrakeSetting)
X			c->curSpeedBrake = c->speedBrakeSetting;
X	}
X	else if (c->speedBrakeSetting < c->curSpeedBrake) {
X		c->curSpeedBrake -= c->cinfo->speedBrakeRate * deltaT;
X		if (c->curSpeedBrake < c->speedBrakeSetting)
X			c->curSpeedBrake = c->speedBrakeSetting;
X	}
X}
X
Xint	speedBrakeExtend (c)
Xcraft	*c; {
X
X	c->speedBrakeSetting += c->cinfo->speedBrakeIncr;
X	if (c->speedBrakeSetting > c->cinfo->maxSpeedBrake)
X		c->speedBrakeSetting = c->cinfo->maxSpeedBrake;
X	return 0;
X}
X
Xint	speedBrakeRetract (c)
Xcraft	*c; {
X
X	c->speedBrakeSetting -= c->cinfo->speedBrakeIncr;
X	if (c->speedBrakeSetting < 0.0)
X		c->speedBrakeSetting = 0.0;
X	return 0;
X}
*-*-END-of-./fsim/flaps.c-*-*
echo x - ./fsim/exp1.xbm
sed 's/^X//' >./fsim/exp1.xbm <<'*-*-END-of-./fsim/exp1.xbm-*-*'
X#define exp1_width 64
X#define exp1_height 64
X#define exp1_x_hot -1
X#define exp1_y_hot -1
Xstatic char exp1_bits[] = {
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
X   0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x81, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x20, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
X   0x80, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x80, 0x61, 0x00, 0x03,
X   0x00, 0x00, 0x00, 0x20, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40,
X   0x80, 0x20, 0x80, 0x01, 0x00, 0x80, 0x40, 0x40, 0x80, 0x38, 0x80, 0x01,
X   0x00, 0x80, 0x01, 0xa0, 0x82, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00,
X   0x82, 0x22, 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0xc4, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x00, 0x00, 0x06, 0x02, 0x10, 0x00, 0x80, 0x00, 0x0c, 0x80,
X   0xa9, 0x00, 0x00, 0x00, 0x00, 0x01, 0xa8, 0x10, 0x93, 0x75, 0x02, 0x20,
X   0x00, 0x00, 0xe0, 0x04, 0x3e, 0x03, 0x01, 0x20, 0x00, 0x04, 0x10, 0x92,
X   0x8a, 0x0e, 0x06, 0x1a, 0x00, 0x5c, 0x81, 0xf1, 0xef, 0x1b, 0x80, 0x01,
X   0x00, 0x18, 0x80, 0x0c, 0xcb, 0x01, 0xa5, 0x00, 0x00, 0x60, 0x88, 0x17,
X   0x43, 0x07, 0x87, 0x00, 0x00, 0xa0, 0x21, 0x79, 0xc7, 0x51, 0x23, 0x00,
X   0x00, 0x80, 0x40, 0x3f, 0xeb, 0x1e, 0x07, 0x00, 0x00, 0x00, 0x40, 0x1f,
X   0xef, 0xb8, 0x17, 0x00, 0x00, 0x04, 0x04, 0x06, 0x2c, 0x71, 0x06, 0x00,
X   0x00, 0x08, 0x00, 0x6b, 0x5f, 0x10, 0x02, 0x00, 0x00, 0x40, 0xf9, 0x38,
X   0x01, 0xbf, 0x01, 0x00, 0x00, 0x00, 0xac, 0xb3, 0x5f, 0xfd, 0x03, 0x00,
X   0x00, 0x00, 0xfc, 0xb9, 0x4f, 0xa7, 0x03, 0x10, 0x00, 0x00, 0xd7, 0xac,
X   0xc2, 0x9a, 0x0d, 0x04, 0x10, 0x40, 0x7b, 0xc9, 0x98, 0x79, 0x11, 0x18,
X   0x00, 0xc0, 0xfa, 0x8d, 0x18, 0xcb, 0x29, 0x02, 0x00, 0x80, 0xd8, 0x0d,
X   0x88, 0x0b, 0x57, 0x08, 0x00, 0xc0, 0x0c, 0x39, 0x60, 0x1b, 0x00, 0x00,
X   0x00, 0xd0, 0x64, 0x97, 0xc1, 0x73, 0x18, 0x03, 0x00, 0x6b, 0x81, 0x0e,
X   0x01, 0xfb, 0x0c, 0x02, 0x00, 0x80, 0xdf, 0x15, 0x81, 0x54, 0xe8, 0x02,
X   0x00, 0x00, 0xde, 0xff, 0xa2, 0xd9, 0x3c, 0x00, 0x00, 0x80, 0x3f, 0xde,
X   0xc2, 0xac, 0x94, 0x00, 0x00, 0x00, 0x33, 0xde, 0xec, 0x0b, 0x1e, 0x02,
X   0x00, 0xc0, 0x6c, 0x17, 0xe1, 0xe7, 0x1c, 0x02, 0x00, 0x50, 0x76, 0xfc,
X   0xf7, 0xfe, 0x3f, 0x00, 0x00, 0x1c, 0x5d, 0x9c, 0xfa, 0xba, 0x09, 0x00,
X   0x00, 0x04, 0x63, 0xcc, 0x0e, 0x8c, 0x89, 0x00, 0x00, 0x46, 0x82, 0x90,
X   0x80, 0xbb, 0x12, 0x00, 0x00, 0x02, 0xe3, 0xd7, 0x89, 0x81, 0x23, 0x00,
X   0x80, 0x81, 0x21, 0x83, 0x84, 0x89, 0x03, 0x00, 0x00, 0x00, 0x04, 0xf7,
X   0xcc, 0xdb, 0xe3, 0x00, 0x20, 0xa0, 0x00, 0xa6, 0x7e, 0x0b, 0xb1, 0x01,
X   0x20, 0x00, 0x00, 0x19, 0x6f, 0x4e, 0x8e, 0x00, 0x10, 0x00, 0x00, 0x1c,
X   0xe0, 0x53, 0x06, 0x02, 0x00, 0x00, 0x00, 0x04, 0xe7, 0xa9, 0x00, 0x02,
X   0x00, 0x00, 0x80, 0x43, 0x14, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
X   0x00, 0x88, 0x00, 0x0c, 0x00, 0x00, 0xc0, 0x00, 0x0c, 0x40, 0x00, 0x08,
X   0x00, 0x00, 0x40, 0x05, 0x08, 0x20, 0x01, 0x00, 0x00, 0x00, 0x60, 0x00,
X   0x04, 0x00, 0x02, 0x18, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x03, 0x10,
X   0x00, 0x01, 0x20, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x08, 0x08, 0x00,
X   0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x80, 0x00,
X   0x00, 0x80, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
X   0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x00, 0x10, 0x00,
X   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00};
*-*-END-of-./fsim/exp1.xbm-*-*
echo x - ./fsim/tower
sed 's/^X//' >./fsim/tower <<'*-*-END-of-./fsim/tower-*-*'
X*-a-control-tower
X60 16
X1 20 20 0
X2 20 -20 0
X3 12 -12 -60
X4 12 12 -60
X5 12 12 -60
X6 12 -12 -60
X7 12 -12 -64
X8 12 12 -64
X9 12 0.25 -64
X10 12 -0.25 -64
X11 12 -0.25 -72
X12 12 0.25 -72
X13 14 14 -72
X14 14 -14 -72
X15 0 0 -76
X16 -20 -20 0
X17 -20 20 0
X18 -12 12 -60
X19 -12 -12 -60
X20 -12 -12 -60
X21 -12 12 -60
X22 -12 12 -64
X23 -12 -12 -64
X24 -12 -0.25 -64
X25 -12 0.25 -64
X26 -12 0.25 -72
X27 -12 -0.25 -72
X28 -14 -14 -72
X29 -14 14 -72
X30 0 0 -76
X31 20 20 0
X32 -20 20 0
X33 -12 12 -60
X34 12 12 -60
X35 12 12 -60
X36 -12 12 -60
X37 -12 12 -64
X38 12 12 -64
X39 12 0.25 -64
X40 -12 0.25 -64
X41 -12 0.25 -72
X42 12 0.25 -72
X43 14 14 -72
X44 -14 14 -72
X45 0 0 -76
X46 -20 -20 0
X47 20 -20 0
X48 12 -12 -60
X49 -12 -12 -60
X50 -12 -12 -60
X51 12 -12 -60
X52 12 -12 -64
X53 -12 -12 -64
X54 -12 -0.25 -64
X55 12 -0.25 -64
X56 12 -0.25 -72
X57 -12 -0.25 -72
X58 -14 -14 -72
X59 14 -14 -72
X60 0 0 -76
Xgray33 4 1 2 3 4
Xgray33 4 5 6 7 8
Xgray33 4 9 10 11 12
Xgray33 3 13 14 15
Xgray33 4 16 17 18 19
Xgray33 4 20 21 22 23
Xgray33 4 24 25 26 27
Xgray33 3 28 29 30
Xgray33 4 31 32 33 34
Xgray33 4 35 36 37 38
Xgray33 4 39 40 41 42
Xgray33 3 43 44 45
Xgray33 4 46 47 48 49
Xgray33 4 50 51 52 53
Xgray33 4 54 55 56 57
Xgray33 3 58 59 60
*-*-END-of-./fsim/tower-*-*
echo x - ./fsim/weapon.c
sed 's/^X//' >./fsim/weapon.c <<'*-*-END-of-./fsim/weapon.c-*-*'
X#include "pm.h"
X
Xint selectWeapon(c)
Xcraft *c; {
X
X	register int n, m;
X
X	m = c->curWeapon;
X	n = (c->curWeapon + 1) % WEAPONTYPES;
X	for (; n != m; n = (n + 1) % WEAPONTYPES) {
X		if (wtbl[n].select != NULL)
X			if ((*wtbl[n].select)(c) == 1) {
X				c->curWeapon = n;
X				return 1;
X			}
X	}
X
X	return 0;
X}
X
Xint fireWeapon (c)
Xcraft *c; {
X
X	if (wtbl[c->curWeapon].firePress != NULL)
X		return (*wtbl[c->curWeapon].firePress)(c);
X
X	return 0;
X}
X
Xint ceaseFireWeapon (c)
Xcraft *c; {
X
X	if (wtbl[c->curWeapon].fireRelease != NULL)
X		return (*wtbl[c->curWeapon].fireRelease)(c);
X
X	return 0;
X}
X
Xint doWeaponDisplay (c, u)
Xcraft *c;
Xviewer *u; {
X
X	int	i;
X
X	if (wtbl[c->curWeapon].display != NULL)
X		return (*wtbl[c->curWeapon].display)(c, wtbl[c->curWeapon].w, u);
X	else {
X		for (i=0; i<3; i++)
X			strcpy (c->leftHUD[i], "");
X	}
X
X	return 0;
X}
X
Xint doWeaponUpdate (c)
Xcraft *c; {
X
X	if (wtbl[c->curWeapon].update != NULL)
X		return (*wtbl[c->curWeapon].update)(c);
X
X	return 0;
X}
*-*-END-of-./fsim/weapon.c-*-*
echo x - ./fsim/aim9m.c
sed 's/^X//' >./fsim/aim9m.c <<'*-*-END-of-./fsim/aim9m.c-*-*'
X/*
X *	xflight : an aerial combat simulator for X
X *
X *	Written by Riley Rainey,  riley@mips.com
X *
X *	Permission to use, copy, modify and distribute (without charge) this
X *	software, documentation, images, etc. is granted, provided that this 
X *	comment and the author's name is retained.
X *
X */
X 
X#include "pm.h"
X#include <stdio.h>
X#include <string.h>
X#include <math.h>
X
Xint select_aim9m();
Xint display_aim9m();
Xint getIRTarget();
Xextern int fireMissile ();
Xextern void createMissileEyeSpace();
X
XweaponDesc aim9mDesc = {
X	WK_AIM9M,
X	select_aim9m,		/* select */
X	(int (*)()) NULL,	/* update */
X	display_aim9m,		/* display procedure */
X	fireMissile,		/* fire */
X	(int (*)()) NULL,	/* fire button release */
X	};
X
X/*
X *  aim9m selection function
X *
X *  A selection function normally determines whether there are any weapons
X *  of this type on-board.  If so, and the weapon system is functional
X *  (in other words, undamaged) then return 1; otherwise return 0.
X */
X
Xint select_aim9m (c)
Xcraft *c; {
X
X	return 1;
X
X}
X
X/*
X * aim9m display function
X *
X *  Update the HUD display strings associated with this weapon system.
X */
X
Xint display_aim9m (c, w, u)
Xcraft *c;
XcraftType *w;
Xviewer *u; {
X
X	char	s[16];
X	double	d, a1, v, r, root1, root2, n, t;
X	VPoint	tmp;
X	VMatrix	m;
X	int	target, count;
X
X	count = 8;
X
X	sprintf (s, "%d AIM-9M", count);
X	strcpy (c->leftHUD[1], s);
X
X	a1 = w->maxThrust / (w->emptyWeight + w->maxFuel) * a;
X	v = mag (c->Cg);
X	a1 -= c->rho * c->cinfo->CDOrigin * v * v;
X
X	if (c->curRadarTarget >= 0 && a1 != 0.0) {
X
X	d = c->targetDistance;
X	r = c->targetClosure;
X
X	n = 4.0 * d / a1 + (r * r) / (a1 * a1);
X	if (n > 0) {
X		n = sqrt (n);
X		root1 = (- r / a + n) / 2.0;
X		root2 = (- r / a - n) / 2.0;
X		if (root1 >= 0.0)
X			if (root2 >= 0.0)
X				if (root1 < root2)
X					t = root1;
X				else
X					t = root2;
X			else
X				t = root1;
X		else if (root2 >= 0.0)
X			t = root2;
X		else
X			t = -1.0;
X	}
X	else
X		t = -1.0;
X	}
X
X	else
X		t = -1.0;
X
X/*
X *  See if the missiles can lock onto any target.
X */
X
X	if (count > 0) {
X		createMissileEyeSpace (c, &m);
X		target = getIRTarget (c, &m, &tmp);
X	}
X	else
X		target = -1;
X
X	if (target >= 0 && t <= 15.0)
X		sprintf (s, "LOCKED   %d", (int)(t+0.5));
X	else if (t < 0.0)
X		sprintf (s, "ARM      --");
X	else if (t <= 15.0)
X		sprintf (s, "IN RANGE %d", (int)(t+0.5));
X	else 
X		sprintf (s, "ARM      %d", (int)(t+0.5));
X
X	strcpy (c->leftHUD[0], s);
X
X	strcpy (c->leftHUD[2], "");
X
X}
X
Xextern craftType * newCraft ();
Xextern char * strdup();
X
Xvoid initaim9()
X{
X
X	craftType	*c;
X	FILE    	*f;
X
X	c = newCraft();
X	c->name = strdup("aim-9m");
X
X	wtbl[0] = aim9mDesc;
X	wtbl[0].w = c;
X
X	c->CLOrigin = 0.0;
X	c->CLSlope = 4.41235;
X	c->CLNegStall = -15.0 * pi / 180.0;
X	c->CLPosStall =  15.0 * pi / 180.0;
X
X	c->CDOrigin = 0.1963494;	/* 4" radius of body */
X	c->CDFactor = -2.56694;
X	c->CDPhase = 0.0;
X
X	c->CDBOrigin = 0.0;
X	c->CDBFactor = 0.0;
X	c->CDBPhase = 0.0;
X
X	c->CMOrigin = 0.0;
X	c->CMFactor = -0.75;
X
X	c->CNOrigin = 0.0;
X	c->CNFactor = -0.75;
X
X	VIdentMatrix(&(c->I));
X	c->I.m[0][0] =  0.0;
X	c->I.m[1][1] = 0.0;
X	c->I.m[2][2] = 0.0;
X	c->LDamp =  700000.0;
X	c->MDamp = 1000000.0;
X	c->NDamp = 1000000.0;
X	c->cmSlope = -1.88;
X	c->cmFactor = -1.00;
X	c->cnSlope = 1.00;
X	c->cnFactor = 0.50;
X	c->betaStall = 15.0 * pi / 180.0;
X
X	c->wingS = 1.0;
X
X/*
X *  Assume 150.0 lbs of weight is fuel and that it burns for 20 seconds.
X *  That yields a fuel burn rate of 7.5 lbs/second.
X */
X
X	c->emptyWeight = 40.0;
X	c->maxFuel = 150.0;
X	c->maxThrust = 791.0;
X	c->spFuelConsump = 34.134;
X
X/*
X *  Three second arming delay
X */
X
X	c->armDelay = 3.0;
X
X	c->groundingPoint.x = 0.0;
X	c->groundingPoint.y = 0.0;
X	c->groundingPoint.z = 0.0;
X
X	c->viewPoint.x = 0.0;
X	c->viewPoint.y = 0.0;
X	c->viewPoint.z = 0.0;
X
X	c->crashC = 1.0;
X
X	c->muStatic = 0.0;
X	c->muKinetic = 0.0;
X	c->muBStatic = 0.0;
X	c->muBKinetic = 0.0;
X
X	c->maxNWDef = 0.0;
X	c->NWIncr = 0.0;
X	c->maxNWS = 0.0;
X	c->gearD1 = 0.0;
X	c->gearD2 = 0.0;
X
X	f = fopen ("aim-9", "r");
X	c->object = VReadObject(f);
X	fclose (f);
X
X}
*-*-END-of-./fsim/aim9m.c-*-*
echo x - ./fsim/bullet
sed 's/^X//' >./fsim/bullet <<'*-*-END-of-./fsim/bullet-*-*'
X*a-bullet
X6 3
X1 0 0 0
X2 -0.4 0.5 0
X3 -19.0 0 0
X4 -0.4 -0.5 0
X5 -0.4 0 0.5
X6 -0.4 0 -0.5
Xred 4 1 2 3 4
Xred 4 1 5 3 6
Xred 4 2 5 4 6
*-*-END-of-./fsim/bullet-*-*
echo x - ./fsim/makefile.orig
sed 's/^X//' >./fsim/makefile.orig <<'*-*-END-of-./fsim/makefile.orig-*-*'
X#
X# Makefile for acm;  Riley Rainey, 1990
X#
XLDFLAGS = -L../V/lib
XCFLAGS = -g -I../V/lib -systype bsd43
X
XOBFILES = server.o \
X	  pm.o \
X	  flaps.o \
X	  droneCalculations.o\
X	  init.o \
X	  aim9m.o \
X	  m61a1.o \
X	  weapon.o \
X	  newPlayer.o \
X	  newPlane.o \
X	  missile.o \
X	  missileCalculations.o \
X	  update.o \
X	  doEvents.o \
X	  getStick.o \
X	  doViews.o \
X	  doRadar.o \
X	  placeCraft.o \
X	  transpose.o \
X	  doScale.o
X
Xall:	acm acms
X
Xacm:	acm.o
X	cc $(CFLAGS) $(LDFLAGS) -o acm acm.o
X
Xacms:	$(OBFILES)
X	cc $(CFLAGS) $(LDFLAGS) -o acms $(OBFILES) -lV -lX11 -lm
X
Xclean:
X	-rm core *.o
X
Xclobber:
X	-rm acm acms *.o core
X
Xtar:
X	tar cv acm acms f16 mig23 aim-9 rwy rwy2 tower mtn bullet
*-*-END-of-./fsim/makefile.orig-*-*
echo x - ./fsim/V2tgif.c
sed 's/^X//' >./fsim/V2tgif.c <<'*-*-END-of-./fsim/V2tgif.c-*-*'
X#include <stdio.h>
X#include <Vlib.h>
X
X#define INCHES	128
X
Xint	horg = 4 * INCHES;
Xint	vorg = 5 * INCHES;
Xdouble	scale = ((double) INCHES / 4.0);	/* 4 feet to the inch */
X
X#define	XAXIS	1
X#define YAXIS	2
X#define ZAXIS	3
Xint	axis = XAXIS;
X
Xextern char * optarg;
X
Xmain (argc, argv)
Xint	argc;
Xchar 	*argv[]; {
X
X	VObject	*object;
X	char	*name;
X	FILE	*f;
X	int	c, i, j, k, n;
X	int	v, h;
X	VPoint	*q, tmp;
X	VMatrix	 mtx;
X	VPolygon **p;
X
X	while ((c = getopt (argc, argv, "f:xyz")) != EOF) {
X
X		switch (c) {
X
X		case 'f':
X			name = optarg;
X			break;
X
X		case 'x':
X			axis = XAXIS;
X			break;
X
X		case 'y':
X			axis = YAXIS;
X			break;
X
X		case 'z':
X			axis = ZAXIS;
X			break;
X		}
X	}
X
X	f = fopen (name, "r");
X	object = VReadObject(f);
X	fclose (f);
X
X	printf ("state(0,6,0,0,0,16,1,4,1,1,0,0,1,0,1,0,1,0,4).\n");
X
X	n = object->numPolys;
X	p = object->polygon;
X	for (i=0; i<n; ++i) {
X		printf ("polygon(yellow,%d,[", p[i]->numVtces+1);
X		for ((k=0, q=p[i]->vertex); k<p[i]->numVtces; (++k, ++q)) {
X			transform (q, &v, &h);
X			printf ("%d,%d,", v, h);	
X		}
X		transform (p[i]->vertex, &v, &h);
X		printf ("%d,%d],0,0,1,0).\n", v, h);
X		++j;
X	}
X
X	exit (0);
X}
X
Xtransform (p, y, x)
XVPoint	*p;
Xint	*y, *x; {
X
X	double	dx, dy;
X
X	if (axis == XAXIS) {
X		dx = p->y;
X		dy = p->z;
X	}
X	else if (axis == YAXIS) {
X		dx = p->x;
X		dy = p->z;
X	}
X	else if (axis == ZAXIS) {
X		dx = p->x;
X		dy = p->y;
X	}
X
X	*x = (int) (dx * scale + 0.5) + vorg;
X	*y = (int) (dy * scale + 0.5) + horg;
X}
X	
*-*-END-of-./fsim/V2tgif.c-*-*
exit
-- 
Riley Rainey			Internet: riley@mips.com
MIPS Computer Systems		Phone:    +1 214 770-7979
Dallas, Texas

dan
----------------------------------------------------
O'Reilly && Associates   argv@sun.com / argv@ora.com
Opinions expressed reflect those of the author only.