📄 game.c
字号:
}; /* * These variables are for animating x, y, or z-coordinates of sectors, * walls, or sprites (They are NOT to be used for changing the [].picnum's) * See the setanimation(), and getanimategoal() functions for more details. */#define MAXANIMATES 512static long *animateptr[MAXANIMATES], animategoal[MAXANIMATES];static long animatevel[MAXANIMATES], animateacc[MAXANIMATES], animatecnt = 0; /* These parameters are in exact order of sprite structure in BUILD.H */#define spawnsprite(newspriteindex2,x2,y2,z2,cstat2,shade2,pal2, \ clipdist2,xrepeat2,yrepeat2,xoffset2,yoffset2,picnum2,ang2, \ xvel2,yvel2,zvel2,owner2,sectnum2,statnum2,lotag2,hitag2,extra2) \{ \ spritetype *spr2; \ newspriteindex2 = insertsprite(sectnum2,statnum2); \ spr2 = &sprite[newspriteindex2]; \ spr2->x = x2; spr2->y = y2; spr2->z = z2; \ spr2->cstat = cstat2; spr2->shade = shade2; \ spr2->pal = pal2; spr2->clipdist = clipdist2; \ spr2->xrepeat = xrepeat2; spr2->yrepeat = yrepeat2; \ spr2->xoffset = xoffset2; spr2->yoffset = yoffset2; \ spr2->picnum = picnum2; spr2->ang = ang2; \ spr2->xvel = xvel2; spr2->yvel = yvel2; spr2->zvel = zvel2; \ spr2->owner = owner2; \ spr2->lotag = lotag2; spr2->hitag = hitag2; spr2->extra = extra2; \ copybuf(&spr2->x,&osprite[newspriteindex2].x,3); \ show2dsprite[newspriteindex2>>3] &= ~(1<<(newspriteindex2&7)); \ if (show2dsector[sectnum2>>3]&(1<<(sectnum2&7))) \ show2dsprite[newspriteindex2>>3] |= (1<<(newspriteindex2&7)); \} \void __interrupt __far timerhandler(void){ totalclock++; /* _chain_intr(oldtimerhandler); */ #ifdef PLATFORM_DOS outp(0x20,0x20); #endif}static void _initkeys(void){ long i; keyfifoplc = 0; keyfifoend = 0; for(i=0;i<256;i++) keystatus[i] = 0; initkeys(); /* rcg06082001 platform driver-specific initialization. */}void __interrupt __far keyhandler(void){ /* * ryan sez: End Of Interrupt call on DOS. This seems like a * dangerous place to put it, if you ask me, but oh well. --ryan. */ #ifdef PLATFORM_DOS koutp(0x20,0x20); #endif oldreadch = readch; readch = _readlastkeyhit(); #if 0 printf("keyhandler() got a (0x%X) ... \n", readch); #endif /* * ryan sez: these inp/outp calls read the keyboard state, * reset the keyboard, and put the original state back in. * This is apparently needed on some XTs, but not newer boxes, and * obviously never on Linux. --ryan. */ #ifdef PLATFORM_DOS keytemp = kinp(0x61); koutp(0x61,keytemp|128); koutp(0x61,keytemp&127); #else keytemp = readch; #endif if ((readch|1) == 0xe1) { extended = 128; return; } if (oldreadch != readch) { if ((readch&128) == 0) { keytemp = readch+extended; if (!keystatus[(int) keytemp]) { keystatus[(int) keytemp] = 1; keyfifo[(int) keyfifoend] = keytemp; keyfifo[(int) (keyfifoend+1)&(KEYFIFOSIZ-1)] = 1; keyfifoend = ((keyfifoend+2)&(KEYFIFOSIZ-1)); } } else { keytemp = (readch&127)+extended; keystatus[(int) keytemp] = 0; keyfifo[(int) keyfifoend] = keytemp; keyfifo[(int) (keyfifoend+1)&(KEYFIFOSIZ-1)] = 0; keyfifoend = ((keyfifoend+2)&(KEYFIFOSIZ-1)); } } extended = 0;}void initlava(void){ long x, y, z, r; for(z=0;z<32;z++) lavaradcnt[z] = 0; for(x=-16;x<=16;x++) for(y=-16;y<=16;y++) { r = ksqrt(x*x + y*y); lavaradx[r][lavaradcnt[r]] = x; lavarady[r][lavaradcnt[r]] = y; lavaradcnt[r]++; } for(z=0;z<16;z++) lavadropsizlookup[z] = 8 / (ksqrt(z)+1); for(z=0;z<LAVASIZ;z++) lavainc[z] = klabs((((z^17)>>4)&7)-4)+12; lavanumdrops = 0; lavanumframes = 0;}#if (defined USE_I386_ASM) #if (defined __WATCOMC__) long addlava(int param); #pragma aux addlava =\ "mov al, byte ptr [ebx-133]",\ "mov dl, byte ptr [ebx-1]",\ "add al, byte ptr [ebx-132]",\ "add dl, byte ptr [ebx+131]",\ "add al, byte ptr [ebx-131]",\ "add dl, byte ptr [ebx+132]",\ "add al, byte ptr [ebx+1]",\ "add al, dl",\ parm [ebx]\ modify exact [eax edx] #elif (defined __GNUC__) static long addlava (int i1) { long retval; __asm__ __volatile__ ( "\n\t" "movb -133(%%ebx), %%al\n\t" "movb -1(%%ebx), %%dl\n\t" "addb -132(%%ebx), %%al\n\t" "addb 131(%%ebx), %%dl\n\t" "addb -131(%%ebx), %%al\n\t" "addb 132(%%ebx), %%dl\n\t" "addb 1(%%ebx), %%al\n\t" "addb %%dl, %%al\n\t" : "=a" (retval) : "b" (i1) : "edx", "cc", "memory"); return (retval); } #else #error Please write Assembly code for your platform! #endif#else /* USE_I386_ASM */ #error Please implement this function in C.#endifvoid movelava(char *dapic){ long i, j, x, y, z, zz, dalavadropsiz, dadropsizlookup; long dalavax, dalavay, *ptr, *ptr2; for(z=min(LAVAMAXDROPS-lavanumdrops-1,3);z>=0;z--) { lavadropx[lavanumdrops] = (rand()&(LAVASIZ-1)); lavadropy[lavanumdrops] = (rand()&(LAVASIZ-1)); lavadropsiz[lavanumdrops] = 1; lavanumdrops++; } for(z=lavanumdrops-1;z>=0;z--) { dadropsizlookup = lavadropsizlookup[lavadropsiz[z]]*(((z&1)<<1)-1); dalavadropsiz = lavadropsiz[z]; dalavax = lavadropx[z]; dalavay = lavadropy[z]; for(zz=lavaradcnt[lavadropsiz[z]]-1;zz>=0;zz--) { i = (((lavaradx[dalavadropsiz][zz]+dalavax)&(LAVASIZ-1))<<LAVALOGSIZ); i += ((lavarady[dalavadropsiz][zz]+dalavay)&(LAVASIZ-1)); dapic[i] += dadropsizlookup; if (dapic[i] < 192) dapic[i] = 192; } lavadropsiz[z]++; if (lavadropsiz[z] > 10) { lavanumdrops--; lavadropx[z] = lavadropx[lavanumdrops]; lavadropy[z] = lavadropy[lavanumdrops]; lavadropsiz[z] = lavadropsiz[lavanumdrops]; } } /* Back up dapic with 1 pixel extra on each boundary */ /* (to prevent anding for wrap-around) */ ptr = (long *)dapic; ptr2 = (long *)((LAVASIZ+4)+1+((long)lavabakpic)); for(x=0;x<LAVASIZ;x++) { for(y=(LAVASIZ>>2);y>0;y--) *ptr2++ = ((*ptr++)&0x1f1f1f1f); ptr2++; } for(y=0;y<LAVASIZ;y++) { lavabakpic[y+1] = (dapic[y+((LAVASIZ-1)<<LAVALOGSIZ)]&31); lavabakpic[y+1+(LAVASIZ+1)*(LAVASIZ+4)] = (dapic[y]&31); } for(x=0;x<LAVASIZ;x++) { lavabakpic[(x+1)*(LAVASIZ+4)] = (dapic[(x<<LAVALOGSIZ)+(LAVASIZ-1)]&31); lavabakpic[(x+1)*(LAVASIZ+4)+(LAVASIZ+1)] = (dapic[x<<LAVALOGSIZ]&31); } lavabakpic[0] = (dapic[LAVASIZ*LAVASIZ-1]&31); lavabakpic[LAVASIZ+1] = (dapic[LAVASIZ*(LAVASIZ-1)]&31); lavabakpic[(LAVASIZ+4)*(LAVASIZ+1)] = (dapic[LAVASIZ-1]&31); lavabakpic[(LAVASIZ+4)*(LAVASIZ+2)-1] = (dapic[0]&31); ptr = (long *)dapic; for(x=0;x<LAVASIZ;x++) { i = (long)&lavabakpic[(x+1)*(LAVASIZ+4)+1]; j = i+LAVASIZ; for(y=i;y<j;y+=4) { *ptr++ = ((addlava(y+0)&0xf8)>>3)+ ((addlava(y+1)&0xf8)<<5)+ ((addlava(y+2)&0xf8)<<13)+ ((addlava(y+3)&0xf8)<<21)+ 0xc2c2c2c2; } } lavanumframes++;}void drawtilebackground (long thex, long they, short tilenum, signed char shade, long cx1, long cy1, long cx2, long cy2, char dapalnum){ long x, y, xsiz, ysiz, tx1, ty1, tx2, ty2; xsiz = tilesizx[tilenum]; tx1 = cx1/xsiz; tx2 = cx2/xsiz; ysiz = tilesizy[tilenum]; ty1 = cy1/ysiz; ty2 = cy2/ysiz; for(x=tx1;x<=tx2;x++) for(y=ty1;y<=ty2;y++) rotatesprite(x*xsiz<<16,y*ysiz<<16,65536L,0,tilenum,shade,dapalnum,8+16+64+128,cx1,cy1,cx2,cy2);}void printext(long x, long y, char *buffer, short tilenum, char invisiblecol){ long i; char ch; for(i=0;buffer[i]!=0;i++) { ch = buffer[i]; rotatesprite((x-((8&15)<<3))<<16,(y-((8>>4)<<3))<<16,65536L,0,tilenum,0,0,8+16+64+128,x,y,x+7,y+7); rotatesprite((x-((ch&15)<<3))<<16,(y-((ch>>4)<<3))<<16,65536L,0,tilenum,0,0,8+16+128,x,y,x+7,y+7); x += 8; }}static long ostatusflytime = 0x80000000;void drawstatusflytime(short snum) { /* Andy did this */ long nstatusflytime; if ((snum == screenpeek) && (screensize <= xdim)) { nstatusflytime = (((flytime[snum] + 119) - lockclock) / 120); if (nstatusflytime > 1000) nstatusflytime = 1000; else if (nstatusflytime < 0) nstatusflytime = 0; if (nstatusflytime != ostatusflytime) { if (nstatusflytime > 999) sprintf((char*)&tempbuf,"FT:BIG"); else sprintf((char*)&tempbuf,"FT:%3ld",nstatusflytime); printext((xdim - 56L),(ydim - 20L),tempbuf,ALPHABET,80); ostatusflytime = nstatusflytime; } }}void drawstatusbar(short snum) { /* Andy did this */ long nstatusflytime; if ((snum == screenpeek) && (screensize <= xdim)) { sprintf((char*)&tempbuf,"Deaths:%d",deaths[snum]); printext((xdim>>1)-(strlen(tempbuf)<<2),ydim-16,tempbuf,ALPHABET,80); sprintf((char*)&tempbuf,"Health:%3ld",health[snum]); printext((xdim>>1)-(strlen(tempbuf)<<2),ydim-24,tempbuf,ALPHABET,80); sprintf((char*)&tempbuf,"B:%3d",numbombs[snum]); printext(8L,(ydim - 28L),tempbuf,ALPHABET,80); sprintf((char*)&tempbuf,"M:%3d",nummissiles[snum]); printext(8L,(ydim - 20L),tempbuf,ALPHABET,80); sprintf((char*)&tempbuf,"G:%3d",numgrabbers[snum]); printext(8L,(ydim - 12L),tempbuf,ALPHABET,80); nstatusflytime = (((flytime[snum] + 119) - lockclock) / 120); if (nstatusflytime < 0) { sprintf((char*)&tempbuf,"FT: 0"); ostatusflytime = 0; } else if (nstatusflytime > 999) { sprintf((char*)&tempbuf,"FT:BIG"); ostatusflytime = 999; } else { sprintf((char*)&tempbuf,"FT:%3ld",nstatusflytime); ostatusflytime = nstatusflytime; } printext((xdim - 56L),(ydim - 20L),tempbuf,ALPHABET,80); }}void setup3dscreen(void){ long i, dax, day, dax2, day2; i = setgamemode(option[0],vesares[option[6]&15][0],vesares[option[6]&15][1]); if (i < 0) { printf("VESA driver for (%ld * %ld) not found/supported.\n",xdim,ydim); printf(" Press ENTER to play in NORMAL mode instead\n"); printf(" Press ESC to quit to DOS\n"); keystatus[1] = keystatus[0x1c] = keystatus[0x9c] = 0; while (!keystatus[1]) if (keystatus[0x1c]|keystatus[0x9c]) { option[0] = vidoption = 2; i = setgamemode(option[0],vesares[option[6]&15][0],vesares[option[6]&15][1]); break; } } if (i < 0) { sendlogoff(); musicoff(); uninitmultiplayers(); uninittimer(); uninitkeys(); uninitengine(); uninitsb(); uninitgroupfile(); exit(0); } /* Make that ugly pink into black in case it ever shows up! */ i = 0L; VBE_setPalette(255,1,(char *)&i); /*outp(0x3c8,255); outp(0x3c9,0); outp(0x3c9,0); outp(0x3c9,0);*/ screensize = xdim; if (screensize > xdim) { dax = 0; day = 0; dax2 = xdim-1; day2 = ydim-1; } else { dax = ((xdim-screensize)>>1); dax2 = dax+screensize-1; day = (((ydim-32)-scale(screensize,ydim-32,xdim))>>1); day2 = day + scale(screensize,ydim-32,xdim)-1; setview(dax,day,dax2,day2); } flushperms(); if (screensize < xdim) drawtilebackground(0L,0L,BACKGROUND,8,0L,0L,xdim-1L,ydim-1L,0); /* Draw background */ if (screensize <= xdim) { rotatesprite((xdim-320)<<15,(ydim-32)<<16,65536L,0,STATUSBAR,0,0,8+16+64+128,0L,0L,xdim-1L,ydim-1L); i = ((xdim-320)>>1); while (i >= 8) i -= 8, rotatesprite(i<<16,(ydim-32)<<16,65536L,0,STATUSBARFILL8,0,0,8+16+64+128,0L,0L,xdim-1L,ydim-1L); if (i >= 4) i -= 4, rotatesprite(i<<16,(ydim-32)<<16,65536L,0,STATUSBARFILL4,0,0,8+16+64+128,0L,0L,xdim-1L,ydim-1L); i = ((xdim-320)>>1)+320; while (i <= xdim-8) rotatesprite(i<<16,(ydim-32)<<16,65536L,0,STATUSBARFILL8,0,0,8+16+64+128,0L,0L,xdim-1L,ydim-1L), i += 8; if (i <= xdim-4) rotatesprite(i<<16,(ydim-32)<<16,65536L,0,STATUSBARFILL4,0,0,8+16+64+128,0L,0L,xdim-1L,ydim-1L), i += 4; drawstatusbar(screenpeek); /* Andy did this */ }}void setinterpolation(long *posptr){ long i; if (numinterpolations >= MAXINTERPOLATIONS) return; for(i=numinterpolations-1;i>=0;i--) if (curipos[i] == posptr) return;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -