19 extern void OGL_GrabScreen();
22 //---------------------------------------------------------------------------
24 // FUNC M_ValidEpisodeMap
26 //---------------------------------------------------------------------------
28 boolean M_ValidEpisodeMap(int episode, int map)
30 if(episode < 1 || map < 1 || map > 9)
35 { // Shareware version checks
42 { // Extended version checks
56 { // Registered version checks
77 = Checks for the given parameter in the program's command line arguments
79 = Returns the argument number (1 to argc-1) or 0 if not present
84 int M_CheckParm (char *check)
88 for (i = 1;i<myargc;i++)
90 if ( !strcasecmp(check, myargv[i]) )
104 = Returns a 0-255 number
109 unsigned char rndtable[256] = {
110 0, 8, 109, 220, 222, 241, 149, 107, 75, 248, 254, 140, 16, 66,
111 74, 21, 211, 47, 80, 242, 154, 27, 205, 128, 161, 89, 77, 36,
112 95, 110, 85, 48, 212, 140, 211, 249, 22, 79, 200, 50, 28, 188,
113 52, 140, 202, 120, 68, 145, 62, 70, 184, 190, 91, 197, 152, 224,
114 149, 104, 25, 178, 252, 182, 202, 182, 141, 197, 4, 81, 181, 242,
115 145, 42, 39, 227, 156, 198, 225, 193, 219, 93, 122, 175, 249, 0,
116 175, 143, 70, 239, 46, 246, 163, 53, 163, 109, 168, 135, 2, 235,
117 25, 92, 20, 145, 138, 77, 69, 166, 78, 176, 173, 212, 166, 113,
118 94, 161, 41, 50, 239, 49, 111, 164, 70, 60, 2, 37, 171, 75,
119 136, 156, 11, 56, 42, 146, 138, 229, 73, 146, 77, 61, 98, 196,
120 135, 106, 63, 197, 195, 86, 96, 203, 113, 101, 170, 247, 181, 113,
121 80, 250, 108, 7, 255, 237, 129, 226, 79, 107, 112, 166, 103, 241,
122 24, 223, 239, 120, 198, 58, 60, 82, 128, 3, 184, 66, 143, 224,
123 145, 224, 81, 206, 163, 45, 63, 90, 168, 114, 59, 33, 159, 95,
124 28, 139, 123, 98, 125, 196, 15, 70, 194, 253, 54, 14, 109, 226,
125 71, 17, 161, 93, 186, 87, 244, 138, 20, 52, 123, 251, 26, 36,
126 17, 46, 52, 231, 232, 76, 31, 221, 84, 37, 216, 165, 212, 106,
127 197, 242, 98, 43, 39, 175, 254, 145, 190, 84, 118, 222, 187, 136,
135 prndindex = (prndindex+1)&0xff;
136 return rndtable[prndindex];
141 rndindex = (rndindex+1)&0xff;
142 return rndtable[rndindex];
145 void M_ClearRandom (void)
147 rndindex = prndindex = 0;
151 void M_ClearBox (fixed_t *box)
153 box[BOXTOP] = box[BOXRIGHT] = MININT;
154 box[BOXBOTTOM] = box[BOXLEFT] = MAXINT;
157 void M_AddToBox (fixed_t *box, fixed_t x, fixed_t y)
161 else if (x>box[BOXRIGHT])
163 if (y<box[BOXBOTTOM])
165 else if (y>box[BOXTOP])
183 boolean M_WriteFile (char const *name, void *source, int length)
187 handle = open (name, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666);
190 count = write (handle, source, length);
208 int M_ReadFile (char const *name, byte **buffer)
210 int handle, count, length;
211 struct stat fileinfo;
214 handle = open (name, O_RDONLY | O_BINARY, 0666);
216 I_Error ("Couldn't read file %s", name);
217 if (fstat (handle,&fileinfo) == -1)
218 I_Error ("Couldn't read file %s", name);
219 length = fileinfo.st_size;
220 buf = Z_Malloc (length, PU_STATIC, NULL);
221 count = read (handle, buf, length);
225 I_Error ("Couldn't read file %s", name);
231 //---------------------------------------------------------------------------
233 // PROC M_FindResponseFile
235 //---------------------------------------------------------------------------
239 void M_FindResponseFile(void)
243 for(i = 1; i < myargc; i++)
245 if(myargv[i][0] == '@')
257 // READ THE RESPONSE FILE INTO MEMORY
258 handle = fopen(&myargv[i][1], "rb");
261 printf("\nNo such response file!");
264 printf("Found response file %s!\n",&myargv[i][1]);
265 fseek (handle,0,SEEK_END);
266 size = ftell(handle);
267 fseek (handle,0,SEEK_SET);
268 file = malloc (size);
269 fread (file,size,1,handle);
272 // KEEP ALL CMDLINE ARGS FOLLOWING @RESPONSEFILE ARG
273 for (index = 0,k = i+1; k < myargc; k++)
274 moreargs[index++] = myargv[k];
276 firstargv = myargv[0];
277 myargv = malloc(sizeof(char *)*MAXARGVS);
278 memset(myargv,0,sizeof(char *)*MAXARGVS);
279 myargv[0] = firstargv;
283 indexinfile++; // SKIP PAST ARGV[0] (KEEP IT)
286 myargv[indexinfile++] = infile+k;
289 ((*(infile+k)>= ' '+1) && (*(infile+k)<='z')))
293 ((*(infile+k)<= ' ') || (*(infile+k)>'z')))
297 for (k = 0;k < index;k++)
298 myargv[indexinfile++] = moreargs[k];
299 myargc = indexinfile;
301 if(M_CheckParm("-debug"))
303 printf("%d command-line args:\n", myargc);
304 for(k = 1; k < myargc; k++)
306 printf("%s\n", myargv[k]);
314 //---------------------------------------------------------------------------
316 // PROC M_ForceUppercase
318 // Change string to uppercase.
320 //---------------------------------------------------------------------------
322 void M_ForceUppercase(char *text)
326 while((c = *text) != 0)
328 if(c >= 'a' && c <= 'z')
330 *text++ = c-('a'-'A');
340 ==============================================================================
344 ==============================================================================
350 extern int key_right, key_left, key_up, key_down;
351 extern int key_strafeleft, key_straferight;
352 extern int key_fire, key_use, key_strafe, key_speed;
353 extern int key_flyup, key_flydown, key_flycenter;
354 extern int key_lookup, key_lookdown, key_lookcenter;
355 extern int key_invleft, key_invright, key_useartifact;
357 extern int mousebfire;
358 extern int mousebstrafe;
359 extern int mousebforward;
362 extern int joybstrafe;
364 extern int joybspeed;
366 extern int viewwidth, viewheight;
368 int mouseSensitivity;
370 extern int screenblocks;
372 extern char *chat_macros[10];
379 int scantranslate; // PC scan code hack
380 int untranslated; // lousy hack
384 extern int snd_Channels;
385 extern int snd_DesiredMusicDevice, snd_DesiredSfxDevice;
386 extern int snd_MusicDevice, // current music card # (index to dmxCodes)
387 snd_SfxDevice; // current sfx card # (index to dmxCodes)
389 extern int snd_SBport, snd_SBirq, snd_SBdma; // sound blaster variables
390 extern int snd_Mport; // midi variables
393 default_t defaults[] =
395 { "mouse_sensitivity", &mouseSensitivity, 5 },
396 { "sfx_volume", &snd_MaxVolume, 10},
397 { "music_volume", &snd_MusicVolume, 10},
399 #define SC_INSERT 0x52
400 #define SC_DELETE 0x53
401 #define SC_PAGEUP 0x49
402 #define SC_PAGEDOWN 0x51
406 { "key_right", &key_right, KEY_RIGHTARROW },
407 { "key_left", &key_left, KEY_LEFTARROW },
408 { "key_up", &key_up, KEY_UPARROW },
409 { "key_down", &key_down, KEY_DOWNARROW },
410 { "key_strafeleft", &key_strafeleft, ',' },
411 { "key_straferight", &key_straferight, '.' },
412 { "key_flyup", &key_flyup, SC_PAGEUP },
413 { "key_flydown", &key_flydown, SC_INSERT },
414 { "key_flycenter", &key_flycenter, SC_HOME },
415 { "key_lookup", &key_lookup, SC_PAGEDOWN },
416 { "key_lookdown", &key_lookdown, SC_DELETE },
417 { "key_lookcenter", &key_lookcenter, SC_END },
418 { "key_invleft", &key_invleft, '[' },
419 { "key_invright", &key_invright, ']' },
420 { "key_useartifact", &key_useartifact, 13 },
422 { "key_fire", &key_fire, KEY_RCTRL, 1 },
423 { "key_use", &key_use, ' ', 1 },
424 { "key_strafe", &key_strafe, KEY_RALT, 1 },
425 { "key_speed", &key_speed, KEY_RSHIFT, 1 },
427 { "use_mouse", &usemouse, 1 },
428 { "mouseb_fire", &mousebfire, 0 },
429 { "mouseb_strafe", &mousebstrafe, 1 },
430 { "mouseb_forward", &mousebforward, 2 },
432 { "use_joystick", &usejoystick, 0 },
433 { "joyb_fire", &joybfire, 0 },
434 { "joyb_strafe", &joybstrafe, 1 },
435 { "joyb_use", &joybuse, 3 },
436 { "joyb_speed", &joybspeed, 2 },
438 { "screenblocks", &screenblocks, 10 },
440 { "snd_channels", &snd_Channels, 3 },
441 { "snd_musicdevice", &snd_DesiredMusicDevice, 0 },
442 { "snd_sfxdevice", &snd_DesiredSfxDevice, 0 },
443 { "snd_sbport", &snd_SBport, 544 },
444 { "snd_sbirq", &snd_SBirq, -1 },
445 { "snd_sbdma", &snd_SBdma, -1 },
446 { "snd_mport", &snd_Mport, -1 },
448 { "usegamma", &usegamma, 0 },
450 //{ "chatmacro0", (int *) &chat_macros[0], (int) HUSTR_CHATMACRO0 },
451 //{ "chatmacro1", (int *) &chat_macros[1], (int) HUSTR_CHATMACRO1 },
452 //{ "chatmacro2", (int *) &chat_macros[2], (int) HUSTR_CHATMACRO2 },
453 //{ "chatmacro3", (int *) &chat_macros[3], (int) HUSTR_CHATMACRO3 },
454 //{ "chatmacro4", (int *) &chat_macros[4], (int) HUSTR_CHATMACRO4 },
455 //{ "chatmacro5", (int *) &chat_macros[5], (int) HUSTR_CHATMACRO5 },
456 //{ "chatmacro6", (int *) &chat_macros[6], (int) HUSTR_CHATMACRO6 },
457 //{ "chatmacro7", (int *) &chat_macros[7], (int) HUSTR_CHATMACRO7 },
458 //{ "chatmacro8", (int *) &chat_macros[8], (int) HUSTR_CHATMACRO8 },
459 //{ "chatmacro9", (int *) &chat_macros[9], (int) HUSTR_CHATMACRO9 }
473 void M_SaveDefaults (void)
478 f = fopen (defaultfile, "w");
480 return; // can't write the file, but don't complain
482 for (i=0 ; i<numdefaults ; i++)
485 if (defaults[i].scantranslate)
486 defaults[i].location = &defaults[i].untranslated;
488 if (defaults[i].defaultvalue > -0xfff
489 && defaults[i].defaultvalue < 0xfff)
491 v = *defaults[i].location;
492 fprintf (f,"%s\t\t%i\n",defaults[i].name,v);
494 fprintf (f,"%s\t\t\"%s\"\n",defaults[i].name,
495 * (char **) (defaults[i].location));
511 extern byte scantokey[128];
512 extern char *basedefault;
514 void M_LoadDefaults (void)
525 // set everything to base values
527 numdefaults = sizeof(defaults)/sizeof(defaults[0]);
528 for (i=0 ; i<numdefaults ; i++)
529 *defaults[i].location = defaults[i].defaultvalue;
532 // check for a custom default file
534 i = M_CheckParm("-config");
537 defaultfile = myargv[i+1];
538 printf("default file: %s\n", defaultfile);
542 defaultfile = "c:\\heretic.cd\\heretic.cfg";
546 defaultfile = basedefault;
550 // read the file in, overriding any set defaults
552 f = fopen (defaultfile, "r");
558 if (fscanf (f, "%79s %[^\n]\n", def, strparm) == 2)
560 if (strparm[0] == '"')
562 // get a string default
564 len = strlen(strparm);
566 strncpy(newstring, strparm+1,100);
568 else if (strparm[0] == '0' && strparm[1] == 'x')
569 sscanf(strparm+2, "%x", &parm);
571 sscanf(strparm, "%i", &parm);
572 for (i=0 ; i<numdefaults ; i++)
573 if (!strcmp(def, defaults[i].name))
576 *defaults[i].location = parm;
578 *defaults[i].location =
590 for(i = 0; i < numdefaults; i++)
592 if(defaults[i].scantranslate)
594 parm = *defaults[i].location;
595 defaults[i].untranslated = parm;
596 *defaults[i].location = scantokey[parm];
604 ==============================================================================
608 ==============================================================================
618 unsigned short xmin,ymin,xmax,ymax;
619 unsigned short hres,vres;
620 unsigned char palette[48];
623 unsigned short bytes_per_line;
624 unsigned short palette_type;
626 unsigned char data; // unbounded
637 void WritePCXfile (char *filename, byte *data, int width, int height, byte *palette)
643 pcx = Z_Malloc (width*height*2+1000, PU_STATIC, NULL);
645 pcx->manufacturer = 0x0a; // PCX id
646 pcx->version = 5; // 256 color
647 pcx->encoding = 1; // uncompressed
648 pcx->bits_per_pixel = 8; // 256 color
651 pcx->xmax = SHORT(width-1);
652 pcx->ymax = SHORT(height-1);
653 pcx->hres = SHORT(width);
654 pcx->vres = SHORT(height);
655 memset (pcx->palette,0,sizeof(pcx->palette));
656 pcx->color_planes = 1; // chunky image
657 pcx->bytes_per_line = SHORT(width);
658 pcx->palette_type = SHORT(2); // not a grey scale
659 memset (pcx->filler,0,sizeof(pcx->filler));
666 for (i=0 ; i<width*height ; i++)
667 if ( (*data & 0xc0) != 0xc0)
678 *pack++ = 0x0c; // palette ID byte
679 for (i=0 ; i<768 ; i++)
680 *pack++ = *palette++;
685 length = pack - (byte *)pcx;
686 M_WriteFile (filename, pcx, length);
692 //==============================================================================
702 void M_ScreenShot (void)
706 void M_ScreenShot (void)
714 extern byte *pcscreen;
717 // munge planar buffer to linear
725 // find a file name to save it to
727 strcpy(lbmname,"HRTIC00.pcx");
729 for (i=0 ; i<=99 ; i++)
731 lbmname[5] = i/10 + '0';
732 lbmname[6] = i%10 + '0';
733 if (access(lbmname,0) == -1)
734 break; // file doesn't exist
737 I_Error ("M_ScreenShot: Couldn't create a PCX");
743 pal = (byte *)Z_Malloc(768, PU_STATIC, NULL);
745 for(i = 0; i < 768; i++)
747 *(pal+i) = inp(0x3c9)<<2;
750 pal = (byte *)W_CacheLumpName("PLAYPAL", PU_CACHE);
753 WritePCXfile (lbmname, linear, SCREENWIDTH, SCREENHEIGHT
756 players[consoleplayer].message = "SCREEN SHOT";