diff hockey.c @ 3:5a977ccbc7a9 default tip

Empty changelog
author darius
date Sat, 06 Dec 1997 05:41:29 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hockey.c	Sat Dec 06 05:41:29 1997 +0000
@@ -0,0 +1,335 @@
+/* $Id: hockey.c,v 1.1.1.1 1997/12/06 05:41:29 darius Exp $ */
+
+#ifdef HOCKEY
+/* code for hockey lines [BDyess] 9/14/94 */
+
+#include <stdio.h>
+#include "Wlib.h"
+#include "defs.h"
+#include "struct.h"
+#include "data.h"
+#include "proto.h"
+#include "gameconf.h"
+#include "packets.h"
+
+void dump_hockey_points();
+/*void init_puck();	/* getship.c */
+
+struct player *puck;
+
+/* check to see if on a hockey server and do initialization [BDyess] */
+void hockeyInit() {
+  int i,j;
+  struct planet *l, *last;
+  int rightmost = 0;
+  int leftmost = blk_gwidth;
+  int nplan = paradise ? nplanets : 40; /* shouldn't be Paradise... */
+  int middle = blk_gwidth / 2;
+  int top = 0;
+  int bottom = blk_gwidth;
+  int line = 0;
+  struct point { int x,y; } boxpoints[4];
+		    /* top-topleft, top-bottomright, bottom-topright,
+		       bottom-bottomright, {x,y} for each [BDyess] */
+  W_Color topcolor,bottomcolor;
+
+  topcolor = bottomcolor = W_Grey;
+
+  /* we're playing hockey if a player named "Puck" exists in the 'g'
+     slot, is independant, is in a scout, and has the login name
+     'Robot'. [BDyess] */
+  puck = &players['g'-'a'+10];
+  if(!hockey) {
+    if(0 == strcmp(puck->p_name,"Puck") &&
+       0 == strcmp(puck->p_login,"Robot") &&
+       puck->p_teami < 0 &&
+       SCOUT == puck->p_ship->s_type) {
+
+      printf("Hi Puck!\n");
+      hockey = 1;
+      /*init_puck();*/
+    }
+  }
+  if(!hockey)	/* not a hockey server, nothing more to do */
+    return;
+
+  if(puck->p_ship->s_type != PUCK) {
+    puck->p_ship = getship(PUCK);
+    redrawPlayer[puck->p_no];
+  }
+  if(tacticalHockeyLines) {
+    last = &planets[nplan];
+    /* guess where the lines are supposed to go based on planet
+       location.  Always draws straight lines, ie. if the border
+       bows out, tough - the furthest out planet will have a vertical
+       line through it. [BDyess] */
+
+    /* first the left and rightmost lines [BDyess] */
+    for(l = &planets[0];l < last;l++) {
+      if(l->pl_x < leftmost) {
+	leftmost = l->pl_x;
+      }
+      if(l->pl_x > rightmost) {
+	rightmost = l->pl_x;
+      }
+    }
+    hlines[line].vertical = 1;
+    hlines[line].pos = leftmost;
+    hlines[line].end1 = 0;
+    hlines[line].end2 = blk_gwidth;
+    hlines[line].color = W_Grey;
+    line++;
+    hlines[line].vertical = 1;
+    hlines[line].pos = rightmost;
+    hlines[line].end1 = 0;
+    hlines[line].end2 = blk_gwidth;
+    hlines[line].color = W_Grey;
+    line++;
+    /* now guess the middle planet.  Pick the planet closest to the
+       middle of the screen. [BDyess] */
+    hlines[line].pos = 0;
+    for(l = &planets[0];l < last;l++) {
+      if(ABS(l->pl_y - middle) < ABS(hlines[line].pos - middle))
+	hlines[line].pos = l->pl_y;
+    }
+    middle = hlines[line].pos;
+    hlines[line].end1 = leftmost;
+    hlines[line].end2 = rightmost;
+    hlines[line].vertical = 0;
+    hlines[line].color = W_Red;
+    line++;
+    /* now find the upper and lower middle lines by picking the planets
+       closest to the center yet still above/below the middle and inside
+       the left and rightmost [BDyess] */
+    for(l = &planets[0];l < last;l++) {
+      if(NOBODY == l->pl_owner) continue;
+      if(l->pl_y > top && l->pl_y < middle && 
+	 l->pl_x < rightmost && l->pl_x > leftmost) {
+	top = l->pl_y;
+	topcolor = planetColor(l);
+      }
+      if(l->pl_y < bottom && l->pl_y > middle && 
+	 l->pl_x < rightmost && l->pl_x > leftmost) {
+	bottom = l->pl_y;
+	bottomcolor = planetColor(l);
+      }
+    }
+    hlines[line].pos = top;
+    hlines[line].end1 = leftmost;
+    hlines[line].end2 = rightmost;
+    hlines[line].vertical = 0;
+    hlines[line].color = teamColorHockeyLines ? topcolor : W_Cyan;
+    line++;
+    hlines[line].pos = bottom;
+    hlines[line].end1 = leftmost;
+    hlines[line].end2 = rightmost;
+    hlines[line].vertical = 0;
+    hlines[line].color = teamColorHockeyLines ? bottomcolor : W_Cyan;
+    line++;
+    /* last, try to find the goal box.  Search for the planets that
+       are inside the left and right, above/below the upper/lower middle,
+       and are not neutral.  Of those planets, take the top left and
+       bottom right points [BDyess] */
+    /* toplefts */
+    boxpoints[0].x = boxpoints[0].y = boxpoints[2].x = boxpoints[2].y =
+    		blk_gwidth;
+    /* bottomrights */
+    boxpoints[1].x = boxpoints[1].y = boxpoints[3].x = boxpoints[3].y = 0;
+    for(l = &planets[0];l < last;l++) {
+      /* don't want nobody's planets */
+      if(l->pl_owner == NOBODY) continue;
+      /* check for out-of-bounds */
+      if((l->pl_y >= top && l->pl_y <= bottom) ||
+	 l->pl_x >= rightmost || l->pl_x <= leftmost) continue; 
+      /* top or bottom? */
+      if(l->pl_y < middle) i = 0; /* top */
+      else i = 2; 		  /* bottom */
+      if(l->pl_x <= boxpoints[i].x &&
+         l->pl_y <= boxpoints[i].y) {  /* new topleft */
+	boxpoints[i].x = l->pl_x;
+	boxpoints[i].y = l->pl_y;
+      }
+      if(l->pl_x >= boxpoints[i+1].x &&
+         l->pl_y >= boxpoints[i+1].y) { /* new bottomright */
+	boxpoints[i+1].x = l->pl_x;
+	boxpoints[i+1].y = l->pl_y;
+      }
+    }
+    if(! teamColorHockeyLines) {
+      topcolor = bottomcolor = W_Grey;
+    }
+    hlines[line].vertical = 0;
+    hlines[line].pos = boxpoints[0].y;
+    hlines[line].end1 = boxpoints[0].x;
+    hlines[line].end2 = boxpoints[1].x;
+    hlines[line].color = topcolor;
+    line++;
+    hlines[line].vertical = 1;
+    hlines[line].pos = boxpoints[0].x;
+    hlines[line].end1 = boxpoints[0].y;
+    hlines[line].end2 = boxpoints[1].y;
+    hlines[line].color = topcolor;
+    line++;
+    hlines[line].vertical = 0;
+    hlines[line].pos = boxpoints[1].y;
+    hlines[line].end1 = boxpoints[0].x;
+    hlines[line].end2 = boxpoints[1].x;
+    hlines[line].color = W_Red;
+    line++;
+    hlines[line].vertical = 1;
+    hlines[line].pos = boxpoints[1].x;
+    hlines[line].end1 = boxpoints[0].y;
+    hlines[line].end2 = boxpoints[1].y;
+    hlines[line].color = topcolor;
+    line++;
+
+    hlines[line].vertical = 0;
+    hlines[line].pos = boxpoints[2].y;
+    hlines[line].end1 = boxpoints[2].x;
+    hlines[line].end2 = boxpoints[3].x;
+    hlines[line].color = W_Red;
+    line++;
+    hlines[line].vertical = 1;
+    hlines[line].pos = boxpoints[2].x;
+    hlines[line].end1 = boxpoints[2].y;
+    hlines[line].end2 = boxpoints[3].y;
+    hlines[line].color = bottomcolor;
+    line++;
+    hlines[line].vertical = 0;
+    hlines[line].pos = boxpoints[3].y;
+    hlines[line].end1 = boxpoints[2].x;
+    hlines[line].end2 = boxpoints[3].x;
+    hlines[line].color = bottomcolor;
+    line++;
+    hlines[line].vertical = 1;
+    hlines[line].pos = boxpoints[3].x;
+    hlines[line].end1 = boxpoints[2].y;
+    hlines[line].end2 = boxpoints[3].y;
+    hlines[line].color = bottomcolor;
+    line++;
+  }
+}
+
+/* draw the tactical hockey lines [BDyess] */
+void tactical_hockey() {
+  int i;
+  struct hockeyLine *l = &hlines[0];
+  int dx,dx1,dx2,dy,dy1,dy2;
+  int view = SCALE * WINSIDE / 2;
+  static int old_tacticalHockeyLines, old_galacticHockeyLines,
+             old_cleanHockeyGalactic, old_teamColorHockeyLines;
+
+  if(!hockey)
+    return;
+
+  if(puck->p_ship->s_type != PUCK) {
+    puck->p_ship = getship(PUCK);
+    redrawPlayer[puck->p_no];
+  }
+  if(tacticalHockeyLines != old_tacticalHockeyLines) {
+    redrawall = 1;
+    old_tacticalHockeyLines = tacticalHockeyLines;
+  }
+  if(galacticHockeyLines != old_galacticHockeyLines) {
+    redrawall = 1;
+    old_galacticHockeyLines = galacticHockeyLines;
+  }
+  if(cleanHockeyGalactic != old_cleanHockeyGalactic) {
+    redrawall = 1;
+    old_cleanHockeyGalactic = cleanHockeyGalactic;
+  }
+  if(teamColorHockeyLines != old_teamColorHockeyLines) {
+    old_teamColorHockeyLines = teamColorHockeyLines;
+    hockeyInit();
+  }
+  /* draw whatever hockey lines are visible [BDyess] */
+  if(hockey && tacticalHockeyLines) {		/* if it should be drawn */
+    for(i = 0, l = &hlines[0]; i < NUM_HOCKEY_LINES; i++, l++) {
+      if(l->vertical) {
+	dx = l->pos - me->p_x;
+	dy1 = l->end1 - me->p_y;
+	dy2 = l->end2 - me->p_y;
+	/* is it in view? [BDyess] */
+        if(ABS(dx) <= view && 
+	   (ABS(dy1) <= view || ABS(dy2) <= view ||
+	    (l->end1 <= me->p_y && l->end2 >= me->p_y))) {
+	  dx = dx / SCALE + WINSIDE / 2;
+	  dy1 = dy1 / SCALE + WINSIDE / 2;
+	  dy2 = dy2 / SCALE + WINSIDE / 2;
+	  W_CacheLine(w, dx, dy1, dx, dy2, l->color);
+	  clearline[0][clearlcount] = dx;
+	  clearline[1][clearlcount] = dy1;
+	  clearline[2][clearlcount] = dx;
+	  clearline[3][clearlcount] = dy2; 
+	  clearlcount++;
+	}
+      } else {			/* horizontal */
+	dy = l->pos - me->p_y;
+	dx1 = l->end1 - me->p_x;
+	dx2 = l->end2 - me->p_x;
+	/* is it in view? [BDyess] */
+        if(ABS(dy) <= view && 
+	   (ABS(dx1) <= view || ABS(dx2) <= view ||
+	    (l->end1 <= me->p_x && l->end2 >= me->p_x))) {
+	  dy = dy / SCALE + WINSIDE / 2;
+	  dx1 = dx1 / SCALE + WINSIDE / 2;
+	  dx2 = dx2 / SCALE + WINSIDE / 2;
+	  W_CacheLine(w, dx1, dy,  dx2, dy, l->color);
+	  clearline[0][clearlcount] = dx1;
+	  clearline[1][clearlcount] = dy;
+	  clearline[2][clearlcount] = dx2;
+	  clearline[3][clearlcount] = dy;
+	  clearlcount++;
+	}
+      }
+    }
+  }
+}
+
+/* draw the tactical hockey lines [BDyess] */
+void galactic_hockey() {
+  int i;
+  struct hockeyLine *l;
+  int dx,dx1,dx2,dy,dy1,dy2;
+  int gwidth, offsetx, offsety;
+
+  if(hockey && galacticHockeyLines) {	/* if it should be drawn */
+    if(blk_zoom) {
+      gwidth = blk_gwidth / 2;
+      offsetx = zoom_offset(me->p_x);
+      offsety = zoom_offset(me->p_y);
+      /* keep last offset? */
+    } else {
+      gwidth = blk_gwidth;
+      offsetx = offsety = 0;
+    }
+    for(i = 0, l = &hlines[0]; i < NUM_HOCKEY_LINES; i++, l++) {
+      if(l->vertical) {
+	dx = (l->pos - offsetx) * WINSIDE / gwidth;
+	dy1 = (l->end1 - offsety) * WINSIDE / gwidth;
+	dy2 = (l->end2 - offsety) * WINSIDE / gwidth;
+	W_MakeLine(mapw, dx, dy1, dx, dy2, l->color);
+      } else {
+	dy = (l->pos - offsety) * WINSIDE / gwidth;
+	dx1 = (l->end1 - offsetx) * WINSIDE / gwidth;
+	dx2 = (l->end2 - offsetx) * WINSIDE / gwidth;
+        W_MakeLine(mapw, dx1, dy, dx2, dy, l->color);
+      }
+    }
+  }
+}
+
+void dump_hockey_points() {
+  int i;
+  struct hockeyLine *l;
+
+  printf("Hockey points dump:\n");
+  for (i = 0, l = &hlines[0]; i < NUM_HOCKEY_LINES; i++, l++) {
+    if(l->vertical) {
+      printf("%d: %d,%d  %d,%d\n",i,l->pos,l->end1,l->pos,l->end2);
+    } else {
+      printf("%d: %d,%d  %d,%d\n",i,l->end1,l->pos,l->end2,l->pos);
+    }
+  }
+}      
+#endif /*HOCKEY*/