Category : A Collection of Games for DOS and Windows
Archive   : BZONE.ZIP
Filename : C_DRAW.C

 
Output of file : C_DRAW.C contained in archive : BZONE.ZIP
#include "c_includ.h"
/*
* c_draw.c
* Todd W Mummert, CMU, January 1991
*
* This is an attempt at cleaning up the drawing routines.
*/

/*
* this routine is for points which cannot change their bearing and have
* no moving parts; i.e., blocks.
*/
void calcpointsI(dc, method, index, g, pl)
DCp dc;
Methodp method;
int index;
Genericp g, pl;
{
int i;
float xpoff, ypoff, prx, pry, prz, dx, dy;
Coord2dp new;
Coord3dp old;

old = dc->s->object+index;
new = dc->points+index;
dx = pl->x - dc->pos.x;
dy = pl->y - dc->pos.y;
for (i=0; inum; i++, old++, new++) {
xpoff = old->x - dx;
ypoff = old->y - dy;
prx = xpoff * pl->ca + ypoff * pl->sa;
pry = -xpoff * pl->sa + ypoff * pl->ca;
if (pry < 10.0)
pry = 10.0;
prz = old->z + dc->pos.z;
new->x = 500 + prx / pry * 450;
new->y = 260 - prz / pry * 450;
}
}

/*
* this routine is for points which may change their bearing, but do not
* have moving parts.
*/
void calcpointsII(dc, method, index, g, pl)
DCp dc;
Methodp method;
int index;
Genericp g, pl;
{
int i;
float csa, ssa, dx, dy, xn, yn, cn, sn, prx, pry, prz, rx, ry;
Coord2dp new;
Coord3dp old;

old = dc->s->object+index;
new = dc->points+index;

csa = cos(g->azm);
ssa = sin(g->azm);
dx = pl->x - dc->pos.x;
dy = pl->y - dc->pos.y;
xn = dx * csa + dy * ssa;
yn = -dx * ssa + dy * csa;
cn = pl->ca * csa + pl->sa * ssa;
sn = pl->sa * csa - ssa * pl->ca;
for (i=0; inum; i++, old++, new++) {
rx = old->x - xn;
ry = old->y - yn;
prx = rx * cn + ry * sn;
pry = -rx * sn + ry * cn;
if (pry < 10.0)
pry = 10.0;
prz = old->z + dc->pos.z;
new->x = 500 + prx / pry * 450;
new->y = 260 - prz / pry * 450;
}
}

/*
* this routine is for points which do not change their bearing,
* but have moving parts which rotate around the center of the
* object.
*/
void calcpointsIII(dc, method, index, g, pl)
DCp dc;
Methodp method;
int index;
Genericp g, pl;
{
int i;
float temp, dx, dy, xn, yn, cn, sn, prx, pry, prz, rx, ry;
Coord2dp new;
Coord3dp old;

old = dc->s->object+index;
new = dc->points+index;
temp = dc->cta;
dc->cta = dc->cta * method->vars[0] - dc->sta * method->vars[1];
dc->sta = dc->sta * method->vars[0] + temp * method->vars[1];
dx = pl->x - dc->pos.x;
dy = pl->y - dc->pos.y;
xn = dx * dc->cta + dy * dc->sta;
yn = -dx * dc->sta + dy * dc->cta;
cn = pl->ca * dc->cta + pl->sa * dc->sta;
sn = pl->sa * dc->cta - pl->ca * dc->sta;
for (i=0; inum; i++, old++, new++) {
rx = old->x - xn;
ry = old->y - yn;
prx = rx * cn + ry * sn;
pry = -rx * sn + ry * cn;
if (pry < 10.0)
pry = 10.0;
prz = old->z + dc->pos.z;
new->x = 500 + prx / pry * 450;
new->y = 260 - prz / pry * 450;
}
}

