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