[comp.sources.games] v11i022: sunbots - robots/Daleks game for SunView, Part01/03

billr@saab.CNA.TEK.COM (Bill Randle) (08/11/90)

Submitted-by: Kevin Wright <kevin@altair.csustan.edu>
Posting-number: Volume 11, Issue 22
Archive-name: sunbots/Part01

	[I ran this on my 3/60 (OS 3.5) with no problems.  -br]

[[This is a version of robots for sunview.  It has a lot of the
flavor of Daleks for the Mac.]]

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 1 (of 3)."
# Contents:  README MANIFEST level.c pics pics/human_d8.pic proc.c
#   sunbots.c sunbots.h
# Wrapped by billr@saab on Fri Aug 10 10:47:55 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'README' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'README'\"
else
echo shar: Extracting \"'README'\" \(1401 characters\)
sed "s/^X//" >'README' <<'END_OF_FILE'
XSunbots:
X
XSunbots is a sunview version of Robots.  It also has additions that
Xmake it resemble Daleks for the Mac.
X
XThe program should compile up easily enough.  Just type make and it
Xshould do the rest.  You can edit the Makefile to tell it a few things
Xlike where to install the game, etc.
X
XI don't know of any bugs in the program, of course there always could
Xbe some.  There are a few things that could be done:
X
X	1) The filer option for saving and loading is not implemented.
X	   It probably wouldn't be hard at all to add this.
X	2) The gems that appear on later levels should probably be
X	   renamed and redrawn to be Jelly Babies to fit the Dr. Who
X	   look of things more.
X	3) My method of attempting to assure mutually exclusive access
X	   to the high score file during updates is a bit crude and could
X	   be fixed.
X
XPeople around our site seem to be content with the game as it is.  It is
Xa mild diversion for when you are tired of doing work.
X
XAnyone can do anything they want with this code.  If anyone makes improvements
Xor modifications to the program, it would be nice if you could send me a
Xcopy of your changes so that I can take a look.
X
XHave Fun!
X
X			Kevin Wright
X
XE-mail : kevin@altair.csustan.edu or kevin@csustan.csustan.edu
XUS-mail: California State University, Stanislaus
X	 Computer Science Department
X	 801 West Monte Vista Avenue
X	 Turlock, CA 95380
XPhone  : (209) 667-3273
END_OF_FILE
if test 1401 -ne `wc -c <'README'`; then
    echo shar: \"'README'\" unpacked with wrong size!
fi
# end of 'README'
fi
if test -f 'MANIFEST' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'MANIFEST'\"
else
echo shar: Extracting \"'MANIFEST'\" \(1212 characters\)
sed "s/^X//" >'MANIFEST' <<'END_OF_FILE'
X   File Name		Archive #	Description
X-----------------------------------------------------------
X MANIFEST                   1	
X Makefile                   2	
X README                     1	
X images.c                   2	
X images.h                   2	
X level.c                    1	
X move.c                     2	
X pics                       1	
X pics/debug.pic             2	
X pics/filer.pic             2	
X pics/gem.pic               3	
X pics/human2.pic            2	
X pics/human_d1.pic          2	
X pics/human_d8.pic          1	
X pics/icon.pic              2	
X pics/live.pic              2	
X pics/quit.pic              2	
X pics/reset.pic             2	
X pics/robot.pic             3	
X pics/robot2.pic            2	
X pics/scores.pic            2	
X pics/sonic.pic             2	
X pics/stand.pic             2	
X pics/tardis.pic            2	
X pics/teleport1.pic         2	
X pics/teleport2.pic         2	
X pics/tomb.pic              2	
X pics/trash.pic             3	
X pics/zap1.pic              3	
X pics/zap2.pic              3	
X pics/zap3.pic              3	
X pics/zap4.pic              2	
X proc.c                     1	
X sunbots.c                  1	
X sunbots.h                  1	
X sunbots.man                2	
END_OF_FILE
if test 1212 -ne `wc -c <'MANIFEST'`; then
    echo shar: \"'MANIFEST'\" unpacked with wrong size!
