DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: P T

⟦177151e0d⟧ TextFile

    Length: 42908 (0xa79c)
    Types: TextFile
    Names: »Patches01«

Derivation

└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
    └─⟦this⟧ »EUUGD18/Sun/Qix/Patches01« 

TextFile

*** OLD/Makefile	Tue Jan 12 15:53:56 1988
--- Makefile	Mon Mar  7 21:55:35 1988
***************
*** 6,19 ****
  ICONS= joystick.lf joystick.rt joystick.up joystick.dn joystick.stop \
  	spark1.pr spark2.pr spark3.pr spark4.pr marker.cursor qix.icon \
  	mouse.rt.icon
  CFLAGS= -O
  LDFLAGS= 
  LIBES= -lsuntool -lsunwindow -lpixrect
  
! qix.x: ${OBJS}
  	@echo loading...
  	@cc ${LDFLAGS} ${OBJS} ${LIBES} -o qix
  
  # qix with a recursive polygon file rather than iterative.
  # If you use it you have to unlimit the stacksize in csh
  # and check the code to make sure it's called right (it's old).
--- 6,37 ----
  ICONS= joystick.lf joystick.rt joystick.up joystick.dn joystick.stop \
  	spark1.pr spark2.pr spark3.pr spark4.pr marker.cursor qix.icon \
  	mouse.rt.icon
+ 
+ #	Change these to suit your installation
+ 
+ SCOREFILE=/usr/games/lib/qix.scores
+ BINDIR=/usr/people/argv/bin
+ 
  CFLAGS= -O
  LDFLAGS= 
  LIBES= -lsuntool -lsunwindow -lpixrect
  
! all: qix
! 
! qix:	${OBJS}
  	@echo loading...
  	@cc ${LDFLAGS} ${OBJS} ${LIBES} -o qix
  
+ install: all
+ 	install -s -c -m 2711 -o games -g games qix ${BINDIR}
+ 	touch ${SCOREFILE}
+ 	chmod 660 ${SCOREFILE}
+ 	-chgrp games ${SCOREFILE}
+ 	-chown games ${SCOREFILE}
+ 
+ score.o:
+ 	cc $(CFLAGS) -DSCOREFILE=\"${SCOREFILE}\" -c score.c
+ 
  # qix with a recursive polygon file rather than iterative.
  # If you use it you have to unlimit the stacksize in csh
  # and check the code to make sure it's called right (it's old).
***************
*** 25,27 ****
--- 43,86 ----
  	btoa > qix.tarmail
  
  shar: ; shar Makefile qix.h ${CFILES} ${ICONS} > qix.shar
+ 
+ clean:
+ 	rm -f qix $(OBJS)
+ 
+ lint:
+ 	lint -hbx $(CPPFLAGS) $(CFILES) $(LIBES)
+ 
+ depend: $(CFILES)
+ 	makedep -i $(CPPFLAGS) $(CFILES)
+ 
+ # DO NOT EDIT BELOW THIS LINE -- or it will disappear when you "make depend"
+ 
+ main.o: ./qix.icon
+ main.o: main.c
+ 
+ joystick.o: ./joystick.dn
+ joystick.o: ./joystick.lf
+ joystick.o: ./joystick.rt
+ joystick.o: ./joystick.stop
+ joystick.o: ./joystick.up
+ joystick.o: ./marker.cursor
+ joystick.o: ./mouse.rt.icon
+ joystick.o: joystick.c
+ 
+ sparks.o: ./spark1.pr
+ sparks.o: ./spark2.pr
+ sparks.o: ./spark3.pr
+ sparks.o: ./spark4.pr
+ sparks.o: sparks.c
+ 
+ regions.o: regions.c
+ 
+ qmove.o: qmove.c
+ 
+ polyfill.o: polyfill.c
+ 
+ polygon_area.o: polygon_area.c
+ 
+ polyfill_rec.o: polyfill_rec.c
+ 
+ score.o: score.c
*** OLD/joystick.c	Tue Jan 12 17:30:52 1988
--- joystick.c	Mon Mar  7 21:40:32 1988
***************
*** 108,114 ****
  	if (isdigit(ID)) {
  	    debug = ID - '0';
  	    msg("Debugging level set to %d", debug);
! 	    sleep(2);
  	    remove_msgs();
  	    return;
  	} else
--- 108,114 ----
  	if (isdigit(ID)) {
  	    debug = ID - '0';
  	    msg("Debugging level set to %d", debug);
! 	    Sleep(2);
  	    remove_msgs();
  	    return;
  	} else
***************
*** 164,172 ****
  	    moving = DOWN;
  	when 'k' : case 'K' : case KEY_RIGHT(8) :
  	    moving = UP;
! 	when LOC_MOVE : break; /* let those thru! */
  #ifdef DEBUG
! 	case '@' : no_qix_kill = !no_qix_kill; drawing = 0;
  	when '#' : clear_sparks();
  	when '+' : lives = min(lives+1, MAX_LIVES); update_score(); drawing = 0;
  	when '-' : lives = max(lives-1, 1); update_score(); drawing = 0;
--- 164,178 ----
  	    moving = DOWN;
  	when 'k' : case 'K' : case KEY_RIGHT(8) :
  	    moving = UP;
! 	when LOC_MOVE : ; /* let those thru! (break-- do nothing) */
! 	when 3 : /* CTRL(C) */
! 	    drawing = 0;		
! 	    if (play_mode == REAL_PLAY) {
! 		lives = 0;
! 		change_life(DIE);
! 	    }
  #ifdef DEBUG
! 	when '@' : no_qix_kill = !no_qix_kill; drawing = 0;
  	when '#' : clear_sparks();
  	when '+' : lives = min(lives+1, MAX_LIVES); update_score(); drawing = 0;
  	when '-' : lives = max(lives-1, 1); update_score(); drawing = 0;
