⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cave.c

📁 game duke3d source
💻 C
📖 第 1 页 / 共 4 页
字号:
        return;

    if(soundplaying[j].ptr == (char *) NULL)
    {
        getmem(&soundplaying[j].ptr,sounds[sndnum].len);
        iodata(sounds[sndnum].fn,soundplaying[j].ptr,sounds[sndnum].len,IO_LOAD);
    }

    soundplaying[j].sndno = sndnum;
    soundplaying[j].i = i;
}

void pan3dsounds(long i)
{
    long j;

    for(j=0;j<MAXCHANNELS;j++)
        if(soundplaying[j].ptr != (char *) NULL)
    {
        // Pan it here to current player;
    }
}


// Drawing Code

void shiftpalette(char r,char g,char b,long e)
{
    int i;
    char temparray[768];

    toutp(0x3c8,0);

    for(i=0;i<768;i+=3)
    {
        temparray[i+0] =
            palette[i+0]+((((long)r-(long)palette[i+0])*(long)(e&127))>>6);
        temparray[i+1] =
            palette[i+1]+((((long)g-(long)palette[i+1])*(long)(e&127))>>6);
        temparray[i+2] =
            palette[i+2]+((((long)b-(long)palette[i+2])*(long)(e&127))>>6);

        toutp(0x3c9,temparray[i+0]);
        toutp(0x3c9,temparray[i+1]);
        toutp(0x3c9,temparray[i+2]);
    }
}

void fadepalette(char dir,char fspeed)
{
    long i;
    if(dir)
        for(i = 0;i < 63;i += fspeed)
    {
        shiftpalette(0,0,0,i);
        limitrate();
    }
    else
        for(i = 0;i < 63;i += fspeed)
    {
        shiftpalette(0,0,0,63-i);
        limitrate();
    }
}

void light(long x, long y, long z, long myang, long deg, long rad)
{
    long dadist, daplc, daang, dasin, dacos, truex, truey, dashade, anginc;
    unsigned char *mapptr, *didits1, *didits2;

    getmem(&didits1,65536L);
    getmem(&didits2,65536L);

    clearbuf(didits1,16384);
    clearbuf(didits2,16384);

    z >>= 12;

    anginc = 1 + (rad>>4);

    for(daang=myang-deg;daang < myang+deg; daang += anginc )
    {
        dacos = sintable[(daang+512)&2047]>>4;
        dasin = sintable[(daang)&2047]>>4;

        truex = x;
        truey = y;

        for(dadist = 1;dadist < rad; dadist++)
        {
            daplc = ((truex>>10)<<8)+(truey>>10);
            mapptr = &map.h1[daplc];

            if(didits1[daplc] == 0)
            {
                didits1[daplc] = 1;
                dashade = scale(63, dadist + (labs(z - *mapptr)>>1), rad);
                mapptr += (65536L<<2);

                if(dashade < 0) *mapptr = 0;
                else if(dashade < *mapptr) *mapptr = dashade;
                if( z < *(mapptr-(65536L<<2)) ) break;
                mapptr -= (65536L*3);
            }
            else mapptr += 65536L;

            if(didits2[daplc] == 0)
            {
                didits2[daplc] = 1;
                dashade = scale(63, dadist + (labs(z - *mapptr)>>1), rad);
                mapptr += (65536L<<2);

                if(dashade < 0) *mapptr = 0;
                else if(dashade < *mapptr) *mapptr = dashade;
                if( z > *(mapptr-(65536L<<2)) ) break;
            }

            truex += dacos;
            truey += dasin;
        }
    }

    freemem(&didits2);
    freemem(&didits1);

}

void blast(long gridx, long gridy, long rad, char blastingcol)
{
    short tempshort;
    long i, j, dax, day, daz, dasqr, templong;

    templong = rad+2;
    for(i=-templong;i<=templong;i++)
        for(j=-templong;j<=templong;j++)
        {
            dax = ((gridx+i+256)&255);
            day = ((gridy+j+256)&255);

            if(dax < 1 || dax > 255 || day < 1 || day > 255)
                continue;

            dasqr = sqr(rad)-(sqr(i)+sqr(j));

            if (dasqr >= 0)
                daz = tsqrt(dasqr)<<1;
            else
                daz = -tsqrt(-dasqr)<<1;

            if ((self[screenpeek].posz>>12)-daz < map.h1[(dax<<8)+day])
            {
                map.h1[(dax<<8)+day] = (self[screenpeek].posz>>12)-daz;
                if (((self[screenpeek].posz>>12)-daz) < 0)
                    map.h1[(dax<<8)+day] = 0;
            }

            if ((self[screenpeek].posz>>12)+daz > map.h2[(dax<<8)+day])
            {
                map.h2[(dax<<8)+day] = (self[screenpeek].posz>>12)+daz;
                if (((self[screenpeek].posz>>12)+daz) > 255)
                    map.h2[(dax<<8)+day] = 255;
            }

/*            tempshort = map.h1[(dax<<8)+day];
            if (tempshort >= map.h2[(dax<<8)+day]) tempshort = (self[screenpeek].posz>>12);
            tempshort = labs(64-(tempshort&127))+(rand()&3)-2;
            if (tempshort < 0) tempshort = 0;
            if (tempshort > 63) tempshort = 63;
            map.c1[(dax<<8)+day] = (char)(tempshort+blastingcol);

            tempshort = map.h2[(dax<<8)+day];
            if (tempshort <= map.h1[(dax<<8)+day]) tempshort = (self[screenpeek].posz>>12);
            tempshort = labs(64-(tempshort&127))+(rand()&3)-2;
            if (tempshort < 0) tempshort = 0;
            if (tempshort > 63) tempshort = 63;
            map.c2[(dax<<8)+day] = (char)(tempshort+blastingcol);
*/

        }
}

