Annotation of researchv9/jtools/src/demo/asteroids/batcomp.c, revision 1.1

1.1     ! root        1: #include <jerq.h>
        !             2: #include "rock.h"
        !             3: #include "event.h"
        !             4: #include "ship.h"
        !             5: extern Point pos, vel;
        !             6: extern int xflag;
        !             7: extern Bitmap *rockseq[];
        !             8: /* batcomp calls are spread around, but all functions are here */
        !             9: 
        !            10: int curthreat; /* rocknum of worst guy */
        !            11: extern int death;
        !            12: extern int costheta, sintheta;
        !            13: int curtime = 10000;   /* and when he hits us */
        !            14: long curdist = 1000000;                /* if not threat, dist of worst guy */
        !            15: extern int score;
        !            16: int computer, compbut;
        !            17: int screens;
        !            18: 
        !            19: batcomp(r)     /* called from moverock */
        !            20: register Rock *r;
        !            21: {      int a, b, c, d;
        !            22:        long dist, u, t;
        !            23:        if(death)
        !            24:                return;
        !            25:        a = r->x.x - pos.x;
        !            26:        b = r->x.y - pos.y;
        !            27:        c = r->v.x - vel.x;     /* our velocity has to be scaled */
        !            28:        d = r->v.y - vel.y;
        !            29: /* only understands current region, not lattice */
        !            30:        t = (long)a * c + (long)b * d;
        !            31:        u = (long)c * c + (long)d * d + 1;      /* don't divide by zero */
        !            32:        dist = (long)b * c - (long)a * d;
        !            33:        dist *= dist;
        !            34:        dist /= u;
        !            35:        if(curthreat != -1 && rock[curthreat].hash == -1)
        !            36:                curthreat = -1, curtime = 10000, curdist = 1000000;
        !            37:        t = -t/u;
        !            38:        if(t >= -3 && dist <= r->r * r->r + RADSHIP * RADSHIP *2) {
        !            39:                if(curthreat == -1 || t < curtime && t >= 0) {
        !            40:                        curtime = t;
        !            41:                        curthreat = r - rock;
        !            42:                }
        !            43:                return;
        !            44:        }
        !            45:        if(curthreat == r - rock)
        !            46:                curdist = dist;
        !            47:        dist = (long)a * a + (long)b * b;
        !            48:        if(curthreat == -1 || dist < curdist && t >= 0) {
        !            49:                curdist = dist;
        !            50:                curthreat = r - rock;
        !            51:        }
        !            52:        if(screens & curtime < 20) {
        !            53:                curtime = 10000;
        !            54:                split(r);
        !            55:                explode(r->x);
        !            56:                killrock(r);
        !            57:                score -= 6;
        !            58:        }
        !            59: }
        !            60: int velb = 24;
        !            61: int invb = 1;
        !            62: #define RET(n) return(compbut = dir[n])
        !            63: #define LEFT 6
        !            64: #define RIGHT 3
        !            65: char dir[16] = {LEFT, LEFT, RIGHT, RIGHT, LEFT, RIGHT, LEFT, RIGHT, LEFT, LEFT, RIGHT};
        !            66: strat()
        !            67: {      register Rock *r = rock + curthreat;
        !            68:        int a, b, c, d, x;
        !            69:        int tbul, trock;
        !            70:        if(r->hash == -1) {
        !            71:                curthreat = -1;
        !            72:                curtime = 10000;
        !            73:                curdist = 1000000;
        !            74:        }
        !            75:        compbut = 0;
        !            76:        if(curthreat == -1)
        !            77:                return(0);
        !            78:        a = r->x.x - pos.x + r->v.x;
        !            79:        b = r->x.y - pos.y + r->v.y;
        !            80:        c = r->v.x;     /* we'd better be at rest */
        !            81:        d = r->v.y;
        !            82:        if(m(a, costheta) + m(b, sintheta) < 0)
        !            83:                RET(0);         /* not close */
        !            84:        x = m(c, sintheta) - m(d, costheta);
        !            85:        tbul = ((long)b * c - (long)a * d);
        !            86:        /* tbul / xVELB/INV is the actual time */
        !            87:        trock = m(b, costheta) - m(a, sintheta);
        !            88:        /* trock / x is the actual time */
        !            89:        if(x < 0) {
        !            90:                if(tbul >= 0)
        !            91:                        RET(1);
        !            92:                else if(trock > 0)
        !            93:                        RET(2);
        !            94:                else if(trock * velb > tbul * invb)
        !            95:                        RET(3);
        !            96:                else
        !            97:                        RET(4);
        !            98:        }
        !            99:        else if(x > 0) {
        !           100:                if(tbul <= 0 && trock > 0)
        !           101:                        RET(5);
        !           102:                else if(trock < 0)
        !           103:                        RET(6);
        !           104:                else if(trock * velb > tbul * invb)
        !           105:                        RET(7);
        !           106:                else
        !           107:                        RET(8);
        !           108:        }
        !           109:        else if(trock < 0)
        !           110:                RET(9);
        !           111:        else
        !           112:                RET(10);
        !           113: right:
        !           114:        return(compbut = 3);
        !           115: left:
        !           116:        return(compbut = 6);
        !           117: }

unix.superglobalmegacorp.com

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