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
28void
29bang_init(void)
30{
31    ;
32}
33
34void
35make_plink(int x, int y)
36{
37    OBJECT *obj;
38
39    move(y+1,x*2,0);
40    beg_qwrite();
41    *filler = '@';
42    qwrite();
43    obj = occupant[y][x];
44    if (obj) {
45	if (numamoebas && obj->image == ' ')
46	    qaddc(amb[y][x]);
47	else
48	    qaddc(obj->image);
49    }
50    else if (numamoebas)
51	qaddc(amb[y][x]);
52    else
53	qaddspace();
54    end_qwrite();
55}
56
57void
58make_blast(int x, int y, int size, long mass)
59{
60    bangy[nxtbang] = y;
61    bangx[nxtbang] = x;
62    bangm[nxtbang] = mass;
63    bangs[nxtbang++] = size;
64    assert(nxtbang <= XSIZE * YSIZE);
65    if (numamoebas && amb[y][x] == '~') {
66	if (mass > 10000)
67	    modify_amoeba(y,x,1,'~', 10);
68	else if (mass > 100)
69	    modify_amoeba(y,x,1,'~', 5);
70	bangs[nxtbang-1] = 0;		/* don't propagate */
71	return;
72    }
73    else if (mass >= 0) {
74	OBJECT *obj;
75
76	move(y+1,x*2,0);
77	beg_qwrite();
78	*filler = '@';
79	qwrite();
80	*filler = '#';
81	qwrite();
82	*filler = '@';
83	qwrite();
84	*filler = '#';
85	qwrite();
86	*filler = '@';
87	qwrite();
88	obj = occupant[y][x];
89	if (obj) {
90	    if (numamoebas && obj->image == ' ')
91		qaddc(amb[y][x]);
92	    else
93		qaddc(obj->image);
94	}
95	else if (numamoebas)
96	    qaddc(amb[y][x]);
97	else
98	    qaddspace();
99	end_qwrite();
100    }
101}
102
103void
104do_bangs(void)
105{
106    int x;
107    int y;
108    int i;
109    int j;
110    int k;
111    int lastxy;
112    OBJECT *obj;
113
114    /* read blast list and update blast array */
115    assert(nxtbang >= 0 && nxtbang <= XSIZE * YSIZE);
116    for (i=0; i<nxtbang; i++) {
117	if (bangm[i] != 32767)
118	    bangm[i] *= 4;
119	lastxy = bangs[i] << 1;
120	if (lastxy >= MAXBDIST)
121	    lastxy = MAXBDIST - 1;
122	for (y=bangy[i]-bangs[i],x=bangx[i]-bangs[i],j=lastxy;
123	  j>=0;
124	  y++,x++,--j) {
125	    yblasted[yy[j] = (y+YSIZE00) % YSIZE] |= 1;
126	    xblasted[xx[j] = (x+XSIZE00) % XSIZE] |= 1;
127	}
128	blasted = true;
129	for (y=lastxy;y>=0;--y) {
130	    for (x=lastxy;x>=0;--x) {
131		if (lastxy > 2) {
132		    j = abs(y-bangs[i]);
133		    k = abs(x-bangs[i]);
134		    if (j < k)		/* distance is long + 1/2 short */
135			j += k + k;
136		    else
137			j += j + k;
138		    if (--j > lastxy)
139			continue;
140		}
141		if (bangm[i] != 32767 ||
142		  !(obj=occupant[yy[y]][xx[x]]) || obj->type != Web)
143		    blast[yy[y]][xx[x]] += bangm[i];
144	    }
145	}
146    }
147}
148