コード例 #1
0
    public static void makeitfall(short i)
    {
        spritetype s  = Engine.board.sprite[i];
        int        hz = 0;
        int        lz = 0;
        int        c;

        if (floorspace(s.sectnum) != 0)
        {
            c = 0;
        }
        else
        {
            if (ceilingspace(s.sectnum) != 0 || Engine.board.sector[s.sectnum].lotag == 2)
            {
                c = gc / 6;
            }
            else
            {
                c = gc;
            }
        }

        if ((s.statnum == 1 || s.statnum == 10 || s.statnum == 2 || s.statnum == 6))
        {
            Engine.board.getzrange(s.x, s.y, s.z - ((1 << 8)), s.sectnum, ref hittype[i].ceilingz, ref hz, ref hittype[i].floorz, ref lz, 127, (((1) << 16) + 1));
        }
        else
        {
            hittype[i].ceilingz = Engine.board.sector[s.sectnum].ceilingz;
            hittype[i].floorz   = Engine.board.sector[s.sectnum].floorz;
        }

        if (s.z < hittype[i].floorz - ((1 << 8)))
        {
            if (Engine.board.sector[s.sectnum].lotag == 2 && s.zvel > 3122)
            {
                s.zvel = 3144;
            }
            if (s.zvel < 6144)
            {
                s.zvel += (short)c;
            }
            else
            {
                s.zvel = 6144;
            }
            s.z += s.zvel;
        }
        if (s.z >= hittype[i].floorz - ((1 << 8)))
        {
            s.z    = hittype[i].floorz - (1 << 8);
            s.zvel = 0;
        }
    }
コード例 #2
0
    public static void getglobalz(short i)
    {
        int hz = 0;
        int lz = 0;
        int zr = 0;

        spritetype s = Engine.board.sprite[i];

        if (s.statnum == 10 || s.statnum == 6 || s.statnum == 2 || s.statnum == 1 || s.statnum == 4)
        {
            if (s.statnum == 4)
            {
                zr = 4;
            }
            else
            {
                zr = 127;
            }

            Engine.board.getzrange(s.x, s.y, s.z - ((1 << 8)), s.sectnum, ref hittype[i].ceilingz, ref hz, ref hittype[i].floorz, ref lz, zr, (((1) << 16) + 1));

            if ((lz & 49152) == 49152 && (Engine.board.sprite[lz & (DefineConstants.MAXSPRITES - 1)].cstat & 48) == 0)
            {
                lz &= (DefineConstants.MAXSPRITES - 1);
                if (badguy(Engine.board.sprite[lz]) != 0 && Engine.board.sprite[lz].pal != 1)
                {
                    if (s.statnum != 4)
                    {
                        hittype[i].dispicnum = -4; // No shadows on actors
                        s.xvel = -256;
                        ssp(i, (uint)(((1) << 16) + 1));
                    }
                }
                else if (Engine.board.sprite[lz].picnum == DefineConstants.APLAYER && badguy(s) != 0)
                {
                    hittype[i].dispicnum = -4; // No shadows on actors
                    s.xvel = -256;
                    ssp(i, (uint)(((1) << 16) + 1));
                }
                else if (s.statnum == 4 && Engine.board.sprite[lz].picnum == DefineConstants.APLAYER)
                {
                    if (s.owner == lz)
                    {
                        hittype[i].ceilingz = Engine.board.sector[s.sectnum].ceilingz;
                        hittype[i].floorz   = Engine.board.sector[s.sectnum].floorz;
                    }
                }
            }
        }
        else
        {
            hittype[i].ceilingz = Engine.board.sector[s.sectnum].ceilingz;
            hittype[i].floorz   = Engine.board.sector[s.sectnum].floorz;
        }
    }
