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.4 rillig * 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.4 rillig * 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.4 rillig * 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.4 rillig * 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.4 rillig 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.4 rillig 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.4 rillig 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