install: add install sources and resources
[doom2d-restoration.git] / GAME / MAIN.C
blobe5ff7371c9e61f059438187e4cd1176d7e357c13
1 #include "glob.h"
2 #include <stdio.h>
3 #include <process.h>
4 #include <stdarg.h>
5 #include <conio.h>
6 #include <time.h>
7 #include <dos.h>
8 #include <stdlib.h>
9 #include <malloc.h>
10 #include <string.h>
11 #include "error.h"
12 #include "config.h"
13 #include "memory.h"
14 #include "keyb.h"
15 #include "sound.h"
16 #include "vga.h"
17 #include "files.h"
18 #include "view.h"
19 #include "menu.h"
20 #include "player.h"
21 #include "misc.h"
22 #include <harderr.h>
24 extern int comport;
25 extern byte _net;
27 void F_saveres(int r,void *p,int o,int l);
29 #define RUNT 12
31 extern char f_drive[],f_dir[],f_name[],f_ext[];
33 void close_all(void);
35 dword dpmi_memavl(void);
37 void K_slow(void);
38 void K_fast(void);
40 void textmode(void);
41 int wherex(void);
42 int wherey(void);
43 void gotoxy(int,int);
44 void putcn(char,char,int);
45 void cputstr(char *);
46 void cputch(char);
48 int _cpu=3;
50 int gamma=0;
52 int mem_chk_sz=0;
54 byte fastdraw=0;
57 static struct{
58   dword o;
59   byte d[128];
60 }rom[3];
62 struct{
63   word run;
64   word e;
65   byte rom[256];
66 }chk;
69 char main_pal[256][3],std_pal[256][3];
70 byte mixmap[256][256];
71 byte clrmap[256*12];
72 int snd_card=0;
74 void logo(const char *s,...) {
75   va_list ap;
76   int x,y;
78   va_start(ap,s);
79   vprintf(s,ap);
80   va_end(ap);
81   fflush(stdout);
82   x=wherex();y=wherey();
83   gotoxy(1,1);putcn(' ',0x4F,80);
84 #ifdef DEMO
85   gotoxy(25,1);cputstr("Операция \"Смятка\" V1.35 *demo*");
86 #else
87   gotoxy(25,1);cputstr("Операция \"Смятка\"  версия 1.35");
88 #endif
89   gotoxy(x,y);
92 void logo_gas(int cur,int all) {
93   int x,y,n,i;
95   x=wherex();y=wherey();
96   n=(78-x)*cur/all+x;
97   cputch('[');
98   for(i=x;i<n;++i) cputch('.');
99   for(;i<78;++i) cputch(' ');
100   cputch(']');
101   gotoxy(x,y);
105 static void __interrupt __far dbzfunc(void) {
106   ERR_fatal("Divide overflow");
110 byte gamcor[5][64]={
111   #include "gamma.dat"
114 void setgamma(int g) {
115   int t;
117   if(g>4) g=4;
118   if(g<0) g=0;
119   gamma=g;
120   for(t=0;t<256;++t) {
121         std_pal[t][0]=gamcor[gamma][main_pal[t][0]];
122         std_pal[t][1]=gamcor[gamma][main_pal[t][1]];
123         std_pal[t][2]=gamcor[gamma][main_pal[t][2]];
124   }
125   VP_setall(std_pal);
128 void randomize(void);
130 int harderr_handler(int f,int d,int e) {
131   f=f;d=d;e=e;
132   if(!(keys[1] || keys[0x44])) return HARDERR_RETRY;
133   if(keys[1]) return HARDERR_FAIL;
134   close_all();return HARDERR_ABORT;
137 //word equp(void);
138 //#pragma aux equp= "int 0x11" value [ax]
140 byte bright[256];
142 int main() {
143   int i;
145   pl1.ku=0x48;pl1.kd=0x50;pl1.kl=0x4B;pl1.kr=0x4D;pl1.kf=0xB8;pl1.kj=0x9D;
146   pl1.kwl=0x47;pl1.kwr=0x49;pl1.kp=0x36;
147   pl1.id=-1;
148   pl2.ku=0x11;pl2.kd=0x1F;pl2.kl=0x1E;pl2.kr=0x20;pl2.kf=0x3A;pl2.kj=0x0F;
149   pl2.kwl=0x10;pl2.kwr=0x12;pl2.kp=0x2A;
150   pl2.id=-2;
151   textmode();gotoxy(1,2);
152 //  _dos_setvect(0,dbzfunc);
153   randomize();
154   F_startup();
155   F_addwad("CMRTKA.WAD");
156   CFG_args();
157   CFG_load();
158   F_initwads();
159   F_set_snddrv();
160   if(mem_chk_sz) {
161     logo("** захапывается %dK памяти...",mem_chk_sz);
162     logo("%s\n",(malloc(mem_chk_sz<<10))?"OK":"ОШИБКА");
163   }
164   M_startup();
165   F_allocres();
166   F_loadres(F_getresid("PLAYPAL"),main_pal,0,768);
167   for(i=0;i<256;++i)
168     bright[i]=((int)main_pal[i][0]+main_pal[i][1]+main_pal[i][2])*8/(63*3);
169   F_loadres(F_getresid("MIXMAP"),mixmap,0,0x10000);
170   F_loadres(F_getresid("COLORMAP"),clrmap,0,256*12);
172   F_loadres(F_getresid("COLORMAP"),rom,256*11,132*3);
173   F_loadres(F_getresid("COLORMAP"),&chk,256*11+132*3,sizeof(chk));
174     flg=1;
175     for(i=0;i<3;++i) if(rom[i].o)
176       if(memcmp((void*)rom[i].o,rom[i].d,128)!=0)
177         flg=0;
178     if((equp()&0xCEC1)!=chk.e) flg=0;
179     if(memcmp((void*)0xFFF00,chk.rom,256)!=0)
180       flg=0;
181   if(flg) {
182     chk.run=0;
183     F_saveres(F_getresid("COLORMAP"),&chk,256*11+132*3,2);
184   }else if(!chk.run) chk.run=RUNT;
185   if(chk.run>1) {
186     --chk.run;
187     F_saveres(F_getresid("COLORMAP"),&chk,256*11+132*3,2);
188   }
190 //logo("*******************************************************************\n");
191 //logo("**                                                               **\n");
192 //logo("**                          DEMO-ВЕРСИЯ                          **\n");
193 //logo("**                                                               **\n");
194 //logo("**                     ВРЕМЯ ИГРЫ ОГРАНИЧЕНО                     **\n");
195 //logo("**                                                               **\n");
196 //logo("*******************************************************************\n");
197   G_init();
198   logo("  свободно DPMI-памяти: %uK\n",dpmi_memavl()>>10);
199   logo("K_init: настройка клавиатуры\n");
200   K_slow();K_init();
201   logo("T_init: настройка таймера\n");
202   T_init();
203   logo("S_init: настройка звука\n");
204   S_init();
205   logo("V_init: настройка видео\n");
206   if(V_init()!=0) ERR_failinit("Не могу установить видеорежим VGA");
207   setgamma(gamma);
208   V_setscr(scrbuf);
209   harderr_inst(harderr_handler);
210   GM_init();
211   F_loadmus("MENU");S_startmusic();
212   for(;;) {
213     timer=0;
214     G_act();
215     if(fastdraw) G_act();
216     G_draw();
217     if(fastdraw) while(timer<0x1FFFE); else while(timer<0xFFFF);
218   }