#include "c_includ.h" /* * cbzone_graphics.c * -- Todd W Mummert, December 1990, CMU * * RCS Info * $Header: c_graphics.c,v 1.1 91/01/12 02:03:33 mummert Locked $ */ Font controlfont, titlefont, generalfont; void message(number, bell) int number; Bool bell; { static int xpt = 70; static int ypt[] = {507, 567, 627}; static char* messages[] = {"ENEMY TANK IN FIRING ARC", "MOVEMENT BLOCKED BY OBJECT", "SALVO FIRED BY ENEMY TANK"}; int ind; char text[41]; ind = abs(number) - 1; if (number < 0) sprintf(text,"%-40s"," "); else sprintf(text,"%-40s",messages[ind]); gprsetclippingactive(False); printstring(xpt, ypt[ind], text, 40); gprsetclippingactive(True); if (bell) tonetime(); } void screeninit() { controlfont = gprloadfontfile(CONTROLFONT); titlefont = gprloadfontfile(TITLEFONT); generalfont = gprloadfontfile(GENERALFONT); staticscreen(); } void staticscreen() { static int window[2][2] = {70, 75, 860, 350}; int pt[2], radius; char text[30]; static short line[] = {58, 66, 66, 58, 56, 438, 68, 438, 938, 56, 938, 68, 942, 442, 934, 434, 56, 472, 68, 472, 934, 468, 942, 476, 58, 644, 66, 652, 932, 648, 944, 648}; static short scan[] = {500, 495, 500, 500, 500, 625, 500, 620, 435, 560, 440, 560, 565, 560, 560, 560}; static short scrn[] = {75, 64, 925, 64, 936, 75, 936, 425, 925, 436, 75, 436, 64, 425, 64, 75, 75, 64}; gprsetclippingactive(False); gprsettextbackgroundvalue(opt->cpi[COLOR_BG]); gprsetdrawvalue(opt->cpi[COLOR_FG]); gprsettextvalue(opt->cpi[COLOR_TEXT]); drawrectangle(50, 50, 900, 400); /* draw the outer top rectangle */ drawrectangle(53, 53, 894, 394); /* inner top */ drawrectangle(50, 460, 900, 200); /* outer bottom */ drawrectangle(53, 463, 894, 194); /* inner bottom */ polyline(scrn, 9); /* inner top frame */ pt[0] = 62; pt[1] = 62; radius = 6; gprcircle(pt, radius); /* now let's draw some screws */ pt[0] = 938; gprcircle(pt, radius); pt[1] = 438; gprcircle(pt, radius); pt[0] = 62; gprcircle(pt, radius); pt[0] = 62; pt[1] = 472; gprcircle(pt, radius); pt[0] = 938; gprcircle(pt, radius); pt[1] = 648; gprcircle(pt, radius); pt[0] = 62; gprcircle(pt, radius); multiline(line, 8); /* now the slots */ pt[0] = 500; pt[1] = 560; radius = 65; gprsetdrawvalue(opt->cpi[COLOR_SCANNER]); gprcircle(pt, radius); /* radar screen */ radius = 64; gprcircle(pt, radius); multiline(scan, 4); pt[0] = 855; pt[1] = 560; radius = 65; gprsetdrawvalue(opt->cpi[COLOR_JOYSTICK]); gprcircle(pt, radius); /* joystick screen */ radius = 64; gprcircle(pt, radius); gprsetdrawvalue(opt->cpi[COLOR_TEXT]); drawrectangle(590, 570, 55, 30); /* missile warning */ drawrectangle(655, 570, 55, 30); /* lander warning */ drawrectangle(590, 520, 120, 30); /* score box */ gprsettextfont(titlefont); strcpy(text, "BATTLEZONE V2.0c"); printstring(50, 45, text, strlen(text)); gprsettextvalue(opt->cpi[COLOR_JOYSTICK]); strcpy(text, "F"); /* directions for the joystick */ printstring(850, 503, text, 1); strcpy(text, "B"); printstring(850, 630, text, 1); strcpy(text, "R"); printstring(913, 570, text, 1); strcpy(text, "L"); printstring(785, 570, text, 1); gprsettextvalue(opt->cpi[COLOR_TEXT]); gprsettextfont(controlfont); strcpy(text, "Missile"); /* warning messages */ printstring(595, 590, text, 7); strcpy(text, "Lander"); printstring(664, 590, text, 6); strcpy(text, "H"); /* switch positions */ printstring(920, 608, text, 1); strcpy(text, "L"); printstring(920, 642, text, 1); gprsetclipwindow(window); /* define the playing field */ gprsettextfont(generalfont); pt[0] = 500; pt[1] = 355; gprsetcursorposition(pt); gprsetclippingactive(True); } void updatedisplay (missile, lander, score, numleft, sens, reset) Bool missile, lander, sens, reset; LONG score; // Eric Fogelin made this LONG from int int numleft; { char text[11]; static Bool flasher[] = {False, False}; static int currentnumleft = 0; static int currentscore = -1; static int bswitch[] = {918, 612}; static int blswitch[] = {918, 638}; // Eric Fogelin: added - orig did not work static int wind1[][2] = {591, 571, 54, 29}; static int wind2[][2] = {656, 571, 54, 29}; static int origin[][2] = {733, 493, 733, 533, 733, 573, 733, 613}; static Bool currentsens = True; gprsetclippingactive(False); if (reset) { flasher[0] = flasher[1] = False; currentsens = True; } if ((flasher[0] && !missile) || /* change the missile warning */ (!flasher[0] && missile)) { flasher[0] = missile; bitblt(wind1); } if ((flasher[1] && !lander) || /* change the lander warning */ (!flasher[1] && lander)) { flasher[1] = lander; bitblt(wind2); } if (score != currentscore) { /* change the score */ currentscore = score; sprintf(text,"%10ld",score); // Eric Fogelin changed this to ld from d printstring(608, 542, text, strlen(text)); } if (numleft < currentnumleft && numleft >= 0) /* remove tank(s) */ while (numleft != currentnumleft) removepixmap(4, origin[--currentnumleft]); if (numleft > currentnumleft) /* add tank(s) */ while (numleft != currentnumleft && currentnumleft < 4) putpixmap(4, origin[currentnumleft++]); if (sens && !currentsens) { /* change to high gear */ removepixmap(3, blswitch); // Eric Fogelin: added - orig did not work putpixmap(2, bswitch); currentsens = sens; } else if (!sens && currentsens) { /* change to low gear */ removepixmap(2, bswitch); // Eric Fogelin: added - orig did not work putpixmap(3, blswitch); currentsens = sens; } gprsetclippingactive(True); } void joystick (position, sens, pl) int* position; Genericp pl; Bool sens; { static float sscale[] = {0.06, 0.03}; static float rscale[] = {0.00013, 0.000065}; static int destorigin[] = {845, 550}; static short stick[8] = {0}; static Bool first = True; static Bool draw = True; int ind; float scrot, sctot, scale, xl, yl, tl, xoff, yoff; if (sens) ind = 0; else ind = 1; pl->speed = -(position[1] - 355.0) * sscale[ind]; pl->rotate = (position[0] - 500.0) * rscale[ind]; if (fabs(pl->speed) > 10.0) pl->speed = sign(10.0, pl->speed); if (fabs(pl->rotate) > 0.030) pl->rotate = sign(0.030, pl->rotate); scrot = pl->rotate * 10.0 / 0.030; sctot = sqrt(pl->speed*pl->speed + scrot*scrot); if (sctot > 10.0) { scale = 10.0 / sctot; pl->speed *= scale; pl->rotate *= scale; } if (draw) { gprsetclippingactive(False); if (!first) { gprsetdrawvalue(opt->cpi[COLOR_BG]); removepixmap(1, destorigin); multiline(stick, 2); } else first = False; destorigin[0] = 35.0 * (pl->rotate / 0.03) + 845.0; destorigin[1] = -35.0 * (pl->speed / 10.0) + 550.0; putpixmap(1, destorigin); xl = pl->rotate / 0.030; yl = pl->speed / 10.0; tl = sqrt(xl*xl + yl*yl); if (tl > 0.05) { yoff = xl / tl * 9.0; xoff = yl / tl * 9.0; } else { yoff = 0.0; xoff = 0.0; } stick[0] = stick[4] = 855; stick[2] = destorigin[0] + 10 + xoff / 2; stick[6] = destorigin[0] + 10 - xoff / 2; stick[1] = stick[5] = 560; stick[3] = destorigin[1] + 10 + yoff / 2;; stick[7] = destorigin[1] + 10 - yoff / 2; gprsetdrawvalue(opt->cpi[COLOR_JOYSTICK]); multiline(stick, 2); gprsetclippingactive(True); } draw = !draw; pl->rotate = -pl->rotate; } /* * scanner * * draws the radar scan... */ void scanner(o) Genericp o; { static float scale = 0.03; static XSegment scanline[] = {500, 560, 500, 560}; static Bool init = True; static XSegment* dot; static float ca = 1.0; /* keep track of where the scanner line */ static float sa = 0.0; /* is currently positioned */ static float sda = 0.087156; static float cda = 0.996195; static int ind = 0; /* number of enemies last on scanner */ float temp; Genericp g; XSegment* nextdot; XSegment* curdot; if (init) { dot = (XSegment*) malloc(sizeof(XSegment)*2*opt->mobjects); if (dot == NULL) { printf("Malloc failed...too many objects?\n"); #ifdef WIN32 return; #else //X11 exit(1); #endif } init = False; } gprsetclippingactive(False); gprsetdrawvalue(opt->cpi[COLOR_BG]); multiline(scanline, 1); /* erase scan line */ if (ind) /* erase enemies, if necessary */ multiline(dot, ind); temp = ca; ca = ca * cda - sa * sda; sa = sa * cda + sda * temp; scanline->x2 = 60.0 * ca + 500; scanline->y2 = 60.0 * sa + 560; gprsetdrawvalue(opt->cpi[COLOR_SCANNER]); multiline(scanline, 1); /* draw scanline */ ind = 0; curdot = dot; for (g=o+opt->estart; glstart; g++) if (g->attr & IS_ALIVE && g->range <= 2000.0 && g->range != 0.0) { nextdot = curdot + 1; nextdot->x1 = curdot->x1 = 500 + g->prox * scale - 1; nextdot->y2 = curdot->y1 = 560 - g->proy * scale + 1; nextdot->x2 = curdot->x2 = curdot->x1 + 2; nextdot->y1 = curdot->y2 = curdot->y1 - 2; ind += 2; curdot += 2; } if (ind) multiline(dot, ind); /* draw enemies, if necessary */ gprsetclippingactive(True); } void xhairs (aligned) Bool aligned; { static Bool last = False; static short pt1[] = {500, 215, 500, 235, 500, 285, 500, 305, 475, 240, 475, 235, 475, 235, 525, 235, 525, 235, 525, 240, 475, 280, 475, 285, 475, 285, 525, 285, 525, 285, 525, 280}; static short pt2[] = {500, 215, 500, 235, 500, 285, 500, 305, 475, 245, 500, 235, 500, 235, 525, 245, 475, 275, 500, 285, 500, 285, 525, 275}; static Bool draw = True; if (draw) { if (aligned) { if (!last) { gprsetdrawvalue(opt->cpi[COLOR_BG]); /* erase the old */ multiline(pt1, 8); last = True; } gprsetdrawvalue(opt->cpi[COLOR_XHAIR]); /* draw the new */ multiline(pt2, 6); } else { if (last) { gprsetdrawvalue(opt->cpi[COLOR_BG]); /* erase the old */ multiline(pt2, 6); last = False; } gprsetdrawvalue(opt->cpi[COLOR_XHAIR]); /* draw the new */ multiline(pt1, 8); } } draw = !draw; } void drawhorizon(azm) float azm; { static short horizon[] = {500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240, 500, 240}; static int number = 0; static float rdc = 0.01745329251; static float scale = 15.0; static int numclust[] = {8, 12, 10, 12, 10, 10}; static int clustux[][12] = {150, 140, 150, 60, 85, -100, -50, -150, 0, 0, 0, 0, 150, 50, 75, 0, 0, 7, 0, -40, 0, -110, -25, -150, 150, 115, 115, 105, 115, -10, 0, -125, -85, -150, 0, 0, 150, 130, 150, 10, 25, -35, -35, 0, -35, -140, -110, -150, 150, -10, 25, -70, -50, -125, -125, -100, -125, -150, 0, 0, 150, 100, 140, 0, 0, -30, 0, -120, -60, -150, 0, 0}; static int clustuy[][12] = {160, 220, 160, 250, 225, 245, 250, 240, 0, 0, 0, 0, 240, 227, 245, 190, 190, 215, 190, 225, 190, 213, 240, 200, 200, 189, 189, 225, 189, 244, 250, 165, 213, 135, 0, 0, 135, 200, 135, 210, 225, 165, 165, 230, 165, 228, 210, 215, 215, 217, 230, 195, 210, 150, 150, 210, 150, 173, 0, 0, 173, 209, 225, 170, 170, 225, 170, 230, 200, 160, 0, 0}; static int pt[2]; static Bool moon = False; float center, xoff; float deg, degmin, degmax; int indmin, indmax, i, i1, j; Bool flag1, flag2; short* current; gprsetdrawvalue(opt->cpi[COLOR_BG]); multiline(horizon, number); /* erase horizon */ if (moon) removepixmap(0, pt); /* erase moon */ gprsetdrawvalue(opt->cpi[COLOR_HORIZON]); deg = azm / rdc; if (deg >= 360.0) deg -= 360.0; degmin = deg - 30.0; degmax = deg + 30.0; flag1 = False; flag2 = False; if (degmin < 0.0) { degmin += 360.0; flag1 = True; } if (degmax >= 360.0) { degmax -= 360.0; flag2 = True; } indmin = (int) (degmin / 20.0); indmax = (int) (degmax / 20.0) + 1; number = 0; current = horizon; if (!flag1 && !flag2) for (i=indmin; i>= 1; multiline(horizon, number); /* draw horizon */ if (deg <= 360.0 && deg >= 270.0) { moon = True; pt[0] = 500 + (deg - 315.0) * scale - 20; pt[1] = 105 - 20; putpixmap(0, pt); /* draw moon */ } else moon = False; } void drawcracks() { static short pt[] = {190, 75, 270, 175, 270, 175, 230, 265, 240, 243, 330, 290, 310, 280, 390, 235, 370, 246, 380, 195, 200, 425, 290, 365, 270, 378, 300, 325, 630, 425, 560, 335, 580, 361, 626, 295, 570, 348, 510, 355, 520, 354, 490, 275, 500, 301, 440, 290, 810, 75, 720, 125, 720, 125, 695, 205, 700, 200, 590, 210, 630, 206, 620, 256, 710, 157, 780, 245, 770, 232, 730, 305, 740, 287, 760, 315}; gprsetdrawvalue(opt->cpi[COLOR_CRACKS]); multiline(pt, 19); /* draw cracks */ } void clearscreen () { static int destorigin[] = {70, 75}; static int window[][2] = {70, 75, 860, 350}; clearrectangle(window, destorigin); /* erase the main viewscreen */ }