v09i073: acm, X aerial combat simulation, Part05/05
Riley Rainey
riley at mipsdal.mips.com
Mon Oct 8 04:13:26 AEST 1990
Submitted-by: riley at 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 at 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 at 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 at 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 at 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 at 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 at 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 at 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 at mips.com
MIPS Computer Systems Phone: +1 214 770-7979
Dallas, Texas
dan
----------------------------------------------------
O'Reilly && Associates argv at sun.com / argv at ora.com
Opinions expressed reflect those of the author only.
More information about the Comp.sources.x
mailing list