|
|
1.1 root 1: #include <jerq.h>
2: #include "rock.h"
3: #define YMAX 1024
4: extern Bitmap *buildimage();
5: extern notdrawn;
6: #define NROCK 32 /* == number of bits in a long */
7: #define V 16 /* velocity */
8: #define DV 5 /* delta v after explosion */
9: #define W 48 /* radius of rock (sort of) */
10: long allocated=0;
11: Rock rock[NROCK];
12: #define BINWIDTH 64 /* number of bins across screen */
13: #define HASHMASK (YMAX/BINWIDTH-1)
14: #define HASHSHIFT 4 /* log2(HASHMASK+1) */
15: long *bitarray;
16: char rock0[]={
17: 'R', -50, -50, 50, 50,
18: 'm', 11, -50,
19: 'l', 29, -30,
20: 'l', 24, -7,
21: 'l', 49, 20,
22: 'l', 29, 44,
23: 'l', -24, 44,
24: 'l', -48, 13,
25: 'l', -40, 0,
26: 'l', -50, -21,
27: 'l', -41, -36,
28: 'l', 11, -50,
29: 0
30: };
31: char rock1[]={
32: 'R', -30, -30, 32, 32,
33: 'm', 2, -30,
34: 'l', 30, -10,
35: 'l', 10, 30,
36: 'l', -10, 30,
37: 'l', -21, 9,
38: 'l', -10, -20,
39: 'l', 2, -30,
40: 0
41: };
42: char rock2[]={
43: 'R', -15, -15, 15, 15,
44: 'm', 4, -11,
45: 'l', 6, -4,
46: 'l', 15, 5,
47: 'l', 1, 13,
48: 'l', -15, -4,
49: 'l', -4, -11,
50: 'l', 4, -11,
51: 0
52: };
53: char *rockim[]={
54: rock0, rock1, rock2
55: };
56: #define NROCKIMAGES ((sizeof rockim)/(sizeof (char *)))
57: Bitmap *rockseq[NROCKIMAGES];
58: initrock(n)
59: {
60: register i;
61: register size;
62:
63: size = ((YMAX/BINWIDTH)*(YMAX/BINWIDTH));
64: if (!bitarray)
65: bitarray = (long *)malloc(size * sizeof(long));
66: for(i=0; i<size; i++)
67: bitarray[i]=0;
68: allocated=0;
69: for(i=0; i<NROCK; i++)
70: rock[i].hash= -1;
71: for(i=0; i<NROCKIMAGES; i++)
72: rockseq[i]=buildimage(rockim[i]);
73: for(i=0; i<n; i++) /* start with 6 rocks */
74: (void)spawn();
75: }
76: spawn()
77: {
78: Point x, v;
79: register i;
80: if(rnd(100)>=50){
81: x.x=0;
82: x.y=rnd(YMAX);
83: }else{
84: x.x=rnd(Drect.corner.x);
85: x.y=0;
86: }
87: do /* 0 velocities are dull */
88: v.x=V-rnd(2*V);
89: while(v.x==0);
90: do
91: v.y=V-rnd(2*V);
92: while(v.y==0);
93: newrock(x, v, 0);
94: return 1;
95: }
96: rockfree()
97: {
98: register i;
99: for(i=0; i<NROCKIMAGES; i++)
100: bfree(rockseq[i]);
101: }
102: newrock(x, v, im)
103: Point x, v;
104: int im;
105: {
106: register long i;
107: register Rock *r;
108: for(i=1; i && (allocated&i); i<<=1)
109: ;
110: if(i==0 || im>=NROCKIMAGES)
111: return;
112: allocated |= i;
113: r= &rock[bittoindex(i)];
114: r->x=x;
115: r->v=v;
116: r->r=rockim[im][3]; /* It's true! */
117: r->i=im;
118: r->hash=hash(r->x);
119: draw(r);
120: addbits(i, r->hash);
121: }
122: draw(r)
123: register Rock *r;
124: {
125: register Bitmap *b=rockseq[r->i];
126: bitblt(b, b->rect, &display, add(transform(r->x), b->rect.origin), F_XOR);
127: }
128: addbits(bits, h)
129: register long bits;
130: register h;
131: {
132: register long *lp= &bitarray[h];
133: register x=h&HASHMASK;
134: register y=(h>>HASHSHIFT)&HASHMASK;
135: int xlo=0, ylo=0, xhi=0, yhi=0;
136: if(x==0)
137: xlo=1;
138: if(y==0)
139: ylo=1;
140: if(x==HASHMASK)
141: xhi=1;
142: if(y==HASHMASK)
143: yhi=1;
144: lp[0]|=bits;
145: if(!xlo){
146: lp[-1]|=bits;
147: if(!ylo)
148: lp[-YMAX/BINWIDTH-1]|=bits;
149: if(!yhi)
150: lp[YMAX/BINWIDTH-1]|=bits;
151: }
152: if(!ylo)
153: lp[-YMAX/BINWIDTH]|=bits;
154: if(!yhi)
155: lp[YMAX/BINWIDTH]|=bits;
156: if(!xhi){
157: lp[1]|=bits;
158: if(!ylo)
159: lp[-YMAX/BINWIDTH+1]|=bits;
160: if(!yhi)
161: lp[YMAX/BINWIDTH+1]|=bits;
162: }
163: }
164: subbits(bits, h)
165: register long bits;
166: register h;
167: {
168: register long *lp= &bitarray[h];
169: register x=h&HASHMASK;
170: register y=(h>>HASHSHIFT)&HASHMASK;
171: int xlo=0, ylo=0, xhi=0, yhi=0;
172: if(x==0)
173: xlo=1;
174: if(y==0)
175: ylo=1;
176: if(x==HASHMASK)
177: xhi=1;
178: if(y==HASHMASK)
179: yhi=1;
180: bits= ~bits;
181: lp[0]&=bits;
182: if(!xlo){
183: lp[-1]&=bits;
184: if(!ylo)
185: lp[-YMAX/BINWIDTH-1]&=bits;
186: if(!yhi)
187: lp[YMAX/BINWIDTH-1]&=bits;
188: }
189: if(!ylo)
190: lp[-YMAX/BINWIDTH]&=bits;
191: if(!yhi)
192: lp[YMAX/BINWIDTH]&=bits;
193: if(!xhi){
194: lp[1]&=bits;
195: if(!ylo)
196: lp[-YMAX/BINWIDTH+1]&=bits;
197: if(!yhi)
198: lp[YMAX/BINWIDTH+1]&=bits;
199: }
200: }
201: bittoindex(i)
202: register long i;
203: {
204: register j;
205: register long b;
206: for(j=0, b=1; (b&i)==0; b<<=1, j++)
207: ;
208: return j;
209: }
210: hash(p)
211: Point p;
212: {
213: return (p.x/BINWIDTH)|(((unsigned)p.y/BINWIDTH)<<HASHSHIFT);
214: }
215: Rock *
216: collision(p, hashv, rad)
217: Point p;
218: {
219: register long bits, b;
220: register i;
221: bits=bitarray[hashv];
222: for(i=0, b=1; i<NROCK; i++, b<<=1)
223: if(bits&b){ /* There is a nearby rock */
224: register Rock *r= &rock[i];
225: Point pp;
226: pp=r->x;
227: pp.x-=p.x;
228: pp.y-=p.y;
229: if(pp.x*pp.x + pp.y*pp.y <
230: rad*rad + r->r*r->r)
231: return &rock[i];
232: }
233: return 0;
234: }
235: moverock()
236: {
237: static rocknum=0;
238: register Rock *r= &rock[rocknum];
239: register hsh=r->hash;
240: if(hsh==-1){
241: notdrawn++;
242: goto Return;
243: }
244: draw(r);
245: r->x=add(r->x, r->v);
246: onscreen(&r->x);
247: draw(r);
248: r->hash=hash(r->x);
249: if(r->hash != hsh){
250: subbits(1L<<rocknum, hsh);
251: addbits(1L<<rocknum, r->hash);
252: }
253: batcomp(r);
254: Return:
255: if(++rocknum >= NROCK)
256: rocknum=0;
257: }
258: split(r)
259: register Rock *r;
260: {
261: register i=r->i+1;
262: newrock(r->x, add(r->v, Pt(DV-rnd(2*DV), DV-rnd(2*DV))), i);
263: newrock(r->x, add(r->v, Pt(DV-rnd(2*DV), DV-rnd(2*DV))), i);
264: }
265: char killvalue[]={
266: 1, 2, 5
267: };
268: killrock(r)
269: register Rock *r;
270: {
271: extern score;
272: register long b=1L<<(r-rock);
273: allocated&=~b;
274: subbits(b, r->hash);
275: r->hash= -1;
276: score+=killvalue[r->i];
277: draw(r);
278: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.