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