[1.0](WIP) What The Hack?! - Mechanoid hacking

Started by Roolo, May 31, 2018, 04:03:57 PM

Previous topic - Next topic

Roolo

Quote from: rawrfisher on August 11, 2018, 05:53:25 PM
I'm used to a 1x3 version of the bench from the hi tech facilities mod but its not compatible with the current unstable
As for how misc robots plays with this mod the haulers chase my builder bot around trying to load it with parts lol

It's odd the mechs from that mod can be loaded with parts. You should only be able to load parts on a mech when it has a repair module installed. Are you also able to load parts on vanilla mechs without any repair module installed?

rawrfisher

Yes.  I didnt think anything of it at first either.  Anything that is a mechanoid can have parts loaded into it.  Was able to do it before having any research at all.
Professional jerk
Want something broken let me know

Roolo

Quote from: rawrfisher on August 11, 2018, 06:19:19 PM
Yes.  I didnt think anything of it at first either.  Anything that is a mechanoid can have parts loaded into it.  Was able to do it before having any research at all.

I'll take a look at it when I'm home. That's definitely not how it should work. Might be a mod conflict.

rawrfisher

#198
Gonna try getting an output log for ya but the thing keeps either timing out or throwing out of memory errors

Gonna do some toying around on my end to see if I can address issues with memory usage

XML Verse.ThingDef defines the same field twice: comps.

Field contents: 40.010.0WTH_MechanoidPartstruetrue10.0.

Whole XML:

<ThingDef ParentName="RPP_Bot_I" Class="AIRobot.X2_ThingDef_AIRobot"><thingClass>AIRobot.X2_AIRobot</thingClass><category>Pawn</category><selectable>true</selectable><tickerType>Normal</tickerType><altitudeLayer>Pawn</altitudeLayer><useHitPoints>false</useHitPoints><hasTooltip>true</hasTooltip><soundImpactDefault>BulletImpact_Metal</soundImpactDefault><statBases><Flammability>1.0</Flammability><LeatherAmount>0</LeatherAmount><PsychicSensitivity>0</PsychicSensitivity><ToxicSensitivity>0</ToxicSensitivity><Mass>15</Mass><ComfyTemperatureMin>-110</ComfyTemperatureMin><ComfyTemperatureMax>110</ComfyTemperatureMax><MeatAmount>0</MeatAmount><MarketValue>850</MarketValue><MoveSpeed>3.00</MoveSpeed></statBases><inspectorTabs><li>ITab_Pawn_Health</li><li>ITab_Pawn_Needs</li><li>ITab_Pawn_Gear</li><!--
<li>ITab_Pawn_Character</li>
<li>ITab_Pawn_Training</li>
<li>ITab_Pawn_Guest</li>
<li>ITab_Pawn_Prisoner</li>
<li>ITab_Pawn_Social</li>
--></inspectorTabs><comps><li><compClass>CompAttachBase</compClass></li></comps><drawGUIOverlay>true</drawGUIOverlay><race><thinkTreeMain>X2_AIRobot</thinkTreeMain><thinkTreeConstant>X2_AIRobotConstant</thinkTreeConstant><fleshType>Mechanoid</fleshType><!-- <foodType>OmnivoreRoughAnimal</foodType> --><foodType>None</foodType><intelligence>ToolUser</intelligence><makesFootprints>false</makesFootprints><nameCategory>HumanStandard</nameCategory><wildness>0.1</wildness><mateMtbHours>0</mateMtbHours><ageGenerationCurve><points><li>(0,100)</li><li>(1,50)</li><li>(5,50)</li><li>(20,0)</li></points></ageGenerationCurve><lifeExpectancy>5</lifeExpectancy><lifeStageAges><li><def>MechanoidFullyFormed</def><minAge>0</minAge><soundWounded>Pawn_Mech_Centipede_Wounded</soundWounded><soundDeath>Pawn_Mech_Centipede_Death</soundDeath><soundCall>Pawn_Mech_Centipede_Call</soundCall></li></lifeStageAges><soundMeleeHitPawn>Pawn_Melee_MechanoidBash_HitPawn</soundMeleeHitPawn><soundMeleeHitBuilding>Pawn_Melee_MechanoidBash_HitBuilding</soundMeleeHitBuilding><soundMeleeMiss>Pawn_Melee_MechanoidBash_Miss</soundMeleeMiss><body>AIRobot</body><baseBodySize>0.6</baseBodySize><baseHungerRate>0.5</baseHungerRate><baseHealthScale>0.6</baseHealthScale></race><tools><li><label>left manipulator</label><capacities><li>Blunt</li></capacities><power>4</power><cooldownTime>1.6</cooldownTime><linkedBodyPartsGroup>LeftHand</linkedBodyPartsGroup><chanceFactor>1.0</chanceFactor></li><li><label>right manipulator</label><capacities><li>Cut</li></capacities><power>4</power><cooldownTime>1.6</cooldownTime><linkedBodyPartsGroup>RightHand</linkedBodyPartsGroup><chanceFactor>0.8</chanceFactor></li><li><label>head</label><capacities><li>Blunt</li></capacities><power>3</power><cooldownTime>2.5</cooldownTime><linkedBodyPartsGroup>HeadAttackTool</linkedBodyPartsGroup><ensureLinkedBodyPartsGroupAlwaysUsable>true</ensureLinkedBodyPartsGroupAlwaysUsable><chanceFactor>0.2</chanceFactor></li></tools><recipes><li>WTH_HackMechanoid</li><li>WTH_ImplantAI</li><li>WTH_HackLocomotion</li><li>WTH_ShutDownMechanoid</li><li>WTH_RepairModule</li></recipes><comps><li Class="CompProperties_Refuelable"><fuelConsumptionRate>40.0</fuelConsumptionRate><fuelCapacity>10.0</fuelCapacity><fuelFilter><thingDefs><li>WTH_MechanoidParts</li></thingDefs></fuelFilter><consumeFuelOnlyWhenUsed>true</consumeFuelOnlyWhenUsed><targetFuelLevelConfigurable>true</targetFuelLevelConfigurable><initialConfigurableTargetFuelLevel>10.0</initialConfigurableTargetFuelLevel></li></comps><uiIconPath>Things/Pawn/Humanlike/UI/IconHuman</uiIconPath><verbs><li><verbClass>Verb_MeleeAttackDamage</verbClass><defaultCooldownTime>1.45</defaultCooldownTime><meleeDamageBaseAmount>1</meleeDamageBaseAmount><meleeDamageDef>Blunt</meleeDamageDef><linkedBodyPartsGroup>LeftHand</linkedBodyPartsGroup></li></verbs><allowLearning>false</allowLearning><robotSkills><li><skillDef>Medicine</skillDef><level>4</level><passion>Minor</passion></li><li><skillDef>Cooking</skillDef><level>4</level><passion>Minor</passion></li><li><skillDef>Plants</skillDef><level>4</level><passion>Minor</passion></li><li><skillDef>Construction</skillDef><level>4</level><passion>Minor</passion></li><li><skillDef>Mining</skillDef><level>4</level><passion>Minor</passion></li><li><skillDef>Crafting</skillDef><level>4</level><passion>Minor</passion></li><li><skillDef>Social</skillDef><level>4</level><passion>Minor</passion></li></robotSkills><defName>RPP_Bot_Crafter_I</defName><label>Crafter Bot</label><description>A Tier 1 amateur-class unit capable of smithing, tailoring, and crafting.</description><robotWorkTypes><li><workTypeDef>Smithing</workTypeDef><priority>1</priority></li><li><workTypeDef>Tailoring</workTypeDef><priority>3</priority></li><li><workTypeDef>Crafting</workTypeDef><priority>2</priority></li></robotWorkTypes><destroyedDef>RPP_Bot_Crafter_I_disabled</destroyedDef></ThingDef>
Verse.Log:Error(String, Boolean) (at C:\Dev\RimWorld\Assets\Scripts\Verse\Utility\Debug\Log\Log.cs:78)
Verse.DirectXmlToObject:ObjectFromXml(XmlNode, Boolean) (at C:\Dev\RimWorld\Assets\Scripts\Verse\SaveLoad\DirectXml\DirectXmlToObject.cs:210)
System.Reflection.MonoMethod:InternalInvoke(Object, Object[], Exception&)
System.Reflection.MonoMethod:Invoke(Object, BindingFlags, Binder, Object[], CultureInfo) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Reflection/MonoMethod.cs:222)
System.Reflection.MethodBase:Invoke(Object, Object[]) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Reflection/MethodBase.cs:115)
Verse.DirectXmlLoader:DefFromNode(XmlNode, LoadableXmlAsset) (at C:\Dev\RimWorld\Assets\Scripts\Verse\SaveLoad\DirectXml\DirectXmlLoader.cs:123)
Verse.LoadedModManager:ParseAndProcessXML(XmlDocument, Dictionary`2) (at C:\Dev\RimWorld\Assets\Scripts\Verse\Mods\LoadedModManager.cs:235)
Verse.LoadedModManager:LoadAllActiveMods() (at C:\Dev\RimWorld\Assets\Scripts\Verse\Mods\LoadedModManager.cs:51)
Verse.PlayDataLoader:DoPlayLoad() (at C:\Dev\RimWorld\Assets\Scripts\Verse\Defs\Databases\PlayDataLoader.cs:92)
Verse.PlayDataLoader:LoadAllPlayData(Boolean) (at C:\Dev\RimWorld\Assets\Scripts\Verse\Defs\Databases\PlayDataLoader.cs:32)
Verse.Root:<Start>m__1() (at C:\Dev\RimWorld\Assets\Scripts\Verse\Global\Root\Root.cs:58)
Verse.LongEventHandler:RunEventFromAnotherThread(Action) (at C:\Dev\RimWorld\Assets\Scripts\Verse\Global\LongEventHandler.cs:455)
Verse.LongEventHandler:<UpdateCurrentAsynchronousEvent>m__1() (at C:\Dev\RimWorld\Assets\Scripts\Verse\Global\LongEventHandler.cs:367)


Spams log on reboot
Each instance is related to misc robots
Professional jerk
Want something broken let me know

Roolo

Quote from: rawrfisher on August 11, 2018, 07:01:03 PM
Gonna try getting an output log for ya but the thing keeps either timing out or throwing out of memory errors

Gonna do some toying around on my end to see if I can address issues with memory usage

XML Verse.ThingDef defines the same field twice: comps.

Field contents: 40.010.0WTH_MechanoidPartstruetrue10.0.

Whole XML:

<ThingDef ParentName="RPP_Bot_I" Class="AIRobot.X2_ThingDef_AIRobot"><thingClass>AIRobot.X2_AIRobot</thingClass><category>Pawn</category><selectable>true</selectable><tickerType>Normal</tickerType><altitudeLayer>Pawn</altitudeLayer><useHitPoints>false</useHitPoints><hasTooltip>true</hasTooltip><soundImpactDefault>BulletImpact_Metal</soundImpactDefault><statBases><Flammability>1.0</Flammability><LeatherAmount>0</LeatherAmount><PsychicSensitivity>0</PsychicSensitivity><ToxicSensitivity>0</ToxicSensitivity><Mass>15</Mass><ComfyTemperatureMin>-110</ComfyTemperatureMin><ComfyTemperatureMax>110</ComfyTemperatureMax><MeatAmount>0</MeatAmount><MarketValue>850</MarketValue><MoveSpeed>3.00</MoveSpeed></statBases><inspectorTabs><li>ITab_Pawn_Health</li><li>ITab_Pawn_Needs</li><li>ITab_Pawn_Gear</li><!--
<li>ITab_Pawn_Character</li>
<li>ITab_Pawn_Training</li>
<li>ITab_Pawn_Guest</li>
<li>ITab_Pawn_Prisoner</li>
<li>ITab_Pawn_Social</li>
--></inspectorTabs><comps><li><compClass>CompAttachBase</compClass></li></comps><drawGUIOverlay>true</drawGUIOverlay><race><thinkTreeMain>X2_AIRobot</thinkTreeMain><thinkTreeConstant>X2_AIRobotConstant</thinkTreeConstant><fleshType>Mechanoid</fleshType><!-- <foodType>OmnivoreRoughAnimal</foodType> --><foodType>None</foodType><intelligence>ToolUser</intelligence><makesFootprints>false</makesFootprints><nameCategory>HumanStandard</nameCategory><wildness>0.1</wildness><mateMtbHours>0</mateMtbHours><ageGenerationCurve><points><li>(0,100)</li><li>(1,50)</li><li>(5,50)</li><li>(20,0)</li></points></ageGenerationCurve><lifeExpectancy>5</lifeExpectancy><lifeStageAges><li><def>MechanoidFullyFormed</def><minAge>0</minAge><soundWounded>Pawn_Mech_Centipede_Wounded</soundWounded><soundDeath>Pawn_Mech_Centipede_Death</soundDeath><soundCall>Pawn_Mech_Centipede_Call</soundCall></li></lifeStageAges><soundMeleeHitPawn>Pawn_Melee_MechanoidBash_HitPawn</soundMeleeHitPawn><soundMeleeHitBuilding>Pawn_Melee_MechanoidBash_HitBuilding</soundMeleeHitBuilding><soundMeleeMiss>Pawn_Melee_MechanoidBash_Miss</soundMeleeMiss><body>AIRobot</body><baseBodySize>0.6</baseBodySize><baseHungerRate>0.5</baseHungerRate><baseHealthScale>0.6</baseHealthScale></race><tools><li><label>left manipulator</label><capacities><li>Blunt</li></capacities><power>4</power><cooldownTime>1.6</cooldownTime><linkedBodyPartsGroup>LeftHand</linkedBodyPartsGroup><chanceFactor>1.0</chanceFactor></li><li><label>right manipulator</label><capacities><li>Cut</li></capacities><power>4</power><cooldownTime>1.6</cooldownTime><linkedBodyPartsGroup>RightHand</linkedBodyPartsGroup><chanceFactor>0.8</chanceFactor></li><li><label>head</label><capacities><li>Blunt</li></capacities><power>3</power><cooldownTime>2.5</cooldownTime><linkedBodyPartsGroup>HeadAttackTool</linkedBodyPartsGroup><ensureLinkedBodyPartsGroupAlwaysUsable>true</ensureLinkedBodyPartsGroupAlwaysUsable><chanceFactor>0.2</chanceFactor></li></tools><recipes><li>WTH_HackMechanoid</li><li>WTH_ImplantAI</li><li>WTH_HackLocomotion</li><li>WTH_ShutDownMechanoid</li><li>WTH_RepairModule</li></recipes><comps><li Class="CompProperties_Refuelable"><fuelConsumptionRate>40.0</fuelConsumptionRate><fuelCapacity>10.0</fuelCapacity><fuelFilter><thingDefs><li>WTH_MechanoidParts</li></thingDefs></fuelFilter><consumeFuelOnlyWhenUsed>true</consumeFuelOnlyWhenUsed><targetFuelLevelConfigurable>true</targetFuelLevelConfigurable><initialConfigurableTargetFuelLevel>10.0</initialConfigurableTargetFuelLevel></li></comps><uiIconPath>Things/Pawn/Humanlike/UI/IconHuman</uiIconPath><verbs><li><verbClass>Verb_MeleeAttackDamage</verbClass><defaultCooldownTime>1.45</defaultCooldownTime><meleeDamageBaseAmount>1</meleeDamageBaseAmount><meleeDamageDef>Blunt</meleeDamageDef><linkedBodyPartsGroup>LeftHand</linkedBodyPartsGroup></li></verbs><allowLearning>false</allowLearning><robotSkills><li><skillDef>Medicine</skillDef><level>4</level><passion>Minor</passion></li><li><skillDef>Cooking</skillDef><level>4</level><passion>Minor</passion></li><li><skillDef>Plants</skillDef><level>4</level><passion>Minor</passion></li><li><skillDef>Construction</skillDef><level>4</level><passion>Minor</passion></li><li><skillDef>Mining</skillDef><level>4</level><passion>Minor</passion></li><li><skillDef>Crafting</skillDef><level>4</level><passion>Minor</passion></li><li><skillDef>Social</skillDef><level>4</level><passion>Minor</passion></li></robotSkills><defName>RPP_Bot_Crafter_I</defName><label>Crafter Bot</label><description>A Tier 1 amateur-class unit capable of smithing, tailoring, and crafting.</description><robotWorkTypes><li><workTypeDef>Smithing</workTypeDef><priority>1</priority></li><li><workTypeDef>Tailoring</workTypeDef><priority>3</priority></li><li><workTypeDef>Crafting</workTypeDef><priority>2</priority></li></robotWorkTypes><destroyedDef>RPP_Bot_Crafter_I_disabled</destroyedDef></ThingDef>
Verse.Log:Error(String, Boolean) (at C:\Dev\RimWorld\Assets\Scripts\Verse\Utility\Debug\Log\Log.cs:78)
Verse.DirectXmlToObject:ObjectFromXml(XmlNode, Boolean) (at C:\Dev\RimWorld\Assets\Scripts\Verse\SaveLoad\DirectXml\DirectXmlToObject.cs:210)
System.Reflection.MonoMethod:InternalInvoke(Object, Object[], Exception&)
System.Reflection.MonoMethod:Invoke(Object, BindingFlags, Binder, Object[], CultureInfo) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Reflection/MonoMethod.cs:222)
System.Reflection.MethodBase:Invoke(Object, Object[]) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Reflection/MethodBase.cs:115)
Verse.DirectXmlLoader:DefFromNode(XmlNode, LoadableXmlAsset) (at C:\Dev\RimWorld\Assets\Scripts\Verse\SaveLoad\DirectXml\DirectXmlLoader.cs:123)
Verse.LoadedModManager:ParseAndProcessXML(XmlDocument, Dictionary`2) (at C:\Dev\RimWorld\Assets\Scripts\Verse\Mods\LoadedModManager.cs:235)
Verse.LoadedModManager:LoadAllActiveMods() (at C:\Dev\RimWorld\Assets\Scripts\Verse\Mods\LoadedModManager.cs:51)
Verse.PlayDataLoader:DoPlayLoad() (at C:\Dev\RimWorld\Assets\Scripts\Verse\Defs\Databases\PlayDataLoader.cs:92)
Verse.PlayDataLoader:LoadAllPlayData(Boolean) (at C:\Dev\RimWorld\Assets\Scripts\Verse\Defs\Databases\PlayDataLoader.cs:32)
Verse.Root:<Start>m__1() (at C:\Dev\RimWorld\Assets\Scripts\Verse\Global\Root\Root.cs:58)
Verse.LongEventHandler:RunEventFromAnotherThread(Action) (at C:\Dev\RimWorld\Assets\Scripts\Verse\Global\LongEventHandler.cs:455)
Verse.LongEventHandler:<UpdateCurrentAsynchronousEvent>m__1() (at C:\Dev\RimWorld\Assets\Scripts\Verse\Global\LongEventHandler.cs:367)