/*
* this routine is for points which do change their bearing,
* and have moving parts which do not rotate around the center of the
* object. an example is the offset radar dish of the normal tanks.
*/
void calcpointsIV(dc, method, index, g, pl)
DCp dc;
Methodp method;
int index;
Genericp g, pl;
{
int i;
float temp, dx, dy, xn, yn, cn, sn, prx, pry, prz, rx, ry, csa, ssa;
Coord2dp new;
Coord3dp old;
Float2d pivot;

old = dc->s->object+index;
new = dc->points+index;
temp = dc->cta;
dc->cta = dc->cta * method->vars[0] - dc->sta * method->vars[1];
dc->sta = dc->sta * method->vars[0] + temp * method->vars[1];
csa = cos(g->azm);
ssa = sin(g->azm);
dx = pl->x - dc->pos.x;
dy = pl->y - dc->pos.y;
xn = dx * csa + dy * ssa;
yn = -dx * ssa + dy * csa;
cn = pl->ca * csa + pl->sa * ssa;
sn = pl->sa * csa - ssa * pl->ca;
pivot.x = method->vars[2] - xn;
pivot.y = method->vars[3] - yn;
for (i=0; inum; i++, old++, new++) {
rx = old->x * dc->cta - old->y * dc->sta + pivot.x;
ry = old->x * dc->sta + old->y * dc->cta + pivot.y;
prx = rx * cn + ry * sn;
pry = -rx * sn + ry * cn;
if (pry < 10.0)
pry = 10.0;
prz = old->z + dc->pos.z;
new->x = 500 + prx / pry * 450;
new->y = 260 - prz / pry * 450;
}
}

/*
* draw plines and mlines
*
*/
void displayobject(dc)
DCp dc;
{
Coord2dp point;
int *i;

point=dc->points;
for (i=dc->s->pnum; *i; i++) {
polyline(point, *i);
point += *i;
}
for (i=dc->s->mnum; *i; i++) {
multiline(point, *i>>1);
point += *i;
}
}

