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