[1.0] Rainbeau's Mods (Backstories, Fishing, Romance, Terraforming, and More!)

Started by dburgdorf, October 13, 2018, 02:54:55 PM

Previous topic - Next topic

Canute

The mod load order shouldn't matter in that case.
I think more, another mod interfere with that.
You should just test it out with only these 3 mods (+libaraies like hugslib) if you notice any difference.
If it work's perfect with only these 3 mods, you need to find out what other mod cause the problem.
Ok, i maybe see a small chance that Comman Sense can bite with Pawn's are Capable, even when i didn't notice any sofar.

whatsherwho

Thanks for the mod! Enjoying it.

Any chance to add in a smoothed concrete floor? Seems like there should be an option for a nicer-looking concrete floor, rather than the ugly or neutral choices the game offers. Is it just me who thinks concrete can be beautiful? Not a request, just a suggestion that I have no expectations for. Thank you for modding!

JT

I've made a couple tweaks to Rational Romance, which I heartily recommend incorporating into the official distribution.  I've tested it locally and it works wonderfully.

1) Nuked the stray "at < 0" devmode log warning, which cannot trigger during the vanilla game, but triggers frequently when using Children & Pregnancy and/or Atlas' Android Tiers.  Since outlanders and tribals can all generate children, this warning would appear frequently during world generation, during caravan arrivals, and during new game start when a child is included in the starting pawns, which is a source of annoyance when running dev mode.

2) Since DoesTargetPawnAcceptAdvance() duplicated the exact same conditions as IsTargetPawnFreeForHookup(), I simply converted the massive list of conditions to call IsTargetPawnFreeForHookup(), since I was editing that line anyway.  Much more concise and easier to maintain.

3) Corrected the silliness where two pawns would repeatedly try hooking up with each other and rejecting each other, literally standing in front of each other spamming hookup requests with each other.  ("I want to make love.  Want to make love to me?"  "No, but I want to make love.  Want to make love to me?"  "No, but I want to make love.  Want to make love to me?" ...Guys.  Seriously.  Figure it out.)  Now, if one has tried hooking up with the other within recent memory (2.5 minutes/9000 ticks), and the other now asks the first one to hook up, that will be interpreted as changing their mind, causing an auto-accept.

4) Similarly, if the target pawn is also on a hookup job when the first one asks, it will be auto-accepted.  Since it was easier than creating and navigating a massive cast-and-dereference chain to find out who the target pawn was actually trying to hook up with, I just assume that it's like a Tinder date and they're no longer concerned about who they hook up with, so long as the other pawn is at least barely appealing to them (>=10% attraction).  "He may not be Mr. Right, but he's Mr. Right Here and Mr. Right Now."

5) Introduces a cooldown to the hookup joygiver and job driver based on whether the target pawn has already said no.  It does so by scanning for the rebuffed-hookup thought and checking to see that the rebuff happened recently.  If so, that pawn is off limits and the job won't be produced at all for that pawn.  If, however, the thought still exists but is reasonably "old" (10800 ticks, or 3 minutes), they might try again.  This stops the worst cases where the pawn will try over and over and over again after every other job -- or even try non-stop -- to hook up, although it doesn't catch the rare edge case where the pawns are working on opposite sides of the map and will travel back and forth to try hooking up.  I chose 3 minutes after some careful thought: if much longer, the rebuff penalties and opinion penalties wouldn't be able to stack up; if only a little longer, the pawns will fall into joy deprivation too easily.

(The same cooldown tweak could also be applied to the date system, but I haven't yet had a colony with datespam that would work as a test case.  I have however had a colony with massive hookup spam. =P)

6) Finally, it makes joy-deprived pawns more likely to accept a hookup request, because if their joy is getting that low at all, romantic joy is probably their only option for entertainment.  A pawn with an Empty joy meter will auto-accept if attraction >= 10%, and a pawn with Low or Very Low joy will scale upward from equally likely at joy 30%, down to 3 times more likely at joy 10%, and 30 times more likely at joy 1% (which is why 0%/Empty is simply an auto-accept).

Source code file, with plenty of my irreverent humour.  Since the licence provided in About.xml only applies to modpacks, I'm not certain what my distribution rights are, so I'm sharing-alike the source code only for now.
udiff:
--- E:/Games/Rimworld/1.0/RF - Rational Romance/Source/Rainbeau's Rational Romance/MyClass.cs Thu Nov 15 18:44:20 2018
+++ E:/Games/Rimworld/Homemade/RationalRomance/HookupCooldown/MyClass.cs Thu Jun 27 05:12:45 2019
@@ -831,7 +831,7 @@
private static float MinPossibleAgeGapAtMinAgeToGenerateAsLovers(Pawn p1, Pawn p2) {
float ageChronologicalYearsFloat = p1.ageTracker.AgeChronologicalYearsFloat - 14f;
if (ageChronologicalYearsFloat < 0f) {
- Log.Warning("at < 0", false);
+ //Log.Warning("at < 0", false);
return 0f;
}
float single = PawnRelationUtility.MaxPossibleBioAgeAt(p2.ageTracker.AgeBiologicalYearsFloat, p2.ageTracker.AgeChronologicalYearsFloat, ageChronologicalYearsFloat);
@@ -1230,6 +1230,7 @@
public override bool TryMakePreToilReservations(bool errorOnFailed) {
return true;
}
+
public bool successfulPass = true;
public bool wasSuccessfulPass {
get { return this.successfulPass; }
@@ -1249,14 +1250,32 @@
private TargetIndex TargetBedIndex {
get { return TargetIndex.B; }
}
+
+ //NEW: If TargetPawn had just recently asked for a hookup (in last 2.5 minutes) and was rebuffed by the Actor,
+ // but the Actor is now asking the TargetPawn instead, that means the Actor changed theirmind and the
+ // TargetPawn will auto-accept (we can presume they still want a go if they asked so recently in reverse).
+ //The TargetPawn still keeps the rebuffed thought (the Actor shouldn't be such a !&$%ing tease).
private bool DoesTargetPawnAcceptAdvance() {
- return !PawnUtility.WillSoonHaveBasicNeed(this.TargetPawn) && !PawnUtility.EnemiesAreNearby(this.TargetPawn, 9, false) && this.TargetPawn.jobs.curJob.def != JobDefOf.LayDown && this.TargetPawn.jobs.curJob.def != JobDefOf.BeatFire && this.TargetPawn.jobs.curJob.def != JobDefOf.Arrest && this.TargetPawn.jobs.curJob.def != JobDefOf.Capture && this.TargetPawn.jobs.curJob.def != JobDefOf.EscortPrisonerToBed && this.TargetPawn.jobs.curJob.def != JobDefOf.ExtinguishSelf && this.TargetPawn.jobs.curJob.def != JobDefOf.FleeAndCower && this.TargetPawn.jobs.curJob.def != JobDefOf.MarryAdjacentPawn && this.TargetPawn.jobs.curJob.def != JobDefOf.PrisonerExecution && this.TargetPawn.jobs.curJob.def != JobDefOf.ReleasePrisoner && this.TargetPawn.jobs.curJob.def != JobDefOf.Rescue && this.TargetPawn.jobs.curJob.def != JobDefOf.SocialFight && this.TargetPawn.jobs.curJob.def != JobDefOf.SpectateCeremony && this.TargetPawn.jobs.curJob.def != JobDefOf.TakeToBedToOperate && this.TargetPawn.jobs.curJob.def != JobDefOf.TakeWoundedPrisonerToBed && this.TargetPawn.jobs.curJob.def != JobDefOf.UseCommsConsole && this.TargetPawn.jobs.curJob.def != JobDefOf.Vomit && this.TargetPawn.jobs.curJob.def != JobDefOf.Wait_Downed && SexualityUtilities.WillPawnTryHookup(this.TargetPawn) && SexualityUtilities.IsHookupAppealing(this.TargetPawn, base.GetActor());
+ return IsTargetPawnFreeForHookup() &&
+ SexualityUtilities.WillPawnTryHookup(this.TargetPawn) &&
+ (
+ SexualityUtilities.IsHookupAppealing(this.TargetPawn, base.GetActor()) ||
+ this.TargetPawn.needs.mood.thoughts.memories.Memories.Any(x => SexualityUtilities.IsRebuffedHookupThought(x, base.GetActor(), 9000))
+ );
}
private bool IsTargetPawnOkay() {
return !this.TargetPawn.Dead && !this.TargetPawn.Downed;
}
+
+ //NEW: Pawns now check to see if the other pawn rejected them recently (in last 3 minutes) before bothering
+ // to try again.  Should significantly curtail hookup spam, although there may be edge cases (jobs on both
+ // sides of the map, pawns keep running back and forth across the map to attempt a hookup).
+ private bool WasRebuffedByTargetPawn() {
+ if(actor.needs.mood.thoughts.memories.Memories.Any(x => SexualityUtilities.IsRebuffedHookupThought(x, this.TargetPawn, 10800))) return true;
+ return false;
+ }
private bool IsTargetPawnFreeForHookup() {
- return !PawnUtility.WillSoonHaveBasicNeed(this.TargetPawn) && !PawnUtility.EnemiesAreNearby(this.TargetPawn, 9, false) && this.TargetPawn.jobs.curJob.def != JobDefOf.LayDown && this.TargetPawn.jobs.curJob.def != JobDefOf.BeatFire && this.TargetPawn.jobs.curJob.def != JobDefOf.Arrest && this.TargetPawn.jobs.curJob.def != JobDefOf.Capture && this.TargetPawn.jobs.curJob.def != JobDefOf.EscortPrisonerToBed && this.TargetPawn.jobs.curJob.def != JobDefOf.ExtinguishSelf && this.TargetPawn.jobs.curJob.def != JobDefOf.FleeAndCower && this.TargetPawn.jobs.curJob.def != JobDefOf.MarryAdjacentPawn && this.TargetPawn.jobs.curJob.def != JobDefOf.PrisonerExecution && this.TargetPawn.jobs.curJob.def != JobDefOf.ReleasePrisoner && this.TargetPawn.jobs.curJob.def != JobDefOf.Rescue && this.TargetPawn.jobs.curJob.def != JobDefOf.SocialFight && this.TargetPawn.jobs.curJob.def != JobDefOf.SpectateCeremony && this.TargetPawn.jobs.curJob.def != JobDefOf.TakeToBedToOperate && this.TargetPawn.jobs.curJob.def != JobDefOf.TakeWoundedPrisonerToBed && this.TargetPawn.jobs.curJob.def != JobDefOf.UseCommsConsole && this.TargetPawn.jobs.curJob.def != JobDefOf.Vomit && this.TargetPawn.jobs.curJob.def != JobDefOf.Wait_Downed;
+ return !WasRebuffedByTargetPawn() && !PawnUtility.WillSoonHaveBasicNeed(this.TargetPawn) && !PawnUtility.EnemiesAreNearby(this.TargetPawn, 9, false) && this.TargetPawn.jobs.curJob.def != JobDefOf.LayDown && this.TargetPawn.jobs.curJob.def != JobDefOf.BeatFire && this.TargetPawn.jobs.curJob.def != JobDefOf.Arrest && this.TargetPawn.jobs.curJob.def != JobDefOf.Capture && this.TargetPawn.jobs.curJob.def != JobDefOf.EscortPrisonerToBed && this.TargetPawn.jobs.curJob.def != JobDefOf.ExtinguishSelf && this.TargetPawn.jobs.curJob.def != JobDefOf.FleeAndCower && this.TargetPawn.jobs.curJob.def != JobDefOf.MarryAdjacentPawn && this.TargetPawn.jobs.curJob.def != JobDefOf.PrisonerExecution && this.TargetPawn.jobs.curJob.def != JobDefOf.ReleasePrisoner && this.TargetPawn.jobs.curJob.def != JobDefOf.Rescue && this.TargetPawn.jobs.curJob.def != JobDefOf.SocialFight && this.TargetPawn.jobs.curJob.def != JobDefOf.SpectateCeremony && this.TargetPawn.jobs.curJob.def != JobDefOf.TakeToBedToOperate && this.TargetPawn.jobs.curJob.def != JobDefOf.TakeWoundedPrisonerToBed && this.TargetPawn.jobs.curJob.def != JobDefOf.UseCommsConsole && this.TargetPawn.jobs.curJob.def != JobDefOf.Vomit && this.TargetPawn.jobs.curJob.def != JobDefOf.Wait_Downed;
}
[DebuggerHidden]
protected override IEnumerable<Toil> MakeNewToils() {
@@ -1543,6 +1562,27 @@
}

public static class SexualityUtilities {
+ public static JobDef hookupJob = DefDatabase<JobDef>.GetNamed("TryHookup", false);
+
+ //NEW: Provides a spam-blocker on hookup attempts, preventing pawns from trying another hookup if they
+ // tried recently, and also allowing other pawns to try a reverse hookup attempt for auto-acceptance.
+ /// <summary>
+ /// Returns true if the checked thought is in fact a hookup-rebuff thought, and it falls within the specified age in ticks.  Intended to be used from lambda expressions that run on a pawn's memories.
+ /// </summary>
+ /// <param name="thought">The thought that we suspect is a <seealso cref="RRRThoughtDefOf.RebuffedMyHookupAttempt"/>.
+ /// Normally passed from a lambda expression/predicate (e.g., <seealso cref="JobDriver_LeadHookup.WasRebuffedByTargetPawn()"/>)</param>
+ /// <param name="rebuffer">The pawn who would have rebuffed the person who owns the thought.</param>
+ /// <param name="maxAgeInTicks">The oldest that the thought can be before it will be excluded from consideration.</param>
+ /// <returns>True if there is still an active "rebuff" in my recent memory, false otherwise.</returns>
+ public static bool IsRebuffedHookupThought(Thought_Memory thought, Pawn rebuffer, int maxAgeInTicks = int.MaxValue) {
+ if(thought.def.defName == RRRThoughtDefOf.RebuffedMyHookupAttempt.defName) {
+ Thought_MemorySocial rebuff = (Thought_MemorySocial)thought;
+ //Log.Message("DEBUG: rebuff.age =" + rebuff.age.ToString());
+ return (rebuff.otherPawn == rebuffer) && (rebuff.age <= maxAgeInTicks);
+ }
+ return false;
+ }
+
public static Pawn FindAttractivePawn(Pawn p1) {
Pawn result;
if (p1.story.traits.HasTrait(RRRTraitDefOf.Asexual)) {
@@ -1577,6 +1617,10 @@
else if ((double)p1.relations.SecondaryRomanceChanceFactor(pawn) < 0.05) {
result = null;
}
+ //NEW: If they've recently rebuffed me, I won't bother asking and will just find someone else (or nobody at all)
+ else if (p1.needs.mood.thoughts.memories.Memories.Any(x => SexualityUtilities.IsRebuffedHookupThought(x, pawn, 10800))) {
+ result = null;
+ }
else {
result = pawn;
}
@@ -1628,17 +1672,32 @@
return result;
}
public static bool IsHookupAppealing(Pawn pSubject, Pawn pObject) {
- bool result;
if (PawnUtility.WillSoonHaveBasicNeed(pSubject)) {
- result = false;
+ return false;
}
else {
float num = 0f;
num += pSubject.relations.SecondaryRomanceChanceFactor(pObject) / 1.5f;
num *= Mathf.InverseLerp(-100f, 0f, (float)pSubject.relations.OpinionOf(pObject));
- result = (Rand.Range(0.05f, 1f) < num);
+
+ //NEW: pawns who are needy will be more willing to accommodate a hookup request
+ if(0.10f < num) { //is there a snowball's chance in a mechanoid's inferno cannon I'd ever casually boink this person?
+ Need_Joy joy = (Need_Joy)pSubject.needs.TryGetNeed(NeedDefOf.Joy);
+ if(pSubject.CurJobDef == hookupJob) { //I'm already trying to find a Tinder date, but you're closer... sure
+ return true;
+ }
+ if(joy != null) {
+ if(joy.CurCategory == JoyCategory.Empty) { //I'm so incredibly bored that I'll do anything with two legs just to get a moment's thrill... sure
+ return true;
+ }
+ else if(joy.CurCategory <= JoyCategory.Low) { //I'm not incredibly bored, but I'm *pretty* bored...
+ //Although it would be possible to divide by zero with this formula, the possible range is by definition [0.01f, 0.3f) because of the auto-success at Empty joy
+ num /= Mathf.Lerp(0.0f, 0.3f, joy.CurLevel); //e.g., divides value by 1.0 (no change) at joy 0.3, divides value by 0.333 (+200%) at joy 0.10
+ }
+ }
+ }
+ return (Rand.Range(0.05f, 1f) < num);
}
- return result;
}
public static bool WillPawnTryHookup(Pawn p1) {
bool result;

notfood

Rainbeau, just letting you know that I made a fork of Pawns are Capable over here Source

I'll be waiting for any of your concerns then publish on steam if there is no issues.

JT

Just noticed this yesterday. More Than Capable/your fork solves the Prison Labor incompatibility -- I can now assign pawns to hated labour as before! Thanks notfood!

notfood

I'd like feedback about MoreThanCapable, people use it but they haven't said anything about the changes.

Schwartz

Small improvement I would like to see in Fertile Fields:

Constructing plowed soil has a decent chance of failure (possibly turning soil into rich soil as well? I didn't check). In my opinion, it shouldn't be able to fail. Mixing soil with fertilizer is about as simple as it gets, and for something like this where construction repeats every time a field is harvested and re-planted, it can get a bit annoying.

RicRider

Hey Rainbeau (or anyone who knows this),

I seem to have some load order issues regarding your Fishing mod. The escargot and the sushi (the one that looks like a simple meal but red) don't show up on the stove. I've been dumping the snails in the marsh where I got them since I don't know what to do with them :O

Now I suspected it was something to do with VGP or Expanded Crops (the Telkir one), but I've used these mods together before and never had an issue. I've not added any other mods that add cooking related items to my latest games. I played successfully with this mod combo as little as a month go. I've tried all possible load order combinations (Fishing after or before or even between what the hell) and still bills are not showing up in stove. No errors in dev mode or in log... I'm at a loss. I want my escargot!

Any help would be great.

(Edit: also the boiled shellfish is not there, I just got crayfish which went right next to the snails in the marsh and the trap got uninstalled -_-)
##Coding Scrub##

TC

I'm confused about how terraforming is supposed to work. I just researched the technology "Terraforming". The description of that technology says

    Sand, marsh, mud or shallow water, for example, can be turned into farmable land.
So, now that I've researched the technology, how do I turn marsh into farmable land? Among the tasks in the Architect / Terraform menu, there are no options that can be placed on marsh tiles.

-TC

Canute

You should look what you destination would be.
I guess, Soil.
Then you should look at the terraform for the soil one, click on it to see what terrain can be terraformed into soil.
Mosttimes you need to do 2 steps, like stony ground into sand first, then sand into soil.

TC


Pangaea

Quote from: dburgdorf on October 14, 2018, 05:56:24 PM
This mod adds a new storyteller, Rainbeau Flambe.

Rain shares Randy's love of the unpredictable, but tempers that love with a bit of Cassandra's storytelling flair. Still, he'll send big threats nearly as often as small ones. He seems to have a bit of a sadistic streak, and in any event, he has to keep his cat, Sabre, amused. He also likes to have a slightly larger cast of characters to work with than Cassandra does, and so will subtly encourage you to have more colonists.[/size]

A Note on Difficulty Levels:

Technically, Rain can be used at any difficulty setting, if only because there's no way to disable any of those settings. But as a matter of practicality, I wouldn't recommend trying to use him with "base builder" difficulty. Rain utilizes big threats as often as small ones, and tries to keep things going at a fair clip, while the "base builder" setting disables most big threats, and is intended to keep the game moving at a more leisurely pace. The inconsistency should be obvious.

This is intriguing. However, how does this storyteller compare with the difficulty of Cassandra Rough and Savage? Is it even more difficult, or somewhat more tolerable in the long run? Does "big threats as often as small ones" indicate even more chaos than in late game Cassandra?

E-102

#222
Quote from: dburgdorf on October 14, 2018, 05:49:38 PM


Last update: 12/05/2018

"Advanced Bridges," as the name so subtly suggests, allows you to build bridges which are, well, a bit more advanced than those available in vanilla RimWorld. (Well, technically, you could also create piers or even a boardwalk. It's really up to you.) All you need is wood, stone or metal. And a bit of extra steel for reinforcement if you're building over deep water. (Yes, this mod allows you to build bridges over deep water as well as over shallow water.)

Light bridges (built from wood) require no special research, and support light construction, so you can, for example, use a light bridge to run a power conduit across a river. Heavy bridges (those built from stone or metal) do require research, but will support heavy construction, so you can actually place walls on them.

NOTE: "Advanced Bridges" does not disable construction of default vanilla bridges, so you can actually use both types of bridges on your maps if you so desire. But you won't be able to build vanilla bridges over deep river water, and won't be able to place walls over them. (In other words, they'll function just like the mod's light bridges.)

- Rainbeau Flambe (dburgdorf)


Steam Workshop Link

Dropbox Link

Compatibility:

"Advanced Bridges" can safely be added to a game in progress, but if you try to remove it from a game in which you've actually built any bridges, you will of course make the map unplayable.

The mod should be compatible with any mods that add additional water tiles to the game, so long as those mods have assigned the "bridgeable" affordance to those water tiles.

There seem to be some issues when using "Advanced Bridges" together with Jec's "Doors Expanded." I haven't tracked down the cause yet, but if a boardwalk or bridge is built under a large door or gate, the door will (not always, but sometimes) stop working properly. Doors seem to work fine if built on top of existing bridges or boardwalks, though, so if you must build a large door on top of a bridge or boardwalk, make sure to place the bridge or boardwalk first. But to be perfectly safe, try to avoid putting such doors on bridges or boardwalks at all.

If you want to be able to catch fish from your bridges, you'll need to utilize an additional mod to add that capability. Obviously, I'd recommend my own "Fishing," though it's not the only option.

IMPORTANT NOTE: If you remove bridge tiles with dev tools, or "minify" them to move them (which isn't possible in vanilla, but might be thanks to other mods), you will end up with problematic "pseudo" terrain tiles on your map where the bridges used to be. Please don't do this! If you need to remove a bridge tile, deconstruct it properly!

Credits:

The code in "Advanced Bridges" borrows a bit from Sulusdacor's "[sd] Bridges" mod. And obviously, the mods are very similar on a conceptual level.

The traditional Chinese language files were provided by Steam user Alane. The simplified Chinese language translation files were provided by Steam user kghostSATORI. The Japanese language files were provided by Proxyer.

I can't seem to build walls on the heavy briges from this mod. I'm not sure what the issue is. I'm trying to build steel walls on some steel heavy bridges. Whenever I try to build it says terrain type medium required.

Canute

I have no problem's to build steel (or other) wall's on heavy bridges.
You wrote "on some" does that mean you can build at some bridges but then not at other ?
Or you can't generelly build on them ?

E-102

Quote from: Canute on September 10, 2019, 03:22:41 AM
I have no problem's to build steel (or other) wall's on heavy bridges.
You wrote "on some" does that mean you can build at some bridges but then not at other ?
Or you can't generelly build on them ?
I can't seem to build a wall on any of the advanced bridges.
Modlist:
<activeMods>
    <li>Core</li>
    <li>ModManager-master</li>
    <li>HugsLib</li>
    <li>JecsTools-1.1.0.15</li>
    <li>AlienRaces-master</li>
    <li>Miscellaneous_Core</li>
    <li>GiddyUpCore-1.1.6</li>
    <li>battlemounts-1.1.2</li>
    <li>DoorsExpanded</li>
    <li>GiddyUpCaravan-1.1.1</li>
    <li>GiddyUpRideAndRoll-1.2.1</li>
    <li>Vegetable Garden</li>
    <li>locks</li>
    <li>Locks-DoorsExpanded--master</li>
    <li>BetterPawnControl-master</li>
    <li>VGP_Canning</li>
    <li>Psychology</li>
    <li>AlphaAnimals-1.5</li>
    <li>Hospitality-1.0.27</li>
    <li>GlitterTech</li>
    <li>MoreFactionInteraction_2019_03_06</li>
    <li>prison labour</li>
    <li>Rimatomics-1.6.919</li>
    <li>Rimefeller-1.2.537</li>
    <li>AnimalCollabProject-master</li>
    <li>Dubs-Bad-Hygiene-2.5.958</li>
    <li>ExpandedProsthetics&amp;OrganEngineering</li>
    <li>A_Dog_Said_1.0</li>
    <li>Children</li>
    <li>VGP_Trees_Flowers</li>
    <li>705924057 Xeva's Rimhair</li>
    <li>725447220 Spoons Hair Mod</li>
    <li>727687246 Nackblad Inc Rimhair</li>
    <li>ConsolidatedTraits</li>
    <li>Lovely Hair Style</li>
    <li>rimworld-moretraitslots-master</li>
    <li>ED-Embrasures</li>
    <li>Furnace</li>
    <li>Miscellaneous_MAI</li>
    <li>Miscellaneous_TrainingFacility</li>
    <li>RF - Fertile Fields</li>
    <li>RF - Realistic Planets</li>
    <li>RT_Fuse-1.0-1.2.1</li>
    <li>RT_SolarFlareShield-1.0-1.3.1</li>
    <li>VariousSpaceShipChunks</li>
    <li>DefensiveMachineGunTurretPack</li>
    <li>1211694919 Nature's Pretty Sweet</li>
    <li>Miscellaneous_Incidents</li>
    <li>1478936958 More Vanilla Turrets 1.0</li>
    <li>TurretExtensions</li>
    <li>1516356320 More Vanilla Turrets - Turret Extensions Patch</li>
    <li>AnimalsLogic</li>
    <li>ChangeDresser</li>
    <li>Miscellaneous_Robots</li>
    <li>Miscellaneous_BeeAndHoney</li>
    <li>Miscellaneous_EndGame</li>
    <li>Miscellaneous_TurretBase</li>
    <li>Miscellaneous_WeaponRepair</li>
    <li>RF - Advanced Bridges</li>
    <li>RF - Fishing</li>
    <li>sd_luciprod-1.0-1.0.1</li>
    <li>RF - Rumor Has It</li>
    <li>sd_goodnight-1-1.0.1</li>
    <li>sd_medicaddons-1-1.0.3</li>
    <li>Skylights-1.5.960</li>
    <li>snapout</li>
    <li>lhm</li>
    <li>VGP CoffeeTeaDrugs</li>
    <li>VGP_Fabric</li>
    <li>VGP_Garden_Drinks</li>
    <li>VGP_Garden_Gourmet</li>
    <li>VGP_Medicine</li>
    <li>VGP_More Veggies</li>
    <li>VGP_Resources</li>
    <li>VGP_Soylent Production</li>
    <li>VGP_Tools</li>
    <li>VGP_Garden_Dyes</li>
    <li>VGP_Garden_Drinks_Bulk</li>
    <li>933324235 Hardworking animals 1.0</li>
    <li>Achtung2-master</li>
    <li>ColonyManager</li>
    <li>PickUpAndHaul-master</li>
    <li>RunAndGun-1.1.5</li>
    <li>SafelyHiddenAway - Release</li>
    <li>SmartMedicine - Release</li>
    <li>TD Enhancement Pack - Release</li>
    <li>WorkTab</li>
    <li>1508341791 [FSF] Rain Washes Away Filth</li>
    <li>1541978411 Veinminer R1.0</li>
    <li>AllowTool</li>
    <li>AnimalTab</li>
    <li>BadPeople-master</li>
    <li>Blueprints</li>
    <li>Bubbles</li>
    <li>Dubs-Mint-Menus-1.2.409</li>
    <li>FollowMe</li>
    <li>Numbers</li>
    <li>RemoteTech</li>
    <li>Replace Stuff - Release</li>
    <li>ResearchTree</li>
    <li>RimHUD</li>
    <li>EdBPrepareCarefully</li>
    <li>FluffyBreakdowns</li>
    <li>MadSkills-master</li>
    <li>PrepareLanding</li>
    <li>QuestionableEthicsEnhanced-master</li>
    <li>rjw-Dev</li>
    <li>BoomMod</li>
    <li>RJW_FeelingBroken</li>
    <li>BnC-master</li>
    <li>rjw-ex</li>
    <li>RimNudeWorld</li>
    <li>Smart-Speed-2.01</li>
    <li>stack</li>
    <li>MoreRandomSeeds</li>
    <li>1557850280 Less Default Hair</li>
    <li>1500981707 Harvest Everything!</li>
    <li>DontShaveYourHead-1.0.0</li>
    <li>Collapser</li>
    <li>FactionControl</li>
    <li>1207934602 ameiro anime hairs for 1.0 (female)</li>
    <li>725949967 Rimsenal - Rimhair</li>
  </activeMods>