Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

new meta format; enchanced grouping; minor fixes #14

Merged
merged 9 commits into from
Jan 25, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions Penumbra/Importer/Models/ExtendedModPack.cs
Original file line number Diff line number Diff line change
@@ -1,22 +1,23 @@
using System.Collections.Generic;
using Penumbra.Models;

namespace Penumbra.Importer.Models
{
internal class OptionList
{
public string Name { get; set; }
public object Description { get; set; }
public string Description { get; set; }
public string ImagePath { get; set; }
public List< SimpleMod > ModsJsons { get; set; }
public string GroupName { get; set; }
public string SelectionType { get; set; }
public SelectType SelectionType { get; set; }
public bool IsChecked { get; set; }
}

internal class ModGroup
{
public string GroupName { get; set; }
public string SelectionType { get; set; }
public SelectType SelectionType { get; set; }
public List< OptionList > OptionList { get; set; }
}

Expand Down
43 changes: 28 additions & 15 deletions Penumbra/Importer/TexToolsImport.cs
Original file line number Diff line number Diff line change
Expand Up @@ -211,14 +211,16 @@ private void ImportExtendedV2ModPack( ZipFile extractedModPack )
return;

// Iterate through all pages
foreach( var option in from modPackPage in modList.ModPackPages
from modGroup in modPackPage.ModGroups
from option in modGroup.OptionList
select option )
foreach( var page in modList.ModPackPages)
{
var optionFolder = new DirectoryInfo( Path.Combine( newModFolder.FullName, option.Name ) );
ExtractSimpleModList( optionFolder, option.ModsJsons, modData );
AddMeta( optionFolder, newModFolder, modMeta, option.Name );
foreach(var group in page.ModGroups) {
var groupFolder = new DirectoryInfo(Path.Combine(newModFolder.FullName, group.GroupName));
foreach(var option in group.OptionList) {
var optionFolder = new DirectoryInfo( Path.Combine( groupFolder.FullName, option.Name ) );
ExtractSimpleModList( optionFolder, option.ModsJsons, modData );
}
AddMeta(newModFolder, groupFolder, group, modMeta);
}
}

File.WriteAllText(
Expand All @@ -227,19 +229,30 @@ from option in modGroup.OptionList
);
}

void AddMeta( DirectoryInfo optionFolder, DirectoryInfo baseFolder, ModMeta meta, string optionName )
private void AddMeta( DirectoryInfo baseFolder, DirectoryInfo groupFolder,ModGroup group, ModMeta meta)
{
var optionFolderLength = optionFolder.FullName.Length;
var baseFolderLength = baseFolder.FullName.Length;
foreach( var dir in optionFolder.EnumerateDirectories() )
var Inf = new InstallerInfo
{
SelectionType = group.SelectionType,
GroupName = group.GroupName,
Options = new List<Option>(),
};
foreach( var opt in group.OptionList )
{
foreach( var file in dir.EnumerateFiles( "*.*", SearchOption.AllDirectories ) )
var optio = new Option
{
OptionName = opt.Name,
OptionDesc = String.IsNullOrEmpty( opt.Description ) ? "" : opt.Description,
OptionFiles = new Dictionary<string, string>()
};
var optDir = new DirectoryInfo( Path.Combine( groupFolder.FullName, opt.Name ) );
foreach( var file in optDir.EnumerateFiles( "*.*", SearchOption.AllDirectories ) )
{
meta.Groups.AddFileToOtherGroups( optionName
, file.FullName.Substring( baseFolderLength ).TrimStart( '\\' )
, file.FullName.Substring( optionFolderLength ).TrimStart( '\\' ).Replace( '\\', '/' ) );
optio.OptionFiles[file.FullName.Substring( baseFolder.FullName.Length ).TrimStart( '\\' )] = file.FullName.Substring( optDir.FullName.Length ).TrimStart( '\\' ).Replace( '\\', '/' );
}
Inf.Options.Add( optio );
}
meta.Groups.Add( group.GroupName, Inf );
}

private void ImportMetaModPack( FileInfo file )
Expand Down
196 changes: 14 additions & 182 deletions Penumbra/Models/GroupInformation.cs
Original file line number Diff line number Diff line change
@@ -1,189 +1,21 @@
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.Linq;

