]> 4ch.mooo.com Git - 16.git/blob - 16/v2/source/ENGINE/VERGE.C
wwww
[16.git] / 16 / v2 / source / ENGINE / VERGE.C
1 /*\r
2 Copyright (C) 1998 BJ Eirich (aka vecna)\r
3 This program is free software; you can redistribute it and/or\r
4 modify it under the terms of the GNU General Public License\r
5 as published by the Free Software Foundation; either version 2\r
6 of the License, or (at your option) any later version.\r
7 This program is distributed in the hope that it will be useful,\r
8 but WITHOUT ANY WARRANTY; without even the implied warranty of\r
9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
10 See the GNU General Public Lic\r
11 See the GNU General Public License for more details.\r
12 You should have received a copy of the GNU General Public License\r
13 along with this program; if not, write to the Free Software\r
14 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
15 */\r
16 \r
17 #include <stdarg.h> // va_*\r
18 \r
19 #include "verge.h"\r
20 \r
21 // ================================= Data ====================================\r
22 \r
23 // declared in VDRIVER.C\r
24 extern byte* translucency_table;\r
25 \r
26 char *strbuf=0;                       // Universal temporary string buffer. :)\r
27 char joyflag=0;\r
28 int vidxres=0,vidyres=0;              // Joystick on/off | Video mode to use\r
29 char logoutput=0;                     // Verbose debugging startup mode\r
30 char nocdaudio=0;                     // do not use CD audio\r
31 char startmap[80];                    // startup map\r
32 FILE *logf=0;                         // logfile file handle\r
33 \r
34 // ================================= Code ====================================\r
35 \r
36 void InitializeDefaults()\r
37 {\r
38   kb1=28;  kb2=56;  kb3=1;  kb4=57;    // default keyboard controls\r
39   jb1=1;   jb2=2;   jb3=3;  jb4=4;     // default joystick controls\r
40   joyflag=0;                           // joystick defaults to disabled\r
41   vidxres=320; vidyres=200;\r
42   logoutput=0;                         // Don't be annoyingly verbose\r
43   strbuf=(char *) valloc(2000, "strbuf", OID_TEMP);\r
44   memcpy(startmap,"test.map\0",9);\r
45 \r
46   md_mixfreq=44100;\r
47   md_dmabufsize=2000;\r
48   md_mode=DMODE_16BITS|DMODE_STEREO;\r
49   md_device=0;\r
50 }\r
51 \r
52 static VFILE *user_cfg_file=0;\r
53 static char parse_str[256];\r
54 \r
55 static char *parse_cfg_token()\r
56 {\r
57   vscanf(user_cfg_file, "%s", parse_str);\r
58   return parse_str;\r
59 }\r
60 \r
61 // compares string against parse_str (grabbed by parse_cfg_token)\r
62 // 0=mismatch, 1=match\r
63 static int parse_match(char *str)\r
64 {\r
65   return !strcmp(parse_str, str);\r
66 }\r
67 \r
68 void ParseStartupFiles()\r
69 {\r
70   user_cfg_file = vopen("user.cfg");\r
71   if (!user_cfg_file)\r
72   {\r
73     printf("Could not open user.cfg. \n");\r
74     exit(-1);\r
75   }\r
76 \r
77   while (1)\r
78   {\r
79     parse_cfg_token();\r
80 \r
81     // mounts a pack file; up to 3? (perhaps gaurd against more?)\r
82     if (parse_match("mount"))\r
83       { MountVFile(parse_cfg_token()); continue; }\r
84     // set video resolution\r
85     else if (parse_match("vidmode"))\r
86     {\r
87       vidxres = atoi(parse_cfg_token());\r
88       vidyres = atoi(parse_cfg_token());\r
89 \r
90       // check validity\r
91       if (vidxres != 256 && vidxres != 320\r
92       &&  vidxres != 360 && vidxres != 640)\r
93       {\r
94         Log("user.cfg: invalid resolution width %i passed to vidmode",\r
95           vidxres);\r
96       }\r
97       if (vidyres != 200 && vidyres != 240\r
98       &&  vidyres != 256 && vidyres != 480)\r
99       {\r
100         Log("user.cfg: invalid resolution height %i passed to vidmode",\r
101           vidyres);\r
102       }\r
103 \r
104       continue;\r
105     }\r
106     // log to VERGE.LOG\r
107     else if (parse_match("log"))\r
108     {\r
109       logoutput=1;\r
110       continue;\r
111     }\r
112     // disable CD playing\r
113     else if (parse_match("nocdaudio"))\r
114     {\r
115       nocdaudio=1;\r
116       continue;\r
117     }\r
118     // map VERGE.EXE will run first when executed\r
119     else if (parse_match("startmap"))\r
120     {\r
121       strcpy(startmap, parse_cfg_token());\r
122       continue;\r
123     }\r
124     // 0=auto detect, 1=???, 2=???, 3=nosound\r
125     else if (parse_match("sound_device"))\r
126     {\r
127       md_device = atoi(parse_cfg_token());\r
128       continue;\r
129     }\r
130     // sound lib setting\r
131     else if (parse_match("mixrate"))\r
132     {\r
133       md_mixfreq = atoi(parse_cfg_token());\r
134       continue;\r
135     }\r
136     // sound lib setting\r
137     else if (parse_match("dmabufsize"))\r
138     {\r
139       md_dmabufsize = atoi(parse_cfg_token());\r
140       continue;\r
141     }\r
142     // sound lib setting\r
143     else if (parse_match("force8bit"))\r
144     {\r
145       continue;\r
146     }\r
147     // sound lib setting\r
148     else if (parse_match("forcemono"))\r
149     {\r
150       continue;\r
151     }\r
152 \r
153     // unknown command, assume end\r
154     break;\r
155   }\r
156 \r
157   // done parsing config\r
158   vclose(user_cfg_file);\r
159 }\r
160 \r
161 void ParseAutoCFG()\r
162 { VFILE *f;\r
163   int i;\r
164 \r
165   if (!(f=vopen("auto.cfg"))) return;\r
166 \r
167   while (1)\r
168   {\r
169     vgets((char *) cmd, 40, f);\r
170     for (i=0; i<(signed) strlen((char *) cmd); i++)\r
171       if (cmd[i]==10 || cmd[i]==13) cmd[i]=0;\r
172     if (strlen((char*) cmd)<2) break;\r
173     ProcessCommand();\r
174   }\r
175   vclose(f);\r
176 }\r
177 \r
178 void InitLog()\r
179 {\r
180   if (logoutput)\r
181   {\r
182     remove("verge.log");\r
183   }\r
184 }\r
185 \r
186 void Log(char *message, ...)\r
187 {\r
188   char tempbuf[256];\r
189   va_list lst;\r
190 \r
191   if (!logoutput) return;\r
192 \r
193   va_start(lst, message);\r
194   vsprintf(tempbuf, message, lst);\r
195   va_end(lst);\r
196 \r
197   logf = fopen("verge.log", "aw");\r
198   if (!logf) err("unable to log to verge.log");\r
199 \r
200   fprintf(logf, "%s \n", tempbuf);\r
201   fflush(logf);\r
202 \r
203   fclose(logf);\r
204 }\r
205 \r
206 // used in conjunction with LogDone()\r
207 void Logp(char *message, ...)\r
208 {\r
209   char tempbuf[256];\r
210   va_list lst;\r
211 \r
212   if (!logoutput) return;\r
213 \r
214   va_start(lst, message);\r
215   vsprintf(tempbuf, message, lst);\r
216   va_end(lst);\r
217 \r
218   logf = fopen("verge.log", "aw");\r
219   if (!logf) err("unable to log to verge.log");\r
220 \r
221   fprintf(logf, "%s", tempbuf);\r
222   fflush(logf);\r
223 \r
224   fclose(logf);\r
225 }\r
226 \r
227 void LogDone()\r
228 {\r
229   if (!logoutput) return;\r
230 \r
231   logf = fopen("verge.log", "aw");\r
232   if (!logf) err("unable to log to verge.log");\r
233 \r
234   fprintf(logf, "... OK \n");\r
235   fflush(logf);\r
236 \r
237   fclose(logf);\r
238 }\r
239 \r
240 void InitSystems()\r
241 {\r
242   InitLog();\r
243   Log("V2 startup. Logfile initialized.");\r
244   Logp("Sys: Initializing keyboard handler.");\r
245   InitKeyboard();\r
246   LogDone();\r
247 #ifdef __DJGPP__\r
248   keyboard_chain(0);\r
249 #endif\r
250   Logp("Sys: Initializing timer. Set 100hz.");\r
251   InitTimer();\r
252   LogDone();\r
253 \r
254   /*\r
255   Logp("Sys: Initializing CD Audio.");\r
256   CD_Init();\r
257   LogDone();\r
258   */\r
259 \r
260   Logp("Sys: Initializing music system.");\r
261   InitMusicSystem();\r
262   LogDone();\r
263 \r
264   InitVideo(vidxres, vidyres);\r
265 }\r
266 \r
267 void LoadTransTable()\r
268 {\r
269   FILE *fp=0;\r
270 \r
271   if (translucency_table)\r
272     { free(translucency_table); translucency_table=0; }\r
273   translucency_table=(byte *)valloc(65536, "translucency_table", OID_MISC);\r
274 \r
275   fp = fopen("trans.tbl", "rb");\r
276   if (!fp) err("Could not open trans.tbl.");\r
277 \r
278   fread(translucency_table, 65536, 1, fp);\r
279 \r
280   fclose(fp);\r
281 }\r
282 \r
283 void vmain(int argc, char *argv[])\r
284 {\r
285   char temp[256];\r
286 \r
287   InitializeDefaults();\r
288   ParseStartupFiles();\r
289   InitSystems();\r
290   if (argc==2)\r
291   {\r
292     memcpy(startmap, argv[1], strlen(argv[1]));\r
293   }\r
294 \r
295   InitConsole();\r
296   sprintf(temp,"VERGE System Version %s", VERSION);\r
297   Con_Printf(temp);\r
298   Con_Printf("Copyright (C)1998 vecna");\r
299 \r
300   ParseAutoCFG();\r
301   LoadTransTable();\r
302   LoadSystemVC();\r
303   LoadMAP(startmap);\r
304 \r
305   while (1)\r
306   {\r
307     while (timer_count!=0)\r
308     {\r
309        timer_count--;\r
310        GameTick();\r
311     }\r
312     Render();\r
313 \r
314     ShowPage();\r
315     if (kill)\r
316     {\r
317       FreeVSP();\r
318       FreeMAP();\r
319       FreeCHRList();\r
320       vcsp=vcstack;\r
321       kill=0;\r
322       LoadMAP(startmap);\r
323     }\r
324   }\r
325 }\r