fi
# end of 'MANIFEST'
fi
if test -f 'level.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'level.c'\"
else
echo shar: Extracting \"'level.c'\" \(9776 characters\)
sed "s/^X//" >'level.c' <<'END_OF_FILE'
X/*****************************************************************
X *
X *	level.c	-	Level creation and manipulation routines
X *
X *	Created -- 1/5/90	Kevin Wright
X *
X *****************************************************************/
X
X#include "sunbots.h"	/* Robots header file */
X
X/*****************************************************************
X *	make_level()	-	Create a new level.  Delete all
X *				existing robots and create a new
X *				set of them.  Reset screwdriver
X *				and place all objects.
X *****************************************************************/
X
Xmake_level()
X{
X	ScreenItem temp;	/* Temp pointer to robot list */
X
X	/* Destroy old and create new robots */
X	destroy_robots();
X	create_robots();
X
X	/* Create gems if level is right */
X	if(current_level >= 10)
X		create_gems();
X
X	/* Reset screwdriver */
X	screwdriver_uses = 1;
X
X	/* Reset last stand */
X	last_stand_set = FALSE;
X
X	/* Display level message */
X	switch(current_level) {
X		case 1:
X			display_msg("Welcome to Sunbots!", 2);
X			break;
X		case 5:
X			display_msg("Double Speed Robots", 2);
X			break;
X		case 10:
X			display_msg("Grab Gems For Extra Points!", 2);
X			break;
X		default:
X			break;
X	}
X
X	/* Place human */
X	human->oldrow = human->oldcol = -1;
X	find_empty(human, &(human->row), (&human->col));
X	place_item(human, -1, -1);
X
X	/* Place robots and gems */
X	for(temp = robot_list; temp; temp = temp->next) {
X		temp->oldrow = temp->oldcol = -1;
X		find_empty(temp, &(temp->row), &(temp->col));
X		place_item(temp, 0, 0);
X	}
X}
X
X
X/*****************************************************************
X *	remove_robots()		-	Remove robots in the
X *					specified rectangle.
X *****************************************************************/
X
Xremove_robots(x0, y0, x1, y1, mode, score)
Xint x0, y0, x1, y1, mode, score;
X{
X	ScreenItem temp;	/* Temp pointer to robot list */
X
X	temp = robot_list;
X	while(temp) {
X		if(temp->row >= y0 && temp->row <= y1 &&
X		   temp->col >= x0 && temp->col <= x1)
X			if(mode == ALL_STATES ||
X			   (mode == LIVE_STATE && !temp->dead) ||
X			   (mode == DEAD_STATE && temp->dead)) {
X				if(score && !temp->dead)
X					if(temp->type == SPEEDER_ROBOT)
X						update_score(10);
X					else
X						update_score(5);
X				remove_item(temp);
X			   }
X
X		temp = temp->next;
X	}
X}
X
X
X/*****************************************************************
X *	destroy_robots()	-	Destroy all robots in the
X *					list.
X *****************************************************************/
X
Xdestroy_robots()
X{
X	ScreenItem temp;	/* Temp pointer to robot list */
X
X	/* Traverse list and destroy each item */
X	while(robot_list) {
X		temp = robot_list;
X		robot_list = robot_list->next;
X		destroy_item(temp);
X	}
X
X	/* Clear the playfield */
X	pw_rop(playfield_pw, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT,
X		PIX_CLR, NULL, 0, 0);
X}
X
X
X/*****************************************************************
X *	remove_item()	-	Remove an item from the robot_list.
X *****************************************************************/
X
Xremove_item(item)
XScreenItem item;
X{
X	ScreenItem temp;	/* Temp pointer to robot list */
X
X	/* If item is first, then redirect main pointer */
X	if(robot_list == item) {
X		robot_list = robot_list->next;
X		destroy_item(item);
X	}
X
X	/* Traverse list and find item to remove */
X	temp = robot_list;
X	while(temp) {
X		if(temp->next == item) {
X			temp->next = temp->next->next;
X			destroy_item(item);
X		}
X		temp = temp->next;
X	}
X}
X
X
X/*****************************************************************
X *	destroy_item()		-	Destroy a panel and free
X *					an item structure.
X *****************************************************************/
X
Xdestroy_item(item)
XScreenItem item;
X{
X		/* Free memory */
X		free(item);
X}
X
X
X/*****************************************************************
X *	create_robots()	-	Create a list of robots.  The number
X *				is based on the current level.
X *****************************************************************/
X
Xcreate_robots()
X{
X	int i;			/* Loop variable */
X	int robot_num;		/* Number of robots on this level */
X	Image image_type;	/* Type of robot image */
X	ScreenItem temp;	/* Temp pointer to robots */
X
X	robot_num = (current_level < 12 ? 10 * current_level : 120);
X
X	/* Create item structures and panels for robots */
X	for(i = 0; i < robot_num; i++) {
X		temp = (ScreenItem) malloc(sizeof(struct screen_item));
X
X		if(current_level>=SPEEDER_LEVEL && RND(100)<SPEEDER_CHANCE) {
X			temp->type = SPEEDER_ROBOT;
X			image_type = robot2_image;
X		} else {
X			temp->type = NORMAL_ROBOT;
X			image_type = robot_image;
X		}
X
X		temp->image = image_type;
X		temp->dead  = FALSE;
X		temp->next  = robot_list;
X		robot_list  = temp;
X	}
X}
X
X
X/*****************************************************************
X *	create_gems()
X *****************************************************************/
X
Xcreate_gems()
X{
X	int i;			/* Loop variable */
X	int gem_num;		/* Number of gems on this level */
X	ScreenItem temp;	/* Temp pointer to gems */
X
X	gem_num = (current_level < 15 ? 4 * (current_level - 9) : 20);
X
X	/* Create item structures and panels for gems */
X	for(i = 0; i < gem_num; i++) {
X		temp = (ScreenItem) malloc(sizeof(struct screen_item));
X		temp->type = GEM;
X		temp->image = gem_image;
X		temp->dead = TRUE;
X		temp->next = robot_list;
X		robot_list = temp;
X	}
X}
X
X
X/*****************************************************************
X *	find_empty()	-	Find a random empty location on the
X *				screen.
X *****************************************************************/
X
Xfind_empty(item, row, col)
XScreenItem item;
Xint *row, *col;
X{
X	ScreenItem temp;	/* Temp pointer to robot list */
X	int found = TRUE;	/* Flag indicating collision found */
X
X	/* Find that spot */
X	while(found) {
X		*row = (rand() >> 3) % 40;
X		*col = (rand() >> 3) % 40;
X		found = (
Xoccupied(item, *row, *col) != NULL);
X	}
X}
X
X
X/*****************************************************************
X *	occupied()	-	Check for occupation of square.
X *****************************************************************/
X
XScreenItem occupied(item, row, col)
XScreenItem item;
Xint row, col;
X{
X	ScreenItem temp;
X
X	if(item != human && human->row == row && human->col == col)
X		return(human);
X
X	temp = robot_list;
X	while(temp) {
X		if(item != temp && temp->row == row && temp->col == col)
X			return(temp);
X		temp = temp->next;
X	}
X
X	return(NULL);
X}
X
X/*****************************************************************
X *	place_item()	-	Set the row/col values for an item
X *				and redisplay.
X *****************************************************************/
X
Xplace_item(item, xoffset, yoffset)
XScreenItem item;
Xint xoffset, yoffset;
X{
X	int row, col, oldrow, oldcol;
X
X	/* Calculate pixel offsets */
X	oldrow = ROW_HEIGHT * (item->oldrow + yoffset);
X	oldcol = COL_WIDTH * (item->oldcol + xoffset);
X	row = ROW_HEIGHT * (item->row + yoffset);
X	col = COL_WIDTH  * (item->col + xoffset);
X
X	/* Clear old picture and place new picture */
X	pw_rop(playfield_pw, oldcol, oldrow, item->image->width,
X		item->image->height, PIX_CLR, NULL, 0, 0);
X	pw_rop(playfield_pw, col, row, item->image->width,
X		item->image->height, PIX_SRC, item->image->picture, 0, 0);
X}
X
X
X/*****************************************************************
X *	set_image()	-	Change the image of the specified
X *				item.
X *****************************************************************/
X
Xset_image(item, newimage, xoffset, yoffset)
XScreenItem item;
XImage newimage;
Xint xoffset, yoffset;
X{
X	int row, col;
X
X	/* Calculate pixel offsets */
X	row = ROW_HEIGHT * (item->row + yoffset);
X	col = COL_WIDTH  * (item->col + xoffset);
X
X	/* Clear old picture and place new picture */
X	pw_rop(playfield_pw, col, row, item->image->width,
X		item->image->height, PIX_CLR, NULL, 0, 0);
X	pw_rop(playfield_pw, col, row, item->image->width,
X		item->image->height, PIX_SRC, newimage->picture, 0, 0);
X
X	item->image = newimage;
X}
X
X
X/*****************************************************************
X *	refresh_image()	-	Redraw the picture for an item.
X *****************************************************************/
X
Xrefresh_image(item, xoffset, yoffset)
XScreenItem item;
Xint xoffset, yoffset;
X{
X	int row, col;
X
X	/* Calculate pixel offsets */
X	row = ROW_HEIGHT * (item->row + yoffset);
X	col = COL_WIDTH  * (item->col + xoffset);
X
X	pw_rop(playfield_pw, col, row, item->image->width,
X		item->image->height, PIX_SRC, item->image->picture, 0, 0);
X}
X
X
X/*****************************************************************
X *	update_score()	-	Update the score by the given
X *				amount and redisplay it.
X *****************************************************************/
X
Xupdate_score(amount)
Xint amount;
X{
X	char temp_string[80];		/* Temporary storage string */
X
X	/* Add amount and create new string */
X	current_score += amount;
X	sprintf(temp_string, "Level %6d     Score %6d",
X		current_level, current_score);
X
X	/* Display new string */
X	panel_set(score, PANEL_LABEL_STRING, temp_string, 0);
X}
X
X
X/*****************************************************************
X *	update_level()	-	Update the level by the given
X *				amount and redisplay it.
X *****************************************************************/
X
Xupdate_level(amount)
Xint amount;
X{
X	char temp_string[80];		/* Temporary storage string */
X
X	/* Add amount and create new string */
X	current_level += amount;
X	sprintf(temp_string, "Level %6d     Score %6d",
X		current_level, current_score);
X
X	/* Display new string */
X	panel_set(score, PANEL_LABEL_STRING, temp_string, 0);
X}
X
X
X/*****************************************************************
X *	do_death()	-	Display a tomb stone where the
X *				player used to be.
X *****************************************************************/
X
Xdo_death()
X{
X	/* Change human picture to tombstone */
X	set_image(human, tomb_image, -1, -1);
X
X	make_hs();
X	if(!window_get(hs_popup_frame, WIN_SHOW))
X		do_pop_proc();
X}
X
X
END_OF_FILE
if test 9776 -ne `wc -c <'level.c'`; then
    echo shar: \"'level.c'\" unpacked with wrong size!
fi
# end of 'level.c'
fi
if test ! -d 'pics' ; then
    echo shar: Creating directory \"'pics'\"
    mkdir 'pics'
fi
if test -f 'pics/human_d8.pic' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'pics/human_d8.pic'\"
else
echo shar: Extracting \"'pics/human_d8.pic'\" \(8429 characters\)
sed "s/^X//" >'pics/human_d8.pic' <<'END_OF_FILE'
X/* Format_version=1, Width=48, Height=48, Depth=8, Valid_bits_per_item=16
X */
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0202,0x0202,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0002,0x0202,0x0202,0x0200,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0002,0x0202,0x0202,0x0200,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0002,0x0202,0x0202,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0202,0x0202,0x0200,0x0000,0x0000,
X	0x0000,0x0000,0x0002,0x0202,0x0202,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0202,0x0202,0x0200,0x0000,0x0000,
X	0x0000,0x0000,0x0002,0x0202,0x0200,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0002,0x0202,0x0200,0x0000,0x0000,
X	0x0000,0x0000,0x0002,0x0202,0x0202,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0202,0x0202,0x0200,0x0000,0x0000,
X	0x0000,0x0000,0x0002,0x0200,0x0202,0x0200,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0002,0x0202,0x0002,0x0200,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0002,0x0202,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0202,0x0200,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0202,0x0200,0x0000,
X	0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
X	0x0000,0x0002,0x0202,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0002,0x0202,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0202,0x0200,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0202,0x0200,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0002,0x0202,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0002,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0202,0x0202,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0002,0x0202,0x0202,0x0200,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0202,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0202,0x0202,0x0202,0x0202,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0202,0x0000,
X	0x0002,0x0202,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0002,0x0200,0x0202,0x0202,0x0002,0x0200,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0202,0x0200,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0000,0x0000,
X	0x0000,0x0002,0x0000,0x0202,0x0202,0x0000,0x0200,0x0000,
X	0x0000,0x0000,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,
X	0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0202,0x0202,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0202,0x0202,0x0202,0x0202,0x0202,0x0202,
X	0x0002,0x0202,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0202,0x0202,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0202,0x0200,
X	0x0000,0x0202,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0202,0x0202,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0202,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0200,0x0002,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0200,0x0002,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0200,0x0002,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0202,0x0200,0x0002,0x0202,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0202,0x0200,0x0002,0x0202,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0002,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0200,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0202,0x0200,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0002,0x0202,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0002,0x0202,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0202,0x0200,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0202,0x0200,0x0000,
X	0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
X	0x0000,0x0002,0x0202,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0002,0x0202,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0202,0x0200,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0002,0x0200,0x0202,0x0200,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0002,0x0202,0x0002,0x0200,0x0000,0x0000,
X	0x0000,0x0000,0x0002,0x0202,0x0202,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0202,0x0202,0x0200,0x0000,0x0000,
X	0x0000,0x0000,0x0002,0x0202,0x0200,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0002,0x0202,0x0200,0x0000,0x0000,
X	0x0000,0x0000,0x0002,0x0202,0x0202,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0202,0x0202,0x0200,0x0000,0x0000,
X	0x0000,0x0000,0x0002,0x0202,0x0202,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0202,0x0202,0x0200,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0002,0x0202,0x0202,0x0200,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0002,0x0202,0x0202,0x0200,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0202,0x0202,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0002,0x0200,0x0000,0x0000,0x0000,
X	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
END_OF_FILE
if test 8429 -ne `wc -c <'pics/human_d8.pic'`; then
    echo shar: \"'pics/human_d8.pic'\" unpacked with wrong size!
