static qboolean BG_SS_ParseSpeaker(int handle) { pc_token_t token; bg_speaker_t speaker; memset(&speaker, 0, sizeof(speaker)); speaker.volume = 127; speaker.range = 1250; if (!trap_PC_ReadToken(handle, &token) || Q_stricmp(token.string, "{")) { return BG_SS_ParseError(handle, "expected '{'"); } while (1) { if (!trap_PC_ReadToken(handle, &token)) { break; } if (token.string[0] == '}') { break; } if (!Q_stricmp(token.string, "noise")) { if (!PC_String_ParseNoAlloc(handle, speaker.filename, sizeof(speaker.filename))) { return BG_SS_ParseError(handle, "expected sound filename"); } } else if (!Q_stricmp(token.string, "origin")) { if (!PC_Vec_Parse(handle, &speaker.origin)) { return BG_SS_ParseError(handle, "expected origin vector"); } } else if (!Q_stricmp(token.string, "targetname")) { if (!PC_String_ParseNoAlloc(handle, speaker.targetname, sizeof(speaker.targetname))) { return BG_SS_ParseError(handle, "expected targetname string"); } else { speaker.targetnamehash = BG_StringHashValue(speaker.targetname); } } else if (!Q_stricmp(token.string, "looped")) { if (!trap_PC_ReadToken(handle, &token)) { return BG_SS_ParseError(handle, "expected loop value"); } else { if (!Q_stricmp(token.string, "no")) { speaker.loop = S_LT_NOT_LOOPED; } else if (!Q_stricmp(token.string, "on")) { speaker.loop = S_LT_LOOPED_ON; speaker.activated = qtrue; } else if (!Q_stricmp(token.string, "off")) { speaker.loop = S_LT_LOOPED_OFF; } else { return BG_SS_ParseError(handle, "unknown loop value '%s'", token.string); } } } else if (!Q_stricmp(token.string, "broadcast")) { if (!trap_PC_ReadToken(handle, &token)) { return BG_SS_ParseError(handle, "expected broadcast value"); } else { if (!Q_stricmp(token.string, "no")) { speaker.broadcast = S_BT_LOCAL; } else if (!Q_stricmp(token.string, "global")) { speaker.broadcast = S_BT_GLOBAL; } else if (!Q_stricmp(token.string, "nopvs")) { speaker.broadcast = S_BT_NOPVS; } else { return BG_SS_ParseError(handle, "unknown broadcast value '%s'", token.string); } } } else if (!Q_stricmp(token.string, "wait")) { if (!PC_Int_Parse(handle, &speaker.wait)) { return BG_SS_ParseError(handle, "expected wait value"); } else if (speaker.wait < 0) { return BG_SS_ParseError(handle, "wait value %i is invalid", speaker.wait); } } else if (!Q_stricmp(token.string, "random")) { if (!PC_Int_Parse(handle, &speaker.random)) { return BG_SS_ParseError(handle, "expected random value"); } else if (speaker.random < 0) { return BG_SS_ParseError(handle, "random value %i is invalid", speaker.random); } } else if (!Q_stricmp(token.string, "volume")) { if (!PC_Int_Parse(handle, &speaker.volume)) { return BG_SS_ParseError(handle, "expected volume value"); } else if (speaker.volume < 0 || speaker.volume > 65535) { return BG_SS_ParseError(handle, "volume value %i is invalid", speaker.volume); } } else if (!Q_stricmp(token.string, "range")) { if (!PC_Int_Parse(handle, &speaker.range)) { return BG_SS_ParseError(handle, "expected range value"); } else if (speaker.range < 0) { return BG_SS_ParseError(handle, "range value %i is invalid", speaker.range); } } else { return BG_SS_ParseError(handle, "unknown token '%s'", token.string); } } if (!BG_SS_StoreSpeaker(&speaker)) { return BG_SS_ParseError(handle, "Failed to store speaker", token.string); } return qtrue; }
qboolean G_ParseSettings(int handle, qboolean setvars, config_t *config) { pc_token_t token; char text[256]; char value[256]; if (!trap_PC_ReadToken(handle, &token) || Q_stricmp(token.string, "{")) { G_Printf("Malformed config\n"); } while (1) { if (!trap_PC_ReadToken(handle, &token)) { break; } if (token.string[0] == '}') { break; } //If we want to skip the settings if (!setvars) { continue; } if (!Q_stricmp(token.string, "set")) { if (!PC_String_ParseNoAlloc(handle, text, sizeof(text))) { return G_ConfigError(handle, "expected cvar to set"); } else { if (!PC_String_ParseNoAlloc(handle, value, sizeof(value))) { return G_ConfigError(handle, "expected cvar value"); } if (value[0] == '-') { if (!PC_String_ParseNoAlloc(handle, text, sizeof(text))) { return G_ConfigError(handle, "expected value after '-'"); } Q_strncpyz(value, va("-%s", text), sizeof(value)); } trap_Cvar_Set(text, value); G_Printf("set %s %s\n", text, value); } } else if (!Q_stricmp(token.string, "setl")) { int i = 0; qboolean overwrite = qfalse; if (!PC_String_ParseNoAlloc(handle, text, sizeof(text))) { return G_ConfigError(handle, "expected cvar to set"); } else { if (!PC_String_ParseNoAlloc(handle, value, sizeof(value))) { return G_ConfigError(handle, "expected cvar value"); } if (value[0] == '-') { if (!PC_String_ParseNoAlloc(handle, text, sizeof(text))) { return G_ConfigError(handle, "expected value after '-'"); } Q_strncpyz(value, va("-%s", text), sizeof(value)); } } for (; i < config->numSetl; i++) { if (!Q_stricmp(config->setl[i].name, text)) { overwrite = qtrue; break; } } if (overwrite) { Q_strncpyz(config->setl[i].name, text, sizeof(config->setl[0].name)); Q_strncpyz(config->setl[i].value, value, sizeof(config->setl[0].name)); } else { Q_strncpyz(config->setl[config->numSetl].name, text, sizeof(config->setl[0].name)); Q_strncpyz(config->setl[config->numSetl].value, value, sizeof(config->setl[0].name)); i = config->numSetl; config->numSetl++; } trap_Cvar_Set(config->setl[i].name, config->setl[i].value); G_Printf("setl %s %s\n", config->setl[i].name, config->setl[i].value); } else if (!Q_stricmp(token.string, "command")) { if (!trap_PC_ReadToken(handle, &token)) { return G_ConfigError(handle, "expected a command value"); } trap_SendConsoleCommand(EXEC_APPEND, va("%s\n", token.string)); } else if (!Q_stricmp(token.string, "mapscripthash")) { if (!PC_String_ParseNoAlloc(handle, config->mapscripthash, sizeof(config->mapscripthash))) { return G_ConfigError(handle, "expected mapscript hash value"); } } else { return G_ConfigError(handle, "unknown token: %s", token.string); } } return qtrue; }
qboolean BG_ParseCharacterFile(const char *filename, bg_characterDef_t *characterDef) { pc_token_t token; int handle; handle = trap_PC_LoadSource(filename); if (!handle) { return qfalse; } if (!trap_PC_ReadToken(handle, &token) || Q_stricmp(token.string, "characterDef")) { return BG_PCF_ParseError(handle, "expected 'characterDef'"); } if (!trap_PC_ReadToken(handle, &token) || Q_stricmp(token.string, "{")) { return BG_PCF_ParseError(handle, "expected '{'"); } while (1) { if (!trap_PC_ReadToken(handle, &token)) { break; } if (token.string[0] == '}') { break; } if (!Q_stricmp(token.string, "mesh")) { if (!PC_String_ParseNoAlloc(handle, characterDef->mesh, sizeof(characterDef->mesh))) { return BG_PCF_ParseError(handle, "expected mesh filename"); } } else if (!Q_stricmp(token.string, "animationGroup")) { if (!PC_String_ParseNoAlloc(handle, characterDef->animationGroup, sizeof(characterDef->animationGroup))) { return BG_PCF_ParseError(handle, "expected animationGroup filename"); } } else if (!Q_stricmp(token.string, "animationScript")) { if (!PC_String_ParseNoAlloc(handle, characterDef->animationScript, sizeof(characterDef->animationScript))) { return BG_PCF_ParseError(handle, "expected animationScript filename"); } } else if (!Q_stricmp(token.string, "skin")) { if (!PC_String_ParseNoAlloc(handle, characterDef->skin, sizeof(characterDef->skin))) { return BG_PCF_ParseError(handle, "expected skin filename"); } } else if (!Q_stricmp(token.string, "undressedCorpseModel")) { if (!PC_String_ParseNoAlloc(handle, characterDef->undressedCorpseModel, sizeof(characterDef->undressedCorpseModel))) { return BG_PCF_ParseError(handle, "expected undressedCorpseModel filename"); } } else if (!Q_stricmp(token.string, "undressedCorpseSkin")) { if (!PC_String_ParseNoAlloc(handle, characterDef->undressedCorpseSkin, sizeof(characterDef->undressedCorpseSkin))) { return BG_PCF_ParseError(handle, "expected undressedCorpseSkin filename"); } } else if (!Q_stricmp(token.string, "hudhead")) { if (!PC_String_ParseNoAlloc(handle, characterDef->hudhead, sizeof(characterDef->hudhead))) { return BG_PCF_ParseError(handle, "expected hudhead filename"); } } else if (!Q_stricmp(token.string, "hudheadskin")) { if (!PC_String_ParseNoAlloc(handle, characterDef->hudheadskin, sizeof(characterDef->hudheadskin))) { return BG_PCF_ParseError(handle, "expected hudhead filename"); } } else if (!Q_stricmp(token.string, "hudheadanims")) { if (!PC_String_ParseNoAlloc(handle, characterDef->hudheadanims, sizeof(characterDef->hudheadanims))) { return BG_PCF_ParseError(handle, "expected hudheadanims filename"); } } else { return BG_PCF_ParseError(handle, "unknown token '%s'", token.string); } } trap_PC_FreeSource(handle); return qtrue; }
void G_configLoadAndSet(const char *name) { pc_token_t token; int handle; config_t *config; qboolean parseOK = qtrue; handle = trap_PC_LoadSource(va("configs/%s.config", name)); if (!handle) { Com_Printf(S_COLOR_RED "ERROR: File not found: %s\n", name); return; } memset(&level.config, 0, sizeof(config_t)); G_wipeCvars(); config = &level.config; config->publicConfig = qfalse; while (1) { if (!trap_PC_ReadToken(handle, &token)) { break; } if (!Q_stricmp(token.string, "configname")) { if (!PC_String_ParseNoAlloc(handle, config->name, sizeof(config->name))) { G_Printf("expected config name\n"); parseOK = qfalse; break; } G_Printf("Config name is: %s\n", config->name); } else if (!Q_stricmp(token.string, "version")) { if (!PC_String_ParseNoAlloc(handle, config->version, sizeof(config->name))) { G_Printf("expected config version\n"); parseOK = qfalse; break; } } else if (!Q_stricmp(token.string, "init")) { if (!G_ParseSettings(handle, qtrue, config)) { G_Printf("Reading settings failed\n"); parseOK = qfalse; break; } } else if (!Q_stricmp(token.string, "map")) { if (!G_ParseMapSettings(handle, config)) { G_Printf("Reading map settings failed\n"); parseOK = qfalse; break; } } else if (!Q_stricmp(token.string, "signature")) { if (!PC_String_ParseNoAlloc(handle, config->signature, sizeof(config->signature))) { G_Printf("expected config signature\n"); parseOK = qfalse; break; } } else if (!Q_stricmp(token.string, "public")) { config->publicConfig = qtrue; } else { G_Printf("unknown token %s\n", token.string); parseOK = qfalse; break; } } trap_PC_FreeSource(handle); if (parseOK) { trap_SetConfigstring(CS_CONFIGNAME, config->name); if (level.config.version[0] && level.config.name[0]) { trap_SendServerCommand(-1, va("cp \"^7Config '%s^7' version '%s'^7 loaded\"", level.config.name, level.config.version)); } else if (level.config.name[0]) { trap_SendServerCommand(-1, va("cp \"^7Config '%s^7' loaded\"", level.config.name)); } } else { trap_SetConfigstring(CS_CONFIGNAME, ""); trap_SendServerCommand(-1, va("cp \"^7Config '%s^7' ^1FAILED ^7to load\"", name)); } G_UpdateCvars(); }