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

📄 engine.c

📁 小型游戏引擎
💻 C
📖 第 1 页 / 共 5 页
字号:
/* * "Build Engine & Tools" Copyright (c) 1993-1997 Ken Silverman * Ken Silverman's official web site: "http://www.advsys.net/ken" * See the included license file "BUILDLIC.TXT" for license info. * This file has been modified from Ken Silverman's original release *//* SUPERBUILD define is in engine.h ... */#define ENGINE/* set this to something non-zero to get loadtile() debugging info on stderr. */#define BUILD_CACHEDEBUG 0#include <string.h>#include <malloc.h>#include <math.h>#include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <sys/types.h>#include <sys/stat.h>#if (defined USE_OPENGL)#include "buildgl.h"#endif#include "pragmas.h"#include "platform.h"#include "build.h"#include "cache1d.h"#include "engine.h"long stereowidth = 23040, stereopixelwidth = 28, ostereopixelwidth = -1;volatile long stereomode = 0, visualpage, activepage, whiteband, blackband;volatile char oa1, o3c2, ortca, ortcb, overtbits, laststereoint;#include "display.h"#define MAXCLIPNUM 512#define MAXPERMS 512#define MAXTILEFILES 256#define MAXYSAVES ((MAXXDIM*MAXSPRITES)>>7)#define MAXNODESPERLINE 42   /* Warning: This depends on MAXYSAVES & MAXYDIM! */#define MAXWALLSB 2048#define MAXCLIPDIST 1024#ifdef PLATFORM_DOS	/* MUST CALL MALLOC THIS WAY TO FORCE CALLS TO KMALLOC! */void *kmalloc(size_t size) { return(malloc(size)); }void *kkmalloc(size_t size);#pragma aux kkmalloc =\	"call kmalloc",\	parm [eax]\	/* MUST CALL FREE THIS WAY TO FORCE CALLS TO KFREE! */void kfree(void *buffer) { free(buffer); }void kkfree(void *buffer);#pragma aux kkfree =\	"call kfree",\	parm [eax]\#endif#ifdef SUPERBUILD	/* MUST CALL LOADVOXEL THIS WAY BECAUSE WATCOM STINKS! *//* !!! wtf does this do?! --ryan. */static void loadvoxel(long voxindex){    voxindex = 0;  /* prevent compiler whining. */}#if ((defined __WATCOMC__) && (defined PLATFORM_DOS))void kloadvoxel(long voxindex);#pragma aux kloadvoxel =\	"call loadvoxel",\	parm [eax]\#else#define kloadvoxel(a) (loadvoxel(a))#endif	/* These variables need to be copied into BUILD */#define MAXXSIZ 128#define MAXYSIZ 128#define MAXZSIZ 200#define MAXVOXELS 512#define MAXVOXMIPS 5long voxoff[MAXVOXELS][MAXVOXMIPS], voxlock[MAXVOXELS][MAXVOXMIPS];static long ggxinc[MAXXSIZ+1], ggyinc[MAXXSIZ+1];static long lowrecip[1024], nytooclose, nytoofar;static unsigned long distrecip[16384];#endif/* used to be static. --ryan. */char moustat = 0;long transarea = 0, totalarea = 0, beforedrawrooms = 1;/* used to be static. --ryan. */long oxdimen = -1, oviewingrange = -1, oxyaspect = -1;/* used to be static. --ryan. */long curbrightness = 0;	/* Textured Map variables */static char globalpolytype;static short *dotp1[MAXYDIM], *dotp2[MAXYDIM];static unsigned char tempbuf[MAXWALLS];long ebpbak, espbak;long slopalookup[2048];/* * !!! used to be static. If we ever put the original setgamemode() back, this * !!! can be made static again.  --ryan. */unsigned char permanentlock = 255;long artversion, mapversion;char *pic = NULL;char picsiz[MAXTILES], tilefilenum[MAXTILES];long lastageclock;long tilefileoffs[MAXTILES];long artsize = 0, cachesize = 0;static short radarang[1280], radarang2[MAXXDIM];static unsigned short sqrtable[4096], shlookup[4096+256];char pow2char[8] = {1,2,4,8,16,32,64,-128};long pow2long[32] ={	1L,2L,4L,8L,	16L,32L,64L,128L,	256L,512L,1024L,2048L,	4096L,8192L,16384L,32768L,	65536L,131072L,262144L,524288L,	1048576L,2097152L,4194304L,8388608L,	16777216L,33554432L,67108864L,134217728L,	268435456L,536870912L,1073741824L,2147483647L,};long reciptable[2048], fpuasm;char kensmessage[128];/* rcg02132001 Cygwin support. */#if (defined C_IDENTIFIERS_UNDERSCORED)#define SYM_sqrtable   "_sqrtable"#define SYM_walock     "_walock"#define SYM_shlookup   "_shlookup"#define SYM_pow2char   "_pow2char"#define SYM_gotpic     "_gotpic"#define SYM_dmval      "_dmval"#else#define SYM_sqrtable   "sqrtable"#define SYM_walock     "walock"#define SYM_shlookup   "shlookup"#define SYM_pow2char   "pow2char"#define SYM_gotpic     "gotpic"#define SYM_dmval      "dmval"#endifchar britable[16][64];char textfont[1024], smalltextfont[1024];static long xb1[MAXWALLSB], yb1[MAXWALLSB], xb2[MAXWALLSB], yb2[MAXWALLSB];static long rx1[MAXWALLSB], ry1[MAXWALLSB], rx2[MAXWALLSB], ry2[MAXWALLSB];static short p2[MAXWALLSB], thesector[MAXWALLSB], thewall[MAXWALLSB];static short bunchfirst[MAXWALLSB], bunchlast[MAXWALLSB];static short smost[MAXYSAVES], smostcnt;static short smoststart[MAXWALLSB];static char smostwalltype[MAXWALLSB];static long smostwall[MAXWALLSB], smostwallcnt = -1L;static short maskwall[MAXWALLSB], maskwallcnt;static long spritesx[MAXSPRITESONSCREEN];static long spritesy[MAXSPRITESONSCREEN+1];static long spritesz[MAXSPRITESONSCREEN];static spritetype *tspriteptr[MAXSPRITESONSCREEN];short umost[MAXXDIM], dmost[MAXXDIM];static short bakumost[MAXXDIM], bakdmost[MAXXDIM];short uplc[MAXXDIM], dplc[MAXXDIM];static short uwall[MAXXDIM], dwall[MAXXDIM];static long swplc[MAXXDIM], lplc[MAXXDIM];static long swall[MAXXDIM], lwall[MAXXDIM+4];long xdimen = -1, xdimenrecip, halfxdimen, xdimenscale, xdimscale;long wx1, wy1, wx2, wy2, ydimen;long viewoffset, frameoffset;static long rxi[8], ryi[8], rzi[8], rxi2[8], ryi2[8], rzi2[8];static long xsi[8], ysi[8];/* used to be static. --ryan. */long *horizlookup, *horizlookup2, horizycent;long globalposx, globalposy, globalposz, globalhoriz;short globalang, globalcursectnum;long globalpal, cosglobalang, singlobalang;long cosviewingrangeglobalang, sinviewingrangeglobalang;char *globalpalwritten;long globaluclip, globaldclip, globvis;long globalvisibility, globalhisibility, globalpisibility, globalcisibility;char globparaceilclip, globparaflorclip;long xyaspect, viewingrangerecip;long asm1, asm2, asm3, asm4;long vplce[4], vince[4], palookupoffse[4], bufplce[4];char globalxshift, globalyshift;long globalxpanning, globalypanning, globalshade;short globalpicnum, globalshiftval;long globalzd, globalbufplc, globalyscale, globalorientation;long globalx1, globaly1, globalx2, globaly2, globalx3, globaly3, globalzx;long globalx, globaly, globalz;static short sectorborder[256], sectorbordercnt;static char tablesloaded = 0;long pageoffset, ydim16, qsetmode = 0;long startposx, startposy, startposz;short startang, startsectnum;short pointhighlight, linehighlight, highlightcnt;static long lastx[MAXYDIM];char *transluc = NULL, paletteloaded = 0;#define FASTPALGRIDSIZ 8static long rdist[129], gdist[129], bdist[129];static char colhere[((FASTPALGRIDSIZ+2)*(FASTPALGRIDSIZ+2)*(FASTPALGRIDSIZ+2))>>3];static char colhead[(FASTPALGRIDSIZ+2)*(FASTPALGRIDSIZ+2)*(FASTPALGRIDSIZ+2)];static long colnext[256];static char coldist[8] = {0,1,2,3,4,3,2,1};static long colscan[27];static short clipnum, hitwalls[4];long hitscangoalx = (1<<29)-1, hitscangoaly = (1<<29)-1;typedef struct { long x1, y1, x2, y2; } linetype;static linetype clipit[MAXCLIPNUM];static short clipsectorlist[MAXCLIPNUM], clipsectnum;static short clipobjectval[MAXCLIPNUM];typedef struct{	long sx, sy, z;	short a, picnum;	signed char dashade;	unsigned char dapalnum, dastat, pagesleft;	long cx1, cy1, cx2, cy2;} permfifotype;static permfifotype permfifo[MAXPERMS];static long permhead = 0, permtail = 0;short numscans, numhits, numbunches;short editstatus = 0;short searchit;long searchx = -1, searchy;                     /* search input  */short searchsector, searchwall, searchstat;     /* search output */static char artfilename[20];static long numtilefiles, artfil = -1, artfilnum, artfilplc;static char inpreparemirror = 0;static long mirrorsx1, mirrorsy1, mirrorsx2, mirrorsy2;long totalclocklock;/* !!! can we move this somewhere?   --ryan. */#if ((defined USE_I386_ASM) && (defined __WATCOMC__))extern long mmxoverlay();#pragma aux mmxoverlay modify [eax ebx ecx edx];extern long sethlinesizes(long,long,long);#pragma aux sethlinesizes parm [eax][ebx][ecx];extern long setpalookupaddress(char *);#pragma aux setpalookupaddress parm [eax];extern long setuphlineasm4(long,long);#pragma aux setuphlineasm4 parm [eax][ebx];extern long hlineasm4(long,long,long,long,long,long);#pragma aux hlineasm4 parm [eax][ebx][ecx][edx][esi][edi];extern long setuprhlineasm4(long,long,long,long,long,long);#pragma aux setuprhlineasm4 parm [eax][ebx][ecx][edx][esi][edi];extern long rhlineasm4(long,long,long,long,long,long);#pragma aux rhlineasm4 parm [eax][ebx][ecx][edx][esi][edi];extern long setuprmhlineasm4(long,long,long,long,long,long);#pragma aux setuprmhlineasm4 parm [eax][ebx][ecx][edx][esi][edi];extern long rmhlineasm4(long,long,long,long,long,long);#pragma aux rmhlineasm4 parm [eax][ebx][ecx][edx][esi][edi];extern long setupqrhlineasm4(long,long,long,long,long,long);#pragma aux setupqrhlineasm4 parm [eax][ebx][ecx][edx][esi][edi];extern long qrhlineasm4(long,long,long,long,long,long);#pragma aux qrhlineasm4 parm [eax][ebx][ecx][edx][esi][edi];extern long setvlinebpl(long);#pragma aux setvlinebpl parm [eax];extern long fixtransluscence(long);#pragma aux fixtransluscence parm [eax];extern long prevlineasm1(long,long,long,long,long,long);#pragma aux prevlineasm1 parm [eax][ebx][ecx][edx][esi][edi];extern long vlineasm1(long,long,long,long,long,long);#pragma aux vlineasm1 parm [eax][ebx][ecx][edx][esi][edi];extern long setuptvlineasm(long);#pragma aux setuptvlineasm parm [eax];extern long tvlineasm1(long,long,long,long,long,long);#pragma aux tvlineasm1 parm [eax][ebx][ecx][edx][esi][edi];extern long setuptvlineasm2(long,long,long);#pragma aux setuptvlineasm2 parm [eax][ebx][ecx];extern long tvlineasm2(long,long,long,long,long,long);#pragma aux tvlineasm2 parm [eax][ebx][ecx][edx][esi][edi];extern long mvlineasm1(long,long,long,long,long,long);#pragma aux mvlineasm1 parm [eax][ebx][ecx][edx][esi][edi];extern long setupvlineasm(long);#pragma aux setupvlineasm parm [eax];extern long vlineasm4(long,long);#pragma aux vlineasm4 parm [ecx][edi] modify [eax ebx ecx edx esi edi];extern long setupmvlineasm(long);#pragma aux setupmvlineasm parm [eax];extern long mvlineasm4(long,long);#pragma aux mvlineasm4 parm [ecx][edi] modify [eax ebx ecx edx esi edi];extern void setupspritevline(long,long,long,long,long,long);#pragma aux setupspritevline parm [eax][ebx][ecx][edx][esi][edi];extern void spritevline(long,long,long,long,long,long);#pragma aux spritevline parm [eax][ebx][ecx][edx][esi][edi];extern void msetupspritevline(long,long,long,long,long,long);#pragma aux msetupspritevline parm [eax][ebx][ecx][edx][esi][edi];extern void mspritevline(long,long,long,long,long,long);#pragma aux mspritevline parm [eax][ebx][ecx][edx][esi][edi];extern void tsetupspritevline(long,long,long,long,long,long);#pragma aux tsetupspritevline parm [eax][ebx][ecx][edx][esi][edi];extern void tspritevline(long,long,long,long,long,long);#pragma aux tspritevline parm [eax][ebx][ecx][edx][esi][edi];extern long mhline(long,long,long,long,long,long);#pragma aux mhline parm [eax][ebx][ecx][edx][esi][edi];extern long mhlineskipmodify(long,long,long,long,long,long);#pragma aux mhlineskipmodify parm [eax][ebx][ecx][edx][esi][edi];extern long msethlineshift(long,long);#pragma aux msethlineshift parm [eax][ebx];extern long thline(long,long,long,long,long,long);#pragma aux thline parm [eax][ebx][ecx][edx][esi][edi];extern long thlineskipmodify(long,long,long,long,long,long);#pragma aux thlineskipmodify parm [eax][ebx][ecx][edx][esi][edi];extern long tsethlineshift(long,long);#pragma aux tsethlineshift parm [eax][ebx];extern long setupslopevlin(long,long,long);#pragma aux setupslopevlin parm [eax][ebx][ecx] modify [edx];extern long slopevlin(long,long,long,long,long,long);#pragma aux slopevlin parm [eax][ebx][ecx][edx][esi][edi];extern long settransnormal();#pragma aux settransnormal parm;extern long settransreverse();#pragma aux settransreverse parm;extern long setupdrawslab(long,long);#pragma aux setupdrawslab parm [eax][ebx];extern long drawslab(long,long,long,long,long,long);#pragma aux drawslab parm [eax][ebx][ecx][edx][esi][edi];#else#include "a.h"#endif#if (defined USE_I386_ASM)  #if (defined __WATCOMC__)        long nsqrtasm(int param);    #pragma aux nsqrtasm =\	"test eax, 0xff000000",\	"mov ebx, eax",\	"jnz short over24",\	"shr ebx, 12",\   "mov cx, word ptr shlookup[ebx*2]",\	"jmp short under24",\	"over24: shr ebx, 24",\   "mov cx, word ptr shlookup[ebx*2+8192]",\	"under24: shr eax, cl",\	"mov cl, ch",\	"mov ax, word ptr sqrtable[eax*2]",\	"shr eax, cl",\	parm nomemory [eax]\	modify exact [eax ebx ecx]\  #elif (defined __GNUC__)        static long nsqrtasm(int i1)        {            long retval;            __asm__ __volatile__ (                "\n\t"            	"testl $0xff000000, %%eax\n\t"	            "movl %%eax, %%ebx\n\t"    	        "jnz nsqrover24\n\t"        	    "shrl $12, %%ebx\n\t"            	"movw " SYM_shlookup "(, %%ebx, 2), %%cx\n\t"	            "jmp nsqrunder24\n\t"        	    "nsqrover24: shr $24, %%ebx\n\t"    	        "movw (" SYM_shlookup "+ 8192)(, %%ebx, 2), %%cx\n\t"        	    "nsqrunder24: shrl %%cl, %%eax\n\t"    	        "movb %%ch, %%cl\n\t"        	    "movw " SYM_sqrtable "(, %%eax, 2), %%ax\n\t"    	        "shrl %%cl, %%eax\n\t"            : "=a" (retval) : "a" (i1) : "ebx", "ecx", "cc");            return(retval);        } /* nsqrtasm */    #else        #error Please write Assembly code for your platform!  #endif#else /* !defined USE_I386_ASM */        static long nsqrtasm(long eax)        {            return((long) sqrt(eax));   /* !!! this might be wrong, due to precision issues. */        } /* nsqrtasm */#endif /* defined USE_I386_ASM */

⌨️ 快捷键说明

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