Home | History | Annotate | Line # | Download | only in warp
move.c revision 1.1
      1  1.1  kamil /* $Header: /tank/opengrok/rsync2/NetBSD/src/games/warp/move.c,v 1.1 2020/11/09 23:37:05 kamil Exp $ */
      2  1.1  kamil 
      3  1.1  kamil /* $Log: move.c,v $
      4  1.1  kamil /* Revision 1.1  2020/11/09 23:37:05  kamil
      5  1.1  kamil /* Add Warp Kit, Version 7.0 by Larry Wall
      6  1.1  kamil /*
      7  1.1  kamil /* Warp is a real-time space war game that doesn't get boring very quickly.
      8  1.1  kamil /* Read warp.doc and the manual page for more information.
      9  1.1  kamil /*
     10  1.1  kamil /* games/warp originally distributed with 4.3BSD-Reno, is back to the BSD
     11  1.1  kamil /* world via NetBSD. Its remnants were still mentioned in games/Makefile.
     12  1.1  kamil /*
     13  1.1  kamil /* Larry Wall, the original author and the copyright holder, generously
     14  1.1  kamil /* donated the game and copyright to The NetBSD Foundation, Inc.
     15  1.1  kamil /*
     16  1.1  kamil /* Import the game sources as-is from 4.3BSD-Reno, with the cession
     17  1.1  kamil /* of the copyright and license to BSD-2-clause NetBSD-style.
     18  1.1  kamil /*
     19  1.1  kamil /* Signed-off-by: Larry Wall <larry (at) wall.org>
     20  1.1  kamil /* Signed-off-by: Kamil Rytarowski <kamil (at) netbsd.org>
     21  1.1  kamil /*
     22  1.1  kamil  * Revision 7.0.1.2  86/10/20  14:37:06  lwall
     23  1.1  kamil  * Picked some lint.
     24  1.1  kamil  *
     25  1.1  kamil  * Revision 7.0.1.1  86/10/16  10:52:09  lwall
     26  1.1  kamil  * Added Damage.  Fixed random bugs.
     27  1.1  kamil  *
     28  1.1  kamil  * Revision 7.0  86/10/08  15:12:40  lwall
     29  1.1  kamil  * Split into separate files.  Added amoebas and pirates.
     30  1.1  kamil  *
     31  1.1  kamil  */
     32  1.1  kamil 
     33  1.1  kamil #include "EXTERN.h"
     34  1.1  kamil #include "warp.h"
     35  1.1  kamil #include "bang.h"
     36  1.1  kamil #include "object.h"
     37  1.1  kamil #include "move.h"
     38  1.1  kamil #include "play.h"
     39  1.1  kamil #include "score.h"
     40  1.1  kamil #include "term.h"
     41  1.1  kamil #include "them.h"
     42  1.1  kamil #include "us.h"
     43  1.1  kamil #include "util.h"
     44  1.1  kamil #include "weapon.h"
     45  1.1  kamil #include "INTERN.h"
     46  1.1  kamil #include "move.h"
     47  1.1  kamil 
     48  1.1  kamil void
     49  1.1  kamil move_init()
     50  1.1  kamil {
     51  1.1  kamil     ;
     52  1.1  kamil }
     53  1.1  kamil 
     54  1.1  kamil void
     55  1.1  kamil bounce(obj)
     56  1.1  kamil Reg4 OBJECT *obj;
     57  1.1  kamil {
     58  1.1  kamil     Reg1 int x;
     59  1.1  kamil     Reg2 int y;
     60  1.1  kamil     Reg3 int count=0;
     61  1.1  kamil 
     62  1.1  kamil     y = (obj->posy - sgn(obj->vely) + YSIZE00) % YSIZE;
     63  1.1  kamil     x = (obj->posx - sgn(obj->velx) + XSIZE00) % XSIZE;
     64  1.1  kamil     while (occupant[y][x]) {
     65  1.1  kamil 	y = (y + rand_mod(3) - 1 + YSIZE00) % YSIZE;
     66  1.1  kamil 	x = (x + rand_mod(3) - 1 + XSIZE00) % XSIZE;
     67  1.1  kamil 	if (++count > 10000) {     /* if universe full, get out of it fast */
     68  1.1  kamil 	    unmake_object(obj);
     69  1.1  kamil 	    if (ent) unmake_object(ent);
     70  1.1  kamil 	    if (base) unmake_object(base);
     71  1.1  kamil 	    finish = 1;
     72  1.1  kamil 	    return;
     73  1.1  kamil 	}
     74  1.1  kamil     }
     75  1.1  kamil     obj->posy = y;
     76  1.1  kamil     obj->posx = x;
     77  1.1  kamil     obj->vely = 0;
     78  1.1  kamil     obj->velx = 0;
     79  1.1  kamil     occupant[y][x] = obj;
     80  1.1  kamil     if (numamoebas && obj->image == ' ')
     81  1.1  kamil 	mvaddc(y+1, x*2, amb[y][x]);
     82  1.1  kamil     else
     83  1.1  kamil 	mvaddc(y+1, x*2, obj->image);
     84  1.1  kamil }
     85  1.1  kamil 
     86  1.1  kamil void
     87  1.1  kamil move_universe()
     88  1.1  kamil {
     89  1.1  kamil     Reg1 OBJECT *curobj;
     90  1.1  kamil     Reg2 int x;
     91  1.1  kamil     Reg3 int y;
     92  1.1  kamil     Reg4 OBJECT *temp;
     93  1.1  kamil     OBJECT *thenext;
     94  1.1  kamil 
     95  1.1  kamil     for (curobj = movers; curobj != &root; curobj = curobj->next) {
     96  1.1  kamil 	x = curobj->posx;
     97  1.1  kamil 	y = curobj->posy;
     98  1.1  kamil 	if (curobj == occupant[y][x]) {
     99  1.1  kamil 	    occupant[y][x] = 0;
    100  1.1  kamil 	}
    101  1.1  kamil 	else if (curobj->type != Torp && curobj->type != Web) {
    102  1.1  kamil 	    resetty();
    103  1.1  kamil 	    abort();
    104  1.1  kamil 	}
    105  1.1  kamil     }
    106  1.1  kamil     for (curobj = movers; curobj != &root; curobj = thenext) {
    107  1.1  kamil 	thenext = curobj->next;
    108  1.1  kamil 	if (curobj->vely || curobj->velx) {
    109  1.1  kamil 	    y = curobj->posy;
    110  1.1  kamil 	    x = curobj->posx;
    111  1.1  kamil 	    if (curobj->image != ' ' &&
    112  1.1  kamil 	      (!(temp=occupant[y][x]) || temp->image==' ') ) {
    113  1.1  kamil 		move(y+1, x*2, numamoebas ? amb[y][x] : ' ');
    114  1.1  kamil 	    }
    115  1.1  kamil 	    y = (y + curobj->vely + YSIZE00) % YSIZE;
    116  1.1  kamil 	    x = (x + curobj->velx + XSIZE00) % XSIZE;
    117  1.1  kamil 	    if (!(temp=occupant[y][x]) || temp->type != Star ||
    118  1.1  kamil 	      curobj->type != Torp || curobj->image == '+' ||
    119  1.1  kamil 	      curobj->image == 'x') {
    120  1.1  kamil 		curobj->posy = y;
    121  1.1  kamil 		curobj->posx = x;
    122  1.1  kamil 	    }
    123  1.1  kamil 	    else {
    124  1.1  kamil 		if (curobj->image == '0') {
    125  1.1  kamil 		    curobj->vely = rand_mod(3)-1;
    126  1.1  kamil 		    curobj->velx = rand_mod(3)-1;
    127  1.1  kamil 		}
    128  1.1  kamil 		else
    129  1.1  kamil 		    curobj->vely = curobj->velx = 0;
    130  1.1  kamil 		y = curobj->posy;
    131  1.1  kamil 		x = curobj->posx;
    132  1.1  kamil 	    }
    133  1.1  kamil 	}
    134  1.1  kamil 	else {			/* not moving */
    135  1.1  kamil 	    y = curobj->posy;
    136  1.1  kamil 	    x = curobj->posx;
    137  1.1  kamil 	    if (curobj->type == Torp ||
    138  1.1  kamil 		curobj->type == Star ||
    139  1.1  kamil 		curobj->type == Web) {
    140  1.1  kamil 		curobj->flags |= STATIC;
    141  1.1  kamil 		curobj->next->prev = curobj->prev;
    142  1.1  kamil 		curobj->prev->next = curobj->next;
    143  1.1  kamil 		curobj->prev = movers->prev;
    144  1.1  kamil 		curobj->next = movers;
    145  1.1  kamil 		movers->prev->next = curobj;
    146  1.1  kamil 		movers->prev = curobj;
    147  1.1  kamil 	    }
    148  1.1  kamil 	}
    149  1.1  kamil 	if (temp = occupant[y][x]) {		/* already occupied? */
    150  1.1  kamil 	    if (!temp->contend) {
    151  1.1  kamil 		if (temp->type == Torp) {
    152  1.1  kamil 		    if (temp->image == '+')
    153  1.1  kamil 			blast[y][x] += 1250;
    154  1.1  kamil 		    else if (temp->image == 'o' && (base||ent))
    155  1.1  kamil 			blast[y][x] += 500+super*20;
    156  1.1  kamil 		    else if (temp->image == 'O' && (base||ent))
    157  1.1  kamil 			blast[y][x] += 5000+super*100;
    158  1.1  kamil 		}
    159  1.1  kamil 	    }
    160  1.1  kamil 	    yblasted[y] |= 1;
    161  1.1  kamil 	    xblasted[x] |= 1;
    162  1.1  kamil 	    blasted = TRUE;
    163  1.1  kamil 	    curobj->contend = temp;
    164  1.1  kamil 	    occupant[y][x] = curobj;
    165  1.1  kamil 	    switch (curobj->type) {
    166  1.1  kamil 	    case Enemy:
    167  1.1  kamil 		if (numamoebas && curobj == nuke && temp->image == '+')
    168  1.1  kamil 		    blast[y][x] += 80000;
    169  1.1  kamil 		else if (temp->type == Enemy)
    170  1.1  kamil 		    blast[y][x] += 10;
    171  1.1  kamil 		else
    172  1.1  kamil 		    goto defblast;
    173  1.1  kamil 		break;
    174  1.1  kamil 	    case Crusher:
    175  1.1  kamil 		if (curobj->velx)
    176  1.1  kamil 		    blast[y][x] += 100000;
    177  1.1  kamil 		else
    178  1.1  kamil 		    goto defblast;
    179  1.1  kamil 		break;
    180  1.1  kamil 	    case Torp:
    181  1.1  kamil 		if (curobj->image == '+')
    182  1.1  kamil 		    blast[y][x] += (temp==nuke ? 80000 : 1250);
    183  1.1  kamil 		else if (curobj->image == 'o')
    184  1.1  kamil 		    blast[y][x] += 500+super*20;
    185  1.1  kamil 		else if (curobj->image == 'O')
    186  1.1  kamil 		    blast[y][x] += 5000+super*100;
    187  1.1  kamil 		goto defblast;
    188  1.1  kamil 	    case Star:
    189  1.1  kamil 		if (temp == ent)
    190  1.1  kamil 		    goto damshield;
    191  1.1  kamil 		goto defblast;
    192  1.1  kamil 	    case Enterprise:
    193  1.1  kamil 		if (temp->type == Star) {
    194  1.1  kamil 	      damshield:
    195  1.1  kamil 		    if (!rand_mod(10)) {
    196  1.1  kamil 			if (!damflag[NOSHIELDS])
    197  1.1  kamil 			    damage++;
    198  1.1  kamil 			if (damflag[NOSHIELDS] < 100)
    199  1.1  kamil 			    damflag[NOSHIELDS] += rand_mod(smarts)/5+2;
    200  1.1  kamil 		    }
    201  1.1  kamil 		}
    202  1.1  kamil 		goto defblast;
    203  1.1  kamil 	    default:
    204  1.1  kamil 	      defblast:
    205  1.1  kamil 		blast[y][x] += rand_mod(751)+1;
    206  1.1  kamil 		break;
    207  1.1  kamil 	    }
    208  1.1  kamil 	}
    209  1.1  kamil 	else {
    210  1.1  kamil 	    occupant[y][x] = curobj;
    211  1.1  kamil 	    if (curobj->image != ' ' &&
    212  1.1  kamil 	        (curobj->velx || curobj->vely ||
    213  1.1  kamil 		 curobj->type == Torp || curobj->type == Web) ) {
    214  1.1  kamil 		mvaddc(y+1, x*2, curobj->image);
    215  1.1  kamil 	    }
    216  1.1  kamil 	    if (curobj->type == Crusher && curobj->velx) {
    217  1.1  kamil 		blast[y][x] += 100000;
    218  1.1  kamil 		yblasted[y] |= 1;
    219  1.1  kamil 		xblasted[x] |= 1;
    220  1.1  kamil 		blasted = TRUE;
    221  1.1  kamil 	    }
    222  1.1  kamil 	}
    223  1.1  kamil     }
    224  1.1  kamil     if (blasted) {
    225  1.1  kamil 	Reg7 int minxblast = -1;
    226  1.1  kamil 	Reg8 int maxxblast = -2;
    227  1.1  kamil 	Reg5 long tmpblast;
    228  1.1  kamil 
    229  1.1  kamil 	blasted = numamoebas;
    230  1.1  kamil 	for (x=0; x<XSIZE; x++) {
    231  1.1  kamil 	    if (xblasted[x]) {
    232  1.1  kamil 		xblasted[x] = 0;
    233  1.1  kamil 		maxxblast = x;
    234  1.1  kamil 		if (minxblast < 0)
    235  1.1  kamil 		    minxblast = x;
    236  1.1  kamil 	    }
    237  1.1  kamil 	}
    238  1.1  kamil 	for (y=0; y<YSIZE; y++) {
    239  1.1  kamil 	    if (yblasted[y]) {
    240  1.1  kamil 		yblasted[y] = 0;
    241  1.1  kamil 		for (x=minxblast; x<=maxxblast; x++) {
    242  1.1  kamil 		    tmpblast = blast[y][x];
    243  1.1  kamil 		    if (numamoebas && amb[y][x] == '~') {
    244  1.1  kamil 			if (temp = occupant[y][x]) {
    245  1.1  kamil 			    if (temp->image == '&')
    246  1.1  kamil 				tmpblast >>= 1;
    247  1.1  kamil 			    else if (temp->type == Web)
    248  1.1  kamil 				tmpblast = 100000;
    249  1.1  kamil 			    else
    250  1.1  kamil 				tmpblast += 50 + temp->energy/100;
    251  1.1  kamil 			    if (tmpblast > 250 && !rand_mod(5+(inumstars>>4)))
    252  1.1  kamil 				modify_amoeba(y,x,1,'~',5);
    253  1.1  kamil 			}
    254  1.1  kamil 			xblasted[x] = 2;
    255  1.1  kamil 			yblasted[y] = 2;
    256  1.1  kamil 		    }
    257  1.1  kamil 		    if (tmpblast) {
    258  1.1  kamil 			Reg6 OBJECT *biggie = 0;
    259  1.1  kamil 
    260  1.1  kamil 			blast[y][x] = 0;
    261  1.1  kamil 			temp = occupant[y][x];
    262  1.1  kamil 			if (tmpblast < 0) {
    263  1.1  kamil 			    if (numamoebas && tmpblast < -1000000 &&
    264  1.1  kamil 				amb[y][x] == '~' && temp != nuke) {
    265  1.1  kamil 				amb[y][x] = ' ';
    266  1.1  kamil 				if (!temp)
    267  1.1  kamil 				    make_plink(y,x);
    268  1.1  kamil 				ambsize--;
    269  1.1  kamil 			    }
    270  1.1  kamil 			    tmpblast = 0;
    271  1.1  kamil 			}
    272  1.1  kamil 			if (temp) {
    273  1.1  kamil 			    if ((!numamoebas || amb[y][x]==' ') &&
    274  1.1  kamil 			      tmpblast < 100000)
    275  1.1  kamil 				make_plink(y,x);
    276  1.1  kamil 			    for ( ;temp;
    277  1.1  kamil 			      temp = curobj->contend,curobj->contend = 0){
    278  1.1  kamil 				curobj = temp;
    279  1.1  kamil 				switch (curobj->type) {
    280  1.1  kamil 				case Enterprise: {
    281  1.1  kamil 				    long tmp = curobj->energy;
    282  1.1  kamil 
    283  1.1  kamil 				    if (ent->energy>500 || apolloflag & 1)
    284  1.1  kamil 					curobj->energy -= tmpblast /
    285  1.1  kamil 					   ((apolloflag & 1)
    286  1.1  kamil 					    ? 20
    287  1.1  kamil 					    : (5+abs(ent->velx)+abs(ent->vely))
    288  1.1  kamil 					       / ((damflag[NOSHIELDS]>>3)+1)+1);
    289  1.1  kamil 				    else
    290  1.1  kamil 					curobj->energy -= tmpblast;
    291  1.1  kamil 				    if (rand_mod(1 + tmp - curobj->energy) > 100
    292  1.1  kamil 					|| ent->energy < (entmax>>1)) {
    293  1.1  kamil 					if (debug & 128 ||
    294  1.1  kamil 					  (damage <= smarts/10 &&
    295  1.1  kamil 					   !rand_mod(6-smarts/20-massacre) )) {
    296  1.1  kamil 					    tmp = rand_mod(MAXDAMAGE);
    297  1.1  kamil 					    if (damflag[tmp]) {
    298  1.1  kamil 						if (damflag[tmp] < 60)
    299  1.1  kamil 						  damflag[tmp] += rand_mod(60);
    300  1.1  kamil 					    }
    301  1.1  kamil 					    else {
    302  1.1  kamil 						damflag[tmp] =
    303  1.1  kamil 						  rand_mod(smarts+10)+2;
    304  1.1  kamil 						damage++;
    305  1.1  kamil 					    }
    306  1.1  kamil 					}
    307  1.1  kamil 				    }
    308  1.1  kamil 				    break;
    309  1.1  kamil 				}
    310  1.1  kamil 				case Base:
    311  1.1  kamil 				    if (base->energy > 1000 || apolloflag & 2)
    312  1.1  kamil 					curobj->energy -= tmpblast /
    313  1.1  kamil 					   ((apolloflag & 2)?20:5);
    314  1.1  kamil 				    else
    315  1.1  kamil 					curobj->energy -= tmpblast;
    316  1.1  kamil 				    break;
    317  1.1  kamil 				case Crusher:
    318  1.1  kamil 				    if (tmpblast > 132767)
    319  1.1  kamil 					curobj->energy -= (tmpblast - 100000);
    320  1.1  kamil 				    else if (tmpblast >= 100000) {
    321  1.1  kamil 					curobj->energy += (tmpblast - 100000);
    322  1.1  kamil 					if (curobj->energy > 32767)
    323  1.1  kamil 					    curobj->energy = 32767;
    324  1.1  kamil 				    }
    325  1.1  kamil 				    else	/* vulnerable while feeding */
    326  1.1  kamil 					curobj->energy -= tmpblast;
    327  1.1  kamil 				    break;
    328  1.1  kamil 				case Enemy:
    329  1.1  kamil 				    curobj->energy -= tmpblast*10/enemshields;
    330  1.1  kamil 				    break;
    331  1.1  kamil 				default:
    332  1.1  kamil 				    curobj->energy -= tmpblast;
    333  1.1  kamil 				    break;
    334  1.1  kamil 				}
    335  1.1  kamil 				if (curobj->energy < 0) {	/* killed it? */
    336  1.1  kamil 				    switch (curobj->image) {
    337  1.1  kamil 				    case 'A':
    338  1.1  kamil 					tmpblast = 100000;
    339  1.1  kamil 					make_blast(y,x,8192L,1);
    340  1.1  kamil 					numapollos = apolloflag = 0;
    341  1.1  kamil 					numstars--;
    342  1.1  kamil 					numenemies--;
    343  1.1  kamil 					curscore += 5000;
    344  1.1  kamil 					deados = 0;
    345  1.1  kamil 					break;
    346  1.1  kamil 				    case 'E': case 'e': case 'C': case 'c':
    347  1.1  kamil 					ent = 0;
    348  1.1  kamil 					numents--;
    349  1.1  kamil 					if (base)
    350  1.1  kamil 					    status = 2;
    351  1.1  kamil 					else
    352  1.1  kamil 					    status = 3;
    353  1.1  kamil 					deados = 0;
    354  1.1  kamil 					break;
    355  1.1  kamil 				    case 'B': case 'b':
    356  1.1  kamil 					base = 0;
    357  1.1  kamil 					numbases--;
    358  1.1  kamil 					if (ent)
    359  1.1  kamil 					    status = entmode;
    360  1.1  kamil 					else
    361  1.1  kamil 					    status = 3;
    362  1.1  kamil 					deados = 0;
    363  1.1  kamil 					break;
    364  1.1  kamil 				    case '&': {
    365  1.1  kamil 					int i, xxx, yyy;
    366  1.1  kamil 
    367  1.1  kamil 					for (i = 0; i < YSIZE; i++)
    368  1.1  kamil 					    yblasted[i] &= 1;
    369  1.1  kamil 					for (i = 0; i < XSIZE; i++)
    370  1.1  kamil 					    xblasted[i] &= 1;
    371  1.1  kamil 					numamoebas = 0;	/* ignore amb[][] now */
    372  1.1  kamil 					for (yyy = 0; yyy < YSIZE; yyy++) {
    373  1.1  kamil 					    for (xxx = 0; xxx < XSIZE; xxx++) {
    374  1.1  kamil 						if (amb[yyy][xxx] == '~' &&
    375  1.1  kamil 						    !occupant[yyy][xxx]) {
    376  1.1  kamil 						    mvaddch(yyy+1,xxx*2,' ');
    377  1.1  kamil 						}
    378  1.1  kamil 					    }
    379  1.1  kamil 					}
    380  1.1  kamil 					numenemies--;
    381  1.1  kamil 					curscore += 10000;
    382  1.1  kamil 					if (curobj == enemies)
    383  1.1  kamil 					    enemies = curobj->next;
    384  1.1  kamil 					deados = 0;
    385  1.1  kamil 					break;
    386  1.1  kamil 				    }
    387  1.1  kamil 				    case '<': case '>': {
    388  1.1  kamil 					int i;
    389  1.1  kamil 
    390  1.1  kamil 					numenemies--;
    391  1.1  kamil 					numcrushes = 0;
    392  1.1  kamil 					curscore += 10000;
    393  1.1  kamil 					if (curobj == movers)
    394  1.1  kamil 					    movers = curobj->next;
    395  1.1  kamil 					if (curobj == enemies)
    396  1.1  kamil 					    enemies = curobj->next;
    397  1.1  kamil 					deados = 0;
    398  1.1  kamil 
    399  1.1  kamil 					tmpblast = 100000;
    400  1.1  kamil 					make_blast(y,(x+XSIZE00)%XSIZE,10000L,0);
    401  1.1  kamil 					if (curobj->image == '<') {
    402  1.1  kamil 					    for (i=XSIZE00; i<=XSIZE01; i++)
    403  1.1  kamil 						make_blast(y,(x+i)%XSIZE,
    404  1.1  kamil 						    10000L,0);
    405  1.1  kamil 					    for (i=XSIZE00; i<=XSIZE02; i++)
    406  1.1  kamil 						make_blast(y,(x+i)%XSIZE,
    407  1.1  kamil 						    10000L,0);
    408  1.1  kamil 					    make_blast(y,(x+XSIZE03)%XSIZE,
    409  1.1  kamil 						10000L,1);
    410  1.1  kamil 					    for (i=XSIZE00; i<=XSIZE08; i++)
    411  1.1  kamil 						make_blast(y,(x+i)%XSIZE,
    412  1.1  kamil 						    10000L,0);
    413  1.1  kamil 					}
    414  1.1  kamil 					else {
    415  1.1  kamil 					    for (i=XSIZE00; i>=XSIZE99; i--)
    416  1.1  kamil 						make_blast(y,(x+i)%XSIZE,
    417  1.1  kamil 						    10000L,0);
    418  1.1  kamil 					    for (i=XSIZE00; i>=XSIZE98; i--)
    419  1.1  kamil 						make_blast(y,(x+i)%XSIZE,
    420  1.1  kamil 						    10000L,0);
    421  1.1  kamil 					    make_blast(y,(x+XSIZE97)%XSIZE,
    422  1.1  kamil 						10000L,1);
    423  1.1  kamil 					    for (i=XSIZE00; i>=XSIZE92; i--)
    424  1.1  kamil 						make_blast(y,(x+i)%XSIZE,
    425  1.1  kamil 						    10000L,0);
    426  1.1  kamil 					}
    427  1.1  kamil 				    }
    428  1.1  kamil 				    break;
    429  1.1  kamil 				    case 'K':
    430  1.1  kamil 					numenemies--;
    431  1.1  kamil 					curscore += curobj->mass;
    432  1.1  kamil 					if (curobj == enemies)
    433  1.1  kamil 					    enemies = curobj->next;
    434  1.1  kamil 					deados = 0;
    435  1.1  kamil 					break;
    436  1.1  kamil 				    case 'T':
    437  1.1  kamil 					numenemies--;
    438  1.1  kamil 					curscore += curobj->mass*3/2;
    439  1.1  kamil 					if (curobj == enemies)
    440  1.1  kamil 					    enemies = curobj->next;
    441  1.1  kamil 					deados = 0;
    442  1.1  kamil 					break;
    443  1.1  kamil 				    case 'R': case ' ': case 'P':
    444  1.1  kamil 					numenemies--;
    445  1.1  kamil 					if (curobj->flags & PIRATE)
    446  1.1  kamil 					    curscore += curobj->mass;
    447  1.1  kamil 					else
    448  1.1  kamil 					    curscore += curobj->mass*3;
    449  1.1  kamil 					if (curobj == enemies)
    450  1.1  kamil 					    enemies = curobj->next;
    451  1.1  kamil 					deados = 0;
    452  1.1  kamil 					break;
    453  1.1  kamil 				    case 'G':
    454  1.1  kamil 					numenemies--;
    455  1.1  kamil 					numgorns--;
    456  1.1  kamil 					tmpblast = 100000;
    457  1.1  kamil 					if (madgorns)
    458  1.1  kamil 					    curscore += curobj->mass/2;
    459  1.1  kamil 					else
    460  1.1  kamil 					    curscore += curobj->mass*2;
    461  1.1  kamil 					if (curobj == enemies)
    462  1.1  kamil 					    enemies = curobj->next;
    463  1.1  kamil 					{
    464  1.1  kamil 					    int xxx,yyy;
    465  1.1  kamil 
    466  1.1  kamil 					    for (xxx = -1; xxx<=1; xxx++)
    467  1.1  kamil 						for (yyy = -1; yyy<=1; yyy++)
    468  1.1  kamil 						    if (rand_mod(2+massacre))
    469  1.1  kamil 							fire_torp(curobj,
    470  1.1  kamil 							    yyy,xxx);
    471  1.1  kamil 					}
    472  1.1  kamil 					deados = 0;
    473  1.1  kamil 					break;
    474  1.1  kamil 				    case '@':
    475  1.1  kamil 					numinhab--;
    476  1.1  kamil 					/* FALL THROUGH */
    477  1.1  kamil 				    case '*':
    478  1.1  kamil 					banging = TRUE;
    479  1.1  kamil 					numstars--;
    480  1.1  kamil 					break;
    481  1.1  kamil 				    case '|': case '-': case '/': case '\\':
    482  1.1  kamil 					tmpblast = 100000;
    483  1.1  kamil 					make_blast(y,x,curobj->mass,1);
    484  1.1  kamil 					banging = TRUE;
    485  1.1  kamil 					deados = 0;
    486  1.1  kamil 					break;
    487  1.1  kamil 				    case 'x':
    488  1.1  kamil 					curscore += 10;
    489  1.1  kamil 					deados = 0;
    490  1.1  kamil 					break;
    491  1.1  kamil 				    case 'X':
    492  1.1  kamil 					curscore += 100;
    493  1.1  kamil 					numxes--;
    494  1.1  kamil 					deados = 0;
    495  1.1  kamil 					break;
    496  1.1  kamil 				    case '0':
    497  1.1  kamil 					curscore += 35;
    498  1.1  kamil 					numos--;
    499  1.1  kamil 					deados += 3;
    500  1.1  kamil 					break;
    501  1.1  kamil 				    case 'o':
    502  1.1  kamil 					curscore += 100;
    503  1.1  kamil 					numos--;
    504  1.1  kamil 					deados++;
    505  1.1  kamil 					break;
    506  1.1  kamil 				    case 'O':
    507  1.1  kamil 					curscore += 200;
    508  1.1  kamil 					numos--;
    509  1.1  kamil 					deados += 2;
    510  1.1  kamil 					break;
    511  1.1  kamil 				    case 'M':
    512  1.1  kamil 					deadmudds++;
    513  1.1  kamil 					inumfriends--;
    514  1.1  kamil 					numfriends--;
    515  1.1  kamil 					if (curobj == enemies)
    516  1.1  kamil 					    enemies = curobj->next;
    517  1.1  kamil 					break;
    518  1.1  kamil 				    case 'Q': case 'W': case 'Y': case 'U':
    519  1.1  kamil 				    case 'I': case 'S': case 'D': case 'H':
    520  1.1  kamil 				    case 'J': case 'L': case 'Z': case 'V':
    521  1.1  kamil 				    case 'F':
    522  1.1  kamil 					numfriends--;
    523  1.1  kamil 					if (curobj == enemies)
    524  1.1  kamil 					    enemies = curobj->next;
    525  1.1  kamil 					if (inumfriends < 10)
    526  1.1  kamil 					    madfriends += 500;
    527  1.1  kamil 					else
    528  1.1  kamil 					    madfriends += 10000/inumfriends;
    529  1.1  kamil 					break;
    530  1.1  kamil 				    }
    531  1.1  kamil 				    if (tmpblast < 100000)
    532  1.1  kamil 					make_blast(y,x,curobj->mass,1);
    533  1.1  kamil 				    unmake_object(curobj);
    534  1.1  kamil 				}
    535  1.1  kamil 				else {		/* didn't kill anything */
    536  1.1  kamil 				    if (!biggie)
    537  1.1  kamil 					biggie = curobj;
    538  1.1  kamil 				    else {
    539  1.1  kamil 					if (biggie->mass > curobj->mass)
    540  1.1  kamil 					    bounce(curobj);
    541  1.1  kamil 					else {
    542  1.1  kamil 					    bounce(biggie);
    543  1.1  kamil 					    biggie = curobj;
    544  1.1  kamil 					}
    545  1.1  kamil 				    }
    546  1.1  kamil 				}
    547  1.1  kamil 			    }
    548  1.1  kamil 			    if (biggie) {
    549  1.1  kamil 				occupant[y][x] = biggie;
    550  1.1  kamil 				if (numamoebas && biggie->image == ' ')
    551  1.1  kamil 				    mvaddch(y+1,x*2, amb[y][x]);
    552  1.1  kamil 				else
    553  1.1  kamil 				    mvaddch(y+1,x*2, biggie->image);
    554  1.1  kamil 			    }
    555  1.1  kamil 			    else {
    556  1.1  kamil 				occupant[y][x] = 0;
    557  1.1  kamil 				mvaddch(y+1, x*2, numamoebas ? amb[y][x] : ' ');
    558  1.1  kamil 			    }
    559  1.1  kamil 			}
    560  1.1  kamil 		    }
    561  1.1  kamil 		}
    562  1.1  kamil 	    }
    563  1.1  kamil 	}
    564  1.1  kamil     }
    565  1.1  kamil     do_bangs();
    566  1.1  kamil     if (numcrushes && movers->type == Crusher)
    567  1.1  kamil 	movers->vely = 0;
    568  1.1  kamil     if (curobj = base) {
    569  1.1  kamil 	char ch;
    570  1.1  kamil 
    571  1.1  kamil 	curobj->velx = 0;
    572  1.1  kamil 	curobj->vely = 0;
    573  1.1  kamil 	curobj->energy += 25*lookaround(curobj->posy,curobj->posx,Star);
    574  1.1  kamil 	if (curobj->energy > basemax)
    575  1.1  kamil 	    curobj->energy = basemax;
    576  1.1  kamil 	if (curobj->energy >= 1000)
    577  1.1  kamil 	    ch = 'B';
    578  1.1  kamil 	else
    579  1.1  kamil 	    ch = 'b';
    580  1.1  kamil 	if (ch != curobj->image) {
    581  1.1  kamil 	    setimage(curobj, ch);
    582  1.1  kamil 	}
    583  1.1  kamil     }
    584  1.1  kamil     if (curobj = ent) {
    585  1.1  kamil 	char ch;
    586  1.1  kamil 
    587  1.1  kamil 	if (entmode == 0) {
    588  1.1  kamil 	    curobj->velx = 0;
    589  1.1  kamil 	    curobj->vely = 0;
    590  1.1  kamil 	}
    591  1.1  kamil 	if (base && !cloaking && !curobj->velx && !curobj->vely &&
    592  1.1  kamil 	  lookfor(curobj->posy,curobj->posx,Base)) {
    593  1.1  kamil 	    int tmp;
    594  1.1  kamil 
    595  1.1  kamil #ifdef lint
    596  1.1  kamil 	    tmp = 0;
    597  1.1  kamil #else
    598  1.1  kamil 	    tmp = (int) (base->energy - 1000 < entmax - curobj->energy ?
    599  1.1  kamil 		         base->energy - 1000 : entmax - curobj->energy);
    600  1.1  kamil #endif
    601  1.1  kamil 	    if (tmp < 0)
    602  1.1  kamil 		tmp = 0;
    603  1.1  kamil 	    curobj->energy += tmp;
    604  1.1  kamil 	    base->energy -= tmp;
    605  1.1  kamil 	    tmp = (btorp < 50 - etorp ?
    606  1.1  kamil 		   btorp : 50 - etorp);
    607  1.1  kamil 	    etorp += tmp;
    608  1.1  kamil 	    btorp -= tmp;
    609  1.1  kamil 	    if (damage) {
    610  1.1  kamil 		tmp = rand_mod(MAXDAMAGE);
    611  1.1  kamil 		if (damflag[tmp] > 5) {
    612  1.1  kamil 		    damflag[tmp] = rand_mod(5)+1;
    613  1.1  kamil 		}
    614  1.1  kamil 	    }
    615  1.1  kamil 	}
    616  1.1  kamil 	if (curobj->energy >= 500 && (!damage || !damflag[NOSHIELDS]))
    617  1.1  kamil 	    ch = cloaked?'C':'E';
    618  1.1  kamil 	else
    619  1.1  kamil 	    ch = cloaked?'c':'e';
    620  1.1  kamil 	if (ch != curobj->image) {
    621  1.1  kamil 	    setimage(curobj, ch);
    622  1.1  kamil 	}
    623  1.1  kamil     }
    624  1.1  kamil }
    625  1.1  kamil 
    626  1.1  kamil int
    627  1.1  kamil lookaround(y, x, what)
    628  1.1  kamil Reg1 int y;
    629  1.1  kamil Reg2 int x;
    630  1.1  kamil Reg4 char what;
    631  1.1  kamil {
    632  1.1  kamil     Reg3 OBJECT *obj;
    633  1.1  kamil     Reg5 int count=0;
    634  1.1  kamil     Reg6 int xp;
    635  1.1  kamil     Reg7 int xm;
    636  1.1  kamil 
    637  1.1  kamil     if ((obj=occupant[y][xp=(x+XSIZE01)%XSIZE])&&obj->type == what) /* 0, 1 */
    638  1.1  kamil 	count++;
    639  1.1  kamil     if ((obj=occupant[y][xm=(x+XSIZE99)%XSIZE])&&obj->type == what) /* 0, -1 */
    640  1.1  kamil 	count++;
    641  1.1  kamil     if ((obj=occupant[y=(y+YSIZE99)%YSIZE][xp])&&obj->type == what) /* -1, 1 */
    642  1.1  kamil 	count++;
    643  1.1  kamil     if ((obj=occupant[y][x])&&obj->type == what)                    /* -1, 0 */
    644  1.1  kamil 	count++;
    645  1.1  kamil     if ((obj=occupant[y][xm])&&obj->type == what)                   /* -1, -1 */
    646  1.1  kamil 	count++;
    647  1.1  kamil     if ((obj=occupant[y=(y+2)%YSIZE][xp])&&obj->type == what)       /* 1, 1 */
    648  1.1  kamil 	count++;
    649  1.1  kamil     if ((obj=occupant[y][x])&&obj->type == what)                    /* 1, 0 */
    650  1.1  kamil 	count++;
    651  1.1  kamil     if ((obj=occupant[y][xm])&&obj->type == what)                   /* 1, -1 */
    652  1.1  kamil 	count++;
    653  1.1  kamil     return (count);
    654  1.1  kamil }
    655  1.1  kamil 
    656  1.1  kamil int
    657  1.1  kamil lookfor(y, x, what)
    658  1.1  kamil Reg1 int y;
    659  1.1  kamil Reg2 int x;
    660  1.1  kamil Reg4 char what;
    661  1.1  kamil {
    662  1.1  kamil     Reg3 OBJECT *obj;
    663  1.1  kamil     Reg5 int xp;
    664  1.1  kamil     Reg6 int xm;
    665  1.1  kamil 
    666  1.1  kamil     if ((obj=occupant[y][xp=(x+XSIZE01)%XSIZE])&&obj->type == what ||/* 0, 1 */
    667  1.1  kamil         (obj=occupant[y][xm=(x+XSIZE99)%XSIZE])&&obj->type == what ||/* 0, -1 */
    668  1.1  kamil         (obj=occupant[y=(y+YSIZE99)%YSIZE][xp])&&obj->type == what ||/* -1, 1 */
    669  1.1  kamil         (obj=occupant[y][x])&&obj->type == what                    ||/* -1, 0 */
    670  1.1  kamil         (obj=occupant[y][xm])&&obj->type == what                   ||/* -1,-1 */
    671  1.1  kamil         (obj=occupant[y=(y+2)%YSIZE][xp])&&obj->type == what       ||/* 1, 1 */
    672  1.1  kamil         (obj=occupant[y][x])&&obj->type == what                    ||/* 1, 0 */
    673  1.1  kamil         (obj=occupant[y][xm])&&obj->type == what)                    /* 1, -1 */
    674  1.1  kamil 	return(1);
    675  1.1  kamil     return (0);
    676  1.1  kamil }
    677  1.1  kamil 
    678  1.1  kamil OBJECT*
    679  1.1  kamil lookimg(y, x, what)
    680  1.1  kamil Reg1 int y;
    681             Reg2 int x;
    682             Reg4 char what;
    683             {
    684                 Reg3 OBJECT *obj;
    685                 Reg5 int xp;
    686                 Reg6 int xm;
    687             
    688                 if ((obj=occupant[y][xp=(x+XSIZE01)%XSIZE])&&obj->image==what ||/* 0, 1 */
    689                     (obj=occupant[y][xm=(x+XSIZE99)%XSIZE])&&obj->image==what ||/* 0, -1 */
    690                     (obj=occupant[y=(y+YSIZE99)%YSIZE][xp])&&obj->image==what ||/* -1, 1 */
    691                     (obj=occupant[y][x])&&obj->image==what                    ||/* -1, 0 */
    692                     (obj=occupant[y][xm])&&obj->image==what                   ||/* -1,-1 */
    693                     (obj=occupant[y=(y+2)%YSIZE][xp])&&obj->image==what       ||/* 1, 1 */
    694                     (obj=occupant[y][x])&&obj->image==what                    ||/* 1, 0 */
    695                     (obj=occupant[y][xm])&&obj->image==what)                    /* 1, -1 */
    696             	return obj;
    697                 return Null(OBJECT*);
    698             }
    699