us.c revision 1.3 1 1.2 kamil /* Header: us.c,v 7.0.1.3 87/01/13 17:13:21 lwall Exp */
2 1.1 kamil
3 1.2 kamil /* Log: us.c,v
4 1.1 kamil * Revision 7.0.1.3 87/01/13 17:13:21 lwall
5 1.1 kamil * Partially fixed ^S behavior. It now just ignores ^S.
6 1.1 kamil *
7 1.1 kamil * Revision 7.0.1.2 86/12/12 17:06:09 lwall
8 1.1 kamil * Baseline for net release.
9 1.1 kamil *
10 1.1 kamil * Revision 7.0.1.1 86/10/16 10:53:50 lwall
11 1.1 kamil * Added Damage. Fixed random bugs.
12 1.1 kamil *
13 1.1 kamil * Revision 7.0 86/10/08 15:14:21 lwall
14 1.1 kamil * Split into separate files. Added amoebas and pirates.
15 1.1 kamil *
16 1.1 kamil */
17 1.1 kamil
18 1.1 kamil #include "EXTERN.h"
19 1.1 kamil #include "warp.h"
20 1.1 kamil #include "bang.h"
21 1.1 kamil #include "object.h"
22 1.1 kamil #include "play.h"
23 1.1 kamil #include "sig.h"
24 1.1 kamil #include "term.h"
25 1.1 kamil #include "util.h"
26 1.1 kamil #include "weapon.h"
27 1.1 kamil #include "INTERN.h"
28 1.1 kamil #include "us.h"
29 1.1 kamil
30 1.1 kamil void
31 1.3 christos us_init(void)
32 1.1 kamil {
33 1.1 kamil ;
34 1.1 kamil }
35 1.1 kamil
36 1.1 kamil void
37 1.3 christos do_direction(int dy, int dx)
38 1.1 kamil {
39 1.3 christos int decr;
40 1.3 christos OBJECT *obj;
41 1.1 kamil
42 1.1 kamil if (status < 2) {
43 1.1 kamil if (cloaking) {
44 1.1 kamil char ch;
45 1.1 kamil
46 1.3 christos cloaked = false;
47 1.1 kamil ch = (ent->energy >= 500?'E':'e');
48 1.1 kamil if (ch != ent->image) {
49 1.1 kamil setimage(ent, ch);
50 1.1 kamil }
51 1.1 kamil }
52 1.1 kamil decr = 5+abs(evely)+abs(evelx)+tractor*tractor;
53 1.1 kamil if (ent->energy >= decr) {
54 1.1 kamil ent->energy -= decr;
55 1.1 kamil if (tractor) {
56 1.1 kamil if (!damage || !damflag[NOTRACTORS]) {
57 1.1 kamil if (!rand_mod(50)) {
58 1.1 kamil damage++;
59 1.1 kamil damflag[NOTRACTORS] = rand_mod(smarts+10)+2;
60 1.1 kamil }
61 1.1 kamil if (tract(ent,dy,dx,tractor)) {
62 1.1 kamil evely += tractor*dy;
63 1.1 kamil evelx += tractor*dx;
64 1.1 kamil }
65 1.1 kamil }
66 1.1 kamil }
67 1.1 kamil else if (!damage ||
68 1.1 kamil (!entmode && !damflag[NOIMPULSE]) ||
69 1.1 kamil (entmode && !damflag[NOWARP]) ) {
70 1.1 kamil if (!rand_mod(30+500/(abs(evely)+abs(evelx)+1))) {
71 1.1 kamil damage++;
72 1.1 kamil damflag[entmode?NOWARP:NOIMPULSE] = rand_mod(smarts+10)+2;
73 1.1 kamil }
74 1.1 kamil evely += dy;
75 1.1 kamil evelx += dx;
76 1.1 kamil }
77 1.1 kamil if (inumthols &&
78 1.1 kamil (obj=occupant[(ent->posy+evely+YSIZE00)%YSIZE]
79 1.1 kamil [(ent->posx+evelx+XSIZE00)%XSIZE] ) &&
80 1.1 kamil obj->type == Web)
81 1.1 kamil evely = evelx = 0;
82 1.1 kamil }
83 1.1 kamil }
84 1.1 kamil else if (status == 2) {
85 1.1 kamil decr = 500+abs(bvely)*5+abs(bvelx)*5+tractor*tractor*100;
86 1.1 kamil if (base->energy >= decr) {
87 1.1 kamil base->energy -= decr;
88 1.1 kamil if (tractor) {
89 1.1 kamil if (tract(base,dy,dx,tractor)) {
90 1.1 kamil bvely += tractor*dy;
91 1.1 kamil bvelx += tractor*dx;
92 1.1 kamil }
93 1.1 kamil }
94 1.1 kamil else {
95 1.1 kamil bvely += dy;
96 1.1 kamil bvelx += dx;
97 1.1 kamil }
98 1.1 kamil if (inumthols &&
99 1.1 kamil (obj=occupant[(base->posy+bvely+YSIZE00)%YSIZE]
100 1.1 kamil [(base->posx+bvelx+XSIZE00)%XSIZE] ) &&
101 1.1 kamil obj->type == Web)
102 1.1 kamil bvely = bvelx = 0;
103 1.1 kamil }
104 1.1 kamil }
105 1.1 kamil tractor = 0;
106 1.1 kamil }
107 1.1 kamil
108 1.1 kamil void
109 1.3 christos ctrl_direction(int dy, int dx)
110 1.1 kamil {
111 1.1 kamil if (status < 2) {
112 1.1 kamil if (cloaking) {
113 1.1 kamil char ch;
114 1.1 kamil
115 1.3 christos cloaked = false;
116 1.1 kamil ch = (ent->energy >= 500?'E':'e');
117 1.1 kamil if (ch != ent->image) {
118 1.1 kamil setimage(ent, ch);
119 1.1 kamil }
120 1.1 kamil }
121 1.1 kamil if (!damage || !damflag[NOPHASERS]) {
122 1.1 kamil if (!rand_mod(200)) {
123 1.1 kamil damage++;
124 1.1 kamil damflag[NOPHASERS] = rand_mod(smarts+10)+2;
125 1.1 kamil }
126 1.1 kamil fire_phaser(ent, dy, dx);
127 1.1 kamil }
128 1.1 kamil }
129 1.1 kamil else if (status == 2)
130 1.1 kamil fire_phaser(base, dy, dx);
131 1.1 kamil }
132 1.1 kamil
133 1.1 kamil void
134 1.3 christos shift_direction(int dy, int dx)
135 1.1 kamil {
136 1.1 kamil if (status < 2) {
137 1.1 kamil if (cloaking) {
138 1.1 kamil char ch;
139 1.1 kamil
140 1.3 christos cloaked = false;
141 1.1 kamil ch = (ent->energy >= 500?'E':'e');
142 1.1 kamil if (ch != ent->image) {
143 1.1 kamil setimage(ent, ch);
144 1.1 kamil }
145 1.1 kamil }
146 1.1 kamil if (!damage || !damflag[NOTORPS]) {
147 1.1 kamil if (!rand_mod(300)) {
148 1.1 kamil damage++;
149 1.1 kamil damflag[NOTORPS] = rand_mod(smarts+10)+2;
150 1.1 kamil }
151 1.1 kamil fire_torp(ent, dy, dx);
152 1.1 kamil }
153 1.1 kamil }
154 1.1 kamil else if (status == 2)
155 1.1 kamil fire_torp(base, dy, dx);
156 1.1 kamil }
157 1.1 kamil
158 1.1 kamil void
159 1.3 christos get_commands(bool *done)
160 1.1 kamil {
161 1.1 kamil static char ch[80];
162 1.3 christos int i;
163 1.3 christos int count;
164 1.3 christos bool ctrla = false;
165 1.1 kamil char numdestructs = 0, numzaps = 0;
166 1.1 kamil
167 1.1 kamil top:
168 1.3 christos while ((count = read_nd(ch,(sizeof ch)))) {
169 1.1 kamil for (i=0; i<count; i++) {
170 1.1 kamil if (ch[i] == 'Q') {
171 1.3 christos bombed_out = true;
172 1.3 christos *done = true;
173 1.3 christos keepgoing = false;
174 1.1 kamil return;
175 1.1 kamil }
176 1.1 kamil if (ch[i] == 'q' || ch[i] == BREAKCH || ch[i] == INTRCH) {
177 1.1 kamil int x;
178 1.1 kamil static char quest[] = "Do you wish to escape from reality? ";
179 1.1 kamil
180 1.1 kamil if (timer >= whenok) {
181 1.1 kamil mvaddstr(12,22,quest);
182 1.1 kamil do {
183 1.1 kamil getcmd(&ch[i]);
184 1.1 kamil } while (ch[i] != 'y' && ch[i] != 'n');
185 1.1 kamil if (ch[i] == 'y') {
186 1.3 christos bombed_out = true;
187 1.3 christos *done = true;
188 1.1 kamil return;
189 1.1 kamil }
190 1.1 kamil else {
191 1.1 kamil for (x=11; x<=28; x++) {
192 1.1 kamil mvaddch(12,x*2,
193 1.1 kamil occupant[11][x]
194 1.1 kamil ? occupant[11][x]->image
195 1.1 kamil : numamoebas
196 1.1 kamil ? amb[11][x]
197 1.1 kamil : ' ');
198 1.1 kamil addspace();
199 1.1 kamil }
200 1.1 kamil roundsleep(2);
201 1.1 kamil whenok = timer + 10;
202 1.1 kamil goto top;
203 1.1 kamil }
204 1.1 kamil }
205 1.1 kamil else {
206 1.1 kamil write(1,"\07",1);
207 1.1 kamil goto top;
208 1.1 kamil }
209 1.1 kamil }
210 1.1 kamil }
211 1.1 kamil for (i=0; i<count; i++) {
212 1.1 kamil if (ctrla) {
213 1.1 kamil switch (ch[i]) {
214 1.1 kamil case '1': case 'b':
215 1.1 kamil ctrl_direction(1, -1);
216 1.1 kamil break;
217 1.1 kamil case '2': case 'j':
218 1.1 kamil ctrl_direction(1, 0);
219 1.1 kamil break;
220 1.1 kamil case '3': case 'n':
221 1.1 kamil ctrl_direction(1, 1);
222 1.1 kamil break;
223 1.1 kamil case '4': case 'h':
224 1.1 kamil ctrl_direction(0, -1);
225 1.1 kamil break;
226 1.1 kamil case '6': case 'l':
227 1.1 kamil ctrl_direction(0, 1);
228 1.1 kamil break;
229 1.1 kamil case '7': case 'y':
230 1.1 kamil ctrl_direction(-1, -1);
231 1.1 kamil break;
232 1.1 kamil case '8': case 'k':
233 1.1 kamil ctrl_direction(-1, 0);
234 1.1 kamil break;
235 1.1 kamil case '9': case 'u':
236 1.1 kamil ctrl_direction(-1, 1);
237 1.1 kamil break;
238 1.1 kamil case 'r':
239 1.1 kamil rewrite();
240 1.1 kamil roundsleep(3);
241 1.3 christos ctrla = false;
242 1.1 kamil goto top;
243 1.1 kamil case 'w':
244 1.1 kamil clear();
245 1.1 kamil while (!input_pending())
246 1.1 kamil sleep(1);
247 1.1 kamil rewrite();
248 1.1 kamil roundsleep(3);
249 1.3 christos ctrla = false;
250 1.1 kamil goto top;
251 1.1 kamil #ifdef SIGTSTP
252 1.1 kamil case 'z':
253 1.1 kamil clear();
254 1.1 kamil mytstp();
255 1.1 kamil sleep(4);
256 1.3 christos ctrla = false;
257 1.1 kamil goto top;
258 1.1 kamil #endif
259 1.1 kamil default:
260 1.1 kamil break;
261 1.1 kamil }
262 1.3 christos ctrla = false;
263 1.1 kamil }
264 1.1 kamil else {
265 1.1 kamil switch (ch[i]) {
266 1.1 kamil case 'Z':
267 1.1 kamil clear();
268 1.1 kamil mytstp();
269 1.1 kamil sleep(4);
270 1.1 kamil goto top;
271 1.1 kamil case 'i':
272 1.1 kamil if (ent && (!damage || !damflag[NOIMPULSE])) {
273 1.1 kamil entmode = 0;
274 1.1 kamil status = 0;
275 1.1 kamil }
276 1.1 kamil break;
277 1.1 kamil case 'w':
278 1.1 kamil if (ent && (!damage || !damflag[NOWARP])) {
279 1.1 kamil entmode = 1;
280 1.1 kamil status = 1;
281 1.1 kamil }
282 1.1 kamil break;
283 1.1 kamil case 'p':
284 1.1 kamil if (base) {
285 1.1 kamil status = 2;
286 1.1 kamil }
287 1.1 kamil break;
288 1.1 kamil case 'o':
289 1.1 kamil if (status < 2) {
290 1.1 kamil if (base)
291 1.1 kamil status = 2;
292 1.1 kamil }
293 1.1 kamil else if (status == 2) {
294 1.1 kamil if (ent)
295 1.1 kamil status = entmode;
296 1.1 kamil }
297 1.1 kamil break;
298 1.1 kamil case 'v':
299 1.1 kamil if (ent) {
300 1.1 kamil status = entmode;
301 1.1 kamil }
302 1.3 christos cloaking=false;
303 1.3 christos cloaked=false;
304 1.1 kamil break;
305 1.1 kamil case 'c':
306 1.1 kamil if (ent) {
307 1.1 kamil status = entmode;
308 1.1 kamil if (ent->energy >= 250)
309 1.3 christos cloaking = true;
310 1.1 kamil }
311 1.1 kamil break;
312 1.1 kamil case 'z':
313 1.1 kamil if (ent && (!damage || !damflag[NOZAPPER])) {
314 1.1 kamil ++numzaps;
315 1.1 kamil if (!rand_mod(100/numzaps)) {
316 1.1 kamil damage++;
317 1.1 kamil damflag[NOZAPPER] = rand_mod(smarts+10)+2;
318 1.1 kamil }
319 1.1 kamil if (nxtbang && bangm[nxtbang-1] < 0)
320 1.1 kamil --nxtbang; /* consolidate zaps */
321 1.1 kamil make_blast(evely*2+ent->posy,evelx*2+ent->posx,
322 1.1 kamil -5000000L, 3*numzaps);
323 1.1 kamil ent->energy /= 2;
324 1.1 kamil }
325 1.1 kamil break;
326 1.1 kamil case 'D':
327 1.1 kamil if (status < 2 && (!damage || !damflag[NODESTRUCT])) {
328 1.1 kamil if (ent && !rand_mod(10)) {
329 1.1 kamil damage++;
330 1.1 kamil damflag[NODESTRUCT] = rand_mod(smarts+10)+2;
331 1.1 kamil }
332 1.1 kamil if (++numdestructs <= 2)
333 1.1 kamil make_blast(evely*2+ent->posy,evelx*2+ent->posx,
334 1.1 kamil 15000L, 3);
335 1.1 kamil ent->energy /= 4;
336 1.1 kamil }
337 1.1 kamil else if (status == 2) {
338 1.1 kamil if (numdestructs)
339 1.1 kamil base->energy = base->energy / 2;
340 1.1 kamil if (++numdestructs <= 2)
341 1.1 kamil make_blast(base->posy, base->posx, 15000L, 5);
342 1.1 kamil }
343 1.1 kamil break;
344 1.1 kamil case 'd':
345 1.1 kamil if ((!damage || !damflag[NODESTRUCT]) && (base||ent)) {
346 1.3 christos OBJECT *obj;
347 1.1 kamil int x, y;
348 1.1 kamil
349 1.1 kamil if (ent && !rand_mod(200)) {
350 1.1 kamil damage++;
351 1.1 kamil damflag[NODESTRUCT] = rand_mod(smarts+10)+2;
352 1.1 kamil }
353 1.1 kamil for (obj = root.prev;
354 1.1 kamil obj != &root;
355 1.1 kamil obj = obj->prev) {
356 1.1 kamil if (obj->image == '+') {
357 1.1 kamil blast[y=(obj->posy+obj->vely+YSIZE00)%YSIZE]
358 1.1 kamil [x=(obj->posx+obj->velx+XSIZE00)%XSIZE]
359 1.1 kamil += 1;
360 1.1 kamil yblasted[y] |= 1;
361 1.1 kamil xblasted[x] |= 1;
362 1.3 christos blasted = true;
363 1.1 kamil obj->mass = (massacre?3000:4000);
364 1.1 kamil }
365 1.1 kamil }
366 1.1 kamil }
367 1.1 kamil break;
368 1.1 kamil case 's':
369 1.1 kamil if ((!damage || !damflag[NODESTRUCT]) && (base||ent)) {
370 1.3 christos OBJECT *obj;
371 1.1 kamil if (ent && !rand_mod(200)) {
372 1.1 kamil damage++;
373 1.1 kamil damflag[NODESTRUCT] = rand_mod(smarts+10)+2;
374 1.1 kamil }
375 1.1 kamil for (obj = root.prev;
376 1.1 kamil obj->type == Torp || obj->type == Web ||
377 1.1 kamil obj->type == Star;
378 1.1 kamil obj = obj->prev) {
379 1.1 kamil if (obj->image == '+')
380 1.1 kamil obj->vely = obj->velx = 0;
381 1.1 kamil }
382 1.1 kamil }
383 1.1 kamil break;
384 1.1 kamil case '\001':
385 1.3 christos ctrla = true;
386 1.1 kamil break;
387 1.1 kamil case '\002':
388 1.1 kamil case '\003':
389 1.1 kamil case '\004':
390 1.1 kamil case '\005':
391 1.1 kamil case '\006':
392 1.1 kamil case '\007':
393 1.1 kamil case '\010':
394 1.1 kamil case '\011':
395 1.1 kamil case '\012':
396 1.1 kamil case '\013':
397 1.1 kamil case '\014':
398 1.1 kamil case '\015':
399 1.1 kamil case '\016':
400 1.1 kamil case '\017':
401 1.1 kamil case '\020':
402 1.1 kamil case '\021':
403 1.1 kamil case '\022':
404 1.1 kamil case '\023':
405 1.1 kamil case '\024':
406 1.1 kamil case '\025':
407 1.1 kamil case '\026':
408 1.1 kamil case '\027':
409 1.1 kamil case '\030':
410 1.1 kamil case '\031':
411 1.1 kamil case '\032':
412 1.1 kamil ch[i] += 96;
413 1.1 kamil i--;
414 1.3 christos ctrla = true;
415 1.1 kamil break;
416 1.1 kamil case '\033':
417 1.1 kamil tractor = 0;
418 1.1 kamil break;
419 1.1 kamil case 'a':
420 1.1 kamil tractor++;
421 1.1 kamil break;
422 1.1 kamil case 'r':
423 1.1 kamil tractor--;
424 1.1 kamil break;
425 1.1 kamil case '1': case 'b':
426 1.1 kamil do_direction(1,-1);
427 1.1 kamil break;
428 1.1 kamil case '2': case 'j':
429 1.1 kamil do_direction(1,0);
430 1.1 kamil break;
431 1.1 kamil case '3': case 'n':
432 1.1 kamil do_direction(1,1);
433 1.1 kamil break;
434 1.1 kamil case '4': case 'h':
435 1.1 kamil do_direction(0,-1);
436 1.1 kamil break;
437 1.1 kamil case '6': case 'l':
438 1.1 kamil do_direction(0,1);
439 1.1 kamil break;
440 1.1 kamil case '7': case 'y':
441 1.1 kamil do_direction(-1,-1);
442 1.1 kamil break;
443 1.1 kamil case '8': case 'k':
444 1.1 kamil do_direction(-1,0);
445 1.1 kamil break;
446 1.1 kamil case '9': case 'u':
447 1.1 kamil do_direction(-1,1);
448 1.1 kamil break;
449 1.1 kamil case '0': case 'S':
450 1.1 kamil if (status < 2) {
451 1.1 kamil evely = 0;
452 1.1 kamil evelx = 0;
453 1.1 kamil }
454 1.1 kamil break;
455 1.1 kamil case '-':
456 1.1 kamil if (status < 2 && ent->energy >= 10) {
457 1.1 kamil evely *= -1;
458 1.1 kamil evelx *= -1;
459 1.1 kamil ent->energy -= 10;
460 1.1 kamil }
461 1.1 kamil break;
462 1.1 kamil case '%': case '\177': case '_':
463 1.1 kamil shift_direction(0, -1);
464 1.1 kamil shift_direction(0, 1);
465 1.1 kamil shift_direction(-1, 0);
466 1.1 kamil shift_direction(1, 0);
467 1.1 kamil shift_direction(-1, -1);
468 1.1 kamil shift_direction(-1, 1);
469 1.1 kamil shift_direction(1, -1);
470 1.1 kamil shift_direction(1, 1);
471 1.1 kamil break;
472 1.1 kamil case '!': case 'B':
473 1.1 kamil shift_direction(1, -1);
474 1.1 kamil break;
475 1.1 kamil case '@': case 'J':
476 1.1 kamil shift_direction(1, 0);
477 1.1 kamil break;
478 1.1 kamil case '#': case 'N':
479 1.1 kamil shift_direction(1, 1);
480 1.1 kamil break;
481 1.1 kamil case '$': case 'H':
482 1.1 kamil shift_direction(0, -1);
483 1.1 kamil break;
484 1.1 kamil case '^': case 'L':
485 1.1 kamil shift_direction(0, 1);
486 1.1 kamil break;
487 1.1 kamil case '&': case 'Y':
488 1.1 kamil shift_direction(-1, -1);
489 1.1 kamil break;
490 1.1 kamil case '*': case 'K':
491 1.1 kamil shift_direction(-1, 0);
492 1.1 kamil break;
493 1.1 kamil case '(': case 'U':
494 1.1 kamil shift_direction(-1, 1);
495 1.1 kamil break;
496 1.1 kamil case '?':
497 1.1 kamil helper();
498 1.1 kamil roundsleep(3);
499 1.1 kamil goto top;
500 1.1 kamil default:
501 1.1 kamil break;
502 1.1 kamil }
503 1.1 kamil }
504 1.1 kamil }
505 1.1 kamil }
506 1.1 kamil }
507