123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- //
- // 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();
- }
|