***************
*** 198,208 ****
  
      if (!is_alive && lives > 0) {
  	/* user has died and is waiting to start again */
! 	sleep(2);
  	change_life(LIVE);
  	stop_timer(); /* change_life restarts it */
  	msg("Ready?");
! 	sleep(2);
  	remove_msgs(0);
  	start_timer();
  	return;
--- 204,214 ----
  
      if (!is_alive && lives > 0) {
  	/* user has died and is waiting to start again */
! 	Sleep(2);
  	change_life(LIVE);
  	stop_timer(); /* change_life restarts it */
  	msg("Ready?");
! 	Sleep(2);
  	remove_msgs(0);
  	start_timer();
  	return;
***************
*** 281,287 ****
  		    when SHOW_QIX :
  			remove_msgs(0);
  			msg("Your Enemies:");
! 			sleep(2);
  			time_left = 40;
  		    when SHOW_SPARKS :
  			time_left = 90;
--- 287,293 ----
  		    when SHOW_QIX :
  			remove_msgs(0);
  			msg("Your Enemies:");
! 			Sleep(2);
  			time_left = 40;
  		    when SHOW_SPARKS :
  			time_left = 90;
***************
*** 298,304 ****
  			change_life(LIVE);
  			stop_timer();
  	    msg("Enclose more than\n75%%\nof the play area for extra bonus.");
! 			sleep(2);
  			remove_msgs(0);
  			level = -2;
  			drawing = fast = 1;
--- 304,310 ----
  			change_life(LIVE);
  			stop_timer();
  	    msg("Enclose more than\n75%%\nof the play area for extra bonus.");
! 			Sleep(2);
  			remove_msgs(0);
  			level = -2;
  			drawing = fast = 1;
***************
*** 308,322 ****
  		when SHOW_QIX :
  		    move_qix();
  		    if (time_left == 1) {
! 			pw_text(draw_win, 200,200,PIX_SRC,big_font, "The qix.");
! 			sleep(2);
  		    }
  		when SHOW_SPARKS :
  		    move_sparks();
  		    if (time_left == 1) {
! 			pw_text(draw_win, 15, 110, PIX_SRC, big_font, "Sparx.");
! 			pw_text(draw_win,625, 110, PIX_SRC, big_font, "Sparx.");
! 			sleep(2);
  		    }
  		when SHOW_FUSE :
  		    /* after the pw_text, this moves into spiral death trap */
--- 314,335 ----
  		when SHOW_QIX :
  		    move_qix();
  		    if (time_left == 1) {
! 			pw_putattributes(draw_win, &text_mask);
! 			pw_text(draw_win, 200,200,PIX_SRC|PIX_COLOR(TEXT_COLOR),
! 				big_font, "The qix.");
! 			Sleep(2);
  		    }
  		when SHOW_SPARKS :
  		    move_sparks();
  		    if (time_left == 1) {
! 			pw_putattributes(draw_win, &text_mask);
! 			pw_text(draw_win, 15, 110, 
! 				PIX_SRC|PIX_COLOR(TEXT_COLOR), 
! 				big_font, "Sparx.");
! 			pw_text(draw_win,625, 110, 
! 				PIX_SRC|PIX_COLOR(TEXT_COLOR), 
! 				big_font, "Sparx.");
! 			Sleep(2);
  		    }
  		when SHOW_FUSE :
  		    /* after the pw_text, this moves into spiral death trap */
***************
*** 323,334 ****
  		    switch (time_left) {
  			when 230 :
  			    drawing = 0;
  			    pw_text(draw_win,
  				convert_x(pen_x - 7), convert_y(pen_y + 7),
! 				PIX_SRC, big_font, "The fuse.");
  			when 80 :
  			    pw_text(draw_win, 265, 445,
! 				PIX_SRC, big_font, "The Spiral Death Trap.");
  			case 200 : case 240 : case 40 : case 20 :
  			    moving = LEFT, drawing = 1;
  			when 110 : case  55 : case 30 : moving = RIGHT;
--- 336,351 ----
  		    switch (time_left) {
  			when 230 :
  			    drawing = 0;
+ 			    pw_putattributes(draw_win, &text_mask);
  			    pw_text(draw_win,
  				convert_x(pen_x - 7), convert_y(pen_y + 7),
! 				PIX_SRC|PIX_COLOR(TEXT_COLOR), 
! 				big_font, "The fuse.");
  			when 80 :
+ 			    pw_putattributes(draw_win, &text_mask);
  			    pw_text(draw_win, 265, 445,
! 				PIX_SRC|PIX_COLOR(TEXT_COLOR), 
! 				big_font, "The Spiral Death Trap.");
  			case 200 : case 240 : case 40 : case 20 :
  			    moving = LEFT, drawing = 1;
  			when 110 : case  55 : case 30 : moving = RIGHT;
***************
*** 342,348 ****
  			goto movit;
  		    } else if (region) {
  			move_fuse(fuse = NULL);
! 			rm_cur_line(PIX_SRC);
  		    }
  		when SHOW_POINTS : {
  		    char buf[5];
--- 359,365 ----
  			goto movit;
  		    } else if (region) {
  			move_fuse(fuse = NULL);
! 			rm_cur_line(PIX_SRC|PIX_COLOR(BORDER_COLOR));
  		    }
  		when SHOW_POINTS : {
  		    char buf[5];
***************
*** 358,371 ****
  			when 250 : case 130 : moving = RIGHT;
  			when 230 : case  90 : moving = DOWN;
  			when 210 : drawing = 0, moving = RIGHT;
  			    pw_text(draw_win,
  				convert_x(pen_x - 12), convert_y(pen_y - 25),
! 				PIX_SRC, big_font, sprintf(buf, "%d", score));
  			when 49 : /* make sure region is closed */
  			    msg("Use RIGHT mouse button to STOP movement.");
  			    pw_text(draw_win,
  				convert_x(pen_x - 12), convert_y(pen_y - 25),
! 				PIX_SRC, big_font, sprintf(buf, "%d", score));
  			when 15 : drawing = 0, moving = RIGHT;
  		    }
  		    goto movit; /* avoid moving qix and sparks */
--- 375,392 ----
  			when 250 : case 130 : moving = RIGHT;
  			when 230 : case  90 : moving = DOWN;
  			when 210 : drawing = 0, moving = RIGHT;
+ 			    pw_putattributes(draw_win, &text_mask);
  			    pw_text(draw_win,
  				convert_x(pen_x - 12), convert_y(pen_y - 25),
! 				PIX_SRC|PIX_COLOR(TEXT_COLOR), 
! 				big_font, sprintf(buf, "%d", score));
  			when 49 : /* make sure region is closed */
  			    msg("Use RIGHT mouse button to STOP movement.");
+ 			    pw_putattributes(draw_win, &text_mask);
  			    pw_text(draw_win,
  				convert_x(pen_x - 12), convert_y(pen_y - 25),
! 				PIX_SRC|PIX_COLOR(TEXT_COLOR), 
! 				big_font, sprintf(buf, "%d", score));
  			when 15 : drawing = 0, moving = RIGHT;
  		    }
  		    goto movit; /* avoid moving qix and sparks */
***************
*** 493,500 ****
  		board[pen_x][pen_y] |= CL_LN_DN;
  		board[x][y] |= CL_LN_UP;
  	}
  	draw(convert_x(x), convert_y(y),
! 	     convert_x(pen_x), convert_y(pen_y), PIX_SRC);
  	if (!region) {
  	    saved_edge = old_value;
  	    add_to_line(pen_x, pen_y);
--- 514,523 ----
  		board[pen_x][pen_y] |= CL_LN_DN;
  		board[x][y] |= CL_LN_UP;
  	}
+ 	pw_putattributes(draw_win, &border_mask);
  	draw(convert_x(x), convert_y(y),
! 	     convert_x(pen_x), convert_y(pen_y), 
! 	     PIX_SRC|PIX_COLOR(BORDER_COLOR));
  	if (!region) {
  	    saved_edge = old_value;
  	    add_to_line(pen_x, pen_y);
***************
*** 518,524 ****
  		    }
  		} else
  		    level++;
! 		sleep(3);
  		clear_board(); /* removes msgs also */
  		change_life(LIVE);
  		stop_timer();
--- 541,547 ----
  		    }
  		} else
  		    level++;
! 		Sleep(3);
  		clear_board(); /* removes msgs also */
  		change_life(LIVE);
  		stop_timer();
***************
*** 526,532 ****
  		    level++;
  		if (level == 0) {
  		    msg("Split the 2 qix to advance score multiplier.");
! 		    sleep(2);
  		    remove_msgs(0);
  		}
  		start_timer();
--- 549,555 ----
  		    level++;
  		if (level == 0) {
  		    msg("Split the 2 qix to advance score multiplier.");
! 		    Sleep(2);
  		    remove_msgs(0);
  		}
  		start_timer();
