|
|
1.1 root 1: #include "build.h"
2: #include "names.h"
3: #include "stdio.h"
4:
5: extern long zmode, kensplayerheight;
6:
7: #define AVERAGEFRAMES 16
8:
9: static long frameval[AVERAGEFRAMES], framecnt = 0;
10:
11:
12: extern
13: long posx,
14: posy,
15: posz,
16: horiz,
17: qsetmode;
18:
19: extern
20: short ang,
21: cursectnum;
22:
23: extern
24: short ceilingheinum,
25: floorheinum;
26:
27: extern
28: char names[MAXTILES][17];
29:
30: extern
31: short searchsector,
32: searchwall,
33: searchstat; //search output
34:
35: static
36: short temppicnum,
37: tempcstat;
38:
39: static
40: char tempshade,
41: tempxrepeat,
42: tempyrepeat,
43: somethingintab=255;
44:
45: extern
46: void __interrupt __far timerhandler(void);
47:
48: long xoldtimerhandler;
49:
50: void __interrupt __far
51: xtimerhandler(void)
52: {
53: timerhandler();
54: if (qsetmode == 480) {
55: Keys2d();
56: }
57: else {
58: Keys3d();
59: }
60: }
61:
62:
63: void faketimerhandler(void) {
64: return;
65: }
66:
67: void
68: xinittimer(void)
69: {
70: outp(0x43,54);
71: outp(0x40,9942&255);
72: outp(0x40,9942>>8); //120 times/sec
73: xoldtimerhandler=(long)_dos_getvect(0x8);
74: _disable();
75: _dos_setvect(0x8,xtimerhandler);
76: _enable();
77: }
78:
79: static
80: char tempbuf[256]; //161
81:
82: static
83: int numsprite[2000];
84:
85: static
86: char lo[32];
87:
88: static
89: const char *levelname;
90:
91: static
92: short curwall=0,
93: wallpicnum=0,
94: curwallnum=0;
95:
96: static
97: short cursprite=0,
98: curspritenum=0;
99:
100: static
101: char wallsprite=0;
102:
103: static helpon=0;
104:
105: static
106: char once=0;
107:
108: void
109: ExtLoadMap(const char *mapname)
110: {
111: if (once == 0) {
112: xinittimer();
113: }
114: once=1;
115: levelname=mapname;
116: ReadPaletteTable();
117: visibility=11;
118: // pskyoff[0]=0;
119: // pskybits=3;
120: }
121:
122: void
123: ExtSaveMap(const char *mapname)
124: {
125: clearmidstatbar16(); //Clear middle of status bar
126: sprintf(tempbuf,"Saving File : %s",mapname);
127: printmessage16(tempbuf);
128: }
129:
130: const
131: char *ExtGetSectorCaption(short sectnum)
132: {
133:
134: short which;
135: int temp=0;
136: char string[5];
137: char destination[25];
138:
139: which = sector[sectnum].lotag;
140:
141: if ((sector[sectnum].lotag|sector[sectnum].hitag) == 0) {
142: tempbuf[0]=0;
143: }
144: else {
145: if( which >= 1100 && which <= 1900) {
146: temp = sector[sectnum].lotag / 100;
147: which = temp * 100;
148: itoa(sector[sectnum].lotag-which,string,10);
149: }
150: else if( which >=2000 && which <= 2999 ) {
151:
152:
153: }
154: if( which >= 80 && which <= 89 ) {
155: // panning
156: temp=which-80;
157: which=sector[sectnum].lotag-temp;
158: }
159: //switch((unsigned short)sector[sectnum].lotag) {
160: switch (which) {
161: case 1:
162: sprintf(lo,"ACTIVATE SECTOR");
163: break;
164: case 2:
165: sprintf(lo,"ACTIVATE ONCE");
166: case 4:
167: //
168: // need to fix
169: sprintf(lo,"FLOOR PANNING");
170: case 6:
171: sprintf(lo,"RISING DOOR");
172: break;
173: case 7:
174: sprintf(lo,"DROP DOOR");
175: break;
176: case 8:
177: sprintf(lo,"HOR SPLIT DOOR");
178: break;
179: case 9:
180: sprintf(lo,"VER SPLIT DOOR");
181: break;
182: case 10:
183: sprintf(lo,"TELEPORTER");
184: break;
185: case 11:
186: sprintf(lo,"XPANNING WALLS");
187: case 16:
188: sprintf(lo,"BOX DOOR");
189: break;
190: case 80:
191: strcpy(destination,"PANNING ");
192:
193: switch(temp) {
194: case 0:
195: strcpy(string,"N");
196: break;
197: case 1:
198: strcpy(string,"NE");
199: break;
200: case 2:
201: strcpy(string,"E");
202: break;
203: case 3:
204: strcpy(string,"SE");
205: break;
206: case 4:
207: strcpy(string,"S");
208: break;
209: case 5:
210: strcpy(string,"SW");
211: break;
212: case 6:
213: strcpy(string,"W");
214: break;
215: case 7:
216: strcpy(string,"SW");
217: break;
218: }
219: strcat(destination," ");
220: strcat(destination,string);
221: sprintf(lo,destination);
222: break;
223: case 1000:
224: sprintf(lo,"PLATFORM ELEVATOR");
225: break;
226: case 1003:
227: sprintf(lo,"BOX ELEVATOR");
228: break;
229: case 1100:
230: strcpy(destination,"DROP FLOOR ");
231: strcat(destination,string);
232: sprintf(lo,destination);
233: break;
234: case 1200:
235: strcpy(destination,"RAISE FLOOR ");
236: strcat(destination,string);
237: sprintf(lo,destination);
238: break;
239: case 1300:
240: strcpy(destination,"DROP CEILING ");
241: strcat(destination,string);
242: sprintf(lo,destination);
243: break;
244: case 1400:
245: strcpy(destination,"RAISE CEILING ");
246: strcat(destination,string);
247: sprintf(lo,destination);
248: break;
249: case 1500:
250: strcpy(destination,"DROP F&C ");
251: strcat(destination,string);
252: sprintf(lo,destination);
253: break;
254: case 1600:
255: strcpy(destination,"RAISE F&C ");
256: strcat(destination,string);
257: sprintf(lo,destination);
258: break;
259: case 1800:
260: sprintf(lo,"LIFT");
261: break;
262: case 1900:
263: sprintf(lo,"FLOOR DOOR");
264: break;
265: default:
266: sprintf(lo,"%hu",(unsigned short)sector[sectnum].lotag);
267: break;
268: }
269: sprintf(tempbuf,"%hu,%s",(unsigned short)sector[sectnum].hitag,lo);
270: }
271: return(tempbuf);
272: }
273:
274: const
275: char *ExtGetWallCaption(short wallnum)
276: {
277: long i=0;
278:
279: if (keystatus[0x57] > 0) { // f11 Grab pic 0x4e +
280: wallpicnum=wall[curwall].picnum;
281: sprintf(tempbuf,"Grabed Wall Picnum %ld",wallpicnum);
282: printmessage16(tempbuf);
283: }
284: if (keystatus[0x2b] > 0) { // |
285: if (wallsprite == 1) {
286: for (i=curwallnum ; i < MAXWALLS ; i++) {
287: if (wall[i].picnum == wall[curwall].picnum) {
288: posx=(wall[i].x)-(((wall[i].x)-(wall[wall[i].point2].x))/2);
289: posy=(wall[i].y)-(( (wall[i].y)-(wall[wall[i].point2].y))/2);
290: printmessage16("Wall Found");
291: curwallnum++;
292: keystatus[0x2b]=0;
293: return(tempbuf);
294: }
295: curwallnum++;
296: }
297: }
298: if (wallsprite == 2) {
299: for (i=curspritenum ; i < MAXSPRITES ; i++) {
300: if (sprite[i].picnum == sprite[cursprite].picnum && sprite[i].statnum == 0) {
301: posx=sprite[i].x;
302: posy=sprite[i].y;
303: ang=sprite[i].ang;
304: printmessage16("Sprite Found");
305: curspritenum++;
306: keystatus[0x2b]=0;
307: return(tempbuf);
308: }
309: curspritenum++;
310: }
311: }
312: }
313: if ((wall[wallnum].lotag|wall[wallnum].hitag) == 0) {
314: tempbuf[0]=0;
315: }
316: else {
317: sprintf(tempbuf,"%hu,%hu",(unsigned short)wall[wallnum].hitag,
318: (unsigned short)wall[wallnum].lotag);
319: }
320: return(tempbuf);
321: }
322:
323: const
324: char *ExtGetSpriteCaption(short spritenum)
325: {
326: char destination[20];
327: int which;
328:
329: tempbuf[0]=0;
330:
331: if ((sprite[spritenum].lotag|sprite[spritenum].hitag) == 0) {
332: SpriteName(spritenum,lo);
333: if (lo[0] != 0) {
334: sprintf(tempbuf,"%s",lo);
335: }
336: }
337: else if ((unsigned short)sprite[spritenum].picnum == 104) {
338: switch((unsigned short)sprite[spritenum].lotag) {
339: case 1000:
340: sprintf(lo,"PULSING");
341: break;
342: case 1001:
343: sprintf(lo,"FLICKERING");
344: break;
345: case 1002:
346: sprintf(lo,"TIC DELAY");
347: break;
348: default:
349: sprintf(lo,"%hu",(unsigned short)sprite[spritenum].lotag);
350: break;
351: }
352: sprintf(tempbuf,"%hu,%s",(unsigned short)sprite[spritenum].hitag,lo);
353: }
354: else if(sprite[spritenum].hitag >= 90 && sprite[spritenum].hitag <= 99) {
355: which=sprite[spritenum].lotag;
356: strcpy(destination,"GRATE ");
357: switch(which){
358: case 1:
359: strcat(destination,"OUT");
360: break;
361: case 2:
362: strcat(destination,"IN");
363: break;
364: case 3:
365: strcat(destination,"UP");
366: break;
367: case 4:
368: strcat(destination,"DN");
369: break;
370: }
371: sprintf(lo,destination);
372: }
373: else {
374: SpriteName(spritenum,lo);
375: sprintf(tempbuf,"%hu,%hu %s",(unsigned short)sprite[spritenum].hitag,
376: (unsigned short)sprite[spritenum].lotag,lo);
377: }
378: return(tempbuf);
379: }
380:
381: //printext16 parameters:
382: //printext16(long xpos, long ypos, short col, short backcol,
383: // char name[82], char fontsize)
384: // xpos 0-639 (top left)
385: // ypos 0-479 (top left)
386: // col 0-15
387: // backcol 0-15, -1 is transparent background
388: // name
389: // fontsize 0=8*8, 1=3*5
390:
391: //drawline16 parameters:
392: // drawline16(long x1, long y1, long x2, long y2, char col)
393: // x1, x2 0-639
394: // y1, y2 0-143 (status bar is 144 high, origin is top-left of STATUS BAR)
395: // col 0-15
396:
397: void
398: ExtShowSectorData(short sectnum) //F5
399: {
400: int i,c=0;
401:
402: for (i=0 ; i < 2000 ; i++) {
403: numsprite[i]=0;
404: }
405: for (i=0 ; i < MAXSPRITES ; i++) {
406: if (sprite[i].statnum == 0) {
407: numsprite[sprite[i].picnum]++;
408: }
409: }
410: clearmidstatbar16(); //Clear middle of status bar
411: sprintf(tempbuf,"Level %s",levelname);
412: printmessage16(tempbuf);
413: }
414:
415: void
416: ExtShowWallData(short wallnum) //F6
417: {
418: int i,nexti,bls,ouls,ss,rss,smss,tss,es,drs,music=0;
419:
420: bls=ouls=ss=rss=smss=tss=es=drs=0;
421: for(i=0 ; i < MAXSPRITES ; i++) {
422: if (sprite[i].picnum == 51 && sprite[i].statnum == 0) {
423: if(sprite[i].lotag > drs) {
424: drs=sprite[i].lotag;
425: }
426: }
427: if (sprite[i].picnum == 175 && sprite[i].statnum == 0) {
428: switch(sprite[i].lotag) {
429: case 1:
430: if (sprite[i].hitag > rss) {
431: rss=sprite[i].hitag;
432: }
433: break;
434: case 3:
435: case 4:
436: if (sprite[i].hitag > bls) {
437: bls=sprite[i].hitag;
438: }
439: break;
440: case 7:
441: if (sprite[i].hitag > tss) {
442: tss=sprite[i].hitag;
443: }
444: break;
445: case 8:
446: if (sprite[i].hitag > ouls) {
447: ouls=sprite[i].hitag;
448: }
449: break;
450: case 13:
451: if (sprite[i].hitag > es) {
452: es=sprite[i].hitag;
453: }
454: break;
455: }
456: }
457: }
458: clearmidstatbar16();
459: sprintf(tempbuf,"Level %s",levelname);
460: printmessage16(tempbuf);
461: printext16(1*8,4*8,11,-1,"Sector Effector Status",0);
462: PrintStatus("Breaking Lights =",bls,2,6,11);
463: PrintStatus("Open Up Lights =",ouls,2,7,11);
464: PrintStatus("Switches =",ss,2,8,11);
465: PrintStatus("Rotating Sectors =",rss,2,9,11);
466: PrintStatus("Subway Moving Sectors =",smss,2,10,11);
467: PrintStatus("Transporting Sectors =",tss,2,11,11);
468: PrintStatus("Exploding Sectors =",es,32,6,11);
469: PrintStatus("Delay Reactions =",drs,32,7,11);
470: }
471:
472: void
473: ExtShowSpriteData(short spritenum) //F6
474: {
475: FILE *fp;
476: int i,t;
477: char x=0,y=4,xmax=0,xx=0,col=0;
478:
479: clearmidstatbar16();
480: if ((fp=fopen("sehelp.hlp","rb")) == NULL) {
481: printext16(1*4,4*8,11,-1,"ERROR: file <SEHELP.HLP> not found.",0);
482: return;
483: }
484: t=65;
485: while (t != EOF && col < 5) {
486: t=getc(fp);
487: while (t != EOF && t != '\n' && x < 250) {
488: tempbuf[x]=t;
489: t=getc(fp);
490: x++;
491: if (x > xmax) {
492: xmax=x;
493: }
494: }
495: tempbuf[x]=0;
496: printext16(xx*4,(y*6)+2,11,-1,tempbuf,1);
497: x=0;
498: y++;
499: if (y > 18) {
500: col++;
501: y=6;
502: xx+=xmax;
503: xmax=0;
504: }
505: }
506: }
507:
508: void
509: ExtEditSectorData(short sectnum) //F7
510: {
511: FILE *fp;
512: int i,t;
513: char x=0,y=4,xmax=0,xx=0,col=0;
514:
515: clearmidstatbar16();
516: if ((fp=fopen("sthelp.hlp","rb")) == NULL) {
517: printext16(1*4,4*8,11,-1,"ERROR: file <STHELP.HLP> not found.",0);
518: return;
519: }
520: t=65;
521: while (t != EOF && col < 5) {
522: t=getc(fp);
523: while (t != EOF && t != '\n' && x < 250) {
524: tempbuf[x]=t;
525: t=getc(fp);
526: x++;
527: if (x > xmax) {
528: xmax=x;
529: }
530: }
531: tempbuf[x]=0;
532: printext16(xx*4,(y*6)+2,11,-1,tempbuf,1);
533: x=0;
534: y++;
535: if (y > 18) {
536: col++;
537: y=6;
538: xx+=xmax;
539: xmax=0;
540: }
541: }
542: }
543:
544: void
545: ExtEditWallData(short wallnum) //F8
546: {
547: wallsprite=1;
548: curwall=wallnum;
549: curwallnum=0;
550: sprintf(tempbuf,"Current Wall %ld",curwall);
551: printmessage16(tempbuf);
552: }
553:
554: void
555: ExtEditSpriteData(short spritenum) //F8
556: {
557: wallsprite=2;
558: cursprite=spritenum;
559: curspritenum=0;
560: sprintf(tempbuf,"Current Sprite %ld",cursprite);
561: printmessage16(tempbuf);
562: }
563:
564: //Just thought you might want my getnumber16 code
565: /*
566: getnumber16(char namestart[80], short num, long maxnumber)
567: {
568: char buffer[80];
569: long j, k, n, danum, oldnum;
570:
571: danum = (long)num;
572: oldnum = danum;
573: while ((keystatus[0x1c] != 2) && (keystatus[0x1] == 0)) //Enter, ESC
574: {
575: sprintf(&buffer,"%s%ld_ ",namestart,danum);
576: printmessage16(buffer);
577:
578: for(j=2;j<=11;j++) //Scan numbers 0-9
579: if (keystatus[j] > 0)
580: {
581: keystatus[j] = 0;
582: k = j-1;
583: if (k == 10) k = 0;
584: n = (danum*10)+k;
585: if (n < maxnumber) danum = n;
586: }
587: if (keystatus[0xe] > 0) // backspace
588: {
589: danum /= 10;
590: keystatus[0xe] = 0;
591: }
592: if (keystatus[0x1c] == 1) //L. enter
593: {
594: oldnum = danum;
595: keystatus[0x1c] = 2;
596: asksave = 1;
597: }
598: }
599: keystatus[0x1c] = 0;
600: keystatus[0x1] = 0;
601: return((short)oldnum);
602: }
603: */
604:
605: void
606: PrintStatus(char *string,int num,char x,char y,char color)
607: {
608: sprintf(tempbuf,"%s %d",string,num);
609: printext16(x*8,y*8,color,-1,tempbuf,0);
610: }
611:
612: void
613: SpriteName(short spritenum, char *lo2)
614: {
615: sprintf(lo2,names[sprite[spritenum].picnum]);
616: /*
617: switch((unsigned short)sprite[spritenum].picnum)
618: {
619: case APLAYER : sprintf(lo2,"GRONDOVAL"); break;
620: case KOBOLD : sprintf(lo2,"KOBOLD"); break;
621: case JUDY : sprintf(lo2,"JUDY"); break;
622: case MANDROID : sprintf(lo2,"MANDROID"); break;
623: case TROOP1 : sprintf(lo2,"TROOPER"); break;
624: case SEENINE : sprintf(lo2,"C-9"); break;
625: case BAT : sprintf(lo2,"BAT"); break;
626: case REACTOR : sprintf(lo2,"REACTOR"); break;
627: case EXPLODINGBARREL : sprintf(lo2,"EBARREL"); break;
628:
629: case COKE : sprintf(lo2,"COKE"); break;
630: case SIXPAK : sprintf(lo2,"SIXPAK"); break;
631: case STEROIDS : sprintf(lo2,"STEROIDS"); break;
632: case SHIELD : sprintf(lo2,"SHIELD"); break;
633: case AIRTANK : sprintf(lo2,"AIRTANK"); break;
634: case JETPACK : sprintf(lo2,"JETPACK"); break;
635: case HOLODUKE : sprintf(lo2,"HOLODUKE"); break;
636:
637: case FIRSTGUNSPRITE : sprintf(lo2,"PISTOL"); break;
638: case GUN2ASPRITE : sprintf(lo2,"ELECTROGUN"); break;
639: case RPGSPRITE : sprintf(lo2,"RPG"); break;
640:
641: case AMMO : sprintf(lo2,"AMMO"); break;
642: case BATTERYAMMO : sprintf(lo2,"BATTERY"); break;
643: case HEAVYHBOMB : sprintf(lo2,"H-BOMB"); break;
644: case RPGAMMO : sprintf(lo2,"3-RPG"); break;
645:
646: default : lo2[0]=0;
647: }
648: */
649: }
650:
651: void
652: ReadPaletteTable()
653: {
654: FILE *fp;
655: int i,j;
656: char num_tables,lookup_num;
657:
658: if ((fp=fopen("lookup.dat","rb")) == NULL) {
659: return;
660: }
661: num_tables=getc(fp);
662: for (j=0 ; j < num_tables ; j++) {
663: lookup_num=getc(fp);
664: for (i=0 ; i < 256 ; i++) {
665: tempbuf[i]=getc(fp);
666: }
667: makepalookup(lookup_num,tempbuf,0,0,0);
668: }
669: fclose;
670: }
671:
672: void
673: Keys3d(void)
674: {
675: if (helpon == 1) {
676: printext256(0*8,0*8,15,0,"HELP SCREEN",0);
677: printext256(0*8,2*8,15,0," ' + H = Help",0);
678: printext256(0*8,3*8,15,0," ' + Enter = copy graphic Only",0);
679: }
680: if (keystatus[0x28] == 1 && keystatus[0x23] == 1) { // ' H
681: helpon=1;
682: }
683: if (keystatus[0x29] == 1) { // `
684: helpon=0;
685: }
686: if (keystatus[0x28] == 1 && keystatus[0x1c] == 1) { // ' ENTER
687: printext256(0,0,15,0,"Put Graphic ONLY",0);
688: keystatus[0x1c]=0;
689: switch(searchstat) {
690: case 0:
691: wall[searchwall].picnum=temppicnum;
692: break;
693: case 1:
694: sector[searchsector].ceilingpicnum=temppicnum;
695: break;
696: case 2:
697: sector[searchsector].floorpicnum=temppicnum;
698: break;
699: case 3:
700: sprite[searchwall].picnum=temppicnum;
701: break;
702: case 4:
703: wall[searchwall].overpicnum=temppicnum;
704: break;
705: }
706: }
707: if (keystatus[0x0f] == 1) { //TAB
708: switch (searchstat) {
709: case 0:
710: temppicnum=wall[searchwall].picnum;
711: tempshade=wall[searchwall].shade;
712: tempxrepeat=wall[searchwall].xrepeat;
713: tempyrepeat=wall[searchwall].yrepeat;
714: tempcstat=wall[searchwall].cstat;
715: break;
716: case 1:
717: temppicnum=sector[searchsector].ceilingpicnum;
718: tempshade=sector[searchsector].ceilingshade;
719: tempxrepeat=sector[searchsector].ceilingxpanning;
720: tempyrepeat=sector[searchsector].ceilingypanning;
721: tempcstat=sector[searchsector].ceilingstat;
722: break;
723: case 2:
724: temppicnum=sector[searchsector].floorpicnum;
725: tempshade=sector[searchsector].floorshade;
726: tempxrepeat=sector[searchsector].floorxpanning;
727: tempyrepeat=sector[searchsector].floorypanning;
728: tempcstat=sector[searchsector].floorstat;
729: break;
730: case 3:
731: temppicnum=sprite[searchwall].picnum;
732: tempshade=sprite[searchwall].shade;
733: tempxrepeat=sprite[searchwall].xrepeat;
734: tempyrepeat=sprite[searchwall].yrepeat;
735: tempcstat=sprite[searchwall].cstat;
736: break;
737: case 4:
738: temppicnum=wall[searchwall].overpicnum;
739: tempshade=wall[searchwall].shade;
740: tempxrepeat=wall[searchwall].xrepeat;
741: tempyrepeat=wall[searchwall].yrepeat;
742: tempcstat=wall[searchwall].cstat;
743: }
744: }
745: }
746:
747: void
748: Keys2d(void)
749: {
750:
751: }
752:
753: void ExtInit(void)
754: {
755: long i;
756:
757: //You can load your own palette lookup tables here if you just
758: //copy the right code!
759: for(i=0;i<256;i++)
760: tempbuf[i] = ((i+32)&255); //remap colors for screwy palette sectors
761: makepalookup(16,tempbuf,0,0,0);
762:
763: kensplayerheight = 54;
764: zmode = 0;
765:
766: }
767:
768: void ExtUnInit(void)
769: {
770: }
771:
772: void ExtCheckKeys(void)
773: {
774: long i;
775:
776: if (qsetmode == 200) //In 3D mode
777: {
778: i = totalclock;
779: if (i != frameval[framecnt])
780: {
781: sprintf(tempbuf,"%ld",(120*AVERAGEFRAMES)/(i-frameval[framecnt]));
782: printext256(0L,0L,31,-1,tempbuf,1);
783: frameval[framecnt] = i;
784: }
785: framecnt = ((framecnt+1)&(AVERAGEFRAMES-1));
786:
787: editinput();
788: }
789: else
790: {
791: }
792: }
793:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.