2013-04-11 11:04:16 +00:00
using System.Collections.Generic ;
2012-05-21 23:51:32 +00:00
using System.IO ;
using CodeImp.DoomBuilder.ZDoom ;
using CodeImp.DoomBuilder.GZBuilder.Data ;
namespace CodeImp.DoomBuilder.GZBuilder.GZDoom {
2013-09-11 09:47:53 +00:00
internal class ModeldefParser : ZDTextParser {
private Dictionary < string , ModelData > modelDefEntries ; //classname, entry
internal Dictionary < string , ModelData > ModelDefEntries { get { return modelDefEntries ; } }
internal string Source { get { return sourcename ; } }
2012-05-21 23:51:32 +00:00
2013-09-11 09:47:53 +00:00
internal ModeldefParser ( ) {
modelDefEntries = new Dictionary < string , ModelData > ( ) ;
}
2012-06-01 10:17:47 +00:00
2013-09-11 09:47:53 +00:00
//should be called after all decorate actors are parsed
public override bool Parse ( Stream stream , string sourcefilename ) {
base . Parse ( stream , sourcefilename ) ;
modelDefEntries = new Dictionary < string , ModelData > ( ) ;
2012-05-21 23:51:32 +00:00
2013-09-11 09:47:53 +00:00
// Continue until at the end of the stream
while ( SkipWhitespace ( true ) ) {
string token = ReadToken ( ) ;
2012-05-22 22:56:42 +00:00
2013-09-11 09:47:53 +00:00
if ( token ! = null ) {
token = StripTokenQuotes ( token ) . ToLowerInvariant ( ) ;
2012-05-21 23:51:32 +00:00
2013-09-11 09:47:53 +00:00
if ( token = = "model" ) { //model structure start
//find classname
SkipWhitespace ( true ) ;
string className = StripTokenQuotes ( ReadToken ( ) ) . ToLowerInvariant ( ) ;
2012-05-21 23:51:32 +00:00
2013-09-11 09:47:53 +00:00
if ( ! string . IsNullOrEmpty ( className ) ) {
2013-07-29 08:50:50 +00:00
if ( modelDefEntries . ContainsKey ( className ) ) continue ; //already got this class; continue to next one
2012-05-21 23:51:32 +00:00
2013-09-11 09:47:53 +00:00
//now find opening brace
SkipWhitespace ( true ) ;
token = ReadToken ( ) ;
if ( token ! = "{" ) {
General . ErrorLogger . Add ( ErrorType . Error , "Unexpected token found in " + sourcefilename + " at line " + GetCurrentLineNumber ( ) + ": expected '{', but got " + token ) ;
continue ; //something wrong with modeldef declaration, continue to next one
}
2012-05-21 23:51:32 +00:00
2013-09-11 09:47:53 +00:00
ModeldefStructure mds = new ModeldefStructure ( ) ;
ModelData mde = mds . Parse ( this ) ;
if ( mde ! = null ) {
mde . ClassName = className ;
modelDefEntries . Add ( className , mde ) ;
}
}
2012-05-21 23:51:32 +00:00
2013-09-11 09:47:53 +00:00
} else {
// Unknown structure!
string token2 ;
do {
if ( ! SkipWhitespace ( true ) ) break ;
token2 = ReadToken ( ) ;
if ( token2 = = null ) break ;
}
while ( token2 ! = "{" ) ;
int scopelevel = 1 ;
do {
if ( ! SkipWhitespace ( true ) ) break ;
token2 = ReadToken ( ) ;
if ( token2 = = null ) break ;
if ( token2 = = "{" ) scopelevel + + ;
if ( token2 = = "}" ) scopelevel - - ;
}
while ( scopelevel > 0 ) ;
}
2012-05-21 23:51:32 +00:00
2013-09-11 09:47:53 +00:00
}
2012-05-21 23:51:32 +00:00
2013-09-11 09:47:53 +00:00
}
2012-05-21 23:51:32 +00:00
2013-09-11 09:47:53 +00:00
if ( modelDefEntries . Count > 0 )
return true ;
return false ;
}
}
2012-05-21 23:51:32 +00:00
}