***************
*** 551,561 ****
  		     moving == UP? &joystick_up :
  		     moving == DOWN? &joystick_down :
  		     moving == STOP? &joystick_stop : &ready_icon;
      pw_rop(joystick_win,
! 	BOARD_WIDTH_IN_PIXELS/2-32, 2, 64, 64, PIX_SRC, image, 0,0);
!     pw_rop(joystick_win, 100,32, 16,23, PIX_SRC,
  	(drawing && fast)? &ms_fast_on : &ms_fast_off, 0, 0);
!     pw_rop(joystick_win, 150,32, 16,23, PIX_SRC,
  	(drawing && !fast)? &ms_slow_on : &ms_slow_off, 0, 0);
  }
  
--- 574,586 ----
  		     moving == UP? &joystick_up :
  		     moving == DOWN? &joystick_down :
  		     moving == STOP? &joystick_stop : &ready_icon;
+     pw_putattributes(joystick_win, &border_mask);
      pw_rop(joystick_win,
! 	BOARD_WIDTH_IN_PIXELS/2-32, 2, 64, 64, PIX_SRC|PIX_COLOR(BORDER_COLOR),
! 	image, 0,0);
!     pw_rop(joystick_win, 100,32, 16,23, PIX_SRC|PIX_COLOR(BORDER_COLOR),
  	(drawing && fast)? &ms_fast_on : &ms_fast_off, 0, 0);
!     pw_rop(joystick_win, 150,32, 16,23, PIX_SRC|PIX_COLOR(BORDER_COLOR),
  	(drawing && !fast)? &ms_slow_on : &ms_slow_off, 0, 0);
  }
  
*** OLD/main.c	Tue Jan 12 17:09:06 1988
--- main.c	Mon Mar  7 21:45:09 1988
***************
*** 3,12 ****
   * Appearance ONLY shamelessly stolen from the real video game wonderfully
   * and admirably written by individual(s) unknown at Taito Corp (I think).
   *
!  * Copyright 1987 by Dan Heller (island!argv@sun.com or argv@spam.istc.sri.com)
   *
   * Various polygon filling routines written by
!  *   -- Dan "Sky" Shultz (island!sky@sun.com)  and
   *   -- Don Hatch (splat%ucscb@ucscc.ucsc.edu [fall, 1987])
   *      additional help (general debugging, recursive polyfill)
   *
--- 3,14 ----
   * Appearance ONLY shamelessly stolen from the real video game wonderfully
   * and admirably written by individual(s) unknown at Taito Corp (I think).
   *
!  * Copyright 1987 by Dan Heller
!  *	island!argv@sun.com
!  *	dheller@dheller@ucbcory.berkeley.edu
   *
   * Various polygon filling routines written by
!  *   -- Dan "Sky" Shultz
   *   -- Don Hatch (splat%ucscb@ucscc.ucsc.edu [fall, 1987])
   *      additional help (general debugging, recursive polyfill)
   *
***************
*** 33,38 ****
--- 35,46 ----
  
  int (*old_repaint_func)();
  
+ int qix_mask 		= 0x7;
+ int text_mask 		= TEXT_COLOR;
+ int fast_draw_mask 	= FAST_DRAW_COLOR;
+ int slow_draw_mask 	= SLOW_DRAW_COLOR;
+ int border_mask    	= BORDER_COLOR;
+ int all_mask		= 0xff;
  
  redraw(args)
  {
***************
*** 51,57 ****
      (void) signal(SIGSEGV, catch);
      (void) signal(SIGXCPU, catch);
  
- #ifdef DEBUG
      /*
       * specify debug levels "-d level"
       * a level of 2 prints polygon fill info. 4 disables spark-generation
--- 59,64 ----
***************
*** 58,64 ****
       * but doesn't kill current sparks.  debug level 1 does prints things...
       */
      while (*++newargv)
! 	if (!strcmp(*newargv, "-q"))
  	    no_qix_kill = 1;
  	else if (!strcmp(*newargv, "-d"))
  	    debug = (*++newargv) ? atoi(*newargv) : 1;
--- 65,79 ----
       * but doesn't kill current sparks.  debug level 1 does prints things...
       */
      while (*++newargv)
! 	if (!strcmp(*newargv, "-s"))
! 	    if (!*++newargv)
! 		puts("usage: qix [-s timeout] (in milliseconds)"), exit(1);
! 	    else {
! 		if ((interval = atoi(*newargv)) < 15000 || interval > 60000)
! 		    puts("delay must be between 15000 and 60000"), exit(1);
! 	    }
! #ifdef DEBUG
! 	else if (!strcmp(*newargv, "-q"))
  	    no_qix_kill = 1;
  	else if (!strcmp(*newargv, "-d"))
  	    debug = (*++newargv) ? atoi(*newargv) : 1;
***************
*** 79,84 ****
--- 94,101 ----
  	0);
  
      draw_win = canvas_pixwin(Draw);
+     if (interval == 0)
+ 	interval = (draw_win->pw_pixrect->pr_depth == 8)? 35000 : 50000;
      window_set(Draw,
  	CANVAS_FAST_MONO, TRUE,
  	WIN_CONSUME_PICK_EVENTS,
***************
*** 99,104 ****
--- 116,165 ----
  	0);
      joystick_win = canvas_pixwin(Joystick);
  
