xref: /original-bsd/games/robots/move_robs.c (revision 2301fdfb)
1 /*
2  * Copyright (c) 1980 Regents of the University of California.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms are permitted
6  * provided that the above copyright notice and this paragraph are
7  * duplicated in all such forms and that any documentation,
8  * advertising materials, and other materials related to such
9  * distribution and use acknowledge that the software was developed
10  * by the University of California, Berkeley.  The name of the
11  * University may not be used to endorse or promote products derived
12  * from this software without specific prior written permission.
13  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16  */
17 
18 #ifndef lint
19 static char sccsid[] = "@(#)move_robs.c	5.3 (Berkeley) 06/18/88";
20 #endif /* not lint */
21 
22 # include	"robots.h"
23 # include	<signal.h>
24 
25 /*
26  * move_robots:
27  *	Move the robots around
28  */
29 move_robots(was_sig)
30 bool	was_sig;
31 {
32 	register COORD	*rp;
33 	register int	y, x;
34 	register int	mindist, d;
35 	static COORD	newpos;
36 
37 	if (Real_time)
38 		signal(SIGALRM, move_robots);
39 # ifdef DEBUG
40 	move(Min.y, Min.x);
41 	addch(inch());
42 	move(Max.y, Max.x);
43 	addch(inch());
44 # endif DEBUG
45 	for (rp = Robots; rp < &Robots[MAXROBOTS]; rp++) {
46 		if (rp->y < 0)
47 			continue;
48 		mvaddch(rp->y, rp->x, ' ');
49 		Field[rp->y][rp->x]--;
50 		rp->y += sign(My_pos.y - rp->y);
51 		rp->x += sign(My_pos.x - rp->x);
52 		if (rp->y <= 0)
53 			rp->y = 0;
54 		else if (rp->y >= Y_FIELDSIZE)
55 			rp->y = Y_FIELDSIZE - 1;
56 		if (rp->x <= 0)
57 			rp->x = 0;
58 		else if (rp->x >= X_FIELDSIZE)
59 			rp->x = X_FIELDSIZE - 1;
60 		Field[rp->y][rp->x]++;
61 	}
62 
63 	Min.y = Y_FIELDSIZE;
64 	Min.x = X_FIELDSIZE;
65 	Max.y = 0;
66 	Max.x = 0;
67 	for (rp = Robots; rp < &Robots[MAXROBOTS]; rp++)
68 		if (rp->y < 0)
69 			continue;
70 		else if (rp->y == My_pos.y && rp->x == My_pos.x)
71 			Dead = TRUE;
72 		else if (Field[rp->y][rp->x] > 1) {
73 			mvaddch(rp->y, rp->x, HEAP);
74 			rp->y = -1;
75 			Num_robots--;
76 			if (Waiting)
77 				Wait_bonus++;
78 			add_score(ROB_SCORE);
79 		}
80 		else {
81 			mvaddch(rp->y, rp->x, ROBOT);
82 			if (rp->y < Min.y)
83 				Min.y = rp->y;
84 			if (rp->x < Min.x)
85 				Min.x = rp->x;
86 			if (rp->y > Max.y)
87 				Max.y = rp->y;
88 			if (rp->x > Max.x)
89 				Max.x = rp->x;
90 		}
91 
92 	if (was_sig) {
93 		refresh();
94 		if (Dead || Num_robots <= 0)
95 			longjmp(End_move);
96 	}
97 
98 # ifdef DEBUG
99 	standout();
100 	move(Min.y, Min.x);
101 	addch(inch());
102 	move(Max.y, Max.x);
103 	addch(inch());
104 	standend();
105 # endif DEBUG
106 	if (Real_time)
107 		alarm(3);
108 }
109 
110 /*
111  * add_score:
112  *	Add a score to the overall point total
113  */
114 add_score(add)
115 int	add;
116 {
117 	Score += add;
118 	move(Y_SCORE, X_SCORE);
119 	printw("%d", Score);
120 }
121 
122 /*
123  * sign:
124  *	Return the sign of the number
125  */
126 sign(n)
127 int	n;
128 {
129 	if (n < 0)
130 		return -1;
131 	else if (n > 0)
132 		return 1;
133 	else
134 		return 0;
135 }
136