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 - maarx1337

#16
Settling Additional Tile, and Leaving it Empty, Drastically Reduces Raids

I guess this is technically an item about balancing, and not strictly speaking a malfunction, but it seems pretty significant, and I wasn't sure where else to open it.

My guess is that the storyteller first decides how often / when to send a raid, and after that, decides which map tile to send it against (if there is more than one settled map tile).

This opens up a host of balancing concerns -- it is super easy to grab four different colonists, arm each with maximized weapons and armor, send each to settle a different surrounding tile, and drastically reduce the number of significant raids against the primary base.

Furthermore, the colonist is not even strictly necessary -- it is possible to caravan to a surrounding tile, settle it, and then caravan everybody back home (leaving an empty, settled tile with near-zero wealth). The storyteller will still try to drop raids on these tiles, which often fail completely now, citing errors to the log similar to these:

IncidentWorker_RaidEnemy could not fire even though we thought we could: no faction could generate with 5.478053 points.

Despite the fact that these raids entirely fail to launch, it appears they still correspondingly reduce the frequency of raids against the primary colony.

In the minimum short term, the storyteller needs a reasonable lower limit on when it will send a raid against a tile, and in those cases, should redirect the raid to a qualifying tile.

In the longer term, the storyteller balancing needs to be reconsidered when multiple tiles are in play. The most nuclear solution would be to treat each tile separately and give them each their own independent incident frequencies, instead of splitting the incidents amongst the tiles.
#17
It seems that, when a Tamed Predator is hungry, and searches for food to hunt, it might select a Colonist of the same (Player) Faction, if that Colonist is Berserk.
#18
Outdated / Re: [A16] Maarx's QoL\UI Mod Thread
April 14, 2017, 10:05:35 AM
Quote from: faltonico on April 13, 2017, 02:48:38 AMOn a side note, a suggestion, can you make the menu for the prioritized hauling float? so it doesn't hide when you click on something?

I think this is in the definition of a MainTab (those buttons along the very bottom), I think all MainTabs behave this way, collapsing when you click out of them.

I could consider it, but it wouldn't be a simple change. Do you have an example of another mod's MainTab that behaves the way you're describing?
#19
SOLVED:

I was getting below spam to Debug Log.

At first I thought it was related to Toxic Fallout / huge Barn with Animal Sleeping Spots.

But I was wrong. The real problem was that we'd broken a hole in the prison wall, which flagged the entire base (surrounded in exterior wall) as one massive prison.

Plugging the hole in the prison wall immediately fixed it.

Perf warning: Ran ContainedBeds in huge room Room(roomID=311, first=(204, 0, 156), RegionsCount=86, lastChangeTick=23519022)
Verse.Log:Warning(String)
Verse.<>c__Iterator1E2:MoveNext()
RimWorld.WorkGiver_Warden_TakeToBed:JobOnThing(Pawn, Thing)
RimWorld.WorkGiver_Scanner:HasJobOnThing(Pawn, Thing)
PrioritizedHauling.<>c__DisplayClass2_1:<TryGiveJob>b__0(Thing)
Verse.<RegionwiseBFSWorker>c__AnonStorey533:<>m__9FE(Region)
Verse.BFSWorker:BreadthFirstTraverseWork(Region, RegionEntryPredicate, RegionProcessor, Int32)
Verse.RegionTraverser:BreadthFirstTraverse(Region, RegionEntryPredicate, RegionProcessor, Int32)
Verse.GenClosest:RegionwiseBFSWorker(IntVec3, Map, ThingRequest, PathEndMode, TraverseParms, Predicate`1, Func`2, Int32, Int32, Single)
Verse.GenClosest:ClosestThingReachable(IntVec3, Map, ThingRequest, PathEndMode, TraverseParms, Single, Predicate`1, IEnumerable`1, Int32, Boolean)
PrioritizedHauling.Overrides:TryGiveJob(JobGiver_Work, Pawn)
Verse.AI.ThinkNode_JobGiver:TryIssueJobPackage(Pawn)
Verse.AI.ThinkNode_PrioritySorter:TryIssueJobPackage(Pawn)
Verse.AI.ThinkNode_Subtree:TryIssueJobPackage(Pawn)
Verse.AI.ThinkNode_Priority:TryIssueJobPackage(Pawn)
RimWorld.ThinkNode_Conditional:TryIssueJobPackage(Pawn)
Verse.AI.ThinkNode_Priority:TryIssueJobPackage(Pawn)
Verse.AI.Pawn_JobTracker:DetermineNextJob(ThinkTreeDef&)
Verse.AI.Pawn_JobTracker:TryFindAndStartJob()
Verse.AI.Pawn_JobTracker:EndCurrentJob(JobCondition, Boolean)
Verse.AI.Pawn_JobTracker:JobTrackerTick()
Verse.Pawn:Tick()
Verse.TickList:Tick()
Verse.TickManager:DoSingleTick()
Verse.TickManager:TickManagerUpdate()
Verse.Game:Update()
Verse.Root_Play:Update()
#21
Outdated / Re: [A16] Maarx's QoL\UI Mod Thread
April 13, 2017, 09:48:56 AM
Quote from: faltonico on April 13, 2017, 02:48:38 AM
I had a small error with Prioritized Hauling, in the sense i could fix it easily but it was preventing it from working:

Exception filling window for PrioritizedHauling.MainTabWindow_PrioritizedHauling: System.IO.DirectoryNotFoundException: Directory 'C:\RimWorld1393Win\SaveData\PrioritizedHauling\PrioritySets' not found.
  at System.IO.Directory.GetFileSystemEntries (System.String path, System.String searchPattern, FileAttributes mask, FileAttributes attrs) [0x00000] in <filename unknown>:0
  at System.IO.Directory.GetFiles (System.String path, System.String searchPattern) [0x00000] in <filename unknown>:0
  at System.IO.DirectoryInfo.GetFiles (System.String searchPattern) [0x00000] in <filename unknown>:0
  at System.IO.DirectoryInfo.GetFiles (System.String searchPattern, SearchOption searchOption) [0x00000] in <filename unknown>:0
  at (wrapper remoting-invoke-with-check) System.IO.DirectoryInfo:GetFiles (string,System.IO.SearchOption)
  at PrioritizedHauling.SaveLoad_PrioritizedHauling.getAllFiles () [0x00000] in <filename unknown>:0
  at PrioritizedHauling.MainTabWindow_PrioritizedHauling.DoWindowContents (Rect canvas) [0x00000] in <filename unknown>:0
  at HugsLib.GuiInject.WindowDetour+<>c__DisplayClass1.<_WindowOnGUI>b__0 (Int32 x) [0x00000] in <filename unknown>:0
Verse.Log:Error(String)
HugsLib.GuiInject.<>c__DisplayClass1:<_WindowOnGUI>b__0(Int32)
UnityEngine.GUI:CallWindowDelegate(WindowFunction, Int32, GUISkin, Int32, Single, Single, GUIStyle)

Image attached.
Apparently because it couldn't find the PrioritizedHauling\PrioritySets folder. Restarting the game didn't automatically created the folders.
The moment i created the directory, the error stopped in game.

I'm overriding the savedata folder with -savedatafolder=SaveData.

Thanks for the report! I replicated the bug and fixed it. This one fast-tracked the beta-testing and earned a quick release to production, so it is fixed now in the master download.
#22
Outdated / Re: [A16] Maarx's QoL\UI Mod Thread
April 12, 2017, 04:43:54 PM
Quote from: faltonico on April 12, 2017, 04:33:21 PM
Would Prioritized Hauling be compatible with Refactored Work Priorities or Hand me that Brick?
Thank you for the mods!.

I think it should be compatible. Prioritized Hauling doesn't change any of the existing WorkGivers, it just adds a new WorkGiver.

Give it a whirl! If there's an issue, let me know. :)
#23
Outdated / [A16] Maarx's QoL\UI Mod Thread
April 12, 2017, 03:11:16 PM
Maarx's QoL\UI Mod Thread



I have suddenly developed an unexpected hobby of writing my own RimWorld mods for my own enjoyment. After several weeks of development, I have developed an entire collection of such mods. With some hesitation, I am ready to share my mods with the rest of the community.

These mods are not "content" mods, they are "QoL" / "UI" mods, and are "vanilla friendly". That is to say, you will not find shiny new laser beam weapons, or tanks, or helicopters, or aliens. Rather, you will find basic enhancements to the user interface in order to make playing RimWorld more convenient and enjoyable, with less time spent redundantly clicking, and more time spent making exciting and intelligent decisions.

Also, these mods are not comprehensive or standalone, but are rather intended to plug very specific gaps in the existing mod scene. If a feature was already available in another QoL/UI mod, these mods do not duplicate that work, but are rather intended to complement that work, and stand alongside it.

I manage my mods in public GitHub repositories, and have written detailed README files in those locations, with complete Introductions and Explanations, Specific Additional Features, How to Install, How to Update, how to preview the beta, how to report bugs, and how to request or suggest new features.

