/* ================ idTypeInfoTools::CompareGameState ================ */ void idTypeInfoTools::CompareGameState( const char *fileName ) { int entityNum; idToken token; src = new idLexer(); src->SetFlags( LEXFL_NOSTRINGESCAPECHARS ); if ( !src->LoadFile( fileName ) ) { common->Warning( "couldn't load %s", fileName ); delete src; src = NULL; return; } fp = NULL; Write = VerifyVariable; #ifdef DUMP_GAMELOCAL if ( !src->ExpectTokenString( "gameLocal" ) || !src->ExpectTokenString( "{" ) ) { delete src; src = NULL; return; } WriteClass_r( (void *)&gameLocal, "", "idGameLocal", "idGameLocal", "", 0 ); if ( !src->ExpectTokenString( "}" ) ) { delete src; src = NULL; return; } #endif while( src->ReadToken( &token ) ) { if ( token != "entity" ) { break; } if ( !src->ExpectTokenType( TT_NUMBER, TT_INTEGER, &token ) ) { break; } entityNum = token.GetIntValue(); if ( entityNum < 0 || entityNum >= gameLocal.num_entities ) { src->Warning( "entity number %d out of range", entityNum ); break; } typeError = false; idEntity *ent = gameLocal.entities[entityNum]; if ( !ent ) { src->Warning( "entity %d is not spawned", entityNum ); src->SkipBracedSection( true ); continue; } if ( !src->ExpectTokenType( TT_NAME, 0, &token ) ) { break; } if ( token.Cmp( ent->GetType()->classname ) != 0 ) { src->Warning( "entity %d has wrong type", entityNum ); src->SkipBracedSection( true ); continue; } if ( !src->ExpectTokenString( "{" ) ) { src->Warning( "entity %d missing leading {", entityNum ); break; } WriteClass_r( (void *)ent, "", ent->GetType()->classname, ent->GetType()->classname, "", 0 ); if ( !src->SkipBracedSection( false ) ) { src->Warning( "entity %d missing trailing }", entityNum ); break; } } delete src; src = NULL; }