Spams log on reboot
Each instance is related to misc robots

Ok there we have the conflict. Its because both what the hack and misc bots try to make mechs potentially refuelable. I'll make sure it's fixed the next update.

Roolo

@Madman666. I just realized I didn't mention that the bench where you create upgrades doesn't need to be as big as the hacking table, as no mechs need to be placed on it. So 3x1 will probably be fine, and anything bigger could annoy the player because of how much space it needs then. I'm sorry I only realized this after you created the first version of the sprite.

Umbreon117

Quote from: Roolo on August 12, 2018, 04:12:02 AM
@Madman666. I just realized I didn't mention that the bench where you create upgrades doesn't need to be as big as the hacking table, as no mechs need to be placed on it. So 3x1 will probably be fine, and anything bigger could annoy the player because of how much space it needs then. I'm sorry I only realized this after you created the first version of the sprite.
To be fair, it probably wouldn't look too bad if it was just shrunk down to a 1x3 size.
I'll shoot your colonists...After a long nap.

rawrfisher

On the note of the hacking table I cant rotate it -_-
Professional jerk
Want something broken let me know

Roolo

Update:


- Fixed problem resulting in every mech requiring mechanoid parts to be loaded.
- Fixed conflict with Misc robots.
- Reorganized research tree + added repair arm research.
- Added unfinished repair arm mech upgrade, which can be used to transfer mechanoids charged by the repair module, healing them. See notes below.