With your forgiveness, I will not copy/paste those entire descriptions into this forum, I will simply link you to them. This is because I will continue to regularly update those README files, but will probably not remember to come back here and regularly update these forum descriptions.

For each mod, I'll provide just a single sentence summary. If the mod sounds interesting, please click the link (and then scroll down a bit) to find all of the detail and instructions you could want.

Without further ado, the list.



PrioritizedHauling:

Allows you to specify certain types of objects to be hauled at higher priority, in a customizable order.

https://github.com/maarxx/PrioritizedHauling


BulkDesignator:

Provides some functions for bulk manipulation of designators, such as Cut Plants & Hunt, and bulk Medical Operations across multiple humanoids and mechanoids.

https://github.com/maarxx/BulkDesignator


BulkAssigner:

Provides some functions for bulk manipulation of assign functions, such as Hostility Reponse Mode, Outfit, Drug Policy, and Allowed Areas.

https://github.com/maarxx/BulkAssigner


MoreAlerts:

Offers more Alerts in the righthand sidebar that players might be interested in. There are many here, please see the link for a complete list, but the most interesting include hunting animals, mechanoids, rocket launchers, pawns which might die from disease, doors which are blocked open, and escaping prisoners.

https://github.com/maarxx/MoreAlerts


AccuraSight:

Updates the labels on weapons to show Accuracy% for ranged weapons and DPS for melee weapons.

Enhances sorting options in Merchant windows, and in mods like Moody and Numbers.

https://github.com/maarxx/AccuraSight


InjuryNotifier:

Notifies you when a Pawn suffers a permanent Injury.

https://github.com/maarxx/InjuryNotifier


UberMicro:

Provides button in-game to toggle mode on and off. When mode is on, then it pauses game and gives letter notification whenever a prioritized job is complete. Useful in emergency situations.

https://github.com/maarxx/UberMicro


SmarterScheduling:

Automatically manages your Pawn's Sleep, Joy, and Work cycles.

https://github.com/maarxx/SmarterScheduling


ToxicFalloutManager:

Automatically manages Allowed Area in response to Toxic Fallout.

https://github.com/maarxx/ToxicFalloutManager


ExtraClothes:

Provides additional duplicate Clothing items, identical to Vanilla, intended for managing Devilstrand.

https://github.com/maarxx/ExtraClothes


LimitlessSelection:

Removes the limit of only selecting 80 things at a time.

https://github.com/maarxx/LimitlessSelection


UdderlyImpractical:

Stops your pawns from drinking the milk.

https://github.com/maarxx/UdderlyImpractical


Licensing:

  • Can modpack makers include your mod in their modpack? Yes, feel free.
  • Can other modders make derivative mods based on yours? Yes, feel free.

How to Download and Install:

  • Click the GitHub link for the mod, and then, on the right-hand-side, click "Clone or Download" and then "Download ZIP".
  • Unzip the contents and place them in your RimWorld/Mods folder.
  • Activate the mod in the mod menu in the game.
#24
Happened again.

Output_log.txt:

https://gist.github.com/HugsLibRecordKeeper/dae78fab227314c9d321a2b31569865c

Two errors in log:

Tried to get valid region out of bounds at (-1000, -1000, -1000)
Verse.Log:Error(String)
Verse.RegionGrid:GetValidRegionAt(IntVec3)
Verse.GridsUtility:GetRegion(IntVec3, Map)
Verse.CellFinder:TryFindRandomReachableCellNear(IntVec3, Map, Single, TraverseParms, Predicate`1, Predicate`1, IntVec3&, Int32)
Verse.CellFinder:RandomClosewalkCellNear(IntVec3, Map, Int32)
RimWorld.IncidentWorker_Raid:TryExecute(IncidentParms)
RimWorld.IncidentWorker_RaidEnemy:TryExecute(IncidentParms)
RimWorld.Storyteller:TryFire(FiringIncident)
RimWorld.Storyteller:StorytellerTick()
Verse.TickManager:DoSingleTick()
Verse.TickManager:TickManagerUpdate()
Verse.Game:Update()
Verse.Root_Play:Update()

