--- /dev/null
+/*\r
+Copyright (C) 1998 BJ Eirich (aka vecna)\r
+This program is free software; you can redistribute it and/or\r
+modify it under the terms of the GNU General Public License\r
+as published by the Free Software Foundation; either version 2\r
+of the License, or (at your option) any later version.\r
+This program is distributed in the hope that it will be useful,\r
+but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
+See the GNU General Public Lic\r
+See the GNU General Public License for more details.\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
+*/\r
+\r
+#include <stdarg.h> // va_*\r
+\r
+#include "verge.h"\r
+\r
+// ================================= Data ====================================\r
+\r
+// declared in VDRIVER.C\r
+extern byte* translucency_table;\r
+\r
+char *strbuf=0; // Universal temporary string buffer. :)\r
+char joyflag=0;\r
+int vidxres=0,vidyres=0; // Joystick on/off | Video mode to use\r
+char logoutput=0; // Verbose debugging startup mode\r
+char nocdaudio=0; // do not use CD audio\r
+char startmap[80]; // startup map\r
+FILE *logf=0; // logfile file handle\r
+\r
+// ================================= Code ====================================\r
+\r
+void InitializeDefaults()\r
+{\r
+ kb1=28; kb2=56; kb3=1; kb4=57; // default keyboard controls\r
+ jb1=1; jb2=2; jb3=3; jb4=4; // default joystick controls\r
+ joyflag=0; // joystick defaults to disabled\r
+ vidxres=320; vidyres=200;\r
+ logoutput=0; // Don't be annoyingly verbose\r
+ strbuf=(char *) valloc(2000, "strbuf", OID_TEMP);\r
+ memcpy(startmap,"test.map\0",9);\r
+\r
+ md_mixfreq=44100;\r
+ md_dmabufsize=2000;\r
+ md_mode=DMODE_16BITS|DMODE_STEREO;\r
+ md_device=0;\r
+}\r
+\r
+static VFILE *user_cfg_file=0;\r
+static char parse_str[256];\r
+\r
+static char *parse_cfg_token()\r
+{\r
+ vscanf(user_cfg_file, "%s", parse_str);\r
+ return parse_str;\r
+}\r
+\r
+// compares string against parse_str (grabbed by parse_cfg_token)\r
+// 0=mismatch, 1=match\r
+static int parse_match(char *str)\r
+{\r
+ return !strcmp(parse_str, str);\r
+}\r
+\r
+void ParseStartupFiles()\r
+{\r
+ user_cfg_file = vopen("user.cfg");\r
+ if (!user_cfg_file)\r
+ {\r
+ printf("Could not open user.cfg. \n");\r
+ exit(-1);\r
+ }\r
+\r
+ while (1)\r
+ {\r
+ parse_cfg_token();\r
+\r
+ // mounts a pack file; up to 3? (perhaps gaurd against more?)\r
+ if (parse_match("mount"))\r
+ { MountVFile(parse_cfg_token()); continue; }\r
+ // set video resolution\r
+ else if (parse_match("vidmode"))\r
+ {\r
+ vidxres = atoi(parse_cfg_token());\r
+ vidyres = atoi(parse_cfg_token());\r
+\r
+ // check validity\r
+ if (vidxres != 256 && vidxres != 320\r
+ && vidxres != 360 && vidxres != 640)\r
+ {\r
+ Log("user.cfg: invalid resolution width %i passed to vidmode",\r
+ vidxres);\r
+ }\r
+ if (vidyres != 200 && vidyres != 240\r
+ && vidyres != 256 && vidyres != 480)\r
+ {\r
+ Log("user.cfg: invalid resolution height %i passed to vidmode",\r
+ vidyres);\r
+ }\r
+\r
+ continue;\r
+ }\r
+ // log to VERGE.LOG\r
+ else if (parse_match("log"))\r
+ {\r
+ logoutput=1;\r
+ continue;\r
+ }\r
+ // disable CD playing\r
+ else if (parse_match("nocdaudio"))\r
+ {\r
+ nocdaudio=1;\r
+ continue;\r
+ }\r
+ // map VERGE.EXE will run first when executed\r
+ else if (parse_match("startmap"))\r
+ {\r
+ strcpy(startmap, parse_cfg_token());\r
+ continue;\r
+ }\r
+ // 0=auto detect, 1=???, 2=???, 3=nosound\r
+ else if (parse_match("sound_device"))\r
+ {\r
+ md_device = atoi(parse_cfg_token());\r
+ continue;\r
+ }\r
+ // sound lib setting\r
+ else if (parse_match("mixrate"))\r
+ {\r
+ md_mixfreq = atoi(parse_cfg_token());\r
+ continue;\r
+ }\r
+ // sound lib setting\r
+ else if (parse_match("dmabufsize"))\r
+ {\r
+ md_dmabufsize = atoi(parse_cfg_token());\r
+ continue;\r
+ }\r
+ // sound lib setting\r
+ else if (parse_match("force8bit"))\r
+ {\r
+ continue;\r
+ }\r
+ // sound lib setting\r
+ else if (parse_match("forcemono"))\r
+ {\r
+ continue;\r
+ }\r
+\r
+ // unknown command, assume end\r
+ break;\r
+ }\r
+\r
+ // done parsing config\r
+ vclose(user_cfg_file);\r
+}\r
+\r
+void ParseAutoCFG()\r
+{ VFILE *f;\r
+ int i;\r
+\r
+ if (!(f=vopen("auto.cfg"))) return;\r
+\r
+ while (1)\r
+ {\r
+ vgets((char *) cmd, 40, f);\r
+ for (i=0; i<(signed) strlen((char *) cmd); i++)\r
+ if (cmd[i]==10 || cmd[i]==13) cmd[i]=0;\r
+ if (strlen((char*) cmd)<2) break;\r
+ ProcessCommand();\r
+ }\r
+ vclose(f);\r
+}\r
+\r
+void InitLog()\r
+{\r
+ if (logoutput)\r
+ {\r
+ remove("verge.log");\r
+ }\r
+}\r
+\r
+void Log(char *message, ...)\r
+{\r
+ char tempbuf[256];\r
+ va_list lst;\r
+\r
+ if (!logoutput) return;\r
+\r
+ va_start(lst, message);\r
+ vsprintf(tempbuf, message, lst);\r
+ va_end(lst);\r
+\r
+ logf = fopen("verge.log", "aw");\r
+ if (!logf) err("unable to log to verge.log");\r
+\r
+ fprintf(logf, "%s \n", tempbuf);\r
+ fflush(logf);\r
+\r
+ fclose(logf);\r
+}\r
+\r
+// used in conjunction with LogDone()\r
+void Logp(char *message, ...)\r
+{\r
+ char tempbuf[256];\r
+ va_list lst;\r
+\r
+ if (!logoutput) return;\r
+\r
+ va_start(lst, message);\r
+ vsprintf(tempbuf, message, lst);\r
+ va_end(lst);\r
+\r
+ logf = fopen("verge.log", "aw");\r
+ if (!logf) err("unable to log to verge.log");\r
+\r
+ fprintf(logf, "%s", tempbuf);\r
+ fflush(logf);\r
+\r
+ fclose(logf);\r
+}\r
+\r
+void LogDone()\r
+{\r
+ if (!logoutput) return;\r
+\r
+ logf = fopen("verge.log", "aw");\r
+ if (!logf) err("unable to log to verge.log");\r
+\r
+ fprintf(logf, "... OK \n");\r
+ fflush(logf);\r
+\r
+ fclose(logf);\r
+}\r
+\r
+void InitSystems()\r
+{\r
+ InitLog();\r
+ Log("V2 startup. Logfile initialized.");\r
+ Logp("Sys: Initializing keyboard handler.");\r
+ InitKeyboard();\r
+ LogDone();\r
+#ifdef __DJGPP__\r
+ keyboard_chain(0);\r
+#endif\r
+ Logp("Sys: Initializing timer. Set 100hz.");\r
+ InitTimer();\r
+ LogDone();\r
+\r
+ /*\r
+ Logp("Sys: Initializing CD Audio.");\r
+ CD_Init();\r
+ LogDone();\r
+ */\r
+\r
+ Logp("Sys: Initializing music system.");\r
+ InitMusicSystem();\r
+ LogDone();\r
+\r
+ InitVideo(vidxres, vidyres);\r
+}\r
+\r
+void LoadTransTable()\r
+{\r
+ FILE *fp=0;\r
+\r
+ if (translucency_table)\r
+ { free(translucency_table); translucency_table=0; }\r
+ translucency_table=(byte *)valloc(65536, "translucency_table", OID_MISC);\r
+\r
+ fp = fopen("trans.tbl", "rb");\r
+ if (!fp) err("Could not open trans.tbl.");\r
+\r
+ fread(translucency_table, 65536, 1, fp);\r
+\r
+ fclose(fp);\r
+}\r
+\r
+void vmain(int argc, char *argv[])\r
+{\r
+ char temp[256];\r
+\r
+ InitializeDefaults();\r
+ ParseStartupFiles();\r
+ InitSystems();\r
+ if (argc==2)\r
+ {\r
+ memcpy(startmap, argv[1], strlen(argv[1]));\r
+ }\r
+\r
+ InitConsole();\r
+ sprintf(temp,"VERGE System Version %s", VERSION);\r
+ Con_Printf(temp);\r
+ Con_Printf("Copyright (C)1998 vecna");\r
+\r
+ ParseAutoCFG();\r
+ LoadTransTable();\r
+ LoadSystemVC();\r
+ LoadMAP(startmap);\r
+\r
+ while (1)\r
+ {\r
+ while (timer_count!=0)\r
+ {\r
+ timer_count--;\r
+ GameTick();\r
+ }\r
+ Render();\r
+\r
+ ShowPage();\r
+ if (kill)\r
+ {\r
+ FreeVSP();\r
+ FreeMAP();\r
+ FreeCHRList();\r
+ vcsp=vcstack;\r
+ kill=0;\r
+ LoadMAP(startmap);\r
+ }\r
+ }\r
+}\r