Module:Test/data
Transformation rules
RimWorld version
Version is added to the beginning of each generated Lua table.
return { version = "1.2.2753", ...
Elements with attributes
Create a new subelement and move all of the attributes to their own subelements within it.
*Def elements
<defName> is used as part of the index for the main Def table.
Additional attributes added: "DLC", "FileName".
<ThingDef ParentName="BaseHare"> <defName>Snowhare</defName> <label>snowhare</label> ...
transforms to:
["ThingDef:Hare"] = { ["_attrib_"] = { ["ParentName"] = "BaseHare", ["FileName"] = "Races_Animal_Hares.xml", ["DLC"] = "Core", }, ["defName"] = "Snowhare", ["label"] = "snowhare", ...
Parent (abstract) Def:
<ThingDef Abstract="True" ParentName="AnimalThingBase" Name="BaseHare"> <statBases> <MoveSpeed>6.0</MoveSpeed> <MarketValue>50</MarketValue> ...
transforms to:
["ThingDef:BaseHare"] = { ["_attrib_"] = { ["Abstract"] = "True", ["ParentName"] = "AnimalThingBase", ["Name"] = "BaseHare", ["FileName"] = "Races_Animal_Hares.xml", ["DLC"] = "Core", }, ["statBases"] = { ["MoveSpeed"] = 6.0, ["MarketValue"] = 50, ...
List elements without children
Get transformed into ordered lists (numerically indexed Lua tables).
<tradeTags> <li>AnimalUncommon</li> <li>AnimalFighter</li> </tradeTags>
transforms to:
["tradeTags"] = { "AnimalUncommon", "AnimalFighter", },
Note: a comma after the last item in a list is not flagged as an error in Lua.
List elements with children
<lifeStageAges> <li> <def>AnimalBaby</def> <minAge>0</minAge> </li> <li> <def>AnimalJuvenile</def> <minAge>0.25</minAge> </li> <li> <def>AnimalAdult</def> <minAge>0.5</minAge> </li> </lifeStageAges>
transforms to:
["lifeStageAges"] = { { ["def"] = "AnimalBaby", ["minAge"] = 0, }, { ["def"] = "AnimalJuvenile", ["minAge"] = 0.25, }, { ["def"] = "AnimalAdult", ["minAge"] = 0.5, }, },
List elements with a single attribute Class
The value of the "Class" attribute is used to rename the <li>.
<comps> <li Class="CompProperties_Glower"> <glowRadius>10</glowRadius> ...
transforms to:
comps = { CompProperties_Glower = { glowRadius = 10, ...
Components
It would be useful to have some of the more used components. They can then be queried for additional functionality that some game objects have.
They can be numbered tables or, as in some of the examples above, string indexed. String indexes, in general, are simpler to use. Numeric tables I have to search through.
See #List elements with a single attribute Class
Ranges (1~2)
<overdoseSeverityOffset>0.18~0.35</overdoseSeverityOffset>
transforms to:
overdoseSeverityOffset = { ["<"]=0.18, [">"]=0.35 },
Curve points
Curves pop up in a lot of places so additional support functions for those might be in order.
Min, max, maybe average... things like that. Some (like litterSizeCurve) have a fixed amount of points (correction: even for litterSizeCurve this is not true) so you could just retrieve the first one or last (fourth), but this is not the case for all of them and is a bit ugly. Whatever the case, additional processing with wiki syntax would have to be used. This is bad (and to be avoided if possible).
<litterSizeCurve> <points> <li>(1.0, 0)</li> <li>(1.5, 1)</li> <li>(2.0, 1)</li> <li>(2.5, 0)</li> </points>
transforms to:
["litterSizeCurve"] = { ["points"] = { {0.5, 0}, {1, 1}, {1.5, 1}, {2.0, 0}, }, },
Descriptions
Because of some exceptions in Royalty Defs, <description> content has to be wrapped in double square brackets (Lua multiline syntax).
MayRequire attribute
Removed.
Issues
One (data) file to rule them all
One data file or smaller ones split by categories (buildings, races, items, etc.).
Single:
- simplicity
- versioning
- uploading
Split:
- dynamic loading
Inheritance (interaction with parser)
Inheritance can be handled by the parser or the module. If the parser handles it, then for any change the dataset needs to be recreated so I'm leaning towards letting the module take care of that. In this case the only purpose of the parser is to filter data and transform it into something Lua can use.
TODO
- Implement filtering for components (any list item that follows the same pattern)
-- inserting inheritence parents into children seems a bit redundant but -- simplifies Lua code and keeps everything under one roof return { ["Hare"] = { ["label"] = "hare", ["description"] = "This small, solitary herbivore can swiftly hop away from danger.", -- "BaseHare" ["statBases"] = { ["MoveSpeed"] = 6.0, ["MarketValue"] = 50, ["ComfyTemperatureMin"] = -30, }, ["tools"] = { { ["capacities"] = { {"Bite"} }, ["power"] = 3.4, ["cooldownTime"] = 2, ["linkedBodyPartsGroup"] = "Teeth", }, { ["label"] = "head", ["capacities"] = { {"Blunt"} }, ["power"] = 1.5, ["cooldownTime"] = 2, ["linkedBodyPartsGroup"] = "HeadAttackTool", }, }, ["race"] = { ["body"] = "QuadrupedAnimalWithPawsAndTail", ["baseBodySize"] = 0.2, ["baseHungerRate"] = 0.23, ["baseHealthScale"] = 0.4, ["foodType"] = "VegetarianRoughAnimal", ["leatherDef"] = "Leather_Light", ["wildness"] = 0.75, ["trainability"] = "None", ["petness"] = 0.08, ["mateMtbHours"] = 8, ["nuzzleMtbHours"] = 36, ["gestationPeriodDays"] = 13, ["manhunterOnTameFailChance"] = 0, ["manhunterOnDamageChance"] = 0, --[[ problems: * order (none in Lua tables) * format (how to represent points) ["litterSizeCurve"] = { ["points"] = { {(1.0, 0)}, {(1.5, 1)}, {(2.0, 1)}, {(2.5, 0)}, }, }, ]]-- ["lifeExpectancy"] = 8, ["lifeStageAges"] = { { ["def"] = "AnimalBaby", ["minAge"] = 0, }, { ["def"] = "AnimalJuvenile", ["minAge"] = 0.1, }, { ["def"] = "AnimalAdult", ["minAge"] = 0.3, }, }, }, ["tradeTags"] = { {"AnimalCommon"}, }, -- this is a sample for testing so no further upward inheritance into Races_Animal_Base.xml }, ["Snowhare"] = { ["label"] = "snowhare", ["description"] = "This hardy animal survives the brutal winters of its homelands by burrowing through snow to find edible plants.", ["statBases"] = { ["ComfyTemperatureMin"] = -55, }, ["race"] = { ["useMeatFrom"] = "Hare", }, -- "BaseHare" ["statBases"] = { ["MoveSpeed"] = 6.0, ["MarketValue"] = 50, }, ["tools"] = { { ["capacities"] = { {"Bite"} }, ["power"] = 3.4, ["cooldownTime"] = 2, ["linkedBodyPartsGroup"] = "Teeth", }, { ["label"] = "head", ["capacities"] = { {"Blunt"} }, ["power"] = 1.5, ["cooldownTime"] = 2, ["linkedBodyPartsGroup"] = "HeadAttackTool", }, }, ["race"] = { ["body"] = "QuadrupedAnimalWithPawsAndTail", ["baseBodySize"] = 0.2, ["baseHungerRate"] = 0.23, ["baseHealthScale"] = 0.4, ["foodType"] = "VegetarianRoughAnimal", ["leatherDef"] = "Leather_Light", ["wildness"] = 0.75, ["trainability"] = "None", ["petness"] = 0.08, ["mateMtbHours"] = 8, ["nuzzleMtbHours"] = 36, ["gestationPeriodDays"] = 13, ["manhunterOnTameFailChance"] = 0, ["manhunterOnDamageChance"] = 0, --[[ problems: * order (none in Lua tables) * format (how to represent points) ["litterSizeCurve"] = { ["points"] = { {(1.0, 0)}, {(1.5, 1)}, {(2.0, 1)}, {(2.5, 0)}, }, }, ]]-- ["lifeExpectancy"] = 8, ["lifeStageAges"] = { { ["def"] = "AnimalBaby", ["minAge"] = 0, }, { ["def"] = "AnimalJuvenile", ["minAge"] = 0.1, }, { ["def"] = "AnimalAdult", ["minAge"] = 0.3, }, }, }, ["tradeTags"] = { {"AnimalCommon"}, }, }, }