Menu

Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Show posts Menu

Messages - SickBoyWi

#16
Help / Re: Best Way to Make All Other Factions Hostile
January 15, 2020, 03:09:05 PM
I found a fix that works. I needed to only have this happen for a specific player faction, not all of them. Here's the solution in case it helps anyone else. I added a prefix for the Faction TryMakeInitialRelationsWith function, removing the postfix I mentioned before.

        private static void Faction_TryMakeInitialRelationsWith_PreFix(Faction __instance, Faction other)
        {
            Faction playerFaction = __instance;

            if (playerFaction.IsPlayer && !other.IsPlayer && (playerFaction.def.defName.Equals("RH_TET_Beastmen_BrayPlayerFaction")
                || playerFaction.def.defName.Equals("RH_TET_Beastmen_BeastmenPlayerFaction")))
            {
                other.def.startingGoodwill = new IntRange(-100, -100);
            }
        }
#17
Help / Best Way to Make All Other Factions Hostile
January 15, 2020, 01:16:21 PM
I'm working on a mod using alien races (though that may or may not matter here), and I want all non player factions to be hostile to the player. I added a postfix to the Faction TryMakeInitialRelationsWith method, and it looks like this:

        private static void Faction_TryMakeInitialRelationsWith_PostFix(Faction __instance, Faction other)
        {
            Faction playerFaction = __instance;

            if (playerFaction.IsPlayer && !other.IsPlayer && (playerFaction.def.defName.Equals("RH_TET_Beastmen_BrayPlayerFaction")
                || playerFaction.def.defName.Equals("RH_TET_Beastmen_BeastmenPlayerFaction")))
            {
                int goodWillAmount = playerFaction.GoodwillWith(other);

                if (goodWillAmount > -100)
                {
                    // TODO make random, between 80 and 100?
                    int newGoodWillAmount = -100;
                   
                    other.RelationWith(playerFaction).goodwill = newGoodWillAmount;
                    other.RelationWith(playerFaction).kind = FactionRelationKind.Hostile;
                }
            }
        }


I've tried other things, like making this call in the postfix instead of setting values randomly:
playerFaction.TryAffectGoodwillWith(other, newGoodWillAmount, false, false);

That call throws an error because Faction.OfPlayer tosses an error due to the player faction not being set up yet.

The issue with my method is that when a raid happens from a faction that my postfix code has forced to be hostile, player pawns and 'enemy' pawns completely ignore each other. The enemy pawns look and act like enemies in every other way, but they walk right by/around player pawns, and go smash up the buildings and such. They pawns don't attack each other.

Any ideas are very welcome.
#18
Help / Re: Custom World Event Map Spawns All Fog
November 13, 2019, 08:27:22 PM
Just a little more info, for any one tracking this (and myself, so it's all in one spot).

The core FindNearEdgeCell function is:
   
private static IntVec3 FindNearEdgeCell(Map map, Predicate<IntVec3> extraCellValidator)
    {
      Predicate<IntVec3> baseValidator = (Predicate<IntVec3>) (x =>
      {
        if (x.Standable(map))
          return !x.Fogged(map);
        return false;
      });
      Faction hostFaction = map.ParentFaction;
      IntVec3 result;
      if (CellFinder.TryFindRandomEdgeCellWith((Predicate<IntVec3>) (x =>
      {
        if (!baseValidator(x) || extraCellValidator != null && !extraCellValidator(x))
          return false;
        if (hostFaction != null && map.reachability.CanReachFactionBase(x, hostFaction))
          return true;
        if (hostFaction == null)
          return map.reachability.CanReachBiggestMapEdgeRoom(x);
        return false;
      }), map, CellFinder.EdgeRoadChance_Neutral, out result))
        return CellFinder.RandomClosewalkCellNear(result, map, 5, (Predicate<IntVec3>) null);
      if (extraCellValidator != null && CellFinder.TryFindRandomEdgeCellWith((Predicate<IntVec3>) (x =>
      {
        if (baseValidator(x))
          return extraCellValidator(x);
        return false;
      }), map, CellFinder.EdgeRoadChance_Neutral, out result))
        return CellFinder.RandomClosewalkCellNear(result, map, 5, (Predicate<IntVec3>) null);
      if (CellFinder.TryFindRandomEdgeCellWith(baseValidator, map, CellFinder.EdgeRoadChance_Neutral, out result))
        return CellFinder.RandomClosewalkCellNear(result, map, 5, (Predicate<IntVec3>) null);
      Log.Warning("Could not find any valid edge cell.", false);
      return CellFinder.RandomCell(map);
    }


I tracked it back, and it looks like the extraCellValidator parameter is always going to be null for my case here.

I haven't dug through the function in detail yet, but it looks like it ends in a fail safe condition to return a random cell if all else failed. The issue is that it doesn't unfog the map in that case. I'm going to try and simply unfog the map on my side as a next step. That'll be just to see if it works, and to keep poking at this and learning stuff so that I can hopefully find a legit fix.
#19
Help / Re: Custom World Event Map Spawns All Fog
November 13, 2019, 08:14:00 PM
Just in case any one else ever has this issue, I'm still tracking it.

The actual warning message that shows up in the log when it happens is:
Could not find any valid edge cell.
Verse.Log:Warning(String, Boolean)
RimWorld.Planet.CaravanEnterMapUtility:FindNearEdgeCell(Map, Predicate`1)
RimWorld.Planet.CaravanEnterMapUtility:GetEnterCell(Caravan, Map, CaravanEnterMode, Predicate`1)
RimWorld.Planet.CaravanEnterMapUtility:Enter(Caravan, Map, CaravanEnterMode, CaravanDropInventoryMode, Boolean, Predicate`1)
RimWorld.SiteCoreWorker:DoEnter(Caravan, Site)
RimWorld.<Enter>c__AnonStorey2:<>m__0()
Verse.LongEventHandler:UpdateCurrentSynchronousEvent(Boolean&)
Verse.LongEventHandler:LongEventsUpdate(Boolean&)
Verse.Root:Update_Patch1(Object)
Verse.Root_Play:Update()


I will continue looking into this until I correct the issue.
#20
Help / Re: Custom World Event Map Spawns All Fog
November 12, 2019, 04:43:11 PM
Perhaps I could provide additional info that would make it more likely that someone would have an idea here? If so, just let me know, and I will do so.
#21
Help / Custom World Event Map Spawns All Fog
November 06, 2019, 08:32:01 AM
I have an issue, and after a ton of digging haven't found a solution.

I have a custom world event, that generates it's own map. Very similar to a bandit camp; in fact that's the code I started with.

The issue is that once in a while the map for the custom event will spawn all fog. The pawns will be there, but you won't see them, like they're on a different layer. Sometimes this happens because they spawn in ocean tiles, and sometimes they spawn in a spot that is just fine, but for whatever reason it's like they're on a Z layer that doesn't show them. And, again, the map is all fog. Everything looks fine with the map if you turn off fog in Dev Mode.

Note that this happens rarely, not every time.

I'll post the genstep code below. If config would help, I can post that too, just let me know.

Any ideas would be greatly appreciated!



using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using RimWorld;
using RimWorld.BaseGen;
using UnityEngine;
using Verse;
using Verse.AI.Group;
using Verse.AI;

namespace TheEndTimes
{
    public class GenStep_ChaosPortalSmall : GenStep
    {
        public override void Generate(Map map, GenStepParams parms)
        {
            Faction faction = Find.FactionManager.FirstFactionOfDef(TheEndTimesDefOf.RH_TET_ChaosMonsterFaction);
           
            CellRect rectToDefend;
            if (!MapGenerator.TryGetVar<CellRect>("RectOfInterest", out rectToDefend))
            {
                rectToDefend = CellRect.SingleCell(map.Center);
            }
           
            // Add portal && flooring for it.
            Thing portal = GenSpawn.Spawn(ThingMaker.MakeThing(ThingDef.Named("RH_TET_ChaosPortal_Small"), null), map.Center, map, WipeMode.Vanish);
            portal.SetFaction(faction);
            map.attackTargetsCache.TargetsHostileToFaction(Find.FactionManager.OfPlayer).Add((IAttackTarget)portal);

            IEnumerable<IntVec3> portalAreaCells = portal.CellsAdjacent8WayAndInside();

            int minx = 1000;
            int minz = 1000;

            foreach (IntVec3 intvec3 in portalAreaCells)
            {
                if (intvec3.x < minx)
                {
                    minx = intvec3.x;
                }
                if (intvec3.z < minz)
                {
                    minz = intvec3.z;
                }
            }

            CellRect portalArea = new CellRect(minx - 4, minz - 4, 13, 15);

            // Clear map center, add floors around portal.
            TerrainDef floorDef = TerrainDef.Named("FlagstoneGranite");
            ResolveParams areaAroundPortal = default(ResolveParams);
            areaAroundPortal.rect = portalArea;
            areaAroundPortal.clearEdificeOnly = true;
            areaAroundPortal.faction = faction;
            areaAroundPortal.floorDef = floorDef;
            areaAroundPortal.pathwayFloorDef = floorDef;
            areaAroundPortal.edgeDefenseWidth = new int?(0);
            areaAroundPortal.edgeDefenseTurretsCount = new int?(0);
            areaAroundPortal.edgeDefenseMortarsCount = new int?(0);
            areaAroundPortal.settlementPawnGroupPoints = new float?(0f);
            areaAroundPortal.chanceToSkipWallBlock = 0f;
            BaseGen.symbolStack.Push("floor", areaAroundPortal);

            BaseGen.globalSettings.map = map;

            BaseGen.Generate();
           
            // Create Base.
            ResolveParams resolveParams = default(ResolveParams);

            resolveParams.rect = this.GetOutpostRect(rectToDefend, map);
            resolveParams.faction = faction;
            resolveParams.edgeDefenseWidth = new int?(2);
            resolveParams.edgeDefenseTurretsCount = new int?(0);
            resolveParams.edgeDefenseMortarsCount = new int?(0);
            if (parms.siteCoreOrPart != null)
            {
                resolveParams.settlementPawnGroupPoints = new float?(250);
                resolveParams.settlementPawnGroupSeed = new int?(OutpostSitePartUtility.GetPawnGroupMakerSeed(parms.siteCoreOrPart.parms));
            }
            else
            {
                resolveParams.settlementPawnGroupPoints = new float?(this.defaultPawnGroupPointsRange.RandomInRange);
            }
            BaseGen.globalSettings.map = map;
            BaseGen.globalSettings.minBuildings = 1;
            BaseGen.globalSettings.minBarracks = 1;
            BaseGen.globalSettings.basePart_breweriesCoverage = 0;
            BaseGen.globalSettings.basePart_farmsCoverage = 0;
            BaseGen.symbolStack.Push("settlement", resolveParams);
            BaseGen.Generate();
        }

        private CellRect GetOutpostRect(CellRect rectToDefend, Map map)
        {
            GenStep_ChaosPortalSmall.possibleRects.Add(new CellRect(rectToDefend.minX - 1 - Size, rectToDefend.CenterCell.z - Size, Size, Size));
            GenStep_ChaosPortalSmall.possibleRects.Add(new CellRect(rectToDefend.maxX + 1, rectToDefend.CenterCell.z - Size, Size, Size));
            GenStep_ChaosPortalSmall.possibleRects.Add(new CellRect(rectToDefend.CenterCell.x - Size, rectToDefend.minZ - 1 - Size, Size, Size));
            GenStep_ChaosPortalSmall.possibleRects.Add(new CellRect(rectToDefend.CenterCell.x - Size, rectToDefend.maxZ + 1, Size, Size));
            CellRect mapRect = new CellRect(0, 0, map.Size.x, map.Size.z);
            GenStep_ChaosPortalSmall.possibleRects.RemoveAll((CellRect x) => !x.FullyContainedWithin(mapRect));
            if (GenStep_ChaosPortalSmall.possibleRects.Any<CellRect>())
            {
                return GenStep_ChaosPortalSmall.possibleRects.RandomElement<CellRect>();
            }
            return rectToDefend;
        }

        private CellRect GetPortalRect(CellRect rectToDefend, Map map)
        {
            GenStep_ChaosPortalSmall.portalRects.Add(new CellRect(rectToDefend.minX - 1 - PortalSize, rectToDefend.CenterCell.z - PortalSize / 2, PortalSize, PortalSize));
            GenStep_ChaosPortalSmall.portalRects.Add(new CellRect(rectToDefend.maxX + 1, rectToDefend.CenterCell.z - PortalSize / 2, PortalSize, PortalSize));
            GenStep_ChaosPortalSmall.portalRects.Add(new CellRect(rectToDefend.CenterCell.x - PortalSize / 2, rectToDefend.minZ - 1 - PortalSize, PortalSize, PortalSize));
            GenStep_ChaosPortalSmall.portalRects.Add(new CellRect(rectToDefend.CenterCell.x - PortalSize / 2, rectToDefend.maxZ + 1, PortalSize, PortalSize));
            CellRect mapRect = new CellRect(0, 0, map.Size.x, map.Size.z);
            GenStep_ChaosPortalSmall.portalRects.RemoveAll((Predicate<CellRect>)(x => !x.FullyContainedWithin(mapRect)));
            if (GenStep_ChaosPortalSmall.portalRects.Any<CellRect>())
                return GenStep_ChaosPortalSmall.portalRects.RandomElement<CellRect>();
            return rectToDefend;
        }

        private const int Size = 22;
        private const int PortalSize = 8;
        private static List<CellRect> possibleRects = new List<CellRect>();
        private static List<CellRect> portalRects = new List<CellRect>();
        public override int SeedPart { get; }
        public FloatRange defaultPawnGroupPointsRange = SymbolResolver_Settlement.DefaultPawnsPoints;
    }
}

#22
Releases / [1.0] Rimhammer - The End Times - Dwarfs
June 01, 2019, 12:35:59 PM


Join the Discord channel: https://discordapp.com/channels/543200702755897354/543288479921209374

Steam link: https://steamcommunity.com/sharedfiles/filedetails/?id=1758115494

Direct download link: http://nerdtournament.com/mods/rimworld/Rimhammer-TheEndTimes-Dwarfs/releases/Rimhammer-The-End-Times-Dwarfs.zip


This is the first extension onto the base 'Rimhammer - The End Times' mod, and is intended to be used with the base mod; however, that isn't required.

This mod requires Jec's Tools, Jec's Doors Expanded, and Humanoid Alien Races 2.0 mods to be loaded before it. If you're using the base Rimhammer - The End Times mod, you should load that immediately after the previously mentioned two mods, and before this one. I recommend putting this mod after the mods I listed above, and before any other mods you have.

This mod adds Warhammer Dwarfs into Rimworld. Yes, in Warhammer it is 'Dwarfs', not 'Dwarves'! This mod includes Dwarven equipment, ale, and much more. Dwarfs also have the ability to settle impassable terrain!

A detailed list of things this extension adds are as follows:
   -Warhammer Dwarfs as well as Slayers ( all with unique haircuts, beards, and body ).
   -The ability for dwarves to settle on impassable mountain tiles.
   -Warmachines: Bolt Thrower, Grudge Thrower, Cannon, Organ Gun, and Flame Cannon.
   -Black Powder: Two new minable resources (Sulfur and Saltpeter) that can be combined with wood for charcoal, to make black powder. Used to build the cannon, organ gun, and flame cannon rounds.
   -Armor, clothing, weapons, and equipment specific to the dwarfs.
   -A new type of dwarf recreation activity: Admiring Gold - so leave a piece of gold sitting out with an open space around it, so the lads can get their much needed rec.
   -A planter box ( essentially an unpowered and weaker hydroponic basin - perfect for growing stoneroot under the mountain )
   -Special fermenting barrels.
   -Dwarven Ale, and the famous Bugman's XXX Ale.
   -Unique plants: Barley (for making dwarven ale and food) and Stoneroot ( a dwarven speciality crop that doesnt need light to grow, and has a long shelf life )
   -Unique food: Stonebread ( made from stoneroot; has a long shelf life )
   -Gromril ( an extremely strong dwarven speciality metal )
   -100+ dwarven and slayer themed backstories.
   -A few dwarven factions.
   -New large dwarven research tree.
   -Tons of dwarven themed names.
   -Doors and gates.
   -Dwarven statuary.
   -Dwarven sarcophagus.
   -Dwarven pillars for roof support, and beauty.

Current known issues:
   -If you have a shield equipped, and you try to force equip a different one, there's an error that will destroy the shield you're attempting to equip. You have to manually unequip the first shield, then you can equip the new shield. I believe this is an error with JecsTools, I have an issue open regarding it on his GitHub.

Future Updates:
   -Add more dwarven furniture.
   -Add additional armor/helms.
   -Runic weapons and items - ability to create them, and perhaps really strong ones from quests.
   -Add victory conditions - Perhaps destroy a chaos portal somewhere.
   -Implement The Book of Grudges.
   -Add dwarven themed mental breaks and recreation activities.
   -A CE patch.
   -Quests.
   -Gyrocoptor implementation.
   -More beards, and hair cuts.
   -More sculptures.
   -Fix ale brewing so that they share a fermenting barrel.
   -Gyrocoptor - perhaps as a transport pod like thing that is refuelable.
   -Better ruins.

Special Thanks To:
   -Discord member @Dino's Bar and Grill for making creature, door, and warmachine images. @Grelan for organizing and dealing with the Discord channel. @Kompad for some great config tips that saved me some real time and trouble. All the other Discord members for tossing ideas around, and playtesting.
   -The Lord of the Rims series for inspiration, and some great examples to get me going. Same goes for [KV] Impassable Map Maker - 1.0.
   -The people at the Ludeon forums who answered my programming/config questions.
   
This series will likely not be released fast. I'm one person, and the amount of work involved is significant. This mod took hundreds hours of work, no joke.

If you'd like to speed up the process of release, please consider supporting me on Patreon. The more support I get, the more motivated I will be to create more races/factions. https://www.patreon.com/SickBoyWI   


========================
Changelog
========================

0.1.0.0 2019-05-31
========================
Balanced all items against core. Considering development done.

0.0.1.0 2019-04-16
========================
Turned over to play testing team on Discord.

0.0.0.1 2018-12-28
========================
Development started.
#23
Releases / Re: [1.0] Rimhammer - The End Times
May 31, 2019, 10:02:30 AM
Hey Lormax. I'll put that on the list. Sorry I missed this message. If you post on the Steam comments, I'll see them much sooner. I'll make it point to lurk here more often. I'll pull those mods down and see if there's an error. If not, it should be obvious what's happening based on the arrow recipe.
#24
So I've been messing around with this trying to figure out what's up, and haven't had much luck. Here's the current relevant parts of Harmony patch code I've written:

       
        [HarmonyPatch(typeof(WildManUtility), "IsWildMan")]
        static class Patch_WildManUtility_IsWildMan
        {
            static bool Prepare()
            {
                Log.Error("Prepare IsWildMan");
                return true;
            }

            static void Prefix(ref bool __result, Pawn p)
            {
                Log.Error("PREFIX IsWildMan: PAWN KIND" + p.kindDef.defName);

                // Do stuff.
            }

            static void Postfix(ref bool __result, Pawn p)
            {
                Log.Error("POSTFIX IsWildMan: PAWN KIND" + p.kindDef.defName);

                // Do stuff.
            }
        }

        [HarmonyPatch(typeof(WildManUtility), "AnimalOrWildMan")]
        static class Patch_WildManUtility_AnimalOrWildMan
        {
            static void Postfix(ref bool __result, Pawn p)
            {
                Log.Error("AnimalOrWildMan");
// THIS ONE ACTUALLY WORKS.

// Do stuff.
            }
        }

        [HarmonyPatch(typeof(WildManUtility), "NonHumanlikeOrWildMan")]
        static class Patch_WildManUtility_NonHumanlikeOrWildMan
        {
            static void Postfix(ref bool __result, Pawn p)
            {
                Log.Error("NonHumanlikeOrWildMan");
// THIS ONE ACTUALLY WORKS.

// Do stuff.
            }
        }


The patches for AnimalOrWildMan and NonHumanlikeOrWildMan both work, I see my logs from the postfix, no problem.

The issue is still IsWildMan. I see the log message from the Prepare function, that prints out during start up of the game. The prefix or postfix do absolutely nothing. I never see the logs from them. I don't even need the prefix, just the postfix; I added the prefix just to see if anything would actually print out.

Is Mehni's answer the correct one here? Perhaps this function gets optimized out?
#25
My patch is in a class that has several other patches in it, all of which work fine. If I rename the method I'm patching to something nonsense, I get an error during initialization as expected. The fact that the method shows up in my decompiled RW source code seems to indicate the method is there in the built version.

I appreciate the responses. I'll dig into it a little more this evening, and see if I can find the issue.
#26
Help / Add Harmony PostFix to Extension Method?
May 22, 2019, 08:23:26 PM
I want to add a postfix to an extension method. Here's what I coded up:

       
       [HarmonyPatch(typeof(WildManUtility), "IsWildMan")]
        static class Patch_WildManUtility_IsWildMan
        {
            static void Postfix(ref bool __result, Pawn p)
            {
                Log.Error("FACTION:" + ofPlayer.def.defName + ", PAWN KIND" + p.kindDef.defName);
                // Do some stuff.
            }
        }


It compiles fine, and the game accepts it without error on initialization.

The issue is: that code never gets hit, because my error log never comes out.

Turns out, that function I'm trying to PostFix (WildManUtility.IsWildMan), is an extension method to the Pawn class, defined like this:


                public static bool IsWildMan(this Pawn p)
{
return p.kindDef == PawnKindDefOf.WildMan;
}


That function is always referenced through the Pawn class, by calling pawnInstance.IsWildMan(pawn).

Is there a way to get something like this to work? Am I doing something dumb here somewhere that I'm missing?

Any advice is much appreciated.
#27
I took the advice to check the Wildman config first. The only thing that I was missing was this:

    <apparelIgnoreSeasons>true</apparelIgnoreSeasons>

That has solved the problem. Thanks for the responses!
#28
I've created a new pawn type. I want them to spawn naked, and without gear. I can do it using Harmony in the postfix method by destroying all the apparel, but it seems like there should be a much easier config based way to do this.

I've added all of these to the PawnKindDef, and it made no difference.
<apparelRequired></apparelRequired>
<apparelTags></apparelTags>
<apparelMoney>
      <min>0</min>
      <max>0</max>
</apparelMoney>
<apparelAllowHeadgearChance>0</apparelAllowHeadgearChance>
<apparelIgnoreSeasons>true</apparelIgnoreSeasons>


Is there a good way to do this with config? Thanks much!
#29
Sorry to dig up an old thread, but you guys just saved my life. I've been debugging this issue for hours, trying to figure it out, and having no luck whatsoever.

I have a new faction, and new race. When raids spawn, I'd get the below errors. There's no indication of what the heck the issue is in that error. Thanks a million, and I will post the full error stack here once again in case anyone else is searching and searching. Thanks a million Albion for adding that followup post!
Exception filling window for Verse.Dialog_DebugOptionListLister: System.NullReferenceException: Object reference not set to an instance of an object
  at RimWorld.IncidentWorker_Raid.TryExecuteWorker (RimWorld.IncidentParms parms) [0x00000] in <filename unknown>:0
  at RimWorld.IncidentWorker_RaidEnemy.TryExecuteWorker (RimWorld.IncidentParms parms) [0x00000] in <filename unknown>:0
  at RimWorld.IncidentWorker.TryExecute (RimWorld.IncidentParms parms) [0x00000] in <filename unknown>:0
  at Verse.Dialog_DebugActionsMenu.DoRaid (RimWorld.IncidentParms parms) [0x00000] in <filename unknown>:0
  at Verse.Dialog_DebugActionsMenu+<DoListingItems_MapActions>c__AnonStorey8+<DoListingItems_MapActions>c__AnonStoreyA+<DoListingItems_MapActions>c__AnonStoreyB+<DoListingItems_MapActions>c__AnonStoreyC.<>m__0 () [0x00000] in <filename unknown>:0
  at Verse.Dialog_DebugOptionLister.DebugAction (System.String label, System.Action action) [0x00000] in <filename unknown>:0
  at Verse.Dialog_DebugOptionListLister.DoListingItems () [0x00000] in <filename unknown>:0
  at Verse.Dialog_OptionLister.DoWindowContents (Rect inRect) [0x00000] in <filename unknown>:0
  at Verse.Window+<WindowOnGUI>c__AnonStorey0.<>m__0 (Int32 x) [0x00000] in <filename unknown>:0
Verse.Log:Error(String, Boolean)
Verse.<WindowOnGUI>c__AnonStorey0:<>m__0(Int32)
UnityEngine.GUI:CallWindowDelegate(WindowFunction, Int32, Int32, GUISkin, Int32, Single, Single, GUIStyle)

Mouse position stack is not empty. There were more calls to BeginScrollView than EndScrollView. Fixing.
Verse.Log:Error(String, Boolean)
Verse.Widgets:EnsureMousePositionStackEmpty()
Verse.Root:Update_Patch1(Object)
Verse.Root_Play:Update()
#30
Help / Re: Help Removing Ship Chunk Drop Incident
April 09, 2019, 10:22:56 PM
Thanks fellas. I will definitely look at the scenario code!

I want them removed because I'm ironing out bugs in the Medieval Vanilla, and Rimhammer - The End Times mods; both of which are supposed to remove everything after the medieval era from the game!