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