/* strek_ships_subs.f -- translated by f2c (version of 19 December 1990  16:50:21).
   You must link the resulting object file with the libraries:
	-lF77 -lI77 -lm -lc   (in that order)
*/

#include "f2c.h"

/* Table of constant values */

static integer c__10 = 10;
static integer c__6 = 6;
static integer c__15 = 15;
static integer c__5 = 5;
static integer c__12 = 12;
static integer c__9 = 9;
static integer c__8 = 8;
static integer c__14 = 14;

/* Subroutine */ int strek_nemian__(xc, yc, zc, xs, ys, zs, csa, ssa, csp, 
	ssp, dir, sa, ca, sp, cp)
real *xc, *yc, *zc, *xs, *ys, *zs, *csa, *ssa, *csp, *ssp;
logical *dir;
real *sa, *ca, *sp, *cp;
{
    /* Initialized data */

    static real x1[10] = { (float)2.5,(float)2.5,(float)2.5,(float)-2.5,(
	    float)-2.5,(float)-2.5,(float)-2.5,(float)2.5,(float)2.5,(float)
	    -2.5 };
    static real y1[10] = { (float)-5.,(float)-7.5,(float)3.5,(float)3.5,(
	    float)-7.5,(float)-5.,(float)2.5,(float)2.5,(float)-5.,(float)-5. 
	    };
    static real z1[10] = { (float)-2.5,(float)2.5,(float)2.5,(float)2.5,(
	    float)2.5,(float)-2.5,(float)-2.5,(float)-2.5,(float)-2.5,(float)
	    -2.5 };
    static real x2[7] = { (float)-2.5,(float)2.5,(float)-2.5,(float)-2.5,(
	    float)2.5,(float)2.5,(float)0. };
    static real y2[7] = { (float)-7.5,(float)-7.5,(float)3.5,(float)2.5,(
	    float)3.5,(float)2.5,(float)5. };
    static real z2[7] = { (float)2.5,(float)2.5,(float)2.5,(float)-2.5,(float)
	    2.5,(float)-2.5,(float)0. };

    extern /* Subroutine */ int gprpolyline_();
    static shortint x_pt__[10], y_pt__[10], x_pt1__[6], y_pt1__[6];
    extern /* Subroutine */ int gprmultiline_();
    static integer j, istat;
    extern /* Subroutine */ int gprcircle_();
    static real r1[10], r2[10], t1[10], t2[10], t3[10], t4[10], t5[10], t6[10]
	    , r3[10], r4[10], r5[10], r6[10];
    static shortint center[2], radius;
    extern /* Subroutine */ int gprmove_();



/*    ******************************************************************* 
*/
/*    *****                                                         ***** 
*/
/*    *****                STAR TREK VERSION 3.0                    ***** 
*/
/*    *****                                                         ***** 
*/
/*    *****                     written by                          ***** 
*/
/*    *****                                                         ***** 
*/
/*    *****                Justin S. Revenaugh                      ***** 
*/
/*    *****                                                         ***** 
*/
/*    *****                       7/87                              ***** 
*/
/*    *****                                                         ***** 
*/
/*    *****        Massachussetts Institute of Technology           ***** 
*/
/*    *****  Department of Earth, Atmospheric and Planetary Science ***** 
*/
/*    *****                                                         ***** 
*/
/*    ******************************************************************* 
*/
/*    STREK_NEMIAN draws a nemian freighter in 3-d at xs, ys, zs as */
/*    seen from xc, yc, zc. */


/* % include '/sys/ins/base.ins.ftn' */
/* % include '/sys/ins/gpr.ins.ftn' */


/*    saves and data for ship config */


/*    if dir then rotate ship into galatic coordinates */

    if (*dir) {

/*    rotate the points about the local position */

	for (j = 1; j <= 10; ++j) {
	    t1[j - 1] = x1[j - 1] * *ca - y1[j - 1] * *sa * *cp + z1[j - 1] * 
		    *sa * *sp + *xs;
	    t2[j - 1] = x1[j - 1] * *sa + y1[j - 1] * *ca * *cp - z1[j - 1] * 
		    *ca * *sp + *ys;
	    t3[j - 1] = y1[j - 1] * *sp + z1[j - 1] * *cp + *zs;
/* L10: */
	}
	for (j = 1; j <= 7; ++j) {
	    t4[j - 1] = x2[j - 1] * *ca - y2[j - 1] * *sa * *cp + z2[j - 1] * 
		    *sa * *sp + *xs;
	    t5[j - 1] = x2[j - 1] * *sa + y2[j - 1] * *ca * *cp - z2[j - 1] * 
		    *ca * *sp + *ys;
	    t6[j - 1] = y2[j - 1] * *sp + z2[j - 1] * *cp + *zs;
/* L20: */
	}

/*    form offsets from player ship and rotate them about it */

	for (j = 1; j <= 10; ++j) {
	    t1[j - 1] -= *xc;
	    t2[j - 1] -= *yc;
	    t3[j - 1] -= *zc;
	    r1[j - 1] = t1[j - 1] * *csa + t2[j - 1] * *ssa;
	    r2[j - 1] = -(doublereal)t1[j - 1] * *ssa * *csp + t2[j - 1] * *
		    csa * *csp + t3[j - 1] * *ssp;
	    r3[j - 1] = t1[j - 1] * *ssa * *ssp - t2[j - 1] * *csa * *ssp + 
		    t3[j - 1] * *csp;
	    if (r2[j - 1] < (float)1.) {
		r2[j - 1] = (float)1.;
	    }
	    x_pt__[j - 1] = r1[j - 1] / r2[j - 1] * (float)350. + (float)450.;

	    y_pt__[j - 1] = (float)400. - r3[j - 1] / r2[j - 1] * (float)350.;

/* L30: */
	}
	for (j = 1; j <= 7; ++j) {
	    t4[j - 1] -= *xc;
	    t5[j - 1] -= *yc;
	    t6[j - 1] -= *zc;
	    r4[j - 1] = t4[j - 1] * *csa + t5[j - 1] * *ssa;
	    r5[j - 1] = -(doublereal)t4[j - 1] * *ssa * *csp + t5[j - 1] * *
		    csa * *csp + t6[j - 1] * *ssp;
	    r6[j - 1] = t4[j - 1] * *ssa * *ssp - t5[j - 1] * *csa * *ssp + 
		    t6[j - 1] * *csp;
	    if (r5[j - 1] < (float)1.) {
		r5[j - 1] = (float)1.;
	    }
	    if (j != 7) {
		x_pt1__[j - 1] = r4[j - 1] / r5[j - 1] * (float)350. + (float)
			450.;
		y_pt1__[j - 1] = (float)400. - r6[j - 1] / r5[j - 1] * (float)
			350.;
	    } else {
		center[0] = r4[j - 1] / r5[j - 1] * (float)350. + (float)450.;

		center[1] = (float)400. - r6[j - 1] / r5[j - 1] * (float)350.;

	    }
/* L40: */
	}
	radius = (float)2.5 / r5[6] * (float)350. + (float).5;

/*    draw the object */

	gprmove_(x_pt__, y_pt__, &istat);
	gprpolyline_(x_pt__, y_pt__, &c__10, &istat);
	gprmultiline_(x_pt1__, y_pt1__, &c__6, &istat);
	if (radius > 0) {
	    gprcircle_(center, &radius, &istat);
	}
    } else {

/*    erase old lines by drawing over them in black */

	gprmove_(x_pt__, y_pt__, &istat);
	gprpolyline_(x_pt__, y_pt__, &c__10, &istat);
	gprmultiline_(x_pt1__, y_pt1__, &c__6, &istat);
	if (radius > 0) {
	    gprcircle_(center, &radius, &istat);
	}
    }
    return 0;
} /* strek_nemian__ */

/* Subroutine */ int strek_klingon__(xc, yc, zc, xs, ys, zs, csa, ssa, csp, 
	ssp, dir, pcen, sa, ca, sp, cp)