fi
# end of 'pics/human_d8.pic'
fi
if test -f 'proc.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'proc.c'\"
else
echo shar: Extracting \"'proc.c'\" \(7724 characters\)
sed "s/^X//" >'proc.c' <<'END_OF_FILE'
X/*****************************************************************
X *
X *	proc.c	-	Icon activated processes.
X *
X *	Created -- 1/5/90	Kevin Wright
X *
X *****************************************************************/
X
X#include "sunbots.h"	/* Robots header file */
X
X/*****************************************************************
X *	new_proc()	-	This procedure is called at the
X *				start and whenever reset is pressed.
X *				If the human object does not exist,
X *				then it is created.  The score and
X *				level are reset.  The first level
X *				is created.
X *****************************************************************/
X
Xnew_proc()
X{
X	/* Create the human */
X	if(!human) {
X		human = (ScreenItem) malloc(sizeof(struct screen_item));
X		human->image = human_image;
X		human->next = NULL;
X	}
X
X	/* Reset human to alive and looking like a human */
X	human->type = HUMAN;
X	human->dead = FALSE;
X	human->image = human_image;
X	human->oldrow = human->oldcol = -1;
X
X	/* Reset score, level, and lives. Make first level */
X	update_score(-current_score);
X	update_level(1 - current_level);
X	lives_remaining = 2;
X	make_level();
X}
X
X
X/*****************************************************************
X *	filer_proc()	-	Not Implemented Yet
X *****************************************************************/
X
Xfiler_proc()
X{
X}
X
X
X/*****************************************************************
X *	teleport_proc()	-	Teleport the human to a random
X *				place on the screen.  An empty
X *				location is found and the human is
X *				moved there.  Robots move after a
X *				teleportation occurs.
X *****************************************************************/
X
Xteleport_proc()
X{
X	int i, j;		/* Loop variables */
X
X	/* If the human is dead, forget it */
X	if(human->dead)
X		return;
X
X	/* Make some fancy display */
X	for(i = 0; i < 10; i++) {
X		set_image(human, teleport_image[1], -1, -1);
X		for(j = 0; j < TARDIS_BLINK_RATE; j++)
X			;
X		set_image(human, teleport_image[0], -1, -1);
X		for(j = 0; j < TARDIS_BLINK_RATE; j++)
X			;
X	}
X
X	/* Find an empty place and put the human there */
X	human->oldrow = human->row;
X	human->oldcol = human->col;
X	find_empty(human, &(human->row), (&human->col));
X	place_item(human, -1, -1);
X
X	/* Make some more fancy display */
X	for(i = 0; i < 10; i++) {
X		set_image(human, teleport_image[1], -1, -1);
X		for(j = 0; j < TARDIS_BLINK_RATE; j++)
X			;
X		set_image(human, teleport_image[0], -1, -1);
X		for(j = 0; j < TARDIS_BLINK_RATE; j++)
X			;
X	}
X
X	/* Put the human back to normal and move the robots */
X	set_image(human, human_image, -1, -1);
X	move_robots(ALL_ROBOTS);
X}
X
X
X/*****************************************************************
X *	sonic_proc()	-	Activate sonic screwdriver.
X *				Draw sonic blast and then remove
X *				all robots in blast range.
X *				Remove one use from screwdriver.
X *****************************************************************/
X
Xsonic_proc()
X{
X	int i, j, k;		/* Loop variables */
X
X	/* If human is dead or screwdriver is empty, then forget it */
X	if(!screwdriver_uses || human->dead)
X		return;
X
X	/* Decrement uses and draw zap */
X	screwdriver_uses--;
X	set_image(human, zap_image[0], -1, -1);
X	for(i = 0; i < 10; i++) {
X		for(j = 1; j < 4; j++) {
X			set_image(human, zap_image[j], -1, -1);
X			for(k = 1; k < SONIC_CYCLE_RATE; k++)
X				;
X		}
X		for(j = 2; j >= 0; j--) {
X			set_image(human, zap_image[j], -1, -1);
X			for(k = 1; k < SONIC_CYCLE_RATE; k++)
X				;
X		}
X	}
X	set_image(human, human_image, -1, -1);
X
X	/* Remove robots and let remaining robots move */
X	remove_robots(human->col-1, human->row-1,
X			human->col+1, human->row+1, LIVE_STATE, TRUE);
X	move_robots(ALL_ROBOTS);
X}
X
X
X/*****************************************************************
X *	stand_proc()	-	Let the player make a last stand.
X *				Move robots until human is dead or
X *				all robots are dead.
X *****************************************************************/
X
Xstand_proc()
X{
X	/* If human is dead, then forget it */
X	if(human->dead)
X		return;
X
X	/* Set last stand flag */
X	last_stand_set = TRUE;
X
X	/* Move the robots */
X	while(move_robots(ALL_ROBOTS))
X		;
X}
X
X
X/*****************************************************************
X *	quit_proc()	-	Put up an alert for confirmation
X *				of quit.  If OK, then destroy
X *				the frame, else return to game.
X *****************************************************************/
X
Xquit_proc()
X{
X#ifdef SUNOS3_5
X	window_destroy(frame);
X#else
X	int	result;		/* Result from alert */
X	Event	event;		/* Event from alert */
X
X	/* Get result from an alert */
X	result = alert_prompt(frame, &event,
X		ALERT_MESSAGE_STRINGS,	"Are you sure you want to Quit?", 0,
X		ALERT_BUTTON_YES,	"Confirm",
X		ALERT_BUTTON_NO,	"Cancel",
X		0);
X
X	/* Process result */
X	switch(result) {
X		case ALERT_YES:
X			window_destroy(frame);
X			break;
X		default:
X			break;
X	}
X#endif
X}
X
X
X/*****************************************************************
X *	move_proc()	-	Get mouse coordinates from playfield
X *				and make player move toward the click.
X *****************************************************************/
X
Xmove_proc(canvas, event)
XCanvas canvas;
XEvent *event;
X{
X	int level;		/* Level activated on */
X	int action;		/* The event action */
X	int row, col;		/* Row and column of mouse click */
X
X	/* If not right or left mouse click or human is dead, forget it */
X#ifdef SUNOS3_5
X	action = event_id(event);
X#else
X	action = event_action(event);
X#endif
X	if((action != MS_RIGHT && action != MS_LEFT &&
X	    action != MS_MIDDLE && action != KEY_TOP(1) &&
X	    action != KEY_TOP(2)) || human->dead)
X		return;
X
X	/* Convert coordinates to row/col */
X	row = event_y(event) / ROW_HEIGHT;
X	col = event_x(event) / COL_WIDTH;
X	level = current_level;
X
X	if(action == KEY_TOP(1)) {
X		dump_pic();
X		return;
X	}
X	if(action == KEY_TOP(2)) {
X		dump_hs();
X		return;
X	}
X
X	if(action == MS_LEFT)
X		move_one(row, col);
X	else
X		while(TRUE) {
X			/* If human dead or robots dead, stop */
X			if(level != current_level || human->dead)
X				break;
X
X			/* If we are doing safe move, then think */
X			if(action == MS_MIDDLE && unsafe(row, col))
X				teleport_proc();
X
X			/* Move once */
X			move_one(row, col);
X
X			/* If we arrive, then stop */
X			if(row == human->row && col == human->col)
X				break;
X		}
X}
X
X
X/*****************************************************************
X *	do_pop_proc()	-	Add or remove the popup high
X *				score window.
X *****************************************************************/
X
Xdo_pop_proc()
X{
X	/* If not shown, refresh and display, else remove it */
X	if(!window_get(hs_popup_frame, WIN_SHOW)) {
X		get_hs();
X		update_hs();
X		window_set(hs_popup_frame, WIN_SHOW, TRUE, 0);
X	} else
X		window_set(hs_popup_frame, WIN_SHOW, FALSE, 0);
X}
X
X
X/*
X *
X */
X
Xsetup_proc()
X{
X	struct itimerval timer;		/* Timer for removing message */
X
X	timer.it_interval.tv_usec = 0;
X	timer.it_interval.tv_sec = 1;
X	timer.it_value.tv_usec = 0;
X	timer.it_value.tv_sec = 1;
X
X	notify_set_itimer_func(msg_popup_frame, startup_proc,
X			ITIMER_REAL, &timer, NULL);
X}
X
X
X/*
X *
X */
X
Xstartup_proc()
X{
X	new_proc();
X}
X
X
X/*****************************************************************
X *	debug_proc()	-	For debugging.  Teleport one
X *				level.
X *****************************************************************/
X
Xdebug_proc()
X{
X	/* Go up one level */
X	update_level(1);
X	make_level();
X}
X
X
X/*****************************************************************
X *	live_proc()	-	For debugging.  Bring human back
X *				to life.
X *****************************************************************/
X
Xlive_proc()
X{
X	ScreenItem temp;
X
X	/* Bring human back to life */
X	human->dead = FALSE;
X	set_image(human, human_image, -1, -1);
X
X	/* Refresh the robots */
X	temp = robot_list;
X	while(temp) {
X		refresh_image(temp, 0, 0);
X		temp = temp->next;
X	}
X
X}
X
X
END_OF_FILE
if test 7724 -ne `wc -c <'proc.c'`; then
    echo shar: \"'proc.c'\" unpacked with wrong size!
fi
# end of 'proc.c'
fi
if test -f 'sunbots.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'sunbots.c'\"
else
echo shar: Extracting \"'sunbots.c'\" \(16439 characters\)
sed "s/^X//" >'sunbots.c' <<'END_OF_FILE'
X/*****************************************************************
X *
X *	sunbots.c	-	Robots for SunView
X *
X *	Created -- 1/5/90	Kevin Wright
X *
X *****************************************************************/
X
X#include "sunbots.h"	/* Robots header file */
X
X/*
X *	Global Variables
X */
X
XFrame		frame;			/* Base frame for window */
XFrame		hs_popup_frame;		/* High score popup sub-frame */
XFrame		msg_popup_frame;	/* Message popup sub-frame */
XCanvas		playfield;		/* Main battlefield for robots */
XPixwin		*playfield_pw;		/* Pixwin for the battlefield */
XPixwin		*window_pw;		/* Pixwin for the window */
XPanel		msg_window;		/* Panel for displaying score */
XPanel		cmd_window;		/* Panel that contains buttons */
XPanel		mov_window;		/* Panel containing movement gadgets */
XPanel		hs_popup_panel;		/* High score popup sub-window */
XPanel		msg_popup_panel;	/* Message popup sub-window */
XPanel_item	score;			/* Item to display score and level */
XPanel_item	msg_popup_label;	/* Label for popup panel */
XPanel_item	hs[10] = {0,0,0,0,0,0,0,0,0,0};	/* Top ten score panels */
XScreenItem	human = NULL;		/* Structure containing human */
XScreenItem	robot_list = NULL;	/* Linked list of robots */
X
XHiScoreList	hs_list;		/* High score chart */
X
Xint		current_level;		/* Current level number */
Xint		current_score;		/* Current score */
Xint		screwdriver_uses;	/* How many sonic blasts */
Xint		last_stand_set;		/* Are we doing a last stand */
Xint		lives_remaining;	/* Number of lives remaining */
X
X
X/*****************************************************************
X *	main()	-	The base frame is created with title
X *			"Robots".  The images are initialized.
X *			The message, playfield, and command
X *			windows are set up and the game is started.
X *****************************************************************/
X
Xvoid main(argc, argv)
Xint argc;
Xchar **argv;
X{
X	/* Seed random numbers */
X	SEED(time(NULL));
X
X	/* Build base frame */
X	frame = window_create(NULL, FRAME,
X			FRAME_ARGS,		argc,	argv,
X			FRAME_LABEL,		"Sunbots v2.0",
X#ifndef SUNOS3_5
X			FRAME_NO_CONFIRM,	TRUE,
X#endif
X			FRAME_ICON,		icon_image,
X			0);
X
X	/* Init some panels */
X	init_msg_window();
X	init_playfield();
X
X	/* Create the pixrect images */
X	make_pics();
X
X	/* Init remaining panels */
X	init_cmd_window();
X	init_hs_popup();
X	init_msg_popup();
X
X	/* Setup to start a new game */
X	setup_proc();
X
X	/* Fit the frame and do window loop */
X	window_fit(frame);
X	window_main_loop(frame);
X
X	exit(0);
X}
X
X
X/*****************************************************************
X *	init_msg_window()	-	The message window is
X *					created.  It contains the
X *					level and score.
X *****************************************************************/
X
Xinit_msg_window()
X{
X	/* Create message window */
X	msg_window = window_create(frame, PANEL,
X			WIN_ROWS,	1,
X			0);
X
X	/* Create item to display level and score */
X	score = panel_create_item(msg_window,	PANEL_MESSAGE,
X			PANEL_LABEL_STRING,	"Level      0     Score      0",
X			0);
X}
X
X
X/*****************************************************************
X *	init_playfield()	-	The playfield is created.
X *					There are no margins and
X *					no row/col gaps.  The
X *					only events that are noticed
X *					by this window are those
X *					from the left mouse button.
X *****************************************************************/
X
Xinit_playfield()
X{
X	int i;
X	unsigned char red[4], green[4], blue[4];
X
X	/* Create playfield window */
X	playfield = window_create(frame, CANVAS,
X			WIN_ROW_HEIGHT,		ROW_HEIGHT,
X			WIN_COLUMN_WIDTH,	COL_WIDTH,
X			WIN_ROW_GAP,		0,
X			WIN_COLUMN_GAP,		0,
X			WIN_LEFT_MARGIN,	0,
X			WIN_RIGHT_MARGIN,	0,
X			WIN_TOP_MARGIN,		0,
X			WIN_BOTTOM_MARGIN,	0,
X			WIN_ROWS,		SCRN_ROWS,
X			WIN_COLUMNS,		SCRN_COLS,
X			WIN_BELOW,		msg_window,
X			WIN_CONSUME_KBD_EVENTS, WIN_NO_EVENTS,
X						KEY_TOP(1),
X						KEY_TOP(2),
X						0,
X			WIN_CONSUME_PICK_EVENTS,WIN_NO_EVENTS,
X						MS_LEFT, MS_RIGHT, MS_MIDDLE,
X						0,
X			WIN_EVENT_PROC,		move_proc,
X			CANVAS_RETAINED,	FALSE,
X			0);
X
X	/* Get pixwin of playfield and window */
X	window_pw = (Pixwin *) window_get(playfield, WIN_PIXWIN);
X	playfield_pw = canvas_pixwin(playfield);
X	
X	/* Set color values */
X	if(window_pw->pw_pixrect->pr_depth == 1)
X		for(i = 0; i < 4; i++) {
X			red[i]   = (i == 0 ? 255 : 0);
X			green[i] = (i == 0 ? 255 : 0);
X			blue[i]  = (i == 0 ? 255 : 0);
X		}
X	else
X		for(i = 0; i < 4; i++) {
X			red[i]   = (i == 3 || i == 0 ? 255 : 0);
X			green[i] = (i == 2 || i == 0 ? 255 : 0);
X			blue[i]  = (i == 1 || i == 0 ? 255 : 0);
X		}
X
X	/* Set color map for WIN_PIXWIN */
X	pw_setcmsname(window_pw, "playfield_cm");
X	pw_putcolormap(window_pw, 0, 4, red, green, blue);
X
X	/* Set color map for CANVAS_PIXWIN */
X	pw_setcmsname(playfield_pw, "playfield_cm");
X	pw_putcolormap(playfield_pw, 0, 4, red, green, blue);
X
X	/* Set canvas to retain */
X	window_set(playfield, CANVAS_RETAINED, TRUE, 0);
X}
X
X
X/*****************************************************************
X *	init_cmd_window()	-	The command window is
X *					created and buttons are
X *					created for each command.
X *****************************************************************/
X
Xinit_cmd_window()
X{
X	/* Create command window */
X	cmd_window = window_create(frame, PANEL,
X			WIN_BELOW,		msg_window,
X			WIN_RIGHT_OF,		playfield,
X			WIN_WIDTH,		75,
X			WIN_LEFT_MARGIN,	5,
X			WIN_RIGHT_MARGIN,	5,
X			0);
X
X	/* Create high scores gadget */
X	panel_create_item(cmd_window, PANEL_BUTTON,
X		PANEL_LABEL_IMAGE, scores_image->picture,
X		PANEL_NOTIFY_PROC, do_pop_proc,
X		0);
X
X	/* Create reset gadget */
X	panel_create_item(cmd_window, PANEL_BUTTON,
X		PANEL_LABEL_IMAGE, reset_image->picture,
X		PANEL_NOTIFY_PROC, new_proc,
X		0);
X
X	/* Create quit gadget */
X	panel_create_item(cmd_window, PANEL_BUTTON,
X		PANEL_LABEL_IMAGE, quit_image->picture,
X		PANEL_NOTIFY_PROC, quit_proc,
X		0);
X
X	/* Create last stand gadget */
X	panel_create_item(cmd_window, PANEL_BUTTON,
X		PANEL_LABEL_IMAGE, stand_image->picture,
X		PANEL_NOTIFY_PROC, stand_proc,
X		0);
X
X	/* Create sonic screwdriver gadget */
X	panel_create_item(cmd_window, PANEL_BUTTON,
X		PANEL_LABEL_IMAGE, sonic_image->picture,
X		PANEL_NOTIFY_PROC, sonic_proc,
X		0);
X
X	/* Create teleportation gadget */
X	panel_create_item(cmd_window, PANEL_BUTTON,
X		PANEL_LABEL_IMAGE, tardis_image->picture,
X		PANEL_NOTIFY_PROC, teleport_proc,
X		0);
X
X	/* Create filer gadget */
X	panel_create_item(cmd_window, PANEL_BUTTON,
X		PANEL_LABEL_IMAGE, filer_image->picture,
X		PANEL_NOTIFY_PROC, filer_proc,
X		0);
X
X	/* If UID = debugger, then put up debug icon */
X	if(getuid() == DEBUG_UID) {
X		panel_create_item(cmd_window, PANEL_BUTTON,
X			PANEL_LABEL_IMAGE, debug_image->picture,
X			PANEL_NOTIFY_PROC, debug_proc,
X			0);
X
X		panel_create_item(cmd_window, PANEL_BUTTON,
X			PANEL_LABEL_IMAGE, live_image->picture,
X			PANEL_NOTIFY_PROC, live_proc,
X			0);
X	}
X}
X
X
X/*****************************************************************
X *	init_hs_popup()	-	Create the high score popup
X *				window.  Get the high scores and
X *				add them to the window.  Create
X *				two DONE gadgets for removing the
X *				chart.
X *****************************************************************/
X
Xinit_hs_popup()
X{
X	/* Create the popup sub-frame and sub-window */
X	hs_popup_frame = window_create(frame, FRAME,
X				FRAME_LABEL, "        TOP TEN ROBOT HUNTERS",
X				FRAME_SHOW_LABEL, TRUE,
X				WIN_SHOW, FALSE,
X				0);
X	hs_popup_panel = window_create(hs_popup_frame,
X				PANEL,
X				0);
X
X	/* Get and update the high score list */
X	get_hs();
X	update_hs();
X
X	/* Create two DONE buttons */
X	panel_create_item(hs_popup_panel, PANEL_BUTTON,
X			PANEL_ITEM_X, ATTR_COL(0),
X			PANEL_ITEM_Y, ATTR_ROW(HS_NUM_SCORES + 1),
X			PANEL_LABEL_IMAGE, panel_button_image(hs_popup_panel,
X						"DONE", 5,
X						0),
X			PANEL_NOTIFY_PROC, do_pop_proc,
X			0);
X	panel_create_item(hs_popup_panel, PANEL_BUTTON,
X			PANEL_ITEM_X, ATTR_COL(30),
X			PANEL_ITEM_Y, ATTR_ROW(HS_NUM_SCORES + 1),
X			PANEL_LABEL_IMAGE, panel_button_image(hs_popup_panel,
X						"DONE", 5,
X						0),
X			PANEL_NOTIFY_PROC, do_pop_proc,
X			0);
X
X	/* Fit the panel and the frame */
X	window_fit(hs_popup_panel);
X	window_fit(hs_popup_frame);
X}
X
X
X/*****************************************************************
X *	init_msg_popup()	-	Create a sub-frame and
X *					sub-window to display a
X *					message in.
X *****************************************************************/
X
Xinit_msg_popup()
X{
X	/* Create sub-frame and sub-window */
X	msg_popup_frame = window_create(frame, FRAME,
X				WIN_SHOW, FALSE,
X				0);
X	msg_popup_panel = window_create(msg_popup_frame, PANEL,
X				0);
X
X	/* Create message label */
X	msg_popup_label = panel_create_item(msg_popup_panel, PANEL_MESSAGE,
X			PANEL_LABEL_STRING, " ",
X			0);
X
X	/* Size to fit message */
X	window_fit(msg_popup_panel);
X	window_fit(msg_popup_frame);
X}
X
X
X/*****************************************************************
X *	display_msg()	-	Add a message to the popup window
X *				and display it.
X *****************************************************************/
X
Xdisplay_msg(string, time)
Xchar *string;
Xint time;
X{
X	int play_x, play_y;		/* Start point of playfield */
X	int play_width, play_height;	/* Width and height of playfield */
X	int msg_width, msg_height;	/* Width and height of popup msg */
X
X	struct itimerval timer;		/* Timer for removing message */
X
X	/* Change the message string */
X	panel_set(msg_popup_label, PANEL_LABEL_STRING, string, 0);
X
X	/* Fit the windows again */
X	window_fit(msg_popup_panel);
X	window_fit(msg_popup_frame);
X
X	/* Center frame in center of playfield */
X	play_x = (int) window_get(playfield, WIN_X);
X	play_y = (int) window_get(playfield, WIN_Y);
X	play_width = (int) window_get(playfield, WIN_WIDTH);
X	play_height = (int) window_get(playfield, WIN_HEIGHT);
X
X	msg_width = (int) window_get(msg_popup_panel, WIN_WIDTH);
X	msg_height = (int) window_get(msg_popup_panel, WIN_HEIGHT);
X
X	window_set(msg_popup_frame,
X		WIN_X, play_x + ((play_width - msg_width) >> 1),
X		WIN_Y, play_y + ((play_height - msg_height) >> 1),
X		0);
X
X	/* Set up time interval */
X	timer.it_interval.tv_usec = 0;
X	timer.it_interval.tv_sec = time;
X	timer.it_value.tv_usec = 0;
X	timer.it_value.tv_sec = time;
X
X	/* Show the panel, wait some time, and remove the panel */
X	window_set(msg_popup_frame, WIN_SHOW, TRUE, 0);
X	notify_set_itimer_func(msg_popup_frame, kill_display,
X			ITIMER_REAL, &timer, NULL);
X}
X
X
X/*****************************************************************
X *	kill_display()	-	Remove the message from the screen.
X *****************************************************************/
X
Xkill_display()
X{
X	window_set(msg_popup_frame, WIN_SHOW, FALSE, 0);
X	notify_set_itimer_func(msg_popup_frame, kill_display,
X			ITIMER_REAL, NULL, NULL);
X}
X
X
X/*****************************************************************
X *	update_hs()	-	Update the high score display.
X *				If called for the first time, then
X *				create the message panels as well.
X *****************************************************************/
X
Xupdate_hs()
X{
X	int i;			/* Loop variable */
X	char tempstr[80];	/* Temporary storage string */
X
X	/* If first time, then build the panels.  Setup the list */
X	for(i = 0; i < HS_NUM_SCORES; i++) {
X		if(!hs[i]) {
X			hs[i] = panel_create_item(hs_popup_panel,PANEL_MESSAGE,
X					PANEL_ITEM_X,	ATTR_COL(0),
X					PANEL_ITEM_Y,	ATTR_ROW(i),
X					0);
X		}
X
X		sprintf(tempstr, "%2d)  %-10s     level %2d     %6d pts",
X			i + 1, hs_list.names[i], hs_list.levels[i],
X			hs_list.scores[i]);
X		panel_set(hs[i], PANEL_LABEL_STRING, tempstr, 0);
X	}
X}
X
X
X/*****************************************************************
X *	get_hs()	-	Get the high scores from the high
X *				score file.  If open fails, then
X *				an error is reported and FALSE is
X *				returned.  TRUE is returned
X *				otherwise.
X *****************************************************************/
X
Xget_hs()
X{
X	int i;			/* Loop variable */
X	FILE *hs_file;		/* Pointer to the high score file */
X
X	/* Open high score file and report any errors */
X	if(!(hs_file = fopen(HSFILE, "r"))) {
X		fprintf(stderr, "get_ps: Can't open high score file %s\n",
X				HSFILE);
X		return(FALSE);
X	}
X
X	/* Read the high score list and close the file */
X	fread((char *) &hs_list, sizeof(hs_list), 1, hs_file);
X	fclose(hs_file);
X
X	return(TRUE);
X}
X
X
X/*****************************************************************
X *	put_hs		-	Write the new high score list to
X *				the high score file.  Report any
X *				errors in opening the file.
X *****************************************************************/
X
Xput_hs()
X{
X	FILE *hs_file;		/* Pointer to the high score file */
X
X	/* Open the high score file and report any errors */
X	if(!(hs_file = fopen(HSFILE, "w"))) {
X		fprintf(stderr, "put_hs: Can't open high score file %s\n",
X				HSFILE);
X		return;
X	}
X
X	/* Write the high score list and close the file */
X	fwrite((char *) &hs_list, sizeof(hs_list), 1, hs_file);
X	fclose(hs_file);
X}
X
X
X/*****************************************************************
X *	make_hs()	-	Add a new high score to the high
X *				score chart.  First lock the chart
X *				against access.  Get the current
X *				score list and add the new score to
X *				the list.  Write the new list out
X *				and unlock the file.
X *****************************************************************/
X
Xmake_hs()
X{
X	int obtained;		/* Flag indicating successful hs lookup */
X	int i, j;		/* Loop variables */
X
X	/* Lock the high score file and exit if fails */
X	if(!lock_hs_file())
X		return;
X
X	/* Get the high score file and add the new score */
X	obtained = get_hs();
X	for(i = 0; i < 10; i++)
X		if(hs_list.scores[i] < current_score) {
X			for(j = 9; j > i; j--) {
X				hs_list.scores[j] = hs_list.scores[j - 1];
X				hs_list.levels[j] = hs_list.levels[j - 1];
X				strcpy(hs_list.names[j], hs_list.names[j - 1]);
X			}
X			hs_list.scores[i] = current_score;
X			hs_list.levels[i] = current_level;
X			strcpy(hs_list.names[i], getpwuid(getuid())->pw_name);
X			break;
X		}
X
X	/* If the high score was obtained properly, then write the new list */
X	if(obtained) {
X		put_hs();
X		update_hs();
X	}
X
X	/* Unlock the high score file */
X	unlock_hs_file();
X}
X
X
X/*****************************************************************
X *	lock_hs_file()	-	Lock the high score file against
X *				access by another program.  Creates
X *				a link to the high score file.
X *				If the link fails, it will try
X *				multiple times (waiting for other
X *				process to give it up) and then it
X *				will give up and register an error.
X *****************************************************************/
X
Xlock_hs_file()
X{
X	int count = 0;		/* Counter for number of attempts made */
X
X	/* Try to create the link */
X	while(link(HSFILE, HSLOCK) == -1 &&
X		count < MAX_LOCK_TRIES)
X			count++;
X
X	/* If failed, then send an error message */
X	if(count >= MAX_LOCK_TRIES)
X		fprintf(stderr, "Could not create lock %s\n",
X			HSLOCK);
X
X	return(count < MAX_LOCK_TRIES);
X}
X
X
X/*****************************************************************
X *	unlock_hs_file()	-	Unlock the high score file
X *					so that other processes can
X *					access it.
X *****************************************************************/
X
Xunlock_hs_file()
X{
X	/* Unlink lock file */
X	unlink(HSLOCK);
X}
X
X
X/*****************************************************************
X *	dump_pic()	-	Dump the screen to a file.
X *****************************************************************/
X
Xdump_pic()
X{
X	char *filename, command[512];
X	int x, y, X, Y;
X
X	if((filename = tempnam(".", "rdump")) == NULL)
X		fprintf(stderr, "Can't make dumpfile!\n");
X	else {
X		x = (int) window_get(frame, WIN_X);
X		y = (int) window_get(frame, WIN_Y);
X		X = (int) window_get(frame, WIN_WIDTH);
X		Y = (int) window_get(frame, WIN_HEIGHT);
X		sprintf(command, "screendump -x%d -y%d -X%d -Y%d %s",
X			x, y, X, Y, filename);
X		system(command);
X	}
X}
X
X
X/*****************************************************************
X *	dump_hs()	-	Dump the high score to a file.
X *****************************************************************/
X
Xdump_hs()
X{
X	char *filename, command[512];
X	int x, y, X, Y;
X
X	if((filename = tempnam(".", "hdump")) == NULL)
X		fprintf(stderr, "Can't make dumpfile!\n");
X	else {
X		x = (int) window_get(hs_popup_frame, WIN_X) +
X		    (int) window_get(frame, WIN_X);
X		y = (int) window_get(hs_popup_frame, WIN_Y) +
X		    (int) window_get(frame, WIN_Y);
X		X = (int) window_get(hs_popup_frame, WIN_WIDTH);
X		Y = (int) window_get(hs_popup_frame, WIN_HEIGHT);
X		sprintf(command, "screendump -x%d -y%d -X%d -Y%d %s",
X			x, y, X, Y, filename);
X		system(command);
X	}
X}
END_OF_FILE
if test 16439 -ne `wc -c <'sunbots.c'`; then
    echo shar: \"'sunbots.c'\" unpacked with wrong size!
