xref: /netbsd-src/games/warp/play.c (revision 1182a44c59cae4d586117d55eca24b4b8b173211)
1 /* Header: play.c,v 7.0.1.1 86/10/16 10:52:39 lwall Exp */
2 
3 /* Log:	play.c,v
4  * Revision 7.0.1.1  86/10/16  10:52:39  lwall
5  * Added Damage.  Fixed random bugs.
6  *
7  * Revision 7.0  86/10/08  15:13:09  lwall
8  * Split into separate files.  Added amoebas and pirates.
9  *
10  */
11 
12 #include "EXTERN.h"
13 #include "warp.h"
14 #include "bang.h"
15 #include "score.h"
16 #include "object.h"
17 #include "move.h"
18 #include "term.h"
19 #include "them.h"
20 #include "us.h"
21 #include "util.h"
22 #include "weapon.h"
23 #include "INTERN.h"
24 #include "play.h"
25 
26 void
play_init(void)27 play_init(void)
28 {
29     ;
30 }
31 
32 void
play(void)33 play(void)
34 {
35     bool done = false;
36     OBJECT *curobj;
37     OBJECT *to;
38     int i;
39     int x;
40     int y;
41 
42     display_status();
43 #ifdef TIOCOUTQ
44     while (output_pending() > charsperhalfsec)
45 	sleep(1);			 /* allow buffers to empty */
46 #endif
47     sleep(3);
48     do {
49 	timer++;
50 	nxtbang = 0;
51 	banging = false;
52 	display_status();
53 #ifdef TIOCOUTQ
54 	while (output_pending() > charsperhalfsec)
55 	    sleep(1);
56 #endif
57 	if (lowspeed)
58 	    roundsleep(2);
59 	else
60 	    roundsleep(1);
61 	if (ent) {
62 	    evely = ent->vely;
63 	    evelx = ent->velx;
64 	    if (cloaking && ent->energy >= 250 && !damflag[NOCLOAKING]) {
65 		if (!rand_mod(300)) {
66 		    damage++;
67 		    damflag[NOCLOAKING] = rand_mod(smarts+1)+2;
68 		}
69 		ent->energy -= ent->energy/40;
70 	    }
71 	    else
72 		cloaking = false;
73 	    cloaked = cloaking;
74 	}
75 	if (base) {
76 	    bvely = base->vely;
77 	    bvelx = base->velx;
78 	}
79 	get_commands(&done);
80 	if (done)
81 	    break;
82 	their_smarts();
83 	apolloflag = 0;
84 	if (ent) {
85 	    if (numapollos) {
86 		if (numstars) {
87 		    if (realapollo) {
88 			if (lookfor(realapollo->posy,realapollo->posx,
89 			    Enterprise)) {
90 			    apolloflag = 1;
91 			}
92 		    }
93 		    else if (lookfor(root.next->posy,root.next->posx,
94 			Enterprise)) {
95 			apolloflag = 1;
96 			realapollo = root.next;
97 			mvaddch(realapollo->posy+1,realapollo->posx*2,
98 			    'A');
99 			realapollo->image = 'A';
100 			realapollo->mass = 6000;
101 			inumapollos = 1;
102 			numenemies++;
103 			inumenemies++;
104 			possiblescore += 5000;
105 		    }
106 		    if (apolloflag) {
107 			if (blast[realapollo->posy][realapollo->posx] <= 32000)
108 			    evely = evelx = 0;
109 			realapollo->energy = 32000;
110 		    }
111 		}
112 		else
113 		    numapollos = 0;
114 	    }
115 	    ent->vely = evely;
116 	    ent->velx = evelx;
117 	}
118 	if (base) {
119 	    if (numapollos) {
120 		if (numstars) {
121 		    if (realapollo) {
122 			if (lookfor(realapollo->posy,realapollo->posx,
123 			    Base)) {
124 			    apolloflag |= 2;
125 			}
126 		    }
127 		    else if (lookfor(root.next->posy,root.next->posx,
128 			Base)) {
129 			apolloflag |= 2;
130 			realapollo = root.next;
131 			mvaddch(realapollo->posy+1,realapollo->posx*2,
132 			    'A');
133 			realapollo->image = 'A';
134 			realapollo->mass = 6000;
135 			inumapollos = 1;
136 			numenemies++;
137 			inumenemies++;
138 			possiblescore += 5000;
139 		    }
140 		    if (apolloflag & 2) {
141 			if (blast[realapollo->posy][realapollo->posx] <= 32000)
142 			    bvely = bvelx = 0;
143 			realapollo->energy = 32000;
144 		    }
145 		}
146 		else
147 		    numapollos = 0;
148 	    }
149 	    base->vely = bvely;
150 	    base->velx = bvelx;
151 	}
152 	if (aretorps) {
153 	    aretorps = 0;
154 	    for (i=0;i<2;i++) for (y=0;y<3;y++) for (x=0;x<3;x++) {
155 		if ((curobj = isatorp[i][y][x]) != NULL) {
156 		    to = occupant[(curobj->posy+curobj->vely+YSIZE00)%YSIZE]
157 				 [(curobj->posx+curobj->velx+XSIZE00)%XSIZE];
158 		    if (to && !to->vely && !to->velx) {
159 			unmake_object(curobj);
160 			if (i)
161 			    btorp++;
162 			else
163 			    etorp++;
164 		    }
165 		    isatorp[i][y][x]=0;
166 		}
167 	    }
168 	}
169 	move_universe();
170 	if (finish) {
171 	    finish--;
172 	    if (!finish && (!(numenemies || numos) || (!ent && !base))) {
173 		done = true;
174 		timer -= 5;
175 	    }
176 	}
177 	else if (!banging && (!(numenemies || numos) || (!ent && !base)))
178 	    finish = 5;
179     } while (!done);
180 }
181