1010
1111namespace EXDTooler ;
1212
13- public sealed class ColDefReader ( ImmutableSortedDictionary < string , List < ExcelColumnDefinition > > dict )
13+ public sealed class ColDefReader ( ImmutableSortedDictionary < string , ExcelColumnDefinition [ ] > dict ,
14+ ImmutableSortedSet < string > subrows )
1415{
15- public ImmutableSortedDictionary < string , List < ExcelColumnDefinition > > Sheets { get ; } = dict ;
16+ public ImmutableSortedDictionary < string , ExcelColumnDefinition [ ] > Sheets { get ; } = dict ;
17+ private ImmutableSortedSet < string > SubrowSheets { get ; } = subrows ;
1618
1719 private byte [ ] ? hash ;
1820 public byte [ ] Hash => hash ??= CalcHash ( ) ;
@@ -32,29 +34,49 @@ public static ColDefReader FromColumnFile(string file)
3234 var deserializer = new DeserializerBuilder ( ) . WithNamingConvention ( CamelCaseNamingConvention . Instance ) . Build ( ) ;
3335
3436 using var f = File . OpenText ( file ) ;
35- var sheets = deserializer . Deserialize < Dictionary < string , List < ExcelColumnDefinition > > > ( f ) ;
36- return new ( sheets . ToImmutableSortedDictionary ( ) ) ;
37+ var sheets = deserializer . Deserialize < Dictionary < string , ExcelColumnDefinition [ ] > > ( f ) ;
38+
39+ var subrowSheets = sheets . Where ( sheet => sheet . Key . EndsWith ( "@Subrow" ) )
40+ . Select ( sheet => sheet . Key [ ..^ 7 ] )
41+ . ToImmutableSortedSet ( ) ;
42+ foreach ( var sheet in subrowSheets )
43+ {
44+ sheets [ sheet ] = sheets [ $ "{ sheet } @Subrow"] ;
45+ Console . WriteLine ( sheet ) ;
46+ sheets . Remove ( $ "{ sheet } @Subrow") ;
47+ }
48+
49+ if ( subrowSheets . Count == 0 )
50+ {
51+ throw new InvalidOperationException ( "No subrow sheets found in the provided columns file." ) ;
52+ }
53+
54+ return new ( sheets . ToImmutableSortedDictionary ( ) , subrowSheets ) ;
3755 }
3856
3957 public static ColDefReader FromGameData ( string gamePath )
4058 {
4159 Log . Verbose ( "Loading game data" ) ;
4260 using var gameData = new GameData ( gamePath , new LuminaOptions ( )
4361 {
44- CacheFileResources = false
62+ CacheFileResources = false ,
63+ LoadMultithreaded = true
4564 } ) ;
4665
66+ var files = gameData . Excel . SheetNames
67+ . Where ( p => ! p . Contains ( '/' ) )
68+ . Select ( sheetName => ( sheetName , gameData . GetFile < ExcelHeaderFile > ( $ "exd/{ sheetName } .exh") ! ) ) ;
69+
4770 return new (
48- gameData . Excel . SheetNames
49- . Where ( p => ! p . Contains ( '/' ) )
50- . Select ( sheetName => ( sheetName , gameData . GetFile < ExcelHeaderFile > ( $ "exd/{ sheetName } .exh") ! ) )
51- . Select ( pair => KeyValuePair . Create ( pair . sheetName , pair . Item2 . ColumnDefinitions . ToList ( ) ) )
52- . ToImmutableSortedDictionary ( )
71+ files . ToImmutableSortedDictionary ( pair => pair . sheetName , pair => pair . Item2 . ColumnDefinitions ) ,
72+ [ .. files . Where ( pair => pair . Item2 . Header . Variant == ExcelVariant . Subrows ) . Select ( pair => pair . sheetName ) ]
5373 ) ;
5474 }
5575
76+ public ExcelColumnDefinition [ ] this [ string sheetName ] => Sheets [ sheetName ] ;
77+
5678 public uint GetColumnsHash ( string sheetName ) =>
57- Crc32 . Get ( MemoryMarshal . AsBytes ( CollectionsMarshal . AsSpan ( Sheets [ sheetName ] ) ) ) ;
79+ Crc32 . Get ( MemoryMarshal . AsBytes ( Sheets [ sheetName ] . AsSpan ( ) ) ) ;
5880
5981 public void WriteTo ( TextWriter writer )
6082 {
@@ -66,7 +88,7 @@ public void WriteTo(TextWriter writer)
6688 . EnsureRoundtrip ( )
6789 . Build ( ) ;
6890
69- schemaSerializer . Serialize ( writer , Sheets ) ;
91+ schemaSerializer . Serialize ( writer , Sheets . ToImmutableSortedDictionary ( pair => $ " { pair . Key } { ( SubrowSheets . Contains ( pair . Key ) ? "@Subrow" : string . Empty ) } " , pair => pair . Value ) ) ;
7092 }
7193
7294 private byte [ ] CalcHash ( )
@@ -85,6 +107,11 @@ private byte[] CalcHash()
85107 }
86108 }
87109
110+ foreach ( var subrow in SubrowSheets )
111+ {
112+ w . Write ( subrow ) ;
113+ }
114+
88115 w . Flush ( ) ;
89116 }
90117
0 commit comments