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 1: | Line 1: | ||
− | |||
− | |||
− | |||
− | |||
− | |||
=What you'll learn= | =What you'll learn= | ||
Line 24: | Line 19: | ||
===Standard defs=== | ===Standard defs=== | ||
− | Find a Def .xml file in the Core folder, for example | + | Find a Def .xml file in the Core folder, for example thingDefs/Weapons_Guns.xml:<br/> |
Core/ | Core/ | ||
Defs/ | Defs/ | ||
− | + | ThingDefs/ | |
Weapons_Guns.xml | Weapons_Guns.xml | ||
− | <source lang="xml">../Mods/Core/Defs/ | + | <source lang="xml">../Mods/Core/Defs/ThingDefs/Weapons_Guns.xml</source><br/> |
The first thing in this file is the following line:<br/> | The first thing in this file is the following line:<br/> | ||
Line 49: | Line 44: | ||
</Defs></source><br/> | </Defs></source><br/> | ||
− | Each '''<Def>''' contains something's ''def'' (or definition), which can be used to specify each and every modifiable property, e.g for a certain ''thing'' ( | + | Each '''<Def>''' contains something's ''def'' (or definition), which can be used to specify each and every modifiable property, e.g for a certain ''thing'' (thingDef).<br/> |
+ | |||
+ | ===Differences in defs=== | ||
+ | |||
+ | If you look through some .xml files, you'll find the code is inconsistent in the use of some defs;<br/> | ||
+ | |||
+ | Several ''Buildings_**.xml'' files use the '''<Buildings>''' tag instead of the '''<Defs>''' one. They then proceed to use '''<thingDef>''''s inside the '''<Buildings>''' tag.<br/> | ||
+ | Other ''Buildings_**.xml'' files use '''<Defs>''' instead of '''<ThingDefs>''', and some even use '''<GameData>''' instead of '''<ThingDefs>'''.<br/> | ||
+ | |||
+ | This implies that the name of the beginning and ending tags isn't important. Rimworld doesn't read their names, it just looks whether they exist.<br/><br/> | ||
+ | |||
+ | This '''doesn't''' mean that '''<Def>''' tags are interchangeable. Using "<Def>" will break the game; you will have to specify what C# class will be loaded to parse its contents.<br/><br/> | ||
===Full code=== | ===Full code=== | ||
Line 64: | Line 70: | ||
</Def> | </Def> | ||
</Defs></source><br/> | </Defs></source><br/> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
=Inheritance= | =Inheritance= | ||
+ | ===Basegun thingDef=== | ||
− | '' | + | The first thing in ''Weapons_Guns.xml'' is a '''<thingDef>''' with a Name and Abstract ''type'':<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 file 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 '''< | ||
<source lang="xml"><ThingDef Abstract="True"></source><br/> | <source lang="xml"><ThingDef Abstract="True"></source><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 '''< | ||
<source lang="xml"><category>Item</category></source><br/> | <source lang="xml"><category>Item</category></source><br/> | ||
− | Which notifies that this '''< | + | 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 | + | 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=" | + | <source lang="xml"><ThingDef ParentName="BaseGun"></source><br/><br/> |
− | '''< | + | '''<thingDef ParentName="Parent">''' inherits all contents from '''<thingDef Name="Parent">'''. It is common practice to copy the vanilla BaseGun parent and paste it on top of a mod's Weapons_Guns.xml file.<br/> |
Another parent is BaseBullet which holds every standard bullet's commonly repeated properties, such as the property that bullets don't use hitpoints:<br/> | Another parent is BaseBullet which holds every standard bullet's commonly repeated properties, such as the property that bullets don't use hitpoints:<br/> | ||
<source lang="xml"><useHitPoints>False</useHitPoints></source><br/> | <source lang="xml"><useHitPoints>False</useHitPoints></source><br/> | ||
− | The | + | 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 | + | <source lang="xml"><ThingDef Name="BaseHumanGun" ParentName="BaseGun" Abstract="True"></source><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/> | 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/> | ||
# Game launches | # Game launches | ||
− | # Game loads | + | # Game loads XML files: |
## Inheritance information is taken from each tag | ## Inheritance information is taken from each tag | ||
## Anything with a PARENTNAME type inherits (read: copies) and applies all content from its associated NAME type | ## Anything with a PARENTNAME type inherits (read: copies) and applies all content from its associated NAME type | ||
Line 114: | Line 103: | ||
##* Anything that sends it is a parent | ##* Anything that sends it is a parent | ||
##* It's possible to be both of these | ##* It's possible to be both of these | ||
− | ## Content information (read: everything between the < | + | ## Content information (read: everything between the <thingDef>) is taken and applied for each tag |
##* 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 | + | # Game finishes loading XML files<br/><br/> |
===Breakdown=== | ===Breakdown=== | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | Let's break down the inheritance chunks of the BaseGun code:<br/> | |
− | + | <source lang="xml"><thingDef Name="BaseGun" Abstract="True"> | |
− | </ | + | </thingDef> |
− | |||
− | |||
− | </ | ||
− | < | + | <thingDef Name="BaseHumanGun" ParentName="BaseGun" Abstract="True"> |
− | + | </thingDef> | |
− | |||
− | |||
− | |||
− | |||
+ | <thingDef Name="BaseBullet" Abstract="True"> | ||
+ | </thingDef></source> | ||
{| class="wikitable" | {| class="wikitable" | ||
!colspan="2"|<ThingDef Name="BaseGun" Abstract="True"> | !colspan="2"|<ThingDef Name="BaseGun" Abstract="True"> | ||
|- | |- | ||
− | | < | + | | <thingDef> || The name of this ''tag'', which is read by the game and processed into a correct definition based on this name.<br/>All tags in ''../Mods/Core/Defs/ThingDefs/'' use the '''<thingDef>''' tag. |
|- | |- | ||
| Name="BaseGun" || The Name ''type'' of this tag. This tag is a parent with the Name value of "BaseGun". | | Name="BaseGun" || The Name ''type'' of this tag. This tag is a parent with the Name value of "BaseGun". | ||
|- | |- | ||
− | | Abstract="True" || The [https://en.wikipedia.org/wiki/Abstract_type Abstract type] of this tag is True.<br/>This makes it so that the contents of this tag aren't ''instantiated'', which in practice means the contents of it can only be inherited by other tags and won't be loaded into the game because its only purpose is in inheritance, in being a parent.<br/><br/>"Is the only use of this '''< | + | | Abstract="True" || The [https://en.wikipedia.org/wiki/Abstract_type Abstract type] of this tag is True.<br/>This makes it so that the contents of this tag aren't ''instantiated'', which in practice means the contents of it can only be inherited by other tags and won't be loaded into the game because its only purpose is in inheritance, in being a parent.<br/><br/>"Is the only use of this '''<thingDef>''' to be inherited from? Yes: add Abstract="True". No: don't." |
|- | |- | ||
!colspan="2"|<ThingDef Name="BaseHumanGun" ParentName="BaseGun" Abstract="True"> | !colspan="2"|<ThingDef Name="BaseHumanGun" ParentName="BaseGun" Abstract="True"> | ||
Line 173: | Line 150: | ||
</Defs></source><br/> | </Defs></source><br/> | ||
− | * '''<Defs>''' | + | * '''<Defs>''' can have any name you want; |
− | * '''<Def>''' has to have a specific name | + | * '''<Def>''' has to have a specific name. |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
=Next up= | =Next up= | ||
− | * [[Modding Tutorials/Weapons Guns|Weapons_Guns.xml]] continues explanations on the BaseGun parent, the tags inside its '''< | + | * [[Modding Tutorials/Weapons Guns|Weapons_Guns.xml]] continues explanations on the BaseGun parent, the tags inside its '''<thingDef>''''s and further information on modding in weaponry. |
[[Category:Modding tutorials]] | [[Category:Modding tutorials]] |