Tried to spawn Jesse out of bounds at (-1000, -1000, -1000).
Verse.Log:Error(String)
Verse.GenSpawn:Spawn(Thing, IntVec3, Map, Rot4)
Verse.GenSpawn:Spawn(Thing, IntVec3, Map)
RimWorld.IncidentWorker_Raid:TryExecute(IncidentParms)
RimWorld.IncidentWorker_RaidEnemy:TryExecute(IncidentParms)
RimWorld.Storyteller:TryFire(FiringIncident)
RimWorld.Storyteller:StorytellerTick()
Verse.TickManager:DoSingleTick()
Verse.TickManager:TickManagerUpdate()
Verse.Game:Update()
Verse.Root_Play:Update()
#25
For comparison example, you can always "Harvest" Lungs, but if there is something wrong with them, you get another option too, titled "Remove". (( This is correct. ))

But in this case, you cannot "Harvest" Eyes, but if there is something wrong with them, you get a different option, titled "Amputate".

Just a minor English language nitpick, but I think Eyes should use verbiage "Remove" instead of "Amputate". I think "Amputate" is just for limbs?
#26
Since this one wasn't "prepare for a while, then attack" I figured I would wait it out to see what happened. After a while, I got:

Raiders from [Faction] are giving up and are leaving.

No error spam, though, which was nice.
#27
It happened again on my next raid, too, actually.

Six errors into the log:

Tried to get valid region out of bounds at (-1000, -1000, -1000)
Verse.Log:Error(String)
Verse.RegionGrid:GetValidRegionAt(IntVec3)
Verse.GridsUtility:GetRegion(IntVec3, Map)
Verse.CellFinder:TryFindRandomReachableCellNear(IntVec3, Map, Single, TraverseParms, Predicate`1, Predicate`1, IntVec3&, Int32)
Verse.CellFinder:RandomClosewalkCellNear(IntVec3, Map, Int32)
RimWorld.IncidentWorker_Raid:TryExecute(IncidentParms)
RimWorld.IncidentWorker_RaidEnemy:TryExecute(IncidentParms)
RimWorld.Storyteller:TryFire(FiringIncident)
RimWorld.Storyteller:StorytellerTick()
Verse.TickManager:DoSingleTick()
Verse.TickManager:TickManagerUpdate()
Verse.Game:Update()
Verse.Root_Play:Update()

Tried to spawn Raygun out of bounds at (-1000, -1000, -1000).
Verse.Log:Error(String)
Verse.GenSpawn:Spawn(Thing, IntVec3, Map, Rot4)
Verse.GenSpawn:Spawn(Thing, IntVec3, Map)
RimWorld.IncidentWorker_Raid:TryExecute(IncidentParms)
RimWorld.IncidentWorker_RaidEnemy:TryExecute(IncidentParms)
RimWorld.Storyteller:TryFire(FiringIncident)
RimWorld.Storyteller:StorytellerTick()
Verse.TickManager:DoSingleTick()
Verse.TickManager:TickManagerUpdate()
Verse.Game:Update()
Verse.Root_Play:Update()

Tried to get valid region out of bounds at (-1000, -1000, -1000)
Verse.Log:Error(String)
Verse.RegionGrid:GetValidRegionAt(IntVec3)
Verse.GridsUtility:GetRegion(IntVec3, Map)
Verse.CellFinder:TryFindRandomReachableCellNear(IntVec3, Map, Single, TraverseParms, Predicate`1, Predicate`1, IntVec3&, Int32)
Verse.CellFinder:RandomClosewalkCellNear(IntVec3, Map, Int32)
RimWorld.IncidentWorker_Raid:TryExecute(IncidentParms)
RimWorld.IncidentWorker_RaidEnemy:TryExecute(IncidentParms)
RimWorld.Storyteller:TryFire(FiringIncident)
RimWorld.Storyteller:StorytellerTick()
Verse.TickManager:DoSingleTick()
Verse.TickManager:TickManagerUpdate()
Verse.Game:Update()
Verse.Root_Play:Update()

Tried to spawn Frenchy out of bounds at (-1000, -1000, -1000).
Verse.Log:Error(String)
Verse.GenSpawn:Spawn(Thing, IntVec3, Map, Rot4)
Verse.GenSpawn:Spawn(Thing, IntVec3, Map)
RimWorld.IncidentWorker_Raid:TryExecute(IncidentParms)
RimWorld.IncidentWorker_RaidEnemy:TryExecute(IncidentParms)
RimWorld.Storyteller:TryFire(FiringIncident)
RimWorld.Storyteller:StorytellerTick()
Verse.TickManager:DoSingleTick()
Verse.TickManager:TickManagerUpdate()
Verse.Game:Update()
Verse.Root_Play:Update()