+     /*
+      *	 set color map segment name and load color map
+      */
+     {
+ 	static char cmsname[CMS_NAMESIZE];
+ 	static char r[QIX_CMS_SIZE],g[QIX_CMS_SIZE],b[QIX_CMS_SIZE];
+ 
+ 	(void) strcpy(cmsname, QIX_CMS_NAME);
+ 	pw_setcmsname(draw_win, cmsname);
+ 	pw_setcmsname(joystick_win, cmsname);
+ 
+ 	/* blueish */
+ 	r[FAST_DRAW_COLOR] = 40;
+ 	g[FAST_DRAW_COLOR] = 170;
+ 	b[FAST_DRAW_COLOR] = 213;
+ 
+ 	/* brownish */
+ 	r[SLOW_DRAW_COLOR] = 213;
+ 	g[SLOW_DRAW_COLOR] = 170;
+ 	b[SLOW_DRAW_COLOR] = 0;
+ 
+ 	/* dark something */
+ 	r[TEXT_COLOR] = 0;
+ 	g[TEXT_COLOR] = 80;
+ 	b[TEXT_COLOR] = 190;
+ 
+ 	/* red sparks when not aggressive */
+ 	r[SPARKS_COLOR] = 255;
+ 	g[SPARKS_COLOR] = 0;
+ 	b[SPARKS_COLOR] = 0;
+ 
+ 	/* blue sparks when aggressive */
+ 	r[AGGR_SPARK_COLOR] = 0;
+ 	g[AGGR_SPARK_COLOR] = 0;
+ 	b[AGGR_SPARK_COLOR] = 255;
+ 
+ 	cms_rainbowsetup(&r[QIX_COLOR_BASE],
+ 			 &g[QIX_COLOR_BASE],
+ 			 &b[QIX_COLOR_BASE]);
+ 
+ 	pw_putcolormap(draw_win, 0, QIX_CMS_SIZE, r, g, b);
+ 	pw_putcolormap(joystick_win, 0, QIX_CMS_SIZE, r, g, b);
+     }
+ 
      window_fit(frame);
  
      if (!(small_font = pf_open("/usr/people/argv/computer.14")) &&
***************
*** 120,126 ****
      pw_text(joystick_win, 92, 24, PIX_SRC, small_font, "Fast  Slow");
      play_mode = SHOW_SCORES;
      update_score();
!     score_board(TRUE, FALSE);
      time_left = 100; /* timeout before next demo mode switch */
      (void) signal(SIGALRM, move_pen);
      old_repaint_func = (int(*)())window_get(frame, CANVAS_REPAINT_PROC);
--- 181,187 ----
      pw_text(joystick_win, 92, 24, PIX_SRC, small_font, "Fast  Slow");
      play_mode = SHOW_SCORES;
      update_score();
!     (void) score_board(TRUE, FALSE);
      time_left = 100; /* timeout before next demo mode switch */
      (void) signal(SIGALRM, move_pen);
      old_repaint_func = (int(*)())window_get(frame, CANVAS_REPAINT_PROC);
***************
*** 141,152 ****
      pen_x = (BOARD_WIDTH-1)/2, pen_y = BOARD_HEIGHT-1;
      remove_msgs(1);
  
      /* give left->right sweeping effect like the real game */
      for (x = 0; x < BOARD_WIDTH_IN_PIXELS; x++)
  	draw(x, 0, x, BOARD_HEIGHT_IN_PIXELS-1, PIX_CLR);
  
      box(convert_x(0), convert_y(0),
! 	convert_x(BOARD_WIDTH-1), convert_y(BOARD_HEIGHT-1), PIX_SRC);
  
      /* clear the interior of the board */
      for (x = 1; x < BOARD_WIDTH-1; x++)
--- 202,217 ----
      pen_x = (BOARD_WIDTH-1)/2, pen_y = BOARD_HEIGHT-1;
      remove_msgs(1);
  
+     pw_putattributes(draw_win, &all_mask);
+ 
      /* give left->right sweeping effect like the real game */
      for (x = 0; x < BOARD_WIDTH_IN_PIXELS; x++)
  	draw(x, 0, x, BOARD_HEIGHT_IN_PIXELS-1, PIX_CLR);
  
+     pw_putattributes(draw_win, &border_mask);
      box(convert_x(0), convert_y(0),
! 	convert_x(BOARD_WIDTH-1), convert_y(BOARD_HEIGHT-1), 
! 	PIX_SRC|PIX_COLOR(BORDER_COLOR));
  
      /* clear the interior of the board */
      for (x = 1; x < BOARD_WIDTH-1; x++)
***************
*** 194,200 ****
  		lives =  1;
  	    else
  		lives = MAX_LIVES;
! 	    clear_board(); /* resets pen_x, pen_y */
  	    level = -2, score = 0;
  	} else {
  	    extern int qix1_x0[], qix1_x1[], qix1_y0[], qix1_y1[];
--- 259,265 ----
  		lives =  1;
  	    else
  		lives = MAX_LIVES;
! 	    clear_board(); /* resets pen_x, pen_y (changes plane mask) */
  	    level = -2, score = 0;
  	} else {
  	    extern int qix1_x0[], qix1_x1[], qix1_y0[], qix1_y1[];
***************
*** 217,248 ****
  	drawing = FALSE;
  	if (level > 0) {
  	    msg("All scores now\n%d times\ntheir original value.", level+1);
! 	    sleep(3);
  	    remove_msgs(0);
  	}
  	place_pen(); /* make pen appear */
      }
  
      for (x = 0; x < 2; x++)
  	for (n = m; n >= 40 && n <= 300; n -= 5 * live_or_die)
  	    box(pen_coord_x(pen_x)-n/2, pen_coord_y(pen_y)-n/2,
! 		pen_coord_x(pen_x)+n/2, pen_coord_y(pen_y)+n/2, XOR);
  
      if (live_or_die == DIE) {
  	is_alive = FALSE;
  	if (--lives <= 0) {
  	    reset_joystick_win(TRUE);
  	    msg("Game Over.");
! 	    sleep(2);
  	    /* if he got on the scoreboard, let him put his initials up */
  	    if (play_mode == REAL_PLAY)
! 		score_board(FALSE, FALSE);
  	    if (play_mode == SHOW_SPIRAL)
  		time_left = 50; /* demo mode comes after spiral death trap */
  	    else {
- 		score_board(TRUE, FALSE);
  		play_mode = SHOW_SCORES;
! 		time_left = 100; /* show scores after demo mode or real play */
  	    }
  	    moving = NO_MOVE;
  	} else {
--- 282,318 ----
  	drawing = FALSE;
  	if (level > 0) {
  	    msg("All scores now\n%d times\ntheir original value.", level+1);
! 	    Sleep(3);
  	    remove_msgs(0);
  	}
  	place_pen(); /* make pen appear */
      }
  
+     pw_putattributes(draw_win, &border_mask);
      for (x = 0; x < 2; x++)
  	for (n = m; n >= 40 && n <= 300; n -= 5 * live_or_die)
  	    box(pen_coord_x(pen_x)-n/2, pen_coord_y(pen_y)-n/2,
! 		pen_coord_x(pen_x)+n/2, pen_coord_y(pen_y)+n/2, 
! 		XOR | PIX_COLOR(BORDER_COLOR));
  
      if (live_or_die == DIE) {
  	is_alive = FALSE;
  	if (--lives <= 0) {
+ 	    int do_scores = TRUE;
  	    reset_joystick_win(TRUE);
  	    msg("Game Over.");
! 	    Sleep(2);
  	    /* if he got on the scoreboard, let him put his initials up */
  	    if (play_mode == REAL_PLAY)
! 		do_scores = (score_board(FALSE, FALSE) == 0);
  	    if (play_mode == SHOW_SPIRAL)
  		time_left = 50; /* demo mode comes after spiral death trap */
  	    else {
  		play_mode = SHOW_SCORES;
! 		if (do_scores)
! 		    (void) score_board(TRUE, FALSE), time_left = 300;
! 		else
! 		    time_left = 100;
  	    }
  	    moving = NO_MOVE;
  	} else {
***************
*** 263,284 ****
      int x;
  
      sprintf(buf, "Score: %6d", score);
!     pw_text(joystick_win, 500, 22, PIX_SRC, big_font, buf);
!     pw_text(joystick_win, 500, 22, PIX_SRC|PIX_DST, big_font, buf);
  
      if (play_mode != REAL_PLAY) {
! 	pw_text(draw_win, 105, 12, PIX_SRC, small_font,
  	    "Click RIGHT mouse button or use <spacebar> to start new game.");
  	return;
      }
  
!     pw_text(joystick_win, 500, 45, PIX_SRC, big_font, "Lives: ");
      for (x = 0; x < MAX_LIVES; x++)
! 	pw_rop(joystick_win, 575+(x*20), 32, 16,16, (x < lives-1)?
! 	    PIX_SRC:PIX_CLR, &pen_image, 0, 0);
      sprintf(buf, "Filled: %d%%",(int)((double)area_closed/TOTAL_AREA*100));
!     pw_text(draw_win, 280, 12, PIX_SRC, small_font, buf);
!     pw_text(draw_win, 281, 12, PIX_SRC|PIX_DST, small_font, buf);
  }
  
  Pixrect *save[15];  /* area under text to be redisplayed upon removal of text */
--- 333,362 ----
      int x;
  
      sprintf(buf, "Score: %6d", score);
!     pw_putattributes(joystick_win, &text_mask);
!     pw_text(joystick_win, 500, 22, PIX_SRC|PIX_COLOR(TEXT_COLOR), 
! 	big_font, buf);
!     pw_text(joystick_win, 500, 22, PIX_SRC|PIX_DST|PIX_COLOR(TEXT_COLOR), 
! 	big_font, buf);
  
      if (play_mode != REAL_PLAY) {
! 	pw_text(draw_win, 105, 12, PIX_SRC|PIX_COLOR(TEXT_COLOR), small_font,
  	    "Click RIGHT mouse button or use <spacebar> to start new game.");
  	return;
      }
  
!     pw_text(joystick_win, 500, 45, PIX_SRC|PIX_COLOR(TEXT_COLOR), 
! 	    big_font, "Lives: ");
!     pw_putattributes(joystick_win, &border_mask);
      for (x = 0; x < MAX_LIVES; x++)
! 	pw_rop(joystick_win, 575+(x*20), 32, 16,16, ((x < lives-1)?
! 	    PIX_SRC:PIX_CLR)|PIX_COLOR(BORDER_COLOR), &pen_image, 0, 0);
! 
      sprintf(buf, "Filled: %d%%",(int)((double)area_closed/TOTAL_AREA*100));
!     pw_putattributes(draw_win, &text_mask);
!     pw_text(draw_win, 280, 12, PIX_SRC|PIX_COLOR(TEXT_COLOR), small_font, buf);
!     pw_text(draw_win, 281, 12, PIX_SRC|PIX_DST|PIX_COLOR(TEXT_COLOR), 
! 	small_font, buf);
  }
  
  Pixrect *save[15];  /* area under text to be redisplayed upon removal of text */
***************
*** 286,291 ****
--- 364,370 ----
  static int msgs;   /* the number of text lines displayed on the board */
  
  /* print a message somewhere at the top of the playing board for two seconds */
+ /*VARARGS1*/
  msg(fmt, args)
  char *fmt;
  {
***************
*** 298,303 ****
--- 377,383 ----
  #ifdef DEBUG
      puts(buf);
  #endif DEBUG
+     pw_putattributes(draw_win, &text_mask);
      do  {
  	if (p2 = index(p, '\n'))
  	    *p2 = 0;
***************
*** 313,321 ****
  	       draw_win->pw_prretained, x_pos[msgs], y_pos[msgs]);
  
  	pw_text(draw_win, x_pos[msgs], y_pos[msgs]+l_height(big_font)-5,
! 	    PIX_SRC, big_font, p);
  	pw_text(draw_win, x_pos[msgs]+1, y_pos[msgs]+l_height(big_font)-5,
! 	    PIX_SRC|PIX_DST, big_font, p);
      } while (++msgs < 15 && p2 && *(p = p2+1));
  }
  