namespace Penumbra.Models
{
[Serializable]
public class GroupInformation : ISerializable
public enum SelectType
{
// This class is just used as a temp class while (de)-serializing.
// It converts the flags into lists and back.
[Serializable]
private class GroupDescription : ISerializable
{
public GroupDescription( GroupInformation info, (string, uint, uint, ulong) vars )
{
GamePath = vars.Item1;

static List< string > AddGroupTypes( ulong flags, ulong bound, List< string > groupType )
{
List< string > ret = null;
if( flags != uint.MaxValue )
{
ret = new();
for( var i = 0; i < groupType.Count; ++i )
{
var flag = 1u << i;
if( ( flags & flag ) == flag )
ret.Add( groupType[ i ] );
}
}

return ret;
}

// Tops and Bottoms are uint.
TopTypes = AddGroupTypes( vars.Item2, uint.MaxValue, info.TopTypes );
BottomTypes = AddGroupTypes( vars.Item3, uint.MaxValue, info.BottomTypes );
// Exclusions are the other way around and ulong.
GroupExclusions = AddGroupTypes( ~vars.Item4, 0, info.OtherGroups );
}

public (string, uint, uint, ulong) ToTuple( GroupInformation info )
{
static ulong TypesToFlags( List< string > ownTypes, List< string > globalTypes )
{
if( ownTypes == null )
return ulong.MaxValue;

ulong flags = 0;
foreach( var x in ownTypes )
{
var index = globalTypes.IndexOf( x );
if( index >= 0 )
flags |= ( 1u << index );
}

return flags;
}

var tops = ( uint )TypesToFlags( TopTypes, info.TopTypes );
var bottoms = ( uint )TypesToFlags( BottomTypes, info.BottomTypes );
// Exclusions are the other way around.
var groupEx = ( GroupExclusions == null ) ? ulong.MaxValue : ~TypesToFlags( GroupExclusions, info.OtherGroups );
return ( GamePath, tops, bottoms, groupEx );
}

public string GamePath { get; set; }
public List< string > TopTypes { get; set; }
public List< string > BottomTypes { get; set; }
public List< string > GroupExclusions { get; set; }

// Customize (De)-Serialization to ignore nulls.
public GroupDescription( SerializationInfo info, StreamingContext context )
{
List< string > readListOrNull( string name )
{
try
{
var ret = ( List< string > )info.GetValue( name, typeof( List< string > ) );
if( ret == null || ret.Count == 0 )
return null;
return ret;
}
catch( Exception )
{
return null;
}
}

GamePath = info.GetString( "GamePath" );
TopTypes = readListOrNull( "TopTypes" );
BottomTypes = readListOrNull( "BottomTypes" );
GroupExclusions = readListOrNull( "GroupExclusions" );
}

public virtual void GetObjectData( SerializationInfo info, StreamingContext context )
{
info.AddValue( "GamePath", GamePath );
if( TopTypes != null ) info.AddValue( "TopTypes", TopTypes );
if( BottomTypes != null ) info.AddValue( "BottomTypes", BottomTypes );
if( GroupExclusions != null ) info.AddValue( "GroupExclusions", GroupExclusions );
}
}

public List< string > TopTypes { get; set; } = new();
public List< string > BottomTypes { get; set; } = new();
public List< string > OtherGroups { get; set; } = new();

public void AddFileToOtherGroups( string optionName, string fileName, string gamePath )
{
var idx = OtherGroups.IndexOf( optionName );
if( idx < 0 )
{
idx = OtherGroups.Count;
OtherGroups.Add( optionName );
}

(string, uint, uint, ulong) tuple = ( gamePath, uint.MaxValue, uint.MaxValue, ( 1ul << idx ) );

if( !FileToGameAndGroup.TryGetValue( fileName, out var tuple2 ) )
{
FileToGameAndGroup.Add( fileName, tuple );
}
else
{
tuple2.Item1 = tuple.Item1;
tuple2.Item4 |= tuple.Item4;
}
}

public Dictionary< string, (string, uint, uint, ulong) > FileToGameAndGroup { get; set; } = new();

public GroupInformation()
{
}

public GroupInformation( SerializationInfo info, StreamingContext context )
{
try
{
TopTypes = ( List< string > )info.GetValue( "TopTypes", TopTypes.GetType() );
}
catch( Exception )
{
}

try
{
BottomTypes = ( List< string > )info.GetValue( "BottomTypes", BottomTypes.GetType() );
}
catch( Exception )
{
}

try
{
OtherGroups = ( List< string > )info.GetValue( "Groups", OtherGroups.GetType() );
}
catch( Exception )
{
}

try
{
Dictionary< string, GroupDescription > dict = new();
dict = ( Dictionary< string, GroupDescription > )info.GetValue( "FileToGameAndGroups", dict.GetType() );
foreach( var pair in dict )
FileToGameAndGroup.Add( pair.Key, pair.Value.ToTuple( this ) );
}
catch( Exception )
{
}
}

public virtual void GetObjectData( SerializationInfo info, StreamingContext context )
{
if( ( TopTypes?.Count ?? 0 ) > 0 ) info.AddValue( "TopTypes", TopTypes );
if( ( BottomTypes?.Count ?? 0 ) > 0 ) info.AddValue( "BottomTypes", BottomTypes );
if( ( OtherGroups?.Count ?? 0 ) > 0 ) info.AddValue( "Groups", OtherGroups );
if( ( FileToGameAndGroup?.Count ?? 0 ) > 0 )
{
var dict = FileToGameAndGroup.ToDictionary( pair => pair.Key, pair => new GroupDescription( this, pair.Value ) );
info.AddValue( "FileToGameAndGroups", dict );
}
}
Single, Multi
}
public struct Option
{
public string OptionName;
public string OptionDesc;
public Dictionary<string, string> OptionFiles;
}
public struct InstallerInfo
{
public string GroupName;
public SelectType SelectionType;
public List<Option> Options;
}
}
7 changes: 3 additions & 4 deletions Penumbra/Models/ModInfo.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Newtonsoft.Json;
using System.Collections.Generic;
using Penumbra.Mods;

namespace Penumbra.Models
Expand All @@ -7,10 +8,8 @@ public class ModInfo
{
public string FolderName { get; set; }
public bool Enabled { get; set; }
public int Priority { get; set; }
public int CurrentTop { get; set; } = 0;
public int CurrentBottom { get; set; } = 0;
public int CurrentGroup { get; set; } = 0;
public int Priority { get; set; }
public Dictionary<string, int> Conf {get;set;}

[JsonIgnore]
public ResourceMod Mod { get; set; }
Expand Down
2 changes: 1 addition & 1 deletion Penumbra/Models/ModMeta.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,6 @@ public class ModMeta

public Dictionary< string, string > FileSwaps { get; } = new();

public GroupInformation Groups { get; set; } = new();
public Dictionary<string, InstallerInfo> Groups { get; set; } = new();
}
}
Loading