?? game.c
字號(hào):
curipos[numinterpolations] = posptr; oldipos[numinterpolations] = *posptr; numinterpolations++;}void stopinterpolation(long *posptr){ long i; for(i=numinterpolations-1;i>=startofdynamicinterpolations;i--) if (curipos[i] == posptr) { numinterpolations--; oldipos[i] = oldipos[numinterpolations]; bakipos[i] = bakipos[numinterpolations]; curipos[i] = curipos[numinterpolations]; }}void updateinterpolations() /* Stick at beginning of domovethings */{ long i; for(i=numinterpolations-1;i>=0;i--) oldipos[i] = *curipos[i];}void dointerpolations() /* Stick at beginning of drawscreen */{ long i, j, odelta, ndelta; ndelta = 0; j = 0; for(i=numinterpolations-1;i>=0;i--) { bakipos[i] = *curipos[i]; odelta = ndelta; ndelta = (*curipos[i])-oldipos[i]; if (odelta != ndelta) j = mulscale16(ndelta,smoothratio); *curipos[i] = oldipos[i]+j; }}void restoreinterpolations() /* Stick at end of drawscreen */{ long i; for(i=numinterpolations-1;i>=0;i--) *curipos[i] = bakipos[i];}void searchmap(short startsector){ long i, j, dasect, splc, send, startwall, endwall; short dapic; walltype *wal; if ((startsector < 0) || (startsector >= numsectors)) return; for(i=0;i<(MAXSECTORS>>3);i++) show2dsector[i] = 0; for(i=0;i<(MAXWALLS>>3);i++) show2dwall[i] = 0; for(i=0;i<(MAXSPRITES>>3);i++) show2dsprite[i] = 0; automapping = 0; /* Search your area recursively & set all show2dsector/show2dwalls */ tempshort[0] = startsector; show2dsector[startsector>>3] |= (1<<(startsector&7)); dapic = sector[startsector].ceilingpicnum; if (waloff[dapic] == 0) loadtile(dapic); dapic = sector[startsector].floorpicnum; if (waloff[dapic] == 0) loadtile(dapic); for(splc=0,send=1;splc<send;splc++) { dasect = tempshort[splc]; startwall = sector[dasect].wallptr; endwall = startwall + sector[dasect].wallnum; for(i=startwall,wal=&wall[startwall];i<endwall;i++,wal++) { show2dwall[i>>3] |= (1<<(i&7)); dapic = wall[i].picnum; if (waloff[dapic] == 0) loadtile(dapic); dapic = wall[i].overpicnum; if (((dapic&0xfffff000) == 0) && (waloff[dapic] == 0)) loadtile(dapic); j = wal->nextsector; if ((j >= 0) && ((show2dsector[j>>3]&(1<<(j&7))) == 0)) { show2dsector[j>>3] |= (1<<(j&7)); dapic = sector[j].ceilingpicnum; if (waloff[dapic] == 0) loadtile(dapic); dapic = sector[j].floorpicnum; if (waloff[dapic] == 0) loadtile(dapic); tempshort[send++] = (short)j; } } for(i=headspritesect[dasect];i>=0;i=nextspritesect[i]) { show2dsprite[i>>3] |= (1<<(i&7)); dapic = sprite[i].picnum; if (waloff[dapic] == 0) loadtile(dapic); } }}void prepareboard(char *daboardfilename){ short startwall, endwall, dasector; /*long i, j, k, s, dax, day, daz, dax2, day2;*/ long i, j, k=0, s, dax, day, dax2, day2; getmessageleng = 0; typemessageleng = 0; randomseed = 17L; /* Clear (do)animation's list */ animatecnt = 0; typemode = 0; locselectedgun = 0; locselectedgun2 = 0; if (loadboard(daboardfilename,&posx[0],&posy[0],&posz[0],&ang[0],&cursectnum[0]) == -1) { musicoff(); uninitmultiplayers(); uninittimer(); uninitkeys(); uninitengine(); uninitsb(); uninitgroupfile(); setvmode(0x3); /* Set back to text mode */ printf("Board not found\n"); exit(0); } setup3dscreen(); for(i=0;i<MAXPLAYERS;i++) { posx[i] = posx[0]; posy[i] = posy[0]; posz[i] = posz[0]; ang[i] = ang[0]; cursectnum[i] = cursectnum[0]; ocursectnum[i] = cursectnum[0]; horiz[i] = 100; lastchaingun[i] = 0; health[i] = 100; dimensionmode[i] = 3; numbombs[i] = 0; numgrabbers[i] = 0; nummissiles[i] = 0; flytime[i] = 0L; zoom[i] = 768L; deaths[i] = 0L; playersprite[i] = -1; screensize = xdim; oposx[i] = posx[0]; oposy[i] = posy[0]; oposz[i] = posz[0]; ohoriz[i] = horiz[0]; ozoom[i] = zoom[0]; oang[i] = ang[0]; } myx = omyx = posx[myconnectindex]; myy = omyy = posy[myconnectindex]; myz = omyz = posz[myconnectindex]; myhoriz = omyhoriz = horiz[myconnectindex]; myang = omyang = ang[myconnectindex]; mycursectnum = cursectnum[myconnectindex]; myzvel = 0; movefifoplc = fakemovefifoplc = 0; syncvalhead = 0L; othersyncvalhead = 0L; syncvaltottail = 0L; syncvaltail = 0L; numinterpolations = 0; clearbufbyte(&oloc,sizeof(input),0L); for(i=0;i<MAXPLAYERS;i++) { movefifoend[i] = 0; clearbufbyte(&ffsync[i],sizeof(input),0L); clearbufbyte(&_sync[i],sizeof(input),0L); clearbufbyte(&osync[i],sizeof(input),0L); } /* Scan sector tags */ for(i=0;i<MAXPLAYERS;i++) { waterfountainwall[i] = -1; waterfountaincnt[i] = 0; } slimesoundcnt[i] = 0; warpsectorcnt = 0; /* Make a list of warping sectors */ xpanningsectorcnt = 0; /* Make a list of wall x-panning sectors */ floorpanningcnt = 0; /* Make a list of slime sectors */ dragsectorcnt = 0; /* Make a list of moving platforms */ swingcnt = 0; /* Make a list of swinging doors */ revolvecnt = 0; /* Make a list of revolving doors */ subwaytrackcnt = 0; /* Make a list of subways */ floormirrorcnt = 0; tilesizx[FLOORMIRROR] = 0; tilesizy[FLOORMIRROR] = 0; for(i=0;i<numsectors;i++) { switch(sector[i].lotag) { case 4: floorpanninglist[floorpanningcnt++] = i; break; case 10: warpsectorlist[warpsectorcnt++] = i; break; case 11: xpanningsectorlist[xpanningsectorcnt++] = i; break; case 12: dasector = i; dax = 0x7fffffff; day = 0x7fffffff; dax2 = 0x80000000; day2 = 0x80000000; startwall = sector[i].wallptr; endwall = startwall+sector[i].wallnum; for(j=startwall;j<endwall;j++) { if (wall[j].x < dax) dax = wall[j].x; if (wall[j].y < day) day = wall[j].y; if (wall[j].x > dax2) dax2 = wall[j].x; if (wall[j].y > day2) day2 = wall[j].y; if (wall[j].lotag == 3) k = j; } if (wall[k].x == dax) dragxdir[dragsectorcnt] = -16; if (wall[k].y == day) dragydir[dragsectorcnt] = -16; if (wall[k].x == dax2) dragxdir[dragsectorcnt] = 16; if (wall[k].y == day2) dragydir[dragsectorcnt] = 16; dasector = wall[startwall].nextsector; dragx1[dragsectorcnt] = 0x7fffffff; dragy1[dragsectorcnt] = 0x7fffffff; dragx2[dragsectorcnt] = 0x80000000; dragy2[dragsectorcnt] = 0x80000000; startwall = sector[dasector].wallptr; endwall = startwall+sector[dasector].wallnum; for(j=startwall;j<endwall;j++) { if (wall[j].x < dragx1[dragsectorcnt]) dragx1[dragsectorcnt] = wall[j].x; if (wall[j].y < dragy1[dragsectorcnt]) dragy1[dragsectorcnt] = wall[j].y; if (wall[j].x > dragx2[dragsectorcnt]) dragx2[dragsectorcnt] = wall[j].x; if (wall[j].y > dragy2[dragsectorcnt]) dragy2[dragsectorcnt] = wall[j].y; setinterpolation(§or[dasector].floorz); setinterpolation(&wall[j].x); setinterpolation(&wall[j].y); setinterpolation(&wall[wall[j].nextwall].x); setinterpolation(&wall[wall[j].nextwall].y); } dragx1[dragsectorcnt] += (wall[sector[i].wallptr].x-dax); dragy1[dragsectorcnt] += (wall[sector[i].wallptr].y-day); dragx2[dragsectorcnt] -= (dax2-wall[sector[i].wallptr].x); dragy2[dragsectorcnt] -= (day2-wall[sector[i].wallptr].y); dragfloorz[dragsectorcnt] = sector[i].floorz; dragsectorlist[dragsectorcnt++] = i; break; case 13: startwall = sector[i].wallptr; endwall = startwall+sector[i].wallnum; for(j=startwall;j<endwall;j++) { if (wall[j].lotag == 4) { k = wall[wall[wall[wall[j].point2].point2].point2].point2; if ((wall[j].x == wall[k].x) && (wall[j].y == wall[k].y)) { /* Door opens counterclockwise */ swingwall[swingcnt][0] = j; swingwall[swingcnt][1] = wall[j].point2; swingwall[swingcnt][2] = wall[wall[j].point2].point2; swingwall[swingcnt][3] = wall[wall[wall[j].point2].point2].point2; swingangopen[swingcnt] = 1536; swingangclosed[swingcnt] = 0; swingangopendir[swingcnt] = -1; } else { /* Door opens clockwise */ swingwall[swingcnt][0] = wall[j].point2; swingwall[swingcnt][1] = j; swingwall[swingcnt][2] = lastwall(j); swingwall[swingcnt][3] = lastwall(swingwall[swingcnt][2]); swingwall[swingcnt][4] = lastwall(swingwall[swingcnt][3]); swingangopen[swingcnt] = 512; swingangclosed[swingcnt] = 0; swingangopendir[swingcnt] = 1; } for(k=0;k<4;k++) { swingx[swingcnt][k] = wall[swingwall[swingcnt][k]].x; swingy[swingcnt][k] = wall[swingwall[swingcnt][k]].y; } swingsector[swingcnt] = i; swingang[swingcnt] = swingangclosed[swingcnt]; swinganginc[swingcnt] = 0; swingcnt++; } } break; case 14: startwall = sector[i].wallptr; endwall = startwall+sector[i].wallnum; dax = 0L; day = 0L; for(j=startwall;j<endwall;j++) { dax += wall[j].x; day += wall[j].y; } revolvepivotx[revolvecnt] = dax / (endwall-startwall); revolvepivoty[revolvecnt] = day / (endwall-startwall); k = 0; for(j=startwall;j<endwall;j++) { revolvex[revolvecnt][k] = wall[j].x; revolvey[revolvecnt][k] = wall[j].y; setinterpolation(&wall[j].x); setinterpolation(&wall[j].y); setinterpolation(&wall[wall[j].nextwall].x); setinterpolation(&wall[wall[j].nextwall].y); k++; } revolvesector[revolvecnt] = i; revolveang[revolvecnt] = 0; revolvecnt++; break; case 15: subwaytracksector[subwaytrackcnt][0] = i; subwaystopcnt[subwaytrackcnt] = 0; dax = 0x7fffffff; day = 0x7fffffff; dax2 = 0x80000000; day2 = 0x80000000; startwall = sector[i].wallptr; endwall = startwall+sector[i].wallnum; for(j=startwall;j<endwall;j++) { if (wall[j].x < dax) dax = wall[j].x; if (wall[j].y < day) day = wall[j].y; if (wall[j].x > dax2) dax2 = wall[j].x; if (wall[j].y > day2) day2 = wall[j].y; } for(j=startwall;j<endwall;j++) { if (wall[j].lotag == 5) { if ((wall[j].x > dax) && (wall[j].y > day) && (wall[j].x < dax2) && (wall[j].y < day2)) { subwayx[subwaytrackcnt] = wall[j].x; } else { subwaystop[subwaytrackcnt][subwaystopcnt[subwaytrackcnt]] = wall[j].x; subwaystopcnt[subwaytrackcnt]++; } } } for(j=1;j<subwaystopcnt[subwaytrackcnt];j++) for(k=0;k<j;k++) if (subwaystop[subwaytrackcnt][j] < subwaystop[subwaytrackcnt][k]) { s = subwaystop[subwaytrackcnt][j]; subwaystop[subwaytrackcnt][j] = subwaystop[subwaytrackcnt][k]; subwaystop[subwaytrackcnt][k] = s; } subwaygoalstop[subwaytrackcnt] = 0; for(j=0;j<subwaystopcnt[subwaytrackcnt];j++) if (klabs(subwaystop[subwaytrackcnt][j]-subwayx[subwaytrackcnt]) < klabs(subwaystop[subwaytrackcnt][subwaygoalstop[subwaytrackcnt]]-subwayx[subwaytrackcnt])) subwaygoalstop[subwaytrackcnt] = j; subwaytrackx1[subwaytrackcnt] = dax; subwaytracky1[subwaytrackcnt] = day; subwaytrackx2[subwaytrackcnt] = dax2; subwaytracky2[subwaytrackcnt] = day2; subwaynumsectors[subwaytrackcnt] = 1; for(j=0;j<numsectors;j++) if (j != i) { startwall = sector[j].wallptr; if (wall[startwall].x > subwaytrackx1[subwaytrackcnt]) if (wall[startwall].y > subwaytracky1[subwaytrackcnt]) if (wall[startwall].x < subwaytrackx2[subwaytrackcnt]) if (wall[startwall].y < subwaytracky2[subwaytrackcnt]) { if (sector[j].floorz != sector[i].floorz) {
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -