Annotation of researchv9/jtools/src/demo/asteroids/rock.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.