Editing Modding Tutorials/XML file structure

Jump to navigation Jump to search

Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.

Latest revision Your text
Line 64: Line 64:
 
</Def>
 
</Def>
 
</Defs></source><br/>
 
</Defs></source><br/>
 
===Syntax and Keywords===
 
 
You have surely noticed that some of the words in the XML files seem to be used repeatedly. Take note of the words '''Abstract''', '''Name''', and '''Class'''. These words are called keywords and they make up part of the languages syntax. A word that is given the role of keyword implies that it has an intended purpose and it's use is reserved only as a keyword. For this reason, there are some rules you should be aware of as the breaking of these rules is a common cause for bugs and errors when starting out.<br/>
 
 
When you write a keyword, it should be written exactly the same each time it's used. A common mistake is to unintentionally use a different casing. '''abstract''' is NOT the same as '''Abstract''' when it comes to the '''Abstract''' keyword and making that mistake will cause issues.<br/>
 
 
In general, you should avoid using a keyword as a property when editing or creating a new '''<Def>'''. It's almost certain that doing so will lead to problems so you're better off avoiding using a keyword outside of it's intended purpose as a keyword.<br/>
 
  
 
=Inheritance=
 
=Inheritance=
Line 78: Line 70:
  
 
'''Note that after update A15, abstracts have been directly inheritable from the core and from other mods. Redefining the core abstracts is common cause for mod compatibility issues, because any mod loaded after the abstract has been redefined will use the modified version instead of the core. Therefore, when defining abstracts for a mod, it's advisable to try to avoid overwriting the core abstracts and to instead use unique names that are unlikely to be accidentally used by other mods.'''
 
'''Note that after update A15, abstracts have been directly inheritable from the core and from other mods. Redefining the core abstracts is common cause for mod compatibility issues, because any mod loaded after the abstract has been redefined will use the modified version instead of the core. Therefore, when defining abstracts for a mod, it's advisable to try to avoid overwriting the core abstracts and to instead use unique names that are unlikely to be accidentally used by other mods.'''
 +
 +
Note that you can stop a child inheriting a specific tag's content by specifying ''Inherit="False"'' in the tag, like so:
 +
<source lang="xml">    <weaponTags Inherit="False">
 +
      <li>SniperRifle</li>
 +
    </weaponTags></source>
 +
The above example would only have ''SniperRifle'' as a weaponTag, none of the parent's weaponTags. This is particularly useful for lists.
  
 
===Basegun ThingDef===
 
===Basegun ThingDef===
  
The first thing in ''ThingDefs_Misc\Weapons\BaseWeapons.xml'' is a '''<ThingDef>''' with a Name and Abstract ''type'':<br/>
+
The first thing in ''Weapons_Guns.xml'' is a '''<ThingDef>''' with a Name and Abstract ''type'':<br/>
<source lang="xml"><ThingDef Abstract="True" Name="BaseWeapon"></source><br/>
+
<source lang="xml"><ThingDef Name="BaseGun" Abstract="True"></source><br/>
  
The Abstract type means that contents of this '''<ThingDef>''' will not be loaded into the game, that after reading and processing the information in this tag it (the game) will finish reading the XML files and '''discard''' this tag and its contents, leaving alone (not discarding) anything that might have copied (taken, inherited) the contents of it. All of this is done with this tag:<br/>
+
The Abstract type means that contents of this '''<ThingDef>''' will not be loaded into the game, that after reading and processing the information in this tag it (the game) will finish reading the XML file ('''entire mod folder as of Alpha 13''') and '''discard''' this tag and its contents, leaving alone (not discarding) anything that might have copied (taken, inherited) the contents of it. All of this is done with this tag:<br/>
 
<source lang="xml"><ThingDef Abstract="True"></source><br/>
 
<source lang="xml"><ThingDef Abstract="True"></source><br/>
  
So what that means is that all the ''contents'' of <code lang="xml"><ThingDef Abstract="True" Name="BaseWeapon"></code> can be used over and over in the various guns, but '''BaseWeapon''' itself does not exist in the game - it's an abstract idea!<br/>
+
So what that means is that all the ''contents'' of <code lang="xml"><ThingDef Name="BaseGun" Abstract="True"></code> can be used over and over in the various guns, but '''BaseGun''' itself does not exist in the game - it's an abstract idea!<br/>
  
 
The Name type means the contents of this '''<ThingDef>''' can be ''inherited'' by (read: copied by) another '''<ThingDef>'''. This way you can write everything you're going to repeat a lot throughout the file in a single location, such as the following:<br/>
 
The Name type means the contents of this '''<ThingDef>''' can be ''inherited'' by (read: copied by) another '''<ThingDef>'''. This way you can write everything you're going to repeat a lot throughout the file in a single location, such as the following:<br/>
Line 93: Line 91:
  
 
Which notifies that this '''<ThingDef>''' is of the ''Item'' category, as opposed to those of the ''Building'' category. Because there's a lot of ''tags'' repeated throughout every thing, this greatly compacts the XML file.<br/>
 
Which notifies that this '''<ThingDef>''' is of the ''Item'' category, as opposed to those of the ''Building'' category. Because there's a lot of ''tags'' repeated throughout every thing, this greatly compacts the XML file.<br/>
The full BaseWeapon parent only has to be defined once in a file, and can then be inherited (copied) with:<br/>
+
The full BaseGun parent only has to be defined once in a file, and can then be inherited (copied) with:<br/>
<source lang="xml"><ThingDef ParentName="BaseWeapon"></source><br/><br/>
+
<source lang="xml"><ThingDef ParentName="BaseGun"></source><br/><br/>
  
 
'''<ThingDef ParentName="Parent">''' inherits all contents from '''<ThingDef Name="Parent">'''. <br/>
 
