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

📄 game.c

📁 小型游戏引擎
💻 C
📖 第 1 页 / 共 5 页
字号:
};	/*     * 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 + -