mirror of
				https://github.com/Strongleong/ScrapModLoader.git
				synced 2024-08-15 00:03:19 +00:00 
			
		
		
		
	Changed config format from xml to toml
				
					
				
			This commit is contained in:
		
							parent
							
								
									73ccf99efc
								
							
						
					
					
						commit
						02d9df8160
					
				
					 3 changed files with 72 additions and 75 deletions
				
			
		
							
								
								
									
										48
									
								
								README.md
									
										
									
									
									
								
							
							
						
						
									
										48
									
								
								README.md
									
										
									
									
									
								
							|  | @ -27,33 +27,37 @@ For now mod for Scrapland is a *.sm file that basically is a zip arhive with fol | ||||||
| | Filename			 | Description									| | | Filename			 | Description									| | ||||||
| |--------------------|----------------------------------------------| | |--------------------|----------------------------------------------| | ||||||
| | icon.png			 | Icon for mod that will show up in mod loader	| | | icon.png			 | Icon for mod that will show up in mod loader	| | ||||||
| | config.xml		 | Information about mod						| | | config.toml		 | Information about mod						| | ||||||
| | <filename\>.packed | Container with all mod game assets			| | | <filename\>.packed | Container with all mod game assets			| | ||||||
| 
 | 
 | ||||||
| ### meta.ini sample | ### config.toml sample | ||||||
| ```xml | ```toml | ||||||
| <?xml version="1.0" encoding="UTF-8"?> | title = "Mod title" | ||||||
| <ScrapMod> | description = "Mod description" | ||||||
| 	<Title>Mod Title</Title> | category = "Mod category" | ||||||
| 	<Description>Mod Desciption</Description> | version = "1.0" | ||||||
|  | requiredLauncher = "1.0" | ||||||
|  | requiredGame = "1.0" | ||||||
| 
 | 
 | ||||||
| 	<Category>Category</Category> | authors = [  | ||||||
| 	<Version>1.0</Version> | 	{ name = "Author 1" }, | ||||||
| 	<RequiredLauncher>1.0</RequiredLauncher> | 	{ name = "Author 2" } | ||||||
| 	<RequiredGame>1.1</RequiredGame> | ] | ||||||
| 
 | 
 | ||||||
| 	<Author name="Author1" website="https://example.com" /> | [[credits]] | ||||||
| 	<Author name="Author2" /> | group = "Group 1" | ||||||
|  | credits = [ | ||||||
|  | 	{ name = "Author 1" }, | ||||||
|  | 	{ name = "Author 2" }, | ||||||
|  | 	{ name = "Author 3" } | ||||||
|  | ] | ||||||
| 
 | 
 | ||||||
| 	<Credits group="Mod author"> | [[credits]] | ||||||
| 		<Credit name="Author1" /> | group = "Group 2" | ||||||
| 	</Credits> | credits = [ | ||||||
| 	<Credits group="Some credit" > | 	{ name = "Author 3" }, | ||||||
| 		<Credit name="Credit1" /> | 	{ name = "Author 4" } | ||||||
| 		<Credit name="Credit2" /> | ] | ||||||
| 		<Credit name="Credit3" /> |  | ||||||
| 	</Credits> |  | ||||||
| </ScrapMod> |  | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| ## TODO: | ## TODO: | ||||||
|  |  | ||||||
|  | @ -6,6 +6,8 @@ using System.Xml; | ||||||
| 
 | 
 | ||||||
| using Ionic.Zip; | using Ionic.Zip; | ||||||
| 
 | 
 | ||||||
|  | using Tommy; | ||||||
|  | 
 | ||||||
| namespace ScrapModLoader | namespace ScrapModLoader | ||||||
| { | { | ||||||
|     public class ScrapMod |     public class ScrapMod | ||||||
|  | @ -25,7 +27,7 @@ namespace ScrapModLoader | ||||||
|         public ScrapMod(String path) |         public ScrapMod(String path) | ||||||
|         { |         { | ||||||
|             ModPath = path; |             ModPath = path; | ||||||
|             Name = Path.GetFileNameWithoutExtension(path); |             Name = String.Empty; | ||||||
|             Description = String.Empty; |             Description = String.Empty; | ||||||
|             Icon = new BitmapImage(); |             Icon = new BitmapImage(); | ||||||
|             Checked = false; |             Checked = false; | ||||||
|  | @ -105,7 +107,7 @@ namespace ScrapModLoader | ||||||
|             using (ZipFile zipFile = ZipFile.Read(path)) |             using (ZipFile zipFile = ZipFile.Read(path)) | ||||||
|             { |             { | ||||||
|                 Byte[] iconBuffer = ExtractFromZip(zipFile, "icon.png"); |                 Byte[] iconBuffer = ExtractFromZip(zipFile, "icon.png"); | ||||||
|                 Byte[] confBuffer = ExtractFromZip(zipFile, "config.xml"); |                 Byte[] confBuffer = ExtractFromZip(zipFile, "config.toml"); | ||||||
|                 LoadIcon(iconBuffer); |                 LoadIcon(iconBuffer); | ||||||
|                 LoadConfig(confBuffer); |                 LoadConfig(confBuffer); | ||||||
|             } |             } | ||||||
|  | @ -115,7 +117,7 @@ namespace ScrapModLoader | ||||||
|         { |         { | ||||||
|             ZipEntry? entry = zip[entry_path]; |             ZipEntry? entry = zip[entry_path]; | ||||||
|             if (entry == null) |             if (entry == null) | ||||||
|                 throw new FileFormatException($"No '{entry}' in {Name} found"); |                 throw new FileFormatException($"No '{entry_path}' in {Name} found"); | ||||||
| 
 | 
 | ||||||
|             Byte[] buffer = new Byte[entry.UncompressedSize]; |             Byte[] buffer = new Byte[entry.UncompressedSize]; | ||||||
|             using (MemoryStream zipStream = new MemoryStream(buffer)) |             using (MemoryStream zipStream = new MemoryStream(buffer)) | ||||||
|  | @ -138,63 +140,53 @@ namespace ScrapModLoader | ||||||
|         private void LoadConfig(Byte[] buffer) |         private void LoadConfig(Byte[] buffer) | ||||||
|         { |         { | ||||||
|             using (MemoryStream sourceStream = new MemoryStream(buffer)) |             using (MemoryStream sourceStream = new MemoryStream(buffer)) | ||||||
|  |             using (StreamReader reader = new StreamReader(sourceStream)) | ||||||
|             { |             { | ||||||
|                 XmlDocument xmlDocument = new XmlDocument(); |                 TomlTable config = TOML.Parse(reader); | ||||||
|                 xmlDocument.Load(sourceStream); |  | ||||||
|                 ParseModInfoFromXml(xmlDocument); |  | ||||||
|                 ParseAuthorsFromXml(xmlDocument); |  | ||||||
|                 ParseCreditsFromXml(xmlDocument); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 | 
 | ||||||
|         private void ParseModInfoFromXml(XmlDocument xmlDocument) |                 CheckConfig(config); | ||||||
|         { |  | ||||||
|             Description = xmlDocument.GetElementsByTagName("Description").Item(0)?.InnerText ?? |  | ||||||
|                                     throw new FileFormatException("No 'Description' tag in 'config.xml'"); |  | ||||||
|             Category = xmlDocument.GetElementsByTagName("Category").Item(0)?.InnerText ?? |  | ||||||
|                                     throw new FileFormatException("No 'Category' tag in 'config.xml'"); |  | ||||||
|             Version = xmlDocument.GetElementsByTagName("Version").Item(0)?.InnerText ?? |  | ||||||
|                                     throw new FileFormatException("No 'Version' tag in 'config.xml'"); |  | ||||||
|             RequiredLauncher = xmlDocument.GetElementsByTagName("RequiredLauncher").Item(0)?.InnerText ?? |  | ||||||
|                                     throw new FileFormatException("No 'RequiredLauncher' tag in 'config.xml'"); |  | ||||||
|             RequiredGame = xmlDocument.GetElementsByTagName("RequiredGame").Item(0)?.InnerText ?? |  | ||||||
|                                     throw new FileFormatException("No 'RequiredGame' tag in 'config.xml'"); |  | ||||||
|         } |  | ||||||
| 
 | 
 | ||||||
|         private void ParseAuthorsFromXml(XmlDocument xmlDocument) |                 Name = config["title"]; | ||||||
|         { |                 Description = config["description"]; | ||||||
|             XmlNodeList authors = xmlDocument.GetElementsByTagName("Author"); |                 Category = config["category"]; | ||||||
|             foreach (XmlNode author in authors) |                 Version = config["version"]; | ||||||
|             { |                 RequiredLauncher = config["requiredLauncher"]; | ||||||
|                 XmlAttribute? nameAttr = author.Attributes?["name"]; |                 RequiredGame = config["requiredGame"]; | ||||||
|                 if (nameAttr == null) |  | ||||||
|                     throw new FileFormatException("No 'name' attribute in 'Author' tag in 'config.xml'"); |  | ||||||
|                 Authors.Add(nameAttr.InnerText); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 | 
 | ||||||
|         private void ParseCreditsFromXml(XmlDocument xmlDocument) |                 foreach (TomlNode author in config["authors"]) | ||||||
|         { |                     Authors.Add(author["name"]); | ||||||
|             XmlNodeList credits = xmlDocument.GetElementsByTagName("Credits"); | 
 | ||||||
|             foreach (XmlNode credit in credits) |                 foreach (TomlNode credit in config["credits"]) | ||||||
|                 { |                 { | ||||||
|                     List<String> entries = new List<String>(); |                     List<String> entries = new List<String>(); | ||||||
| 
 | 
 | ||||||
|                 XmlAttribute? groupAttr = credit.Attributes?["group"]; |                     foreach (TomlNode entry in credit["credits"]) | ||||||
|                 if (groupAttr == null) |                         entries.Add(entry["name"]); | ||||||
|                     throw new FileFormatException("No 'group' attribute in 'Credits' tag in 'config.xml'"); |  | ||||||
| 
 | 
 | ||||||
|                 foreach (XmlNode entry in credit) |                     Credits.Add(credit["group"], entries); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private static void CheckConfig(TomlTable config) | ||||||
|         { |         { | ||||||
|                     XmlAttribute? nameAttr = entry.Attributes?["name"]; |             if (!config.HasKey("title")) | ||||||
|                     if (nameAttr == null) |                 throw new FileFormatException("No 'title' key in 'config.toml'"); | ||||||
|                         throw new FileFormatException("No 'name' attribute in 'Author' tag in 'config.xml'"); |  | ||||||
| 
 | 
 | ||||||
|                     entries.Add(nameAttr.InnerText); |             if (!config.HasKey("description")) | ||||||
|                 } |                 throw new FileFormatException("No 'description' key in 'config.toml'"); | ||||||
| 
 | 
 | ||||||
|                 Credits.Add(groupAttr.InnerText, entries); |             if (!config.HasKey("category")) | ||||||
|             } |                 throw new FileFormatException("No 'category' key in 'config.toml'"); | ||||||
|  | 
 | ||||||
|  |             if (!config.HasKey("version")) | ||||||
|  |                 throw new FileFormatException("No 'version' key in 'config.toml'"); | ||||||
|  | 
 | ||||||
|  |             if (!config.HasKey("requiredLauncher")) | ||||||
|  |                 throw new FileFormatException("No 'name' key in 'config.toml'"); | ||||||
|  | 
 | ||||||
|  |             if (!config.HasKey("requiredGame")) | ||||||
|  |                 throw new FileFormatException("No 'requiredGame' key in 'config.toml'"); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -16,6 +16,7 @@ | ||||||
| 
 | 
 | ||||||
|     <ItemGroup> |     <ItemGroup> | ||||||
|       <PackageReference Include="DotNetZip" Version="1.16.0" /> |       <PackageReference Include="DotNetZip" Version="1.16.0" /> | ||||||
|  |       <PackageReference Include="Tommy" Version="3.1.2" /> | ||||||
|     </ItemGroup> |     </ItemGroup> | ||||||
| 
 | 
 | ||||||
|     <ItemGroup> |     <ItemGroup> | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue