Home | History | Annotate | Line # | Download | only in warp
bang.c revision 1.2
      1 /* Header: bang.c,v 7.0.1.3 86/12/12 16:57:00 lwall Exp */
      2 
      3 /* Log:	bang.c,v
      4  * Revision 7.0.1.3  86/12/12  16:57:00  lwall
      5  * Made circular explosions.
      6  *
      7  * Revision 7.0.1.2  86/10/20  14:36:02  lwall
      8  * Picked some lint.
      9  *
     10  * Revision 7.0.1.1  86/10/16  10:49:45  lwall
     11  * Added Damage.  Fixed random bugs.
     12  *
     13  * Revision 7.0  86/10/08  15:11:57  lwall
     14  * Split into separate files.  Added amoebas and pirates.
     15  *
     16  */
     17 
     18 #include "EXTERN.h"
     19 #include "warp.h"
     20 #include "object.h"
     21 #include "move.h"
     22 #include "sig.h"
     23 #include "term.h"
     24 #include "them.h"
     25 #include "INTERN.h"
     26 #include "bang.h"
     27 
     28 void
     29 bang_init()
     30 {
     31     ;
     32 }
     33 
     34 void
     35 make_plink(y,x)
     36 Reg1 int x;
     37 Reg2 int y;
     38 {
     39     Reg3 OBJECT *obj;
     40 
     41     move(y+1,x*2,0);
     42     beg_qwrite();
     43     *filler = '@';
     44     qwrite();
     45     obj = occupant[y][x];
     46     if (obj) {
     47 	if (numamoebas && obj->image == ' ')
     48 	    qaddc(amb[y][x]);
     49 	else
     50 	    qaddc(obj->image);
     51     }
     52     else if (numamoebas)
     53 	qaddc(amb[y][x]);
     54     else
     55 	qaddspace();
     56     end_qwrite();
     57 }
     58 
     59 void
     60 make_blast(y,x,mass,size)
     61 Reg1 int x;
     62 Reg2 int y;
     63 int size;
     64 long mass;
     65 {
     66     bangy[nxtbang] = y;
     67     bangx[nxtbang] = x;
     68     bangm[nxtbang] = mass;
     69     bangs[nxtbang++] = size;
     70     assert(nxtbang <= XSIZE * YSIZE);
     71     if (numamoebas && amb[y][x] == '~') {
     72 	if (mass > 10000)
     73 	    modify_amoeba(y,x,1,'~', 10);
     74 	else if (mass > 100)
     75 	    modify_amoeba(y,x,1,'~', 5);
     76 	bangs[nxtbang-1] = 0;		/* don't propagate */
     77 	return;
     78     }
     79     else if (mass >= 0) {
     80 	Reg3 OBJECT *obj;
     81 
     82 	move(y+1,x*2,0);
     83 	beg_qwrite();
     84 	*filler = '@';
     85 	qwrite();
     86 	*filler = '#';
     87 	qwrite();
     88 	*filler = '@';
     89 	qwrite();
     90 	*filler = '#';
     91 	qwrite();
     92 	*filler = '@';
     93 	qwrite();
     94 	obj = occupant[y][x];
     95 	if (obj) {
     96 	    if (numamoebas && obj->image == ' ')
     97 		qaddc(amb[y][x]);
     98 	    else
     99 		qaddc(obj->image);
    100 	}
    101 	else if (numamoebas)
    102 	    qaddc(amb[y][x]);
    103 	else
    104 	    qaddspace();
    105 	end_qwrite();
    106     }
    107 }
    108 
    109 void
    110 do_bangs()
    111 {
    112     Reg1 int x;
    113     Reg2 int y;
    114     Reg3 int i;
    115     Reg4 int j;
    116     Reg7 int k;
    117     Reg5 int lastxy;
    118     Reg6 OBJECT *obj;
    119 
    120     /* read blast list and update blast array */
    121     assert(nxtbang >= 0 && nxtbang <= XSIZE * YSIZE);
    122     for (i=0; i<nxtbang; i++) {
    123 	if (bangm[i] != 32767)
    124 	    bangm[i] *= 4;
    125 	lastxy = bangs[i] << 1;
    126 	if (lastxy >= MAXBDIST)
    127 	    lastxy = MAXBDIST - 1;
    128 	for (y=bangy[i]-bangs[i],x=bangx[i]-bangs[i],j=lastxy;
    129 	  j>=0;
    130 	  y++,x++,--j) {
    131 	    yblasted[yy[j] = (y+YSIZE00) % YSIZE] |= 1;
    132 	    xblasted[xx[j] = (x+XSIZE00) % XSIZE] |= 1;
    133 	}
    134 	blasted = TRUE;
    135 	for (y=lastxy;y>=0;--y) {
    136 	    for (x=lastxy;x>=0;--x) {
    137 		if (lastxy > 2) {
    138 		    j = abs(y-bangs[i]);
    139 		    k = abs(x-bangs[i]);
    140 		    if (j < k)		/* distance is long + 1/2 short */
    141 			j += k + k;
    142 		    else
    143 			j += j + k;
    144 		    if (--j > lastxy)
    145 			continue;
    146 		}
    147 		if (bangm[i] != 32767 ||
    148 		  !(obj=occupant[yy[y]][xx[x]]) || obj->type != Web)
    149 		    blast[yy[y]][xx[x]] += bangm[i];
    150 	    }
    151 	}
    152     }
    153 }
    154