--- 393,401 ----
  	       draw_win->pw_prretained, x_pos[msgs], y_pos[msgs]);
  
  	pw_text(draw_win, x_pos[msgs], y_pos[msgs]+l_height(big_font)-5,
! 	    PIX_SRC | PIX_COLOR(TEXT_COLOR), big_font, p);
  	pw_text(draw_win, x_pos[msgs]+1, y_pos[msgs]+l_height(big_font)-5,
! 	    PIX_SRC|PIX_DST | PIX_COLOR(TEXT_COLOR), big_font, p);
      } while (++msgs < 15 && p2 && *(p = p2+1));
  }
  
***************
*** 322,331 ****
  /* remove all messages from the board and put back the images underneith */
  remove_msgs(clearing)
  {
      while (msgs--) {
  	if (!clearing)
  	    pw_rop(draw_win, x_pos[msgs], y_pos[msgs], x_save[msgs],  y_save,
! 		PIX_SRC, save[msgs], 0, 0);
  	pr_destroy(save[msgs]);
      }
      msgs = 0;
--- 402,412 ----
  /* remove all messages from the board and put back the images underneith */
  remove_msgs(clearing)
  {
+     pw_putattributes(draw_win, &text_mask);
      while (msgs--) {
  	if (!clearing)
  	    pw_rop(draw_win, x_pos[msgs], y_pos[msgs], x_save[msgs],  y_save,
! 		PIX_SRC | PIX_COLOR(TEXT_COLOR), save[msgs], 0, 0);
  	pr_destroy(save[msgs]);
      }
      msgs = 0;
***************
*** 336,342 ****
      stop_timer();
      if (sig == SIGXCPU) {
  	msg("CPU timelimit exceeded.  Go home and eat dinner.");
! 	sleep(2);
  	remove_msgs(0);
  	return;
      }
--- 417,423 ----
      stop_timer();
      if (sig == SIGXCPU) {
  	msg("CPU timelimit exceeded.  Go home and eat dinner.");
! 	Sleep(2);
  	remove_msgs(0);
  	return;
      }
***************
*** 346,349 ****
--- 427,448 ----
      else
  	fprintf(stderr, "Bus Error\n");
      abort();
+ }
+ 
+ void
+ flush_events()
+ {
+     struct timeval dummy;
+     Event event;
+     int readfd = 1 << (int)window_get(Draw, WIN_FD);
+ 
+     timerclear(&dummy);
+     while (select(readfd+1, &readfd, 0, 0, &dummy) > 0)
+ 	window_read_event(Draw, &event);
+ }
+ 
+ Sleep(n)
+ {
+     sleep(n);
+     flush_events();
  }
*** OLD/qix.h	Wed Dec 23 17:50:58 1987
--- qix.h	Mon Mar  7 21:28:36 1988
***************
*** 19,28 ****
  #include <sys/time.h>
  #include <ctype.h>
  
  #define when 		break;case
  #define otherwise	break;default
  #define rrand		random
- #define SCOREFILE	"qix.scores"
  
  Frame		frame;
  Canvas		Draw, Joystick;
--- 19,48 ----
  #include <sys/time.h>
  #include <ctype.h>
  
+ #include <sunwindow/cms_rainbow.h>
+ 
+ /* qix uses 0..7 */
+ #define QIX_COLOR_BASE  0
+ #define TEXT_COLOR	8
+ #define SLOW_DRAW_COLOR 16
+ #define FAST_DRAW_COLOR 32
+ #define SPARKS_COLOR 	RED
+ #define AGGR_SPARK_COLOR 	BLUE
+ #define BORDER_COLOR 	128
+ 
+ #define QIX_CMS_SIZE	256
+ #define QIX_CMS_NAME	"QIX"
+ 
+ extern int text_mask;
+ extern int qix_mask;
+ extern int fast_draw_mask;
+ extern int slow_draw_mask;
+ extern int border_mask;
+ extern int all_mask;
+ 
  #define when 		break;case
  #define otherwise	break;default
  #define rrand		random
  
  Frame		frame;
  Canvas		Draw, Joystick;
***************
*** 44,51 ****
  
  struct itimerval timeout;
  
  #define start_timer()  \
!     timeout.it_value.tv_usec = 50000, setitimer(ITIMER_REAL, &timeout, NULL);
  #define stop_timer()  \
      timerclear(&timeout.it_value), setitimer(ITIMER_REAL, &timeout, NULL);
  
--- 64,72 ----
  
  struct itimerval timeout;
  
+ long interval; /* 50000 for monochrome or 35000 for color displays */
  #define start_timer()  \
!     timeout.it_value.tv_usec = interval, setitimer(ITIMER_REAL, &timeout, NULL);
  #define stop_timer()  \
      timerclear(&timeout.it_value), setitimer(ITIMER_REAL, &timeout, NULL);
  
***************
*** 105,113 ****
  extern Pixrect pen_image;
  
  /* place_pen() macro XOR's the pen at its current coordinates */
! #define place_pen()   pw_rop(draw_win, \
! 	    pen_coord_x(pen_x), pen_coord_y(pen_y), \
! 	    16, 16, XOR, &pen_image, 0, 0)
  
  #define XOR (PIX_SRC^PIX_DST)
  #define draw(x1,y1,x2,y2,OP) 	pw_vector(draw_win, x1,y1,x2,y2,(OP),1)
--- 126,136 ----
  extern Pixrect pen_image;
  
  /* place_pen() macro XOR's the pen at its current coordinates */
! #define place_pen() \
! 	    pw_putattributes(draw_win, &qix_mask), \
! 	    pw_rop(draw_win, \
! 		pen_coord_x(pen_x), pen_coord_y(pen_y), \
! 		16, 16, XOR|PIX_COLOR(VIOLET), &pen_image, 0, 0)
  
  #define XOR (PIX_SRC^PIX_DST)
  #define draw(x1,y1,x2,y2,OP) 	pw_vector(draw_win, x1,y1,x2,y2,(OP),1)
*** OLD/qmove.c	Mon Jan 11 14:53:04 1988
--- qmove.c	Mon Mar  7 21:41:38 1988
***************
*** 38,44 ****
      static index = 0, count;
      int i, j;
  
!     if (level < 0 && count++ & 1)
  	return 0;
  
      if (qix1_x0[index] <= 0)
--- 38,44 ----
      static index = 0, count;
      int i, j;
  
!     if (level < -1 && count++ & 1)
  	return 0;
  
      if (qix1_x0[index] <= 0)
***************
*** 87,97 ****
      i = (index + 1) % NLINES;
  
      /* erase old line */
      draw(convert_x(qix1_x0[i]), convert_y(qix1_y0[i]),
! 	 convert_x(qix1_x1[i]), convert_y(qix1_y1[i]), PIX_CLR);
      if (level > -1)
  	draw(convert_x(qix2_x0[i]), convert_y(qix2_y0[i]),
! 	     convert_x(qix2_x1[i]), convert_y(qix2_y1[i]), PIX_CLR);
  
      qix1_x0[i] = qix1_x0[index] + qix1_dx0;
      qix1_y0[i] = qix1_y0[index] + qix1_dy0;
--- 87,102 ----
      i = (index + 1) % NLINES;
  
      /* erase old line */
+     pw_putattributes(draw_win, &qix_mask);
      draw(convert_x(qix1_x0[i]), convert_y(qix1_y0[i]),
! 	 convert_x(qix1_x1[i]), convert_y(qix1_y1[i]), 
! 		PIX_CLR|PIX_COLOR((index % CMS_RAINBOWSIZE) + 
! 		QIX_COLOR_BASE));
      if (level > -1)
  	draw(convert_x(qix2_x0[i]), convert_y(qix2_y0[i]),
! 	     convert_x(qix2_x1[i]), convert_y(qix2_y1[i]), 
! 		PIX_CLR|PIX_COLOR((index % CMS_RAINBOWSIZE) + 
! 		QIX_COLOR_BASE));
  
      qix1_x0[i] = qix1_x0[index] + qix1_dx0;
      qix1_y0[i] = qix1_y0[index] + qix1_dy0;
***************
*** 107,116 ****
      index = i;
  
      draw(convert_x(qix1_x0[i]), convert_y(qix1_y0[i]),
! 	 convert_x(qix1_x1[i]), convert_y(qix1_y1[i]), PIX_SRC);
      if (level > -1)
  	draw(convert_x(qix2_x0[i]), convert_y(qix2_y0[i]),
! 	     convert_x(qix2_x1[i]), convert_y(qix2_y1[i]), PIX_SRC);
      return j;
  }
  
--- 112,125 ----
      index = i;
  
      draw(convert_x(qix1_x0[i]), convert_y(qix1_y0[i]),
! 	 convert_x(qix1_x1[i]), convert_y(qix1_y1[i]), 
! 	 PIX_SRC|PIX_COLOR((index % CMS_RAINBOWSIZE) + 
! 	 QIX_COLOR_BASE));
      if (level > -1)
  	draw(convert_x(qix2_x0[i]), convert_y(qix2_y0[i]),
! 	     convert_x(qix2_x1[i]), convert_y(qix2_y1[i]), 
! 	     PIX_SRC|PIX_COLOR((index % CMS_RAINBOWSIZE) + 
! 	     QIX_COLOR_BASE));
      return j;
  }
  
***************
*** 125,134 ****
      if (!(rrand() % 10)) {
  	register int r;
  	/* move at least one space, but not greater than "Speed" */
! 	*dx0 = (1 + (r = rrand())%(Speed-1)) * ((r&1) ? -1 : 1);
! 	*dy0 = (1 + (r = rrand())%(Speed-1)) * ((r&1) ? -1 : 1);
! 	*dx1 = (1 + (r = rrand())%(Speed-1)) * ((r&1) ? -1 : 1);
! 	*dy1 = (1 + (r = rrand())%(Speed-1)) * ((r&1) ? -1 : 1);
  	/* check that qix is moving towards player */
  	if (level > -2 && !(rrand() % (6 - level))) {
  	    if (pen_x - x0 > 0 && *dx0 < 0)
--- 134,147 ----
      if (!(rrand() % 10)) {
  	register int r;
  	/* move at least one space, but not greater than "Speed" */
! 	r = rrand();
! 	*dx0 = (1 + r%(Speed-1)) * ((r&1) ? -1 : 1);
! 	r = rrand();
! 	*dy0 = (1 + r%(Speed-1)) * ((r&1) ? -1 : 1);
! 	r = rrand();
! 	*dx1 = (1 + r%(Speed-1)) * ((r&1) ? -1 : 1);
! 	r = rrand();
! 	*dy1 = (1 + r%(Speed-1)) * ((r&1) ? -1 : 1);
  	/* check that qix is moving towards player */
  	if (level > -2 && !(rrand() % (6 - level))) {
  	    if (pen_x - x0 > 0 && *dx0 < 0)
***************
*** 180,186 ****
  	if (!(++loop_count % 100)) {
  #ifdef DEBUG
  	    msg("bad news... loop count hit %d", loop_count);
! 	    sleep(2);
  	    remove_msgs(0);
  #endif DEBUG
  	    break;
--- 193,199 ----
  	if (!(++loop_count % 100)) {
  #ifdef DEBUG
  	    msg("bad news... loop count hit %d", loop_count);
! 	    Sleep(2);
  	    remove_msgs(0);
  #endif DEBUG
  	    break;
***************
*** 235,241 ****
  	    return 0;
  	}
      msg("The qix is trapped in a place it shouldn't have gotten to!");
!     sleep(2);
      remove_msgs(0);
      return -1;
  }
--- 248,254 ----
  	    return 0;
  	}
      msg("The qix is trapped in a place it shouldn't have gotten to!");
!     Sleep(2);
      remove_msgs(0);
      return -1;
  }
*** OLD/regions.c	Mon Dec 21 22:15:46 1987
--- regions.c	Mon Mar  7 21:41:47 1988
***************
*** 62,69 ****
  	return -1;
      if (level > -1 && edge != n) {
  	msg("You split the two qix!");
! 	sleep(2);
! 	rm_cur_line(PIX_SRC); /* don't erase it, but free it up */
  	moving = STOP;
  	return 1;
      }
--- 62,70 ----
  	return -1;
      if (level > -1 && edge != n) {
  	msg("You split the two qix!");
! 	Sleep(2);
! 	/* don't erase it, but free it up */
! 	rm_cur_line(PIX_SRC|PIX_COLOR(BORDER_COLOR)); 
  	moving = STOP;
  	return 1;
      }
***************
*** 108,114 ****
  	    msg("can't fill region; over 10000 positions");
  	    pen_x = region->x, pen_y = region->y;
  	    msg("removing bad line ...(takes a while)");
! 	    rm_cur_line(XOR); /* causes dotted line effect */
  	    remove_msgs(0);
  	    return -1;
  	}
--- 109,116 ----
  	    msg("can't fill region; over 10000 positions");
  	    pen_x = region->x, pen_y = region->y;
  	    msg("removing bad line ...(takes a while)");
! 	    /* causes dotted line effect */
! 	    rm_cur_line(XOR|PIX_COLOR(BORDER_COLOR)); 
  	    remove_msgs(0);
  	    return -1;
  	}
***************
*** 258,265 ****
  #endif
  
      toggle_sparks();
!     pw_polygon_2(draw_win, 0,0,1, npts, new_area, PIX_SRC | PIX_DST,
! 	fast? &fast_grey : &slow_grey,0,0);
      toggle_sparks();
  
      free(new_area);
--- 260,270 ----
  #endif
  
      toggle_sparks();
!     pw_putattributes(draw_win, fast ? &fast_draw_mask: &slow_draw_mask);
!     pw_polygon_2(draw_win, 0,0,1, npts, new_area, 
! 	PIX_SRC | PIX_DST | PIX_COLOR(fast ? FAST_DRAW_COLOR: SLOW_DRAW_COLOR),
! 	draw_win->pw_pixrect->pr_depth == 8? NULL :
! 	fast? &fast_grey : &slow_grey, 0, 0);
      toggle_sparks();
  
      free(new_area);
***************
*** 278,284 ****
  	(moving == RIGHT)? "right" : "left",
  	(edge == UP)? "up" : (edge == DOWN)? "down" :
  	(edge == RIGHT)? "right" : "left");
!     sleep(2);
      remove_msgs(0);
  }
  #endif DEBUG
--- 283,289 ----
  	(moving == RIGHT)? "right" : "left",
  	(edge == UP)? "up" : (edge == DOWN)? "down" :
  	(edge == RIGHT)? "right" : "left");
!     Sleep(2);
      remove_msgs(0);
  }
  #endif DEBUG
***************
*** 285,290 ****
--- 290,296 ----
  
  rm_cur_line(op)
  {
+     pw_putattributes(draw_win, &border_mask);
      if (region)
  	board[region->x][region->y] = saved_edge;
      while (cur_coord)
*** OLD/score.c	Wed Dec 23 17:47:03 1987
--- score.c	Mon Mar  7 21:42:04 1988
***************
*** 15,20 ****
--- 15,21 ----
  extern char *sys_errlist[];
  extern char *sprintf();
  
+ /* returns whether the score file can be accessed */
  score_board(Read, names)
  {
      struct scores *scp, *temp;
***************
*** 34,46 ****
  #endif DEBUG
      }
  
!     /* read the top ten file into the array and close the file */
!     if ((fd = open(SCOREFILE, O_RDWR)) == -1 ||
  	read(fd, (char *) top_ten, sizeof(top_ten)) == -1) {
  	msg("No score file:\n%s", sys_errlist[errno]);
! 	sleep(2);
  	remove_msgs(0);
! 	return;
      }
  
      /* Print the list */
--- 35,50 ----
  #endif DEBUG
      }
  
!     /* read the top ten file into the array and close the file. If it doesn't
!      * open for read/write, it probably doesn't exit -- create it rw for all.
!      */
!     if ((fd = open(SCOREFILE, O_RDWR)) == -1 &&
! 	(Read || (fd = open(SCOREFILE, O_WRONLY, 0666))) ||
  	read(fd, (char *) top_ten, sizeof(top_ten)) == -1) {
  	msg("No score file:\n%s", sys_errlist[errno]);
! 	Sleep(2);
  	remove_msgs(0);
! 	return -1;
      }
  
      /* Print the list */
***************
*** 75,80 ****
--- 79,85 ----
  	}
      }
      (void) close(fd);
+     return 0;
  }
  
  char *
***************
*** 102,114 ****
      msg("MIDDLE button to decrement one character.\n");
      msg("Use RETURN or RIGHT button to enter each letter.");
      msg("Use <backspace> key to go back one position.");