void drawobject(g, pl)
Genericp g, pl;
{
static Coord3d cube[] = {
-40, 40, -40, -40, 40, 40, 40, 40, 40, 40, 40, -40,
-40, 40, -40, -40, -40, -40, 40, -40, -40, 40, -40, 40,
-40, -40, 40, -40, -40, -40, -40, -40, 40, -40, 40, 40,
40, -40, 40, 40, 40, 40, 40, -40, -40, 40, 40, -40};
static int cubepnum[] = {10, 0};
static int cubemnum[] = {6, 0};
static Method cubemethods[] = {16, calcpointsI, NULL,
0, NULL, NULL};

static Coord3d pyramid[] = {
-40, 40, -40, 40, 40, -40, 40, -40, -40, 40, 40, -40,
0, 0, 40, -40, 40, -40, -40, -40, -40, 0, 0, 40,
40, -40, -40, -40, -40, -40};
static int pyramidpnum[] = {10, 0};
static int pyramidmnum[] = {0};
static Method pyramidmethods[] = {10, calcpointsI, NULL,
0, NULL, NULL};

static Coord3d salvo[] = {
0, -10, -8, 8, -10, 0, 0, -10, 8, 8, -10, 0,
0, 10, 0, 0, -10, 8, -8, -10, 0, 0, 10, 0,
0, -10, -8, -8, -10, 0};
static int salvopnum[] = {10, 0};
static int salvomnum[] = {0};
static Method salvomethods[] = {10, calcpointsII, NULL,
0, NULL, NULL};

static Coord3d lander[] = {
0, 0, 20, 80, 0, -20, 40, 0, -40, -40, 0, -40,
-80, 0, -20, 0, 0, 20, 0, 80, -20, 0, 40, -40,
0, -40, -40, 0, -80, -20, 0, 0, 20, -57, -57, -20,
-28, -28, -40, 28, 28, -40, 57, 57, -20, 0, 0, 20,
57, -57, -20, 28, -28, -40, -28, 28, -40, -57, 57, -20,
0, 0, 20};
static int landerpnum[] = {21, 0};
static int landermnum[] = {0};
static float landervars[] = {0.996195, 0.087156};
static Method landermethods[] = {21, calcpointsIII, landervars,
0, NULL, NULL};

static Coord3d missile[] = {
15, -30, -25, 25, -30, 0, 0, -45, 0, 15, -30, -25,
-15, -30, -25, 0, -45, 0, 15, -30, 25, -15, -30, 25,
0, -45, 0, -25, -30, 0, -15, -30, 25, 15, -30, -25,
0, 50, 0, 25, -30, 0, 15, -30, 25, 0, 50, 0,
-15, -30, -25, -25, -30, 0, 0, 50, 0, -15, -30, 25,
13, -17, -21, 15, -30, -25, 23, -38, -40, 23, 0, -40,
13, -17, -21, -13, -17, -21, -15, -30, -25, -23, -38, -40,
-23, 0, -40, -13, -17, -21};
static int missilepnum[] = {11, 9, 5, 5, 0};
static int missilemnum[] = {0};
static Method missilemethods[] = {30, calcpointsII, NULL,
0, NULL, NULL};

static Coord3d copter[] = {
6, 100, 30, -6, -100, 30, 6, -100, 30,
-6, 100, 30, 6, 100, 30, 0, -114, -10,
7, -30, -34, 10, -34, -14, 0, -116, 0,
0, -134, 28, 0, -144, 28, 0, -130, -10,
0, -114, -10, -7, -30, -34, -10, -34, -14,
0, -116, 0, -14, 34, -34, 14, 34, -34,
0, 60, -14, -14, 34, -34, -7, -30, -34,
7, -30, -34, 14, 34, -34, 26, 34, -14,
0, 60, -14, -26, 34, -14, -10, -34, -14,
10, -34, -14, 26, 34, -14, 4, 20, 16,
0, 22, 16, -4, 20, 16, -4, -22, 16,
4, -22, 16, 4, 20, 16, 0, 0, 16,
0, 0, 36, -14, -30, -40, -14, 40, -40,
-14, 40, -40, -14, 44, -36, 14, -30, -40,
14, 40, -40, 14, 40, -40, 14, 44, -36,
-10, -34, -14, -4, -22, 16, 10, -34, -14,
4, -22, 16, 0, 22, 16, 0, 60, -14,
-14, 34, -34, -26, 34, -14, -26, 34, -14,
-4, 20, 16};
static int copterpnum[] = {5, 11, 19, 0};
static int coptermnum[] = {10, 10, 0};
static float coptervars[] = {0.819152, 0.573576};
static Method coptermethods[] = {5, calcpointsIII, coptervars,
50, calcpointsII, NULL,
0, NULL, NULL};

static Coord3d super[] = {
3, 55, -6, 3, 55, 0, -3, 55, 0, -3, 55, -6,
3, 55, -6, 0, 35, -33, 13, -60, -6, 11, -60, 4,
11, -25, 4, 0, 35, -33, -13, -60, -6, -11, -60, 4,
-11, -25, 4, 0, 35, -33, 15, 60, -40, 30, -60, -40,
30, -60, -6, 15, 60, -40, -15, 60, -40, -30, -60, -40,
-30, -60, -6, -15, 60, -40, 22, -52, -8, 22, -52, 28,
3, -17, 0, 3, 55, 0, -3, -17, 0, -3, 55, 0,
3, -8, -6, 3, 55, -6, -3, -8, -6, -3, 55, -6,
11, -60, 4, -11, -60, 4, 11, -25, 4, -11, -25, 4,
-30, -60, -6, 30, -60, -6, -30, -60, -40, 30, -60, -40};
static int superpnum[] = {5, 9, 8, 0};
static int supermnum[] = {2, 8, 4, 4, 0};
static Method supermethods[] = {40, calcpointsII, NULL,
0, NULL, NULL};

static Coord3d tank[] = {
3, 0, 13, 5, 3, 15, 5, 3, 19, 3, 0, 21,
-3, 0, 21, -5, 3, 19, -5, 3, 15, -3, 0, 13,
3, 0, 13, -3, 60, -3, 3, 60, -3, 3, 60, 3,
-3, 60, 3, -3, 60, -3, -10, -45, 10, -10, -13, 10,
10, -13, 10, 10, -45, 10, 25, -50, -11, 25, 60, -20,
10, -13, 10, -10, -13, 10, -25, 60, -20, -25, -50, -11,
-10, -45, 10, 10, -45, 10, 30, -53, -40, 35, -60, -10,
35, 60, -20, 30, 37, -40, -30, 37, -40, -35, 60, -20,
-35, -60, -10, -30, -53, -40, 30, -53, -40, 30, 37, -40,
5, -40, 10, 5, -40, 13, 3, 4, 3, 3, 60, 3,
-3, 4, 3, -3, 60, 3, -3, 19, -3, -3, 60, -3,
3, 19, -3, 3, 60, -3, 35, -60, -10, -35, -60, -10,
35, 60, -20, -35, 60, -20, -30, -53, -40, -30, 37, -40};
static int tankpnum[] = {9, 5, 12, 10, 0};
static int tankmnum[] = {2, 8, 6, 0};
static float tankvars[] = {0.996195, 0.087156, 5, -40};
static Method tankmethods[] = {9, calcpointsIV, tankvars,
43, calcpointsII, NULL,
0, NULL, NULL};

static StaticDC staticdcs[] = {
pyramid, pyramidpnum, pyramidmnum, pyramidmethods, COLOR_PYRAMID,
cube, cubepnum, cubemnum, cubemethods, COLOR_CUBE,
tank, tankpnum, tankmnum, tankmethods, COLOR_TANK,
super, superpnum, supermnum, supermethods, COLOR_SUPER,
missile, missilepnum, missilemnum, missilemethods, COLOR_MISSILE,
copter, copterpnum, coptermnum, coptermethods, COLOR_COPTER,
lander, landerpnum, landermnum, landermethods, COLOR_LANDER,
salvo, salvopnum, salvomnum, salvomethods, COLOR_ESALVO };

int color, i;
DCp dc;
Methodp methods;

dc = &g->dc[0];
if (dc->last) {
gprsetdrawvalue(opt->cpi[COLOR_BG]);
displayobject(dc);
}
if (g->attr & ERASE) return;

if (!(g->attr & HAS_DC)) {
g->attr |= HAS_DC;
dc->s = staticdcs+g->lntype;

switch (g->type) {
case IS_CUBE:
case IS_PYRAMID:
case IS_LANDER:
case IS_MISSILE:
case IS_COPTER:
case IS_SUPER:
case IS_TANK:
dc->fades = opt->fading_colors - 1;
dc->basecolor = dc->s->basecolor;
break;
case IS_SALVO:
dc->fades = False;
if (g->salvo == pl)
dc->basecolor = COLOR_PSALVO;
else
dc->basecolor = COLOR_ESALVO;
break;
}
}

if (dc->seen) {
if (dc->fades) {
color = g->range/OUT_OF_DRAWING_RANGE * opt->fading_colors;
if (color >= opt->fading_colors)
color = opt->fading_colors-1;
}
else
color = 0;
gprsetdrawvalue(color + opt->cpi[dc->basecolor]);

dc->pos.x = g->x;
dc->pos.y = g->y;
dc->pos.z = g->z;

methods = dc->s->methods;
for (i=0; methods->num; methods++) {
methods->calc(dc, methods, i, g, pl);
i += methods->num;
}

displayobject(dc);
dc->last = True;
}
else
dc->last = False;
}


  3 Responses to “Category : A Collection of Games for DOS and Windows
Archive   : BZONE.ZIP
Filename : C_DRAW.C

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/