📄 build.c
字号:
keystatus[0xcb] = 0; keystatus[0xcd] = 0; keystatus[0xc8] = 0; keystatus[0xd0] = 0; keystatus[0x1c] = 0; keystatus[1] = 0; ch = 0; /* Interesting fakery of ch = getch() */ while (ch == 0) { _idle(); if (keystatus[0xcb] > 0) ch = 75; if (keystatus[0xcd] > 0) ch = 77; if (keystatus[0xc8] > 0) ch = 72; if (keystatus[0xd0] > 0) ch = 80; if (keystatus[0x1c] > 0) ch = 13; if (keystatus[1] > 0) ch = 27; } if ((ch == 75) || (ch == 72)) { newhighlight--; if (newhighlight < 0) newhighlight = menunamecnt-1; } if ((ch == 77) || (ch == 80)) { newhighlight++; if (newhighlight >= menunamecnt) newhighlight = 0; } if ((ch == 13) && (menuname[newhighlight][16] == 1)) { if ((menuname[newhighlight][0] == '.') && (menuname[newhighlight][1] == '.')) { i = 0; while ((i < 80) && (menupath[i] != 0)) i++; while ((i > 0) && (menupath[i] != 92)) i--; menupath[i] = 0; } else { #if ((defined PLATFORM_DOS) || (defined PLATFORM_WIN32)) strcat(menupath,"\\"); #elif PLATFORM_UNIX strcat(menupath,"/"); #else #error Define your platform! #endif strcat(menupath,menuname[newhighlight]); } chdir(menuname[newhighlight]); menunamecnt = 0; getfilenames("SUBD"); getfilenames("*.MAP"); sortfilenames(); newhighlight = 0; ch = 0;#ifdef PLATFORM_DOS fillscreen16((399360-pageoffset)>>3,0L,640L*336L);#else fillscreen16(0, 0L,640L*336L);#endif } } while ((ch != 13) && (ch != 27)); if (ch == 13) { menuhighlight = newhighlight; return(newhighlight); } return(-1);}int fillsector(short sectnum, char fillcolor){ long x1, x2, y1, y2, sy, y, templong; long lborder, rborder, uborder, dborder, miny, maxy, dax; short z, zz, startwall, endwall, fillcnt; lborder = 0; rborder = 640; uborder = 0; dborder = ydim16; if (sectnum == -1) return(0); miny = dborder-1; maxy = uborder; startwall = sector[sectnum].wallptr; endwall = startwall + sector[sectnum].wallnum - 1; for(z=startwall;z<=endwall;z++) { y1 = (((wall[z].y-posy)*zoom)>>14)+200; y2 = (((wall[wall[z].point2].y-posy)*zoom)>>14)+200; if (y1 < miny) miny = y1; if (y2 < miny) miny = y2; if (y1 > maxy) maxy = y1; if (y2 > maxy) maxy = y2; } if (miny < uborder) miny = uborder; if (maxy >= dborder) maxy = dborder-1; for(sy=miny+(numframes%3);sy<=maxy;sy+=3) { y = posy+(((sy-200)<<14)/zoom); fillist[0] = lborder; fillcnt = 1; for(z=startwall;z<=endwall;z++) { x1 = wall[z].x; x2 = wall[wall[z].point2].x; y1 = wall[z].y; y2 = wall[wall[z].point2].y; if (y1 > y2) { templong = x1; x1 = x2; x2 = templong; templong = y1; y1 = y2; y2 = templong; } if ((y1 <= y) && (y2 > y)) /*if (x1*(y-y2) + x2*(y1-y) <= 0)*/ { dax = x1+scale(y-y1,x2-x1,y2-y1); dax = (((dax-posx)*zoom)>>14)+320; if (dax >= lborder) fillist[fillcnt++] = dax; } } if (fillcnt > 0) { for(z=1;z<fillcnt;z++) for (zz=0;zz<z;zz++) if (fillist[z] < fillist[zz]) { templong = fillist[z]; fillist[z] = fillist[zz]; fillist[zz] = templong; } for (z=(fillcnt&1);z<fillcnt-1;z+=2) { if (fillist[z] > rborder) break; if (fillist[z+1] > rborder) fillist[z+1] = rborder; drawline16(fillist[z],sy,fillist[z+1],sy,fillcolor); } } } return(0);}int clockdir(short wallstart) /* Returns: 0 is CW, 1 is CCW */{ short i, themin; long minx, templong, x0, x1, x2, y0, y1, y2; minx = 0x7fffffff; themin = -1; i = wallstart-1; do { i++; if (wall[wall[i].point2].x < minx) { minx = wall[wall[i].point2].x; themin = i; } } while ((wall[i].point2 != wallstart) && (i < MAXWALLS)); x0 = wall[themin].x; y0 = wall[themin].y; x1 = wall[wall[themin].point2].x; y1 = wall[wall[themin].point2].y; x2 = wall[wall[wall[themin].point2].point2].x; y2 = wall[wall[wall[themin].point2].point2].y; if ((y1 >= y2) && (y1 <= y0)) return(0); if ((y1 >= y0) && (y1 <= y2)) return(1); templong = (x0-x1)*(y2-y1) - (x2-x1)*(y0-y1); if (templong < 0) return(0); else return(1);}short whitelinescan(short dalinehighlight){ long i, j, k; short sucksect, newnumwalls; sucksect = sectorofwall(dalinehighlight); memcpy(§or[numsectors],§or[sucksect],sizeof(sectortype)); sector[numsectors].wallptr = numwalls; sector[numsectors].wallnum = 0; i = dalinehighlight; newnumwalls = numwalls; do { j = lastwall((short)i); if (wall[j].nextwall >= 0) { j = wall[j].point2; for(k=0;k<numwalls;k++) { if (wall[wall[k].point2].x == wall[j].x) if (wall[wall[k].point2].y == wall[j].y) if (wall[k].nextwall == -1) { j = k; break; } } } memcpy(&wall[newnumwalls],&wall[i],sizeof(walltype)); wall[newnumwalls].nextwall = j; wall[newnumwalls].nextsector = sectorofwall((short)j); newnumwalls++; sector[numsectors].wallnum++; i = j; } while (i != dalinehighlight); for(i=numwalls;i<newnumwalls-1;i++) wall[i].point2 = i+1; wall[newnumwalls-1].point2 = numwalls; if (clockdir(numwalls) == 1) return(-1); else return(newnumwalls);}void printcoords16(long posxe, long posye, short ange){ char snotbuf[80]; long i; sprintf(snotbuf,"x=%ld y=%ld ang=%d",posxe,posye,ange); i = 0; while ((snotbuf[i] != 0) && (i < 30)) i++; while (i < 30) { snotbuf[i] = 32; i++; } snotbuf[30] = 0; statusbar_printext16(8, 128, 11, 6, snotbuf,0); sprintf(snotbuf,"%d/%d sect. %d/%d walls %d/%d spri.",numsectors,MAXSECTORS,numwalls,MAXWALLS,numsprites,MAXSPRITES); i = 0; while ((snotbuf[i] != 0) && (i < 46)) i++; while (i < 46) { snotbuf[i] = 32; i++; } snotbuf[46] = 0; statusbar_printext16(264, 128, 14, 6, snotbuf,0);}int checksectorpointer(short i, short sectnum){ long j, k, startwall, endwall, x1, y1, x2, y2; x1 = wall[i].x; y1 = wall[i].y; x2 = wall[wall[i].point2].x; y2 = wall[wall[i].point2].y; if (wall[i].nextwall >= 0) /* Check for early exit */ { k = wall[i].nextwall; if ((wall[k].x == x2) && (wall[k].y == y2)) if ((wall[wall[k].point2].x == x1) && (wall[wall[k].point2].y == y1)) return(0); } wall[i].nextsector = -1; wall[i].nextwall = -1; for(j=0;j<numsectors;j++) { startwall = sector[j].wallptr; endwall = startwall + sector[j].wallnum - 1; for(k=startwall;k<=endwall;k++) { if ((wall[k].x == x2) && (wall[k].y == y2)) if ((wall[wall[k].point2].x == x1) && (wall[wall[k].point2].y == y1)) if (j != sectnum) { wall[i].nextsector = j; wall[i].nextwall = k; wall[k].nextsector = sectnum; wall[k].nextwall = i; } } } return(0);}void copysector(short soursector, short destsector, short deststartwall, char copystat){ short j, k, m, newnumwalls, startwall, endwall; newnumwalls = deststartwall; /* erase existing sector fragments */ /* duplicate walls */ startwall = sector[soursector].wallptr; endwall = startwall + sector[soursector].wallnum; for(j=startwall;j<endwall;j++) { memcpy(&wall[newnumwalls],&wall[j],sizeof(walltype)); wall[newnumwalls].point2 += deststartwall-startwall; if (wall[newnumwalls].nextwall >= 0) { wall[newnumwalls].nextwall += deststartwall-startwall; wall[newnumwalls].nextsector += destsector-soursector; } newnumwalls++; }#if 0 for(j=deststartwall;j<newnumwalls;j++) { if (wall[j].nextwall >= 0) checksectorpointer(wall[j].nextwall,wall[j].nextsector); checksectorpointer((short)j,destsector); }#endif if (newnumwalls > deststartwall) { /* duplicate sectors */ memcpy(§or[destsector],§or[soursector],sizeof(sectortype)); sector[destsector].wallptr = deststartwall; sector[destsector].wallnum = newnumwalls-deststartwall; if (copystat == 1) { /* duplicate sprites */ j = headspritesect[soursector]; while (j >= 0) { k = nextspritesect[j]; m = insertsprite(destsector,sprite[j].statnum); memcpy(&sprite[m],&sprite[j],sizeof(spritetype)); sprite[m].sectnum = destsector; /* Don't let memcpy overwrite sector! */ j = k; } } }}void showsectordata(short sectnum){ char snotbuf[80]; sprintf(snotbuf,"Sector %d",sectnum); statusbar_printext16(8,32,11,-1,snotbuf,0); sprintf(snotbuf,"Firstwall: %d",sector[sectnum].wallptr); statusbar_printext16(8,48,11,-1,snotbuf,0); sprintf(snotbuf,"Numberofwalls: %d",sector[sectnum].wallnum); statusbar_printext16(8,56,11,-1,snotbuf,0); sprintf(snotbuf,"Firstsprite: %d",headspritesect[sectnum]); statusbar_printext16(8,64,11,-1,snotbuf,0); sprintf(snotbuf,"Tags: %d, %d",sector[sectnum].hitag,sector[sectnum].lotag); statusbar_printext16(8,72,11,-1,snotbuf,0); sprintf(snotbuf," (0x%x), (0x%x)",sector[sectnum].hitag,sector[sectnum].lotag); statusbar_printext16(8,80,11,-1,snotbuf,0); sprintf(snotbuf,"Extra: %d",sector[sectnum].extra); statusbar_printext16(8,88,11,-1,snotbuf,0); sprintf(snotbuf,"Visibility: %d",sector[sectnum].visibility); statusbar_printext16(8,96,11,-1,snotbuf,0); sprintf(snotbuf,"Pixel height: %ld",(sector[sectnum].floorz-sector[sectnum].ceilingz)>>8); statusbar_printext16(8,104,11,-1,snotbuf,0); statusbar_printext16(200,32,11,-1,"CEILINGS:",0); sprintf(snotbuf,"Flags (hex): %x",sector[sectnum].ceilingstat); statusbar_printext16(200,48,11,-1,snotbuf,0); sprintf(snotbuf,"(X,Y)pan: %d, %d",sector[sectnum].ceilingxpanning,sector[sectnum].ceilingypanning); statusbar_printext16(200,56,11,-1,snotbuf,0); sprintf(snotbuf,"Shade byte: %d",sector[sectnum].ceilingshade); statusbar_printext16(200,64,11,-1,snotbuf,0); sprintf(snotbuf,"Z-coordinate: %ld",sector[sectnum].ceilingz); statusbar_printext16(200,72,11,-1,snotbuf,0); sprintf(snotbuf,"Tile number: %d",sector[sectnum].ceilingpicnum); statusbar_printext16(200,80,11,-1,snotbuf,0); sprintf(snotbuf,"Ceiling heinum: %d",sector[sectnum].ceilingheinum); statusbar_printext16(200,88,11,-1,snotbuf,0); sprintf(snotbuf,"Palookup number: %d",sector[sectnum].ceilingpal); statusbar_printext16(200,96,11,-1,snotbuf,0); statusbar_printext16(400,32,11,-1,"FLOORS:",0); sprintf(snotbuf,"Flags (hex): %x",sector[sectnum].floorstat); statusbar_printext16(400,48,11,-1,snotbuf,0); sprintf(snotbuf,"(X,Y)pan: %d, %d",sector[sectnum].floorxpanning,sector[sectnum].floorypanning); statusbar_printext16(400,56,11,-1,snotbuf,0); sprintf(snotbuf,"Shade byte: %d",sector[sectnum].floorshade); statusbar_printext16(400,64,11,-1,snotbuf,0); sprintf(snotbuf,"Z-coordinate: %ld",sector[sectnum].floorz); statusbar_printext16(400,72,11,-1,snotbuf,0); sprintf(snotbuf,"Tile number: %d",sector[sectnum].floorpicnum); statusbar_printext16(400,80,11,-1,snotbuf,0); sprintf(snotbuf,"Floor heinum: %d",sector[sectnum].floorheinum); statusbar_printext16(400,88,11,-1,snotbuf,0); sprintf(snotbuf,"Palookup number: %d",sector[sectnum].floorpal); statusbar_printext16(400,96,11,-1,snotbuf,0);}void showwalldata(short wallnum){ long dax, day, dist; char snotbuf[80]; sprintf(snotbuf,"Wall %d",wallnum); statusbar_printext16(8,32,11,-1,snotbuf,0); sprintf(snotbuf,"X-coordinate: %ld",wall[wallnum].x); statusbar_printext16(8,48,11,-1,snotbuf,0); sprintf(snotbuf,"Y-coordinate: %ld",wall[wallnum].y); statusbar_printext16(8,56,11,-1,snotbuf,0); sprintf(snotbuf,"Point2: %d",wall[wallnum].point2); statusbar_printext16(8,64,11,-1,snotbuf,0); sprintf(snotbuf,"Sector: %d",sectorofwall(wallnum)); statusbar_printext16(8,72,11,-1,snotbuf,0); sprintf(snotbuf,"Tags: %d, %d",wall[wallnum].hitag,wall[wallnum].lotag); statusbar_printext16(8,88,11,-1,snotbuf,0); sprintf(snotbuf," (0x%x), (0x%x)",wall[wallnum].hitag,wall[wallnum].lotag); statusbar_printext16(8,96,11,-1,snotbuf,0); statusbar_printext16(200,32,11,-1,names[wall[wallnum].picnum],0); sprintf(snotbuf,"Flags (hex): %x",wall[wallnum].cstat); statusbar_printext16(200,48,11,-1,snotbuf,0); sprintf(snotbuf,"Shade: %d",wall[wallnum].shade); statusbar_printext16(200,56,11,-1,snotbuf,0); sprintf(snotbuf,"Pal: %d",wall[wallnum].pal); statusbar_printext16(200,64,11,-1,snotbuf,0); sprintf(snotbuf,"(X,Y)repeat: %d, %d",wall[wallnum].xrepeat,wall[wallnum].yrepeat); statusbar_printext16(200,72,11,-1,snotbuf,0); sprintf(snotbuf,"(X,Y)pan: %d, %d",wall[wallnum].xpanning,wall[wallnum].ypanning); statusbar_printext16(200,80,11,-1,snotbuf,0); sprintf(snotbuf,"Tile number: %d",wall[wallnum].picnum); statusbar_printext16(200,88,11,-1,snotbuf,0); sprintf(snotbuf,"OverTile number: %d",wall[wallnum].overpicnum); statusbar_printext16(200,96,11,-1,snotbuf,0); sprintf(snotbuf,"nextsector: %d",wall[wallnum].nextsector); statusbar_printext16(400,48,11,-1,snotbuf,0); sprintf(snotbuf,"nextwall: %d",wall[wallnum].nextwall); statusbar_printext16(400,56,11,-1,snotbuf,0); sprintf(snotbuf,"Extra: %d",wall[wallnum].extra); statusbar_printext16(400,72,11,-1,snotbuf,0); dax = wall[wallnum].x-wall[wall[wallnum].point2].x; day = wall[wallnum].y-wall[wall[wallnum].point2].y; dist = ksqrt(dax*dax+day*day); sprintf(snotbuf,"Wall length: %ld",dist>>4); statusbar_printext16(400,96,11,-1,snotbuf,0); dax = (long)sectorofwall(wallnum); sprintf(snotbuf,"Pixel height: %ld",(sector[dax].floorz-sector[dax].ceilingz)>>8); statusbar_printext16(400,104,11,-1,snotbuf,0);}void showspritedata(short spritenum){ char snotbuf[80]; sprintf(snotbuf,"Sprite %d",spritenum); statusbar_printext16(8,32,11,-1,snotbuf,0); sprintf(snotbuf,"X-coordinate: %ld",sprite[spritenum].x); statusbar_printext16(8,48,11,-1,snotbuf,0); sprintf(snotbuf,"Y-coordinate: %ld",sprite[spritenum].y); statusbar_printext16(8,56,11,-1,snotbuf,0); sprintf(snotbuf,"Z-coordinate: %ld",sprite[spritenum].z); statusbar_printext16(8,64,11,-1,snotbuf,0); sprintf(snotbuf,"Sectnum: %d",sprite[spritenum].sectnum); statusbar_printext16(8,72,11,-1,snotbuf,0); sprintf(snotbuf,"Statnum: %d",sprite[spritenum].statnum); statusbar_printext16(8,80,11,-1,snotbuf,0); sprintf(snotbuf,"Tags: %d, %d",sprite[spritenum].hitag,sprite[spritenum].lotag); statusbar_printext16(8,96,11,-1,snotbuf,0); sprintf(snotbuf," (0x%x), (0x%x)",sprite[spritenum].hitag,sprite[spritenum].lotag); statusbar_printext16(8,104,11,-1,snotbuf,0); statusbar_printext16(200,32,11,-1,names[sprite[spritenum].picnum],0); sprintf(snotbuf,"Flags (hex): %x",sprite[spritenum].cstat); statusbar_printext16(200,48,11,-1,snotbuf,0); sprintf(snotbuf,"Shade: %d",sprite[spritenum].shade); statusbar_printext16(200,56,11,-1,snotbuf,0); sprintf(snotbuf,"Pal: %d",sprite[spritenum].pal); statusbar_printext16(200,64,11,-1,snotbuf,0); sprintf(snotbuf,"(X,Y)repeat: %d, %d",sprite[spritenum].xrepeat,sprite[spritenum].yrepeat); statusbar_printext16(200,72,11,-1,snotbuf,0); sprintf(snotbuf,"(X,Y)offset: %d, %d",sprite[spritenum].xoffset,sprite[spritenum].yoffset); statusbar_printext16(200,80,11,-1,snotbuf,0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -