static void LoadGameList(void) { struct grpfile *fg; CACHE1D_FIND_REC *srch, *sidx; int32_t i; for (i = 0; i<NUMGRPFILES; i++) { fg = (struct grpfile *)Bcalloc(1, sizeof(struct grpfile)); fg->name = Bstrdup(internalgrpfiles[i].name); fg->crcval = internalgrpfiles[i].crcval; fg->size = internalgrpfiles[i].size; fg->game = internalgrpfiles[i].game; fg->dependency = internalgrpfiles[i].dependency; if (internalgrpfiles[i].scriptname) fg->scriptname = dup_filename(internalgrpfiles[i].scriptname); if (internalgrpfiles[i].defname) fg->defname = dup_filename(internalgrpfiles[i].defname); fg->next = listgrps; listgrps = fg; } srch = klistpath("/", "*.grpinfo", CACHE1D_FIND_FILE); for (sidx = srch; sidx; sidx = sidx->next) LoadList(srch->name); klistfree(srch); }
ScriptSectionType * SCRIPT_AddSection(int32_t scripthandle, char * sectionname) { ScriptSectionType *s,*s2; if (scripthandle < 0 || scripthandle >= MAXSCRIPTFILES) return NULL; if (!sectionname) return NULL; if (!SC(scripthandle)) return NULL; s = SCRIPT_SectionExists(scripthandle, sectionname); if (s) return s; AllocSection(s); s->name = Bstrdup(sectionname); if (!SCRIPT(scripthandle,script)) { SCRIPT(scripthandle,script) = s; } else { s2 = SCRIPT(scripthandle,script); while (s2->nextsection != s2) s2=s2->nextsection; s2->nextsection = s; s->prevsection = s2; } return s; }
char *Bgetappdir(void) { char *dir = NULL; #ifdef _WIN32 TCHAR appdir[MAX_PATH]; if (GetModuleFileName(NULL, appdir, MAX_PATH) > 0) { // trim off the filename char *slash = Bstrrchr(appdir, '\\'); if (slash) slash[0] = 0; dir = Bstrdup(appdir); } #elif defined EDUKE32_OSX dir = osx_getappdir(); #elif defined __FreeBSD__ // the sysctl should also work when /proc/ is not mounted (which seems to // be common on FreeBSD), so use it.. char buf[PATH_MAX] = {0}; int name[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1}; size_t len = sizeof(buf)-1; int ret = sysctl(name, sizeof(name)/sizeof(name[0]), buf, &len, NULL, 0); if(ret == 0 && buf[0] != '\0') { // again, remove executable name with dirname() // on FreeBSD dirname() seems to use some internal buffer dir = strdup(dirname(buf)); } #elif defined __linux || defined EDUKE32_BSD char buf[PATH_MAX] = {0}; char buf2[PATH_MAX] = {0}; # ifdef __linux Bsnprintf(buf, sizeof(buf), "/proc/%d/exe", getpid()); # else // the BSDs.. except for FreeBSD which has a sysctl Bsnprintf(buf, sizeof(buf), "/proc/%d/file", getpid()); # endif int len = readlink(buf, buf2, sizeof(buf2)); if (len != -1) { // remove executable name with dirname(3) // on Linux, dirname() will modify buf2 (cutting off executable name) and return it // on FreeBSD it seems to use some internal buffer instead.. anyway, just strdup() dir = Bstrdup(dirname(buf2)); } #endif return dir; }
static int osdcmd_glinfo(const osdfuncparm_t *parm) { char *s,*t,*u,i; if (bpp == 8) { OSD_Printf("glinfo: Not in OpenGL mode.\n"); return OSDCMD_OK; } OSD_Printf("OpenGL Information:\n" " Version: %s\n" " Vendor: %s\n" " Renderer: %s\n" " Maximum anisotropy: %.1f%s\n" " BGRA textures: %s\n" " Non-x^2 textures: %s\n" " Texure compression: %s\n" " Clamp-to-edge: %s\n" " Multisampling: %s\n" " Nvidia multisample hint: %s\n" " Multitexturing: %s\n" " Env combine extension: %s\n" " Extensions:\n", glinfo.version, glinfo.vendor, glinfo.renderer, glinfo.maxanisotropy, glinfo.maxanisotropy>1.0?"":" (no anisotropic filtering)", glinfo.bgra ? "supported": "not supported", glinfo.texnpot ? "supported": "not supported", glinfo.texcompr ? "supported": "not supported", glinfo.clamptoedge ? "supported": "not supported", glinfo.multisample ? "supported": "not supported", glinfo.nvmultisamplehint ? "supported": "not supported", glinfo.multitex ? "supported": "not supported", glinfo.envcombine ? "supported": "not supported" ); s = Bstrdup(glinfo.extensions); if (!s) OSD_Printf(glinfo.extensions); else { i = 0; t = u = s; while (*t) { if (*t == ' ') { if (i&1) { *t = 0; OSD_Printf(" %s\n",u); u = t+1; } i++; } t++; } if (i&1) OSD_Printf(" %s\n",u); Bfree(s); } return OSDCMD_OK; }
char *Bgethomedir(void) { #ifdef _WIN32 aSHGetSpecialFolderPathAtype aSHGetSpecialFolderPathA; TCHAR appdata[MAX_PATH]; int32_t loaded = 0; HMODULE hShell32 = GetModuleHandle("shell32.dll"); if (hShell32 == NULL) { hShell32 = LoadLibrary("shell32.dll"); loaded = 1; } if (hShell32 == NULL) return NULL; aSHGetSpecialFolderPathA = (aSHGetSpecialFolderPathAtype)GetProcAddress(hShell32, "SHGetSpecialFolderPathA"); if (aSHGetSpecialFolderPathA != NULL) if (SUCCEEDED(aSHGetSpecialFolderPathA(NULL, appdata, CSIDL_APPDATA, FALSE))) { if (loaded) FreeLibrary(hShell32); return Bstrdup(appdata); } if (loaded) FreeLibrary(hShell32); return NULL; #elif defined EDUKE32_OSX return osx_gethomedir(); #elif defined(GEKKO) // return current drive's name char *drv, cwd[BMAX_PATH] = {0}; getcwd(cwd, BMAX_PATH); drv = strchr(cwd, ':'); if (drv) drv[1] = '\0'; return Bstrdup(cwd); #else char *e = getenv("HOME"); if (!e) return NULL; return Bstrdup(e); #endif }
void SCRIPT_AddEntry(int32_t scripthandle, char * sectionname, char * entryname, char * entryvalue) { ScriptSectionType *s; ScriptEntryType *e,*e2; if (scripthandle < 0 || scripthandle >= MAXSCRIPTFILES) return; if (!sectionname || !entryname || !entryvalue) return; if (!SC(scripthandle)) return; // s = SCRIPT_SectionExists(scripthandle, sectionname); // if (!s) { s = SCRIPT_AddSection(scripthandle, sectionname); if (!s) return; // } e = SCRIPT_EntryExists(s, entryname); if (!e) { AllocEntry(e); e->name = Bstrdup(entryname); if (!s->entries) { s->entries = e; } else { e2 = s->entries; while (e2->nextentry != e2) e2=e2->nextentry; e2->nextentry = e; e->preventry = e2; } } if (e->value) Bfree(e->value); e->value = Bstrdup(entryvalue); }
int32_t Bcorrectfilename(char *filename, int32_t removefn) { char *fn; char *tokarr[64], *first, *next = NULL, *token; int32_t i, ntok = 0, leadslash = 0, trailslash = 0; fn = Bstrdup(filename); if (!fn) return -1; for (first=fn; *first; first++) { #ifdef _WIN32 if (*first == '\\') *first = '/'; #endif } leadslash = (*fn == '/'); trailslash = (first>fn && first[-1] == '/'); first = fn; do { token = Bstrtoken(first, "/", &next, 1); first = NULL; if (!token) break; else if (token[0] == 0) continue; else if (token[0] == '.' && token[1] == 0) continue; else if (token[0] == '.' && token[1] == '.' && token[2] == 0) ntok = max(0,ntok-1); else tokarr[ntok++] = token; } while (1); if (!trailslash && removefn) { ntok = max(0,ntok-1); trailslash = 1; } if (ntok == 0 && trailslash && leadslash) trailslash = 0; first = filename; if (leadslash) *(first++) = '/'; for (i=0; i<ntok; i++) { if (i>0) *(first++) = '/'; for (token=tokarr[i]; *token; token++) *(first++) = *token; } if (trailslash) *(first++) = '/'; *(first++) = 0; Bfree(fn); return 0; }
int OSD_Dispatch(const char *cmd) { char *workbuf, *wp, *wtp, *state; char *parms[MAXPARMS]; int numparms, restart = 0; osdfuncparm_t ofp; symbol_t *symb; //int i; workbuf = state = Bstrdup(cmd); if (!workbuf) return -1; do { numparms = 0; Bmemset(parms, 0, sizeof(parms)); wp = strtoken(state, &wtp, &restart); if (!wp) { state = wtp; continue; } symb = findexactsymbol(wp); if (!symb) { OSD_Printf("Error: \"%s\" is not defined\n", wp); free(workbuf); return -1; } ofp.name = wp; while (wtp && !restart) { wp = strtoken(NULL, &wtp, &restart); if (wp && numparms < MAXPARMS) parms[numparms++] = wp; } ofp.numparms = numparms; ofp.parms = (const char **)parms; ofp.raw = cmd; switch (symb->func(&ofp)) { case OSDCMD_OK: break; case OSDCMD_SHOWHELP: OSD_Printf("%s\n", symb->help); break; } state = wtp; } while (wtp && restart); free(workbuf); return 0; }
int32_t osdcmd_glinfo(const osdfuncparm_t *parm) { char *s,*t,*u,i; UNREFERENCED_PARAMETER(parm); if (bpp == 8) { initprintf("glinfo: Not in OpenGL mode.\n"); return OSDCMD_OK; } initprintf("OpenGL Information:\n" " Version: %s\n" " Vendor: %s\n" " Renderer: %s\n", glinfo.version, glinfo.vendor, glinfo.renderer); if (!glinfo.dumped) return OSDCMD_OK; initprintf(" Maximum anisotropy: %.1f%s\n" " BGRA textures: %s\n" " Non-power-of-2 textures: %s\n" " Texure compression: %s\n" " Clamp-to-edge: %s\n" " Multisampling: %s\n" " Nvidia multisample hint: %s\n" " ARBfp fragment programs: %s\n" " Depth textures: %s\n" " Shadow textures: %s\n" " Frame Buffer Objects: %s\n" " Rectangle textures: %s\n" " Multitexturing: %s\n" " env_combine: %s\n" " Vertex Buffer Objects: %s\n" " Shader Model 4: %s\n" " Occlusion queries: %s\n" " GLSL: %s\n" " Extensions:\n", glinfo.maxanisotropy, glinfo.maxanisotropy>1.0?"":" (no anisotropic filtering)", glinfo.bgra ? "supported": "not supported", glinfo.texnpot ? "supported": "not supported", glinfo.texcompr ? "supported": "not supported", glinfo.clamptoedge ? "supported": "not supported", glinfo.multisample ? "supported": "not supported", glinfo.nvmultisamplehint ? "supported": "not supported", glinfo.arbfp ? "supported": "not supported", glinfo.depthtex ? "supported": "not supported", glinfo.shadow ? "supported": "not supported", glinfo.fbos ? "supported": "not supported", glinfo.rect ? "supported": "not supported", glinfo.multitex ? "supported": "not supported", glinfo.envcombine ? "supported": "not supported", glinfo.vbos ? "supported": "not supported", glinfo.sm4 ? "supported": "not supported", glinfo.occlusionqueries ? "supported": "not supported", glinfo.glsl ? "supported": "not supported" ); s = Bstrdup(glinfo.extensions); if (!s) initprintf(glinfo.extensions); else { i = 0; t = u = s; while (*t) { if (*t == ' ') { if (i&1) { *t = 0; initprintf(" %s\n",u); u = t+1; } i++; } t++; } if (i&1) initprintf(" %s\n",u); Bfree(s); } return OSDCMD_OK; }
SWBOOL PlaySong(char *song_file_name, int cdaudio_track, SWBOOL loop, SWBOOL restart) { if (!gs.MusicOn) { return FALSE; } if (DemoMode) return FALSE; if (!restart) { if (SongType == SongTypeWave) { if (SongTrack > 0 && SongTrack == cdaudio_track) { // ogg replacement for a CD track return TRUE; } else if (SongName && song_file_name && !strcmp(SongName, song_file_name)) { return TRUE; } } else if (SongType == SongTypeMIDI) { if (SongName && song_file_name && !strcmp(SongName, song_file_name)) { return TRUE; } } } StopSong(); if (!SW_SHAREWARE) { if (cdaudio_track >= 0) { char waveformtrack[MAXWAVEFORMTRACKLENGTH]; Bstrncpy(waveformtrack, gs.WaveformTrackName, MAXWAVEFORMTRACKLENGTH - 1); char *numPos = Bstrstr(waveformtrack, "??"); if (numPos && (numPos-waveformtrack) < MAXWAVEFORMTRACKLENGTH - 2) { static const char *tracktypes[] = { ".flac", ".ogg" }; const size_t tracknamebaselen = Bstrlen(waveformtrack); size_t i; numPos[0] = '0' + (cdaudio_track / 10) % 10; numPos[1] = '0' + cdaudio_track % 10; for (i = 0; i < ARRAY_SIZE(tracktypes); ++i) { waveformtrack[tracknamebaselen] = '\0'; Bstrncat(waveformtrack, tracktypes[i], MAXWAVEFORMTRACKLENGTH); if (LoadSong(waveformtrack)) { SongVoice = FX_PlayLoopedAuto(SongPtr, SongLength, 0, 0, 0, 255, 255, 255, FX_MUSIC_PRIORITY, MUSIC_ID); if (SongVoice > FX_Ok) { SongType = SongTypeWave; SongTrack = cdaudio_track; SongName = Bstrdup(waveformtrack); return TRUE; } } } buildprintf("Can't find CD track %i!\n", cdaudio_track); } else { buildprintf("Make sure to have \"??\" as a placeholder for the track number in your WaveformTrackName!\n"); buildprintf(" e.g. WaveformTrackName = \"MUSIC/Track??\"\n"); } } } if (!song_file_name || !LoadSong(song_file_name)) { return FALSE; } if (!memcmp(SongPtr, "MThd", 4)) { MUSIC_PlaySong(SongPtr, /*SongLength,*/ MUSIC_LoopSong); SongType = SongTypeMIDI; SongName = strdup(song_file_name); return TRUE; } else { SongVoice = FX_PlayLoopedAuto(SongPtr, SongLength, 0, 0, 0, 255, 255, 255, FX_MUSIC_PRIORITY, MUSIC_ID); if (SongVoice > FX_Ok) { SongType = SongTypeWave; SongName = strdup(song_file_name); return TRUE; } } return FALSE; }
void BuildEngineApp::Startup() { _buildargc = 0; // carve up the command line into more recognizable pieces argvbuf = Bstrdup(GetCommandLineA()); _buildargc = 0; if (argvbuf) { char quoted = 0, instring = 0, swallownext = 0; char *p, *wp; int32_t i; for (p = wp = argvbuf; *p; p++) { if (*p == ' ') { if (instring && !quoted) { // end of a string *(wp++) = 0; instring = 0; } else if (instring) { *(wp++) = *p; } } else if (*p == '"' && !swallownext) { if (instring && quoted) { // end of a string if (p[1] == ' ') { *(wp++) = 0; instring = 0; quoted = 0; } else { quoted = 0; } } else if (instring && !quoted) { quoted = 1; } else if (!instring) { instring = 1; quoted = 1; _buildargc++; } } else if (*p == '\\' && p[1] == '"' && !swallownext) { swallownext = 1; } else { if (!instring) _buildargc++; instring = 1; *(wp++) = *p; swallownext = 0; } } *wp = 0; _buildargv = (const char **)Bmalloc(sizeof(char *)*(_buildargc + 1)); wp = argvbuf; for (i = 0; i < _buildargc; i++, wp++) { _buildargv[i] = wp; while (*wp) wp++; } _buildargv[_buildargc] = NULL; } polymerNG.Init(); numpages = 1; if (editorManager.IsEditorModeEnabled()) { editorThread = new EditorThread(_buildargc, _buildargv); } else { gameThread = new GameThread(_buildargc, _buildargv); } }
static void LoadList(const char * filename) { struct grpfile *fg; char *grpend = NULL; scriptfile *script = scriptfile_fromfile(filename); if (!script) return; scriptfile_addsymbolvalue("GAMEFLAG_DUKE", GAMEFLAG_DUKE); scriptfile_addsymbolvalue("GAMEFLAG_ADDON", GAMEFLAG_DUKE|GAMEFLAG_ADDON); scriptfile_addsymbolvalue("DUKE15_CRC", DUKE15_CRC); scriptfile_addsymbolvalue("DUKE13_CRC", DUKE13_CRC); scriptfile_addsymbolvalue("DUKEDC_CRC", DUKEDC_CRC); scriptfile_addsymbolvalue("DUKECB_CRC", DUKECB_CRC); scriptfile_addsymbolvalue("DUKENW_CRC", DUKENW_CRC); while (!scriptfile_eof(script)) { enum { T_GRPINFO, T_GAMENAME, T_CRC, T_SIZE, T_DEPCRC, T_SCRIPTNAME, T_DEFNAME, T_FLAGS, }; static const tokenlist profiletokens[] = { { "grpinfo", T_GRPINFO }, }; int32_t token = getatoken(script,profiletokens,sizeof(profiletokens)/sizeof(tokenlist)); switch (token) { case T_GRPINFO: { int32_t gsize = 0, gcrcval = 0, gflags = GAMEFLAG_DUKE, gdepcrc = DUKE15_CRC; char *gname = NULL, *gscript = NULL, *gdef = NULL; static const tokenlist grpinfotokens[] = { { "name", T_GAMENAME }, { "scriptname", T_SCRIPTNAME }, { "defname", T_DEFNAME }, { "crc", T_CRC }, { "dependency", T_DEPCRC }, { "size", T_SIZE }, { "flags", T_FLAGS }, }; if (scriptfile_getbraces(script,&grpend)) break; while (script->textptr < grpend) { int32_t token = getatoken(script,grpinfotokens,sizeof(grpinfotokens)/sizeof(tokenlist)); switch (token) { case T_GAMENAME: scriptfile_getstring(script,&gname); break; case T_SCRIPTNAME: scriptfile_getstring(script,&gscript); break; case T_DEFNAME: scriptfile_getstring(script,&gdef); break; case T_FLAGS: scriptfile_getsymbol(script,&gflags); break; case T_DEPCRC: scriptfile_getsymbol(script,&gdepcrc); break; case T_CRC: scriptfile_getsymbol(script,&gcrcval); break; case T_SIZE: scriptfile_getnumber(script,&gsize); break; default: break; } fg = (struct grpfile *)Bcalloc(1, sizeof(struct grpfile)); fg->next = listgrps; listgrps = fg; if (gname) fg->name = Bstrdup(gname); fg->size = gsize; fg->crcval = gcrcval; fg->dependency = gdepcrc; fg->game = gflags; if (gscript) fg->scriptname = dup_filename(gscript); if (gdef) fg->defname = dup_filename(gdef); } break; } default: break; } } scriptfile_close(script); scriptfile_clearsymbols(); }
int32_t ScanGroups(void) { CACHE1D_FIND_REC *srch, *sidx; struct grpcache *fg, *fgg; struct grpfile *grp; char *fn; struct Bstat st; #define BUFFER_SIZE (1024 * 1024 * 8) uint8_t *buf = (uint8_t *)Bmalloc(BUFFER_SIZE); if (!buf) { initprintf("Error allocating %d byte buffer to scan GRPs!\n", BUFFER_SIZE); return 0; } initprintf("Searching for game data...\n"); LoadGameList(); //LoadGroupsCache(); SB: disabled to match local srch = klistpath("/", "*.grp", CACHE1D_FIND_FILE); for (sidx = srch; sidx; sidx = sidx->next) { for (fg = grpcache; fg; fg = fg->next) { if (!Bstrcmp(fg->name, sidx->name)) break; } if (fg) { if (findfrompath(sidx->name, &fn)) continue; // failed to resolve the filename if (Bstat(fn, &st)) { Bfree(fn); continue; } // failed to stat the file Bfree(fn); if (fg->size == st.st_size && fg->mtime == st.st_mtime) { grp = (struct grpfile *)Bcalloc(1, sizeof(struct grpfile)); grp->name = Bstrdup(sidx->name); grp->crcval = fg->crcval; grp->size = fg->size; grp->next = foundgrps; foundgrps = grp; fgg = (struct grpcache *)Bcalloc(1, sizeof(struct grpcache)); strcpy(fgg->name, fg->name); fgg->size = fg->size; fgg->mtime = fg->mtime; fgg->crcval = fg->crcval; fgg->next = usedgrpcache; usedgrpcache = fgg; continue; } } { int32_t b, fh; int32_t crcval; fh = openfrompath(sidx->name, BO_RDONLY|BO_BINARY, BS_IREAD); if (fh < 0) continue; if (Bfstat(fh, &st)) continue; initprintf(" Checksumming %s...", sidx->name); crc32init((uint32_t *)&crcval); do { b = read(fh, buf, BUFFER_SIZE); if (b > 0) crc32block((uint32_t *)&crcval, (uint8_t *)buf, b); } while (b == BUFFER_SIZE); crc32finish((uint32_t *)&crcval); close(fh); initprintf(" Done\n"); grp = (struct grpfile *)Bcalloc(1, sizeof(struct grpfile)); grp->name = Bstrdup(sidx->name); grp->crcval = crcval; grp->size = st.st_size; grp->next = foundgrps; foundgrps = grp; fgg = (struct grpcache *)Bcalloc(1, sizeof(struct grpcache)); Bstrncpy(fgg->name, sidx->name, BMAX_PATH); fgg->size = st.st_size; fgg->mtime = st.st_mtime; fgg->crcval = crcval; fgg->next = usedgrpcache; usedgrpcache = fgg; } } klistfree(srch); FreeGroupsCache(); for (grp = foundgrps; grp; /*grp=grp->next*/) { struct grpfile *igrp; for (igrp = listgrps; igrp; igrp=igrp->next) if (grp->crcval == igrp->crcval) break; if (igrp == NULL) { grp = grp->next; continue; } if (igrp->dependency) { struct grpfile *depgrp; //initprintf("found grp with dep\n"); for (depgrp = foundgrps; depgrp; depgrp=depgrp->next) if (depgrp->crcval == igrp->dependency) break; if (depgrp == NULL || depgrp->crcval != igrp->dependency) // couldn't find dependency { //initprintf("removing %s\n", grp->name); RemoveGroup(igrp->crcval); grp = foundgrps; continue; } } if (igrp->game && !grp->game) grp->game = igrp->game; grp=grp->next; } if (usedgrpcache) { int32_t i = 0; FILE *fp; fp = fopen(GRPCACHEFILE, "wt"); if (fp) { for (fg = usedgrpcache; fg; fg=fgg) { fgg = fg->next; fprintf(fp, "\"%s\" %d %d %d\n", fg->name, fg->size, fg->mtime, fg->crcval); Bfree(fg); i++; } fclose(fp); } // initprintf("Found %d recognized GRP %s.\n",i,i>1?"files":"file"); Bfree(buf); return 0; } initprintf("Found no recognized game data!\n"); Bfree(buf); return 0; }
int32_t loadsetup(const char *fn) { BFILE *fp; #define VL 1024 char val[VL]; int32_t i; if ((fp = Bfopen(fn, "rt")) == NULL) return -1; if (readconfig(fp, "forcesetup", val, VL) > 0) { if (atoi_safe(val) != 0) forcesetup = 1; else forcesetup = 0; } if (readconfig(fp, "fullscreen", val, VL) > 0) { if (atoi_safe(val) != 0) fullscreen = 1; else fullscreen = 0; } if (readconfig(fp, "resolution", val, VL) > 0) { i = atoi_safe(val) & 0x0f; if ((unsigned)i<13) { xdimgame = xdim2d = vesares[i][0]; ydimgame = ydim2d = vesares[i][1]; } } if (readconfig(fp, "2dresolution", val, VL) > 0) { i = atoi_safe(val) & 0x0f; if ((unsigned)i<13) { xdim2d = vesares[i][0]; ydim2d = vesares[i][1]; } } if (readconfig(fp, "xdim2d", val, VL) > 0) xdim2d = atoi_safe(val); if (readconfig(fp, "ydim2d", val, VL) > 0) ydim2d = atoi_safe(val); if (readconfig(fp, "xdim3d", val, VL) > 0) xdimgame = atoi_safe(val); if (readconfig(fp, "ydim3d", val, VL) > 0) ydimgame = atoi_safe(val); // if (readconfig(fp, "samplerate", val, VL) > 0) option[7] = (atoi_safe(val) & 0x0f) << 4; // if (readconfig(fp, "music", val, VL) > 0) { if (atoi_safe(val) != 0) option[2] = 1; else option[2] = 0; } // if (readconfig(fp, "mouse", val, VL) > 0) { if (atoi_safe(val) != 0) option[3] = 1; else option[3] = 0; } if (readconfig(fp, "bpp", val, VL) > 0) bppgame = atoi_safe(val); if (readconfig(fp, "vsync", val, VL) > 0) vsync = !!atoi_safe(val); if (readconfig(fp, "editorgridextent", val, VL) > 0) { int32_t tmp = atoi_safe(val); editorgridextent = clamp(tmp, 65536, BXY_MAX); } if (readconfig(fp, "grid", val, VL) > 0) { grid = atoi_safe(val); default_grid = grid; autogrid = (grid==9); grid = clamp(grid, 0, 8); } #ifdef POLYMER if (readconfig(fp, "rendmode", val, VL) > 0) { i = atoi_safe(val); glrendmode = i; } #endif if (readconfig(fp, "vid_gamma", val, VL) > 0) vid_gamma = clampd(Bstrtod(val, NULL), 0.0, 10.0); if (readconfig(fp, "vid_brightness", val, VL) > 0) vid_brightness = clampd(Bstrtod(val, NULL), 0.0, 10.0); if (readconfig(fp, "vid_contrast", val, VL) > 0) vid_contrast = clampd(Bstrtod(val, NULL), 0.0, 10.0); #ifdef RENDERTYPEWIN if (readconfig(fp, "maxrefreshfreq", val, VL) > 0) maxrefreshfreq = atoi_safe(val); #endif #ifdef USE_OPENGL if (readconfig(fp, "usemodels", val, VL) > 0) usemodels = !!atoi_safe(val); if (readconfig(fp, "usehightile", val, VL) > 0) usehightile = !!atoi_safe(val); if (readconfig(fp, "lazytileselector", val, VL) > 0) g_lazy_tileselector = !!atoi_safe(val); glusetexcache = -1; if (readconfig(fp, "glusetexcache", val, VL) > 0) { glusetexcache = clamp(atoi_safe(val), 0, 2); } if (readconfig(fp, "glusememcache", val, VL) > 0) { glusememcache = !!atoi_safe(val); } if (readconfig(fp, "gltexfiltermode", val, VL) > 0) { gltexfiltermode = atoi_safe(val); } if (readconfig(fp, "glanisotropy", val, VL) > 0) { glanisotropy = atoi_safe(val); } if (readconfig(fp, "r_downsize", val, VL) > 0) { r_downsize = atoi_safe(val); r_downsize = clamp(r_downsize, 0, 5); r_downsizevar = r_downsize; } if (readconfig(fp, "r_texcompr", val, VL) > 0) glusetexcompr = !!atoi_safe(val); if (readconfig(fp, "r_shadescale", val, VL) > 0) shadescale = clampd(Bstrtod(val, NULL), 0.0, 10.0); if (readconfig(fp, "r_usenewshading", val, VL) > 0) r_usenewshading = clamp(atoi_safe(val), 0, 2); #endif if (readconfig(fp, "r_usenewaspect", val, VL) > 0) r_usenewaspect = !!atoi_safe(val); #ifndef RENDERTYPEWIN if (readconfig(fp, "r_screenxy", val, VL) > 0) { r_screenxy = clamp(atoi_safe(val), 0, 9999); if (r_screenxy/100==0 || r_screenxy%100==0) r_screenxy = 403; } #endif if (readconfig(fp, "gameexecutable", val, VL) > 0) Bstrcpy(game_executable, val); // option[0] = 1; // vesa all the way... // option[1] = 1; // sound all the way... // option[4] = 0; // no multiplayer // option[5] = 0; #if 1 if (readconfig(fp, "keyforward", val, VL) > 0) keys[0] = Bstrtol(val, NULL, 16); if (readconfig(fp, "keybackward", val, VL) > 0) keys[1] = Bstrtol(val, NULL, 16); if (readconfig(fp, "keyturnleft", val, VL) > 0) keys[2] = Bstrtol(val, NULL, 16); if (readconfig(fp, "keyturnright", val, VL) > 0) keys[3] = Bstrtol(val, NULL, 16); if (readconfig(fp, "keyrun", val, VL) > 0) keys[4] = Bstrtol(val, NULL, 16); if (readconfig(fp, "keystrafe", val, VL) > 0) keys[5] = Bstrtol(val, NULL, 16); if (readconfig(fp, "keyfire", val, VL) > 0) keys[6] = Bstrtol(val, NULL, 16); if (readconfig(fp, "keyuse", val, VL) > 0) keys[7] = Bstrtol(val, NULL, 16); if (readconfig(fp, "keystandhigh", val, VL) > 0) keys[8] = Bstrtol(val, NULL, 16); if (readconfig(fp, "keystandlow", val, VL) > 0) keys[9] = Bstrtol(val, NULL, 16); if (readconfig(fp, "keylookup", val, VL) > 0) keys[10] = Bstrtol(val, NULL, 16); if (readconfig(fp, "keylookdown", val, VL) > 0) keys[11] = Bstrtol(val, NULL, 16); if (readconfig(fp, "keystrafeleft", val, VL) > 0) keys[12] = Bstrtol(val, NULL, 16); if (readconfig(fp, "keystraferight", val, VL) > 0) keys[13] = Bstrtol(val, NULL, 16); if (readconfig(fp, "key2dmode", val, VL) > 0) keys[14] = Bstrtol(val, NULL, 16); if (readconfig(fp, "keyviewcycle", val, VL) > 0) keys[15] = Bstrtol(val, NULL, 16); if (readconfig(fp, "key2dzoomin", val, VL) > 0) keys[16] = Bstrtol(val, NULL, 16); if (readconfig(fp, "key2dzoomout", val, VL) > 0) keys[17] = Bstrtol(val, NULL, 16); if (readconfig(fp, "keychat", val, VL) > 0) keys[18] = Bstrtol(val, NULL, 16); #endif #ifdef RENDERTYPEWIN if (readconfig(fp, "windowpositioning", val, VL) > 0) windowpos = atoi_safe(val); windowx = -1; if (readconfig(fp, "windowposx", val, VL) > 0) windowx = atoi_safe(val); windowy = -1; if (readconfig(fp, "windowposy", val, VL) > 0) windowy = atoi_safe(val); #endif if (readconfig(fp, "keyconsole", val, VL) > 0) { keys[19] = Bstrtol(val, NULL, 16); OSD_CaptureKey(keys[19]); } if (readconfig(fp, "mousesensitivity", val, VL) > 0) msens = Bstrtod(val, NULL); if (readconfig(fp, "mousenavigation", val, VL) > 0) unrealedlook = !!atoi_safe(val); if (readconfig(fp, "mousenavigationaccel", val, VL) > 0) pk_uedaccel = atoi_safe(val); if (readconfig(fp, "quickmapcycling", val, VL) > 0) quickmapcycling = !!atoi_safe(val); if (readconfig(fp, "sideview_reversehorizrot", val, VL) > 0) sideview_reversehrot = !!atoi_safe(val); if (readconfig(fp, "revertCTRL", val, VL) > 0) revertCTRL = !!atoi_safe(val); if (readconfig(fp, "scrollamount", val, VL) > 0) scrollamount = atoi_safe(val); if (readconfig(fp, "turnaccel", val, VL) > 0) pk_turnaccel = atoi_safe(val); if (readconfig(fp, "turndecel", val, VL) > 0) pk_turndecel = atoi_safe(val); if (readconfig(fp, "autosavesec", val, VL) > 0) autosave = max(0, atoi_safe(val)); if (readconfig(fp, "autocorruptchecksec", val, VL) > 0) autocorruptcheck = max(0, atoi_safe(val)); if (readconfig(fp, "corruptcheck_noalreadyrefd", val, VL) > 0) corruptcheck_noalreadyrefd = !!atoi_safe(val); if (readconfig(fp, "fixmaponsave_sprites", val, VL) > 0) fixmaponsave_sprites = !!atoi_safe(val); if (readconfig(fp, "keeptexturestretch", val, VL) > 0) keeptexturestretch = !!atoi_safe(val); if (readconfig(fp, "showheightindicators", val, VL) > 0) showheightindicators = clamp(atoi_safe(val), 0, 2); if (readconfig(fp, "showambiencesounds", val, VL) > 0) showambiencesounds = clamp(atoi_safe(val), 0, 2); if (readconfig(fp, "autogray", val, VL) > 0) autogray = !!atoi_safe(val); // if (readconfig(fp, "showinnergray", val, VL) > 0) // showinnergray = !!atoi_safe(val); if (readconfig(fp, "graphicsmode", val, VL) > 0) graphicsmode = clamp(atoi_safe(val), 0, 2); if (readconfig(fp, "samplerate", val, VL) > 0) MixRate = clamp(atoi_safe(val), 8000, 48000); if (readconfig(fp, "ambiencetoggle", val, VL) > 0) AmbienceToggle = !!atoi_safe(val); if (readconfig(fp, "parlock", val, VL) > 0) ParentalLock = !!atoi_safe(val); if (readconfig(fp, "osdtryscript", val, VL) > 0) m32_osd_tryscript = !!atoi_safe(val); for (i=0; i<256; i++) remap[i]=i; remapinit=1; if (readconfig(fp, "remap", val, VL) > 0) { char *p=val; int32_t v1,v2; while (*p) { if (!sscanf(p,"%x",&v1))break; if ((p=strchr(p,'-'))==0)break; p++; if (!sscanf(p,"%x",&v2))break; remap[v1]=v2; initprintf("Remap %X key to %X\n",v1,v2); if ((p=strchr(p,','))==0)break; p++; } } // load m32script history for (i=0; i<SCRIPTHISTSIZ; i++) { Bsprintf(val, "hist%d", i); if (readconfig(fp, val, val, VL) <= 0) break; scripthist[i] = Bstrdup(val); } scripthistend = i; // copy script history into OSD history for (i=0; i<min(scripthistend, OSD_HISTORYDEPTH); i++) { Bstrncpyz(osdhistorybuf[i], scripthist[scripthistend-1-i], OSD_EDITLENGTH+1); osdhistorysize++; osdhistorytotal++; } scripthistend %= SCRIPTHISTSIZ; Bfclose(fp); return 0; }