/* ================= ParseEpair ================= */ epair_t *ParseEpair( script_t *script ) { epair_t *e; token_t token; e = GetMemory( sizeof( epair_t ) ); memset( e, 0, sizeof( epair_t ) ); PS_ExpectAnyToken( script, &token ); StripDoubleQuotes( token.string ); if ( strlen( token.string ) >= MAX_KEY - 1 ) { Error( "ParseEpair: token %s too long", token.string ); } e->key = copystring( token.string ); PS_ExpectAnyToken( script, &token ); StripDoubleQuotes( token.string ); if ( strlen( token.string ) >= MAX_VALUE - 1 ) { Error( "ParseEpair: token %s too long", token.string ); } e->value = copystring( token.string ); // strip trailing spaces StripTrailing( e->key ); StripTrailing( e->value ); return e; } //end of the function ParseEpair
/* ======================================================================================================================================= ReadString ======================================================================================================================================= */ int ReadString(source_t *source, fielddef_t *fd, void *p) { token_t token; if (!PC_ExpectTokenType(source, TT_STRING, 0, &token)) { return 0; } // remove the double quotes StripDoubleQuotes(token.string); // copy the string strncpy((char *)p, token.string, MAX_STRINGFIELD - 1); // make sure the string is closed with a zero ((char *)p)[MAX_STRINGFIELD - 1] = '\0'; return 1; }
int PC_ReadTokenHandle( int handle, pc_token_t *token ) { token_t t; int ret; ret = PC_ReadToken( (source_t *)handle, &t ); token->type = t.type; token->subtype = t.subtype; token->intvalue = t.intvalue; token->floatvalue = t.floatvalue; Q_strncpyz( token->string, t.string, MAX_TOKENLENGTH ); token->line = t.line; token->linescrossed = t.linescrossed; // gamecode doesn't want the quotes on the string if ( token->type == TT_STRING ) { StripDoubleQuotes( token->string ); } return ret; }
//=========================================================================== // // Parameter: - // Returns: - // Changes Globals: - //=========================================================================== void AAS_ParseBSPEntities( void ) { script_t *script; token_t token; bsp_entity_t *ent; bsp_epair_t *epair; byte *buffer, *buftrav; int bufsize; // RF, modified this, so that it first gathers up memory requirements, then allocates a single chunk, // and places the strings all in there bspworld.ebuffer = NULL; script = LoadScriptMemory( bspworld.dentdata, bspworld.entdatasize, "entdata" ); SetScriptFlags( script, SCFL_NOSTRINGWHITESPACES | SCFL_NOSTRINGESCAPECHARS ); //SCFL_PRIMITIVE); bufsize = 0; while ( PS_ReadToken( script, &token ) ) { if ( strcmp( token.string, "{" ) ) { ScriptError( script, "invalid %s\n", token.string ); AAS_FreeBSPEntities(); FreeScript( script ); return; } //end if if ( bspworld.numentities >= MAX_BSPENTITIES ) { botimport.Print( PRT_MESSAGE, "too many entities in BSP file\n" ); break; } //end if while ( PS_ReadToken( script, &token ) ) { if ( !strcmp( token.string, "}" ) ) { break; } bufsize += sizeof( bsp_epair_t ); if ( token.type != TT_STRING ) { ScriptError( script, "invalid %s\n", token.string ); AAS_FreeBSPEntities(); FreeScript( script ); return; } //end if StripDoubleQuotes( token.string ); bufsize += strlen( token.string ) + 1; if ( !PS_ExpectTokenType( script, TT_STRING, 0, &token ) ) { AAS_FreeBSPEntities(); FreeScript( script ); return; } //end if StripDoubleQuotes( token.string ); bufsize += strlen( token.string ) + 1; } //end while if ( strcmp( token.string, "}" ) ) { ScriptError( script, "missing }\n" ); AAS_FreeBSPEntities(); FreeScript( script ); return; } //end if } //end while FreeScript( script ); buffer = (byte *)GetClearedHunkMemory( bufsize ); buftrav = buffer; bspworld.ebuffer = buffer; // RF, now parse the entities into memory // RF, NOTE: removed error checks for speed, no need to do them twice script = LoadScriptMemory( bspworld.dentdata, bspworld.entdatasize, "entdata" ); SetScriptFlags( script, SCFL_NOSTRINGWHITESPACES | SCFL_NOSTRINGESCAPECHARS ); //SCFL_PRIMITIVE); bspworld.numentities = 1; while ( PS_ReadToken( script, &token ) ) { ent = &bspworld.entities[bspworld.numentities]; bspworld.numentities++; ent->epairs = NULL; while ( PS_ReadToken( script, &token ) ) { if ( !strcmp( token.string, "}" ) ) { break; } epair = (bsp_epair_t *) buftrav; buftrav += sizeof( bsp_epair_t ); epair->next = ent->epairs; ent->epairs = epair; StripDoubleQuotes( token.string ); epair->key = (char *) buftrav; buftrav += ( strlen( token.string ) + 1 ); strcpy( epair->key, token.string ); if ( !PS_ExpectTokenType( script, TT_STRING, 0, &token ) ) { AAS_FreeBSPEntities(); FreeScript( script ); return; } //end if StripDoubleQuotes( token.string ); epair->value = (char *) buftrav; buftrav += ( strlen( token.string ) + 1 ); strcpy( epair->value, token.string ); } //end while } //end while FreeScript( script ); } //end of the function AAS_ParseBSPEntities
//=========================================================================== // // Parameter: - // Returns: - // Changes Globals: - //=========================================================================== weightconfig_t *ReadWeightConfig( char *filename ) { int newindent, avail = 0, n; token_t token; source_t *source; fuzzyseperator_t *fs; weightconfig_t *config = NULL; #ifdef DEBUG int starttime; starttime = Sys_MilliSeconds(); #endif //DEBUG if ( !LibVarGetValue( "bot_reloadcharacters" ) ) { avail = -1; for ( n = 0; n < MAX_WEIGHT_FILES; n++ ) { config = weightFileList[n]; if ( !config ) { if ( avail == -1 ) { avail = n; } //end if continue; } //end if if ( strcmp( filename, config->filename ) == 0 ) { //botimport.Print( PRT_MESSAGE, "retained %s\n", filename ); return config; } //end if } //end for if ( avail == -1 ) { botimport.Print( PRT_ERROR, "weightFileList was full trying to load %s\n", filename ); return NULL; } //end if } //end if source = LoadSourceFile( filename ); if ( !source ) { botimport.Print( PRT_ERROR, "counldn't load %s\n", filename ); return NULL; } //end if // config = (weightconfig_t *) GetClearedMemory( sizeof( weightconfig_t ) ); config->numweights = 0; Q_strncpyz( config->filename, filename, sizeof( config->filename ) ); //parse the item config file while ( PC_ReadToken( source, &token ) ) { if ( !strcmp( token.string, "weight" ) ) { if ( config->numweights >= MAX_WEIGHTS ) { SourceWarning( source, "too many fuzzy weights" ); break; } //end if if ( !PC_ExpectTokenType( source, TT_STRING, 0, &token ) ) { FreeWeightConfig( config ); FreeSource( source ); return NULL; } //end if StripDoubleQuotes( token.string ); config->weights[config->numweights].name = (char *) GetClearedMemory( strlen( token.string ) + 1 ); strcpy( config->weights[config->numweights].name, token.string ); if ( !PC_ExpectAnyToken( source, &token ) ) { FreeWeightConfig( config ); FreeSource( source ); return NULL; } //end if newindent = qfalse; if ( !strcmp( token.string, "{" ) ) { newindent = qtrue; if ( !PC_ExpectAnyToken( source, &token ) ) { FreeWeightConfig( config ); FreeSource( source ); return NULL; } //end if } //end if if ( !strcmp( token.string, "switch" ) ) { fs = ReadFuzzySeperators_r( source ); if ( !fs ) { FreeWeightConfig( config ); FreeSource( source ); return NULL; } //end if config->weights[config->numweights].firstseperator = fs; } //end if else if ( !strcmp( token.string, "return" ) ) { fs = (fuzzyseperator_t *) GetClearedMemory( sizeof( fuzzyseperator_t ) ); fs->index = 0; fs->value = MAX_INVENTORYVALUE; fs->next = NULL; fs->child = NULL; if ( !ReadFuzzyWeight( source, fs ) ) { FreeMemory( fs ); FreeWeightConfig( config ); FreeSource( source ); return NULL; } //end if config->weights[config->numweights].firstseperator = fs; } //end else if else { SourceError( source, "invalid name %s", token.string ); FreeWeightConfig( config ); FreeSource( source ); return NULL; } //end else if ( newindent ) { if ( !PC_ExpectTokenString( source, "}" ) ) { FreeWeightConfig( config ); FreeSource( source ); return NULL; } //end if } //end if config->numweights++; } //end if else { SourceError( source, "invalid name %s", token.string ); FreeWeightConfig( config ); FreeSource( source ); return NULL; } //end else } //end while //free the source at the end of a pass FreeSource( source ); //if the file was located in a pak file botimport.Print( PRT_MESSAGE, "loaded %s\n", filename ); #ifdef DEBUG if ( botDeveloper ) { botimport.Print( PRT_MESSAGE, "weights loaded in %d msec\n", Sys_MilliSeconds() - starttime ); } //end if #endif //DEBUG // if ( !LibVarGetValue( "bot_reloadcharacters" ) ) { weightFileList[avail] = config; } //end if // return config; } //end of the function ReadWeightConfig
//=========================================================================== // // Parameter: - // Returns: - // Changes Globals: - //=========================================================================== bot_character_t *BotLoadCharacterFromFile( char *charfile, int skill ) { int indent, index, foundcharacter; bot_character_t *ch; source_t *source; token_t token; foundcharacter = qfalse; //a bot character is parsed in two phases PS_SetBaseFolder( "botfiles" ); source = LoadSourceFile( charfile ); PS_SetBaseFolder( "" ); if ( !source ) { botimport.Print( PRT_ERROR, "counldn't load %s\n", charfile ); return NULL; } //end if ch = ( bot_character_t * ) GetClearedMemory( sizeof( bot_character_t ) + MAX_CHARACTERISTICS * sizeof( bot_characteristic_t ) ); strcpy( ch->filename, charfile ); while ( PC_ReadToken( source, &token ) ) { if ( !strcmp( token.string, "skill" ) ) { if ( !PC_ExpectTokenType( source, TT_NUMBER, 0, &token ) ) { FreeSource( source ); BotFreeCharacterStrings( ch ); FreeMemory( ch ); return NULL; } //end if if ( !PC_ExpectTokenString( source, "{" ) ) { FreeSource( source ); BotFreeCharacterStrings( ch ); FreeMemory( ch ); return NULL; } //end if //if it's the correct skill if ( skill < 0 || token.intvalue == skill ) { foundcharacter = qtrue; ch->skill = token.intvalue; while ( PC_ExpectAnyToken( source, &token ) ) { if ( !strcmp( token.string, "}" ) ) { break; } if ( token.type != TT_NUMBER || !( token.subtype & TT_INTEGER ) ) { SourceError( source, "expected integer index, found %s\n", token.string ); FreeSource( source ); BotFreeCharacterStrings( ch ); FreeMemory( ch ); return NULL; } //end if index = token.intvalue; if ( index < 0 || index > MAX_CHARACTERISTICS ) { SourceError( source, "characteristic index out of range [0, %d]\n", MAX_CHARACTERISTICS ); FreeSource( source ); BotFreeCharacterStrings( ch ); FreeMemory( ch ); return NULL; } //end if if ( ch->c[ index ].type ) { SourceError( source, "characteristic %d already initialized\n", index ); FreeSource( source ); BotFreeCharacterStrings( ch ); FreeMemory( ch ); return NULL; } //end if if ( !PC_ExpectAnyToken( source, &token ) ) { FreeSource( source ); BotFreeCharacterStrings( ch ); FreeMemory( ch ); return NULL; } //end if if ( token.type == TT_NUMBER ) { if ( token.subtype & TT_FLOAT ) { ch->c[ index ].value._float = token.floatvalue; ch->c[ index ].type = CT_FLOAT; } //end if else { ch->c[ index ].value.integer = token.intvalue; ch->c[ index ].type = CT_INTEGER; } //end else } //end if else if ( token.type == TT_STRING ) { StripDoubleQuotes( token.string ); ch->c[ index ].value.string = GetMemory( strlen( token.string ) + 1 ); strcpy( ch->c[ index ].value.string, token.string ); ch->c[ index ].type = CT_STRING; } //end else if else { SourceError( source, "expected integer, float or string, found %s\n", token.string ); FreeSource( source ); BotFreeCharacterStrings( ch ); FreeMemory( ch ); return NULL; } //end else } //end if break; } //end if else { indent = 1; while ( indent ) { if ( !PC_ExpectAnyToken( source, &token ) ) { FreeSource( source ); BotFreeCharacterStrings( ch ); FreeMemory( ch ); return NULL; } //end if if ( !strcmp( token.string, "{" ) ) { indent++; } else if ( !strcmp( token.string, "}" ) ) { indent--; } } //end while } //end else } //end if else { SourceError( source, "unknown definition %s\n", token.string ); FreeSource( source ); BotFreeCharacterStrings( ch ); FreeMemory( ch ); return NULL; } //end else } //end while FreeSource( source ); // if ( !foundcharacter ) { BotFreeCharacterStrings( ch ); FreeMemory( ch ); return NULL; } //end if return ch; } //end of the function BotLoadCharacterFromFile
//=========================================================================== // // Parameter: - // Returns: - // Changes Globals: - //=========================================================================== void AAS_ParseBSPEntities(void) { script_t *script; token_t token; bsp_entity_t *ent; bsp_epair_t *epair; script = LoadScriptMemory(bspworld.dentdata, bspworld.entdatasize, "entdata"); SetScriptFlags(script, SCFL_NOSTRINGWHITESPACES|SCFL_NOSTRINGESCAPECHARS);//SCFL_PRIMITIVE); bspworld.numentities = 1; while(PS_ReadToken(script, &token)) { if (strcmp(token.string, "{")) { ScriptError(script, "invalid %s", token.string); AAS_FreeBSPEntities(); FreeScript(script); return; } //end if if (bspworld.numentities >= MAX_BSPENTITIES) { botimport.Print(PRT_MESSAGE, "too many entities in BSP file\n"); break; } //end if ent = &bspworld.entities[bspworld.numentities]; bspworld.numentities++; ent->epairs = NULL; while(PS_ReadToken(script, &token)) { if (!strcmp(token.string, "}")) break; epair = (bsp_epair_t *) GetClearedHunkMemory(sizeof(bsp_epair_t)); epair->next = ent->epairs; ent->epairs = epair; if (token.type != TT_STRING) { ScriptError(script, "invalid %s", token.string); AAS_FreeBSPEntities(); FreeScript(script); return; } //end if StripDoubleQuotes(token.string); epair->key = (char *) GetHunkMemory(strlen(token.string) + 1); strcpy(epair->key, token.string); if (!PS_ExpectTokenType(script, TT_STRING, 0, &token)) { AAS_FreeBSPEntities(); FreeScript(script); return; } //end if StripDoubleQuotes(token.string); epair->value = (char *) GetHunkMemory(strlen(token.string) + 1); strcpy(epair->value, token.string); } //end while if (strcmp(token.string, "}")) { ScriptError(script, "missing }"); AAS_FreeBSPEntities(); FreeScript(script); return; } //end if } //end while FreeScript(script); } //end of the function AAS_ParseBSPEntities
//=========================================================================== // // Parameter: - // Returns: - // Changes Globals: - //=========================================================================== itemconfig_t *LoadItemConfig( char *filename ) { int max_iteminfo; token_t token; char path[MAX_PATH]; source_t *source; itemconfig_t *ic; iteminfo_t *ii; max_iteminfo = (int) LibVarValue( "max_iteminfo", "256" ); if ( max_iteminfo < 0 ) { botimport.Print( PRT_ERROR, "max_iteminfo = %d\n", max_iteminfo ); max_iteminfo = 128; LibVarSet( "max_iteminfo", "128" ); } strncpy( path, filename, MAX_PATH ); source = LoadSourceFile( path ); if ( !source ) { botimport.Print( PRT_ERROR, "counldn't load %s\n", path ); return NULL; } //end if //initialize item config ic = (itemconfig_t *) GetClearedHunkMemory( sizeof( itemconfig_t ) + max_iteminfo * sizeof( iteminfo_t ) ); ic->iteminfo = ( iteminfo_t * )( (char *) ic + sizeof( itemconfig_t ) ); ic->numiteminfo = 0; //parse the item config file while ( PC_ReadToken( source, &token ) ) { if ( !strcmp( token.string, "iteminfo" ) ) { if ( ic->numiteminfo >= max_iteminfo ) { SourceError( source, "more than %d item info defined\n", max_iteminfo ); FreeMemory( ic ); FreeSource( source ); return NULL; } //end if ii = &ic->iteminfo[ic->numiteminfo]; memset( ii, 0, sizeof( iteminfo_t ) ); if ( !PC_ExpectTokenType( source, TT_STRING, 0, &token ) ) { FreeMemory( ic ); FreeMemory( source ); return NULL; } //end if StripDoubleQuotes( token.string ); strncpy( ii->classname, token.string, sizeof( ii->classname ) - 1 ); if ( !ReadStructure( source, &iteminfo_struct, (char *) ii ) ) { FreeMemory( ic ); FreeSource( source ); return NULL; } //end if ii->number = ic->numiteminfo; ic->numiteminfo++; } //end if else { SourceError( source, "unknown definition %s\n", token.string ); FreeMemory( ic ); FreeSource( source ); return NULL; } //end else } //end while FreeSource( source ); // if ( !ic->numiteminfo ) { botimport.Print( PRT_WARNING, "no item info loaded\n" ); } botimport.Print( PRT_MESSAGE, "loaded %s\n", path ); return ic; } //end of the function LoadItemConfig
static itemconfig_t* LoadItemConfig( const char* filename ) { int max_iteminfo = ( int )LibVarValue( "max_iteminfo", "256" ); if ( max_iteminfo < 0 ) { BotImport_Print( PRT_ERROR, "max_iteminfo = %d\n", max_iteminfo ); max_iteminfo = 256; LibVarSet( "max_iteminfo", "256" ); } if ( GGameType & GAME_Quake3 ) { PC_SetBaseFolder( BOTFILESBASEFOLDER ); } char path[ MAX_QPATH ]; String::NCpyZ( path, filename, MAX_QPATH ); source_t* source = LoadSourceFile( path ); if ( !source ) { BotImport_Print( PRT_ERROR, "counldn't load %s\n", path ); return NULL; } //initialize item config itemconfig_t* ic = ( itemconfig_t* )Mem_ClearedAlloc( sizeof ( itemconfig_t ) + max_iteminfo * sizeof ( iteminfo_t ) ); ic->iteminfo = ( iteminfo_t* )( ( char* )ic + sizeof ( itemconfig_t ) ); ic->numiteminfo = 0; //parse the item config file token_t token; while ( PC_ReadToken( source, &token ) ) { if ( !String::Cmp( token.string, "iteminfo" ) ) { if ( ic->numiteminfo >= max_iteminfo ) { SourceError( source, "more than %d item info defined\n", max_iteminfo ); Mem_Free( ic ); FreeSource( source ); return NULL; } iteminfo_t* ii = &ic->iteminfo[ ic->numiteminfo ]; Com_Memset( ii, 0, sizeof ( iteminfo_t ) ); if ( !PC_ExpectTokenType( source, TT_STRING, 0, &token ) ) { Mem_Free( ic ); FreeSource( source ); return NULL; } StripDoubleQuotes( token.string ); String::NCpy( ii->classname, token.string, sizeof ( ii->classname ) - 1 ); if ( !ReadStructure( source, &iteminfo_struct, ( char* )ii ) ) { Mem_Free( ic ); FreeSource( source ); return NULL; } ii->number = ic->numiteminfo; ic->numiteminfo++; } else { SourceError( source, "unknown definition %s\n", token.string ); Mem_Free( ic ); FreeSource( source ); return NULL; } } FreeSource( source ); if ( !ic->numiteminfo ) { BotImport_Print( PRT_WARNING, "no item info loaded\n" ); } BotImport_Print( PRT_MESSAGE, "loaded %s\n", path ); return ic; }