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.4 rillig * 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.4 rillig * 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.4 rillig * 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.4 rillig * 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