mirror of
https://github.com/id-Software/idsetup.git
synced 2026-03-19 16:39:39 +01:00
The source of the setup program included with DOOM, Final DOOM, Strife, etc.
This commit is contained in:
215
SETUP.C
Normal file
215
SETUP.C
Normal file
@@ -0,0 +1,215 @@
|
||||
//
|
||||
// SETUP PROGRAM
|
||||
// (C) 1994 id Software, inc.
|
||||
// by John Romero
|
||||
// October 1-?
|
||||
//
|
||||
|
||||
#include <stdio.h>
|
||||
#include <dos.h>
|
||||
#include <conio.h>
|
||||
#include <mem.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "main.h" // #includes setup.h
|
||||
|
||||
//
|
||||
// Fatal error
|
||||
//
|
||||
char errorstring[80];
|
||||
void Error(char *string)
|
||||
{
|
||||
textbackground(0);
|
||||
textcolor(7);
|
||||
clrscr();
|
||||
printf("%s\n",string);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
void DrawRadios(radiogroup_t *rg)
|
||||
{
|
||||
int i;
|
||||
int value;
|
||||
radio_t *r;
|
||||
char far *screen;
|
||||
byte color;
|
||||
|
||||
value = *(rg->master);
|
||||
color = (rg->bgcolor << 4)+rg->fgcolor;
|
||||
r = rg->radios;
|
||||
for (i = 0; i < rg->amount; i++)
|
||||
{
|
||||
screen = MK_FP(0xb800,(r->y*160)+(r->x*2));
|
||||
*(screen+1) = color;
|
||||
if (value == r->value)
|
||||
*screen = 7;
|
||||
else
|
||||
*screen = ' ';
|
||||
r++;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Save screens
|
||||
//
|
||||
static int layer = 0; // which screen layer we're at
|
||||
char far screens[MAXLAYERS][4000];
|
||||
void SaveScreen(void)
|
||||
{
|
||||
movedata(0xb800,0,FP_SEG(&screens[layer]),FP_OFF(&screens[layer]),4000);
|
||||
layer++;
|
||||
if (layer > MAXLAYERS)
|
||||
{
|
||||
sprintf(errorstring,"More than %d layers!",layer);
|
||||
Error(errorstring);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Restore screens
|
||||
//
|
||||
void RestoreScreen(void)
|
||||
{
|
||||
layer--;
|
||||
if (layer < 0)
|
||||
Error("Restored one layer too many!");
|
||||
movedata(FP_SEG(&screens[layer]),FP_OFF(&screens[layer]),0xb800,0,4000);
|
||||
}
|
||||
|
||||
//
|
||||
// Draw the dim 3-D edge of a window
|
||||
//
|
||||
void DrawDimEdge(pup_t far *pup)
|
||||
{
|
||||
char far *screen;
|
||||
int i;
|
||||
|
||||
if ((pup->x + pup->width + 1 > 79) ||
|
||||
(pup->y + pup->height > 24))
|
||||
return;
|
||||
|
||||
for (i = pup->y + 1; i < pup->y + pup->height + 1; i++)
|
||||
{
|
||||
screen = MK_FP(0xb800,i*160 + (pup->x + pup->width)*2);
|
||||
*(screen+1) = 8;
|
||||
*(screen+3) = 8;
|
||||
}
|
||||
|
||||
screen = MK_FP(0xb800,(pup->y + pup->height)*160 + (pup->x+2)*2);
|
||||
for (i = 0; i < pup->width; i++)
|
||||
{
|
||||
*(screen+1) = 8;
|
||||
screen += 2;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//
|
||||
// Draw LaughingDog .PUP files!
|
||||
//
|
||||
void DrawPup(pup_t far *pup)
|
||||
{
|
||||
int width;
|
||||
int w;
|
||||
int height;
|
||||
int x;
|
||||
int y;
|
||||
char far *data;
|
||||
byte code;
|
||||
char far *screen;
|
||||
char c;
|
||||
char a;
|
||||
short times;
|
||||
int i;
|
||||
int string;
|
||||
|
||||
w = width = pup->width;
|
||||
height = pup->height;
|
||||
x = pup->x;
|
||||
y = pup->y;
|
||||
DrawDimEdge(pup);
|
||||
data = (char far *)(pup + 1);
|
||||
screen = MK_FP(0xb800,y*160 + x*2);
|
||||
string = normal;
|
||||
|
||||
while(1)
|
||||
{
|
||||
code = *data++;
|
||||
switch(code)
|
||||
{
|
||||
case 0: // String of chars w/same attribute
|
||||
if (string == stringdraw)
|
||||
{
|
||||
string = normal;
|
||||
break;
|
||||
}
|
||||
string = stringdraw;
|
||||
|
||||
c = *data++; // char
|
||||
a = *data++; // attribute
|
||||
*screen++ = c;
|
||||
*screen++ = a;
|
||||
if (!--w)
|
||||
{
|
||||
if (!--height)
|
||||
return; // finished!
|
||||
w = width;
|
||||
y++;
|
||||
screen = MK_FP(0xb800,y*160 + x*2);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0xff: // Repeated byte
|
||||
c = *data++;
|
||||
a = *data++;
|
||||
times = (*data * 256) + *(data+1);
|
||||
data+=2;
|
||||
for (i = 0;i < times; i++)
|
||||
{
|
||||
*screen++ = c;
|
||||
*screen++ = a;
|
||||
if (!--w)
|
||||
{
|
||||
if (!--height)
|
||||
return; // finished!
|
||||
w = width;
|
||||
y++;
|
||||
screen = MK_FP(0xb800,y*160 + x*2);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default: // char/attibute combo
|
||||
if (string != stringdraw)
|
||||
a = *data++;
|
||||
c = code;
|
||||
*screen++ = c;
|
||||
*screen++ = a;
|
||||
if (!--w)
|
||||
{
|
||||
if (!--height)
|
||||
return; // finished!
|
||||
w = width;
|
||||
y++;
|
||||
screen = MK_FP(0xb800,y*160 + x*2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
char **myargv;
|
||||
int myargc;
|
||||
|
||||
void main(int argc, char *argv[])
|
||||
{
|
||||
myargv = argv;
|
||||
myargc = argc;
|
||||
|
||||
#ifdef DEBUG
|
||||
ShowAllPups();
|
||||
#endif
|
||||
|
||||
StartUp();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user