1+ using Microsoft . Extensions . Logging ;
2+ using PG . StarWarsGame . Engine . ErrorReporting ;
3+ using PG . StarWarsGame . Engine . Xml ;
4+ using PG . StarWarsGame . Engine . Xml . Parsers ;
5+ using System . Linq ;
6+ using System . Threading ;
7+ using System . Threading . Tasks ;
8+
9+ namespace PG . StarWarsGame . Engine . GameObjects ;
10+
11+ internal partial class GameObjectTypeGameManager
12+ {
13+ protected override async Task InitializeCoreAsync ( CancellationToken token )
14+ {
15+ Logger ? . LogInformation ( "Parsing GameObjects..." ) ;
16+ await Task . Run ( ParseGameObjectDatabases , token ) ;
17+ }
18+
19+ private void ParseGameObjectDatabases ( )
20+ {
21+ var gameParser = new PetroglyphStarWarsGameXmlParser ( GameRepository ,
22+ new PetroglyphStarWarsGameXmlParseSettings
23+ {
24+ GameManager = ToString ( ) ,
25+ InvalidFilesListXmlFailsInitialization = true ,
26+ InvalidObjectXmlFailsInitialization = false ,
27+ } , ServiceProvider , ErrorReporter ) ;
28+
29+ var xmlFileList = gameParser . ParseFileList ( @"DATA\XML\GAMEOBJECTFILES.XML" ) . Files
30+ . Select ( x => FileSystem . Path . Combine ( @".\DATA\XML\" , x ) )
31+ . Where ( VerifyFilePathLength )
32+ . ToList ( ) ;
33+
34+ var gameObjectFileParser = new GameObjectFileParser ( EngineType , ServiceProvider , ErrorReporter ) ;
35+
36+ var allLoaded = false ;
37+
38+ // This also acts a guard against infinite loops in case of unexpected circular dependencies or
39+ // when a unit declares itself as its own <Variant_Of_Existing_Type>
40+ for ( var passNumber = 0 ; ! allLoaded && passNumber < 10 ; passNumber ++ )
41+ {
42+ Logger ? . LogDebug ( "***** Parsing game object types - pass {PassNumber} *****" , passNumber ) ;
43+
44+ if ( passNumber != 0 )
45+ gameObjectFileParser . OverlayLoad = true ;
46+
47+ foreach ( var gameObjectXmlFile in xmlFileList )
48+ {
49+ if ( passNumber == 0 )
50+ {
51+ try
52+ {
53+ gameObjectFileParser . GameObjectParsed += OnGameObjectParsed ! ;
54+ ParseSingleGameObjectFile ( gameObjectXmlFile , gameParser , gameObjectFileParser ) ;
55+ }
56+ finally
57+ {
58+ gameObjectFileParser . GameObjectParsed -= OnGameObjectParsed ! ;
59+ }
60+ }
61+ else
62+ {
63+ foreach ( var gameObject in _gameObjects )
64+ {
65+ if ( ! gameObject . IsLoadingComplete && gameObject . Location . XmlFile == gameObjectXmlFile )
66+ ParseSingleGameObjectFile ( gameObjectXmlFile , gameParser , gameObjectFileParser ) ;
67+ }
68+ }
69+ }
70+
71+
72+
73+ //GameObjectTypeClass::Static_Post_Load_Fixup();
74+ //SFXEventReferenceClass::Static_Post_Load_Fixup();
75+ //SpeechEventReferenceClass::Static_Post_Load_Fixup();
76+ //MusicEventReferenceClass::Static_Post_Load_Fixup();
77+ //FactionReferenceClass::Static_Post_Load_Fixup();
78+ //...
79+ }
80+ }
81+
82+ private void OnGameObjectParsed ( object sender , GameObjectParsedEventArgs e )
83+ {
84+ if ( ! e . Unique )
85+ {
86+ var entries = NamedEntries . GetValues ( e . GameObject . Crc32 )
87+ . Select ( x => x . Name ) ;
88+ ErrorReporter . Assert ( EngineAssert . Create (
89+ EngineAssertKind . DuplicateEntry ,
90+ e . GameObject . Crc32 , entries ,
91+ $ "Error: Game object type { e . GameObject . Name } is defined multiple times.") ) ;
92+ }
93+
94+ if ( NamedEntries . ValueCount >= 0x10000 )
95+ {
96+ ErrorReporter . Assert (
97+ EngineAssert . Create (
98+ EngineAssertKind . ValueOutOfRange ,
99+ NamedEntries . ValueCount ,
100+ [ ToString ( ) ] ,
101+ "Too many game object types defined." ) ) ;
102+ }
103+
104+ _gameObjects . Add ( e . GameObject ) ;
105+ }
106+
107+ private void ParseSingleGameObjectFile (
108+ string file ,
109+ PetroglyphStarWarsGameXmlParser gameParser ,
110+ GameObjectFileParser gameObjectFileParser )
111+ {
112+ gameParser . ParseObjectsFromContainerFile ( file , gameObjectFileParser , NamedEntries ) ;
113+ }
114+
115+ private bool VerifyFilePathLength ( string filePath )
116+ {
117+ if ( filePath . Length > PGConstants . MaxGameObjectDatabaseFileName )
118+ {
119+ // Technically this is an assert in the engine, but in Release Mode, the game CTDs.
120+ // Thus, we rank this as an initialization error.
121+ ErrorReporter . Report ( new InitializationError
122+ {
123+ GameManager = ToString ( ) ,
124+ Message = $ "Game object file '{ filePath } ' is longer than { PGConstants . MaxGameObjectDatabaseFileName } characters."
125+ } ) ;
126+ return false ;
127+ }
128+
129+ return true ;
130+ }
131+ }
0 commit comments