real *xc, *yc, *zc, *xs, *ys, *zs, *csa, *ssa, *csp, *ssp;
logical *dir;
shortint *pcen;
real *sa, *ca, *sp, *cp;
{
    /* Initialized data */

    static real x1[15] = { (float).75,(float)1.,(float)6.5,(float)7.5,(float)
	    7.5,(float)6.5,(float)6.5,(float)0.,(float)-6.5,(float)-6.5,(
	    float)-7.5,(float)-7.5,(float)-6.5,(float)-1.,(float)-.75 };
    static real y1[15] = { (float)6.,(float)3.,(float)0.,(float)0.,(float)
	    -7.5,(float)-7.5,(float)-1.5,(float)-3.5,(float)-1.5,(float)-7.5,(
	    float)-7.5,(float)0.,(float)0.,(float)3.,(float)6. };
    static real z1[15] = { (float)1.,(float).8,(float).1,(float).1,(float).1,(
	    float).1,(float).1,(float)1.,(float).1,(float).1,(float).1,(float)
	    .1,(float).1,(float).8,(float)1. };
    static real x3[5] = { (float)6.5,(float)6.5,(float)7.5,(float)7.5,(float)
	    6.5 };
    static real y3[5] = { (float)0.,(float)-7.5,(float)-7.5,(float)0.,(float)
	    0. };
    static real z3[5] = { (float)-2.,(float)-2.,(float)-2.,(float)-2.,(float)
	    -2. };
    static real x4[5] = { (float)-6.5,(float)-6.5,(float)-7.5,(float)-7.5,(
	    float)-6.5 };
    static real y4[5] = { (float)0.,(float)-7.5,(float)-7.5,(float)0.,(float)
	    0. };
    static real z4[5] = { (float)-2.,(float)-2.,(float)-2.,(float)-2.,(float)
	    -2. };
    static real x5[13] = { (float)7.5,(float)7.5,(float)7.5,(float)7.5,(float)
	    6.5,(float)6.5,(float)-7.5,(float)-7.5,(float)-7.5,(float)-7.5,(
	    float)-6.5,(float)-6.5,(float)0. };
    static real y5[13] = { (float)0.,(float)0.,(float)-7.5,(float)-7.5,(float)
	    -7.5,(float)-7.5,(float)0.,(float)0.,(float)-7.5,(float)-7.5,(
	    float)-7.5,(float)-7.5,(float)7.5 };
    static real z5[13] = { (float).1,(float)-2.,(float).1,(float)-2.,(float)
	    .1,(float)-2.,(float).1,(float)-2.,(float).1,(float)-2.,(float).1,
	    (float)-2.,(float)1. };

    extern /* Subroutine */ int gprpolyline_();
    static shortint x_pt__[15], y_pt__[15], x3_pt__[5], y3_pt__[5], x4_pt__[5]
	    , y4_pt__[5], x5_pt__[12], y5_pt__[12];
    extern /* Subroutine */ int gprmultiline_();
    static integer j, istat;
    extern /* Subroutine */ int gprcircle_();
    static real r1[15], r2[15], t1[15], t2[15], t3[15], t7[15], t8[15], t9[15]
	    , r3[15], r7[15], r8[15], r9[15], t10[15], t11[15], t12[15], t13[
	    15], t14[15], t15[15], r10[15], r11[15], r12[15], r13[15], r14[15]
	    , r15[15];
    static shortint center[2], radius;
    extern /* Subroutine */ int gprmove_();


/*    STREK_KLINGON_1 draws a klingon in 3-d at xs, ys, zs as */
/*    seen from xc, yc, zc. */

/*    version 1 */
/*                                            -jsr 8/85 */

/* % include '/sys/ins/base.ins.ftn' */
/* % include '/sys/ins/gpr.ins.ftn' */


/*    saves and data for ship config */

    /* Parameter adjustments */
    --pcen;

    /* Function Body */

/*    if dir then rotate into galatic coords */

    if (*dir) {

/*    rotate the points about the local position */

	for (j = 1; j <= 15; ++j) {
	    t1[j - 1] = x1[j - 1] * *ca - y1[j - 1] * *sa * *cp + z1[j - 1] * 
		    *sa * *sp + *xs;
	    t2[j - 1] = x1[j - 1] * *sa + y1[j - 1] * *ca * *cp - z1[j - 1] * 
		    *ca * *sp + *ys;
	    t3[j - 1] = y1[j - 1] * *sp + z1[j - 1] * *cp + *zs;
/* L10: */
	}
	for (j = 1; j <= 5; ++j) {
	    t7[j - 1] = x3[j - 1] * *ca - y3[j - 1] * *sa * *cp + z3[j - 1] * 
		    *sa * *sp + *xs;
	    t8[j - 1] = x3[j - 1] * *sa + y3[j - 1] * *ca * *cp - z3[j - 1] * 
		    *ca * *sp + *ys;
	    t9[j - 1] = y3[j - 1] * *sp + z3[j - 1] * *cp + *zs;
	    t10[j - 1] = x4[j - 1] * *ca - y4[j - 1] * *sa * *cp + z4[j - 1] *
		     *sa * *sp + *xs;
	    t11[j - 1] = x4[j - 1] * *sa + y4[j - 1] * *ca * *cp - z4[j - 1] *
		     *ca * *sp + *ys;
	    t12[j - 1] = y4[j - 1] * *sp + z4[j - 1] * *cp + *zs;
/* L20: */
	}
	for (j = 1; j <= 13; ++j) {
	    t13[j - 1] = x5[j - 1] * *ca - y5[j - 1] * *sa * *cp + z5[j - 1] *
		     *sa * *sp + *xs;
	    t14[j - 1] = x5[j - 1] * *sa + y5[j - 1] * *ca * *cp - z5[j - 1] *
		     *ca * *sp + *ys;
	    t15[j - 1] = y5[j - 1] * *sp + z5[j - 1] * *cp + *zs;
/* L30: */
	}

/*    form offsets from player ship and rotate them about it */

	for (j = 1; j <= 15; ++j) {
	    t1[j - 1] -= *xc;
	    t2[j - 1] -= *yc;
	    t3[j - 1] -= *zc;
	    r1[j - 1] = t1[j - 1] * *csa + t2[j - 1] * *ssa;
	    r2[j - 1] = -(doublereal)t1[j - 1] * *ssa * *csp + t2[j - 1] * *
		    csa * *csp + t3[j - 1] * *ssp;
	    r3[j - 1] = t1[j - 1] * *ssa * *ssp - t2[j - 1] * *csa * *ssp + 
		    t3[j - 1] * *csp;
	    if (r2[j - 1] < (float)1.) {
		r2[j - 1] = (float)1.;
	    }
	    x_pt__[j - 1] = r1[j - 1] / r2[j - 1] * (float)350. + (float)450.;

	    y_pt__[j - 1] = (float)400. - r3[j - 1] / r2[j - 1] * (float)350.;

/* L40: */
	}
	for (j = 1; j <= 5; ++j) {
	    t7[j - 1] -= *xc;
	    t8[j - 1] -= *yc;
	    t9[j - 1] -= *zc;
	    r7[j - 1] = t7[j - 1] * *csa + t8[j - 1] * *ssa;
	    r8[j - 1] = -(doublereal)t7[j - 1] * *ssa * *csp + t8[j - 1] * *
		    csa * *csp + t9[j - 1] * *ssp;
	    r9[j - 1] = t7[j - 1] * *ssa * *ssp - t8[j - 1] * *csa * *ssp + 
		    t9[j - 1] * *csp;
	    if (r8[j - 1] < (float)1.) {
		r8[j - 1] = (float)1.;
	    }
	    x3_pt__[j - 1] = r7[j - 1] / r8[j - 1] * (float)350. + (float)
		    450.;
	    y3_pt__[j - 1] = (float)400. - r9[j - 1] / r8[j - 1] * (float)
		    350.;
	    t10[j - 1] -= *xc;
	    t11[j - 1] -= *yc;
	    t12[j - 1] -= *zc;
	    r10[j - 1] = t10[j - 1] * *csa + t11[j - 1] * *ssa;
	    r11[j - 1] = -(doublereal)t10[j - 1] * *ssa * *csp + t11[j - 1] * 
		    *csa * *csp + t12[j - 1] * *ssp;
	    r12[j - 1] = t10[j - 1] * *ssa * *ssp - t11[j - 1] * *csa * *ssp 
		    + t12[j - 1] * *csp;
	    if (r11[j - 1] < (float)1.) {
		r11[j - 1] = (float)1.;
	    }
	    x4_pt__[j - 1] = r10[j - 1] / r11[j - 1] * (float)350. + (float)
		    450.;
	    y4_pt__[j - 1] = (float)400. - r12[j - 1] / r11[j - 1] * (float)
		    350.;
/* L50: */
	}
	for (j = 1; j <= 13; ++j) {
	    t13[j - 1] -= *xc;
	    t14[j - 1] -= *yc;
	    t15[j - 1] -= *zc;
	    r13[j - 1] = t13[j - 1] * *csa + t14[j - 1] * *ssa;
	    r14[j - 1] = -(doublereal)t13[j - 1] * *ssa * *csp + t14[j - 1] * 
		    *csa * *csp + t15[j - 1] * *ssp;
	    r15[j - 1] = t13[j - 1] * *ssa * *ssp - t14[j - 1] * *csa * *ssp 
		    + t15[j - 1] * *csp;
	    if (r14[j - 1] < (float)1.) {
		r14[j - 1] = (float)1.;
	    }
	    if (j == 13) {
		center[0] = r13[j - 1] / r14[j - 1] * (float)350. + (float)
			450.;
		center[1] = (float)400. - r15[j - 1] / r14[j - 1] * (float)
			350.;
		pcen[1] = center[0];
		pcen[2] = center[1];
	    } else {
		x5_pt__[j - 1] = r13[j - 1] / r14[j - 1] * (float)350. + (
			float)450.;
		y5_pt__[j - 1] = (float)400. - r15[j - 1] / r14[j - 1] * (
			float)350.;
	    }
/* L60: */
	}
	radius = (float)1.5 / r14[12] * (float)350. + (float).5;

/*    draw the object */

	gprmove_(x_pt__, y_pt__, &istat);
	gprpolyline_(x_pt__, y_pt__, &c__15, &istat);
	gprmove_(x3_pt__, y3_pt__, &istat);
	gprpolyline_(x3_pt__, y3_pt__, &c__5, &istat);
	gprmove_(x4_pt__, y4_pt__, &istat);
	gprpolyline_(x4_pt__, y4_pt__, &c__5, &istat);
	gprmultiline_(x5_pt__, y5_pt__, &c__12, &istat);
	if (radius > 0) {
	    gprcircle_(center, &radius, &istat);
	}
    } else {

/*    erase old lines by drawing over them in black */

	gprmove_(x_pt__, y_pt__, &istat);
	gprpolyline_(x_pt__, y_pt__, &c__15, &istat);
	gprmove_(x3_pt__, y3_pt__, &istat);
	gprpolyline_(x3_pt__, y3_pt__, &c__5, &istat);
	gprmove_(x4_pt__, y4_pt__, &istat);
	gprpolyline_(x4_pt__, y4_pt__, &c__5, &istat);
	gprmultiline_(x5_pt__, y5_pt__, &c__12, &istat);
	if (radius > 0) {
	    gprcircle_(center, &radius, &istat);
	}
    }
    return 0;
} /* strek_klingon__ */

/* Subroutine */ int strek_romulan_1__(xc, yc, zc, xs, ys, zs, csa, ssa, csp, 
	ssp, dir, sa, ca, sp, cp)
real *xc, *yc, *zc, *xs, *ys, *zs, *csa, *ssa, *csp, *ssp;
logical *dir;
real *sa, *ca, *sp, *cp;
{
    /* Initialized data */

    static real x1[9] = { (float)6.5,(float)3.3,(float)0.,(float)-3.3,(float)
	    -6.5,(float)0.,(float)6.5,(float)0.,(float)-6.5 };
    static real y1[9] = { (float)-3.5,(float)3.,(float)5.,(float)3.,(float)
	    -3.5,(float)-5.,(float)-3.5,(float)-5.,(float)-3.5 };
    static real z1[9] = { (float)0.,(float)0.,(float)0.,(float)0.,(float)0.,(
	    float)1.5,(float)0.,(float)-1.5,(float)0. };
    static real x2[10] = { (float)0.,(float)0.,(float)3.3,(float)0.,(float)
	    -3.3,(float)0.,(float)0.,(float)0.,(float)7.5,(float)-7.5 };
    static real y2[10] = { (float)5.,(float)-5.,(float)3.,(float)0.,(float)3.,
	    (float)0.,(float)-5.,(float)0.,(float)-3.5,(float)-3.5 };
    static real z2[10] = { (float)0.,(float)1.5,(float)0.,(float)-1.,(float)
	    0.,(float)-1.,(float)-1.5,(float)-1.,(float)0.,(float)0. };

    extern /* Subroutine */ int gprpolyline_();
    static shortint x_pt__[9], y_pt__[9], x_pt1__[8], y_pt1__[8];
    static integer i, j;
    extern /* Subroutine */ int gprmultiline_();
    static integer istat;
    extern /* Subroutine */ int gprcircle_();
    static real r1[10], r2[10], t1[10], t2[10], t3[10], t4[10], t5[10], t6[10]
	    , r3[10], r4[10], r5[10], r6[10];
    static shortint center[4]	/* was [2][2] */, radius[2], xpt[2];
    extern /* Subroutine */ int gprmove_();


/*    STREK_ROMULAN_1 draws a romulan in 3-d at xs, ys, zs as */
/*    seen from xc, yc, zc. */

/*    version 1 */
/*                                            -jsr 8/85 */

/* % include '/sys/ins/base.ins.ftn' */
/* % include '/sys/ins/gpr.ins.ftn' */


/*    saves and data for ship config */


/*    if dir then rotate into galatic coords */

    if (*dir) {

/*    rotate the points about the local position */

	for (j = 1; j <= 9; ++j) {
	    t1[j - 1] = x1[j - 1] * *ca - y1[j - 1] * *sa * *cp + z1[j - 1] * 
		    *sa * *sp + *xs;
	    t2[j - 1] = x1[j - 1] * *sa + y1[j - 1] * *ca * *cp - z1[j - 1] * 
		    *ca * *sp + *ys;
	    t3[j - 1] = y1[j - 1] * *sp + z1[j - 1] * *cp + *zs;
/* L10: */
	}
	for (j = 1; j <= 10; ++j) {
	    t4[j - 1] = x2[j - 1] * *ca - y2[j - 1] * *sa * *cp + z2[j - 1] * 
		    *sa * *sp + *xs;
	    t5[j - 1] = x2[j - 1] * *sa + y2[j - 1] * *ca * *cp - z2[j - 1] * 
		    *ca * *sp + *ys;
	    t6[j - 1] = y2[j - 1] * *sp + z2[j - 1] * *cp + *zs;
/* L20: */
	}

/*    form offsets from player ship and rotate them about it */

	for (j = 1; j <= 9; ++j) {
	    t1[j - 1] -= *xc;
	    t2[j - 1] -= *yc;
	    t3[j - 1] -= *zc;
	    r1[j - 1] = t1[j - 1] * *csa + t2[j - 1] * *ssa;
	    r2[j - 1] = -(doublereal)t1[j - 1] * *ssa * *csp + t2[j - 1] * *
		    csa * *csp + t3[j - 1] * *ssp;
	    r3[j - 1] = t1[j - 1] * *ssa * *ssp - t2[j - 1] * *csa * *ssp + 
		    t3[j - 1] * *csp;
	    if (r2[j - 1] < (float)1.) {
		r2[j - 1] = (float)1.;
	    }
	    x_pt__[j - 1] = r1[j - 1] / r2[j - 1] * (float)350. + (float)450.;

	    y_pt__[j - 1] = (float)400. - r3[j - 1] / r2[j - 1] * (float)350.;

/* L30: */
	}
	for (j = 1; j <= 10; ++j) {
	    t4[j - 1] -= *xc;
	    t5[j - 1] -= *yc;
	    t6[j - 1] -= *zc;
	    r4[j - 1] = t4[j - 1] * *csa + t5[j - 1] * *ssa;
	    r5[j - 1] = -(doublereal)t4[j - 1] * *ssa * *csp + t5[j - 1] * *
		    csa * *csp + t6[j - 1] * *ssp;
	    r6[j - 1] = t4[j - 1] * *ssa * *ssp - t5[j - 1] * *csa * *ssp + 
		    t6[j - 1] * *csp;
	    if (r5[j - 1] < (float)1.) {
		r5[j - 1] = (float)1.;
	    }
	    if (j <= 8) {
		x_pt1__[j - 1] = r4[j - 1] / r5[j - 1] * (float)350. + (float)
			450.;
		y_pt1__[j - 1] = (float)400. - r6[j - 1] / r5[j - 1] * (float)
			350.;
	    } else {
		i = j - 8;
		center[i - 1] = r4[j - 1] / r5[j - 1] * (float)350. + (float)
			450.;
		center[i + 1] = (float)400. - r6[j - 1] / r5[j - 1] * (float)
			350.;
	    }
/* L40: */
	}
	radius[0] = (float)1. / r5[8] * (float)350. + (float).5;
	radius[1] = (float)1. / r5[9] * (float)350. + (float).5;

/*    draw the object */

	gprmove_(x_pt__, y_pt__, &istat);
	gprpolyline_(x_pt__, y_pt__, &c__9, &istat);
	gprmultiline_(x_pt1__, y_pt1__, &c__8, &istat);
	for (j = 1; j <= 2; ++j) {
	    xpt[0] = center[j - 1];
	    xpt[1] = center[j + 1];
	    if (radius[j - 1] > 0) {
		gprcircle_(xpt, &radius[j - 1], &istat);
	    }
/* L50: */
	}
    } else {

/*    erase old lines by drawing over them in black */

	gprmove_(x_pt__, y_pt__, &istat);
	gprpolyline_(x_pt__, y_pt__, &c__9, &istat);
	gprmultiline_(x_pt1__, y_pt1__, &c__8, &istat);
	for (j = 1; j <= 2; ++j) {
	    xpt[0] = center[j - 1];
	    xpt[1] = center[j + 1];
	    if (radius[j - 1] > 0) {
		gprcircle_(xpt, &radius[j - 1], &istat);
	    }
/* L60: */
	}
    }
    return 0;
} /* strek_romulan_1__ */