Both the repair arm and the repair module are still in a very rough and not well tested state. I recommend not using them yet, unless you're really curious. Normally I don't push things that are that unfinished, but I was a bit short on time, and wanted to get those fixes out.

Quote from: Umbreon117 on August 12, 2018, 07:53:00 AM
Quote from: Roolo on August 12, 2018, 04:12:02 AM
@Madman666. I just realized I didn't mention that the bench where you create upgrades doesn't need to be as big as the hacking table, as no mechs need to be placed on it. So 3x1 will probably be fine, and anything bigger could annoy the player because of how much space it needs then. I'm sorry I only realized this after you created the first version of the sprite.
To be fair, it probably wouldn't look too bad if it was just shrunk down to a 1x3 size.

Well, the larger dimensions are 3x5, which isn't the same dimension ratio as 1x3, so things will look stretched if you just resize it.

Quote from: rawrfisher on August 12, 2018, 10:32:44 AM
On the note of the hacking table I cant rotate it -_-

Like I said before, new sprites are needed for this. malistaticy may be working on them though, so maybe rotation is possible in the near future.

Madman666

Kay, it needs to be 3x1 tile sized, got it. Don't sweat it, that you didn't warn me in time - i am doing it out of interest, curiosity and for training, so it will be useful to me either way. I guess i'll just remake it anew.

rawrfisher

Roolo if you have a chance next update can you remove those debug logs lol  They make it a nightmare to find error logs
Professional jerk
Want something broken let me know

Roolo

Quote from: rawrfisher on August 12, 2018, 12:33:11 PM
Roolo if you have a chance next update can you remove those debug logs lol  They make it a nightmare to find error logs

Just removed them. If you redownload now they should be gone.

rawrfisher

#207
Any word on compatability with gunner's mod?
Professional jerk
Want something broken let me know

Roolo

#208
Update:

- Fixed problem with newly spawned mechs being refuelable with parts without having a repair module installed
- Fixed problem with parts loaded into a repair module not being loaded from saves properly.
- Added "activating ability job", this makes sure abilities cannot be activated instantly, and makes sure pawns walk to one another when it is required for the ability.
- Both repair and self repair abilities use the newly added job type.
- Repair can now only be applied to pawns with damage.
- Refactored mech operation code. Operations with dependencies on other operations are now possible. 
- Repair arms can now only be installed on mechs with a repair module (made possible with the previous point).


Both the repair module and the repair arms are much more polished now. They probably still need some minor tweaking but you can try them out without problems now. 

Quote from: rawrfisher on August 12, 2018, 01:00:00 PM
Any word on compatability with gunner's mod?

