@@ -157,7 +157,8 @@ private void PrepareInstaller()
157157 if ( ( ModInfoVersion == new Version ( 1 , 0 , 0 , 0 ) ) ||
158158 ( ModInfoVersion == new Version ( 1 , 0 , 1 , 0 ) ) ||
159159 ( ModInfoVersion == new Version ( 1 , 0 , 1 , 1 ) ) ||
160- ( ModInfoVersion == new Version ( 1 , 0 , 1 , 2 ) ) )
160+ ( ModInfoVersion == new Version ( 1 , 0 , 1 , 2 ) ) ||
161+ ( ModInfoVersion == new Version ( 1 , 0 , 1 , 3 ) ) )
161162 {
162163 if ( File . Exists ( Path . Combine ( ModConfigPath , "Branding.png" ) ) )
163164 {
@@ -185,7 +186,8 @@ private void PrepareInstaller()
185186 }
186187 else if ( ( ModInfoVersion == new Version ( 1 , 0 , 1 , 0 ) ) ||
187188 ( ModInfoVersion == new Version ( 1 , 0 , 1 , 1 ) ) ||
188- ( ModInfoVersion == new Version ( 1 , 0 , 1 , 2 ) ) )
189+ ( ModInfoVersion == new Version ( 1 , 0 , 1 , 2 ) ) ||
190+ ( ModInfoVersion == new Version ( 1 , 0 , 1 , 3 ) ) )
189191 {
190192 _dontUseLegacyPackagePlacement = true ;
191193 _installerMode = 1 ;
@@ -246,85 +248,101 @@ private void PrepareInstaller()
246248 else
247249 ModDescription = string . Empty ;
248250
249- if ( Document . SelectSingleNode ( "/mod" ) . Attributes [ "version" ] != null )
251+ // installerSystemVersion 1.0.1.3 introduced the version, depends and dependsVersion attributes
252+ if ( ModInfoVersion == new Version ( 1 , 0 , 1 , 3 ) )
250253 {
251- if ( Version . TryParse ( Document . SelectSingleNode ( "/mod" ) . Attributes [ "version" ] . Value , out Version parsedVersion ) )
252- ModVersion = parsedVersion ;
254+ if ( Document . SelectSingleNode ( "/mod" ) . Attributes [ "version" ] != null )
255+ {
256+ if ( Version . TryParse ( Document . SelectSingleNode ( "/mod" ) . Attributes [ "version" ] . Value , out Version parsedVersion ) )
257+ ModVersion = parsedVersion ;
258+ else
259+ throw new Exception ( "This mod has an invalid version. Please inform the mod's developer of this." ) ;
260+ }
253261 else
254- throw new Exception ( "This mod has an invalid version. Please inform the mod's developer of this." ) ;
255- }
256- else
257- ModVersion = null ;
262+ ModVersion = null ;
258263
259- if ( Document . SelectSingleNode ( "/mod" ) . Attributes [ "depends" ] != null )
260- {
261- string dependsString = Document . SelectSingleNode ( "/mod" ) . Attributes [ "depends" ] . Value ;
262- string dependsVersionString = null ;
263- if ( Document . SelectSingleNode ( "/mod" ) . Attributes [ "dependsVersions" ] != null )
264- dependsVersionString = Document . SelectSingleNode ( "/mod" ) . Attributes [ "dependsVersions" ] . Value ;
265- string [ ] dependsUniqueNames = dependsString . Split ( '?' ) ;
266- string [ ] dependsVersions = dependsVersionString == null ? null : dependsVersionString . Split ( '?' ) ;
267- bool [ ] foundDepends = new bool [ dependsUniqueNames . Length ] ;
268- // reset foundDepends
269- for ( int i = 0 ; i < foundDepends . Length ; i ++ )
270- foundDepends [ i ] = false ;
271-
272- ModDependencies = dependsUniqueNames . ToList ( ) ;
273- if ( dependsVersions != null )
274- { // TODO: improve this logic...
275- foreach ( string dependsVersion in dependsVersions )
264+ if ( Document . SelectSingleNode ( "/mod" ) . Attributes [ "depends" ] != null )
265+ {
266+ string dependsString = Document . SelectSingleNode ( "/mod" ) . Attributes [ "depends" ] . Value ;
267+ string dependsVersionString = null ;
268+ if ( Document . SelectSingleNode ( "/mod" ) . Attributes [ "dependsVersions" ] != null )
269+ dependsVersionString = Document . SelectSingleNode ( "/mod" ) . Attributes [ "dependsVersions" ] . Value ;
270+ string [ ] dependsUniqueNames = dependsString . Split ( '?' ) ;
271+ string [ ] dependsVersions = dependsVersionString ? . Split ( '?' ) ;
272+ bool [ ] foundDepends = new bool [ dependsUniqueNames . Length ] ;
273+ foreach ( var b in foundDepends )
274+ {
275+ MessageBox . Show ( $ "b: { b . ToString ( ) } ") ;
276+ }
277+ ModDependencies = dependsUniqueNames . ToList ( ) ;
278+ if ( dependsVersions != null )
276279 {
277- if ( Version . TryParse ( dependsVersion , out Version parsedDependsVersion ) )
280+ foreach ( string dependsVersion in dependsVersions )
278281 {
279- ModDependenciesVersions . Add ( parsedDependsVersion ) ;
282+ if ( String . IsNullOrEmpty ( dependsVersion ) )
283+ { // 0.0.0.0 is interpreted as having no version attribute
284+ // but we need to pad the list to match the amount of items
285+ // that ModDependencies has
286+ ModDependenciesVersions . Add ( new Version ( 0 , 0 , 0 , 0 ) ) ;
287+ }
288+ else
289+ {
290+ if ( Version . TryParse ( dependsVersion , out Version parsedDependsVersion ) )
291+ {
292+ ModDependenciesVersions . Add ( parsedDependsVersion ) ;
293+ }
294+ else
295+ {
296+ throw new Exception ( $ "This mod has an invalid deoendsVersions entry: \" { dependsVersion } \" . Please inform the mod's developer of this.") ;
297+ }
298+ }
280299 }
281300 }
282- }
283301
284- foreach ( ModConfiguration mod in configs )
285- {
286- for ( int i = 0 ; i < dependsUniqueNames . Length ; i ++ )
302+ foreach ( ModConfiguration mod in configs )
287303 {
288- if ( mod . Unique == dependsUniqueNames [ i ] )
304+ for ( int i = 0 ; i < dependsUniqueNames . Length ; i ++ )
289305 {
290- if ( mod . Version != null &&
291- ( dependsVersions != null ) &&
292- ( dependsVersions . Length > i ) &&
293- ( Version . TryParse ( dependsVersions [ i ] , out Version dependVersion ) &&
294- mod . Version >= dependVersion ) )
295- { // name + version match
296- foundDepends [ i ] = true ;
297- break ;
298- }
299- else if ( dependsVersions == null || dependsVersions . Length <= i )
300- { // name only match
301- foundDepends [ i ] = true ;
302- break ;
306+ if ( mod . Unique == dependsUniqueNames [ i ] )
307+ {
308+ if ( mod . Version != null &&
309+ ( ModDependenciesVersions . Count ( ) > i ) &&
310+ ( mod . Version >= ModDependenciesVersions [ i ] ) )
311+ { // name + version match
312+ foundDepends [ i ] = true ;
313+ break ;
314+ }
315+ else if ( ModDependenciesVersions . Count ( ) <= i ||
316+ ModDependenciesVersions [ i ] == new Version ( 0 , 0 , 0 , 0 ) )
317+ { // name only match
318+ foundDepends [ i ] = true ;
319+ break ;
320+ }
303321 }
304322 }
305323 }
306- }
307324
308- bool satisfiedDepends = true ;
309- List < string > missingDepends = new List < string > ( ) ;
310- for ( int i = 0 ; i < foundDepends . Length ; i ++ )
311- {
312- if ( ! foundDepends [ i ] )
325+ bool satisfiedDepends = true ;
326+ List < string > missingDepends = new List < string > ( ) ;
327+ for ( int i = 0 ; i < foundDepends . Length ; i ++ )
313328 {
314- satisfiedDepends = false ;
315- string missingDependsText = dependsUniqueNames [ i ] ;
316- if ( dependsVersions != null &&
317- dependsVersions . Length > i )
329+ if ( ! foundDepends [ i ] )
318330 {
319- missingDependsText += " " + dependsVersions [ i ] ;
331+ satisfiedDepends = false ;
332+ string missingDependsText = dependsUniqueNames [ i ] ;
333+ if ( dependsVersions != null &&
334+ dependsVersions . Length > i )
335+ {
336+ missingDependsText += " " + dependsVersions [ i ] ;
337+ }
338+ missingDepends . Add ( missingDependsText ) ;
320339 }
321- missingDepends . Add ( missingDependsText ) ;
322340 }
323- }
324341
325- if ( ! satisfiedDepends )
326- {
327- throw new Exception ( $ "This mod has dependencies that you don't have installed: { String . Join ( ", " , missingDepends ) } ") ;
342+ if ( ! satisfiedDepends )
343+ {
344+ throw new Exception ( $ "This mod has dependencies that you don't have installed: { String . Join ( ", " , missingDepends ) } ") ;
345+ }
328346 }
329347 }
330348
0 commit comments