/* Subroutine */ int strek_romulan_2__(xc, yc, zc, xs, ys, zs, csa, ssa, csp, 
	ssp, dir, sa, ca, sp, cp)
real *xc, *yc, *zc, *xs, *ys, *zs, *csa, *ssa, *csp, *ssp;
logical *dir;
real *sa, *ca, *sp, *cp;
{
    /* Initialized data */

    static real x1[9] = { (float)6.5,(float)3.3,(float)0.,(float)-3.3,(float)
	    -6.5,(float)0.,(float)6.5,(float)0.,(float)-6.5 };
    static real y1[9] = { (float)-3.5,(float)3.,(float)5.,(float)3.,(float)
	    -3.5,(float)-5.,(float)-3.5,(float)-5.,(float)-3.5 };
    static real z1[9] = { (float)0.,(float)0.,(float)0.,(float)0.,(float)0.,(
	    float)1.5,(float)0.,(float)-1.5,(float)0. };
    static real x2[10] = { (float)0.,(float)0.,(float)3.3,(float)0.,(float)
	    -3.3,(float)0.,(float)0.,(float)0.,(float)7.5,(float)-7.5 };
    static real y2[10] = { (float)5.,(float)-5.,(float)3.,(float)0.,(float)3.,
	    (float)0.,(float)-5.,(float)0.,(float)-3.5,(float)-3.5 };
    static real z2[10] = { (float)0.,(float)1.5,(float)0.,(float)-1.,(float)
	    0.,(float)-1.,(float)-1.5,(float)-1.,(float)0.,(float)0. };

    extern /* Subroutine */ int gprpolyline_();
    static shortint x_pt__[9], y_pt__[9], x_pt1__[8], y_pt1__[8];
    static integer i, j;
    extern /* Subroutine */ int gprmultiline_();
    static integer istat;
    extern /* Subroutine */ int gprcircle_();
    static real r1[10], r2[10], t1[10], t2[10], t3[10], t4[10], t5[10], t6[10]
	    , r3[10], r4[10], r5[10], r6[10];
    static shortint center[4]	/* was [2][2] */, radius[2], xpt[2];
    extern /* Subroutine */ int gprmove_();


/*    STREK_ROMULAN_2 draws a romulan in 3-d at xs, ys, zs as */
/*    seen from xc, yc, zc. */

/*    version 1 */
/*                                            -jsr 8/85 */

/* % include '/sys/ins/base.ins.ftn' */
/* % include '/sys/ins/gpr.ins.ftn' */


/*    saves and data for ship config */


/*    if dir then rotate into galatic coords */

    if (*dir) {

/*    rotate the points about the local position */

	for (j = 1; j <= 9; ++j) {
	    t1[j - 1] = x1[j - 1] * *ca - y1[j - 1] * *sa * *cp + z1[j - 1] * 
		    *sa * *sp + *xs;
	    t2[j - 1] = x1[j - 1] * *sa + y1[j - 1] * *ca * *cp - z1[j - 1] * 
		    *ca * *sp + *ys;
	    t3[j - 1] = y1[j - 1] * *sp + z1[j - 1] * *cp + *zs;
/* L10: */
	}
	for (j = 1; j <= 10; ++j) {
	    t4[j - 1] = x2[j - 1] * *ca - y2[j - 1] * *sa * *cp + z2[j - 1] * 
		    *sa * *sp + *xs;
	    t5[j - 1] = x2[j - 1] * *sa + y2[j - 1] * *ca * *cp - z2[j - 1] * 
		    *ca * *sp + *ys;
	    t6[j - 1] = y2[j - 1] * *sp + z2[j - 1] * *cp + *zs;
/* L20: */
	}

/*    form offsets from player ship and rotate them about it */

	for (j = 1; j <= 9; ++j) {
	    t1[j - 1] -= *xc;
	    t2[j - 1] -= *yc;
	    t3[j - 1] -= *zc;
	    r1[j - 1] = t1[j - 1] * *csa + t2[j - 1] * *ssa;
	    r2[j - 1] = -(doublereal)t1[j - 1] * *ssa * *csp + t2[j - 1] * *
		    csa * *csp + t3[j - 1] * *ssp;
	    r3[j - 1] = t1[j - 1] * *ssa * *ssp - t2[j - 1] * *csa * *ssp + 
		    t3[j - 1] * *csp;
	    if (r2[j - 1] < (float)1.) {
		r2[j - 1] = (float)1.;
	    }
	    x_pt__[j - 1] = r1[j - 1] / r2[j - 1] * (float)350. + (float)450.;

	    y_pt__[j - 1] = (float)400. - r3[j - 1] / r2[j - 1] * (float)350.;

/* L30: */
	}
	for (j = 1; j <= 10; ++j) {
	    t4[j - 1] -= *xc;
	    t5[j - 1] -= *yc;
	    t6[j - 1] -= *zc;
	    r4[j - 1] = t4[j - 1] * *csa + t5[j - 1] * *ssa;
	    r5[j - 1] = -(doublereal)t4[j - 1] * *ssa * *csp + t5[j - 1] * *
		    csa * *csp + t6[j - 1] * *ssp;
	    r6[j - 1] = t4[j - 1] * *ssa * *ssp - t5[j - 1] * *csa * *ssp + 
		    t6[j - 1] * *csp;
	    if (r5[j - 1] < (float)1.) {
		r5[j - 1] = (float)1.;
	    }
	    if (j <= 8) {
		x_pt1__[j - 1] = r4[j - 1] / r5[j - 1] * (float)350. + (float)
			450.;
		y_pt1__[j - 1] = (float)400. - r6[j - 1] / r5[j - 1] * (float)
			350.;
	    } else {
		i = j - 8;
		center[i - 1] = r4[j - 1] / r5[j - 1] * (float)350. + (float)
			450.;
		center[i + 1] = (float)400. - r6[j - 1] / r5[j - 1] * (float)
			350.;
	    }
/* L40: */
	}
	radius[0] = (float)1. / r5[8] * (float)350. + (float).5;
	radius[1] = (float)1. / r5[9] * (float)350. + (float).5;

/*    draw the object */

	gprmove_(x_pt__, y_pt__, &istat);
	gprpolyline_(x_pt__, y_pt__, &c__9, &istat);
	gprmultiline_(x_pt1__, y_pt1__, &c__8, &istat);
	for (j = 1; j <= 2; ++j) {
	    xpt[0] = center[j - 1];
	    xpt[1] = center[j + 1];
	    if (radius[j - 1] > 0) {
		gprcircle_(xpt, &radius[j - 1], &istat);
	    }
/* L50: */
	}
    } else {

/*    erase old lines by drawing over them in black */

	gprmove_(x_pt__, y_pt__, &istat);
	gprpolyline_(x_pt__, y_pt__, &c__9, &istat);
	gprmultiline_(x_pt1__, y_pt1__, &c__8, &istat);
	for (j = 1; j <= 2; ++j) {
	    xpt[0] = center[j - 1];
	    xpt[1] = center[j + 1];
	    if (radius[j - 1] > 0) {
		gprcircle_(xpt, &radius[j - 1], &istat);
	    }
/* L60: */
	}
    }
    return 0;
} /* strek_romulan_2__ */

/* Subroutine */ int strek_photon_1__(xc, yc, zc, xs, ys, zs, csa, ssa, csp, 
	ssp, dir)
real *xc, *yc, *zc, *xs, *ys, *zs, *csa, *ssa, *csp, *ssp;
logical *dir;
{
    /* Initialized data */

    static real xp[8] = { (float)0.,(float)3.5,(float)-3.5,(float)0.,(float)
	    0.,(float)-3.5,(float)3.5,(float)0. };
    static real yp[8] = { (float)3.,(float)-3.,(float)-3.,(float)3.,(float)0.,
	    (float)-3.,(float)-3.,(float)0. };
    static real zp[8] = { (float)-2.6,(float)-2.6,(float)-2.6,(float)-2.6,(
	    float)2.6,(float)-2.6,(float)-2.6,(float)2.6 };
    static real sda = (float).0998;
    static real sdp = (float).0998;
    static real cda = (float).995;
    static real cdp = (float).995;
    static real ca = (float)1.;
    static real cp = (float)1.;
    static real sa = (float)0.;
    static real sp = (float)0.;

    extern /* Subroutine */ int gprpolyline_();
    static real temp;
    static shortint x_pt__[8], y_pt__[8];
    static integer j, istat;
    static real t1[8], t2[8], t3[8], t4[8], t5[8], t6[8];
    extern /* Subroutine */ int gprmove_();


/*    STREK_PHOTON_1 draws an enemy photon similar to a player photon */
/*    (see strek_photon_4). */

/*    version 1 */
/*                                             -jsr 8/85 */

/* % include '/sys/ins/base.ins.ftn' */
/* % include '/sys/ins/gpr.ins.ftn' */


/*    data for photon config and saves */

    if (*dir) {
	temp = ca;
	ca = ca * cda - sa * sda;
	sa = sa * cda + sda * temp;
	temp = cp;
	cp = cp * cdp - sp * sdp;
	sp = sp * cdp + sdp * temp;

/*    rotate the points about the local position into galatic coords 
*/

	for (j = 1; j <= 8; ++j) {
	    t1[j - 1] = xp[j - 1] * ca - yp[j - 1] * sa * cp + zp[j - 1] * sa 
		    * sp + *xs;
	    t2[j - 1] = xp[j - 1] * sa + yp[j - 1] * ca * cp - zp[j - 1] * ca 
		    * sp + *ys;
	    t3[j - 1] = yp[j - 1] * sp + zp[j - 1] * cp + *zs;
/* L10: */
	}

/*    form offsets from player ship and rotate them about it */

	for (j = 1; j <= 8; ++j) {
	    t1[j - 1] -= *xc;
	    t2[j - 1] -= *yc;
	    t3[j - 1] -= *zc;
	    t4[j - 1] = t1[j - 1] * *csa + t2[j - 1] * *ssa;
	    t5[j - 1] = -(doublereal)t1[j - 1] * *ssa * *csp + t2[j - 1] * *
		    csa * *csp + t3[j - 1] * *ssp;
	    t6[j - 1] = t1[j - 1] * *ssa * *ssp - t2[j - 1] * *csa * *ssp + 
		    t3[j - 1] * *csp;
	    if (t5[j - 1] < (float)1.) {
		t5[j - 1] = (float)1.;
	    }
	    x_pt__[j - 1] = t4[j - 1] / t5[j - 1] * (float)350. + (float)450.;

	    y_pt__[j - 1] = (float)400. - t6[j - 1] / t5[j - 1] * (float)350.;

/* L20: */
	}

/*    draw the object */

	gprmove_(x_pt__, y_pt__, &istat);
	gprpolyline_(x_pt__, y_pt__, &c__8, &istat);
    } else {

/*    erase old lines by drawing over them in black */

	gprmove_(x_pt__, y_pt__, &istat);
	gprpolyline_(x_pt__, y_pt__, &c__8, &istat);
    }
    return 0;
} /* strek_photon_1__ */

/* Subroutine */ int strek_photon_2__(xc, yc, zc, xs, ys, zs, csa, ssa, csp, 
	ssp, dir)
real *xc, *yc, *zc, *xs, *ys, *zs, *csa, *ssa, *csp, *ssp;
logical *dir;
{
    /* Initialized data */

    static real xp[8] = { (float)0.,(float)3.5,(float)-3.5,(float)0.,(float)
	    0.,(float)-3.5,(float)3.5,(float)0. };
    static real yp[8] = { (float)3.,(float)-3.,(float)-3.,(float)3.,(float)0.,
	    (float)-3.,(float)-3.,(float)0. };
    static real zp[8] = { (float)-2.6,(float)-2.6,(float)-2.6,(float)-2.6,(
	    float)2.6,(float)-2.6,(float)-2.6,(float)2.6 };
    static real sda = (float).0998;
    static real sdp = (float).0998;
    static real cda = (float).995;
    static real cdp = (float).995;
    static real ca = (float)1.;
    static real cp = (float)1.;
    static real sa = (float)0.;
    static real sp = (float)0.;

    extern /* Subroutine */ int gprpolyline_();
    static real temp;
    static shortint x_pt__[8], y_pt__[8];
    static integer j, istat;
    static real t1[8], t2[8], t3[8], t4[8], t5[8], t6[8];
    extern /* Subroutine */ int gprmove_();


/*    STREK_PHOTON_2 draws an enemy photon similar to a player photon */
/*    (see strek_photon_4). */

/*    version 1 */
/*                                             -jsr 8/85 */

/* % include '/sys/ins/base.ins.ftn' */
/* % include '/sys/ins/gpr.ins.ftn' */


/*    data for photon config and saves */

    if (*dir) {
	temp = ca;
	ca = ca * cda - sa * sda;
	sa = sa * cda + sda * temp;
	temp = cp;
	cp = cp * cdp - sp * sdp;
	sp = sp * cdp + sdp * temp;

/*    rotate the points about the local position into galatic coords 
*/

	for (j = 1; j <= 8; ++j) {
	    t1[j - 1] = xp[j - 1] * ca - yp[j - 1] * sa * cp + zp[j - 1] * sa 
		    * sp + *xs;
	    t2[j - 1] = xp[j - 1] * sa + yp[j - 1] * ca * cp - zp[j - 1] * ca 
		    * sp + *ys;
	    t3[j - 1] = yp[j - 1] * sp + zp[j - 1] * cp + *zs;
/* L10: */
	}

/*    form offsets from player ship and rotate them about it */

	for (j = 1; j <= 8; ++j) {
	    t1[j - 1] -= *xc;
	    t2[j - 1] -= *yc;
	    t3[j - 1] -= *zc;
	    t4[j - 1] = t1[j - 1] * *csa + t2[j - 1] * *ssa;
	    t5[j - 1] = -(doublereal)t1[j - 1] * *ssa * *csp + t2[j - 1] * *
		    csa * *csp + t3[j - 1] * *ssp;
	    t6[j - 1] = t1[j - 1] * *ssa * *ssp - t2[j - 1] * *csa * *ssp + 
		    t3[j - 1] * *csp;
	    if (t5[j - 1] < (float)1.) {
		t5[j - 1] = (float)1.;
	    }
	    x_pt__[j - 1] = t4[j - 1] / t5[j - 1] * (float)350. + (float)450.;

	    y_pt__[j - 1] = (float)400. - t6[j - 1] / t5[j - 1] * (float)350.;

/* L20: */
	}

/*    draw the object */

	gprmove_(x_pt__, y_pt__, &istat);
	gprpolyline_(x_pt__, y_pt__, &c__8, &istat);
    } else {

/*    erase old lines by drawing over them in black */

	gprmove_(x_pt__, y_pt__, &istat);
	gprpolyline_(x_pt__, y_pt__, &c__8, &istat);
    }
    return 0;
} /* strek_photon_2__ */

/* Subroutine */ int strek_photon_3__(xc, yc, zc, xs, ys, zs, csa, ssa, csp, 
	ssp, dir)
real *xc, *yc, *zc, *xs, *ys, *zs, *csa, *ssa, *csp, *ssp;
logical *dir;
{
    /* Initialized data */

    static real xp[8] = { (float)0.,(float)3.5,(float)-3.5,(float)0.,(float)
	    0.,(float)-3.5,(float)3.5,(float)0. };
    static real yp[8] = { (float)3.,(float)-3.,(float)-3.,(float)3.,(float)0.,
	    (float)-3.,(float)-3.,(float)0. };
    static real zp[8] = { (float)-2.6,(float)-2.6,(float)-2.6,(float)-2.6,(
	    float)2.6,(float)-2.6,(float)-2.6,(float)2.6 };
    static real sda = (float).0998;
    static real sdp = (float).0998;
    static real cda = (float).995;
    static real cdp = (float).995;
    static real ca = (float)1.;
    static real cp = (float)1.;
    static real sa = (float)0.;
    static real sp = (float)0.;

    extern /* Subroutine */ int gprpolyline_();
    static real temp;
    static shortint x_pt__[8], y_pt__[8];
    static integer j, istat;
    static real t1[8], t2[8], t3[8], t4[8], t5[8], t6[8];
    extern /* Subroutine */ int gprmove_();


/*    STREK_PHOTON_3 draws an enemy photon similar to a player photon */
/*    (see strek_photon_4). */

/*    version 1 */
/*                                             -jsr 8/85 */

/* % include '/sys/ins/base.ins.ftn' */
/* % include '/sys/ins/gpr.ins.ftn' */


/*    data for photon config and saves */

    if (*dir) {
	temp = ca;
	ca = ca * cda - sa * sda;
	sa = sa * cda + sda * temp;
	temp = cp;
	cp = cp * cdp - sp * sdp;
	sp = sp * cdp + sdp * temp;

/*    rotate the points about the local position into galatic coords 
*/

	for (j = 1; j <= 8; ++j) {
	    t1[j - 1] = xp[j - 1] * ca - yp[j - 1] * sa * cp + zp[j - 1] * sa 
		    * sp + *xs;
	    t2[j - 1] = xp[j - 1] * sa + yp[j - 1] * ca * cp - zp[j - 1] * ca 
		    * sp + *ys;
	    t3[j - 1] = yp[j - 1] * sp + zp[j - 1] * cp + *zs;
/* L10: */
	}

/*    form offsets from player ship and rotate them about it */

	for (j = 1; j <= 8; ++j) {
	    t1[j - 1] -= *xc;
	    t2[j - 1] -= *yc;
	    t3[j - 1] -= *zc;
	    t4[j - 1] = t1[j - 1] * *csa + t2[j - 1] * *ssa;
	    t5[j - 1] = -(doublereal)t1[j - 1] * *ssa * *csp + t2[j - 1] * *
		    csa * *csp + t3[j - 1] * *ssp;
	    t6[j - 1] = t1[j - 1] * *ssa * *ssp - t2[j - 1] * *csa * *ssp + 
		    t3[j - 1] * *csp;
	    if (t5[j - 1] < (float)1.) {
		t5[j - 1] = (float)1.;
	    }
	    x_pt__[j - 1] = t4[j - 1] / t5[j - 1] * (float)350. + (float)450.;

	    y_pt__[j - 1] = (float)400. - t6[j - 1] / t5[j - 1] * (float)350.;

/* L20: */
	}

/*    draw the object */

	gprmove_(x_pt__, y_pt__, &istat);
	gprpolyline_(x_pt__, y_pt__, &c__8, &istat);
    } else {

/*    erase old lines by drawing over them in black */

	gprmove_(x_pt__, y_pt__, &istat);
	gprpolyline_(x_pt__, y_pt__, &c__8, &istat);
    }
    return 0;
} /* strek_photon_3__ */

/* Subroutine */ int strek_photon_4__(xc, yc, zc, xs, ys, zs, csa, ssa, csp, 
	ssp, dir)
real *xc, *yc, *zc, *xs, *ys, *zs, *csa, *ssa, *csp, *ssp;
logical *dir;
{
    /* Initialized data */

    static real xp[14] = { (float)0.,(float)0.,(float)0.,(float)0.,(float)3.5,
	    (float)-3.5,(float)-1.75,(float)1.75,(float)1.75,(float)-1.75,(
	    float)-1.75,(float)1.75,(float)1.75,(float)-1.75 };
    static real yp[14] = { (float)0.,(float)0.,(float)-3.5,(float)3.5,(float)
	    0.,(float)0.,(float)-1.75,(float)1.75,(float)-1.75,(float)1.75,(
	    float)1.75,(float)-1.75,(float)1.75,(float)-1.75 };
    static real zp[14] = { (float)3.5,(float)-3.5,(float)0.,(float)0.,(float)
	    0.,(float)0.,(float)2.5,(float)-2.5,(float)2.5,(float)-2.5,(float)
	    2.5,(float)-2.5,(float)2.5,(float)-2.5 };
    static real sda = (float).0998;
    static real sdp = (float).0998;
    static real cda = (float).995;
    static real cdp = (float).995;
    static real ca = (float)1.;
    static real cp = (float)1.;
    static real sa = (float)0.;
    static real sp = (float)0.;

    static real temp;
    static shortint x_pt__[14], y_pt__[14];
    extern /* Subroutine */ int gprmultiline_();
    static integer j, istat;
    static real t1[14], t2[14], t3[14], t4[14], t5[14], t6[14];


/*    STREK_PHOTON_4 draws a player photon torpedo (or erases depending */

/*    on dir) at the point xs, ys, zs as viewed from xc, yc, zc by a */
/*    ship with angles csa, ssa, csp, and ssp. No provision is made */
/*    for views that are both in front of and behind the viewer, other */
/*    than to do a first order correction to the projected y coord. */

/*    version 1 */
/*                                                -jsr 8/85 */

/* % include '/sys/ins/base.ins.ftn' */
/* % include '/sys/ins/gpr.ins.ftn' */


/*    data for photon config and saves */

    if (*dir) {

/*    use double angle formulas to update rotations */

	temp = ca;
	ca = ca * cda - sa * sda;
	sa = sa * cda + sda * temp;
	temp = cp;
	cp = cp * cdp - sp * sdp;
	sp = sp * cdp + sdp * temp;

/*    rotate the points about their local frame to bring them into the
 */
/*    absolute frame */

	for (j = 1; j <= 14; ++j) {
	    t1[j - 1] = xp[j - 1] * ca - yp[j - 1] * sa * cp + zp[j - 1] * sa 
		    * sp + *xs;
	    t2[j - 1] = xp[j - 1] * sa + yp[j - 1] * ca * cp - zp[j - 1] * ca 
		    * sp + *ys;
	    t3[j - 1] = yp[j - 1] * sp + zp[j - 1] * cp + *zs;
/* L10: */
	}

/*    form offsets from player ship and rotate them into its local fra
me */

	for (j = 1; j <= 14; ++j) {
	    t1[j - 1] -= *xc;
	    t2[j - 1] -= *yc;
	    t3[j - 1] -= *zc;
	    t4[j - 1] = t1[j - 1] * *csa + t2[j - 1] * *ssa;
	    t5[j - 1] = -(doublereal)t1[j - 1] * *ssa * *csp + t2[j - 1] * *
		    csa * *csp + t3[j - 1] * *ssp;
	    t6[j - 1] = t1[j - 1] * *ssa * *ssp - t2[j - 1] * *csa * *ssp + 
		    t3[j - 1] * *csp;
	    x_pt__[j - 1] = t4[j - 1] / t5[j - 1] * (float)350. + (float)450.;

	    y_pt__[j - 1] = (float)400. - t6[j - 1] / t5[j - 1] * (float)350.;

/* L20: */
	}

/*    draw the object */

	gprmultiline_(x_pt__, y_pt__, &c__14, &istat);
    } else {

/*    erase old lines by drawing over them again (i.e. change color to
 */
/*    black, or set xor raster op) */

	gprmultiline_(x_pt__, y_pt__, &c__14, &istat);
    }
    return 0;
} /* strek_photon_4__ */

/* Subroutine */ int strek_photon_5__(xc, yc, zc, xs, ys, zs, csa, ssa, csp, 
	ssp, dir)
real *xc, *yc, *zc, *xs, *ys, *zs, *csa, *ssa, *csp, *ssp;
logical *dir;
{
    /* Initialized data */

    static real xp[14] = { (float)0.,(float)0.,(float)0.,(float)0.,(float)3.5,
	    (float)-3.5,(float)-1.75,(float)1.75,(float)1.75,(float)-1.75,(
	    float)-1.75,(float)1.75,(float)1.75,(float)-1.75 };
    static real yp[14] = { (float)0.,(float)0.,(float)-3.5,(float)3.5,(float)
	    0.,(float)0.,(float)-1.75,(float)1.75,(float)-1.75,(float)1.75,(
	    float)1.75,(float)-1.75,(float)1.75,(float)-1.75 };
    static real zp[14] = { (float)3.5,(float)-3.5,(float)0.,(float)0.,(float)
	    0.,(float)0.,(float)2.5,(float)-2.5,(float)2.5,(float)-2.5,(float)
	    2.5,(float)-2.5,(float)2.5,(float)-2.5 };
    static real sda = (float).0998;
    static real sdp = (float).0998;
    static real cda = (float).995;
    static real cdp = (float).995;
    static real ca = (float)1.;
    static real cp = (float)1.;
    static real sa = (float)0.;
    static real sp = (float)0.;

    static real temp;
    static shortint x_pt__[14], y_pt__[14];
    extern /* Subroutine */ int gprmultiline_();
    static integer j, istat;
    static real t1[14], t2[14], t3[14], t4[14], t5[14], t6[14];


/*    STREK_PHOTON_5 draws a player photon torpedo (or erases depending */

/*    on dir) at the point xs, ys, zs as viewed from xc, yc, zc by a */
/*    ship with angles csa, ssa, csp, and ssp. No provision is made */
/*    for views that are both in front of and behind the viewer, other */
/*    than to do a first order correction to the projected y coord. */

/*    version 1 */
/*                                                -jsr 8/85 */

/* % include '/sys/ins/base.ins.ftn' */
/* % include '/sys/ins/gpr.ins.ftn' */


/*    data for photon config and saves */

    if (*dir) {

/*    use double angle formulas to update rotations */

	temp = ca;
	ca = ca * cda - sa * sda;
	sa = sa * cda + sda * temp;
	temp = cp;
	cp = cp * cdp - sp * sdp;
	sp = sp * cdp + sdp * temp;

/*    rotate the points about their local frame to bring them into the
 */
/*    absolute frame */

	for (j = 1; j <= 14; ++j) {
	    t1[j - 1] = xp[j - 1] * ca - yp[j - 1] * sa * cp + zp[j - 1] * sa 
		    * sp + *xs;
	    t2[j - 1] = xp[j - 1] * sa + yp[j - 1] * ca * cp - zp[j - 1] * ca 
		    * sp + *ys;
	    t3[j - 1] = yp[j - 1] * sp + zp[j - 1] * cp + *zs;
/* L10: */
	}

/*    form offsets from player ship and rotate them into its local fra
me */

	for (j = 1; j <= 14; ++j) {
	    t1[j - 1] -= *xc;
	    t2[j - 1] -= *yc;
	    t3[j - 1] -= *zc;
	    t4[j - 1] = t1[j - 1] * *csa + t2[j - 1] * *ssa;
	    t5[j - 1] = -(doublereal)t1[j - 1] * *ssa * *csp + t2[j - 1] * *
		    csa * *csp + t3[j - 1] * *ssp;
	    t6[j - 1] = t1[j - 1] * *ssa * *ssp - t2[j - 1] * *csa * *ssp + 
		    t3[j - 1] * *csp;
	    x_pt__[j - 1] = t4[j - 1] / t5[j - 1] * (float)350. + (float)450.;

	    y_pt__[j - 1] = (float)400. - t6[j - 1] / t5[j - 1] * (float)350.;

/* L20: */
	}

/*    draw the object */

	gprmultiline_(x_pt__, y_pt__, &c__14, &istat);
    } else {

/*    erase old lines by drawing over them again (i.e. change color to
 */
/*    black, or set xor raster op) */

	gprmultiline_(x_pt__, y_pt__, &c__14, &istat);
    }
    return 0;
} /* strek_photon_5__ */

/* Subroutine */ int strek_photon_6__(xc, yc, zc, xs, ys, zs, csa, ssa, csp, 
	ssp, dir)