I'll look into that soon. The other things had higher priority.

rawrfisher

#209
I wonder whats stronger.  10 centipides or 2 of that explosive auto cannon mech from the gunners mod

TryMakePreToilReservations() returned false for a non-queued job right after StartJob(). This should have been checked before. curJob=WTH_CarryToHackingTable (Job_1769439) A=Thing_Mech_Scyther263126
Verse.Log:Warning(String, Boolean) (at C:\Dev\RimWorld\Assets\Scripts\Verse\Utility\Debug\Log\Log.cs:59)
Verse.AI.Pawn_JobTracker:StartJob(Job, JobCondition, ThinkNode, Boolean, Boolean, ThinkTreeDef, Nullable`1, Boolean) (at C:\Dev\RimWorld\Assets\Scripts\Verse\AI\Pawn_JobTracker.cs:322)
Verse.AI.Pawn_JobTracker:TryFindAndStartJob() (at C:\Dev\RimWorld\Assets\Scripts\Verse\AI\Pawn_JobTracker.cs:521)
Verse.AI.Pawn_JobTracker:EndCurrentJob(JobCondition, Boolean) (at C:\Dev\RimWorld\Assets\Scripts\Verse\AI\Pawn_JobTracker.cs:393)
Verse.AI.Pawn_JobTracker:JobTrackerTick() (at C:\Dev\RimWorld\Assets\Scripts\Verse\AI\Pawn_JobTracker.cs:120)
Verse.Pawn:Tick_Patch1(Object)
Verse.TickList:Tick() (at C:\Dev\RimWorld\Assets\Scripts\Verse\Game\Ticking\TickList.cs:125)
Verse.TickManager:DoSingleTick() (at C:\Dev\RimWorld\Assets\Scripts\Verse\Game\Ticking\TickManager.cs:303)
Verse.TickManager:TickManagerUpdate() (at C:\Dev\RimWorld\Assets\Scripts\Verse\Game\Ticking\TickManager.cs:267)
Verse.Game:UpdatePlay() (at C:\Dev\RimWorld\Assets\Scripts\Verse\Game\Game.cs:512)
Verse.Root_Play:Update() (at C:\Dev\RimWorld\Assets\Scripts\Verse\Global\Root\Root_Play.cs:99)

lol Yellow text spamming log while haulers act like statues
Professional jerk
Want something broken let me know