fi
# end of 'sunbots.c'
fi
if test -f 'sunbots.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'sunbots.h'\"
else
echo shar: Extracting \"'sunbots.h'\" \(5034 characters\)
sed "s/^X//" >'sunbots.h' <<'END_OF_FILE'
X/*****************************************************************
X *
X *	sunbots.h	-	Sunview Robots Header File
X *
X *	Created -- 1/5/90	Kevin Wright
X *
X *****************************************************************/
X
X#ifndef SUNBOTS_H
X# define SUNBOTS_H
X
X# include <suntool/sunview.h>
X# include <suntool/canvas.h>
X# include <suntool/panel.h>
X# include <suntool/icon.h>
X# include <suntool/tty.h>
X# include <stdio.h>
X# ifndef SUNOS3_5
X#  include <suntool/alert.h>
X# endif
X# include <suntool/seln.h>
X# include <pwd.h>
X# include <sys/time.h>
X# include <sunwindow/notify.h>
X# include "images.h"
X
X/*
X *	Defines
X */
X
X# define SEED(x)			(srandom(x))	/* Random numbers */
X# define RND(x)				((random() >> 3) % x)
X
X# define NORTH				0	/* North */
X# define NORTH_WEST			1	/* North-west */
X# define NORTH_EAST			2	/* North-east */
X# define SOUTH				3	/* South */
X# define SOUTH_WEST			4	/* South-west */
X# define SOUTH_EAST			5	/* South-east */
X# define EAST				6	/* East */
X# define WEST				7	/* West */
X# define NO_MOVE			8	/* No Direction */
X
X# define COLLISION_HUMAN		1	/* Collision with human */
X# define COLLISION_ROBOT		2	/* Collision with robot */
X# define COLLISION_TRASH		3	/* Collision with trash */
X# define COLLISION_GEM			4	/* Collision with gem */
X# define COLLISION_OTHER		5	/* Unknown collision */
X
X# define LIVE_STATE			1	/* Robot is alive */
X# define DEAD_STATE			2	/* Robot is dead */
X# define ALL_STATES			3	/* Alive or dead */
X
X# define SPEEDER_LEVEL			5	/* Starting speeder level */
X# define SPEEDER_CHANCE			10	/* Chance of being fast */
X
X# define ALL_ROBOTS			1	/* All robots */
X# define NORMAL_ROBOT			2	/* Normal robot */
X# define SPEEDER_ROBOT			3	/* Faster robot */
X# define HUMAN				4	/* Not a robot */
X# define GEM				5	/* A gem */
X
X# define ROW_HEIGHT			16	/* Height of a row */
X# define COL_WIDTH			16	/* Width of a column */
X# define SCRN_ROWS			40	/* Rows per screen */
X# define SCRN_COLS			40	/* Columns per screen */
X# define SCREEN_HEIGHT			(SCRN_ROWS * ROW_HEIGHT)
X# define SCREEN_WIDTH			(SCRN_COLS * COL_WIDTH)
X
X# define TARDIS_BLINK_RATE		10000	/* Loop for tardis blink */
X# define SONIC_CYCLE_RATE		5000	/* Loop for sonic cycle */
X
X# define HS_NAME_LEN			20	/* Length of high score name */
X# define HS_NUM_SCORES			10	/* Number of high scores */
X# ifndef HSFILE					/* Sunbot high score file */
X#  define HSFILE			"/usr/games/lib/.sunbots.hs"
X# endif
X# ifndef HSLOCK					/* Sunbot hs lock file */
X#  define HSLOCK			"/usr/games/lib/.sunbots.hs.lock"
X# endif
X# define MAX_LOCK_TRIES			50
X
X# define DEBUG_UID			114	/* Uid of debugger */
X
X/*
X *	Structures
X */
X
Xtypedef struct screen_item {
X	int			row, col;	/* Row and column of item */
X	int			oldrow, oldcol;	/* Old position of item */
X	int			type;		/* Type of robot */
X	int			dead;		/* Flag indicating death */
X	Image			image;		/* Pointer to panel item */
X	struct screen_item	*next;		/* Pointer to next structure */
X} *ScreenItem;
X
Xtypedef struct {
X	char	names[HS_NUM_SCORES][HS_NAME_LEN + 1];	/* Names of scorers */
X	int	scores[HS_NUM_SCORES];			/* High scores */
X	int	levels[HS_NUM_SCORES];			/* High levels */
X} HiScoreList;
X
X/*
X *	Global Variables
X */
X
Xextern Frame		frame;		/* Base frame for window */
Xextern Frame		hs_popup_frame;	/* High score popup sub-frame */
Xextern Frame		msg_popup_frame;/* Message popup sub-frame */
Xextern Canvas		playfield;	/* Main battlefield for robots */
Xextern Pixwin		*playfield_pw;	/* Pixwin for the battlefield */
Xextern Panel		msg_window;	/* Panel for displaying score */
Xextern Panel		cmd_window;	/* Panel that contains buttons */
Xextern Panel		mov_window;	/* Panel containing movement gadgets */
Xextern Panel		hs_popup_panel;	/* High score popup sub-window */
Xextern Panel		msg_popup_panel;/* Message popup sub-window */
Xextern Panel_item	score;		/* Item to display score and level */
Xextern Panel_item	msg_popup_label;/* Label for popup panel */
Xextern Panel_item	hs[10];		/* Top ten scores */
Xextern ScreenItem	human;		/* Structure containing human */
Xextern ScreenItem	robot_list;	/* Linked list of robots */
X
Xextern HiScoreList	hs_list;		/* High score chart */
X
Xextern int		current_level;		/* Current level number */
Xextern int		current_score;		/* Current score */
Xextern int		screwdriver_uses;	/* How many sonic blasts */
Xextern int		last_stand_set;		/* Are we doing a last stand */
Xextern int		lives_remaining;	/* Number of lives remaining */
X
X
X/*
X *	Functions
X */
X
Xint init_msg_window(), init_playfield(), init_cmd_window(), init_hs_popup();
Xint new_proc(), filer_proc(), move_proc(), move_human(), get_hs(), put_hs();
Xint teleport_proc(), sonic_proc(), stand_proc(), quit_proc(), make_level();
Xint destroy_robots(), create_robots(), find_empty(), place_item();
Xint move_robots(), collision(), all_dead(), update_score(), update_level();
Xint do_death(), update_hs(), do_pop_proc(), lock_hs_file(), init_msg_popup();
Xint unlock_hs_file(), make_hs(), debug_proc(), live_proc(), display_msg();
Xint kill_display(), setup_proc(), startup_proc(), set_image();
X
XScreenItem occupied();
X
X#endif	/* SUNBOTS_H */
END_OF_FILE
if test 5034 -ne `wc -c <'sunbots.h'`; then
    echo shar: \"'sunbots.h'\" unpacked with wrong size!
fi
# end of 'sunbots.h'
fi
echo shar: End of archive 1 \(of 3\).
cp /dev/null ark1isdone
MISSING=""
for I in 1 2 3 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 3 archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0