real *xc, *yc, *zc, *xs, *ys, *zs, *csa, *ssa, *csp, *ssp;
logical *dir;
{
    /* Initialized data */

    static real xp[14] = { (float)0.,(float)0.,(float)0.,(float)0.,(float)3.5,
	    (float)-3.5,(float)-1.75,(float)1.75,(float)1.75,(float)-1.75,(
	    float)-1.75,(float)1.75,(float)1.75,(float)-1.75 };
    static real yp[14] = { (float)0.,(float)0.,(float)-3.5,(float)3.5,(float)
	    0.,(float)0.,(float)-1.75,(float)1.75,(float)-1.75,(float)1.75,(
	    float)1.75,(float)-1.75,(float)1.75,(float)-1.75 };
    static real zp[14] = { (float)3.5,(float)-3.5,(float)0.,(float)0.,(float)
	    0.,(float)0.,(float)2.5,(float)-2.5,(float)2.5,(float)-2.5,(float)
	    2.5,(float)-2.5,(float)2.5,(float)-2.5 };
    static real sda = (float).0998;
    static real sdp = (float).0998;
    static real cda = (float).995;
    static real cdp = (float).995;
    static real ca = (float)1.;
    static real cp = (float)1.;
    static real sa = (float)0.;
    static real sp = (float)0.;

    static real temp;
    static shortint x_pt__[14], y_pt__[14];
    extern /* Subroutine */ int gprmultiline_();
    static integer j, istat;
    static real t1[14], t2[14], t3[14], t4[14], t5[14], t6[14];


/*    STREK_PHOTON_6 draws a player photon torpedo (or erases depending */

/*    on dir) at the point xs, ys, zs as viewed from xc, yc, zc by a */
/*    ship with angles csa, ssa, csp, and ssp. No provision is made */
/*    for views that are both in front of and behind the viewer, other */
/*    than to do a first order correction to the projected y coord. */

/*    version 1 */
/*                                                -jsr 8/85 */

/* % include '/sys/ins/base.ins.ftn' */
/* % include '/sys/ins/gpr.ins.ftn' */


/*    data for photon config and saves */

    if (*dir) {

/*    use double angle formulas to update rotations */

	temp = ca;
	ca = ca * cda - sa * sda;
	sa = sa * cda + sda * temp;
	temp = cp;
	cp = cp * cdp - sp * sdp;
	sp = sp * cdp + sdp * temp;

/*    rotate the points about their local frame to bring them into the
 */
/*    absolute frame */

	for (j = 1; j <= 14; ++j) {
	    t1[j - 1] = xp[j - 1] * ca - yp[j - 1] * sa * cp + zp[j - 1] * sa 
		    * sp + *xs;
	    t2[j - 1] = xp[j - 1] * sa + yp[j - 1] * ca * cp - zp[j - 1] * ca 
		    * sp + *ys;
	    t3[j - 1] = yp[j - 1] * sp + zp[j - 1] * cp + *zs;
/* L10: */
	}

/*    form offsets from player ship and rotate them into its local fra
me */

	for (j = 1; j <= 14; ++j) {
	    t1[j - 1] -= *xc;
	    t2[j - 1] -= *yc;
	    t3[j - 1] -= *zc;
	    t4[j - 1] = t1[j - 1] * *csa + t2[j - 1] * *ssa;
	    t5[j - 1] = -(doublereal)t1[j - 1] * *ssa * *csp + t2[j - 1] * *
		    csa * *csp + t3[j - 1] * *ssp;
	    t6[j - 1] = t1[j - 1] * *ssa * *ssp - t2[j - 1] * *csa * *ssp + 
		    t3[j - 1] * *csp;
	    x_pt__[j - 1] = t4[j - 1] / t5[j - 1] * (float)350. + (float)450.;

	    y_pt__[j - 1] = (float)400. - t6[j - 1] / t5[j - 1] * (float)350.;

/* L20: */
	}

/*    draw the object */

	gprmultiline_(x_pt__, y_pt__, &c__14, &istat);
    } else {

/*    erase old lines by drawing over them again (i.e. change color to
 */
/*    black, or set xor raster op) */

	gprmultiline_(x_pt__, y_pt__, &c__14, &istat);
    }
    return 0;
} /* strek_photon_6__ */

/* Subroutine */ int strek_starbase__(xc, yc, zc, csa, csp, ssa, ssp, dir)
real *xc, *yc, *zc, *csa, *csp, *ssa, *ssp;
logical *dir;
{
    /* Initialized data */

    static real xp[13] = { (float)0.,(float)0.,(float)0.,(float)0.,(float)
	    -7.5,(float)-12.,(float)7.5,(float)12.,(float)0.,(float)0.,(float)
	    0.,(float)-15.,(float)15. };
    static real yp[13] = { (float)0.,(float)0.,(float)8.66,(float)13.855,(
	    float)-4.33,(float)-6.92,(float)-4.33,(float)-6.92,(float)0.,(
	    float)0.,(float)17.3,(float)-8.66,(float)-8.66 };
    static real zp[13] = { (float)10.,(float)16.,(float)-5.,(float)-8.,(float)
	    -5.,(float)-8.,(float)-5.,(float)-8.,(float)0.,(float)20.,(float)
	    -10.,(float)-10.,(float)-10. };
    static real radii[5] = { (float)10.,(float)4.,(float)4.,(float)4.,(float)
	    4. };
    static real sda = (float).049979;
    static real cda = (float).998749;
    static real ca = (float)1.;
    static real cp = (float)1.;
    static real sa = (float)0.;
    static real sp = (float)0.;

    static real temp;
    static shortint x_pt__[8], y_pt__[8];
    static integer i, j;
    extern /* Subroutine */ int gprmultiline_();
    static integer istat;
    extern /* Subroutine */ int gprcircle_();
    static real t1[13], t2[13], t3[13], t4[13], t5[13], t6[13];
    static shortint center[10]	/* was [5][2] */, radius[5], xpt[2];


/*    STREK_STARBASE draws a 3-d starbase at the origin as viewed */
/*    from xc, yc, zc, at the angle csa, csp, ssa, ssp. */

/*    version 1 */
/*                                          -jsr 8/85 */

/* % include '/sys/ins/base.ins.ftn' */
/* % include '/sys/ins/gpr.ins.ftn' */


/*    data for unrotated base */


/*    rotate and project all points */

    if (*dir) {
	temp = ca;
	ca = ca * cda - sa * sda;
	sa = sa * cda + sda * temp;
	for (j = 1; j <= 13; ++j) {
	    t1[j - 1] = xp[j - 1] * ca - yp[j - 1] * sa * cp + zp[j - 1] * sa 
		    * sp;
	    t2[j - 1] = xp[j - 1] * sa + yp[j - 1] * ca * cp - zp[j - 1] * ca 
		    * sp;
	    t3[j - 1] = yp[j - 1] * sp + zp[j - 1] * cp;
/* L10: */
	}

/*    form offsets from player ship and rotate them about it */

	for (j = 1; j <= 13; ++j) {
	    t1[j - 1] -= *xc;
	    t2[j - 1] -= *yc;
	    t3[j - 1] -= *zc;
	    t4[j - 1] = t1[j - 1] * *csa + t2[j - 1] * *ssa;
	    t5[j - 1] = -(doublereal)t1[j - 1] * *ssa * *csp + t2[j - 1] * *
		    csa * *csp + t3[j - 1] * *ssp;
	    t6[j - 1] = t1[j - 1] * *ssa * *ssp - t2[j - 1] * *csa * *ssp + 
		    t3[j - 1] * *csp;
	    if (t5[j - 1] < (float)5.) {
		t5[j - 1] = (float)5.;
	    }
	    if (j <= 8) {
		x_pt__[j - 1] = t4[j - 1] / t5[j - 1] * (float)350. + (float)
			450.;
		y_pt__[j - 1] = (float)400. - t6[j - 1] / t5[j - 1] * (float)
			350.;
	    } else {
		i = j - 8;
		center[i - 1] = t4[j - 1] / t5[j - 1] * (float)350. + (float)
			450.;
		center[i + 4] = (float)400. - t6[j - 1] / t5[j - 1] * (float)
			350.;
		radius[i - 1] = radii[i - 1] / t5[j - 1] * (float)350. + (
			float).5;
	    }
/* L20: */
	}
	gprmultiline_(x_pt__, y_pt__, &c__8, &istat);
	for (j = 1; j <= 5; ++j) {
	    xpt[0] = center[j - 1];
	    xpt[1] = center[j + 4];
	    if (radius[j - 1] > 0) {
		gprcircle_(xpt, &radius[j - 1], &istat);
	    }
/* L30: */
	}
    } else {

/*    erase old figure by redrawing in black or with xor raster op */

	gprmultiline_(x_pt__, y_pt__, &c__8, &i);
	for (j = 1; j <= 5; ++j) {
	    xpt[0] = center[j - 1];
	    xpt[1] = center[j + 4];
	    if (radius[j - 1] > 0) {
		gprcircle_(xpt, &radius[j - 1], &istat);
	    }
/* L40: */
	}
    }
    return 0;
} /* strek_starbase__ */

