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