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