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