!     pw_text(draw_win, x, y, PIX_SRC, big_font, sprintf(s, "%d", score));
      x += 25 * l_width(big_font);
      (void) strcpy(buf, "AAA");
  
      for (len = 0; len < 3;) {
! 	pw_text(draw_win, x - len*l_width(big_font), y, PIX_SRC, big_font, buf);
! 	pw_char(draw_win, x, y, PIX_SRC|PIX_DST, big_font, '_');
  
  	do window_read_event(Draw, &event);
  	while (event.ie_code == LOC_MOVE || event.ie_code == LOC_DRAG ||
--- 107,122 ----
      msg("MIDDLE button to decrement one character.\n");
      msg("Use RETURN or RIGHT button to enter each letter.");
      msg("Use <backspace> key to go back one position.");
!     pw_text(draw_win, x, y, PIX_SRC|PIX_COLOR(TEXT_COLOR), big_font,
! 	    sprintf(s, "%d", score));
      x += 25 * l_width(big_font);
      (void) strcpy(buf, "AAA");
  
      for (len = 0; len < 3;) {
! 	pw_text(draw_win, x - len*l_width(big_font), y, 
! 		PIX_SRC|PIX_COLOR(TEXT_COLOR), big_font, buf);
! 	pw_char(draw_win, x, y, PIX_SRC|PIX_DST|PIX_COLOR(TEXT_COLOR), 
! 		big_font, '_');
  
  	do window_read_event(Draw, &event);
  	while (event.ie_code == LOC_MOVE || event.ie_code == LOC_DRAG ||
*** OLD/sparks.c	Mon Sep  7 18:55:05 1987
--- sparks.c	Mon Mar  7 21:42:25 1988
***************
*** 35,43 ****
   * move left-right or up-down the formula given finds which icon to use to
   * to guarantee that it's not the last one used.
   */
! #define draw_spark(x, y) 	\
      pw_rop(draw_win, pen_coord_x(x), pen_coord_y(y), 16,16, \
! 	XOR, spark_icons[(x + y) & 3], 0,0)
  
  struct spark {
      int x, y, oldx, oldy;
--- 35,43 ----
   * move left-right or up-down the formula given finds which icon to use to
   * to guarantee that it's not the last one used.
   */
! #define draw_spark(x, y, color) 	\
      pw_rop(draw_win, pen_coord_x(x), pen_coord_y(y), 16,16, \
! 	XOR| PIX_COLOR(color), spark_icons[(x + y) & 3], 0,0)
  
  struct spark {
      int x, y, oldx, oldy;
***************
*** 107,112 ****
--- 107,113 ----
      register int x, y, sp, move_clockwise, came_from, dir;
      /* new spark x and y coord */
  
+     pw_putattributes(draw_win, &qix_mask);
      for (sp = 0; sp < MAX_SPARKS; sp++) {
  	if (sparks[sp].x < 0)
  	    break;
***************
*** 115,125 ****
  	 * duced in pairs, the second spark will have the same coords and
  	 * erase this mark. (clever, huh?)
  	 */
! 	draw_spark(sparks[sp].x, sparks[sp].y);
  	x = sparks[sp].x, y = sparks[sp].y;
  	/* user bit the big one */
  	if (x == pen_x && y == pen_y) {
! 	    draw_spark(sparks[sp].x, sparks[sp].y); /* redraw the spark */
  	    change_life(DIE);
  	    return -1;
  	}
--- 116,128 ----
  	 * duced in pairs, the second spark will have the same coords and
  	 * erase this mark. (clever, huh?)
  	 */
! 	draw_spark(sparks[sp].x, sparks[sp].y,
! 		   aggressive? AGGR_SPARK_COLOR : SPARKS_COLOR);
  	x = sparks[sp].x, y = sparks[sp].y;
  	/* user bit the big one */
  	if (x == pen_x && y == pen_y) {
! 	    draw_spark(sparks[sp].x, sparks[sp].y,
! 		   aggressive? AGGR_SPARK_COLOR : SPARKS_COLOR);
  	    change_life(DIE);
  	    return -1;
  	}
***************
*** 157,163 ****
  		box(convert_x(x)-10, convert_y(y)-10,
  		    convert_x(x)+10, convert_y(y)+10, XOR);
  		msg("HALT! infinite-loop police! [y] (%d, %d)", x, y);
! 		sleep(2);
  		remove_msgs(0);
  		box(convert_x(x)-10, convert_y(y)-10,
  		    convert_x(x)+10, convert_y(y)+10, XOR);
--- 160,166 ----
  		box(convert_x(x)-10, convert_y(y)-10,
  		    convert_x(x)+10, convert_y(y)+10, XOR);
  		msg("HALT! infinite-loop police! [y] (%d, %d)", x, y);
! 		Sleep(2);
  		remove_msgs(0);
  		box(convert_x(x)-10, convert_y(y)-10,
  		    convert_x(x)+10, convert_y(y)+10, XOR);
***************
*** 182,188 ****
  
  	sparks[sp].oldx = sparks[sp].x, sparks[sp].oldy = sparks[sp].y;
  	/* draw the new spark */
! 	draw_spark(x, y);
  	sparks[sp].x = x, sparks[sp].y = y;
  
  	if (x == pen_x && y == pen_y) {
--- 185,191 ----
  
  	sparks[sp].oldx = sparks[sp].x, sparks[sp].oldy = sparks[sp].y;
  	/* draw the new spark */
! 	draw_spark(x, y, aggressive? AGGR_SPARK_COLOR : SPARKS_COLOR);
  	sparks[sp].x = x, sparks[sp].y = y;
  
  	if (x == pen_x && y == pen_y) {
***************
*** 198,214 ****
  		/* give the only warning we can without a sound chip :-) */
  		fputc(7, stderr), fflush(stderr);
  		msg("Sparx are now aggressive.");
! 		sleep(2);
  		remove_msgs(0);
  		aggressive = 1;
  	    }
! 	    if (sp == MAX_SPARKS)
  		return 0; /* no sparks left to start, so don't do a countdown */
  	}
! 	start_spark(BOARD_WIDTH/2, 0, TRUE);
! 	start_spark(BOARD_WIDTH/2, 0, FALSE);
! 	draw(BORDER, 20, BOARD_WIDTH_IN_PIXELS-BORDER, 20, PIX_SRC);
! 	draw(BORDER, 21, BOARD_WIDTH_IN_PIXELS-BORDER, 21, PIX_SRC);
      }
      if (sp < MAX_SPARKS) {
  	/* calculate the percentage of the width of the board in pixels */
--- 201,224 ----
  		/* give the only warning we can without a sound chip :-) */
  		fputc(7, stderr), fflush(stderr);
  		msg("Sparx are now aggressive.");
! 		Sleep(2);
  		remove_msgs(0);
+ 		/* erase red sparks now or blue sparks will leave green */
+ 		toggle_sparks();
  		aggressive = 1;
+ 		/* now draw blue sparks */
+ 		toggle_sparks();
  	    }
! 	    if (sp == MAX_SPARKS) {
  		return 0; /* no sparks left to start, so don't do a countdown */
+ 	    }
  	}
! 	start_spark(BOARD_WIDTH/2, 0);
! 	start_spark(BOARD_WIDTH/2, 0);
! 	draw(BORDER, 20, BOARD_WIDTH_IN_PIXELS-BORDER, 20, 
! 		PIX_SRC|PIX_COLOR(SPARKS_COLOR));
! 	draw(BORDER, 21, BOARD_WIDTH_IN_PIXELS-BORDER, 21, 
! 		PIX_SRC|PIX_COLOR(SPARKS_COLOR));
      }
      if (sp < MAX_SPARKS) {
  	/* calculate the percentage of the width of the board in pixels */
***************
*** 236,248 ****
      static x = -1, y;
      int n;
  
      if (x > -1)
! 	draw_spark(x, y);
      if (!pos || !*pos) {
  	x = -1;
  	return 0;
      }
!     draw_spark((*pos)->x, (*pos)->y);
      x = (*pos)->x, y = (*pos)->y;
  
      if ((*pos)->x == pen_x && (*pos)->y == pen_y) {
--- 246,260 ----
      static x = -1, y;
      int n;
  
+     /* fuse is always red */
+     pw_putattributes(draw_win, &qix_mask);
      if (x > -1)
! 	draw_spark(x, y, SPARKS_COLOR);
      if (!pos || !*pos) {
  	x = -1;
  	return 0;
      }
!     draw_spark((*pos)->x, (*pos)->y, SPARKS_COLOR);
      x = (*pos)->x, y = (*pos)->y;
  
      if ((*pos)->x == pen_x && (*pos)->y == pen_y) {
***************
*** 263,272 ****
  {
      int n;
  
      /* for each spark, if active, make it go away and reset to -1 */
      for (n = 0; n < MAX_SPARKS; n++)
  	if (sparks[n].x > -1) {
! 	    draw_spark(sparks[n].x, sparks[n].y);
  	    sparks[n].oldx = sparks[n].x = -1;
  	}
      draw(BORDER, 20, BOARD_WIDTH_IN_PIXELS-BORDER, 20, PIX_CLR);
--- 275,286 ----
  {
      int n;
  
+     pw_putattributes(draw_win, &qix_mask);
      /* for each spark, if active, make it go away and reset to -1 */
      for (n = 0; n < MAX_SPARKS; n++)
  	if (sparks[n].x > -1) {
! 	    draw_spark(sparks[n].x, sparks[n].y,
! 			aggressive? AGGR_SPARK_COLOR : SPARKS_COLOR);
  	    sparks[n].oldx = sparks[n].x = -1;
  	}
      draw(BORDER, 20, BOARD_WIDTH_IN_PIXELS-BORDER, 20, PIX_CLR);
***************
*** 282,290 ****
  {
      register int sp;
  
      for (sp = 0; sp < MAX_SPARKS; sp++) {
  	if (sparks[sp].x < 0)
  	    break;
! 	draw_spark(sparks[sp].x, sparks[sp].y);
      }
  }
--- 296,306 ----
  {
      register int sp;
  
+     pw_putattributes(draw_win, &qix_mask);
      for (sp = 0; sp < MAX_SPARKS; sp++) {
  	if (sparks[sp].x < 0)
  	    break;
! 	draw_spark(sparks[sp].x, sparks[sp].y,
! 	    aggressive? AGGR_SPARK_COLOR : SPARKS_COLOR);
      }
  }