//------------------------------------------------------------------------- /* Copyright (C) 1996, 2003 - 3D Realms Entertainment Copyright (C) 2005 - Richard Gobeille (Mapster32 functionality) This file is part of Mapster32 Mapster32 is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Original Source: 1996 - Todd Replogle Prepared for public release: 05/24/2003 - Charlie Wiederhold, 3D Realms Modifications for JonoF's port by Jonathon Fowler (jonof@edgenetwk.com) */ //------------------------------------------------------------------------- #include "compat.h" #include "build.h" #include "editor.h" #include "pragmas.h" #include "baselayer.h" #include "names.h" #include "osd.h" #include "osdfuncs.h" #include "cache1d.h" #include "mapster32.h" #include "keys.h" #include "types.h" #include "keyboard.h" #define VERSION " 1.0.5" short floor_over_floor; char *startwin_labeltext = "Starting Mapster32..."; #define MAXHELP2D (signed int)(sizeof(Help2d)/sizeof(Help2d[0])) char *Help2d[]= { " 'A = Autosave toggle", " 'J = Jump to location", " 'L = Sprite/wall location", " 'S = Sprite size", " '3 = Caption mode", #ifdef VULGARITY " '4 = MIN FRAMERATE", #endif " '7 = Swap tags", " '9 = Double size map", " '0 = Shrink map to half size", " X = Flip sector x", " Y = Flip sector y", " F5 = Item count", " F6 = Actor count/SE help", " F7 = Edit sector", " F8 = Edit wall/sprite", " F9 = Sector tag help", " Ctrl-S = Quick save", " Alt-F7 = Search sector lotag", " Alt-F8 = Search wall/sprite tags", " [ = Search forward", " ] = Search backward", }; char *SpriteMode[]= { "NONE", "SECTORS", "WALLS", "SPRITES", "ALL", "ITEMS ONLY", "CURRENT SPRITE ONLY", "ONLY SECTOREFFECTORS AND SECTORS", "NO SECTOREFFECTORS OR SECTORS" }; #define MAXSKILL 5 char *SKILLMODE[MAXSKILL]= { "Actor skill display: PIECE OF CAKE", "Actor skill display: LET'S ROCK", "Actor skill display: COME GET SOME", "Actor skill display: DAMN I'M GOOD", "Actor skill display: ALL SKILL LEVELS" }; #define MAXNOSPRITES 4 char *SPRDSPMODE[MAXNOSPRITES]= { "Sprite display: DISPLAY ALL SPRITES", "Sprite display: NO EFFECTORS", "Sprite display: NO ACTORS", "Sprite display: NO EFFECTORS OR ACTORS" }; #ifdef VULGARITY char *Slow[8]= { "SALES = 0,000,000 ***********************", "100% OF NOTHING IS !! ********************", "RENDER IN PROGRESS ***********************", "YOUR MOTHER IS A WHORE *******************", "YOU SUCK DONKEY **************************", "FUCKIN PISS ANT **************************", "PISS ANT *********************************", "SLOW *************************************" }; #endif #define MAXHELP3D (signed int)(sizeof(Help3d)/sizeof(Help3d[0])) char *Help3d[]= { "Mapster32 3D mode help", " ", " F1 = TOGGLE THIS HELP DISPLAY", " F2 = TOGGLE CLIPBOARD", " F3 = MOUSELOOK", " F6 = AUTOMATIC SECTOREFFECTOR HELP", " F7 = AUTOMATIC SECTOR TAG HELP", "", " ' A = TOGGLE AUTOSAVE", " ' D = CYCLE SPRITE SKILL DISPLAY", " ' G = TOGGLE CLIPBOARD GRAPHIC DISPLAY", " ' R = TOGGLE FRAMERATE DISPLAY", " ' W = TOGGLE SPRITE DISPLAY", " ' X = SPRITE SHADE PREVIEW", " ' Y = TOGGLE PURPLE BACKGROUND", "", " ' T = CHANGE LOTAG", " ' H = CHANGE HITAG", " ' S = CHANGE SHADE", " ' M = CHANGE EXTRA", " ' V = CHANGE VISIBILITY", " ' L = CHANGE LOCATION", " ' C = CHANGE GLOBAL SHADE", "", " ' ENTER = PASTE GRAPHIC ONLY", " ' P & ; P = PASTE PALETTE TO ALL SELECTED SECTORS", " ; V = SET VISIBILITY ON ALL SELECTED SECTORS", " ' DEL = CSTAT=0", " CTRL-S = SAVE BOARD", " HOME = PGUP/PGDN MODIFIER (256 UNITS)", " END = PGUP/PGDN MODIFIER (512 UNITS)", }; long GetTime(void) { return totalclock; } void ExtLoadMap(const char *mapname) { long i; long sky=0; int j; // PreCache Wall Tiles /* for(j=0;j=20 && sprite[j].picnum<=59) { if(sprite[j].picnum==26) { sprite[j].xrepeat = 8; sprite[j].yrepeat = 8; } else { sprite[j].xrepeat = 32; sprite[j].yrepeat = 32; } } } Bstrcpy(levelname,mapname); pskyoff[0]=0; for(i=0;i<8;i++) pskyoff[i]=0; for(i=0;i 10000 && sector[sectnum].lotag < 32767) Bsprintf(lo,"%d 1 TIME SOUND",sector[sectnum].lotag); if(qsetmode != 200) Bsprintf(tempbuf,"%hu,%s",sector[sectnum].hitag,lo); else Bstrcpy(tempbuf,lo); } return(tempbuf); } const char *ExtGetWallCaption(short wallnum) { if(!(onnames==2 || onnames==4)) { tempbuf[0] = 0; return(tempbuf); } // HERE if ((wall[wallnum].lotag|wall[wallnum].hitag) == 0) { tempbuf[0] = 0; } else { Bsprintf(tempbuf,"%hu,%hu",wall[wallnum].hitag,wall[wallnum].lotag); } return(tempbuf); } //end const char *SectorEffectorText(short spritenum) { switch(sprite[spritenum].lotag) { case 0: Bsprintf(tempbuf,"SE: ROTATED SECTOR"); break; case 1: Bsprintf(tempbuf,"SE: PIVOT SPRITE FOR SE 0"); break; case 2: Bsprintf(tempbuf,"SE: EARTHQUAKE"); break; case 3: Bsprintf(tempbuf,"SE: RANDOM LIGHTS AFTER SHOT OUT"); break; case 4: Bsprintf(tempbuf,"SE: RANDOM LIGHTS"); break; case 6: Bsprintf(tempbuf,"SE: SUBWAY"); break; case 7: Bsprintf(tempbuf,"SE: TRANSPORT"); break; case 8: Bsprintf(tempbuf,"SE: UP OPEN DOOR LIGHTS"); break; case 9: Bsprintf(tempbuf,"SE: DOWN OPEN DOOR LIGHTS"); break; case 10: Bsprintf(tempbuf,"SE: DOOR AUTO CLOSE (H=DELAY)"); break; case 11: Bsprintf(tempbuf,"SE: ROTATE SECTOR DOOR"); break; case 12: Bsprintf(tempbuf,"SE: LIGHT SWITCH"); break; case 13: Bsprintf(tempbuf,"SE: EXPLOSIVE"); break; case 14: Bsprintf(tempbuf,"SE: SUBWAY CAR"); break; case 15: Bsprintf(tempbuf,"SE: SLIDE DOOR (ST 25)"); break; case 16: Bsprintf(tempbuf,"SE: ROTATE REACTOR SECTOR"); break; case 17: Bsprintf(tempbuf,"SE: ELEVATOR TRANSPORT (ST 15)"); break; case 18: Bsprintf(tempbuf,"SE: INCREMENTAL SECTOR RISE/FALL"); break; case 19: Bsprintf(tempbuf,"SE: CEILING FALL ON EXPLOSION"); break; case 20: Bsprintf(tempbuf,"SE: BRIDGE (ST 27)"); break; case 21: Bsprintf(tempbuf,"SE: DROP FLOOR (ST 28)"); break; case 22: Bsprintf(tempbuf,"SE: TEETH DOOR (ST 29)"); break; case 23: Bsprintf(tempbuf,"SE: 1-WAY SE7 DESTINATION (H=SE 7)"); break; case 24: Bsprintf(tempbuf,"SE: CONVAYER BELT"); break; case 25: Bsprintf(tempbuf,"SE: ENGINE"); break; case 28: Bsprintf(tempbuf,"SE: LIGHTNING (H= TILE#4890)"); break; case 27: Bsprintf(tempbuf,"SE: CAMERA FOR PLAYBACK"); break; case 29: Bsprintf(tempbuf,"SE: FLOAT"); break; case 30: Bsprintf(tempbuf,"SE: 2 WAY TRAIN (ST=31)"); break; case 31: Bsprintf(tempbuf,"SE: FLOOR RISE"); break; case 32: Bsprintf(tempbuf,"SE: CEILING FALL"); break; case 33: Bsprintf(tempbuf,"SE: SPAWN JIB W/QUAKE"); break; case 36: Bsprintf(tempbuf,"SE: SKRINK RAY SHOOTER"); break; default: SpriteName(spritenum,tempbuf); break; } return (tempbuf); } const char *ExtGetSpriteCaption(short spritenum) { if((onnames!=5 && onnames!=6 &&(!(onnames==3 || onnames==4 || onnames==7 || onnames==8))) || (onnames==7 && sprite[spritenum].picnum!=1)) { tempbuf[0] = 0; return(tempbuf); } if (onnames==5) { switch(sprite[spritenum].picnum) { case FIRSTGUNSPRITE: case CHAINGUNSPRITE : case RPGSPRITE: case FREEZESPRITE: case SHRINKERSPRITE: case HEAVYHBOMB: case TRIPBOMBSPRITE: case SHOTGUNSPRITE: case DEVISTATORSPRITE: case FREEZEAMMO: case AMMO: case BATTERYAMMO: case DEVISTATORAMMO: case RPGAMMO: case GROWAMMO: case CRYSTALAMMO: case HBOMBAMMO: case AMMOLOTS: case SHOTGUNAMMO: case COLA: case SIXPAK: case FIRSTAID: case SHIELD: case STEROIDS: case AIRTANK: case JETPACK: case HEATSENSOR: case ACCESSCARD: case BOOTS: break; default: { tempbuf[0] = 0; return(tempbuf); } } } if( onnames==6 && sprite[spritenum].picnum != sprite[cursprite].picnum) { tempbuf[0] = 0; return(tempbuf); } tempbuf[0] = 0; if ((sprite[spritenum].lotag|sprite[spritenum].hitag) == 0) { SpriteName(spritenum,lo); if(lo[0]!=0) { if(sprite[spritenum].pal==1) Bsprintf(tempbuf,"%s (MULTIPLAYER)",lo); else Bsprintf(tempbuf,"%s",lo); } } else if(sprite[spritenum].picnum==SECTOREFFECTOR) { if (onnames==8) tempbuf[0] = 0; else { Bsprintf(lo,"%s: %hu",SectorEffectorText(spritenum),sprite[spritenum].lotag); Bsprintf(tempbuf,"%s, %hu",lo,sprite[spritenum].hitag); } } else { SpriteName(spritenum,lo); if (sprite[spritenum].extra != -1) Bsprintf(tempbuf,"%hu,%hu,%d %s",sprite[spritenum].hitag,sprite[spritenum].lotag,sprite[spritenum].extra,lo); else Bsprintf(tempbuf,"%hu,%hu %s",sprite[spritenum].hitag,sprite[spritenum].lotag,lo); } return(tempbuf); } //end //printext16 parameters: //printext16(long xpos, long ypos, short col, short backcol, // char name[82], char fontsize) // xpos 0-639 (top left) // ypos 0-479 (top left) // col 0-15 // backcol 0-15, -1 is transparent background // name // fontsize 0=8*8, 1=3*5 //drawline16 parameters: // drawline16(long x1, long y1, long x2, long y2, char col) // x1, x2 0-639 // y1, y2 0-143 (status bar is 144 high, origin is top-left of STATUS BAR) // col 0-15 void ExtShowSectorData(short sectnum) //F5 { short statnum=0; int x,x2,y; int nexti; int i; int secrets=0; int totalactors1=0,totalactors2=0,totalactors3=0,totalactors4=0; int totalrespawn=0; if(qsetmode==200) return; for(i=0;ixmax) xmax=x; } tempbuf[x]=0; printext16(xx*4,ydim16+(y*6)+2,11,-1,tempbuf,1); x=0; y++; if(y>18) {col++; y=6; xx+=xmax; xmax=0; } } enddrawing(); kclose(fp); }// end Show2dText void Show3dText(char *name) { int fp,t; char x=0,y=4,xmax=0,xx=0,col=0; if((fp=kopen4load(name,0)) == -1) { begindrawing(); printext256(1*4,4*8,whitecol,-1,"ERROR: file not found.",0); enddrawing(); return; } t=65; begindrawing(); while(t!=EOF && col<5) { t = 0; if (kread(fp,&t,1)<=0) t = EOF; while(t!=EOF && t!='\n' && x<250) { tempbuf[x]=t; t = 0; if (kread(fp,&t,1)<=0) t = EOF; x++; if(x>xmax) xmax=x; } tempbuf[x]=0; printext256(xx*4,(y*6)+2,whitecol,-1,tempbuf,1); x=0; y++; if(y>18) {col++; y=6; xx+=xmax; xmax=0; } } enddrawing(); kclose(fp); }// end Show3dText void ShowHelpText(char *name) { BFILE *fp; char x=0,y=4; if((fp=fopenfrompath("helpdoc.txt","rb")) == NULL) { begindrawing(); printext256(1*4,4*8,whitecol,-1,"ERROR: file not found.",0); enddrawing(); return; } /* Bfgets(tempbuf,80,fp); while(!Bfeof(fp) && Bstrcmp(tempbuf,"SectorEffector")) { Bfgets(tempbuf,80,fp); } */ y=2; Bfgets(tempbuf,80,fp); Bstrcat(tempbuf,"\n"); begindrawing(); while(!Bfeof(fp) && !(Bstrcmp(tempbuf,"SectorEffector")==0)) { Bfgets(tempbuf,80,fp); Bstrcat(tempbuf,"\n"); printext256(x*4,(y*6)+2,whitecol,-1,tempbuf,1); y++; } enddrawing(); Bfclose(fp); }// end ShowHelpText void ExtShowSpriteData(short spritenum) //F6 { if (qsetmode != 200) Show2dText("sehelp.hlp"); /* if (qsetmode == 200) // In 3D mode return; while (KEY_PRESSED(KEYSC_F6)); ResetKeys(); ContextHelp(spritenum); // Get context sensitive help */ }// end ExtShowSpriteData // Floor Over Floor (duke3d) // If standing in sector with SE42 or SE44 // then draw viewing to SE41 and raise all =hi SE43 cielings. // If standing in sector with SE43 or SE45 // then draw viewing to SE40 and lower all =hi SE42 floors. int fofsizex = -1; int fofsizey = -1; void ResetFOFSize() { if (fofsizex != -1) tilesizx[FOF] = fofsizex; if (fofsizey != -1) tilesizy[FOF] = fofsizey; } static void ExtSE40Draw(int spnum,long x,long y,long z,short a,short h) { static long tempsectorz[MAXSECTORS]; static long tempsectorpicnum[MAXSECTORS]; int i=0,j=0,k=0; int floor1=0,floor2=0,ok=0,fofmode=0,draw_both=0; long offx,offy,offz; if(sprite[spnum].ang!=512) return; // Things are a little different now, as we allow for masked transparent // floors and ceilings. So the FOF textures is no longer required // if (!(gotpic[FOF>>3]&(1<<(FOF&7)))) // return; // gotpic[FOF>>3] &= ~(1<<(FOF&7)); if (tilesizx[562]) { fofsizex = tilesizx[562]; tilesizx[562] = 0; } if (tilesizy[562]) { fofsizey = tilesizy[562]; tilesizy[562] = 0; } floor1=spnum; if(sprite[spnum].lotag==42) fofmode=40; if(sprite[spnum].lotag==43) fofmode=41; if(sprite[spnum].lotag==44) fofmode=40; if(sprite[spnum].lotag==45) fofmode=41; // fofmode=sprite[spnum].lotag-2; // sectnum=sprite[j].sectnum; // sectnum=cursectnum; ok++; /* recursive? for(j=0;j= 1024) offz = sprite[floor2].z; else if (fofmode==41) offz = sector[sprite[floor2].sectnum].floorz; else offz = sector[sprite[floor2].sectnum].ceilingz; if (sprite[floor1].ang >= 1024) offz -= sprite[floor1].z; else if (fofmode==40) offz -= sector[sprite[floor1].sectnum].floorz; else offz -= sector[sprite[floor1].sectnum].ceilingz; // if(ok==2) { Message("no floor2",RED); return; } for(j=0;j 0) //ALT { keystatus[67] = 0; wallsprite=0; curwall = 0; curwallnum = 0; cursearchspritenum = 0; cursectornum=0; cursector_lotag = sector[sectnum].lotag; cursector_lotag=getnumber16("Enter search sector lotag : ", cursector_lotag, 65536L,0); Bsprintf(tempbuf,"Search sector lotag %d",cursector_lotag); printmessage16(tempbuf); } else EditSectorData(sectnum); }// end ExtEditSectorData void ExtEditWallData(short wallnum) //F8 { if(qsetmode==200) return; if ((keystatus[0x38]|keystatus[0xb8]) > 0) //ALT { wallsprite=1; curwall = wallnum; curwallnum = 0; cursearchspritenum = 0; cursectornum = 0; search_lotag = wall[curwall].lotag; search_hitag = wall[curwall].hitag; search_lotag=getnumber16("Enter wall search lotag : ", search_lotag, 65536L,0); search_hitag=getnumber16("Enter wall search hitag : ", search_hitag, 65536L,0); // Bsprintf(tempbuf,"Current wall %d lo=%d hi=%d", // curwall,wall[curwall].lotag,wall[curwall].hitag); Bsprintf(tempbuf,"Search wall lo=%d hi=%d",search_lotag,search_hitag); printmessage16(tempbuf); } else EditWallData(wallnum); } void ExtEditSpriteData(short spritenum) //F8 { if(qsetmode==200) return; if ((keystatus[0x38]|keystatus[0xb8]) > 0) //ALT { wallsprite=2; cursearchsprite = spritenum; curwallnum = 0; cursearchspritenum = 0; cursectornum = 0; search_lotag = sprite[cursearchsprite].lotag; search_hitag = sprite[cursearchsprite].hitag; search_lotag=getnumber16("Enter sprite search lotag : ", search_lotag, 65536L,0); search_hitag=getnumber16("Enter sprite search hitag : ", search_hitag, 65536L,0); Bsprintf(tempbuf,"Search sprite lo=%d hi=%d",search_lotag,search_hitag); printmessage16(tempbuf); } else EditSpriteData(spritenum); } void PrintStatus(char *string,int num,char x,char y,char color) { Bsprintf(tempbuf,"%s %d",string,num); begindrawing(); printext16(x*8,ydim16+y*8,color,-1,tempbuf,0); enddrawing(); } void SpriteName(short spritenum, char *lo2) { Bsprintf(lo2,names[sprite[spritenum].picnum]); }// end SpriteName void ReadPaletteTable() { int i,j,fp; char lookup_num; if((fp=kopen4load("lookup.dat",0)) == -1) { if((fp=kopen4load("lookup.dat",1)) == -1) { initprintf("LOOKUP.DAT not found, creating dummy palette lookups\n"); for(i=0;i<256;i++) tempbuf[i] = ((i+32)&255); //remap colors for screwy palette sectors makepalookup(MAXPALOOKUPS,tempbuf,0,0,0,1); return; } } initprintf("Loading palette lookups... "); kread(fp,&num_tables,1); for(j=0;j 640); if(totalclock > lastupdate) { mousecol += mouseadd; if(mousecol >= 30 || mousecol <= 0) { mouseadd = -mouseadd; mousecol += mouseadd; } lastupdate = totalclock + 3; } switch(whitecol) { case 1: // Shadow Warrior col = whitecol+mousecol; break; case 31: // Duke Nukem 3D col = whitecol-mousecol; break; default: col = whitecol; break; } if(col != whitecol) { for(i=(j?3:2);i<=(j?7:3);i++) { plotpixel(searchx+i,searchy,col); plotpixel(searchx-i,searchy,col); plotpixel(searchx,searchy-i,col); plotpixel(searchx,searchy+i,col); } for(i=1;i<=(j?2:1);i++) { plotpixel(searchx+i,searchy,whitecol); plotpixel(searchx-i,searchy,whitecol); plotpixel(searchx,searchy-i,whitecol); plotpixel(searchx,searchy+i,whitecol); } i=(j?8:4); plotpixel(searchx+i,searchy,0); plotpixel(searchx-i,searchy,0); plotpixel(searchx,searchy-i,0); plotpixel(searchx,searchy+i,0); } } int AskIfSure(void) { int retval=0; begindrawing(); //{{{ printext256(0,0,whitecol,0,"Are you sure you want to proceed?",0); enddrawing(); //}}} showframe(1); while ((keystatus[1]|keystatus[0x1c]|keystatus[0x39]|keystatus[0x31]) == 0) { if (handleevents()) { if (quitevent) { retval = 0; break; } } if (keystatus[0x15] != 0) { keystatus[0x15] = 0; retval = 0; break; } } while(keystatus[1]) { keystatus[1] = 0; retval = 1; break; } return(retval); } void Keys3d(void) { long i,count,rate,nexti; long j, k, templong, changedir, hiz, loz; long hitx, hity, hitz, hihit, lohit; long repeatcountx=0,repeatcounty=0; char smooshyalign=0, repeatpanalign=0, buffer[80]; short startwall, endwall, dasector, hitsect, hitwall, hitsprite, statnum=0; /* start Mapster32 */ if (sidemode != 0) { setviewback(); rotatesprite(320<<15,200<<15,65536,(horiz-100)<<2,4094,0,0,2+4,0,0,0,0); lockbyte4094 = 0; searchx = ydim-1-searchx; searchx ^= searchy; searchy ^= searchx; searchx ^= searchy; // overwritesprite(160L,170L,1153,0,1+2,0); rotatesprite(160<<16,170<<16,65536,(100-horiz+1024)<<3,1153,0,0,2,0,0,0,0); } if(usedcount && !helpon) { if(searchstat!=3) { count=0; for(i=0;i640?0:1; i = (ydimgame>>6)+(j<<2); printext256((xdimgame>>6)+2,ydimgame-(ydimgame>>1)+2,0,-1,"Clipboard",j); printext256((xdimgame>>6),ydimgame-(ydimgame>>1),whitecol,-1,"Clipboard",j); Bsprintf(tempbuf,"Pic: %d %s",temppicnum,names[temppicnum]); printext256((xdimgame>>6)+2,ydimgame-(ydimgame>>1)+2+i+i,0,-1,tempbuf,j); printext256((xdimgame>>6),ydimgame-(ydimgame>>1)+i+i,whitecol,-1,tempbuf,j); Bsprintf(tempbuf,"Shd: %d",tempshade); printext256((xdimgame>>6)+2,ydimgame-(ydimgame>>1)+2+i+i+i,0,-1,tempbuf,j); printext256((xdimgame>>6),ydimgame-(ydimgame>>1)+i+i+i,whitecol,-1,tempbuf,j); Bsprintf(tempbuf,"Pal: %d",temppal); printext256((xdimgame>>6)+2,ydimgame-(ydimgame>>1)+2+i+i+i+i,0,-1,tempbuf,j); printext256((xdimgame>>6),ydimgame-(ydimgame>>1)+i+i+i+i,whitecol,-1,tempbuf,j); Bsprintf(tempbuf,"Cst: %d",tempcstat); printext256((xdimgame>>6)+2,ydimgame-(ydimgame>>1)+2+i+i+i+i+i,0,-1,tempbuf,j); printext256((xdimgame>>6),ydimgame-(ydimgame>>1)+i+i+i+i+i,whitecol,-1,tempbuf,j); Bsprintf(tempbuf,"Lot: %d",templotag); printext256((xdimgame>>6)+2,ydimgame-(ydimgame>>1)+2+i+i+i+i+i+i,0,-1,tempbuf,j); printext256((xdimgame>>6),ydimgame-(ydimgame>>1)+i+i+i+i+i+i,whitecol,-1,tempbuf,j); Bsprintf(tempbuf,"Hit: %d",temphitag); printext256((xdimgame>>6)+2,ydimgame-(ydimgame>>1)+2+i+i+i+i+i+i+i,0,-1,tempbuf,j); printext256((xdimgame>>6),ydimgame-(ydimgame>>1)+i+i+i+i+i+i+i,whitecol,-1,tempbuf,j); Bsprintf(tempbuf,"Ext: %d",tempextra); printext256((xdimgame>>6)+2,ydimgame-(ydimgame>>1)+2+i+i+i+i+i+i+i+i,0,-1,tempbuf,j); printext256((xdimgame>>6),ydimgame-(ydimgame>>1)+i+i+i+i+i+i+i+i,whitecol,-1,tempbuf,j); enddrawing(); }// end if usedcount if ((totalclock > (lastmessagetime + 120*3))) { char msgbuf[2048]; switch (searchstat) { case 0: case 4: { long dax, day, dist; dax = wall[searchwall].x-wall[wall[searchwall].point2].x; day = wall[searchwall].y-wall[wall[searchwall].point2].y; dist = ksqrt(dax*dax+day*day); Bsprintf(msgbuf,"Wall %d: length:%ld lo:%d hi:%d",searchwall,dist,wall[searchwall].lotag,wall[searchwall].hitag); _message(msgbuf); break; } case 1: Bsprintf(msgbuf,"Sector %d ceiling: lo:%s hi:%d",searchsector,ExtGetSectorCaption(searchsector),sector[searchsector].hitag); _message(msgbuf); break; case 2: Bsprintf(msgbuf,"Sector %d floor: lo:%s hi:%d",searchsector,ExtGetSectorCaption(searchsector),sector[searchsector].hitag); _message(msgbuf); break; case 3: { if (strlen(names[sprite[searchwall].picnum]) > 0) { if (sprite[searchwall].picnum==SECTOREFFECTOR) Bsprintf(msgbuf,"Sprite %d %s: lo:%d hi:%d",searchwall,SectorEffectorText(searchwall),sprite[searchwall].lotag,sprite[searchwall].hitag); else Bsprintf(msgbuf,"Sprite %d %s: lo:%d hi:%d ex:%d",searchwall,names[sprite[searchwall].picnum],sprite[searchwall].lotag,sprite[searchwall].hitag,sprite[searchwall].extra); } else Bsprintf(msgbuf,"Sprite %d picnum %d: lo:%d hi:%d ex:%d",searchwall,sprite[searchwall].picnum,sprite[searchwall].lotag,sprite[searchwall].hitag,sprite[searchwall].extra); _message(msgbuf); break; } } } if (keystatus[0x4] > 0) /* 3 (toggle floor-over-floor (cduke3d only) */ { floor_over_floor = !floor_over_floor; if (!floor_over_floor) ResetFOFSize(); keystatus[0x4] = 0; } if (keystatus[KEYSC_F3]) { mlook = 1-mlook; Bsprintf(tempbuf,"Mouselook: %d",mlook); message(tempbuf); keystatus[KEYSC_F3] = 0; } // 'P - Will copy palette to all sectors highlighted with R-Alt key if (keystatus[KEYSC_QUOTE] && keystatus[KEYSC_P]) // ' P { short w, start_wall, end_wall, currsector; unsigned char pal; keystatus[KEYSC_P] = 0; if(highlightsectorcnt == -1) { message("You didn't select any sectors!"); return; } pal = (unsigned char)getnumber256("Palette: ",0,MAXPALOOKUPS,0); if(AskIfSure()) return; for (i = 0; i < highlightsectorcnt; i++) { currsector = highlightsector[i]; sector[currsector].ceilingpal = pal; sector[currsector].floorpal = pal; // Do all the walls in the sector start_wall = sector[currsector].wallptr; end_wall = start_wall + sector[currsector].wallnum; for (w = start_wall; w < end_wall; w++) { wall[w].pal = pal; } } message("Palettes changed"); } // ;P - Will copy palette to all sectors & sprites within highlighted with R-Alt key if (keystatus[KEYSC_SEMI] && keystatus[KEYSC_P]) // ; P { short w, start_wall, end_wall, currsector; unsigned char pal; keystatus[KEYSC_P] = 0; if(highlightsectorcnt == -1) { message("You didn't select any sectors!"); return; } pal = (unsigned char)getnumber256("Palette: ",0,MAXPALOOKUPS,0); if(AskIfSure()) return; for (i = 0; i < highlightsectorcnt; i++) { currsector = highlightsector[i]; sector[currsector].ceilingpal = pal; sector[currsector].floorpal = pal; // Do all the walls in the sector start_wall = sector[currsector].wallptr; end_wall = start_wall + sector[currsector].wallnum; for (w = start_wall; w < end_wall; w++) { wall[w].pal = pal; } for (k=0;k= 0) { j = nextspritesect[w]; sprite[i].pal = pal; w = j; } } } message("Palettes changed"); } if (keystatus[KEYSC_SEMI] && keystatus[KEYSC_V]) // ; V { short currsector; unsigned char visval; keystatus[KEYSC_V] = 0; if(highlightsectorcnt == -1) { message("You didn't select any sectors!"); return; } visval = (unsigned char)getnumber256("Visibility of selected sectors: ",sector[searchsector].visibility,255,0); if(AskIfSure()) return; for (i = 0; i < highlightsectorcnt; i++) { currsector = highlightsector[i]; sector[currsector].visibility = visval; } message("Visibility changed on all selected sectors"); } if (keystatus[0xd3] > 0) { if (searchstat == 3) { deletesprite(searchwall); updatenumsprites(); Bsprintf(tempbuf,"Sprite (%d) deleted",searchwall); message(tempbuf); asksave = 1; } keystatus[0xd3] = 0; } if (keystatus[KEYSC_F6] > 0) //F6 { keystatus[KEYSC_F6] = 0; autospritehelp=!autospritehelp; Bsprintf(tempbuf,"Automatic SECTOREFFECTOR help: %d",autospritehelp); message(tempbuf); } if (keystatus[KEYSC_F7] > 0) //F7 { keystatus[KEYSC_F7] = 0; autosecthelp=!autosecthelp; Bsprintf(tempbuf,"Automatic sector tag help: %d",autosecthelp); message(tempbuf); } if ((searchstat == 3) && (sprite[searchwall].picnum==SECTOREFFECTOR)) if (autospritehelp && helpon==0) Show3dText("sehelp.hlp"); if (searchstat == 1 || searchstat == 2) if (autosecthelp && helpon==0) Show3dText("sthelp.hlp"); if (keystatus[0x33] > 0) // , Search & fix panning to the left (3D) { if (searchstat == 3) { i = searchwall; if ((keystatus[0x2a]|keystatus[0x36]) > 0) sprite[i].ang = ((sprite[i].ang+2048-1)&2047); else { sprite[i].ang = ((sprite[i].ang+2048-128)&2047); keystatus[0x33] = 0; } Bsprintf(tempbuf,"Sprite (%ld) angle: %d",i,sprite[i].ang); message(tempbuf); } } if (keystatus[0x34] > 0) // . Search & fix panning to the right (3D) { if ((searchstat == 0) || (searchstat == 4)) { AutoAlignWalls((long)searchwall,0L); keystatus[0x34] = 0; } if (searchstat == 3) { i = searchwall; if ((keystatus[0x2a]|keystatus[0x36]) > 0) sprite[i].ang = ((sprite[i].ang+2048+1)&2047); else { sprite[i].ang = ((sprite[i].ang+2048+128)&2047); keystatus[0x34] = 0; } Bsprintf(tempbuf,"Sprite (%ld) angle: %d",i,sprite[i].ang); message(tempbuf); } } if ((keystatus[KEYSC_L] > 0) && (keystatus[KEYSC_QUOTE] > 0)) // ' L { switch (searchstat) { case 1: strcpy(tempbuf,"Sector ceilingz: "); sector[searchsector].ceilingz = getnumber256(tempbuf,sector[searchsector].ceilingz,8388608,1); if (!(sector[searchsector].ceilingstat&2)) sector[searchsector].ceilingheinum = 0; strcpy(tempbuf,"Sector ceiling slope: "); sector[searchsector].ceilingheinum = getnumber256(tempbuf,sector[searchsector].ceilingheinum,8388608,1); break; case 2: strcpy(tempbuf,"Sector floorz: "); sector[searchsector].floorz = getnumber256(tempbuf,sector[searchsector].floorz,8388608,1); if (!(sector[searchsector].floorstat&2)) sector[searchsector].floorheinum = 0; strcpy(tempbuf,"Sector floor slope: "); sector[searchsector].floorheinum = getnumber256(tempbuf,sector[searchsector].floorheinum,8388608,1); break; case 3: strcpy(tempbuf,"Sprite x: "); sprite[searchwall].x = getnumber256(tempbuf,sprite[searchwall].x,131072,1); strcpy(tempbuf,"Sprite y: "); sprite[searchwall].y = getnumber256(tempbuf,sprite[searchwall].y,131072,1); strcpy(tempbuf,"Sprite z: "); sprite[searchwall].z = getnumber256(tempbuf,sprite[searchwall].z,8388608,1); strcpy(tempbuf,"Sprite angle: "); sprite[searchwall].ang = getnumber256(tempbuf,sprite[searchwall].ang,2048L,0); break; } if (sector[searchsector].ceilingheinum == 0) sector[searchsector].ceilingstat &= ~2; else sector[searchsector].ceilingstat |= 2; if (sector[searchsector].floorheinum == 0) sector[searchsector].floorstat &= ~2; else sector[searchsector].floorstat |= 2; asksave = 1; keystatus[KEYSC_L] = 0; } getzrange(posx,posy,posz,cursectnum,&hiz,&hihit,&loz,&lohit,128L,CLIPMASK0); if (keystatus[KEYSC_CAPS] > 0) { zmode++; if (zmode == 3) zmode = 0; else if (zmode == 1) zlock = (loz-posz)&0xfffffc00; if (zmode == 0) message("Zmode = Gravity"); else if (zmode == 1) message("Zmode = Locked/Sector"); else if (zmode == 2) message("Zmode = Locked/Free"); keystatus[KEYSC_CAPS] = 0; } if (keystatus[KEYSC_M] > 0 && (keystatus[KEYSC_QUOTE]) > 0) // M { switch (searchstat) { case 0: case 4: strcpy(buffer,"Wall extra: "); wall[searchwall].extra = getnumber256(buffer,(long)wall[searchwall].extra,65536L,1); break; case 1: strcpy(buffer,"Sector extra: "); sector[searchsector].extra = getnumber256(buffer,(long)sector[searchsector].extra,65536L,1); break; case 2: strcpy(buffer,"Sector extra: "); sector[searchsector].extra = getnumber256(buffer,(long)sector[searchsector].extra,65536L,1); break; case 3: strcpy(buffer,"Sprite extra: "); sprite[searchwall].extra = getnumber256(buffer,(long)sprite[searchwall].extra,65536L,1); break; } asksave = 1; keystatus[KEYSC_M] = 0; } if (keystatus[KEYSC_1] > 0) // 1 (make 1-way wall) { if (searchstat != 3) { wall[searchwall].cstat ^= 32; sprintf(getmessage,"Wall (%d) 1 side masking %s",searchwall,wall[searchwall].cstat&32?"ON":"OFF"); message(getmessage); asksave = 1; } else { sprite[searchwall].cstat ^= 64; i = sprite[searchwall].cstat; if ((i&48) == 32) { sprite[searchwall].cstat &= ~8; if ((i&64) > 0) if (posz > sprite[searchwall].z) sprite[searchwall].cstat |= 8; } asksave = 1; sprintf(getmessage,"Sprite (%d) 1 sided %s",searchwall,sprite[searchwall].cstat&64?"ON":"OFF"); message(getmessage); } keystatus[KEYSC_1] = 0; } if (keystatus[KEYSC_2] > 0) // 2 (bottom wall swapping) { if (searchstat != 3) { wall[searchwall].cstat ^= 2; sprintf(getmessage,"Wall (%d) bottom texture swap %s",searchwall,wall[searchwall].cstat&2?"ON":"OFF"); message(getmessage); asksave = 1; } keystatus[KEYSC_2] = 0; } if (keystatus[KEYSC_O] > 0) // O (top/bottom orientation - for doors) { if ((searchstat == 0) || (searchstat == 4)) { wall[searchwall].cstat ^= 4; asksave = 1; } if (searchstat == 3) // O (ornament onto wall) (2D) { asksave = 1; i = searchwall; hitscan(sprite[i].x,sprite[i].y,sprite[i].z,sprite[i].sectnum, sintable[(sprite[i].ang+2560+1024)&2047], sintable[(sprite[i].ang+2048+1024)&2047], 0, &hitsect,&hitwall,&hitsprite,&hitx,&hity,&hitz,CLIPMASK1); sprite[i].x = hitx; sprite[i].y = hity; sprite[i].z = hitz; changespritesect(i,hitsect); if (hitwall >= 0) sprite[i].ang = ((getangle(wall[wall[hitwall].point2].x-wall[hitwall].x,wall[wall[hitwall].point2].y-wall[hitwall].y)+512)&2047); //Make sure sprite's in right sector if (inside(sprite[i].x,sprite[i].y,sprite[i].sectnum) == 0) { j = wall[hitwall].point2; sprite[i].x -= ksgn(wall[j].y-wall[hitwall].y); sprite[i].y += ksgn(wall[j].x-wall[hitwall].x); } } keystatus[KEYSC_O] = 0; } if (keystatus[KEYSC_M] > 0) // M (masking walls) { if (searchstat != 3) { i = wall[searchwall].nextwall; templong = (keystatus[0x2a]|keystatus[0x36]); if (i >= 0) { wall[searchwall].cstat ^= 16; sprintf(getmessage,"Wall (%d) masking %s",searchwall,wall[searchwall].cstat&16?"ON":"OFF"); message(getmessage); if ((wall[searchwall].cstat&16) > 0) { wall[searchwall].cstat &= ~8; if (templong == 0) { wall[i].cstat |= 8; //auto other-side flip wall[i].cstat |= 16; wall[i].overpicnum = wall[searchwall].overpicnum; } } else { wall[searchwall].cstat &= ~8; if (templong == 0) { wall[i].cstat &= ~8; //auto other-side unflip wall[i].cstat &= ~16; } } wall[searchwall].cstat &= ~32; if (templong == 0) wall[i].cstat &= ~32; asksave = 1; } } keystatus[KEYSC_M] = 0; } if (keystatus[KEYSC_H] > 0) // H (hitscan sensitivity) { if ((keystatus[KEYSC_QUOTE]) > 0) { switch (searchstat) { case 0: case 4: strcpy(buffer,"Wall hitag: "); wall[searchwall].hitag = getnumber256(buffer,(long)wall[searchwall].hitag,65536L,0); break; case 1: strcpy(buffer,"Sector hitag: "); sector[searchsector].hitag = getnumber256(buffer,(long)sector[searchsector].hitag,65536L,0); break; case 2: strcpy(buffer,"Sector hitag: "); sector[searchsector].hitag = getnumber256(buffer,(long)sector[searchsector].hitag,65536L,0); break; case 3: strcpy(buffer,"Sprite hitag: "); sprite[searchwall].hitag = getnumber256(buffer,(long)sprite[searchwall].hitag,65536L,0); break; } } else { if (searchstat == 3) { sprite[searchwall].cstat ^= 256; sprintf(getmessage,"Sprite (%d) hitscan sensitivity %s",searchwall,sprite[searchwall].cstat&256?"ON":"OFF"); message(getmessage); asksave = 1; } else { wall[searchwall].cstat ^= 64; if ((wall[searchwall].nextwall >= 0) && ((keystatus[0x2a]|keystatus[0x36]) == 0)) { wall[wall[searchwall].nextwall].cstat &= ~64; wall[wall[searchwall].nextwall].cstat |= (wall[searchwall].cstat&64); } sprintf(getmessage,"Wall (%d) hitscan sensitivity %s",searchwall,wall[searchwall].cstat&64?"ON":"OFF"); message(getmessage); asksave = 1; } } keystatus[KEYSC_H] = 0; } smooshyalign = keystatus[0x4c]; repeatpanalign = (keystatus[0x2a]|keystatus[0x36]|(bstatus&2)); if(bstatus&4) { if(bstatus&1) { searchit = 0; if (searchx != osearchx) { if ((repeatcountx == 0) || (repeatcountx > 16)) { changedir = 0; if (osearchx > searchx) changedir = -1; if (searchx > osearchx) changedir = 1; if ((searchstat == 0) || (searchstat == 4)) { if(!(wall[searchwall].cstat&8)) changedir = -changedir; if (repeatpanalign == 0) wall[searchwall].xrepeat = changechar(wall[searchwall].xrepeat,changedir,smooshyalign,1); else wall[searchwall].xpanning = changechar(wall[searchwall].xpanning,changedir,smooshyalign,0); } if ((searchstat == 1) || (searchstat == 2)) { if (searchstat == 1) sector[searchsector].ceilingxpanning = changechar(sector[searchsector].ceilingxpanning,changedir,smooshyalign,0); else sector[searchsector].floorxpanning = changechar(sector[searchsector].floorxpanning,changedir,smooshyalign,0); } if (searchstat == 3) { sprite[searchwall].xrepeat = changechar(sprite[searchwall].xrepeat,changedir,smooshyalign,1); if (sprite[searchwall].xrepeat < 4) sprite[searchwall].xrepeat = 4; } asksave = 1; repeatcountx = max(1,repeatcountx); } repeatcountx += (synctics>>1); searchx = osearchx; } else repeatcountx = 0; if (searchy != osearchy) { if ((repeatcounty == 0) || (repeatcounty > 16)) { changedir = 0; if (osearchy < searchy) changedir = -1; if (searchy < osearchy) changedir = 1; if ((searchstat == 0) || (searchstat == 4)) { if(wall[searchwall].cstat&4) changedir = -changedir; if (repeatpanalign == 0) wall[searchwall].yrepeat = changechar(wall[searchwall].yrepeat,changedir,smooshyalign,1); else wall[searchwall].ypanning = changechar(wall[searchwall].ypanning,changedir,smooshyalign,0); } if ((searchstat == 1) || (searchstat == 2)) { if (searchstat == 1) sector[searchsector].ceilingypanning = changechar(sector[searchsector].ceilingypanning,changedir,smooshyalign,0); else sector[searchsector].floorypanning = changechar(sector[searchsector].floorypanning,changedir,smooshyalign,0); } if (searchstat == 3) { sprite[searchwall].yrepeat = changechar(sprite[searchwall].yrepeat,changedir,smooshyalign,1); if (sprite[searchwall].yrepeat < 4) sprite[searchwall].yrepeat = 4; } asksave = 1; repeatcounty = max(1,repeatcounty); } searchy = osearchy; repeatcounty += (synctics>>1); //} } else repeatcounty = 0; } if (bstatus&16) // - { mouseb &= ~16; bstatus &= ~16; if ((keystatus[0x38]|keystatus[0xb8]) > 0) //ALT { if ((keystatus[0x1d]|keystatus[0x9d]) > 0) //CTRL { if (visibility < 16384) visibility += visibility; } else { if ((keystatus[0x2a]|keystatus[0x36]) == 0) k = 16; else k = 1; if (highlightsectorcnt >= 0) for(i=0;i 0) { for(i=0;i 0) { sector[searchsector].visibility++; if (sector[searchsector].visibility == 240) sector[searchsector].visibility = 239; k--; } asksave = 1; } } else { k = 0; if (highlightsectorcnt >= 0) { for(i=0;i 0) //ALT { if ((keystatus[0x1d]|keystatus[0x9d]) > 0) //CTRL { if (visibility > 32) visibility >>= 1; } else { if ((keystatus[0x2a]|keystatus[0x36]) == 0) k = 16; else k = 1; if (highlightsectorcnt >= 0) for(i=0;i 0) { for(i=0;i 0) { sector[searchsector].visibility--; if (sector[searchsector].visibility == 239) sector[searchsector].visibility = 240; k--; } asksave = 1; } } else { k = 0; if (highlightsectorcnt >= 0) { for(i=0;i 0) // mousewheel, -, and +, cycle picnum { j = i = (keystatus[KEYSC_EQUAL]|(bstatus&32))?1:-1; switch (searchstat) { case 0: while(!tilesizx[wall[searchwall].picnum]||!tilesizy[wall[searchwall].picnum]||j) { if(wall[searchwall].picnum+i >= MAXTILES) wall[searchwall].picnum = 0; else if(wall[searchwall].picnum+i < 0) wall[searchwall].picnum = MAXTILES-1; else wall[searchwall].picnum += i; j = 0; } break; case 1: while(!tilesizx[sector[searchsector].ceilingpicnum]||!tilesizy[sector[searchsector].ceilingpicnum]||j) { if(sector[searchsector].ceilingpicnum+i >= MAXTILES) sector[searchsector].ceilingpicnum = 0; else if(sector[searchsector].ceilingpicnum+i < 0) sector[searchsector].ceilingpicnum = MAXTILES-1; else sector[searchsector].ceilingpicnum += i; j = 0; } break; case 2: while(!tilesizx[sector[searchsector].floorpicnum]||!tilesizy[sector[searchsector].floorpicnum]||j) { if(sector[searchsector].floorpicnum+i >= MAXTILES) sector[searchsector].floorpicnum = 0; else if(sector[searchsector].floorpicnum+i < 0) sector[searchsector].floorpicnum = MAXTILES-1; else sector[searchsector].floorpicnum += i; j = 0; } break; case 3: while(!tilesizx[sprite[searchwall].picnum]||!tilesizy[sprite[searchwall].picnum]||j) { if(sprite[searchwall].picnum+i >= MAXTILES) sprite[searchwall].picnum = 0; else if(sprite[searchwall].picnum+i < 0) sprite[searchwall].picnum = MAXTILES-1; else sprite[searchwall].picnum += i; j = 0; } break; case 4: while(!tilesizx[wall[searchwall].overpicnum]||!tilesizy[wall[searchwall].overpicnum]||j) { if(wall[searchwall].overpicnum+i >= MAXTILES) wall[searchwall].overpicnum = 0; else if(wall[searchwall].overpicnum+i < 0) wall[searchwall].overpicnum = MAXTILES-1; else wall[searchwall].overpicnum += i; j = 0; } break; } asksave = 1; keystatus[KEYSC_DASH] = keystatus[KEYSC_EQUAL] = 0; mouseb &= ~(16|32); } if (keystatus[KEYSC_E] > 0) // E (expand) { if (searchstat == 1) { sector[searchsector].ceilingstat ^= 8; sprintf(getmessage,"Sector (%d) ceiling texture expansion %s",searchsector,sector[searchsector].ceilingstat&8?"ON":"OFF"); message(getmessage); asksave = 1; } if (searchstat == 2) { sector[searchsector].floorstat ^= 8; sprintf(getmessage,"Sector (%d) floor texture expansion %s",searchsector,sector[searchsector].floorstat&8?"ON":"OFF"); message(getmessage); asksave = 1; } keystatus[KEYSC_E] = 0; } if (keystatus[KEYSC_R] > 0) // R (relative alignment, rotation) { if (keystatus[KEYSC_QUOTE] > 0) // FRAMERATE TOGGLE { framerateon = !framerateon; if(framerateon) message("Show framerate ON"); else message("Show framerate OFF"); } else { if (searchstat == 1) { sector[searchsector].ceilingstat ^= 64; sprintf(getmessage,"Sector (%d) ceiling texture relativity %s",searchsector,sector[searchsector].ceilingstat&64?"ON":"OFF"); message(getmessage); asksave = 1; } if (searchstat == 2) { sector[searchsector].floorstat ^= 64; sprintf(getmessage,"Sector (%d) ceiling texture relativity %s",searchsector,sector[searchsector].floorstat&64?"ON":"OFF"); message(getmessage); asksave = 1; } if (searchstat == 3) { i = sprite[searchwall].cstat; if ((i&48) < 32) i += 16; else i &= ~48; sprite[searchwall].cstat = i; if (sprite[searchwall].cstat&16) sprintf(getmessage,"Sprite (%d) wall aligned",searchwall); else if (sprite[searchwall].cstat&32) sprintf(getmessage,"Sprite (%d) floor aligned",searchwall); else sprintf(getmessage,"Sprite (%d) un-aligned",searchwall); message(getmessage); asksave = 1; } } keystatus[KEYSC_R] = 0; } if (keystatus[KEYSC_F] > 0) //F (Flip) { keystatus[KEYSC_F] = 0; if ((keystatus[0x38]|keystatus[0xb8]) > 0) //ALT-F (relative alignmment flip) { if (searchstat != 3) { setfirstwall(searchsector,searchwall); asksave = 1; } } else { if ((searchstat == 0) || (searchstat == 4)) { i = wall[searchwall].cstat; i = ((i>>3)&1)+((i>>7)&2); //3-x,8-y switch(i) { case 0: i = 1; break; case 1: i = 3; break; case 2: i = 0; break; case 3: i = 2; break; } i = ((i&1)<<3)+((i&2)<<7); wall[searchwall].cstat &= ~0x0108; wall[searchwall].cstat |= i; asksave = 1; } if (searchstat == 1) //8-way ceiling flipping (bits 2,4,5) { i = sector[searchsector].ceilingstat; i = (i&0x4)+((i>>4)&3); switch(i) { case 0: i = 6; break; case 6: i = 3; break; case 3: i = 5; break; case 5: i = 1; break; case 1: i = 7; break; case 7: i = 2; break; case 2: i = 4; break; case 4: i = 0; break; } i = (i&0x4)+((i&3)<<4); sector[searchsector].ceilingstat &= ~0x34; sector[searchsector].ceilingstat |= i; asksave = 1; } if (searchstat == 2) //8-way floor flipping (bits 2,4,5) { i = sector[searchsector].floorstat; i = (i&0x4)+((i>>4)&3); switch(i) { case 0: i = 6; break; case 6: i = 3; break; case 3: i = 5; break; case 5: i = 1; break; case 1: i = 7; break; case 7: i = 2; break; case 2: i = 4; break; case 4: i = 0; break; } i = (i&0x4)+((i&3)<<4); sector[searchsector].floorstat &= ~0x34; sector[searchsector].floorstat |= i; asksave = 1; } if (searchstat == 3) { i = sprite[searchwall].cstat; if (((i&48) == 32) && ((i&64) == 0)) { sprite[searchwall].cstat &= ~0xc; sprite[searchwall].cstat |= ((i&4)^4); } else { i = ((i>>2)&3); switch(i) { case 0: i = 1; break; case 1: i = 3; break; case 2: i = 0; break; case 3: i = 2; break; } i <<= 2; sprite[searchwall].cstat &= ~0xc; sprite[searchwall].cstat |= i; } asksave = 1; } } } if (keystatus[0xc7] > 0) // HOME updownunits = 256; else if (keystatus[0xcf] > 0) // END updownunits = 512; else updownunits = 1024; if ((keystatus[0xc9] > 0) || ((bstatus&2) && (bstatus&32))) // PGUP { k = 0; if (highlightsectorcnt >= 0) { for(i=0;i 0) //CTRL - put sprite on ceiling { sprite[searchwall].z = getceilzofslope(searchsector,sprite[searchwall].x,sprite[searchwall].y); if (sprite[searchwall].cstat&128) sprite[searchwall].z -= ((tilesizy[sprite[searchwall].picnum]*sprite[searchwall].yrepeat)<<1); if ((sprite[searchwall].cstat&48) != 32) sprite[searchwall].z += ((tilesizy[sprite[searchwall].picnum]*sprite[searchwall].yrepeat)<<2); } else { k = 0; if (highlightcnt >= 0) for(i=0;i 0) || ((bstatus&2) && (bstatus&16))) // PGDN { k = 0; if (highlightsectorcnt >= 0) { for(i=0;i sector[searchsector].floorz) sector[searchsector].ceilingz = sector[searchsector].floorz; if (searchstat == 3) { if ((keystatus[0x1d]|keystatus[0x9d]) > 0) //CTRL - put sprite on ground { sprite[searchwall].z = getflorzofslope(searchsector,sprite[searchwall].x,sprite[searchwall].y); if (sprite[searchwall].cstat&128) sprite[searchwall].z -= ((tilesizy[sprite[searchwall].picnum]*sprite[searchwall].yrepeat)<<1); } else { k = 0; if (highlightcnt >= 0) for(i=0;i 640)); enddrawing(); } } } clockval[clockcnt] = i; clockcnt = ((clockcnt+1)&15); tempbuf[0] = 0; if((bstatus&4) && (bstatus&2)) Bsprintf(tempbuf,"PAN"); else if(bstatus&4) Bsprintf(tempbuf,"SHADE/SIZE"); else if(bstatus&2) Bsprintf(tempbuf,"Z"); else if(bstatus&1) Bsprintf(tempbuf,"LOCK"); if(tempbuf[0] != 0) { printext256(searchx+4+2,searchy+4+2,0,-1,tempbuf,!(xdimgame > 640)); printext256(searchx+4,searchy+4,whitecol,-1,tempbuf,!(xdimgame > 640)); } if(helpon==1) { for(i=0;i 640)))+2,0,-1,Help3d[i],!(xdimgame > 640)); printext256(0*8,8+(i*(8+(xdimgame > 640))),whitecol,-1,Help3d[i],!(xdimgame > 640)); enddrawing(); switch(i) { case 8: Bsprintf(tempbuf,"%d",autosave); break; case 9: Bsprintf(tempbuf,"%s",SKILLMODE[skill]); break; case 10: Bsprintf(tempbuf,"%d",tabgraphic); break; case 11: Bsprintf(tempbuf,"%d",framerateon); break; case 12: Bsprintf(tempbuf,"%s",SPRDSPMODE[nosprites]); break; case 13: Bsprintf(tempbuf,"%d",shadepreview); break; case 14: Bsprintf(tempbuf,"%d",purpleon); break; default : sprintf(tempbuf," "); break; } begindrawing(); if(!strcmp(tempbuf,"0")) Bsprintf(tempbuf,"OFF"); else if(!strcmp(tempbuf,"1")) Bsprintf(tempbuf,"ON"); else if(!strcmp(tempbuf,"2")) Bsprintf(tempbuf,"ON (2)"); printext256((20+((xdimgame > 640) * 20))*8+2,8+(i*8+(xdimgame > 640))+2,0,-1,tempbuf,!(xdimgame > 640)); printext256((20+((xdimgame > 640) * 20))*8,8+(i*8+(xdimgame > 640)),whitecol,-1,tempbuf,!(xdimgame > 640)); enddrawing(); } } /* if(purpleon) { begindrawing(); // printext256(1*4,1*8,whitecol,-1,"Purple ON",0); sprintf(getmessage,"Purple ON"); message(getmessage); enddrawing(); } */ if(sector[cursectnum].lotag==2) { if(sector[cursectnum].floorpal==8) SetBOSS1Palette(); else SetWATERPalette(); } else SetGAMEPalette(); //Stick this in 3D part of ExtCheckKeys //Also choose your own key scan codes if(keystatus[KEYSC_QUOTE]==1 && keystatus[0x20]==1) // ' d /* { ShowHelpText("SectorEffector"); } */ { keystatus[0x20] = 0; skill++; if(skill>MAXSKILL-1) skill=0; sprintf(tempbuf,"%s",SKILLMODE[skill]); // printext256(1*4,1*8,11,-1,tempbuf,0); message(tempbuf); } begindrawing(); if(keystatus[KEYSC_QUOTE]==1 && keystatus[0x22]==1) // ' g { keystatus[0x22] = 0; tabgraphic++; if (tabgraphic > 2) tabgraphic = 0; if(tabgraphic) message("Graphics ON"); else message("Graphics OFF"); } if(keystatus[KEYSC_QUOTE]==1 && keystatus[0x2d]==1) // ' x { keystatus[0x2d] = 0; shadepreview=!shadepreview; if(shadepreview) message("Sprite shade preview ON"); else message("Sprite shade preview OFF"); } if(keystatus[KEYSC_QUOTE]==1 && keystatus[0x13]==1) // ' r { keystatus[0x13] = 0; framerateon=!framerateon; if(framerateon) message("Framerate ON"); else message("Framerate OFF"); } if(keystatus[KEYSC_QUOTE]==1 && keystatus[0x11]==1) // ' w { keystatus[0x11] = 0; nosprites++; if(nosprites>3) nosprites=0; Bsprintf(tempbuf,"%s",SPRDSPMODE[nosprites]); // printext256(1*4,1*8,whitecol,-1,tempbuf,0); message(tempbuf); } if(keystatus[KEYSC_QUOTE]==1 && keystatus[0x15]==1) // ' y { keystatus[0x15] = 0; purpleon=!purpleon; if(nosprites>3) nosprites=0; if(purpleon) message("Purple ON"); else message("Purple OFF"); } enddrawing(); if(keystatus[KEYSC_QUOTE]==1 && keystatus[0x2e]==1) // ' C { keystatus[0x2e] = 0; switch (searchstat) { case 0: case 4: for(i=0;i0) // F2 { usedcount=!usedcount; keystatus[0x3c] = 0; } if(keystatus[0x0f]>0) // TAB : USED { // usedcount=!usedcount; count=0; for(i=0;i 0)) // G { switch (searchstat) { case 0: strcpy(tempbuf,"Wall picnum: "); i = getnumber256(tempbuf,wall[searchwall].picnum,MAXTILES-1,0); if(tilesizx[i] != 0) wall[searchwall].picnum = i; break; case 1: strcpy(tempbuf,"Sector ceiling picnum: "); i = getnumber256(tempbuf,sector[searchsector].ceilingpicnum,MAXTILES-1,0); if(tilesizx[i] != 0) sector[searchsector].ceilingpicnum = i; break; case 2: strcpy(tempbuf,"Sector floor picnum: "); i = getnumber256(tempbuf,sector[searchsector].floorpicnum,MAXTILES-1,0); if(tilesizx[i] != 0) sector[searchsector].floorpicnum = i; break; case 3: strcpy(tempbuf,"Sprite picnum: "); i = getnumber256(tempbuf,sprite[searchwall].picnum,MAXTILES-1,0); if(tilesizx[i] != 0) sprite[searchwall].picnum = i; break; case 4: strcpy(tempbuf,"Masked wall picnum: "); i = getnumber256(tempbuf,wall[searchwall].overpicnum,MAXTILES-1,0); if(tilesizx[i] != 0) wall[searchwall].overpicnum = i; break; } asksave = 1; keystatus[KEYSC_G] = 0; } if (keystatus[KEYSC_B] > 0) // B (clip Blocking xor) (3D) { if (searchstat == 3) { sprite[searchwall].cstat ^= 1; // sprite[searchwall].cstat &= ~256; // sprite[searchwall].cstat |= ((sprite[searchwall].cstat&1)<<8); sprintf(getmessage,"Sprite (%d) blocking %s",searchwall,sprite[searchwall].cstat&1?"ON":"OFF"); message(getmessage); asksave = 1; } else { wall[searchwall].cstat ^= 1; // wall[searchwall].cstat &= ~64; if ((wall[searchwall].nextwall >= 0) && ((keystatus[0x2a]|keystatus[0x36]) == 0)) { wall[wall[searchwall].nextwall].cstat &= ~(1+64); wall[wall[searchwall].nextwall].cstat |= (wall[searchwall].cstat&1); } sprintf(getmessage,"Wall (%d) blocking %s",searchwall,wall[searchwall].cstat&1?"ON":"OFF"); message(getmessage); asksave = 1; } keystatus[KEYSC_B] = 0; } if (keystatus[KEYSC_T] > 0) // T (transluscence for sprites/masked walls) { if (searchstat == 1) //Set masked/transluscent ceilings/floors { i = (sector[searchsector].ceilingstat&(128+256)); sector[searchsector].ceilingstat &= ~(128+256); switch(i) { case 0: sector[searchsector].ceilingstat |= 128; break; case 128: sector[searchsector].ceilingstat |= 256; break; case 256: sector[searchsector].ceilingstat |= 384; break; case 384: sector[searchsector].ceilingstat |= 0; break; } asksave = 1; } if (searchstat == 2) { i = (sector[searchsector].floorstat&(128+256)); sector[searchsector].floorstat &= ~(128+256); switch(i) { case 0: sector[searchsector].floorstat |= 128; break; case 128: sector[searchsector].floorstat |= 256; break; case 256: sector[searchsector].floorstat |= 384; break; case 384: sector[searchsector].floorstat |= 0; break; } asksave = 1; } if ((keystatus[KEYSC_QUOTE]) > 0) { switch (searchstat) { case 0: case 4: strcpy(buffer,"Wall lotag: "); wall[searchwall].lotag = getnumber256(buffer,(long)wall[searchwall].lotag,65536L,0); break; case 1: strcpy(buffer,"Sector lotag: "); sector[searchsector].lotag = getnumber256(buffer,(long)sector[searchsector].lotag,65536L,0); break; case 2: strcpy(buffer,"Sector lotag: "); sector[searchsector].lotag = getnumber256(buffer,(long)sector[searchsector].lotag,65536L,0); break; case 3: strcpy(buffer,"Sprite lotag: "); sprite[searchwall].lotag = getnumber256(buffer,(long)sprite[searchwall].lotag,65536L,0); break; } } else { if (searchstat == 3) { if ((sprite[searchwall].cstat&2) == 0) sprite[searchwall].cstat |= 2; else if ((sprite[searchwall].cstat&512) == 0) sprite[searchwall].cstat |= 512; else sprite[searchwall].cstat &= ~(2+512); asksave = 1; } if (searchstat == 4) { if ((wall[searchwall].cstat&128) == 0) wall[searchwall].cstat |= 128; else if ((wall[searchwall].cstat&512) == 0) wall[searchwall].cstat |= 512; else wall[searchwall].cstat &= ~(128+512); if (wall[searchwall].nextwall >= 0) { wall[wall[searchwall].nextwall].cstat &= ~(128+512); wall[wall[searchwall].nextwall].cstat |= (wall[searchwall].cstat&(128+512)); } asksave = 1; } } keystatus[KEYSC_T] = 0; } if(keystatus[KEYSC_QUOTE]==1 && keystatus[0x1c]==1) // ' ENTER { begindrawing(); message("Pasted graphic only"); enddrawing(); switch(searchstat) { case 0 : wall[searchwall].picnum = temppicnum; break; case 1 : sector[searchsector].ceilingpicnum = temppicnum; break; case 2 : sector[searchsector].floorpicnum = temppicnum; break; case 3 : sprite[searchwall].picnum = temppicnum; break; case 4 : wall[searchwall].overpicnum = temppicnum; break; } keystatus[0x1c]=0; } }// end 3d void Keys2d(void) { short temp=0; int i=0, j,k; long radius, xp1, yp1; char col; long repeatcountx=0,repeatcounty=0,smooshyalign,changedir; /* for(i=0;i<0x50;i++) {if(keystatus[i]==1) {Bsprintf(tempbuf,"key %ld",i); printmessage16(tempbuf); }} */ begindrawing(); for(i=0;i= 256*/ && sprite[i].sectnum != MAXSECTORS) { radius = mulscale15(sprite[i].hitag,zoom); col = 6; if (i+16384 == pointhighlight) if (totalclock & 32) col += (2<<2); drawlinepat = 0xf0f0f0f0; drawcircle16(halfxdim16+xp1, midydim16+yp1, radius, col); drawlinepat = 0xffffffff; } } enddrawing(); if(keystatus[0x3b]==1 || (keystatus[KEYSC_QUOTE]==1 && keystatus[0x29]==1)) //F1 or ' ~ { keystatus[0x3b]=0; clearmidstatbar16(); begindrawing(); for(i=0;i 9) { j = 256; k = 90; } printext16(j,ydim16+32+(i*9)-k,11,-1,Help2d[i],0); } enddrawing(); } if((keystatus[KEYSC_QUOTE]==1 && keystatus[KEYSC_D]==1)) // ' D delete all sprites of a certain type { keystatus[KEYSC_D]=0; Bsprintf(tempbuf,"Delete all sprites of picnum: "); i = getnumber16(tempbuf,-1,MAXSPRITES-1,1); if (i >= 0) { for(j=0;j 0) // M (tag) { keystatus[0x32] = 0; if ((keystatus[0x38]|keystatus[0xb8]) > 0) //ALT { if (pointhighlight >= 16384) { i = pointhighlight-16384; Bsprintf(tempbuf,"Sprite (%d) Extra: ",i); sprite[i].extra = getnumber16(tempbuf,sprite[i].extra,65536L,1); clearmidstatbar16(); showspritedata((short)i); } else if (linehighlight >= 0) { i = linehighlight; Bsprintf(tempbuf,"Wall (%d) Extra: ",i); wall[i].extra = getnumber16(tempbuf,wall[i].extra,65536L,1); clearmidstatbar16(); showwalldata((short)i); } printmessage16(""); } else { for (i=0;i 0) // /? Reset panning&repeat to 0 { if ((ppointhighlight&0xc000) == 16384) { if ((keystatus[0x2a]|keystatus[0x36]) > 0) { sprite[cursprite].xrepeat = sprite[cursprite].yrepeat; } else { sprite[cursprite].xrepeat = 64; sprite[cursprite].yrepeat = 64; } } keystatus[0x35] = 0; asksave = 1; } if ((keystatus[0x4b]|keystatus[0x4d]) > 0) // 4 & 6 (keypad) { smooshyalign = keystatus[0x4c]; if ((repeatcountx == 0) || (repeatcountx > 16)) { changedir = 0; if (keystatus[0x4b] > 0) changedir = -1; if (keystatus[0x4d] > 0) changedir = 1; if ((ppointhighlight&0xc000) == 16384) { sprite[cursprite].xrepeat = changechar(sprite[cursprite].xrepeat,changedir,smooshyalign,1); if (sprite[cursprite].xrepeat < 4) sprite[cursprite].xrepeat = 4; } asksave = 1; repeatcountx = max(1,repeatcountx); } repeatcountx += synctics; } else repeatcountx = 0; if ((keystatus[0x48]|keystatus[0x50]) > 0) // 2 & 8 (keypad) { smooshyalign = keystatus[0x4c]; if ((repeatcounty == 0) || (repeatcounty > 16)) { changedir = 0; if (keystatus[0x48] > 0) changedir = -1; if (keystatus[0x50] > 0) changedir = 1; if ((ppointhighlight&0xc000) == 16384) { sprite[cursprite].yrepeat = changechar(sprite[cursprite].yrepeat,changedir,smooshyalign,1); if (sprite[cursprite].yrepeat < 4) sprite[cursprite].yrepeat = 4; } asksave = 1; repeatcounty = max(1,repeatcounty); } repeatcounty += synctics; //} } else repeatcounty = 0; if (keystatus[0x13] > 0) // R (relative alignment, rotation) { if (pointhighlight >= 16384) { i = sprite[cursprite].cstat; if ((i&48) < 32) i += 16; else i &= ~48; sprite[cursprite].cstat = i; if (sprite[cursprite].cstat&16) sprintf(getmessage,"Sprite (%d) is wall aligned",cursprite); else if (sprite[cursprite].cstat&32) sprintf(getmessage,"Sprite (%d) is floor aligned",cursprite); else sprintf(getmessage,"Sprite (%d) is un-aligned",cursprite); message(getmessage); asksave = 1; } keystatus[0x13] = 0; } if(keystatus[KEYSC_QUOTE] && keystatus[KEYSC_S]) // ' S { if (pointhighlight >= 16384) { keystatus[0x1f] = 0; Bsprintf(tempbuf,"Sprite (%d) xrepeat: ",cursprite); sprite[cursprite].xrepeat=getnumber16(tempbuf, sprite[cursprite].xrepeat, 256,0); Bsprintf(tempbuf,"Sprite (%d) yrepeat: ",cursprite); sprite[cursprite].yrepeat=getnumber16(tempbuf, sprite[cursprite].yrepeat, 256,0); Bsprintf(tempbuf,"Sprite (%d) updated",i); printmessage16(tempbuf); } } if(keystatus[KEYSC_QUOTE] && keystatus[KEYSC_F]) // ' F { keystatus[KEYSC_F] = 0; j = 0; for(i=0;i0) // [ search backward { keystatus[0x1a]=0; if(wallsprite==0) { SearchSectorsBackward(); } else if(wallsprite==1) { if(curwallnum>0) curwallnum--; for(i=curwallnum;i>=0;i--) { if( (wall[i].picnum==wall[curwall].picnum) &&((search_lotag==0)|| (search_lotag!=0 && search_lotag==wall[i].lotag)) &&((search_hitag==0)|| (search_hitag!=0 && search_hitag==wall[i].hitag)) ) { posx=(wall[i].x)-(( (wall[i].x)-(wall[wall[i].point2].x) )/2); posy=(wall[i].y)-(( (wall[i].y)-(wall[wall[i].point2].y) )/2); printmessage16("< Wall search: found"); // curwallnum--; keystatus[0x1a]=0; return; } curwallnum--; } printmessage16("< Wall search: none found"); } else if(wallsprite==2) { if(cursearchspritenum>0) cursearchspritenum--; for(i=cursearchspritenum;i>=0;i--) { if( (sprite[i].picnum==sprite[cursearchsprite].picnum && sprite[i].statnum==0 ) &&((search_lotag==0)|| (search_lotag!=0 && search_lotag==sprite[i].lotag)) &&((search_hitag==0)|| (search_hitag!=0 && search_hitag==sprite[i].hitag)) ) { posx=sprite[i].x; posy=sprite[i].y; ang= sprite[i].ang; printmessage16("< Sprite search: found"); // curspritenum--; keystatus[0x1a]=0; return; } cursearchspritenum--; } printmessage16("< Sprite search: none found"); } } if(keystatus[0x1b]>0) // ] search forward { keystatus[0x1b]=0; if(wallsprite==0) { SearchSectorsForward(); } else if(wallsprite==1) { if(curwallnum Wall search: found"); // curwallnum++; keystatus[0x1b]=0; return; } curwallnum++; } printmessage16("> Wall search: none found"); } else if(wallsprite==2) { if(cursearchspritenum Sprite search: found"); // curspritenum++; keystatus[0x1b]=0; return; } cursearchspritenum++; } printmessage16("> Sprite search: none found"); } } if (keystatus[0x22] > 0) // G (grid on/off) { grid += ((keystatus[0x2a]|keystatus[0x36]) > 0?-1:1); if (grid == -1 || grid == 9) { switch(grid) { case -1: grid = 8; break; case 9: grid = 0; break; } } if(!grid) sprintf(tempbuf,"Grid off"); else sprintf(tempbuf,"Grid size: %d (%d units)",grid,2048>>grid); printmessage16(tempbuf); keystatus[0x22] = 0; } if ((totalclock > getmessagetimeoff) && (totalclock > (lastpm16time + 120*3))) { updatesector(mousxplc,mousyplc,&cursectornum); if (pointhighlight >= 16384) { char tmpbuf[2048]; i = pointhighlight-16384; if (strlen(names[sprite[i].picnum]) > 0) { if (sprite[i].picnum==SECTOREFFECTOR) Bsprintf(tmpbuf,"Sprite %d %s: lo:%d hi:%d",i,SectorEffectorText(i),sprite[i].lotag,sprite[i].hitag); else Bsprintf(tmpbuf,"Sprite %d %s: lo:%d hi:%d ex:%d",i,names[sprite[i].picnum],sprite[i].lotag,sprite[i].hitag,sprite[i].extra); } else Bsprintf(tmpbuf,"Sprite %d picnum %d: lo:%d hi:%d ex:%d",i,sprite[i].picnum,sprite[i].lotag,sprite[i].hitag,sprite[i].extra); _printmessage16(tmpbuf); } else if ((linehighlight >= 0) && (sectorofwall(linehighlight) == cursectornum)) { long dax, day, dist; dax = wall[linehighlight].x-wall[wall[linehighlight].point2].x; day = wall[linehighlight].y-wall[wall[linehighlight].point2].y; dist = ksqrt(dax*dax+day*day); Bsprintf(tempbuf,"Wall %d: length:%ld lo:%d hi:%d",linehighlight,dist,wall[linehighlight].lotag,wall[linehighlight].hitag); _printmessage16(tempbuf); } else if (cursectornum >= 0) { Bsprintf(tempbuf,"Sector %d: lo:%d hi:%d",cursectornum,sector[cursectornum].lotag,sector[cursectornum].hitag); _printmessage16(tempbuf); } else _printmessage16(""); } if ((keystatus[0x26] > 0) && (keystatus[KEYSC_QUOTE] > 0)) // ' L { if (pointhighlight >= 16384) { i = pointhighlight - 16384; Bsprintf(tempbuf,"Sprite %d x: ",i); sprite[i].x = getnumber16(tempbuf,sprite[i].x,131072,1); Bsprintf(tempbuf,"Sprite %d y: ",i); sprite[i].y = getnumber16(tempbuf,sprite[i].y,131072,1); Bsprintf(tempbuf,"Sprite %d z: ",i); sprite[i].z = getnumber16(tempbuf,sprite[i].z,8388608,1); Bsprintf(tempbuf,"Sprite %d angle: ",i); sprite[i].ang = getnumber16(tempbuf,sprite[i].ang,2048L,0); Bsprintf(tempbuf,"Sprite %d updated",i); printmessage16(tempbuf); } else if (pointhighlight <= 16383) { i = linehighlight; Bsprintf(tempbuf,"Wall %d x: ",i); wall[i].x = getnumber16(tempbuf,wall[i].x,131072,1); Bsprintf(tempbuf,"Wall %d y: ",i); wall[i].y = getnumber16(tempbuf,wall[i].y,131072,1); Bsprintf(tempbuf,"Wall %d updated",i); printmessage16(tempbuf); } keystatus[0x26] = 0; } if(keystatus[KEYSC_QUOTE]==1 && keystatus[0x06]==1) // ' 5 { signed char shade; keystatus[0x06]=0; shade=getnumber16("Global parallaxed sky shade: ",0,128,1); for(i=0;i>1,255); } for(i=0;i>= 1; sector[i].floorz >>= 1; } for(i=0;i>= 1; wall[i].y >>= 1; wall[i].yrepeat = min(wall[i].yrepeat<<1,255); } for(i=0;i>= 1; sprite[i].y >>= 1; sprite[i].z >>= 1; sprite[i].xrepeat = max(sprite[i].xrepeat>>1,1); sprite[i].yrepeat = max(sprite[i].yrepeat>>1,1); } printmessage16("Map scaled"); } if(keystatus[KEYSC_QUOTE]==1 && keystatus[0x04]==1) // ' 3 { onnames++; if(onnames>8) onnames=0; keystatus[0x04]=0; Bsprintf(tempbuf,"Mode %d %s",onnames,SpriteMode[onnames]); printmessage16(tempbuf); // clearmidstatbar16(); // for(i=0;i=20 && sprite[i].picnum<=59) { sprite[i].xrepeat = 32; sprite[i].yrepeat = 32; } } } */ // What the fuck is this supposed to do? /* Motorcycle ha ha ha if(keystatus[KEYSC_QUOTE]==1 && keystatus[0x06]==1) // ' 5 { keystatus[0x06]=0; sidemode++; if (sidemode > 2) sidemode = 0; if (sidemode == 1) { editstatus = 0; zmode = 2; posz = ((sector[cursectnum].ceilingz+sector[cursectnum].floorz)>>1); } else { editstatus = 1; zmode = 1; } } */ if(keystatus[KEYSC_QUOTE]==1 && keystatus[0x08]==1) // ' 7 : swap hilo { keystatus[0x08]=0; if (pointhighlight >= 16384) { temp=sprite[cursprite].lotag; sprite[cursprite].lotag=sprite[cursprite].hitag; sprite[cursprite].hitag=temp; Bsprintf(tempbuf,"Sprite %d tags swapped",cursprite); printmessage16(tempbuf); } else if (linehighlight >= 0) { temp=wall[linehighlight].lotag; wall[linehighlight].lotag=wall[linehighlight].hitag; wall[linehighlight].hitag=temp; Bsprintf(tempbuf,"Wall %d tags swapped",linehighlight); printmessage16(tempbuf); } } if(keystatus[KEYSC_QUOTE]==1 && keystatus[0x24]==1) // ' J { posx=getnumber16("X-coordinate: ",posx,131072L,1); posy=getnumber16("Y-coordinate: ",posy,131072L,1); Bsprintf(tempbuf,"Current pos now (%ld, %ld)",posx,posy); printmessage16(tempbuf); keystatus[0x24]=0; } }// end key2d void ExtSetupSpecialSpriteCols(void) { short i; for (i=0;i=0;i--) sector[i].wallnum = sector[i+1].wallptr-sector[i].wallptr; sector[numsectors-1].wallnum = numwalls-sector[numsectors-1].wallptr; for(i=0;ipicnum<11) tspr->xrepeat=0; if(nosprites==1||nosprites==3) switch(tspr->picnum) { case SEENINE : tspr->xrepeat=0; } if(shadepreview && !(tspr->cstat & 16)) { if (sector[tspr->sectnum].ceilingstat&1) l = sector[tspr->sectnum].ceilingshade; else { l = sector[tspr->sectnum].floorshade; if (sector[tspr->sectnum].floorpal != 0 && sector[tspr->sectnum].floorpal < num_tables) tspr->pal=sector[tspr->sectnum].floorpal; } if(l < -127) l = -127; if(l > 126) l = 127; tspr->shade = l; } switch(tspr->picnum) { // 5-frame walk case 1550 : // Shark frames=5; // 2-frame walk case 1445 : // duke kick case LIZTROOPDUCKING : case 2030 : // pig shot case OCTABRAIN : case PIGCOPDIVE : case 2190 : // liz capt shot case BOSS1SHOOT : case BOSS1LOB : case LIZTROOPSHOOT : if(frames==0) frames=2; // 4-frame walk case 1491 : // duke crawl case LIZTROOP : case LIZTROOPRUNNING : case PIGCOP : case LIZMAN : case BOSS1 : case BOSS2 : case BOSS3 : case BOSS4 : case NEWBEAST: if(frames==0) frames=4; case LIZTROOPJETPACK : case DRONE : case COMMANDER : case TANK : case RECON : if(frames==0) frames = 10; case CAMERA1: case APLAYER : if(frames==0) frames=1; case GREENSLIME : case EGG : case PIGCOPSTAYPUT : case LIZMANSTAYPUT: case LIZTROOPSTAYPUT : case LIZMANSPITTING : case LIZMANFEEDING : case LIZMANJUMP : if(skill!=4) { if(tspr->lotag>skill+1) { tspr->xrepeat=0; break; } } if(nosprites==2||nosprites==3) { tspr->xrepeat=0; // tspr->cstat|=32768; } // else tspr->cstat&=32767; if(frames!=0) { if(frames==10) frames=0; k = getangle(tspr->x-posx,tspr->y-posy); k = (((tspr->ang+3072+128-k)&2047)>>8)&7; //This guy has only 5 pictures for 8 angles (3 are x-flipped) if (k <= 4) { tspr->picnum += k; tspr->cstat &= ~4; //clear x-flipping bit } else { tspr->picnum += 8-k; tspr->cstat |= 4; //set x-flipping bit } } if(frames==2) tspr->picnum+=((((4-(totalclock>>5)))&1)*5); if(frames==4) tspr->picnum+=((((4-(totalclock>>5)))&3)*5); if(frames==5) tspr->picnum+=(((totalclock>>5)%5))*5; if(tilesizx[tspr->picnum] == 0) tspr->picnum -= 5; //Hack, for actors break; default: break; } } } void Keys2d3d(void) { int i, j; if(keystatus[KEYSC_QUOTE]==1 && keystatus[0x1e]==1) // ' a { keystatus[0x1e] = 0; autosave=!autosave; if(autosave) message("Autosave ON"); else message("Autosave OFF"); } if(keystatus[KEYSC_QUOTE]==1 && keystatus[KEYSC_N]==1) // ' n { keystatus[KEYSC_N] = 0; noclip=!noclip; if(noclip) message("Clipping disabled"); else message("Clipping enabled"); } if ((totalclock > autosavetimer) && (autosave)) { if (asksave) { fixspritesectors(); //Do this before saving! // updatesector(startposx,startposy,&startsectnum); ExtPreSaveMap(); saveboard("autosave.map",&startposx,&startposy,&startposz,&startang,&startsectnum); ExtSaveMap("autosave.map"); message("Board autosaved to AUTOSAVE.MAP"); } autosavetimer = totalclock+120*180; } if ((keystatus[0x1d]|keystatus[0x9d]) > 0) //CTRL if (keystatus[0x1f] > 0) // S { if (levelname) { fixspritesectors(); //Do this before saving! updatesector(startposx,startposy,&startsectnum); ExtPreSaveMap(); saveboard(levelname,&startposx,&startposy,&startposz,&startang,&startsectnum); ExtSaveMap(levelname); message("Board saved"); asksave = 0; keystatus[0x1f] = 0; } } if (keystatus[buildkeys[14]] > 0) // Enter { getmessageleng = 0; getmessagetimeoff = 0; } if (getmessageleng > 0) { charsperline = 64; //if (dimensionmode[snum] == 2) charsperline = 80; if (qsetmode == 200) { for(i=0;i<=getmessageleng;i+=charsperline) { for(j=0;j>6)+2,((i/charsperline)<<3)+(ydimgame-(ydimgame>>5))-(((getmessageleng-1)/charsperline)<<3)+2,0,-1,tempbuf,xdimgame>640?0:1); printext256((xdimgame>>6),((i/charsperline)<<3)+(ydimgame-(ydimgame>>5))-(((getmessageleng-1)/charsperline)<<3),whitecol,-1,tempbuf,xdimgame>640?0:1); } enddrawing(); } } else printmessage16(getmessage); if (totalclock > getmessagetimeoff) getmessageleng = 0; } } void ExtCheckKeys(void) { readmousebstatus(&bstatus); Keys2d3d(); if (qsetmode == 200) //In 3D mode { Keys3d(); m32_showmouse(); if (sidemode != 1) editinput(); } else { Keys2d(); } } void faketimerhandler(void) { long i, dist; long hiz, hihit, loz, lohit, oposx, oposy; short hitwall, daang; counter++; if(counter>=5) counter=0; sampletimer(); if (totalclock < ototalclock+TICSPERFRAME) return; if (qsetmode != 200) return; if (sidemode != 1) return; ototalclock = totalclock; oposx = posx; oposy = posy; hitwall = clipmove(&posx,&posy,&posz,&cursectnum,xvel,yvel,128L,4L<<8,4L<<8,0); xvel = ((posx-oposx)<<14); yvel = ((posy-oposy)<<14); yvel += 80000; if ((hitwall&0xc000) == 32768) { hitwall &= (MAXWALLS-1); i = wall[hitwall].point2; daang = getangle(wall[i].x-wall[hitwall].x,wall[i].y-wall[hitwall].y); xvel -= (xvel>>4); if (xvel < 0) xvel++; if (xvel > 0) xvel--; yvel -= (yvel>>4); if (yvel < 0) yvel++; if (yvel > 0) yvel--; i = 4-keystatus[buildkeys[4]]; xvel += mulscale(vel,(long)sintable[(ang+512)&2047],i); yvel += mulscale(vel,(long)sintable[ang&2047],i); if (((daang-ang)&2047) < 1024) ang = ((ang+((((daang-ang)&2047)+24)>>4))&2047); else ang = ((ang-((((ang-daang)&2047)+24)>>4))&2047); timoff = ototalclock; } else { if (ototalclock > timoff+32) ang = ((ang+((timoff+32-ototalclock)>>4))&2047); } getzrange(posx,posy,posz,cursectnum,&hiz,&hihit,&loz,&lohit,128L,0); oposx -= posx; oposy -= posy; dist = ksqrt(oposx*oposx+oposy*oposy); if (ototalclock > timoff+32) dist = 0; daang = mulscale(dist,angvel,9); posz += (daang<<6); if (posz > loz-(4<<8)) posz = loz-(4<<8), hvel = 0; if (posz < hiz+(4<<8)) posz = hiz+(4<<8), hvel = 0; horiz = ((horiz*7+(100-(daang>>1)))>>3); if (horiz < 100) horiz++; if (horiz > 100) horiz--; if(keystatus[KEYSC_QUOTE]==1 && keystatus[0x06]==1) // ' 5 { keystatus[0x06]=0; editstatus = 1; sidemode = 2; } } void SetBOSS1Palette() { if(acurpalette==3) return; acurpalette=3; kensetpalette(BOSS1palette); } void SetSLIMEPalette() { if(acurpalette==2) return; acurpalette=2; kensetpalette(SLIMEpalette); } void SetWATERPalette() { if(acurpalette==1) return; acurpalette=1; kensetpalette(WATERpalette); } void SetGAMEPalette() { if(acurpalette==0) return; acurpalette=0; kensetpalette(GAMEpalette); } void kensetpalette(char *vgapal) { long i; char vesapal[1024]; for(i=0;i<256;i++) { vesapal[i*4+0] = vgapal[i*3+2]; vesapal[i*4+1] = vgapal[i*3+1]; vesapal[i*4+2] = vgapal[i*3+0]; vesapal[i*4+3] = 0; } setpalette(0L,256L,vesapal); } void SearchSectorsForward() { long ii=0; if(cursector_lotag!=0) { if(cursectornum Sector search: found"); // cursectornum++; keystatus[0x1b]=0; // ] return; } cursectornum++; } } printmessage16("> Sector search: none found"); } void SearchSectorsBackward() { long ii=0; if(cursector_lotag!=0) { if(cursectornum>0) cursectornum--; for(ii=cursectornum;ii>=0;ii--) { if(sector[ii].lotag==cursector_lotag) { posx=wall[sector[ii].wallptr].x; posy=wall[sector[ii].wallptr].y; printmessage16("< Sector search: found"); // cursectornum--; keystatus[0x1a]=0; // [ return; } cursectornum--; } } printmessage16("< Sector search: none found"); } // Build edit originally by Ed Coolidge void EditSectorData(short sectnum) { char disptext[80]; char edittext[80]; char col=1, row=0, rowmax = 6, dispwidth = 24; long xpos = 200, ypos = ydim-STATUS2DSIZ+48; int i = -1; char editval = 0; disptext[dispwidth] = 0; clearmidstatbar16(); showsectordata(sectnum); begindrawing(); while(keystatus[1] == 0) { if (handleevents()) { if (quitevent) quitevent = 0; } printmessage16("Edit mode, press to exit"); if (keystatus[0xd0] > 0) { if (row < rowmax) { printext16(xpos,ypos+row*8,11,0,disptext,0); row++; } keystatus[0xd0] = 0; } if (keystatus[0xc8] > 0) { if (row > 0) { printext16(xpos,ypos+row*8,11,0,disptext,0); row--; } keystatus[0xc8] = 0; } if (keystatus[0xcb] > 0) { if (col == 2) { printext16(xpos,ypos+row*8,11,0,disptext,0); col = 1; xpos = 200; rowmax = 6; dispwidth = 24; disptext[dispwidth] = 0; if (row > rowmax) row = rowmax; } keystatus[0xcb] = 0; } if (keystatus[0xcd] > 0) { if (col == 1) { printext16(xpos,ypos+row*8,11,0,disptext,0); col = 2; xpos = 400; rowmax = 6; dispwidth = 24; disptext[dispwidth] = 0; if (row > rowmax) row = rowmax; } keystatus[0xcd] = 0; } if (keystatus[0x1c] > 0) { keystatus[0x1c] = 0; editval = 1; } if (col == 1) { switch (row) { case 0: for (i=Bsprintf(disptext,"Flags (hex): %x",sector[sectnum].ceilingstat); i < dispwidth; i++) disptext[i] = ' '; Bsprintf(edittext,"Sector (%d) Ceiling Flags: ",sectnum); if (editval) { printmessage16(edittext); sector[sectnum].ceilingstat = (short)getnumber16(edittext,(long)sector[sectnum].ceilingstat,32768L,0); } break; case 1: for (i=Bsprintf(disptext,"(X,Y)pan: %d, %d",sector[sectnum].ceilingxpanning,sector[sectnum].ceilingypanning); i < dispwidth; i++) disptext[i] = ' '; if (editval) { Bsprintf(edittext,"Sector (%d) Ceiling X Pan: ",sectnum); printmessage16(edittext); sector[sectnum].ceilingxpanning = (char)getnumber16(edittext,(long)sector[sectnum].ceilingxpanning,256L,0); Bsprintf(edittext,"Sector (%d) Ceiling Y Pan: ",sectnum); printmessage16(edittext); sector[sectnum].ceilingypanning = (char)getnumber16(edittext,(long)sector[sectnum].ceilingypanning,256L,0); } break; case 2: for (i=Bsprintf(disptext,"Shade byte: %d",sector[sectnum].ceilingshade); i < dispwidth; i++) disptext[i] = ' '; Bsprintf(edittext,"Sector (%d) Ceiling Shade: ",sectnum); if (editval) { printmessage16(edittext); sector[sectnum].ceilingshade = (char)getnumber16(edittext,(long)sector[sectnum].ceilingshade,128L,1); } break; case 3: for (i=Bsprintf(disptext,"Z-coordinate: %ld",sector[sectnum].ceilingz); i < dispwidth; i++) disptext[i] = ' '; Bsprintf(edittext,"Sector (%d) Ceiling Z-coordinate: ",sectnum); if (editval) { printmessage16(edittext); sector[sectnum].ceilingz = getnumber16(edittext,sector[sectnum].ceilingz,8388608,1); //2147483647L,-2147483648L } break; case 4: for (i=Bsprintf(disptext,"Tile number: %d",sector[sectnum].ceilingpicnum); i < dispwidth; i++) disptext[i] = ' '; Bsprintf(edittext,"Sector (%d) Ceiling Tile Number: ",sectnum); if (editval) { printmessage16(edittext); sector[sectnum].ceilingpicnum = (short)getnumber16(edittext,(long)sector[sectnum].ceilingpicnum,MAXTILES,0); } break; case 5: for (i=Bsprintf(disptext,"Ceiling heinum: %d",sector[sectnum].ceilingheinum); i < dispwidth; i++) disptext[i] = ' '; Bsprintf(edittext,"Sector (%d) Ceiling Heinum: ",sectnum); if (editval) { printmessage16(edittext); sector[sectnum].ceilingheinum = (short)getnumber16(edittext,(long)sector[sectnum].ceilingheinum,32768L,1); } break; case 6: for (i=Bsprintf(disptext,"Palookup number: %d",sector[sectnum].ceilingpal); i < dispwidth; i++) disptext[i] = ' '; Bsprintf(edittext,"Sector (%d) Ceiling Palookup Number: ",sectnum); if (editval) { printmessage16(edittext); sector[sectnum].ceilingpal = (char)getnumber16(edittext,(long)sector[sectnum].ceilingpal,MAXPALOOKUPS,0); } break; } } if (col == 2) { switch (row) { case 0: for (i=Bsprintf(disptext,"Flags (hex): %x",sector[sectnum].floorstat); i < dispwidth; i++) disptext[i] = ' '; Bsprintf(edittext,"Sector (%d) Floor Flags: ",sectnum); if (editval) { printmessage16(edittext); sector[sectnum].floorstat = (short)getnumber16(edittext,(long)sector[sectnum].floorstat,1024L,0); } break; case 1: for (i=Bsprintf(disptext,"(X,Y)pan: %d, %d",sector[sectnum].floorxpanning,sector[sectnum].floorypanning); i < dispwidth; i++) disptext[i] = ' '; if (editval) { Bsprintf(edittext,"Sector (%d) Floor X Pan: ",sectnum); printmessage16(edittext); sector[sectnum].floorxpanning = (char)getnumber16(edittext,(long)sector[sectnum].floorxpanning,256L,0); Bsprintf(edittext,"Sector (%d) Floor Y Pan: ",sectnum); printmessage16(edittext); sector[sectnum].floorypanning = (char)getnumber16(edittext,(long)sector[sectnum].floorypanning,256L,0); } break; case 2: for (i=Bsprintf(disptext,"Shade byte: %d",sector[sectnum].floorshade); i < dispwidth; i++) disptext[i] = ' '; Bsprintf(edittext,"Sector (%d) Floor Shade: ",sectnum); if (editval) { printmessage16(edittext); sector[sectnum].floorshade = (char)getnumber16(edittext,(long)sector[sectnum].floorshade,65536L,1L); } break; case 3: for (i=Bsprintf(disptext,"Z-coordinate: %ld",sector[sectnum].floorz); i < dispwidth; i++) disptext[i] = ' '; Bsprintf(edittext,"Sector (%d) Floor Z-coordinate: ",sectnum); if (editval) { printmessage16(edittext); sector[sectnum].floorz = getnumber16(edittext,sector[sectnum].floorz,8388608L,1); //2147483647L,-2147483648L } break; case 4: for (i=Bsprintf(disptext,"Tile number: %d",sector[sectnum].floorpicnum); i < dispwidth; i++) disptext[i] = ' '; Bsprintf(edittext,"Sector (%d) Floor Tile Number: ",sectnum); if (editval) { printmessage16(edittext); sector[sectnum].floorpicnum = (short)getnumber16(edittext,(long)sector[sectnum].floorpicnum,MAXTILES,0); } break; case 5: for (i=Bsprintf(disptext,"Floor heinum: %d",sector[sectnum].floorheinum); i < dispwidth; i++) disptext[i] = ' '; Bsprintf(edittext,"Sector (%d) Flooring Heinum: ",sectnum); if (editval) { printmessage16(edittext); sector[sectnum].floorheinum = (short)getnumber16(edittext,(long)sector[sectnum].floorheinum,32768L,1); } break; case 6: for (i=Bsprintf(disptext,"Palookup number: %d",sector[sectnum].floorpal); i < dispwidth; i++) disptext[i] = ' '; Bsprintf(edittext,"Sector (%d) Floor Palookup Number: ",sectnum); if (editval) { printmessage16(edittext); sector[sectnum].floorpal = (char)getnumber16(edittext,(long)sector[sectnum].floorpal,MAXPALOOKUPS,0); } break; } } printext16(xpos,ypos+row*8,11,1,disptext,0); if (editval) { editval = 0; } showframe(1); } printext16(xpos,ypos+row*8,11,0,disptext,0); printmessage16(""); enddrawing(); showframe(1); keystatus[1] = 0; } void EditWallData(short wallnum) { char disptext[80]; char edittext[80]; char row=0, dispwidth = 24; long xpos = 200, ypos = ydim-STATUS2DSIZ+48; int i = -1; char editval = 0; disptext[dispwidth] = 0; clearmidstatbar16(); showwalldata(wallnum); begindrawing(); while(keystatus[1] == 0) { if (handleevents()) { if (quitevent) quitevent = 0; } printmessage16("Edit mode, press to exit"); if (keystatus[0xd0] > 0) { if (row < 6) { printext16(xpos,ypos+row*8,11,0,disptext,0); row++; } keystatus[0xd0] = 0; } if (keystatus[0xc8] > 0) { if (row > 0) { printext16(xpos,ypos+row*8,11,0,disptext,0); row--; } keystatus[0xc8] = 0; } if (keystatus[0x1c] > 0) { keystatus[0x1c] = 0; editval = 1; } switch (row) { case 0: for (i=Bsprintf(disptext,"Flags (hex): %x",wall[wallnum].cstat); i < dispwidth; i++) disptext[i] = ' '; Bsprintf(edittext,"Wall (%d) Flags: ",wallnum); if (editval) { printmessage16(edittext); wall[wallnum].cstat = (short)getnumber16(edittext,(long)wall[wallnum].cstat,1024L,0); } break; case 1: for (i=Bsprintf(disptext,"Shade: %d",wall[wallnum].shade); i < dispwidth; i++) disptext[i] = ' '; Bsprintf(edittext,"Wall (%d) Shade: ",wallnum); if (editval) { printmessage16(edittext); wall[wallnum].shade = (char)getnumber16(edittext,(long)wall[wallnum].shade,127,1); } break; case 2: for (i=Bsprintf(disptext,"Pal: %d",wall[wallnum].pal); i < dispwidth; i++) disptext[i] = ' '; Bsprintf(edittext,"Wall (%d) Pal: ",wallnum); if (editval) { printmessage16(edittext); wall[wallnum].pal = (char)getnumber16(edittext,(long)wall[wallnum].pal,MAXPALOOKUPS,0); } break; case 3: for (i=Bsprintf(disptext,"(X,Y)repeat: %d, %d",wall[wallnum].xrepeat,wall[wallnum].yrepeat); i < dispwidth; i++) disptext[i] = ' '; if (editval) { Bsprintf(edittext,"Wall (%d) X Repeat: ",wallnum); printmessage16(edittext); wall[wallnum].xrepeat = (char)getnumber16(edittext,(long)wall[wallnum].xrepeat,256L,0); Bsprintf(edittext,"Wall (%d) Y Repeat: ",wallnum); printmessage16(edittext); wall[wallnum].yrepeat = (char)getnumber16(edittext,(long)wall[wallnum].yrepeat,256L,0); } break; case 4: for (i=Bsprintf(disptext,"(X,Y)pan: %d, %d",wall[wallnum].xpanning,wall[wallnum].ypanning); i < dispwidth; i++) disptext[i] = ' '; if (editval) { Bsprintf(edittext,"Wall (%d) X Pan: ",wallnum); printmessage16(edittext); wall[wallnum].xpanning = (char)getnumber16(edittext,(long)wall[wallnum].xpanning,256L,0); Bsprintf(edittext,"Wall (%d) Y Pan: ",wallnum); printmessage16(edittext); wall[wallnum].ypanning = (char)getnumber16(edittext,(long)wall[wallnum].ypanning,256L,0); } break; case 5: for (i=Bsprintf(disptext,"Tile number: %d",wall[wallnum].picnum); i < dispwidth; i++) disptext[i] = ' '; Bsprintf(edittext,"Wall (%d) Tile number: ",wallnum); if (editval) { printmessage16(edittext); wall[wallnum].picnum = (short)getnumber16(edittext,(long)wall[wallnum].picnum,MAXTILES,0); } break; case 6: for (i=Bsprintf(disptext,"OverTile number: %d",wall[wallnum].overpicnum); i < dispwidth; i++) disptext[i] = ' '; Bsprintf(edittext,"Wall (%d) OverTile number: ",wallnum); if (editval) { printmessage16(edittext); wall[wallnum].overpicnum = (short)getnumber16(edittext,(long)wall[wallnum].overpicnum,MAXTILES,0); } break; } printext16(xpos,ypos+row*8,11,1,disptext,0); if (editval) { editval = 0; //showwalldata(wallnum); //printmessage16(""); } //enddrawing(); showframe(1); } //begindrawing(); printext16(xpos,ypos+row*8,11,0,disptext,0); printmessage16(""); enddrawing(); showframe(1); keystatus[1] = 0; } void EditSpriteData(short spritenum) { char disptext[80]; char edittext[80]; char col=1, row=0, rowmax=5, dispwidth = 24; long xpos = 200, ypos = ydim-STATUS2DSIZ+48; int i = -1; char editval = 0; disptext[dispwidth] = 0; clearmidstatbar16(); showspritedata(spritenum); while(keystatus[1] == 0) { begindrawing(); if (handleevents()) { if (quitevent) quitevent = 0; } printmessage16("Edit mode, press to exit"); if (keystatus[0xd0] > 0) { if (row < rowmax) { printext16(xpos,ypos+row*8,11,0,disptext,0); row++; } keystatus[0xd0] = 0; } if (keystatus[0xc8] > 0) { if (row > 0) { printext16(xpos,ypos+row*8,11,0,disptext,0); row--; } keystatus[0xc8] = 0; } if (keystatus[0xcb] > 0) { if (col == 2) { printext16(xpos,ypos+row*8,11,0,disptext,0); col = 1; xpos = 200; rowmax = 5; dispwidth = 24; disptext[dispwidth] = 0; if (row > rowmax) row = rowmax; } else if (col == 1) { printext16(xpos,ypos+row*8,11,0,disptext,0); col = 0; xpos = 8; rowmax = 2; dispwidth = 23; disptext[dispwidth] = 0; if (row > rowmax) row = rowmax; } keystatus[0xcb] = 0; } if (keystatus[0xcd] > 0) { if (col == 0) { printext16(xpos,ypos+row*8,11,0,disptext,0); col = 1; xpos = 200; rowmax = 5; dispwidth = 24; disptext[dispwidth] = 0; if (row > rowmax) row = rowmax; } else if (col == 1) { printext16(xpos,ypos+row*8,11,0,disptext,0); col = 2; xpos = 400; rowmax = 6; dispwidth = 26; disptext[dispwidth] = 0; if (row > rowmax) row = rowmax; } keystatus[0xcd] = 0; } if (keystatus[0x1c] > 0) { keystatus[0x1c] = 0; editval = 1; } switch (row) { case 0: if (col == 0) { for (i=Bsprintf(disptext,"X-coordinate: %ld",sprite[spritenum].x); i < dispwidth; i++) disptext[i] = ' '; Bsprintf(edittext,"Sprite (%d) X-coordinate: ",spritenum); if (editval) { printmessage16(edittext); sprite[spritenum].x = getnumber16(edittext,sprite[spritenum].x,131072,1); } } else if (col == 1) { for (i=Bsprintf(disptext,"Flags (hex): %x",sprite[spritenum].cstat); i < dispwidth; i++) disptext[i] = ' '; Bsprintf(edittext,"Sprite (%d) Flags: ",spritenum); if (editval) { printmessage16(edittext); sprite[spritenum].cstat = (short)getnumber16(edittext,(long)sprite[spritenum].cstat,32768L,0); } } else if (col == 2) { for (i=Bsprintf(disptext,"Angle (2048 degrees): %d",sprite[spritenum].ang); i < dispwidth; i++) disptext[i] = ' '; Bsprintf(edittext,"Sprite (%d) Angle: ",spritenum); if (editval) { printmessage16(edittext); sprite[spritenum].ang = (short)getnumber16(edittext,(long)sprite[spritenum].ang,2048L,0); } } break; case 1: if (col == 0) { for (i=Bsprintf(disptext,"Y-coordinate: %ld",sprite[spritenum].y); i < dispwidth; i++) disptext[i] = ' '; Bsprintf(edittext,"Sprite (%d) Y-coordinate: ",spritenum); if (editval) { printmessage16(edittext); sprite[spritenum].y = getnumber16(edittext,sprite[spritenum].y,131072,1); } } else if (col == 1) { for (i=Bsprintf(disptext,"Shade: %d",sprite[spritenum].shade); i < dispwidth; i++) disptext[i] = ' '; Bsprintf(edittext,"Sprite (%d) Shade: ",spritenum); if (editval) { printmessage16(edittext); sprite[spritenum].shade = (char)getnumber16(edittext,(long)sprite[spritenum].shade,127,1); } } else if (col == 2) { for (i=Bsprintf(disptext,"X-Velocity: %d",sprite[spritenum].xvel); i < dispwidth; i++) disptext[i] = ' '; Bsprintf(edittext,"Sprite (%d) X-Velocity: ",spritenum); if (editval) { printmessage16(edittext); sprite[spritenum].xvel = getnumber16(edittext,(long)sprite[spritenum].xvel,32767,1); } } break; case 2: if (col == 0) { for (i=Bsprintf(disptext,"Z-coordinate: %ld",sprite[spritenum].z); i < dispwidth; i++) disptext[i] = ' '; Bsprintf(edittext,"Sprite (%d) Z-coordinate: ",spritenum); if (editval) { printmessage16(edittext); sprite[spritenum].z = getnumber16(edittext,sprite[spritenum].z,8388608,1); //2147483647L,-2147483648L } } else if (col == 1) { for (i=Bsprintf(disptext,"Pal: %d",sprite[spritenum].pal); i < dispwidth; i++) disptext[i] = ' '; Bsprintf(edittext,"Sprite (%d) Pal: ",spritenum); if (editval) { printmessage16(edittext); sprite[spritenum].pal = (char)getnumber16(edittext,(long)sprite[spritenum].pal,MAXPALOOKUPS,0); } } else if (col == 2) { for (i=Bsprintf(disptext,"Y-Velocity: %d",sprite[spritenum].yvel); i < dispwidth; i++) disptext[i] = ' '; Bsprintf(edittext,"Sprite (%d) Y-Velocity: ",spritenum); if (editval) { printmessage16(edittext); sprite[spritenum].yvel = getnumber16(edittext,(long)sprite[spritenum].yvel,32767,1); } } break; case 3: if (col == 1) { for (i=Bsprintf(disptext,"(X,Y)repeat: %d, %d",sprite[spritenum].xrepeat,sprite[spritenum].yrepeat); i < dispwidth; i++) disptext[i] = ' '; if (editval) { Bsprintf(edittext,"Sprite (%d) X Repeat: ",spritenum); printmessage16(edittext); sprite[spritenum].xrepeat = (char)getnumber16(edittext,(long)sprite[spritenum].xrepeat,256L,0); Bsprintf(edittext,"Sprite (%d) Y Repeat: ",spritenum); printmessage16(edittext); sprite[spritenum].yrepeat = (char)getnumber16(edittext,(long)sprite[spritenum].yrepeat,256L,0); } } else if (col == 2) { for (i=Bsprintf(disptext,"Z-Velocity: %d",sprite[spritenum].zvel); i < dispwidth; i++) disptext[i] = ' '; Bsprintf(edittext,"Sprite (%d) Z-Velocity: ",spritenum); if (editval) { printmessage16(edittext); sprite[spritenum].zvel = getnumber16(edittext,(long)sprite[spritenum].zvel,32767,1); } } break; case 4: if (col == 1) { for (i=Bsprintf(disptext,"(X,Y)offset: %d, %d",sprite[spritenum].xoffset,sprite[spritenum].yoffset); i < dispwidth; i++) disptext[i] = ' '; if (editval) { Bsprintf(edittext,"Sprite (%d) X Offset: ",spritenum); printmessage16(edittext); sprite[spritenum].xoffset = (char)getnumber16(edittext,(long)sprite[spritenum].xoffset,128L,1); Bsprintf(edittext,"Sprite (%d) Y Offset: ",spritenum); printmessage16(edittext); sprite[spritenum].yoffset = (char)getnumber16(edittext,(long)sprite[spritenum].yoffset,128L,1); } } else if (col == 2) { for (i=Bsprintf(disptext,"Owner: %d",sprite[spritenum].owner); i < dispwidth; i++) disptext[i] = ' '; Bsprintf(edittext,"Sprite (%d) Owner: ",spritenum); if (editval) { printmessage16(edittext); sprite[spritenum].owner = getnumber16(edittext,(long)sprite[spritenum].owner,MAXSPRITES,0); } } break; case 5: if (col == 1) { for (i=Bsprintf(disptext,"Tile number: %d",sprite[spritenum].picnum); i < dispwidth; i++) disptext[i] = ' '; Bsprintf(edittext,"Sprite (%d) Tile number: ",spritenum); if (editval) { printmessage16(edittext); sprite[spritenum].picnum = (short)getnumber16(edittext,(long)sprite[spritenum].picnum,MAXTILES,0); } } else if (col == 2) { for (i=Bsprintf(disptext,"Clipdist: %d",sprite[spritenum].clipdist); i < dispwidth; i++) disptext[i] = ' '; Bsprintf(edittext,"Sprite (%d) Clipdist: ",spritenum); if (editval) { printmessage16(edittext); sprite[spritenum].clipdist = (char)getnumber16(edittext,(long)sprite[spritenum].clipdist,255,0); } } break; case 6: if (col == 2) { for (i=Bsprintf(disptext,"Extra: %d",sprite[spritenum].extra); i < dispwidth; i++) disptext[i] = ' '; Bsprintf(edittext,"Sprite (%d) Extra: ",spritenum); if (editval) { printmessage16(edittext); sprite[spritenum].extra = getnumber16(edittext,(long)sprite[spritenum].extra,32767,1); } } break; } printext16(xpos,ypos+row*8,11,1,disptext,0); if (editval) { editval = 0; } enddrawing(); showframe(1); } begindrawing(); printext16(xpos,ypos+row*8,11,0,disptext,0); printmessage16(""); enddrawing(); showframe(1); keystatus[1] = 0; } // Build edit #define M_RED 12 #define M_BLUE 9 void ResetKeys(void) { int i; for (i = 0; i < MAXKEYBOARDSCAN; i++) { keystatus[i] = 0; } } void Msg(char *string, char color) { clearmidstatbar16(); printext16(1*4,ydim16+4*8,color,-1,string,0); } /* long GetAToken(char *name, char *tc, long length) { int x=0; char t,*tmp,tokenfound=0; char *token; long count=0; if(!(token = (char *)malloc(9))) { Msg("Out of heap space!",M_RED); return(tokenfound); } do{ // Find the token symbol do { t = *tc; tc++; count++; } while(t!='@' && count < length); if(t=='@') { tmp = token; x=1; do { // Read in the token *tmp = t; tmp++; t = *tc; tc++; x++; count++; } while((t>=48 && t<=127) && t!='@' && x < 9 && count < length); *tmp = 0; if(!strcmp(name,Bstrupr(token))) tokenfound = 1; } } while(!tokenfound && count < length); if(!tokenfound) count=0; return(count); } void ContextHelp(short spritenum) { int i,fp; char t,*tc; char x=0,y=4; char *name,*hightag; char *filebuffer; spritetype *sp; short lotag=0; long size=0,tokresult=0; sp = &sprite[spritenum]; clearmidstatbar16(); if((fp=kopen4load("sehelp.hp2",0)) == -1) { Msg("ERROR: Help file not found.",M_RED); return; } // Read in whole file size = kfilelength(fp); filebuffer = (char *)malloc(size); if (filebuffer == NULL) { Msg("Not enough memory to load sehelp.hp2",M_RED); return; } if (kread(fp, filebuffer, size) != size) { Msg("Unexpected end of file while reading sehelp.hp2",M_RED); kclose(fp); return; } // close the file kclose(fp); // Conver filebuffer to all upper case //strupr(filebuffer); // Assign a token name to search for based on the sprite being pointed to. name = (char *)malloc(20); hightag = (char *)malloc(sizeof(short)); // Make the token strcpy(name,"@TAG"); // Make sure 500-600 SOBJ bounding tags all say the same thing. lotag = sp->lotag; if(lotag > 500 && lotag <= 600 ) lotag = 500; // Give help summary for unknown sprites. if((lotag == 0 || lotag > 1006) && sp->lotag == 0) lotag = 999; sprintf(hightag,"%d",lotag); //itoa(lotag,hightag,10); strcat(name,hightag); tc = filebuffer; if(!(tokresult = GetAToken(name,tc,size))) { // This message should never happen unless something is real wrong! Msg("No help available.",M_RED); return; } tc += tokresult; do { tc++; t = *tc; while(t!='\n' && t!='@' && t!='#' && x<128) { tempbuf[x]=t; tc++; t = *tc; x++; if(x >= 128) break; } tempbuf[x]=0; x=0; printext16(x*4,ydim16+(y*6)+2,11,-1,tempbuf,1); y++; if(y>16) { y=18; printext16(x*4,ydim16+(y*6)+2,11,-1,"Hit any key to continue or Q to quit....",1); while (bgetchar() == NULL); if (keystatus[KEYSC_Q]) { clearmidstatbar16(); return; } ResetKeys(); clearmidstatbar16(); y=6; } } while(t!='@' && t!='#'); } */