'''<ThingDef ParentName="Parent">''' inherits all contents from '''<ThingDef Name="Parent">'''. <br/>
Line 100: Line 98:
 
<source lang="xml"><useHitPoints>False</useHitPoints></source><br/>
 
<source lang="xml"><useHitPoints>False</useHitPoints></source><br/>
  
The next '''<ThingDef>''' in the file is one with the Name type ''BaseGun'' and the ParentName type ''BaseWeapon''. It inherits the contents of BaseWeapon and is inherited by everything with '''<ThingDef ParentName="BaseGun">''':<br/>
+
The last '''<ThingDef>''' on top of the file is one with the Name type ''BaseHumanGun'' and the ParentName type ''BaseGun''. It inherits the contents of BaseGun and is inherited by everything with '''<ThingDef ParentName="BaseHumanGun">''':<br/>
<source lang="xml"><ThingDef Name="BaseGun" Abstract="True" ParentName="BaseWeapon"></source><br/><br/>
+
<source lang="xml"><ThingDef Name="BaseHumanGun" ParentName="BaseGun" Abstract="True"></source><br/><br/>
 
 
It might help to think of each ''<ThingDef Name ="...">'' as a sort of template. BaseWeapon contains the basic information which is true for all weapons: they can be hauled, equipped, selected. BaseGun contains the information which is true for all guns: they're part of the WeaponsRanged category, they can be smelted, they can have art. BaseMakeableGun in turn contains info to make the gun.
 
  
 
A list representation of how inheritance works in Rimworld's XML might help you out, either early on or to collect your thoughts after reading the above.<br/><br/>
 
A list representation of how inheritance works in Rimworld's XML might help you out, either early on or to collect your thoughts after reading the above.<br/><br/>
Line 117: Line 113:
 
##* All interfering content from parents is now overwritten
 
##* All interfering content from parents is now overwritten
 
## Now that all <Def>s know their contents, ABSTRACT type defs are discarded and therefore ignored by the game
 
## Now that all <Def>s know their contents, ABSTRACT type defs are discarded and therefore ignored by the game
## All <Def>s and their contents finish loading
+
## All <Def>s and their contents finish loading
 
# Game finishes loading mods<br/><br/>
 
# Game finishes loading mods<br/><br/>
  
 
===Breakdown===
 
===Breakdown===
{| class="wikitable"
 
|-
 
! What you write !! What the game sees
 
|-
 
| <source lang="xml"><ThingDef Name="BaseGun" Abstract="True">
 
    <exampleTagOne>true</exampleTagOne>
 
</ThingDef>
 
  
<ThingDef Name="BaseHumanGun" ParentName="BaseGun" Abstract="True">
+
Let's break down the inheritance chunks of the BaseGun code:<br/>
    <someOtherTag>12</someOtherTag>
+
<source lang="xml"><ThingDef Name="BaseGun" Abstract="True">
</ThingDef>
 
</source>|| <source lang="xml"><ThingDef Name="BaseGun" Abstract="True">
 
    <exampleTagOne>true</exampleTagOne>
 
 
</ThingDef>
 
</ThingDef>
  
 
<ThingDef Name="BaseHumanGun" ParentName="BaseGun" Abstract="True">
 
<ThingDef Name="BaseHumanGun" ParentName="BaseGun" Abstract="True">
    <exampleTagOne>true</exampleTagOne>
 
    <someOtherTag>12</someOtherTag>
 
 
</ThingDef>
 
</ThingDef>
</source>
 
|}
 
  
 +
<ThingDef Name="BaseBullet" Abstract="True">
 +
</ThingDef></source>
  
 
{| class="wikitable"
 
{| class="wikitable"
Line 175: Line 159:
 
* '''<Defs>''' is the rootnode and this uniformity is enforced.
 
* '''<Defs>''' is the rootnode and this uniformity is enforced.
 
* '''<Def>''' has to have a specific name, matching a Type in C#.
 
* '''<Def>''' has to have a specific name, matching a Type in C#.
 
===Stopping inheritance===
 
There are cases where you don't want your child to use the values specified in the parent. You can tell your child not to inherit the content from its parent's tag by specifying ''Inherit="False"'' in the child's tag, like this example taken from the SniperRifle:
 
<source lang="xml">
 
<weaponTags Inherit="False">
 
  <li>SniperRifle</li>
 
</weaponTags></source>
 
The above example would only have ''SniperRifle'' as a weaponTag, none of the parent's weaponTags. This is particularly useful for lists, because lists add to the parent whereas other tags overwrite.
 
 
The advantage of this is that you can leave the parent intact and still inherit from it, but let the child select which properties to inherit.
 
 
====Example====
 
<source lang ="xml">
 
<ThingDef Name="ThingOne" Abstract="True">
 
  <comps>
 
    <li Class = "CompOne">
 
      <valueA>1</valueA>
 
    </li>
 
  </comps>
 
</ThingDef>
 
 
<ThingDef ParentName="ThingOne">
 
  <comps Inherit= "False"> <!-- This here means "don't use the comps from the parent -->
 
    <li Class = "CompOne"> <!-- since we just removed all comps from the parent, we gotta re-add them -->
 
      <valueA>2</valueA>  <!-- but we can use our own values! -->
 
    </li>
 
  </comps>
 
</ThingDef>
 
</source>
 
  
 
=Next up=
 
=Next up=

Please note that all contributions to RimWorld Wiki are considered to be released under the CC BY-SA 3.0 (see RimWorld Wiki:Copyrights for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource. Do not submit copyrighted work without permission!

Cancel Editing help (opens in new window)

Template used on this page: