add manual page, Berkeley specific copyright
[unix-history] / usr / src / games / robots / move_robs.c
CommitLineData
f8f038ae
KM
1/*
2 * Copyright (c) 1980 Regents of the University of California.
4cd7a139
KB
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms are permitted
b7647a4b
KB
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.
f8f038ae
KM
16 */
17
18#ifndef lint
b7647a4b 19static char sccsid[] = "@(#)move_robs.c 5.3 (Berkeley) %G%";
4cd7a139 20#endif /* not lint */
f8f038ae
KM
21
22# include "robots.h"
23# include <signal.h>
24
25/*
26 * move_robots:
27 * Move the robots around
28 */
29move_robots(was_sig)
30bool 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 */
114add_score(add)
115int 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 */
126sign(n)
127int n;
128{
129 if (n < 0)
130 return -1;
131 else if (n > 0)
132 return 1;
133 else
134 return 0;
135}