void grouvline (long x)
{
    long dist[2], dinc[2], incr[2];
    short grid[2], dir[2];
    unsigned char *mapptr;

    char oh1, oh2;
    short um, dm, h, i, horiz;
    long plc1, plc2, cosval, sinval;
    long snx, sny, dax, c, shade, cnt;
    long posx, posy, posz, posa;

    plc1 = (x>>2) + FP_OFF(scrbuf);
    plc2 = plc1 + muly80[ (ydim-1) ];

    switch(pixs)
    {
        case 1:
            if ((x&2) > 0)
            {
                plc1 += 32000<<vidmode;
                plc2 += 32000<<vidmode;
            }
            if ((x&1) > 0)
            {
                plc1 += 16000<<vidmode;
                plc2 += 16000<<vidmode;
            }
            break;
        case 2:
            if ((x&2) > 0)
            {
                plc1 += 16000<<vidmode;
                plc2 += 16000<<vidmode;
            }
            break;
    }

    posx = self[screenpeek].posx;
    posy = self[screenpeek].posy;
    posz = self[screenpeek].posz;
    posa = self[screenpeek].ang;
    horiz = self[screenpeek].horiz;

    cosval = sintable[(posa+2560)&2047];
    sinval = sintable[(posa+2048)&2047];

    dax = (x<<1) + (pixs-1) - xdim;

    incr[0] = cosval - scale(sinval,dax,xdim);
    incr[1] = sinval + scale(cosval,dax,xdim);

    if (incr[0] < 0) dir[0] = -1, incr[0] = -incr[0]; else dir[0] = 1;
    if (incr[1] < 0) dir[1] = -1, incr[1] = -incr[1]; else dir[1] = 1;
    snx = (posx&1023); if (dir[0] == 1) snx ^= 1023;
    sny = (posy&1023); if (dir[1] == 1) sny ^= 1023;
    cnt = ((snx*incr[1] - sny*incr[0])>>10);

    grid[0] = ((posx>>10)&255); grid[1] = ((posy>>10)&255);

    if (incr[0] != 0)
    {
        dinc[0] = divscale(65536>>vidmode,incr[0],12);
        dist[0] = mulscale(dinc[0],snx,10);
    }
    if (incr[1] != 0)
    {
        dinc[1] = divscale(65536>>vidmode,incr[1],12);
        dist[1] = mulscale(dinc[1],sny,10);
    }

    um = (0)-horiz;
    dm = (ydim-1)-horiz;

    i = incr[0]; incr[0] = incr[1]; incr[1] = -i;

    shade = 0;
    while (dist[cnt>=0] < 8192)
    {
        i = (cnt>=0);

        grid[i] = ((grid[i]+dir[i])&255);
        dist[i] += dinc[i];
        cnt += incr[i];
        shade++;
    }

    mapptr = &map.h1[(grid[0]<<8)+grid[1]];

    while (shade < 256)
    {
        i = (cnt>=0);
        oh1 = *mapptr;
        oh2 = *(mapptr+65536);

        h = groudiv((long)oh1,dist[i],posz);
        if (um <= h)
        {
            c = (shade>>2) + *(mapptr + (65536<<2)); // map.s1[bufplc];
            if(c > 63) c = 63;
            c = palookup[c][*(mapptr + (65536<<1))]; // map.c1[bufplc]
            if (h > dm) break;
            plc1 = drawtopslab(plc1,h-um+1,c);
            um = h+1;
        }

        h = groudiv((long)oh2,dist[i],posz);
        if (dm >= h)
        {
            c = (shade>>2) + *(mapptr + (65536*5)); // map.s2[bufplc];
            if(c > 63) c = 63;
            c = palookup[c][*(mapptr + (65536*3))]; // map.c2[bufplc]
            if (h < um) break;
            plc2 = drawbotslab(plc2,dm-h+1,c);
            dm = h-1;
        }

        grid[i] = ((grid[i]+dir[i])&255);
        mapptr = &map.h1[(grid[0]<<8)+grid[1]];

        if (*mapptr > oh1) // map.h1[bufplc]
        {
            h = groudiv((long)*mapptr,dist[i],posz); // map.h1[bufplc]

            if (um <= h)
            {
                c = (shade>>2) + *(mapptr + (65536<<2)); // map.s1[bufplc];
                if(c > 63) c = 63;
                c = palookup[c][*(mapptr + (65536<<1))]; // map.c1[bufplc]
                if (h > dm) break;
                plc1 = drawtopslab(plc1,h-um+1,c);
                um = h+1;
            }
        }


        if (*(mapptr + 65536) < oh2) // map.h2[bufplc]
        {
            h = groudiv((long)*(mapptr + 65536),dist[i],posz); // map.h2[bufplc]
            if (dm >= h)
            {
                c = (shade>>2) + *(mapptr + (65536*5)); // map.s2[bufplc];
                if(c > 63) c = 63;
                c = palookup[c][*(mapptr + (65536*3))]; // map.c2[bufplc]
                if (h < um) break;
                plc2 = drawbotslab(plc2,dm-h+1,c);
                dm = h-1;
            }
        }

        dist[i] += dinc[i];
        cnt += incr[i];
        shade++;
    }

    if (dm >= um)
    {
        if (shade >= 256) c = 0;
        drawtopslab(plc1,dm-um+1,c);
    }
}


void drawobject(long thex, long they, long thez, char *tileptr,char shade)
{
    long x, y, x1, y1, x2, y2, dasizx, dasizy, xscale, yscale;
    char *p;

    dasizx = *(tileptr++);
    dasizy = *(tileptr++);

	x1 = thex;
	y1 = they;
    x2 = x1 + dasizx;
    y2 = y1 + dasizy;

    if ((x2 >= xdim) || (x2 < 0) || (x1 >= xdim) || (y2 < 0) || (y1 >= ydim))
        return;

    if(thez > (65536L<<1)) return;
//    else if(thez > 256)
//    {
  //      xscale = 1 + mulscale(dasizx,thez,18);
    //    yscale = 1 + mulscale(dasizy,thez,18);
//    }
//    else

    xscale = yscale = 1;

    p = scrbuf + muly80[y1];

    switch(pixs)
    {
        case 1:
            for(y=y1;y<y2;y++)
            {
                for(x=x1;x<x2;x+=xscale)
                {
                    if(*tileptr < 255)
                        *(p + (mul16000[(x&3)]<<vidmode) + (x>>2)) =
                            *tileptr;
                    tileptr += xscale;
                }
                p += 80;
            }
            break;
        case 2:
            for(y=y1;y<y2;y++)
            {
                for(x=x1;x<x2;x+=(xscale<<1))
                {
                    if(*tileptr < 255)
                        *(p + (mul16000[(x>>1)&1]<<vidmode) + (x>>2)) =
                            *tileptr;
                    tileptr += (xscale<<1);
                }
                tileptr += (x-x2)*(xscale<<1);
                p += 80;
            }
            break;

        case 4:
            for(y=y1;y<y2;y++)
            {
                for(x=x1;x<x2;x+=(xscale<<2))
                {
                    if(*tileptr < 255)
                        *(p + (x>>2) ) = palookup[shade][*tileptr];
                    tileptr += (xscale<<2);
                }
                tileptr += (x-x2)*(xscale<<2);
                p += 80;
            }
            break;
    }
}

void sortobjectstoview(void)
{
    long tempx, tempy, dadist, posx, posy;
    short i, j, daang, daangdif;
    viewobjecttype tempviewobject;

    daang = self[screenpeek].ang;
    posx = self[screenpeek].posx;
    posy = self[screenpeek].posy;

    viewobjectcnt = 0;

    for(j=0;j<MAXSTATUS;j++)
        for(i = map.headobject[j];i>=0;i=map.nextobject[i])
    {
        daangdif = angdif(daang,getangle(object[i].x-posx,object[i].y-posy));
        if( labs(daangdif) < (256) )
        {
            dadist = mulscale(object[i].x-posx,\
                sintable[(-daang+2560)&2047],14)-mulscale(object[i].y-posy,\
                sintable[(-daang+2048)&2047],14);

            if( dadist > 0xff ) // && dadist < 0x18000)
            {
                scrnobj[viewobjectcnt].viewobject = i;
                scrnobj[viewobjectcnt].viewobjectdist = dadist;
                scrnobj[viewobjectcnt].viewobjectang = daangdif;
                viewobjectcnt++;
            }
        }
    }

    // Bubble sort by z (furthest to closest)

    for(i=0;i<(viewobjectcnt-1);i++)
        for(j = (i+1);j<viewobjectcnt; j++)
            if(scrnobj[j].viewobjectdist > scrnobj[i].viewobjectdist)
        {
            copybytes(&scrnobj[i],     &tempviewobject, sizeof(viewobjecttype));
            copybytes(&scrnobj[j],     &scrnobj[i],     sizeof(viewobjecttype));
            copybytes(&tempviewobject, &scrnobj[j],     sizeof(viewobjecttype));
        }
}

void animateobjects(void)
{
    long i, j;

    if(self[screenpeek].flashlight)
        light(
            self[screenpeek].posx,
            self[screenpeek].posy,
            self[screenpeek].posz,
            self[screenpeek].ang,
            128,
            96);

    for(i=0;i<viewobjectcnt;i++)
    {
        j = scrnobj[i].viewobject;
        light(
           object[j].x,
           object[j].y,
           object[j].z,
           0,
           1024,
           96);
    }
}

void drawallobjects(void)
{
    long i, j, posx, posy, posz, horiz;
    long scrnx, scrny;

    posx = self[screenpeek].posx;
    posy = self[screenpeek].posy;
    posz = self[screenpeek].posz;
    horiz = self[screenpeek].horiz;

    for(j=0;j<viewobjectcnt;j++)
    {
        i = scrnobj[j].viewobject;

        scrnx = mulscale(MAXXDIM,256+scrnobj[j].viewobjectang,9);
        scrny = scale( object[i].z-posz, 32, scrnobj[j].viewobjectdist);

        drawobject(scrnx,horiz + scrny,scrnobj[j].viewobjectdist,atile,scrnobj[j].viewobjectdist>>10);
    }
}


void drawmap(void)
{
    long i, j;

    if(self[screenpeek].topdown == 0)
    {
        for(i=0;i<MAXXDIM;i+=pixs)
            grouvline(i);

        drawallobjects();
    }
    else
        clearbuf(scrbuf,16000,0xffffffff);

}

void nextpage(void)
{
    if (vidmode == 0)                            //Copy to screen
    {
        if (pixs == 4) showscreen4pix320200();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -