PlotinusRedux
Warlord
- Joined
- Jul 11, 2013
- Messages
- 196
After looking at the example mods and DLC, examining Mods.sqlite, testing, and reviewing the main .exe disassembly, I think I've identified all the valid elements, etc., currently allowed in the .modinfo files.
Much of this information is already at least partially known, though some of it has been incomplete or incorrect. Many .modinfo files currently contain incorrect usage that doesn't harm anything but also does nothing, such as using a <Component> element under Settings\Custom\Items, which ignores anything but <File> elements.
Here is an XSD that can be used to validate .modinfo files with any XML schema validator--there's a free online one at http://www.utilities-online.info/xsdvalidation/ that's slow but works if you don't have another tool. There's a faster one at http://www.xmlforasp.net/SchemaValidator.aspx but it seemed to report incorrect line numbers for errors.
All example of a well formed .modinfo file correctly using all available elements:
And finally some useful SQL statements to run against the Mods.sqlite database to verify your mod's values really are getting into the system the way you want:
File versions can be downloaded from:
http://qskoz.com/Civ6/Civ6ModInfoSchema.xsd
http://qskoz.com/Civ6/Test.modinfo
http://qskoz.com/Civ6/ModInfo.sql
[Edit: Changed <ModArt> filetype to .dep]
[Edit: Update ARX comments to indicate it relates to the Logitech Arx app for showing game information on a phone]
[Edit: Updated for Winter patch:
*Added new <Icons> element;
*Updated description of <ModArt>
*Added <LoadOrder> property to <UpdateDatabase>
*Added <Icons> and <ModArt> to Settings, as they can appear under <Components> or <Settings>]
[Edit 1/5/17: Added <LoadOrder> to all components and updated its annotation.]
[Edit 1/24/17: If the optional "id" attribute is used for a component, it must start with a letter and contain no spaces, as it is sent directly to sqlite to create a save point.]
Much of this information is already at least partially known, though some of it has been incomplete or incorrect. Many .modinfo files currently contain incorrect usage that doesn't harm anything but also does nothing, such as using a <Component> element under Settings\Custom\Items, which ignores anything but <File> elements.
Here is an XSD that can be used to validate .modinfo files with any XML schema validator--there's a free online one at http://www.utilities-online.info/xsdvalidation/ that's slow but works if you don't have another tool. There's a faster one at http://www.xmlforasp.net/SchemaValidator.aspx but it seemed to report incorrect line numbers for errors.
Code:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:annotation>
<xs:documentation>
Unofficial schema for Civ 6 .modinfo files. Created by PlotinusRedux. Version 0.2 1/5/2016
</xs:documentation>
</xs:annotation>
<xs:complexType name="ModRelations">
<xs:sequence>
<xs:element name="Mod">
<xs:complexType>
<xs:attribute name="id" type="xs:string" use="required"/>
<xs:attribute name="title" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="ItemList">
<xs:sequence>
<xs:element name="File" minOccurs="1" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="Priority" type="xs:integer" default="0">
<xs:annotation>
<xs:documentation>Signed integer determining the load order of files within the component. Higher numbers load earlier.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="BaseComponent">
<xs:all>
<xs:element name="Properties" minOccurs="0">
<xs:complexType>
<xs:all>
<xs:element name="RuleSet" type="xs:string" minOccurs="0"/>
<xs:element name="LoadOrder" type="xs:integer" minOccurs="0">
<xs:annotation>
<xs:documentation>Signed integer determining component load order globally across mods. Lower numbers load earlier.</xs:documentation>
</xs:annotation>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
<xs:element name="Items" type="ItemList" minOccurs="1"/>
</xs:all>
<xs:attribute name="id" type="xs:string" default=""/>
</xs:complexType>
<xs:complexType name="ContextComponent">
<xs:all>
<xs:element name="Properties" minOccurs="0">
<xs:complexType>
<xs:all>
<xs:element name="RuleSet" type="xs:string" minOccurs="0"/>
<xs:element name="LoadOrder" type="xs:integer" minOccurs="0">
<xs:annotation>
<xs:documentation>Signed integer determining component load order globally across mods. Lower numbers load earlier.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="Context" type="xs:string" minOccurs="1">
<xs:annotation>
<xs:documentation>UI Context, like "InGame"</xs:documentation>
</xs:annotation>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
<xs:element name="Items" type="ItemList" minOccurs="1"/>
</xs:all>
<xs:attribute name="id" type="xs:string" default=""/>
</xs:complexType>
<xs:complexType name="BaseSetting">
<xs:all>
<xs:element name="Properties" minOccurs="0">
<xs:complexType>
<xs:all>
<xs:element name="LoadOrder" type="xs:integer" minOccurs="0">
<xs:annotation>
<xs:documentation>Signed integer determining component load order globally across mods. Lower numbers load earlier.</xs:documentation>
</xs:annotation>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
<xs:element name="Items" type="ItemList" minOccurs="1"/>
</xs:all>
<xs:attribute name="id" type="xs:string" default=""/>
</xs:complexType>
<xs:complexType name="MapSetting">
<xs:all>
<xs:element name="Properties" minOccurs="0">
<xs:complexType>
<xs:all>
<xs:element name="Group" type="xs:string" minOccurs="1"/>
<xs:element name="Name" type="xs:string" minOccurs="1"/>
<xs:element name="Description" type="xs:string" minOccurs="0"/>
</xs:all>
</xs:complexType>
</xs:element>
<xs:element name="Items" type="ItemList" minOccurs="1"/>
</xs:all>
<xs:attribute name="id" type="xs:string" default=""/>
</xs:complexType>
<xs:group name="Translations">
<xs:all>
<xs:element name="en_US" type="xs:string" minOccurs="0"/>
<xs:element name="fr_FR" type="xs:string" minOccurs="0"/>
<xs:element name="de_DE" type="xs:string" minOccurs="0"/>
<xs:element name="it_IT" type="xs:string" minOccurs="0"/>
<xs:element name="es_ES" type="xs:string" minOccurs="0"/>
<xs:element name="ja_JP" type="xs:string" minOccurs="0"/>
<xs:element name="ru_RU" type="xs:string" minOccurs="0"/>
<xs:element name="pl_PL" type="xs:string" minOccurs="0"/>
<xs:element name="ko_KR" type="xs:string" minOccurs="0"/>
<xs:element name="zh_Hant_HK" type="xs:string" minOccurs="0"/>
<xs:element name="zh_Hans_CN" type="xs:string" minOccurs="0"/>
<xs:element name="pt_BR" type="xs:string" minOccurs="0"/>
</xs:all>
</xs:group>
<xs:element name="Mod">
<xs:complexType>
<xs:all>
<xs:element name="Properties" minOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:any minOccurs="0" maxOccurs="unbounded" processContents="skip"/>
</xs:sequence>
<!--
<xs:all>
<xs:element name="Name" type="xs:string" minOccurs="1"/>
<xs:element name="Teaser" type="xs:string" minOccurs="1"/>
<xs:element name="Trusted" type="xs:string" minOccurs="0"/>
<xs:element name="ShowInBrowser" type="xs:string" minOccurs="0"/>
<xs:element name="DisabledAtStartup" type="xs:int" minOccurs="0"/>
<xs:element name="EnabledByDefault" type="xs:int" minOccurs="0"/>
<xs:element name="Stability" type="xs:string" minOccurs="0"/>
<xs:element name="Description" type="xs:string" minOccurs="0"/>
<xs:element name="Authors" type="xs:string" minOccurs="0"/>
<xs:element name="SpecialThanks" type="xs:string" minOccurs="0"/>
</xs:all>
-->
</xs:complexType>
</xs:element>
<xs:element name="References" type="ModRelations" minOccurs="0"/>
<xs:element name="Dependencies" type="ModRelations" minOccurs="0"/>
<xs:element name="Blocks" type="ModRelations" minOccurs="0"/>
<xs:element name="Files" minOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="File" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Components" minOccurs="0">
<xs:annotation>
<xs:documentation>Items loaded when game first starts</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:choice minOccurs="1" maxOccurs="unbounded">
<xs:element name="UpdateDatabase" type="BaseComponent" minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>Updates to the main game database (DebugGameplay.sqlite). FileTypes: xml, sql</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="UpdateAudio" type="BaseComponent" minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>Adds audio files. FileTypes: ini, bnk, txt, xml</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="UpdateARX" type="BaseComponent" minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>Logitech ARX for displaying game info on a mobile device. FileTypes: html, etc.?</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="ModArt" type="BaseComponent" minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>.dep file that tells which new .artdef files to load. The .artdef files must have the same name as base artdefs, and aren't included in the .modinfo file at all, just the mod's directory. FileTypes: dep</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="UserInterface" type="ContextComponent" minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>New UI files. For each XXX.xml, an XXX.lua is implied FileTypes: xml</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="LocalizedText" type="BaseComponent" minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>In-game localized text. FileTypes: xml</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="GameplayScripts" type="BaseComponent" minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>Scripts that run in the main Lua context at the start of the game and on reloads. FileTypes: lua</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="ImportFiles" type="BaseComponent" minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>Overrides of files under the main Assets folder. FileTypes: xml, lua, *?</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="Icons" type="BaseComponent" minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>XML files to add icons to the game. FileTypes: xml</xs:documentation>
</xs:annotation>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
<xs:element name="Settings" minOccurs="0">
<xs:annotation>
<xs:documentation>Objects loaded on game set up</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:choice minOccurs="1" maxOccurs="unbounded">
<xs:element name="Custom" type="BaseSetting" minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>Updates to Configuration database (DebugConfiguration.sqlite). Some people are putting Component elements under Items here--they don't get read into the database. FileTypes: xml, sql</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="Map" type="MapSetting" minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>Custom map. FileTypes: Civ6Map</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="LocalizedText" type="BaseSetting" minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>Localized text for game setup screens. FileTypes: xml</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="WorldBuilder" type="BaseSetting" minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>Not sure, but presumably updates to the world builder tables. FileTypes: xml, sql?</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="Icons" type="BaseComponent" minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>XML files to add icons to the game that are needed for the game setup screens. FileTypes: xml</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="ModArt" type="BaseComponent" minOccurs="0" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>.dep file that tells which new .artdef files to load that are needed for the game setup screens. The .artdef files must have the same name as base artdefs, and aren't included in the .modinfo file at all, just the mod's directory. FileTypes: dep</xs:documentation>
</xs:annotation>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
<xs:element name="LocalizedText" minOccurs="0">
<xs:annotation>
<xs:documentation>Optional translations for text in .modinfo itself (mod/Properties and mod/Settings/Map/Properties)</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="Text" maxOccurs="unbounded">
<xs:complexType>
<xs:group ref="Translations"/>
<xs:attribute name="id" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:all>
<xs:attribute name="id" type="xs:string" use="required"/>
<xs:attribute name="version" type="xs:int" default="0"/>
</xs:complexType>
</xs:element>
</xs:schema>
All example of a well formed .modinfo file correctly using all available elements:
Code:
<?xml version="1.0" encoding="utf-8"?>
<Mod id="79a96bee-c555-45b4-ae34-5221c115ef92" version = "1">
<!--Localizable mod property text. Only Name and Description seem to be shown in game-->
<Properties>
<!--Required and displayed in game-->
<Name>LOC_NAME</Name>
<Teaser>LOC_TEASER</Teaser>
<!--Optional, really for Fixaris Use Only
<Trusted>1784197304</Trusted>
<ShowInBrowser>AlwaysHidden</ShowInBrowser>
<DisabledAtStartup>0</DisabledAtStartup>
<EnabledByDefault>0</EnabledByDefault>
-->
<!--Common but not used by game-->
<Stability>LOC_STABILITY</Stability>
<Description>LOC_DESCRIPTION</Description>
<Authors>LOC_AUTHORS</Authors>
<SpecialThanks>LOC_SPECIAL_THANKS</SpecialThanks>
</Properties>
<!--Referenced mods. This mod will load after referenced mods if both are enabled-->
<References>
<Mod id="79a96bee-c555-45b4-ae34-5221c115efa0" title="somemod0" />
</References>
<!--Required mods-->
<Dependencies>
<Mod id="79a96bee-c555-45b4-ae34-5221c115efa2" title="somemod2" />
</Dependencies>
<!--Incompatible mods.-->
<Blocks>
<Mod id="79a96bee-c555-45b4-ae34-5221c115efa4" title="somemod4" />
</Blocks>
<!--List of all files used in the mod-->
<Files>
<File>SomeDatabaseUpdate1.xml</File>
<File>SomeDatabaseUpdate2.sql</File>
<File>SomeSound.wem</File>
<File>SomeIcon.pgn</File>
<File>SomeArtdef.artdef</File>
<File>SomeUI.xml</File>
<File>SomeUI.lua</File>
<File>SomeText.xml</File>
<File>SomeScript.lua</File>
<File>SomeFileOverride1.xml</File>
<File>SomeFileOverride2.lua</File>
<File>SomeConfigDatabaseUpdate1.xml</File>
<File>SomeConfigDatabaseUpdate2.sql</File>
<File>SomeMap.Civ6Map</File>
<File>SomeWorldbuilderFile.xml</File>
</Files>
<!--Objects loaded after the game starts-->
<Components>
<!--Updates to the main game database (DebugGameplay.sqlite)-->
<UpdateDatabase id="Arbitrary_UpdateDatabase">
<Properties>
<RuleSet>RULESET_SOME_RULESET</RuleSet>
<!--No idea what LoadOrder does, it's optional-->
<LoadOrder>100</LoadOrder>
</Properties>
<Items>
<File>SomeDatabaseUpdate1.xml</File>
<File Priority="2">SomeDatabaseUpdate2.sql</File>
</Items>
</UpdateDatabase>
<!--Some Audio thing, Wem files under Base/Platforms/Windows/Audio maybe?-->
<!--No idea how this would work with different platforms-->
<UpdateAudio id="Arbitrary_UpdateAudio">
<Properties>
<RuleSet>RULESET_SOME_RULESET</RuleSet>
</Properties>
<Items>
<File>SomeSound.wem</File>
</Items>
</UpdateAudio>
<!--Files related to Logitech ARX for view game info on mobile devices-->
<UpdateARX id="Arbitrary_UpdateARX">
<Properties>
<RuleSet>RULESET_SOME_RULESET</RuleSet>
</Properties>
<Items>
<File>SomeIcon.pgn</File>
</Items>
</UpdateARX>
<!--.dep file for .artdef files. The .artdef files themselves aren't included
in .modinfo at all, only in the mod's directory -->
<ModArt id="Arbitrary_UpdateModArt">
<Properties>
<RuleSet>RULESET_SOME_RULESET</RuleSet>
</Properties>
<Items>
<File>SomeArtdef.artdef</File>
</Items>
</ModArt>
<!--New UI files-->
<UserInterface id="Arbitrary_UserInterface">
<Properties>
<RuleSet>RULESET_SOME_RULESET</RuleSet>
<Context>InGame</Context>
</Properties>
<Items>
<File>SomeUI.xml</File>
<!--SomeUI.lua is implied-->
</Items>
</UserInterface>
<!--Localized Text-->
<LocalizedText id="Arbitrary_LocalizedText">
<Properties>
<RuleSet>RULESET_SOME_RULESET</RuleSet>
</Properties>
<Items>
<File>SomeText.xml</File>
</Items>
</LocalizedText>
<!--Scripts to run when the mod starts or reloads-->
<GameplayScripts id="Arbitrary_GameplayScripts">
<Properties>
<RuleSet>RULESET_SOME_RULESET</RuleSet>
</Properties>
<Items>
<File>SomeScript.lua</File>
</Items>
</GameplayScripts>
<!--Overrides of files under the main Assets folder-->
<ImportFiles id="Arbitrary_ImportFiles">
<Properties>
<RuleSet>RULESET_SOME_RULESET</RuleSet>
</Properties>
<Items>
<File>SomeFileOverride1.xml</File>
<File>SomeFileOverride2.lua</File>
</Items>
</ImportFiles>
<!--Adds icons-->
<Icons id="Arbitrary_Icons">
<Properties>
<RuleSet>RULESET_SOME_RULESET</RuleSet>
</Properties>
<Items>
<File>SomeIcons.xml</File>
</Items>
</Icons>
</Components>
<!--Objects loaded on game set up-->
<Settings>
<!--Updates to Configuration database (DebugConfiguration.sqlite)-->
<Custom id="Arbitrary_Custom">
<Items>
<!--Some peopler are putting <Component> tags here,-->
<!--But they're not even read into the Mods.sqlite database.-->
<File>SomeConfigDatabaseUpdate1.xml</File>
<File>SomeConfigDatabaseUpdate2.sql</File>
</Items>
</Custom>
<!--Custom map-->
<Map id="Arbitrary_Custom_Map">
<Properties>
<Group>Some_Map_Group</Group>
<Name>LOC_MAP_NAME1</Name>
<Description>LOC_MAP_DESCRIPTION1</Description>
</Properties>
<Items>
<File>SomeMap.Civ6Map</File>
</Items>
</Map>
<!-- Localized Text for configuration screens -->
<LocalizedText id="Arbitrary_LocalizedText2">
<Items>
<File>ConfigTextFile.xml</File>
</Items>
</LocalizedText>
<!--No real idea-->
<WorldBuilder id="Arbitrary_WorldBuilder">
<Items>
<File>SomeWorldbuilderFile.xml</File>
</Items>
</WorldBuilder>
<!--Adds icons needed during game set up-->
<Icons id="Arbitrary_Icons2">
<Items>
<File>SomeIcons.xml</File>
</Items>
</Icons>
<!--.dep file for .artdef files needed during game setup.
The .artdef files themselves aren't included
in .modinfo at all, only in the mod's directory -->
<ModArt id="Arbitrary_UpdateModArt2">
<Items>
<File>SomeArtdef.artdef</File>
</Items>
</ModArt>
</Settings>
<!--Localized text for values used in .modinfo itself-->
<!--Seems limited to Mod/Properties and Mod/Settings/Map/Properties-->
<LocalizedText>
<Text id="LOC_NAME">
<en_US>Mod Name</en_US>
</Text>
<Text id="LOC_STABILITY">
<en_US>Beta, etc.</en_US>
</Text>
<Text id="LOC_TEASER">
<en_US>Description Shown In Game</en_US>
</Text>
<Text id="LOC_DESCRIPTION">
<en_US>Full Description (Not Shown Anywhere)</en_US>
</Text>
<Text id="LOC_AUTHORS">
<en_US>Authors</en_US>
</Text>
<Text id="LOC_SPECIAL_THANKS">
<en_US>All the little people</en_US>
</Text>
<Text id="LOC_MAP_NAME1">
<en_US>Custom Map Name</en_US>
</Text>
<Text id="LOC_MAP_DESCRIPTION1">
<en_US>Custom Map Description</en_US>
</Text>
</LocalizedText>
</Mod>
And finally some useful SQL statements to run against the Mods.sqlite database to verify your mod's values really are getting into the system the way you want:
Code:
SELECT * FROM Mods WHERE ModId = "79a96bee-c555-45b4-ae34-5221c115ef92";
SELECT Name, Value, Locale, Text
FROM ModProperties mp
INNER JOIN Mods m on mp.ModRowId = m.ModRowId
LEFT OUTER JOIN LocalizedText l ON l.Tag = mp.Value
WHERE m.ModId = "79a96bee-c555-45b4-ae34-5221c115ef92"
ORDER BY Name;
SELECT ComponentType, ComponentId, Path, Priority
FROM ModFiles f
INNER JOIN ComponentFiles cf ON f.FileRowId = cf.FileRowId
INNER JOIN Components c ON cf.ComponentRowId = c.ComponentRowId
INNER JOIN Mods m on c.ModRowId = m.ModRowId
WHERE m.ModId = "79a96bee-c555-45b4-ae34-5221c115ef92"
ORDER BY ComponentType, ComponentId, Path;
SELECT ComponentType, ComponentId, Name, Value
FROM ComponentProperties cp
INNER JOIN Components c ON cp.ComponentRowId = c.ComponentRowId
INNER JOIN Mods m on c.ModRowId = m.ModRowId
WHERE m.ModId = "79a96bee-c555-45b4-ae34-5221c115ef92"
ORDER BY ComponentType, ComponentId, Name;
SELECT SettingType, SettingId, Path, Priority
FROM ModFiles f
INNER JOIN SettingFiles sf ON f.FileRowId = sf.FileRowId
INNER JOIN Settings s ON sf.SettingRowId = s.SettingRowId
INNER JOIN Mods m on s.ModRowId = m.ModRowId
WHERE m.ModId = "79a96bee-c555-45b4-ae34-5221c115ef92"
ORDER BY SettingType, SettingId, Path;
SELECT SettingType, SettingId, Name, Value, Locale, Text
FROM SettingProperties sp
INNER JOIN Settings s ON sp.SettingRowId = s.SettingRowId
INNER JOIN Mods m on s.ModRowId = m.ModRowId
LEFT OUTER JOIN LocalizedText l ON l.Tag = sp.Value
WHERE m.ModId = "79a96bee-c555-45b4-ae34-5221c115ef92"
ORDER BY SettingType, SettingId, Name;
SELECT OtherModId, OtherModTitle, Relationship
FROM ModRelationships r
INNER JOIN Mods m on r.ModRowId = m.ModRowId
WHERE m.ModId = "79a96bee-c555-45b4-ae34-5221c115ef92"
ORDER BY OtherModId, OtherModTitle;
File versions can be downloaded from:
http://qskoz.com/Civ6/Civ6ModInfoSchema.xsd
http://qskoz.com/Civ6/Test.modinfo
http://qskoz.com/Civ6/ModInfo.sql
[Edit: Changed <ModArt> filetype to .dep]
[Edit: Update ARX comments to indicate it relates to the Logitech Arx app for showing game information on a phone]
[Edit: Updated for Winter patch:
*Added new <Icons> element;
*Updated description of <ModArt>
*Added <LoadOrder> property to <UpdateDatabase>
*Added <Icons> and <ModArt> to Settings, as they can appear under <Components> or <Settings>]
[Edit 1/5/17: Added <LoadOrder> to all components and updated its annotation.]
[Edit 1/24/17: If the optional "id" attribute is used for a component, it must start with a letter and contain no spaces, as it is sent directly to sqlite to create a save point.]
Last edited: