Advertisement
Guest User

Untitled

a guest
Sep 21st, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.15 KB | None | 0 0
  1. class ogMapFile;
  2.  
  3. class ogMapEntity {
  4.     friend class ogMapFile;
  5. public:
  6.     og::Dict epairs;
  7.  
  8. public:
  9.     ogMapEntity() { }
  10.  
  11.     static ogMapEntity *Parse( og::Lexer &source );
  12.  
  13. //  bool Write( og::File *file ) const;
  14. };
  15.  
  16. ogMapEntity *ogMapEntity::Parse( og::Lexer &source ) {
  17.     ogMapEntity *ent;
  18.  
  19.     try {
  20.         const og::Token *tok;
  21.         const char *p;
  22.  
  23.         if( !( tok = source.ReadToken() ) ) {
  24.             return NULL;
  25.         }
  26.  
  27.         p = tok->GetString();
  28.  
  29.         if( strcmp( p, "{" ) ) {
  30.             source.Error( og::Format( "MapEntity::Parse: '{' not found, found '$*'" ) << p );
  31.             return NULL;
  32.         }
  33.  
  34.         ent = new ogMapEntity();
  35.  
  36.         do {
  37.             if( !( tok = source.ReadToken() ) ) {
  38.                 source.Error( "MapEntity::Parse: unexpected EOF" );
  39.                 return NULL;
  40.             }
  41.  
  42.             p = tok->GetString();
  43.  
  44.             if ( !strcmp( p, "}" ) ) {
  45.                 break;
  46.             }
  47.  
  48.             if ( !strcmp( p, "{" ) ) {
  49.                 // skip brush ent data
  50.                 source.FindToken("}");
  51.             }
  52.             else {
  53.                 // parse key/value pairs
  54.                 og::String key, value;
  55.  
  56.                 key = p;
  57.                 if( !( tok = source.ReadToken() ) ) {
  58.                     source.Error( "MapEntity::Parse: unexpected EOL or EOF before value" );
  59.                     return NULL;
  60.                 }
  61.                 p = tok->GetString();
  62.                 value = p;
  63.  
  64.                 key.StripTrailingWhitespaces();
  65.                 value.StripTrailingWhitespaces();
  66.  
  67.                 ent->epairs.Set( key.c_str(), value );
  68.             }
  69.         } while ( 1 );
  70.     }
  71.     catch( og::LexerError &err ) {
  72.         og::String errStr;
  73.         err.ToString( errStr );
  74.         og::User::Error( og::ERR_LEXER_FAILURE, errStr.c_str(), "MapEntity" );
  75.         return NULL;
  76.     }
  77.  
  78.     return ent;
  79. }
  80.  
  81. class ogMapFile {
  82. public:
  83.     ogMapFile( void );
  84.     ~ogMapFile( ) { Clear(); }
  85.  
  86. public:
  87.     bool Parse( const char *filename, bool fromBSP = false );
  88.     bool Write( const char *filename );
  89.     void Clear( void );
  90.  
  91. protected:
  92.     og::List<ogMapEntity *> entities;
  93.     og::String name;
  94. };
  95.  
  96. ogMapFile::ogMapFile( ) {
  97.     entities.SetGranularity( 256 );
  98. }
  99. void ogMapFile::Clear( ) {
  100.     entities.Clear();
  101. }
  102. bool ogMapFile::Parse( const char *filename, bool fromBSP ) {
  103.     og::Lexer source;
  104.     ogMapEntity *ent;
  105.     int i;
  106.  
  107.     name = filename;
  108.     name.StripFileExtension();
  109.  
  110.     if( fromBSP ) {
  111.         byte *buffer, *base;
  112.         dheader_t header;
  113.         name.SetFileExtension( ".bsp" );
  114.        
  115.         int length = og::FS->LoadFile( name.c_str(), &buffer );
  116.  
  117.         if( length < 0 ) {
  118.             return false;
  119.         }
  120.  
  121.         og::AutoFreeFile aff( buffer );
  122.  
  123.         header = *(dheader_t *)buffer;
  124.         for( i = 0; i < sizeof( dheader_t ) / 4; i++ ) {
  125.             ( (int *)&header )[i] = LittleLong( ( (int *)&header )[i] );
  126.         }
  127.  
  128.         base = (byte *)buffer;
  129.  
  130.         char * entstr;
  131.         // We drop 1 char because of the added NUL from some other lump it seems?
  132.         int filelen = header.lumps[LUMP_ENTITIES].filelen - 1;
  133.         entstr = new char [ filelen ];
  134.         Com_Memset( entstr, 0, filelen );
  135.         Com_Memcpy( entstr, base + header.lumps[LUMP_ENTITIES].fileofs, filelen );
  136.  
  137.         if( !entstr ) {
  138.             return false;
  139.         }
  140.  
  141.         if( !source.LoadData( name.c_str(), (byte *)entstr, filelen ) ) {
  142.             G_Printf("Failed load entstring for parsing\n");
  143.             return false;
  144.         }
  145.  
  146.         delete[] entstr;
  147.  
  148.         while ( 1 ) {
  149.             ent = ogMapEntity::Parse( source );
  150.             if( !ent ) {
  151.                 break;
  152.             }
  153.  
  154.             og::String classname = ent->epairs.Get( "classname", "noclass" );
  155.             if( !classname.IcmpPrefix("item_" ) || !classname.IcmpPrefix("weapon_" ) || !classname.IcmpPrefix("ammo_" ) || !classname.IcmpPrefix("team_" ) || !classname.IcmpPrefix("holdable_" ) )
  156.             {
  157.                 entities.Append( ent );
  158.             }
  159.             //delete ent;
  160.         }
  161.  
  162.         name.SetFileExtension( ".items" );
  163.         Write( name.c_str() );
  164.         return true;
  165.     }
  166.  
  167.     return true;
  168. }
  169. bool ogMapFile::Write( const char *filename ) {
  170.     og::File *file;
  171.     og::String name;
  172.     int i, j;
  173.  
  174.     name = filename;
  175.     name.SetFileExtension(".items");
  176.  
  177.     file = og::FS->OpenWrite( name.c_str() );
  178.     if( !file ) {
  179.         return false;
  180.     }
  181.  
  182.     og::Format out( "\"$*\" \"$*\"\r\n" );
  183.     for( i = 0; i < entities.Num(); i++ ) {
  184.         file->WriteCStr("{\r\n");
  185.         og::Dict &dict = entities[i]->epairs;
  186.         for( j = 0; j < dict.Num(); j++ ) {
  187.             const og::KeyValue *kv = dict.GetKeyValue(j);
  188.             out << kv->GetKey().c_str() << kv->GetStringValue();
  189.             file->Write( out, out.ByteLength() );
  190.             out.Reset();
  191.         }
  192.         file->WriteCStr("}\r\n");
  193.     }
  194.  
  195.     file->Close();
  196.  
  197.     return true;
  198. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement