|
|
1.1 root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.