Tried to get valid region out of bounds at (-1000, -1000, -1000)
Verse.Log:Error(String)
Verse.RegionGrid:GetValidRegionAt(IntVec3)
Verse.GridsUtility:GetRegion(IntVec3, Map)
Verse.CellFinder:TryFindRandomReachableCellNear(IntVec3, Map, Single, TraverseParms, Predicate`1, Predicate`1, IntVec3&, Int32)
Verse.CellFinder:RandomClosewalkCellNear(IntVec3, Map, Int32)
RimWorld.IncidentWorker_Raid:TryExecute(IncidentParms)
RimWorld.IncidentWorker_RaidEnemy:TryExecute(IncidentParms)
RimWorld.Storyteller:TryFire(FiringIncident)
RimWorld.Storyteller:StorytellerTick()
Verse.TickManager:DoSingleTick()
Verse.TickManager:TickManagerUpdate()
Verse.Game:Update()
Verse.Root_Play:Update()

Tried to spawn Bashkire out of bounds at (-1000, -1000, -1000).
Verse.Log:Error(String)
Verse.GenSpawn:Spawn(Thing, IntVec3, Map, Rot4)
Verse.GenSpawn:Spawn(Thing, IntVec3, Map)
RimWorld.IncidentWorker_Raid:TryExecute(IncidentParms)
RimWorld.IncidentWorker_RaidEnemy:TryExecute(IncidentParms)
RimWorld.Storyteller:TryFire(FiringIncident)
RimWorld.Storyteller:StorytellerTick()
Verse.TickManager:DoSingleTick()
Verse.TickManager:TickManagerUpdate()
Verse.Game:Update()
Verse.Root_Play:Update()
#28
Couple minutes later I got spammed repeatedly with ...

Pirates from [Faction] are beginning their assault!

... and the below error got spammed repeatedly into console.

Once it started to happen, it seems there is no way to fix it. Even re-Save / re-Load continues to spam the error. I had to roll back to an earlier save before the raid failed to spawn.

System.NullReferenceException: Object reference not set to an instance of an object
  at Verse.AI.Group.TransitionAction_WakeAll.DoAction (Verse.AI.Group.Transition trans) [0x00000] in <filename unknown>:0
  at Verse.AI.Group.Transition.Execute (Verse.AI.Group.Lord lord) [0x00000] in <filename unknown>:0
  at Verse.AI.Group.Transition.CheckSignal (Verse.AI.Group.Lord lord, TriggerSignal signal) [0x00000] in <filename unknown>:0
  at Verse.AI.Group.Lord.CheckTransitionOnSignal (TriggerSignal signal) [0x00000] in <filename unknown>:0
  at Verse.AI.Group.Lord.LordTick () [0x00000] in <filename unknown>:0
  at Verse.AI.Group.LordManager.LordManagerTick () [0x00000] in <filename unknown>:0
  at Verse.Map.MapPostTick () [0x00000] in <filename unknown>:0
Verse.Log:Error(String)
Verse.Map:MapPostTick()
Verse.TickManager:DoSingleTick()
Verse.TickManager:TickManagerUpdate()
Verse.Game:Update()
Verse.Root_Play:Update()
#29
Got a red-letter notification for a Raid, but the enemies entirely failed to spawn.

Simultaneously, got these errors in console:

Tried to get valid region out of bounds at (-1000, -1000, -1000)
Tried to spawn Matthias out of bounds at (-1000, -1000, -1000).
Could not find siege spot from (-1000, -1000, -1000), using (-1000, -1000, -1000)

Of note, the red-letter notification did NOT indicate "Siege", it was just normal "Raid" (they will prepare for a while, then attack).

Sorry, don't know how to replicate this one, but figured I'd report it anyway.
#30
I did it! Hooray!

Code is below.

The magic seems to be that the Constructor for the Component is called in all cases when a level is loaded (but not at the menu), even though for existing games, the Map doesn't actually gain the Component. So this is a solid starting point. And you cannot perform the function of "ensureComponentExists" from within the Constructor itself (my guess is some perfectly sane reasoning about why it is awful to nest constructors), but LongEventHandler.QueueLongEvent and/or static method (not sure which, or both) gives us whatever delay/context is necessary to land in the right place and be able to work our magic, even without specifying any significant textKey into QueueLongEvent.

public class MapComponent_OrderedHauling : MapComponent
{

public MapComponent_OrderedHauling(Map map) : base(map)
{
LongEventHandler.QueueLongEvent(ensureComponentExists, null, false, null);
}

public static void ensureComponentExists()
{
foreach (Map m in Find.Maps)
{
if (m.GetComponent<MapComponent_OrderedHauling>() == null)
{
m.components.Add(new MapComponent_OrderedHauling(m));
}
}
}

}