xref: /csrg-svn/games/robots/move_robs.c (revision 60840)
121469Smckusick /*
2*60840Sbostic  * Copyright (c) 1980, 1993
3*60840Sbostic  *	The Regents of the University of California.  All rights reserved.
433690Sbostic  *
542589Sbostic  * %sccs.include.redist.c%
621469Smckusick  */
721469Smckusick 
821469Smckusick #ifndef lint
9*60840Sbostic static char sccsid[] = "@(#)move_robs.c	8.1 (Berkeley) 05/31/93";
1033690Sbostic #endif /* not lint */
1121469Smckusick 
1221469Smckusick # include	"robots.h"
1321469Smckusick # include	<signal.h>
1421469Smckusick 
1521469Smckusick /*
1621469Smckusick  * move_robots:
1721469Smckusick  *	Move the robots around
1821469Smckusick  */
1946757Sbostic void
move_robots(was_sig)2021469Smckusick move_robots(was_sig)
2121469Smckusick bool	was_sig;
2221469Smckusick {
2321469Smckusick 	register COORD	*rp;
2421469Smckusick 	register int	y, x;
2521469Smckusick 	register int	mindist, d;
2621469Smckusick 	static COORD	newpos;
2721469Smckusick 
2821469Smckusick 	if (Real_time)
2921469Smckusick 		signal(SIGALRM, move_robots);
3021469Smckusick # ifdef DEBUG
3121469Smckusick 	move(Min.y, Min.x);
3221469Smckusick 	addch(inch());
3321469Smckusick 	move(Max.y, Max.x);
3421469Smckusick 	addch(inch());
3521469Smckusick # endif DEBUG
3621469Smckusick 	for (rp = Robots; rp < &Robots[MAXROBOTS]; rp++) {
3721469Smckusick 		if (rp->y < 0)
3821469Smckusick 			continue;
3921469Smckusick 		mvaddch(rp->y, rp->x, ' ');
4021469Smckusick 		Field[rp->y][rp->x]--;
4121469Smckusick 		rp->y += sign(My_pos.y - rp->y);
4221469Smckusick 		rp->x += sign(My_pos.x - rp->x);
4321469Smckusick 		if (rp->y <= 0)
4421469Smckusick 			rp->y = 0;
4521469Smckusick 		else if (rp->y >= Y_FIELDSIZE)
4621469Smckusick 			rp->y = Y_FIELDSIZE - 1;
4721469Smckusick 		if (rp->x <= 0)
4821469Smckusick 			rp->x = 0;
4921469Smckusick 		else if (rp->x >= X_FIELDSIZE)
5021469Smckusick 			rp->x = X_FIELDSIZE - 1;
5121469Smckusick 		Field[rp->y][rp->x]++;
5221469Smckusick 	}
5321469Smckusick 
5421469Smckusick 	Min.y = Y_FIELDSIZE;
5521469Smckusick 	Min.x = X_FIELDSIZE;
5621469Smckusick 	Max.y = 0;
5721469Smckusick 	Max.x = 0;
5821469Smckusick 	for (rp = Robots; rp < &Robots[MAXROBOTS]; rp++)
5921469Smckusick 		if (rp->y < 0)
6021469Smckusick 			continue;
6121469Smckusick 		else if (rp->y == My_pos.y && rp->x == My_pos.x)
6221469Smckusick 			Dead = TRUE;
6321469Smckusick 		else if (Field[rp->y][rp->x] > 1) {
6421469Smckusick 			mvaddch(rp->y, rp->x, HEAP);
6521469Smckusick 			rp->y = -1;
6621469Smckusick 			Num_robots--;
6721469Smckusick 			if (Waiting)
6821469Smckusick 				Wait_bonus++;
6921469Smckusick 			add_score(ROB_SCORE);
7021469Smckusick 		}
7121469Smckusick 		else {
7221469Smckusick 			mvaddch(rp->y, rp->x, ROBOT);
7321469Smckusick 			if (rp->y < Min.y)
7421469Smckusick 				Min.y = rp->y;
7521469Smckusick 			if (rp->x < Min.x)
7621469Smckusick 				Min.x = rp->x;
7721469Smckusick 			if (rp->y > Max.y)
7821469Smckusick 				Max.y = rp->y;
7921469Smckusick 			if (rp->x > Max.x)
8021469Smckusick 				Max.x = rp->x;
8121469Smckusick 		}
8221469Smckusick 
8321469Smckusick 	if (was_sig) {
8421469Smckusick 		refresh();
8521469Smckusick 		if (Dead || Num_robots <= 0)
8646757Sbostic 			longjmp(End_move, 0);
8721469Smckusick 	}
8821469Smckusick 
8921469Smckusick # ifdef DEBUG
9021469Smckusick 	standout();
9121469Smckusick 	move(Min.y, Min.x);
9221469Smckusick 	addch(inch());
9321469Smckusick 	move(Max.y, Max.x);
9421469Smckusick 	addch(inch());
9521469Smckusick 	standend();
9621469Smckusick # endif DEBUG
9721469Smckusick 	if (Real_time)
9821469Smckusick 		alarm(3);
9921469Smckusick }
10021469Smckusick 
10121469Smckusick /*
10221469Smckusick  * add_score:
10321469Smckusick  *	Add a score to the overall point total
10421469Smckusick  */
add_score(add)10521469Smckusick add_score(add)
10621469Smckusick int	add;
10721469Smckusick {
10821469Smckusick 	Score += add;
10921469Smckusick 	move(Y_SCORE, X_SCORE);
11021469Smckusick 	printw("%d", Score);
11121469Smckusick }
11221469Smckusick 
11321469Smckusick /*
11421469Smckusick  * sign:
11521469Smckusick  *	Return the sign of the number
11621469Smckusick  */
sign(n)11721469Smckusick sign(n)
11821469Smckusick int	n;
11921469Smckusick {
12021469Smckusick 	if (n < 0)
12121469Smckusick 		return -1;
12221469Smckusick 	else if (n > 0)
12321469Smckusick 		return 1;
12421469Smckusick 	else
12521469Smckusick 		return 0;
12621469Smckusick }
127