121469Smckusick /* 221469Smckusick * Copyright (c) 1980 Regents of the University of California. 333690Sbostic * All rights reserved. 433690Sbostic * 542589Sbostic * %sccs.include.redist.c% 621469Smckusick */ 721469Smckusick 821469Smckusick #ifndef lint 9*46757Sbostic static char sccsid[] = "@(#)move_robs.c 5.5 (Berkeley) 02/28/91"; 1033690Sbostic #endif /* not lint */ 1121469Smckusick 1221469Smckusick # include "robots.h" 1321469Smckusick # include <signal.h> 1421469Smckusick 1521469Smckusick /* 1621469Smckusick * move_robots: 1721469Smckusick * Move the robots around 1821469Smckusick */ 19*46757Sbostic void 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) 86*46757Sbostic 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 */ 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 */ 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