コード例 #3
0
    public static short furthestcanseepoint(short i, spritetype ts, ref int dax, ref int day)
    {
        short      j       = 0;
        int        hitsect = 0;
        short      hitwall = 0;
        short      hitspr  = 0;
        short      angincs = 0;
        short      tempang = 0;
        int        hx      = 0; //, d, cd, ca,tempx,tempy,cx,cy;
        int        hy      = 0;
        int        hz      = 0;
        int        d       = 0;
        int        da      = 0;
        spritetype s       = Engine.board.sprite[i];

        if ((hittype[g_i].count & 63) != 0)
        {
            return(-1);
        }

        if (ud.multimode < 2 && ud.player_skill < 3)
        {
            angincs = (short)(2048 / 2);
        }
        else
        {
            angincs = (short)(2048 / (1 + (Engine.krand() & 1)));
        }

        for (j = ts.ang; j < (2048 + ts.ang); j += (short)(angincs - (Engine.krand() & 511)))
        {
            Engine.board.hitscan(ts.x, ts.y, ts.z - (16 << 8), ts.sectnum, Engine.table.sintable[(j + 512) & 2047], Engine.table.sintable[j & 2047], (int)(16384 - (Engine.krand() & 32767)), ref hitsect, ref hitwall, ref hitspr, ref hx, ref hy, ref hz, (((256) << 16) + 64));

            d  = pragmas.klabs(hx - ts.x) + pragmas.klabs(hy - ts.y);
            da = pragmas.klabs(hx - s.x) + pragmas.klabs(hy - s.y);

            if (d < da)
            {
                if (Engine.board.cansee(hx, hy, hz, (short)hitsect, s.x, s.y, s.z - (16 << 8), s.sectnum))
                {
                    dax = hx;
                    day = hy;
                    return((short)hitsect);
                }
            }
        }
        return(-1);
    }
コード例 #4
0
    public static int dodge(spritetype s)
    {
        int i;
        int bx;
        int by;
        int mx;
        int my;
        int bxvect;
        int byvect;
        int mxvect;
        int myvect;
        int d;

        mx     = s.x;
        my     = s.y;
        mxvect = Engine.table.sintable[(s.ang + 512) & 2047];
        myvect = Engine.table.sintable[s.ang & 2047];

        for (i = Engine.board.headspritestat[4]; i >= 0; i = Engine.board.nextspritestat[i]) //weapons list
        {
            if (Engine.board.sprite[i].owner == i || Engine.board.sprite[i].sectnum != s.sectnum)
            {
                continue;
            }

            bx     = Engine.board.sprite[i].x - mx;
            by     = Engine.board.sprite[i].y - my;
            bxvect = Engine.table.sintable[(Engine.board.sprite[i].ang + 512) & 2047];
            byvect = Engine.table.sintable[Engine.board.sprite[i].ang & 2047];

            if (mxvect * bx + myvect * by >= 0)
            {
                if (bxvect * bx + byvect * by < 0)
                {
                    d = bxvect * by - byvect * bx;
                    if (pragmas.klabs(d) < 65536 * 64)
                    {
                        s.ang -= (short)(512 + (Engine.krand() & 1024));
                        return(1);
                    }
                }
            }
        }
        return(0);
    }
コード例 #5
0
    public static short furthestangle(short i, short angs)
    {
        short      j              = 0;
        int        hitsect        = 0;
        short      hitwall        = 0;
        short      hitspr         = 0;
        short      furthest_angle = 0;
        short      angincs        = 0;
        int        hx             = 0;
        int        hy             = 0;
        int        hz             = 0;
        int        d              = 0;
        int        greatestd      = 0;
        spritetype s              = Engine.board.sprite[i];

        greatestd = -(1 << 30);
        angincs   = (short)(2048 / angs);

        if (s.picnum != DefineConstants.APLAYER)
        {
            if ((hittype[g_i].count & 63) > 2)
            {
                return((short)(s.ang + 1024));
            }
        }

        for (j = s.ang; j < (2048 + s.ang); j += angincs)
        {
            Engine.board.hitscan(s.x, s.y, s.z - (8 << 8), s.sectnum, Engine.table.sintable[(j + 512) & 2047], Engine.table.sintable[j & 2047], 0, ref hitsect, ref hitwall, ref hitspr, ref hx, ref hy, ref hz, (((256) << 16) + 64));

            d = pragmas.klabs(hx - s.x) + pragmas.klabs(hy - s.y);

            if (d > greatestd)
            {
                greatestd      = d;
                furthest_angle = j;
            }
        }
        return((short)(furthest_angle & 2047));
    }