#Advanced Automation
1 messages Β· Page 3 of 1
Would it be possible to get a Wild card for Input/output meaning Any good
example Grill:
condition:(gt (sig Inventory.OutputGood.GrilledChestnut) 3500)
action:(act Pausable.Pause)
condition:(lt (sig Inventory.OutputGood.GrilledChestnut) 1000)
action:(act Pausable.Unpause)
becomes example below and would work with any selected recipie:
If there is multiple output variables it takes the biggest /lowest one (depending on if GT or LT)
meaning internaly its an or for all output good types
condition:(gt (sig Inventory.OutputGood.Any) 3500)
action:(act Pausable.Pause)
condition:(lt (sig Inventory.OutputGood.Any) 1000)
action:(act Pausable.Unpause)
would be good to also allow for input goods if needed.
other usecase farm instead of:
condition:(or (gt (sig Inventory.OutputGood.SunflowerSeeds) 3000) (gt (sig Inventory.OutputGood.Carrot) 3000))
action:(act Inventory.StartEmptying)
it becomes:
condition:(gt (sig Inventory.OutputGood.Any) 3000))
action:(act Inventory.StartEmptying)
also maybe flooded as input?
Pattern in the signal is problematic. Signals trigger a callback when the value changes. Pattern would complicate the handling logic a lot. And as far as I can tell, it's only a syntax sugar in the described usecases?
hmm well if you have GrilledChestnut as a signal and switch to a different recipie you get an error.
so you can not use any other mod that change recipie together with automation on a building? or is the error a soft error and will test other triggers?
also could not copy paste

am I correct that even if you used a template for this, you'd have to re-import it when changing the recipe?
Switching recipe usually changes the range too. Because different recipes assume different output amounts.
wait can you define a index say Good [0]?
meaning would this be valid?:
condition:(gt (sig Inventory.OutputGood[0]) 3500)
action:(act Pausable.Pause)
condition:(lt (sig Inventory.OutputGood[0]) 1000)
action:(act Pausable.Unpause)
would only trigger for good 0 but would be more generic
actual lisp wouldn't use [i] notation fwiw
or get it in an other form
It's not working this way. When inventory changes, it says "good ABC has changed". All who registered for this signal get a reaction. Patterns, even if it's an index, would require a complete different approach. In fact, index is even worse π
you could still resolve it at parse time
but feels like i have seen some way to define what good without setting a specific good name
so its set at parse time
yes, if you use template import you can write a template which queries the single output good
You can get the selected good name via preprocessor. And it's parse time. Which means it doesn't consider the runtime changes.
I didn't get an answer on this though
well if it possible to set with a preprocessor maybe you could trigger re parse if recipe is changed? and even if i have to edit it to redo its better than current π
so how would i with current system write it to have a preprocessor and get the good name
If your template has preprocessor statements, then yes - you need to reimport.
When I asked about templates before, Piisfox posted theirs which includes for example (ge (sig Inventory.OutputGood.{%(getstr SingleGoodAllower.AllowedGood)%}) {%(mul (getnum Inventory.Capacity) 80)%})
this is for warehouse type buildings, I don't think Inventory.Capacity exists for production buildings
is ruby a lisp? edit: no, it is not
I tried lisp and scheme tags before and at least in the textbox they didn't work. also mobile has a more restricted subset of highlighting rules enabled anyway
I guess for production buildings it's {%(getstr Inventory.OutputGoods 0)%}
you should just look at the file Piisfox posted
this gives me an error
maybe you can only use these in the import window?
sorry I forgot about this for a while but I finally turned the setting on and went back to that map, and it displays the expected values in the UI for the full expressions, so it's only when it's translating the script to text for the UI that it isn't dividing the constants, I guess
I will change the view for the non-evaluate mode. It seemed to me logical to show the raw values there, but apparently it creates confusion.
But it's after the vacation.
If it were always raw it would be okay, but most of the time it shows the processed value
@hardy brook
There isn't a direct way to check the global quantity of a resource, and even if there were, it wouldn't be very useful because districts exist.
To get the capacity of a building, use
{%(getnum Inventory.Capacity)%}
To check a building other than the one the script is on, you need to create a custom signal:
;;;;Broadcast quantity any time it changes
condition:(eq (sig Inventory.OutputGood.Plank) (sig Inventory.OutputGood.Plank))
action:(act Signals.Set 'District1.Plank.Quantity' (sig Inventory.OutputGood.Plank))
;;;;broadcast capacity only when building completes or the script is changed
condition:(eq (sig Constructable.OnUnfinished.State) 'finished')
action:(act Signals.Set 'District1.Plank.Capacity' {%(getnum Inventory.Capacity)%})
Then, on the target building:
;;;;if planks in storage >= 4.00
condition:(ge (sig Signals.District1.Plank.Quantity.Sum) 400)
action:(act Pausable.Unpause)
Note the .Sum ending. if you have multiple signals with the same name, this will combine them.
.Max and .Min return the highest and lowest values, while .Count returns the number of buildings sending that signal (in case you want an average or similar).
thanks
A fairly extensive list of rules, including better versions of the ones I described above.
have you tried formate as ruby i do like that format for the lisp π
is there anything to check for breeding progress?
No.
technical limitation?
I'm out of PC right now, but i think you can get some data via getnum.
Keep in mind that getnum doesn't react on the value change. You can use the debug tickers, though.
Technically, anything can be done. The most important question is the price. If it takes a week of development and only one person needs it... you figure.
completely understandable
this wasn't calling me calling into question anyone's capability or generosity, I was not expecting to be the first one (assuming here, sorry) to ask about this
I love this mod, and it has no competitors for me
It's totally ok to ask π
I'm on vacation, but once back, I'll give some time to address the most important things.
my below-freezing-point social IQ usually makes that a risky proposition
Btw, feel free to file your ideas via github.
@south wedge : I want to pause a building that does not have all the materials yet. I want to pause hauling materials to the build site. On a warehouse with gears: see image, on the build site: see the oterh image. But the buildsite is not pausing or unpausing. What am i doing wrong?
Those rules don't run until the building is complete, unless you specifically check the construction status in the same rule.
ok, but how do i do this? Should it be an 'and' to the if statement?
Give me a few minutes and I'll see if I can come up with a working prototype for you.
I think i have it. now testing:
if: (and (ge (sig Signals.Stockpile.gear1) 1000) (eq (sig Constructable.OnUnfinished.Progress) 0))
then: (act Pausable.Unpause)
if: (and (le (sig Signals.Stockpile.gear1) 800) (eq (sig Constructable.OnUnfinished.Progress) 0))
then: (act Pausable.Pause)
UPDATE: Above seems to work
Similar, but importable.
condition:(and (le (sig Constructable.OnUnfinished.Progress) 100) (lt (sig Signals.District1.Log.Quantity) 200))
action:(act Pausable.Pause)
condition:(and (le (sig Constructable.OnUnfinished.Progress) 100) (ge (sig Signals.District1.Log.Quantity) 500))
action:(act Pausable.Unpause)
In nutshell, there are rules that run only on a finished building. And there are few that run on unfinished. If the rule is shown "gray", it's not being evaluated and awaits the building to complete.
I should note that
(ne (sig Constructable.OnUnfinished.State) 'finished')
Does NOT work for this; it seems to fail to update.
ok, seems a little bit strange that that doesn't work. But hey, at least we got it working using the .Progress π
It's because there is no event "building is not finished". Even if I were to create one, it would fire only once when you save the rule.
The progress event is different since it's ticking as the progress is being made.
of course..... I just read about this in the help....
What is the correct getstr preprocessor command to get the second input good of a building?
I assumed that the 0 in {%(getstr Inventory.InputGoods 0)%} was to select the first one but changing it to a 1 doesn't do anything
Hmm. It should change. All arrays are 0 based. However, it only gets an item at the index. If there are two equal items at 0 and 1, then you get the same value.
Moreover, it will throw if you try to get a value beyond the range.
I just set it to 10 on a fermenter set to soybeans, which should only have two inputs, and it still says CanolaOil
the result of (getnum Inventory.InputGoods) is 4 so 10 should definitely throw
In the meantime I've just manually edited these rules
This is a bug π
What do the logs say?
(Enable verbose logging for the best result)
ππͺ²πͺ°πππͺ±πππͺ³π¦π¦
oh I don't know where the log file is on linux
ah I found it
I enabled all logging options, then restarted the game just to do this so this log shouldn't be too long
oh I should turn the logging back off before I forget and just have awful performance next time I play
Playing with the max logging level enabled is my normal mode in the last 2 years.
If debugging mods can be considered "playing" 
The performance hit was definitely noticeable
I honestly stated it in the settings hint text π
and I've had various logfiles end up getting really big before so I don't want to unexpectedly run out of disk space lol
All my drives are nmve, but even with them it impacts performance.
Men. How small is your hard drive? π
(I hate mobile for its weird autocomplete)
well I made the mistake when setting up my pc of partitioning the os and user files, and now the os partition has only like 1-3GB of empty space, and if you have a very particular kind of bug, you can get logfiles to get that big over the ~3 months I usually leave my pc running for between restarts (that particular case was caused by a bad usb driver resetting the device every second, printing two log lines). I also once had an issue where the graphics driver broke and wrote like 500MB per second to the X11 logfile (which goes on the user partition) for ~10s, then another couple GB after about a 30s break. so y'know, things happen
Wondering if it is possible to have a signal for the number of unemployed bots. I want to stop building bots at some point. @south wedge
Haha. Same mistake i did also. When I was young, having a separate drive for OS was a good idea. Now, if your OS is on nvme, stop jerkng around. Make one big drive and be happy.
The reference sheet:
https://timberborn.wiki.gg/wiki/Game_Directories
This page serves to track where on your computer various items are saved.
yeah, I found it in AppData/LocalLow iirc
the rest of the game files are in Documents so it took me a moment of searching
yeah, number of bot/beaver workplaces in district as signals would be nice. if you're controlling multiple buildings that way, rather than do it fully manually, you can just use a random building (I prefer to use a stream gauge because it stands out almost like a flag and has no workers) to set a custom signal for it, so that you only need to edit it in one place
Bots/beavers per district is already supported.
Yes, but I like to know how many are unemployed...
I said bot/beaver workplaces
is there any chance of getting an action to set sluices to automatic?
#1190169064383991858 message
while it's definitely possible to recreate the functionality, typing those settings into a script and polluting the global signal namespace (which you have to scroll through in the dropdown if you use the rule constructor) and potentially needing to place an extra stream gauge (which is 3 blocks tall) is pretty annoying tbh
Hey, what's happening?
a conversation
the conversation?
yeah
lol
So @Igor, did you ever get that script I did way back that never worked to work right?
I think it was logically sound, and then I got distracted by some IRL stuff and other games...
Also, how's the state of this mod these days? I'm just curious? It been steadily improoving over the last few months as usual?
that question was to everyone, I get my ping won't work ringt
Tbh, I think I forgot about it π Only a week since the vacation back and a lot of stuff already happen IRL. Could yo give the script again (or a link to the message)?
Last 3 weeks on pause. I was in Europe vacation. In fact, I didn't even ran TB since I left π
But to the best of my knowledge, there are no critical bugs in the mod. There are feature requests, though.
So, finally got some time for the beavers π I will give another try to gathering automation: check if there are things to cut/gather for the flag. The last time I tried, I didn't find any better way than checking availability every frame. But sometimes you need to put things aside and get back later. We'll see.
Well, the easiest one is probably also the most useless⦠simply detecting when the building has nothing to do in range.
The one case I could see where it would be useful is scavengers; the only reason you typically see it from them is when the ruin runs out.
For gatherers, it only comes up if you make a configuration error. For lumberjacks, it only comes up if have no trees or tree planting spots marked for cutting in range, which might be useful in the early game, but becomes irrelevant once you have free farms.
Then there is builders, farmers, and foresters, none of which ever throw the "nothing to do in range" error. Personally, I don't think there's any point in ever automating those; they're all key facilities and unless you go overboard with builder's huts, well worth just leaving the beavers there, even if it is slightly less efficient.
Alas, there is no trigger that tells you if there are things to gather or not. The worker on the site is the source of this information. If you unassign worker, you will never know if there are new things to gather. This is where "every tick" calculation comes from. I can tick on every rule and simulate a worker presense, but it will kill performance.
Have you noticed that many beavers in colony drop FPS a lot? It's because fo this: every beaver runs a lot of checks every tick.
What I was talking about there was specifically the building error pop-up; it would work for ruins, but I don't think it would work well for anything else.
Would it be possible to put the signal on the plants themselves, and have them notify the all buildings checking that signal when the crop is ready, as an event?
I kind of expect it would require some weird tracking to subscribe buildings to plants though, unless it was transmitted generally and then the building says "that's in range" or "that's out of range."
The pop-up only works in a few cases. And since you have a popup, you can act π What we all really need is dealing with the cases without popups. E.g. cutting trees in an area with the trees growing. Or gatherable things being maturing. Like if Gatherable.Ready.Berry > 10, then ...
And as I mentioned, the source of "nothing to do" is the worker. No matter if the popup shows on the building, it's the beaver who sets it. Remover the beaver, and you will never know if new things got available to the flag.
A first version of something
Writing a number of logs to logs is a bit confusing, yes π€£ But it's very beaver.
This time, I found a way to make it event triggered!
There are corner cases, though. As usual. 80% of the efforts always go to those 20% "corner cases" π
Can you force the check to trigger less often for this?
Asking the obvious, on the off chance you somehow did not consider that
It's my main focus. I will not release a solution that refreshes every tick. I play this game too. I don't want my FPS killed π€£
I already have enough trouble running the game at more than 10x, if my beavers go up to high double digits, so I definitely appreciate that
10x is a dev mode, isn't it? You can't complain about performance issues in it π
7x is the highest speed that has to be officially supported.
IIRC, anyway
nevermind, >>> is 7x
oops
Folks, need an opinion. Do you think the automation mod should be above the game logic (the lore) or not?
An example. Let's say I make an automation condition for the Forester: "if can plant". No doubts, it's a useful condition (especially, in the early game). But it goes against the game lore: if no one is sitting in the tower at the Forester, how would anyone know a tree needs to be planted? Should it be a concern?
imo it's not a concern, nobody has to go and manually read the stream gauges or operate the floodgates either
Hmm, that's a good point.
I got a working solution. Now testing and making a template. Works on any building that gathers anything. including the farmhouse.
The solution is fully driven by the events. The condition doesn't take game time unless something grew up in the controlled area.
And while making this signal, I also figured out it would be nice to show how many gatherables are in the affected area for the flag/farmhouse.
I always wanted a way to count the number of "Crops" in an area without manually counting them. Would be cool π
THough if you had multiple farms in one area the Total count would be incorrect as there would be overlap.
In case of you want to try it out before the release.
Hi! I was happy to find out that Automation has added support for Moddable Weather. However the season signal for Rainy season does not seem to be working properly. Is there something I can do to fix it?
Hi. Is it not triggering on the season change?
While the season is Rain, condition "season β Rain" is highlighted as active - as per screenshot above. On another building I saw that Rainy season was registering as Temperate weather. (I have yet to test more infrequent seasons.)
Got it. I will check.
Well, et least for "Monsoon" season it works as exepected. Will try to roll Rain season now.
So, figured it out. The game naturally supports only different "hazardous seasons". So, anything that is not hazardous is "temperate weather" for the automation mod. You can use it as a workaround for now. I will check how the mod implements various temperate seasons to see if it can be checked in a way that is not too specific.
Created a bug. So far no idea how to fix. https://github.com/ihsoft/TimberbornMods/issues/118
Makes sense. Thank you for investigating π
So, I gave it a try and played a long session with the "can gather/can plant" conditions. And I discovered, this game can be played with small stockpiles π Instead of making big stockpiles and producing goods reserve, you build factories and chains. The workers are being re-assigned between the building as needed to make the whole system working. It's a kind of new experience. Which I liked. Working on fixing the edge case (there are a lot, as always), and then there will be a release.
Still in testing, but will go live soon.
you've reinvented just-in-time logistics
Yeah, I generally try to play that way, because I find with huge stockpiles by the time I notice something is draining I am deeply in trouble
Small quality-of-life ask - it would be nice to have a way to just pause the rules on a building if I want to do some manual micromanaging for an unusual task, without having to save the rules somewhere else to restore later
I'll think about it. It's not exactly in the design concept, though.
Ok. I found the export/import, which makes it not so bad to just copy&paste a set of rules to notepad and back. Better than copying each rule one by one
Got another bug report:
I have a gate with the rules
precondition:(?act Floodgate.SetHeight)
condition:(or (eq (sig Weather.Season) 'BadtideWeather') (ge (sig Signals.LilyPond.Depth.Avg) 90))
action:(act Floodgate.SetHeight 200)
condition:(and (eq (sig Weather.Season) 'TemperateWeather') (or (lt (sig Signals.LilyPond.Depth.Avg) 70) (gt (sig Signals.LilyPond.Contamination.Max) 5)))
action:(act Floodgate.SetHeight 0)
We just switched to badtide, and the gate is showing fully closed (height 2.0) but all my water is rushing toward it and just disappearing (it's not flowing to the other side - that doesn't lead anywhere except a (now blocked and pressurized) source.
I think what is happening is that, because Signals.LilyPond.Depth.Avg keeps changing, the signal keeps re-running and setting the gate over and over on every tick. And floodgates, when you change then, delete all the water contained in their block.
So somehow that's happening even though the block isn't changing - it's just getting set to 2.00 over and over
I think what's needed is for Floodgate.SetHeight to not do anything if the gate is already at the requested height
If I make it if (eq (sig Weather.Season) 'BadtideWeather') then (act Floodgate.SetHeight 200), then the "suck up all the water" effect doesn't happen, I think because the sig doesn't keep re-evaluating the way a user-defined (act Signals.Set 'LilyPond.Depth' (sig StreamGauge.Depth)) does
The signals are not triggering if the value hasn't changed. How do you change "Signals.LilyPond.Depth.Avg"? And the SetHeight method used to be very simple. May be they changed it, I'll look at it.
I have a couple stream guages that all have the same
if (ge (sig StreamGauge.Depth) 0) then (act Signals.Set 'LilyPond.Depth' (sig StreamGauge.Depth))
and then you provided the .Avg aggregator suffix. I'm doing the averaging because opening the gate on a pressurized source causes quite a lot of sloshing
So Signals.LilyPond.Depth.Avg is definitely prone to triggering frequent changes (until the sloshing settles down, which it won't if the gate keeps deleting water)
Hmm. Interesting. I'll check this scenario. Not a big deal to add the height check.
Yep, I had just found the pond weirdly empty a couple times, but this time I caught the transition - it was full right as the badtide hit, then drained in seconds with the current rushing toward the supposedly-closed gate
I can make a quick version so you could verify if the simpel check helps. Give me 10 minutes.
which, like I said, only leads to a an underground (fully closed and pressurized) source, so there's nowhere the water could have been going on the other side
sure
Np, not using that mod
I plan to release 2.7.0 soon. With all the edges polished. Maybe today.
Though this is Water Beaver Overhaul, so it's lapan's 3x3 Floodgate Dam
which is weird 3x3 thing where the floodgate part is the 5 voxels in a cross
but it responds to Floodgate.SetHeight so I assume it's internally the same game module
Most buildings are made from the same game component. Automation doesn't care about the building, it only needs a specific component. If it's there, then the action/signal is supported.
Btw, checking for height may not help. If you trigger the height between 2.00 and 1.99 you will still be deleting water.
Yeah, I did not do that - the actions are just setting it to full open (height 0) or full close (height 2)
and there's hystersis between the open (< 0.7) and close (> 0.9) thresholds, so it shouldn't ever go back and forth rapidly
So what it should have been doing is closing (set to 2.0) over and over, as the average signal change but led to the same answer
If I get the game code correctly, it only deletes water that is below the height. I may be wrong. Let's see.
Ok, that would have been the case, since we were at ~1.85 and setting the gate to 2.00
With your test build, the gate snaps shut without deleting water
I'll apply the fix to the main build then. Thanks for the report!
(well, it flows briefly until the wave gets to the stream gauges and they change. The rule should apply immediately, because we're in badtide, but that signal won't change to make anything re-run
which is fine and just how things work
it would presumably still have applied right at the change of season, if that wasn't already in the past when I saved the game and came over here to post π
Thanks for an incredibly quick turnaround!
Now, when I checked the code more precisely, I see how it happens. Indeed, it deletes any water, not only that is below the height 
even deleting water below the height would be bad here, since all my water is below the height the gate is being set to
it seems like it would be quite rare for there to be much water present over the top of the floodgate
Now back to trying to figure out how to deal with a diversion tunnel that takes a long time to get up to speed. I'd really like to open it based on the forecast, hours before the badtide actually hits.
But Automation doesn't have signals based on the forecast, or on the time of day, so I don't think I can get that fancy
Not in this version. I plan to slow down a bit on the new signals/actions and focus on UI.
Yeah, I suspect not everyone reacts with "ooh neat, it's lisp!"
but hey, I like lisp 
First thing to add, would be the signal export dialog. I found it boring to manually changing code each time I need to make a signal public.
My biggest gripe is that the "bogus condition" means to set a signal is kind of clunky.
if (ge (sig StreamGauge.Depth) 0) then (act Signals.Set 'LilyPond.Depth' (sig StreamGauge.Depth))
where the condition is just always true, and only serves to mention a sig and make things reevaluate.
It would be nicer to tie in with something like More Naming and just say that if I named that Stream Gauge LilyPond that I could refer to its building signals from elsewhere as Signals.LilyPond.StreamGauge.Depth (or whatever) without putting any rules on it.
This would not work. Each signal and its listeners must be registered for the system to efficiently work.
Yeah, just conceptually I'd rather register them from the listening end, and have the rule to publish it just be auto-created/hidden
Instead, I plant to make a dialog which you can open and simply select which signals you want to export. And getting global signal names from that mod could be a nice feature.
I'm just thinking out loud here, if you already have a plan feel free to just say knock it off and I'll see what you've come up with π
FYI I don't think you'd have to particularly integrate with that mod, it's just makeing the UI for naming things that already exists available on buildings other than district centers
but I think the component/property is base game
Back to the Floodgate.SetHeight deletes water - I bet this is also why I got such a rush of contamination when it reopens after the badtide. I had expected it to be basically clean(-ish), because we closed it when it was clean water and then the pressurized chamber should have been full - other than evaporation, there wouldn't be any room for badwater to enter the cavern behind the gate. But if the gate is deleting water... it's probably doing so from both sides, and thus the cavern is eventually full of badwater.
If so, the fix will greatly improve hundreds of beavers lives π
That's not why: Even if a source has no space to spawn water, it will still contaminate the water in the space to prevent cheese.
Such "thinking" is useful. I spent too much time with the mod, so I may not see some things. So, please, feel free to throw your ideas π
v2.7.1 (September 5th, 2025):
- [Fix] Fix the "can plant" template definition.
- [Feature] Add debug signals for district stock tracking:
Debug.DistrictStockTracker.<GoodId>. - [Feature] Add
Collectable.Readysignal that tells how many gatherable or cuttable resources are in the range. - [Feature] Add
Plantable.Readysignal that tells how many plantable resources can be planted in the range. - [Feature #82] Add templates to pause buildings if they can't gather or cut anything.
- [Feature] Add a template to pause buildings if they can't plant trees or crops.
- [Feature] Implemented extensions support to allow other mods to modify rules options.
- [Change]
ModdedWeathermod support moved into a separate extension mod:Automation+ModdedWeather. - [Fix] In "describe mode," show action argument values as real numbers instead of script fixed point values.
- [Fix] Don't change the floodgate height if it is already at the desired level. It may trigger "water deletion" without any useful effect.
@distant fern Note, that now you need a new mod installed! But it will give you the full support.
oh, I just remembered that I forgot to ever say that the confirm button randomly switches from right to left between the main window and the import window and so you have to move the mouse way further than should be necessary. It also violates convention to not have confirm on the right so it's pretty easy to have a lapse in attention and cancel instead of save. (I haven't played in a while so maybe I'm misremembering specifically which window had it on the wrong side but I think this is right)
Could you please give an example? As you may guess, I don't randomize the dialog appearance on purpose π So I need to see the cases when it happens. And how it looks.
FYI, all the confirmation dialogs that Automation shows are from the stock game. The only custom dialog is the rules editor one.
alright I'll go grab an actual screenshot
so in the import rules window, save is on left and cancel is on right
you can see both windows in this one screenshot actually so conveniently I don't need to send a second to show that the side flips
Ah, now I get it.
New UI. Prototyping as of now. Trying to find a way to keep it compact, but still informative.
Collapsed view.
oh dedicated signal rules is nice
Hi all new to the automation mod, I have a question about automating the sluice. Wanting it to close during the drought and go to auto in the temperate season.
apparently it's intentional that you can't set it to auto automatically
so you need to add stream gauges and use signals to recreate the auto settings
I kinda know how to do that, well good luck to me
@timber portal do you know how to write scripts?
I know some, though I'm going to bed. there's a few people here who know them pretty well though, and the github tutorial/docs/readme is decent
Ok thank you
In fact, it's just a syntax sugar π Under the hood, it's If (eq (sig ABC) (sig ABC)), then (act Signals.Set "CustomSignal" (sig ABC))
Just a dedicated UI to show and setup such rules.
the ui is still nice
even if it's reusing the previous system, which is just prudent
You may say it's not a big change. It is. And I spent a whole day to make it working π€£
Btw, in the final release the buttons will be replaced with icons. If you have your ideas, fire them here!
Why do I ask for it? I'm old π€£ A simple example: the "save state icon" used to be πΎ. But how many people today understand it? π
In the current release, we need icons for: "setup rules", "copy rules".
For the next release (maybe): "disable all rules", "clear all rule".
- a Cog maybe for setup?
- and 2 pages for copy
these i can create later if wanted:
- For disable maybe a power icon
- Clear a trashcan
copy icon maybe to detailed but easiest to check π
The :"disable" button needs two states: enabled=>disabled, and disabled=>enabled. Maybe use different color? 
or toggle? -text
Hello, I am currently testing your mod.
Unfortunately, I don't speak English, so it's difficult to figure out how to connect the water flow indicator to other buildings.
Could someone possibly explain to me exactly how to do this? (I am on the experimental Timberborn branch).
Maybe i'm dumb but I can't find ANY way to make Boolean operators work, and your exmaple on the github repository makes zero sense to me , can someone give an example of how to use AND or OR in automation logic? I'm needing to check two conditons at once and nothing i'm trying works.
(and (le (Sig Signals.Sour) 3) (ge (Sig Signals.Sweet) 3))
Thanks let me try that
You might get an error that those signals don't exist. Substitute them for whatever you want.
It seems to work, thank you so much for an example I could follow!
Yeah, the custom signals thing is not easy to understand without at least basic programming background. I'm working on UI improvements that would hopefully make it a bit easier.
Thanks! It looks nice now π
The copy menu needs tweaks. Sometimes, you may need to copy only rules. Or only signals. Or both. Ideas how to make it intuitive?
The simplest approach is to let the "copy rules" to copy everything (under the hood, they are all rules). However, from the UI perspective, it may be not the expectation.
Maybe check for a modifier? Like Ctrl? 
And the Ctrl will of curse be LEFT 
Moreover, there is a secret feature coming: ||links!||. It will be a third line in the UI fragment. The same copy issue applies to it.
Thanks, I'll just wait then.
Right now, I'm just looking at what might be useful for my next new start with mods.
Nowadays, I do most things without mods anyway.
Your waiting may become.... endless π Sorry, but I have no timelines. It's the work I do when I have free time. It can happen these weekends, or in the Q1 2026 
If necessary, I'll wait until 2060, provided nothing else comes up.
I don't plan on quitting this game; it's too much fun.
Even if I don't play it all the time now.
The mod has other useful features as well.
So far, I've been able to stop my water without it when I deem it necessary.
can someone explain why this mod isn't working the way I expect?
for the life of me I can't make it stop a building if it's out of material, and if it's paused will beavers NOT deliver materials to it?
Use "remove workers" instead of pausing. That's why it is there.
Removing all inventory from paused buildings is a base-game mechanic.
Thank you.
I figured I was doing something wrong but, it's hard for me to debug, so I appriciate the help!
if two rules conflict is there a priority system or how does it handle that?
like if one rule says pause building and another rule says unpause
Most likely, it will throw an error and turn off all automation for that building until you fix it.
If that happens, you will have an automation warning in the bottom left.
in the log (where is says so and so was born or died?)
No, just above that, with all the other warnings.
In general, if you have two conflicting rules, the outcome is unknown. Rule order might give some determinism in a particular case, but overallβno. If you want the problem solvedβdonβt make conflicting rules!
The automation system is dumb. One day, Iβll add AI to itβitβll reject all your dumb rules, and basically play the game for you! But for nowβno plans.
The errors are thrown in not many cases. You need to really try to make it happen π If two valid rules change the same state, it's not a script error. It's a human error. Fix the human 
I asked AI, and got this. Are we good?
Folks, I'm very delayed in responses. There are reasons IRL. I read all your feedback. Thank you for leaving your thoughts and opinions. I can't promise to make all the fixes, but I will account it it when doing the changes to the mod.
Designing is a part of the process which is fun. Coding it is not that fun, since it requires game's restarts π€£ In fact, I hate making UI. But for most people it's 50% of this mod functionality
If not 100% 
What's not right here? π€£ How I "like" the edge cases 
So, if anyone wants to be a beta tester. The first working version.
Watch me try it out and make things worse
Any feedback so far?
Oh I wouldnβt dare attempt to try it out, as I said Iβd probably make things worse
Iβm not that tech savvy
I forgot I wanted to test this, but there's so much going on this week that it's probably not going to happen.
Hello, I tried searching through the discord, but no luck
From some of the screenshots I see, its possible to have a logical and as well as logical or operator
but I can't seem to figure out the syntax to make it work.
Basically I am fiddling with if OutputGood.A and OutputGood.B if both are at maximum capacity, pause the building
anyhelp with this is appriciated
Ok Reading more through the chat here, I realise its lisp like syntax
So this works
and (eq (sig Inventory.OutputGood.Grapes) 2000) (eq (sig Inventory.OutputGood.Apple) 2000)
Thanks for the help
also Discord is shit for documentation
(or condition1 condition2 ...)
You can have as may conditions as you want, but there must be at least two.
Documentation:
https://github.com/ihsoft/TimberbornMods/wiki
Last chance preview before it hits the prod. It will happen in 2-3 days.
No more panels going outside the screen.
This is the likely candidate now. TLDR: import/export function is now also relocated.
So, after playing it back and forth, I decided to separate signals and rules even more. Now, the copy function will be separate. You still can import/export rules regardless to if they are signal mappings.
Any thoughts? Pros/cons?
Like this
I don't see many cons tbh, but pros are very obvious
So, while working on this issue, I ran into a case that inevitably requires an update every tick β the flooded tiles and aqua growables depend on the water level, and thereβs no way to set up a callback for that.
I tried to avoid tick updates as much as possible, but in this case, thereβs no other way around it.
Luckily, Timberborn now has a parallel calculation system. The water was already simulated this way before, but only in the latest versions did they add a proper system that can be reused. So, I changed my approach β instead of avoiding tick updates, Iβll check if they can run in parallel. If yes, then itβs a green light.
The first attempt will be the Plantable.Ready signal.
If that works well, you can expect the long-requested βdistrict-scope goods signal.β
v2.8.2 (October 19th, 2025):
- [Feature] Full refactor of the entity panel UI.
- [Feature] Limit the number of rules shown in the entity panel. Check the settings dialog.
- [Feature] Update signal values in the entity panel.
- [Change] Move script rules import/export functionality to the building panel UI.
- [Change] Improve script errors handling in UI. Fix some edge cases when game could crash due to a script error.
- [Change] The
concatoperator now shows the numbers as floats instead of fixed-point integers. - [Fix] Properly display "add" operator when it has more than 2 arguments.
- [Fix #121] Moisture and contamination levels of the plantable spots are now considered when checking if planting is possible.
FYI, the import/export feature is to be changed too. Now, it doesn't make sense to have them separate. In fact, what we need, is the "text editing mode".
It will be one dialog soon. You open it to see the raw script text. You can import/export or edit.
Update broke things. Reports from other people with more details on workshop and github.
18:58:28 Mods.EbbAndFlow.Scripts.EbbAndFlowManager.Tick() executed in 00:00:00.1590025
First uncaught exception at 2025-10-19 18:58:28Z
ArgumentException: toExclusive 0 must be greater than fromInclusive 0 when scheduling T
Timberborn.Multithreading.Parallelizer.ValidateLoopRange[T] (System.Int32 fromInclusive, System.Int32 toExclusive) (at <6784b1dbc0584eb4b774276acf5dde9e>:0)
Timberborn.Multithreading.Parallelizer.Schedule[T] (System.Int32 fromInclusive, System.Int32 toExclusive, System.Int32 batchSize, T& task, System.ReadOnlySpan`1[T] dependencies) (at <6784b1dbc0584eb4b774276acf5dde9e>:0)
Timberborn.Multithreading.Parallelizer.Schedule[T] (System.Int32 fromInclusive, System.Int32 toExclusive, System.Int32 batchSize, T& task) (at <6784b1dbc0584eb4b774276acf5dde9e>:0)
Timberborn.Multithreading.Parallelizer.Timberborn.Multithreading.IParallelizer.Schedule[T] (System.Int32 fromInclusive, System.Int32 toExclusive, System.Int32 batchSize, T& task) (at <6784b1dbc0584eb4b774276acf5dde9e>:0)
IgorZ.Automation.ScriptingEngine.ScriptableComponents.PlantableScriptableComponent.StartParallelTick () (at <c411ba396d7e47b695ad7fefbe11823a>:0)
Timberborn.TickSystem.TickableSingletonService.StartParallelTick () (at <7fc669a6b33f423f87b0114220ef8f47>:0)
Timberborn.TickSystem.TickableSingletonService.TickAll () (at <7fc669a6b33f423f87b0114220ef8f47>:0)
Timberborn.TickSystem.TickableBucketService.TickNextBucket () (at <7fc669a6b33f423f87b0114220ef8f47>:0)
Timberborn.TickSystem.TickableBucketService.TickBuckets (System.Int32 numberOfBucketsToTick) (at <7fc669a6b33f423f87b0114220ef8f47>:0)
Timberborn.TickSystem.Ticker.Update (System.Single deltaTimeInSeconds) (at <7fc669a6b33f423f87b0114220ef8f47>:0)
Timberborn.TickSystem.TickerUnityAdapter.Update () (at <7fc669a6b33f423f87b0114220ef8f47>:0)
when unpausing a game
at IgorZ.Automation.ScriptingEngine.ScriptableComponents.PlantableScriptableComponent.StartParallelTick () [0x0001f] in <c411ba396d7e47b695ad7fefbe11823a>:0
but not sure what it does there or if other mods might cause issues with it
seems to be the same report on github and steam
got a full playerlog so he can see what mods your using?
sorry, not kept them π
Modded: true, official
- Harmony (v2.4.0)
- Mod Settings (v0.7.10.0)
- Bobingabout Script Pack (v0.7.10.0)
- Bobingabout's Housing Optimize (v0.7.9.0)
- TimberCommons (v1.13.0)
- TimberApi (v0.7.12.3)
- TimberApi UIBuilder (v1.0.2.0)
- TimberUi (v7.8.5)
- MoreGroups (v7.0.0)
- Unstuckify (v2.0.2)
- More Mod Logs (v0.1.11.2)
- Moddable Prefab (v7.2.0)
- RotatingSun (v7.0.1)
- SmartPower (v1.13.4)
- KnatteMaterials (v7.0.0)
- Seasons (v0.0.1)
- Lapantouflemagics Texture Pack (v1.2.0)
- Beaverpower (v1.1)
- FreeFlow (v0.2.1.1)
- Ebb and Flow (v7.0.0.1)
- Goods Statistics (v0.7.3.1)
- 1x1x2Storage (v2.4.5)
- zxuiji - Append Vanilla Resources (v0.7.0.01)
- Ladder (v3.0.4)
- Logstairs (v2.1.8)
- Frog Statue (v7.0.0)
- Staircase (v7.0.1)
- Power Shaft Extensions (v3.0.0)
- TImprove 4 Modders (v7.6.0)
- Grauschweif's Map Elements (v0.2.1)
- Torii Gates and Lanterns (v2.2.0)
- Whitepaws Faction U7 (v5.4.0)
- Whitepaws Frog Statue - Unofficial (v7.0.2 )
- MorePlants ! Reader (v3.0.8)
likely those
but on steam someone said it's same without mods, so i'm not sure this helps much
Thanks, for the report. I think I know what's the problem. Will release a fix soon.
v2.8.3 (October 19th, 2025):
- [Fix #123] ArgumentException: toExclusive 0 must be greater than fromInclusive 0 when scheduling T
v2.8.4 (October 19th, 2025):
- [Fix #124] Copy rules button is not working
v2.8.5 (October 19th, 2025):
- [Fix #125] The game frequently crashes when
Plantable.Readyis used and paths are changed.
4 updates in one day. It's a record π€£
Debugging custom signals turned into a hell
So, working on some dev tools.
v2.8.6 (October 20th, 2025):
- [Fix #126] Game crashes when selecting a building with the "chain" template applied.
Seems to be working. Thank you π
Nice log! π But what's the problem?
Crashed a few times after playing for a few minutes, no specific trigger afaik
Ah, Discord truncated the last lines, so I didn't see the crash report. Created a bug: https://github.com/ihsoft/TimberbornMods/issues/127
@potent verge The bug is very strange. It can only happen if something that can yield product not a LivingNaturalResource. I can't imagine any game object like this. Do you have any mod that affects gathering and cutting?
Scrap, I was using it as an auto off
THis I never tested. Will check now.
Yup! It was scrap. Damn, why didn't I test it?! 
Lol, to be fair it is one of the least needed uses for that
Yeah, hard to imagine that new sites will appear, lol. However, you may want to automate workers releasing.
V easy to avoid triggering tho now that I know
v2.8.7 (October 22nd, 2025):
- [Fix #127] Crash when attempting Collectable.Ready signal on ruin scavenger flag.
v2.8.8 (October 23rd, 2025):
- [Fix] Signal definition disappears in UI if allowed good is changed on stockpile.
- [Fix] Signals list is not updated in UI when changing allowed good or recipe.
- [Fix] Crash when saving definition of a signal that is not available on the building.
Guess what I'm doing? π
Test: ( 12 * 1 - 2 ) * 3 + 3 / 2 / ( 32 + 4 ) * 7
Deconstruct AST: (12 Multiply 1 Minus 2) Multiply 3 Plus 3 Divide 2 Divide (32 Plus 4) Multiply 7
Deconstruct Python: (12 * 1 - 2) * 3 + 3 / 2 / (32 + 4) * 7
BinaryOperatorNode { Order = 20, Operator = Plus, LeftOperand = BinaryOperatorNode { Order = 21, Operator = Multiply, LeftOperand = BinaryOperatorNode { Order = 20, Operator = Minus, LeftOperand = BinaryOperatorNode { Order = 21, Operator = Multiply, LeftOperand = ValueNode { Value = 12 }, RightOperand = ValueNode { Value = 1 } }, RightOperand = ValueNode { Value = 2 } }, RightOperand = ValueNode { Value = 3 } }, RightOperand = BinaryOperatorNode { Order = 21, Operator = Divide, LeftOperand = ValueNode { Value = 3 }, RightOperand = BinaryOperatorNode { Order = 21, Operator = Divide, LeftOperand = ValueNode { Value = 2 }, RightOperand = BinaryOperatorNode { Order = 21, Operator = Multiply, LeftOperand = BinaryOperatorNode { Order = 20, Operator = Plus, LeftOperand = ValueNode { Value = 32 }, RightOperand = ValueNode { Value = 4 } }, RightOperand = ValueNode { Value = 7 } } } } }
Something smart probably
Allow mathematical operations in the Rules/Signals π
Nope, it's more likely a Unity version of MathCad π
I managed to make a working parser for the expressions. So, in some future version there will be an alternative script syntax - Python-like.
So, after many changes, this is what I'm looking at (the example is intentionally ridiculous):
- Lisp-style:
(act Debug.LogStr (concat 'test: ' 123 '-' (round (div 10000 300)))) - Excel-expression style:
Debug.LogStr('test: ' & 1.23 & '-' & round(100.0/3.0))
FYI, in Excel (and Google sheets), & is a string concatenation operator. It's what (concat a b c ...) in automation is today.
Now, adjusting the code for the new parser. The 1.0 branch version came out at a very inconvenient time
So, no updates for Automation for 1.0 for now.
And a "side effect " - some formula optimization!
I am getting some error when I try to load Automation and its requisite mods. did something change?
Are you on the experimental branch?
yes
Most of the mods are not updated to experimental 1.0 version.
TL;DR; The recent changes in the experimental branch affect the very foundation - the Unity eventing system. A very extensive testing is needed to verify if no components get broken.
I got this expression working #PY Inventory.OutputGood.Water >= 100 and not not 100 != 200!!! Lol, I bet not many people will also get excited, but I am a lot.
At the end of the video, the game crashed 
Hey all. I am trying to use Automation for an (I think) simple task in Timberborn. I have approximately 900 storage for logs, but my lumberjacks keep filling it up. So I set a signal on all of the log storage (there are about 5). I called the signal "Storage.Wood". Then I set two rules on all of the lumber flags.
If (ge (sig Signals.Stockpile.Wood) 70000)
Then (act Pausable.Pause)
If (lt (sig Signals.Stockpile.Wood) 55000)
Then (act Pausable.Resume)
However it doesn't seem to be working. Do I need to do anything to add up the multiple signals to get a total?
I know the mod is working in general - I set up come conditions for floodgates based on season, and they are working fine. I am on the main trunk (0.7.10?) not the experimental version.
Thanks!
Add .sum to the end of both signals on the lumberjack flags.
Otherwise, it will simply return the value of the first signal with that name.
Others include min (lowest individual signal with that name), max, and count (total number of signals with that name).
Sum and count can be used together to get an average.
Okay, I'm ready to share an early demo. Meet the v3.0.0 preview! Now, you can choose which script syntax you prefer: Lisp or Python.
Downside: the multi argument operators are not supported yet. E.g. (and a b c) will fail to parse, but I bet you can quickly fix it to the Python syntax π
Use with caution! Save files may get broken (in term of expressions parsing failures) in the final release.
(Ah, and it's only for the main game version)
Anyone had a chance to crash the game yet? π These days, I have very little time for playing, so cannot give good testing.
Sorry, Unity is crashing me first π€£ , game must have to wait ...
Well, supporting Lisp multi-argument operators was a pain. But it's done now! Will be in preview1.
The infix syntax science is focused on the binary operators: a + b. When you write a + b + c - it's a tree of binary operators under the hood. Not in Lisp, where you can have one node with 3 operands: (add a b c). Now, when all the framework is built on top the Lisp approach, it becomes tricky to support the other solutions π
And FYI. Re-factoring the Lisp core in the scripting engine is infeasible.
Multi-arguments operands from the older versions are now supported. Plus, some other fixes.
v3.0.2 (November 24th, 2025):
- [Feature] Support Python-like expressions for conditions and actions in the script editing mode.
- [Feature] You can select which syntax you prefer in the mod settings.
- [Change] Add new functions:
getvalue,getelement, andgetlen. They replacegetnumandgetstrfunctions, which will be deprecated soon.
Now, I will give it a try for TB v1.0.
So, I gave it a try. Well, it may take time to fix. BaseComponent is no more a MonoBehavior, and you cannot easily add it to an existing GameObject (as it used to be).
The game is now focused around the static designs, based on blupeprints. I.e. the full list of the components has to be defined at the game start. If you need to add one in runtime, you have to use hacks. And Automation performance optimization is heavily based on the fact that the component is not added to the building unless there is a rule that needs it. Adding all components to all buildings "just in case" is a big overkill.
That being said, a lot of investigations and tests are needed. And given the Thanksgiver week, no much progress should be expected soon.
I just realized that TAPI has no (announced) plans to support v1.0. It's a bummer. The templates tools system is built on top of TAPI. Maybe, v1.0 provides own way to create custom tools? 
Sad, but I didn't find a replacement for TAPI in terms of creating custom tools. So, I have to re-invent this logic now. Ironically, I did it once for version 7, but then discovered that TAPI completely intercepts the stock game logic, so whatever worked in the stock game was not working once TAPI is installed.
@floral thicket Hey! I saw you've made a lot of "moddable" mods. By a chance, does any of your mods offers the custom tool creation ability?
well no except #1442833036646420580 to add your tool/toolgroup to certain place you want. or #1422778917366005770 for generic useful APIs (no docs though)
Heh. It would be too good if someone have already done my work, lol. Anyway, thanks for replying. I'll be building my own theme park then 
yeah depends on what you mean by "Tool". generic tool (like Planting Tool etc) don't really have a generic way except you implement ITool.
object tools are simpler, you just define them by JSON specs
"Custom Tool" is a concept when you can make and arbitrary class, inheriting ITool and have its Enter/Exit method called based on the user selection in the bottom bar.
In the game, each tool kind is implemented separately. Like plants or building priority, but it's too heavy if you only need a new button in the bottom bar. TAPI was addressing it via blueprints.
Something is working.
One big step is done: https://steamcommunity.com/sharedfiles/filedetails/?id=3619414212
Now, the automation!
The mod doesn't support subgroups. But at least it unlocks me in my v1.0 effort.
So this will not work with the moddable tool group?
It will not conflict. You can freely use both mods. However, the moddable groups won't be visible to the CustomTools mod.
It can change in the future, but for now I need to unlock the mods upgrade process.
The list of automation templates will be reduced, obviously. Since the stock game doesn't support subgroups. And I have no spare time to re-implement it now.
okay got it. One request can you add key binds to activate the tools?
In some chat I heard @floral thicket said he will? 
Ah, you mean it's not compatible to the moddable groups so it won't get bindings. Yeah, makes sense. No promises, but I will keep it in mind.
Yeah if his mod support custom tools then no issue. I have requested him to support custom tools, But don't know how difficult it would be to support.
Tbh, I miss the bindings too. Do you have any use-cases to share? Like, which automation "thing" you would bind to a key?
Ohh. play, pause, finish now, then the detonate dynamite one would be awesome.
Signals and all doesn't need.
Pause/resume I would vote +100! My favorite.
But now it's a separate mod. Seems like a feature 
Yeah. and the dynamite.
detonating for a big no of dynamite is also annoying. Your tool made it super easy. And with a keybind it would be awesome.
The thing with Moddable Groups is that it's focused on the block objects. By design. The Automation case is different. Maybe we will find a common ground so I could reuse that mod. If not, well, the only way would be reimplementing the functionality, which I hate to do.
I am working on adding generic tool button (and wrap the original buttons with it)
This is a preview version for TB v1.0. I only tested that it loads and doesn't crash immediately. The changes were severe, so I'm not confident this version is stable. I have only 3 days to fix it since I'm leaving on vacation till the end of the year. If you, folks find bugs, please drop them here. I will try to fix what I can.
Notes:
- You don't need TAPI any more.
- You won't get any automation tools yet. They will come later.
- You CAN set rules via the building UI.
I'll toss a handful of scripts at it and see if anything happens.
One new feature to note, though: With the copy tool, they finally added a tool selection mode that affects just a single building.
Well, I did some tests. Alas, my approach to dynamically create BaseComponent failed. In fact, it couldn't work at all. The game makes a snapshot of the components per blueprint. If you manage to dynamically add a component to some building, all the other buildings will get broken. I have an idea of a quick fix (a quick "hack" to say it more specifically), hopefully it will work. If not, then this mod will be updated in January. Unless I'll get bored on a beach of Puerto Vallarta and open laptop to do some coding, lol
A much more stable version. Some tools came back. The "Detonate now" tool works. The "drill down detonate" tools crash the game. I know why, but for now I have no time to fix it (1 day left till vacation, not much chance). The other functionality was not tested by me at all.
Ah! And you need CustomTools mod now. It's a replacement to TAPI BottomBar functionality.
(link to CustomTools: #1190169064383991858 message )
also something's screwy with the dependencies
crashes on loading existing save (no mods in the save) or new game, error report attached
My bad, I used local version of CustomTools. Will upload v1.1.1 soon.
It's strange that the dep is complaining, though.
Uploaded CustomTools v1.1.1 to Steam. This fixes the crash.
Can confirm! I tested a basic rule on floodgates (set to 1.00 during drought) and it seems to be working!
Look like the prefix in the ids of both CustomTools and Automation got changed to "Timberborn.IgorZ" (rather than just "IgorZ.", was it intended?). The manifest in Automation looks for the wrong mod-id ("IgorZ.CustomTools" without the extra prefix).
Well, the current version doesn't seem to mind my particularly large rules...
Still need to check the debug functions though.
The release candidate. All tools are now working. I tested them all for not crashing immediately, but some rules need time to crash π If no new issues found, this will be published.
v3.1.2 (December 16th, 2025):
- [Change] Support game version
v1.0. Mod versionv3.0.2is included to the package for the older game version. - [Change] Mod dependency removed: TimberAPI.
- [Change] New mod dependency added: CustomTools.
is this going to be updated on the workshop? (still 302 there for me)
It's not yet on Steam. That's why I said "candidate". If no critical issues found, then it will be uploaded to Steam. I will post here when it's published (uploaded to Steam and Mod.IO).
v3.1.2 is now officially released. Keep in mind that CustomTools mod is required, but it's not in the dependencies in Steam and ModIO for now.
And a small bonus: CustomTools can now attach hotkeys to the pause/resume tools.
@south wedge No hotkey for automation tools?
Not just yet. The Automation hotkeys will come with the generic support from Moddable Groups. Automation will need some code support, but this is a feature for 2026. I'm on vacation till the end of the year π
Awesome. Enjoy your vacation.
Happy holidays everyone. This mod seems great, however I am having trouble getting the custom script logic working for a building is there any new documentation for how to work with the new version? I tried using some of the examples in the current doc but none of them seem to be working.
I read something about switching to python style scripting instead of lisp and I assume that is the cause.
Wiki gives examples in Lisp syntax. So, you need to switch to it to use. Or, use prefixes #PY or #LP
Or even better. Make a sample rule via UI. Switch to script mode and start editing.
The Python syntax is human friendly. You will get used to it quickly.
I will update Wiki to Python syntax, but it won't happen until January.
The Script button that converts a constructed rule into script will help me find all the specific syntax I was struggling with.
I didn't realize I needed to use the prefix when using Lisp. That explains why I couldn't get any of the examples to work.
Thanks.
@south wedge, I added Automation to easy my irritation at micromanaging buildings and beavers. Your mod has been wonderfully successful and I am grateful for all your had work!
Three minor suggestions. Apologies if these have been mentioned before, or if these are base game limitations, or if I have missed some available syntax I could use.
-
At times it would be nice to temporarily override rules to pause (or run) a building. For example, in a recent attempt on a very challenging map, losing most of the beaver population meant I needed to shut down all but essential buildings while recovering from the disaster. I needed to delete most automation rules.
-
Automation rules for Farm Houses and Gathering Flags could be greatly enhanced of the type of Collectable could be determined. For example, "if Collectable.Ready.Berries > 5 and Inventory.OutputGood.Berries < 10 then ...". As it is, Farm Houses and Gathering Flags around mixed resources often leave beavers standing around doing nothing.
-
It would be wonderful to copy signals and settings when using the new base game copy/duplicate buttons added with 1.0. Probably already obvious, but mentioning it for completeness.
- I was thinking about a "disabled rule" concept. Didn't see much use of it, though. Disabling automation for whole building? Hmm, this may make sense. Need to be "disabled rule" under the hood anyway. Which is not currently supported.
- This can be done. In fact, under the hood, I do aggregation of the different goods. The only reason why I didn't expose it, I didn't see a use case. Out of curiosity, what would be the setup when you would need different farmhouses setup differently?
- You won't believe, but I still didn't play 1.0 π I plan to spend at least 10 hours of playing in January to figure out the new mechanics.
Btw, for the farmhouse rules. It has a "bug". When farmhouse stops due to no gatherables, the last beaver who carries some good juts drops it, and it gets lost. So, the proper setup is not stopping the buildings, but setting workers to 0. I'm going to fix it in the future version.
same with gather / woodcutter flags
- if you use worker count instead of pause/unpause, the vanilla pause works as an override. If you have automation set up correctly ("stop if output full, no power, or no ingredients in storage, run otherwise") I'm not sure why you'd ever want a manual override to turn it on
I've had a few cases where I wanted to override something to run. Almost every single one of them involved a malformed rule that I was trying to diagnose.
- In a big enough base you may want to manage, say, canola, separately from the food supply. Maybe with employment rules linked to oil storage levels. Not every farmhouse has access to every food type.
Maybe you want them working only their particular farm even if the range overlaps; they can go over to a closer farmhouse and work the other crop more efficiently
Thank you for the insights!
-
So many times I wanted to temporarily disable automation on the entire building. To free up a beaver for a few days for a new project. When disaster strikes. When production is currently badly balanced to use. Some of this I can fix with calculating production and use numbers, but I would rather focus on design challenges than crunching numbers. I tried linking to population counts in the district as an alternative, but found that failed spectacularly when adding new buildings, thus changing when population counts should enable/disable the building. Enabling buildings overriding rules is, I admit, far more rare and so far has been a temporary measure while building other infrastructure so that I can produce (for example) a few gears at a time the building is normally disabled. Temporarily enabling a building I would be a trivial additional luxury, where temporarily disabling would often be helpful.
-
Not that different farmhouses are setup differently, but that a farmhouse may have multiple crops in range. For example: Carrots and Potatoes. Carrots are temporarily full (will not be harvested) while potatoes have all been harvested and replanted. Nothing left to do, but because carrots could still be collected, there is no way to pause the farmhouse using automation rules. Not relevant once everything is balanced or with an abundance of workers, but highly irritating at times of worker scarcity or when something goes wrong in the colony.
-
No worries on not playing 1.0. I usually avoid all experimental / beta branches of games. Take your time. π
The collection bug I find minor for farmhouses, but a significant irritation for lumberjack flags and oak trees.....
#2 makes sense. Noted!
I also recalled the challenge with the "per good" counters. Farmhouses cannot know in advance what they can harvest. So, there is no nice way to present it in the automation UI. However, when you write scripts, it's not an issue.
btw, #πmod-users message shows a bunch of warnings like:
Blueprint deserializer for blueprints/tools/tool.automation.-100.debugpicktool.blueprint (Automation) generated warnings:
- CustomToolSpec at CustomToolSpec contains unused field Id
Blueprint deserializer for blueprints/tools/tool.automation.030.chainedtool.blueprint (Automation) generated warnings:
- CustomToolSpec at CustomToolSpec contains unused field Id
(but for many automation tools)
nit: this message Created tool 'IgorZ.Automation.TemplateTools.ApplyTemplateTool' in group 'AutomationToolGroupId is missing a trailing '
oh, I wish Unity had a Debug.Verbose()
I find myself wanting debug messages that are too verbose for Debug.Log
but I want people to be able to turn them on easily without having to get a custom build of the files from me
Hmm, I didn't see it in my logs, so assumed extra fields are no problems. However, the IDs will likely be used again with the key binding functionality.
Thanks. WIll be fixed (in the future version).
ahh, the blueprint deserializer warnings come from More Mod Logs. I added them in case field names have spelling errors
Just had a crash that seems to be related to Automation.
I was experimenting with the debug tool, I clicked on a random entity, and it immediately crashed.
I suspect it is an isolated issue, just wanted to let you know.
The building setup seems awkward, but the game should not crash, anyway. Thanks!
YW
Btw, if the game now allows more than one accessible per building, then the whole path checking algo in Automation is broken.
Can you check which entity was that?
It was an IT wood worhshop
Yup, reproduced.
Good news, it's not affecting the path finding algo. It's just how they store data in v1.0 now. They used to share the same Accessible component, now they create separate components for SiteAccessible and BuildingAccessible.
The tool will be fixed in the next release.
Appreciate the quick fix!
I'm not sure if anyone has suggested this yet, but I don't see it above. While watching Disturbed Simulation's latest video I wondered if there was a quick way to add the complementary to the rule you just added. For example if you add: output > 15 then pause, then a quick and easy way to add output < 15 then unpause.
Tbh, I was thinking about it many times. The rules are usually go in pairs. However, I can't find a good UI approach to it. For the conditions, a simple "not" operation will cover the majority of cases (except the hysteresis). For the actions, it's quite different since there is no obvious way to make an "opposite" action.
I see two answers to that...
- For "pause," "set priority," and "remove workers," you can assume "unpause," "clear priority," and "set max workers"
- "Detonate dynamite" would have no opposite.
- In most other cases, including signals, you could probably just assume the same action with a different target value.
In all cases, though, if the rule can be edited in the constructor, you could probably just have it add a new constructor box that is pre-populated with the opposite condition and expected opposite action, but if the action expects a value, leave it blank.
For rules that can only be loaded as scripts...
I don't see a need, since by that point they should just be using the import and copy functions.
Maybe for very simple rules you could show an extra button to add the "opposite" action?
either opposite or complementary?
or maybe while in constructor editing mode, have a checkbox next to discard to add a complementary rule at the same time?
obviously not all actions have complementary rules, (or a single complementary rule)
I could imagine if season = temperate, then there would be two complementary triggers (one for drought, and one for badtide)
Good point. There can be more than one "opposite" rule.
All-in-all, it seems for the actions, a hardcoded "map" would be needed. It's what I didn't like, but it's better than nothing.
Our New Year streak is not yet over, lol. But the end is close, so I can get back to coding
Meanwhile, checkout a teaser for the next release:
π Trigging all of my ocd, why say 200, when trigger is >=0
200 is the current value, which is "greater than or equal to 0" π
condition:(ge (sig District.ResourceCapacity.AlgaeRation) 0)
action:(act Debug.LogStr (concat 'Capacity: ' (sig District.ResourceCapacity.AlgaeRation)))
Technically, the value of the debug log should not be evaluated (controlled via settings), but I save efforts on this debug expression
It always evaluates its value.
ahhh, I see, capacity is >= 0
@south wedge I am pretty sure this is due to Automation. I added rules to sluices to open and or close on change to badwater season.
Checking.
Hmm. The error comes from the water simulation code. Automation doesn't change it. Can you reproduce it on a vanilla+Automation config?
Umm... In practice, probably not. It was a mid-game crash. I think it probably happened on season change, but the game was running in the background, so I can't swear it.
But the only recent change I have made to the game was adding those automations.
And I'm looking at the method that throws. There is only one place when it can get NRE, and that place is completely out of control for any mod.
outflows.Outflows is the only thing that can be NULL.
You could trigger some edge case condition. I'm not saying there is not relation to Automation π It could be a trigger.
understood. I'm just checking one more thing.
Sluice automation works via a stock component. It's no different from manual setting via UI.
SluiceState.Open / SluiceState.Close - nothing fancy. But maybe the "rigth" moment can trigger the problem 
Think i have seen it before,
Weird that it fails ParallelizerException
ok, my wonder was at 97% in my last save, so I thought it might have crashed due to it finishing, but no such luck.
Just in case I checked the Open/Close methods - they don't change anything. Just set flags in the state component.
The way how automation works can sometimes trigger a weird behavior. But need a reproducible case to fix it.
Completely understood.
Like I said, I can't say for sure it is even related to automation, only that it is the obvious culprit due to the recent change. But I have a badtide coming in 1 day, so if it is the cause, I will probably know soon.
Nope, it didn't crash on season change, so my assumption seems to be false.
Given the context of the error, I'd be looking at the mods that deal with water simulation. TimberCommons is a good candidate
But this theory I also checked - I see no relation.
If it is timbercommons, it is exceptionally rare. I've been playing a lot for the last several days (~30 hours over the last 3-4 days?), all with TC installed, and I have not had that crash. Of course that is certainly possible.
The only reasomn I assumed automation was this was my first badtide since setting those automation rules, so it was the obvious candidate. But coincidences happen.
Automation writes pretty much logs in the verbose mode. If you expect the problem to happen, try activating this mode.
Just had the same error happen again, again while the game was in the background
Let me unet those automation rules and let it run for a while... GIven how frequently ist seems to be crashing since I set them, that pretty strongly points to something related to automation, so if I unset them and it doesn't crash, that will at least be decent evidence, if not proof.
It's too late for me to do anything tonight but disable the rules, but I will disable them now, and test it in the morning.
You are in Europe I assume Igor?
US πΊπΈ
Ah, ok... I assumed you just woke up. Must be west coast with the rest of us.
Yeah, I'm sitting in California π This time is my most productive time.
Me too, when I am not playimng games.
Is there a way to see all active automations?
I have a few of teh graphical defaults, but I want to make sure I didn't set anything I am forgetting.
Click "Cancel automation" tool and you will see all automated buildings highlighted.
Perfect, that was exactly what I needed.
Ok, all non-default automations cancelled. I will let it run in the morning and see if it crashes again, and report back.
It used to work with the tool groups too, but in v1.0 it's not (yet?) working.
Tool Group support is practically done by Moddable Tool Groups now. TimberApi won't be updated for 1.0
Yup, it's why the v1.0 behavior is different from what we had all the way before.
if season != temperate would be the natural complement to if season == temperate imho
if the player wants 3 different settings for the seasons they'll have to make manual adjustments anyway, but if it's something like "stop using swimming pools during badtides" then imo the setting should explicitly be if season = badtide, disable... if season != badtide, enable
@south wedge So after deleting the automation rules, the game has been running for maybe an hour with no crashes. I need to run for a few hours, but I saved me game and I will just let it run and report back when I get home.
I'll add another odd detail that may or may not be related. I just noticed that my map is now entirely green, regardless of the distance from fresh water. To the best if my knowledge, I am not running any mods that would effect that behavior, and it was not green when I was playing last night, because I was dealing with water distribution and terraforming for farms when I started having the crashes last night.
I didn't notice that the map was fully green until this morning, so I can't say exactly when it happened, but it seems likely to be related.
Ok, it ran for the last two hours without crashing. Let me reenable the automation settings.
Well, no crashes in the last 40 minutes after renabling the rules... Not definitive, but I am pretty sure it crashed much quicker than that yesterday, so I will assume I did something wrong I guess.
The full green map is a feature of Moddable Weather, but I don't see that mod in your list. Indeed, that mod interfere with the moisture simulation system. And moisture quite close to the water flows.
Yeah, I definitely don't have that one installed.
Somebody in #πmod-users mentioned another one, something about irrrigation, but I don't have that one either.
I'mmoving on to a new game now, so not really worth troubleshooting. I have zero proof it has anything to do with automation, only some very vague guesses due to the timing
I can't really imagine that automation even could cause that, of course I can't imagine how any other mod could, either.
The view becomes bigger and bigger. At some point, a new UI solution will be needed.
On a good developed colony, this list will be very long. Especially if playing with mods that add new goods.
You could split the "good selection" part into a separate item?
Then the (first) list would only have the two items for district good stock and district good capacity
It's an obvious solution π However, the other "categories" will only have 1-2 items. More clicks will be needed in the simple cases (like setting for weather season or building inventory).
yea, and some would still have no extra items (like season),
maybe only add another drop down for things with lots of options (like goods)?
I'm thinking about a smart approach where the code will check how many items are for every category. And only make subgroups for those that have many. However, not sure how intuitive it will be.
You could use the good popup from storages. I'm not sure if that would be a nicer choice than the one from farming preferences (i.e. a plain drop down)
you could set the "spillover" threshold to something like 5. That would prevent the extra item for small lists.
That could even make weather "inline" for the base game, but into an extra dropdown if moddable weather is installed
Still, UI will look differently for the same buildings. It may be frustrating.
How so?
Does it only shows goods for that building? Oooh, for manufactories does it only shows goods that are inputs or outputs (or fuel)?
If one district has 3 stock items and the other district has 10. You'll get groups for one, but not another.
ahh, between districts too, sure
And yes, the manufactories can have different goods, based on recipe.
So maybe just make an allowlist for those that can group?
@south wedge Not that you are worrying about it, but I got the same crash again tonight, and do not have anything automated, so it is definitely not related.
If I understand the poll, I could add am automation using the constructor, but then I could see the actual resulting script?That would be very useful as a tool to learn the scripting language.
Yes. Something like "Switch to the text editor" feature.
Yeah, perfect. I was looking for that today... Not like, seriously, but had it been there it would have been useful.
Too frequently I found myself exporting/editing/importing rules. Thus, the poll.
Worst case, it would be handy for debugging. People could post the resulting script rather than just a screeenshot of failing setups.
I could see that being both a positive and a negative, but overall it seems like a net benefit.
C'mon! This is not really helping π€£ Is it a good thing or not? 
lol, I wish I could help more, but I am way too clueless about what is actually going on under the surface, so I can only guess.
I'm kidding π I value any feedback π
I got the joke, no worries π
PREVIEW: v3.2.0 (started on January 1st, 2026):
- [Feature] Support district signals for stock value and capacity.
- [Change] Deprecate debug signal:
Debug.DistrictStockTracker.<*>. - [Change] Drop tool "Prioritize by haulers on finish building". This option can now be set on unfinished building via the stock game UI.
- [Change] Deprecate operators
getnumandgetstr. Now, you should use:getvalue,getelement, andgetlen. Good news: the value type is now detected from the property.
Early preview.
I will be testing this version during weekend, but I will appreciate your help. @lime python can you break it? π
Does it support changing the recipe of a building? I'm wondering if it would be possible to reproduce the AutoRecipe mod with this.
This is supposed to be supported by the core version. Did I miss anything?
Any logs to reveal the problem?
I haven't tried, I don't see anything on the wiki for it.
AutoRecipe does "a check for recipe swapping is done in each district at the beginning of each work day, and at the completion of each recipe."
"Each valid manufacturing building selects the valid recipe with the lowest proportion of used storage in the district and uses that recipe until the next check occurs."
Okay, I got it. From the mod description, the short answer is: NO. This mod is a kind of automation (sounds like this). Integration between two automation mods? Nah, it's not worth it compared the efforts.
No, the AutoRecipe is super old. It was never updated past 0.5
I was wondering if Automation had actions that did similar things,
even as simple as "switch recipe to [x]"
Ah!
then with a bit of careful rules writing you might be able to construct something that would approximate the same logic
So, a switching the recipe action we're talking about.
right
A long asked one π
switching to a specific one
Okay, you caught me on the mood. I will give it a try right now.
lol
I would assume action only,
signal might not be when recipe changed, but maybe when production cycle completed? (i.e. when output go up)
and/or maybe a signal when the day changes, (or maybe for a specific time of day)
If you add a signal for end of recipe/output go up, it would be good to have it fire before next recipe starts/input go down.
Otherwise if you trigger a recipe change it'll waste a set of inputs
Like this?
Still need to manage the recipe ids selection. But it works! More or less.
I'll do all by best π€£
The game component has event ProductionFinished. I can expose it as a signal. Do you think it will be useful? Tbh, I'm not quite sure how the rule can look like.
maybe, like when finishing a recipe, to stop working and waiting for a new recipe ? This, to avoid loosing material if changing a unfinished recipe π€
or, even changing to new recipe after completing the current one ?
yea, I wonder if rules would be something like "when a recipe is completed and there's enough to make thingA (and output isn't full), then set recipe to recipeA)"
You'd kinda want something like .Once (but .MoveLast) to then move the rule to the bottom of the list if you wanted to rotate between all possible items
I sort of needs to be "move this rule to the bottom and don't process any others right now"
Well, this would require substantial changes π To start with, the current system doesn't guarantee any order of execution. It's event driven, you can't predict in which order the events come.
Everyone who were implementing event driven systems had that moment. The moment when you want to affect the execution chain. Except, the chain may not exist 
lol
Any ideas how we can make rules without ordering? I'm open for the ideas.
yea, I was thinking about this one, you can't order rules, but you can stop multiple from firing (as long as you can have multiple conditions)
on trigger set locking_condition to blank
This can be made by extending the conditions, right?
on locking_condition == blank and some criteria, set locking_condition == state1
(same for other rules)
on locking_condition == blank and some criteria2, set locking_condition == state2
on locking_condition == blank and some criteria3, set locking_condition == state3
Btw, I ended up with making a more extended Log action. In case of you're bored with concat
(where locking_condition is a signal)
but order might be consistent right? (if not determined)
Let's say, we have signal Manufactory.RecipeDone. It has values of 0 or 1, when it fires should be obvious. Does it solve the task? What would be the rules?
Nope. Under the hood, a lot of different indexes are being created. Tracking the order is not an obvious task. Can be managed within one building, but even there there can be pitfalls.
What I mean is that assuming no rules are changed, wouldn't they be executed in the same order the next time the signal is fired?
or is the order not even the same when the signal runs again
Given the signal is the same, then yes - the order is guaranteed. But with a restriction π€£ A lot of hashset/dictionaries are used. So, the order is persistent, but not predicatble.
yea, and might not even be persistent between save/load cycle I'd guess
As far I understand C#, it should be the same within the #Net version. But even this is not enough - you can't expect the same result.
Today, if an event happens, it's just get called for all who "subscribed" to it. And it's not a list that is ordered by some strong criteria. Even if it was a list, the loading order would break it anyway.
Tbh, I'd avoid "statful rules." It would make a lot of troubles.
I think in Python 3 it's now insertion order
.Net docs say "The order in which the items are returned is undefined"
The order is actually defined. It depends on what GetHashCode() returns. However, they don't want to get bound to it.
To put it simple. The order exists, but only they know it, and they won't share with us π€£
The current implementation happens to have a stable ordering, but the language doesn't require it.
It also depends on how densely populated the hashtable is, etc
Yup. If there are just few elements in the set, the implementation may choose to iterate instead of doing a lookup.
v3.2.1 (January 5st, 2026):
- [Feature] Support district signals for stock value and capacity:
District.ResourceStock.<GoodId>andDistrict.ResourceCapacity.<GoodId>. - [Feature] Add change recipe action:
Manufactory.SetRecipe(<RecipeId>). - [Feature] Add logging action with string formatting:
Debug.Log('arg1={0}, arg2={1}', 1, 'test'). - [Change] Deprecate debug signal:
Debug.DistrictStockTracker.<*>. - [Change] Drop tool "Prioritize by haulers on finish building". This option can now be set on unfinished building via the stock game UI.
- [Change] Deprecate operators
getnumandgetstr. Now, you should use:getvalue,getelement, andgetlen. Good news: the value type is now detected from the property. - [Change] Use remove/set workers instead of pause/resume in the planting tools. It avoids loosing gatherables in some edge cases.
Getting good ID errors setting up the Grill. No matter what I choose or using the script function I get the error.
Seems like a UI issue. I'll check.
This one looks working correctly, only the ID is wrong. You need to use the ID from the spec, not the name of the recipe as it shows up in UI.
v3.2.2 (January 5st, 2026):
- [Fix] New game crashes on save.
v3.2.3 (January 5st, 2026):
- [Fix] Recipe selection in the action UI is not working.
Do you want to edit rules as a script text? Kind-of the import dialog, but pre-populated with the rules text.
4
5
1
Yes. I find it a good feature.
I'm really sorry if this is the wrong place for this, but I have searched for hours and cant find anything.
What do I have to do when adding a script to be able to use things like logical operators?
I am trying to use and to check if the season is temperate AND a stream gauge reads contamination below a certain level. I have the signal set up in the stream gauge as LoResCon.
In a floodgate I try to add a rule, hit add script, and tried (and (Weather.Season == 'TemperateWeather') (Signals.LoResCon < 5)) in the if line. When I test, it tells me Unknown function. Token 'and' at 1-3
I assume that I am doing something wrong with my code, but trying to run any of the code examples in the wiki also do the same thing. Tried ge, eq, and they both came back the same unknown function. Do I need to write it in a seperate text editor and import it? Is there something very obvious I missed in the wiki a bunch of times?
Go into the mod menu, find Automation and click the gear to open the settings.
Change the preferred language to Lisp.
The examples on the wiki are all in Lisp, but it defaults to Python in the settings.
Huh. Yea that is 100% my problem. Now that I know I was looking at Python, Ill try it again that way too.
Thanks a bunch!
I feel very silly that it took so long for me to try Weather.Season == 'TemperateWeather' and Signals.LoResCon < 5 now that I look at it
Yeah, sorry for that. I'm delaying Wiki update using every reason
I'll try to find time to update it to the Python script. It's a default settings in the mod now, and most people will use it instead of Lisp.
You read docs before trying. That was your problem 
on the bright side, I now have a better understanding of Lisp. Thanks lol
Maybe this is too much, but could you add breeding progress % monitoring? That way we could stop the pods when x condition and progress = 99% for example
Another input similar to beaver/bot/bed count, would be the "number jobs without a worker" and "number of workers without a job".
Did anything change with publishing the contamination signal from a stream gauge recently? ref: https://youtu.be/iUHERKfvJ60?si=vmWT-IedRhoAjH1C&t=3405
The signal is < 5, but the stream gauge shows 49% contamination.
Previously the signal was 0-100, is it now 0-1?
Are you sure you're not mixing Lisp and Python? 100 in Lisp is 1.0 in Python.
I don't recall changing this signal, but it could happen unintentionally, though.

Unfortunately, this logic is implemented using time triggers. That is, there is no "progress" as such. When breeding starts, the timer is set. When the timer triggers - it's 100%.
I didn't check anything personally, just noticed in their video.
Hmm. It's worth checking.
I think they used the constructor to make the rules.
Btw, check the Wiki
It always was 0-1.
The author of the video could probably set 5 instead of 0.05, but in Python syntax.
ahhh, this was the first badtide after setting it up
In the old (Lisp) syntax, 5 would be 0.05 or 5%. In Python, 5.0 is 500%.
so it never worked
but if you're using the constructor mode, why does the language matter?
I was going to suggested adding validation that the value makes sense, i.e. reject "< 5" if the value can only be 0-1, but I'm guessing you don't annotate your signals with the possible ranges.
Rules were set up in the previous video at https://youtu.be/HzOi_N_O9HU?si=lKjTfeWgCyXasI59&t=135
For the built-in signals I always set validation if there are fixed (static) range rules. For the custom signals it's not feasible. A separate Ui would be needed so you could say which reasonable values your signal can have. Even if it's just a map from the building signal.
Checked. The signal propagation seems good to me.
yea, the rules were just never set correctly
Yeah, he set "5" instead of "0.05" in the rule. I agree, it's not obvious when you should use what. IDeas how to make it more clear?
Propagate the range to the signal, and show the range when creating via constructor?
Like for floodgate height you show "max 2.0"
For signals you could show max or range too
And what if you just call Signals.Set('Blah", 123)? What is the range? Chicken and the egg problem. Someone need to push the range before the others can check it.
yea, this would only be for signals pushed by other objects,
That's a static value. It never changes and is known in adavance.
mmm, but I see that you could override the signal value
that would cause weird things to happen anyways
Well, it would change the concept a lot. As of now, custom signal is just a float value. Building signals is just a syntax sugar.
And imagine a race condition: you defined "just custom signal" abc. Then, you try to bind it to a building.
You could have two different types of signals, exported/derived (from other buildings) and custom (can be set manually)
This is what I call "change of the concept" π
gotcha
For some time already, I'm thinking about a UI to see all the custom signals. Technically, there can be some controls to set the limits, but I don't think it would prevent this problem to happen.
Hmm. Or maybe implement a kind of heuristic analysis? Like, check all places that set the value and try to guess the range 
Sounds crazzy, but it may be fun.
Or maybe introduce a derived type after all. And restict using the signal in any other means.
oh, I see -- is exporting from the gauge still implemented as Signals.Set("foo", StreamGauge.Depth) internally?
condition:(eq (sig StreamGauge.Contamination) (sig StreamGauge.Contamination))
action:(act Signals.Set 'testCont' (sig StreamGauge.Contamination))
Yup
What can probably be done, is a new action Signals.BubbleUp('StreamGauge.Contamination'). This way, the source signals definition can be tracked.
It will depend on how you read the signal. Normally, the last value. But you can use aggregation.
so if you had two stream gauges, it would be random?
The last value - yes. But if you publish the same signal from more than one sources, you have to deal with it. Right?
yep
Some other random ideas: For district resources, it might be nice to have a precalculated fullness ratio which is just Stock/Capacity.
Maybe even just in the constructor mode
Kind of District.ResourceRatio?
i.e. instead of if Stock > Capacity * 0.8: pause, have if Ratio > 0.8: pause yea
have to deal with missing capacity causing divide by 0 π
errr, it's NaN, not infinite
ahh, which is what 0.0/0.0 gives you (or 0/0.0 or 0.0/0)
only 0/0 gives divide by zero
and you'll want to promote to float before the divide anyway
NaN is from IT. The pure math defines division by zero via a limit.
"x/0.1", "x/0.01", etc.
yea, but limit is not guaranteed to be infinite, it might be -1/12th
The limit of (x/y) as y approaches zero is infinity. That's what I was taught at university. 30 years ago π€£
Right, I was thinking about the limit of x/x
That time back, I asked what will be the value 0/0, and got a reply "infinity". Which I don't think was the rigth answer, since I was already programming at that time π
limit(x->0) of (x/x) is 1
For the automation purpose, I'd stick with NaN. or better say, "a kind of it". Teh scripts don't have NaN concept, but for the ratio case, value "-1" would be a "not a (correct) number".
yea, it would just cause no rules to trigger?
Nope. It will trigger conditions that accept value -1.
So if ratio < 0.3 would trigger if capacity is 0
So, if you need to react on "no resource in the district" case, you have to explicitly check for -1.
And if there is no resource.
does district capacity include manufactory output storage?
No. Capacity is only counted for the stockpiles, but the stock reserves are counted in total. Which means ratio can be >100% (fun fact).
The rule of thumb:
- "Capacity" is where you can put and take resources.
- "Stock" is how much resources you can pull out.
Manufactories outputs can only provide goods, they cannot be used to store goods.
But I think I got your main concern. The case of not having the resource in the district, while wanting to work with the ratio.
My only concern is that it doesn't crash the game
You can always check capacity for 0 before dividing π
but "Ratio" would give you the post-divided value
However, something like "has resource" would be a convinient shortcut.
That's the problem with any ratio.
yea
a manufactory has number of cycles capacity to store input and output goods
and are goods in transit counted? ahh, doesn't matter too much
The game has a concept of "public inventory". It's an inventory where anyone can bring to or take form resources. In fact, the districts stats UI shows you exactly what I said above. And it makes sense. When you're checking for capacity, you want to know how much you can store and then take (public input/output inventories). When you're checking for the stock reserve you only want to know how much resource you have available - it's any inventory that is public and output.
Maybe π I'm not counting the stats myself, I use the game's counters. Whatever you see in the stock game UI, is what you'll see in the script.
For the stockpile signals, the good in transit is not counted. But there is a feature request to start accounting it.
They did... ID10T error π
Automation+ModdableWeather [U7 β & V1 β ]
For game version 1.0, a new weather mod needs to be used: Moddable Weathers. The Automation mod don't need changes, it supports both game versions.
Thanks to @wicked furnace for a PR!
Is this a stand alone mod? Or a new requirment to have with Automation?
The game allows optional dependencies, so it should probably just work.
As before, it's separate - it has a dependency on both mods it bridges. So, no, it's not required by Automation
Thanks guys, appreciate the response. Now I just gotta wait for the mods to update for the new patch.
Hi, I'm not sure I understand. Do we need this bridge mod if we play version 1.0 of the game? The version of Automation+ModdableWeather on mod.io is still only for update 0.7 from what I see in its files.
Only if you play with the Moddable Weathers (it's the new and separate version of 'Moddable Weather' for TimberbornV1) mod enabled... and want to have all the added weathers be usable in Automation rules. @Igor Did you not update it mod.io yet?
Thank you! And to Igor for the update.
I spent an hour trying to convince AI making a nice Wiki text π€£ Not sure if it's a right usage of AI 
AI in my hands always looks like teaching math to my 7-years old daughter.

Another idea for district resource stock / capacity, would be to have a resource that is "populated" from the currently selected recipe. So like District.Resource{Stock,Capacity}.CurrentRecipeInputs or District.Resource{Stock,Capacity}.CurrentRecipeOutputs. This might be useful, because then it's easier to make it a template, and easier to copy & paste between different types of buildings.
not sure how you'd handle multiple inputs/outputs, you probably want min(inputs) and max(outputs)
another reason why the precalculated ratio would be nice to have
Another feature request: Have a way to export to signal the amount of power stored in a gravity battery
This would require handling all manufactories in all districts every tick. A scenario which I really don't like.
getvalue("BatteryController.Charge") will give the value, but it's not a signal. Given that such signal would tick every tick anyway (if battery is charging or discharging), you can use Debug.Tick to trigger rule check.
How is this different from a specified resource? Does it only trigger when the resource level changes? Maybe the rule could be only (re)expressed when the recipe is changed?
The current district signals are pre-calculated by the game. I only check fi they change to not send events on every tick. With the recipe signal, the "stock" will need to be update on every tick.
Capacity signal - yes, can be event driven on the recipe change.
I didn't intend for it to look at the resource inside the building, i.e. the resource number would still be calculated the same way
Just that which resource(s) it looked at could be made dynamic based on the currently selected recipe
Hmm. I maybe misunderstand the concept. What would exactly return District.Resource{Stock,Capacity}.CurrentRecipeInput ?
What would be the value?
eg: say for wood workshop, the recipe is logs -> planks
so District.ResourceStock.CurrentRecipeOutputs would be the same as District.ResourceStock.Planks
for centrifuge District.ResourceStock.CurrentRecipeOutputs would be the same as District.ResourceStock.Extract
Wait, prefix District assumes it's a district wide signal. Did you mean Manufactory.ResourceStock.CurrentRecipeOutputs?
I don't think so
But you can have many different manufactories in the district. How will they all fit just one signal?
hmmm, maybe it would need to be something like Manufactory.DistrictResourceStock.CurrentRecipeOutputs then?
I mean for it as like an alias or symlink for the District.ResourceStock for the currently selected recipe,
I guess another way to write it (in psuedo code) might be District.ResourceStock.$(Manufactory.CurrentRecipeOutputs)
Ah, I think I get it. Kind of inderection. Well, this won't work without extensive changes. Signal name must be a string constant, known at the compile time.
Some stuff for pre-rpocesser can be made, maybe.
yea, it would require the binding? (is that the right term) to be recompiled when the recipe is changed,
Recompiling script on value change?! Well, this would be a great way to break everything π
If the building only has one recipe, then it wouldn't matter, but it would make it easier to copy & paste to different building types with the same overall logic being shared
hmm, you do have preprocessors for the templates,
I don't know if they're supported in Python as well?
but then it would be something like District.ResourceStock.{%Manufactory.CurrentRecipeOutputs%}?
Preprocessor statements get unwrapped when applied to the building. They cannot be copied from one building to another.
Should be, but not tested.
(handling multiple inputs and outputs would need some handling, no idea how)
ahh, so would it work to have a template with preprocessor for keeping district stock between x% and y% that could be applied to a building,
and maybe if the recipe is changed it needs to be re-applied
sort of like the planting ones, but for manufactories
This part complicates the things a lot. First of all, there is no link between the template and the rules. But even if there was a link, what if the rules were modified afterwards?
A better approach would be setting rules for all cases. If recipe is changed to a different good, the rules for the old one will just not trigger (nothing changes). However, the open question is how to handle dynamic lists via preprocessor. Such things usually don't deal with loops.
i.e. the user must just manually re-apply the template
I tried once to deal with it, but it turned out to be too complicated. So far I have no good ideas how to handle lists in preprocessor.
yea, I guess adding rules for all possible recipes would be the other way to do it, (and make them conditional on if the recipe is the currently selected one)
still requires some sort of looping support
maybe adding a join function? (which could be used with concat?)
How will it help to deal with lists?
blegh, still need a "foreach" operator,
Anyway, lets say there is a way somehow make such template. How this whole rule set will look like after applying and what it will do?
maybe something like{%" and ".join(inputs.foreach(x => concat("District.ResourceStock.", x, "> 0)))%}
Like: pause the building if there are not enough of any recipe inputs (or outputs are full), unpause the building is there's enough of all inputs (and output isn't full)
so something like if District.ResourceStock.Planks < 100 and District.ResourceStock.Logs > 1 then unpause, if District.ResourceStock.Planks > 100 or District.ResourceStock.Logs < 1 then pause()
gonna head to ποΈ and get some 
Same, good night!
Something like getvalue('Manufactory.CurrentRecipe.Ingredients[0].Amount') could help solving the problem. However, it still requires a lot of changes.
Or create a custom property: getelement('Manufactory.CurrentInputGoodIds', 0) This seems a bit more simple
Awesome, I'll give this a try thanks. Doesn't need to be a signal just an input to an if
More background i wanted to use gravity battery charge level to switch a sluice gate on or off. Is there a way to get to that to work.
You can create a rule that depends on Debug.Tick signal and battery charge level, then send that level to a custom signal. The custom signal can be listened by any building.
Is there any way to apply more than one set of weather rules to a water pump? Can only seem to have them pause or turn on during a bad tide or drought but both rule sets canβt be applied at the same time.
Does not equals temperate work for what you're trying to do?
I may have to look closer at it. I was talking about the toolbar buttons to pause during drought and bad tide, you canβt apply both to pumps itβs one or the other and as far as I understand. Pause during temperate would turn them off unless it was a drought or bad tide.
Ah ok, I don't use the buttons.
Don't use the templates for that. You'll want to write a rule yourself.
Select the building, and look over at the bottom of its information panel on the right. That has buttons to write new rules as well as copy them.
The templates is a only a prebuilt rules set. You can modify teh rules after they are applied. Add Drought template, go to the edit dialog and remove "template family". This will dissociate the rules from the template. So, you will be able to add more templates. But keep in mind, that this way you can create conflicting rules with unpredicted behavior.
I actually use that just to get the rule in there, and then edit the rule and swap the action for each condition π
(yes, that is silly/lazy, but it works just as well π )
Folks, I need a community support. Here is the Automation Wiki: https://github.com/ihsoft/TimberbornMods/wiki/Automation-(scripting). My goal is to make it so that you can point AI to it and ask to create a scripting rule for you. This goal is very far as of now, but if you can help improving Wiki - it will be a big win!
I tried this. And got a promising result.
And as usual for any AI promo, it only works fine in the presentation π€£ IRL you need adjustments.
Okay, the first playthrough in 2026 today
Let's see what the mod does to it...
Indeed, we need a "disable automation" feature.
This doesn't look nice. Any UX ideas?
So, it seems we need a pair of signals: "district needs more" and "district has enough". For the resources.
Disable or pause automation for a building would be nice.
No comments on the UI, I have no issues with it that I remember.
I do love how in general automation let's my colony be so much more efficient π
My latest addition to a big colony is setting reserve building capacity for things like planks and gears that kick in only when stocks are very low, so when you're building something really big to give production a big boost.
If you write your own rules, everything has disable and pause automation available.
It's not in the templates because it's impossible to predict how people want it used.
Yes, but a button to disable all the rules.. so you dont have to delete or edit them when you just want the building to run or pause for a bit
I dont really use the templates except the builders not blocking one π
Hello,
Is this mod capable of the following : Automatically unpause lumberjacks if log storage drops under a certain threshold? For example, if <80% of current max lumber, un-pause lumberjacks.
Same goes for the other buildings like planks buildings, etc.
Yes, it can do it.
My current save is using modded weather to add monsoons and rainy seasons, Is it mandatory for me to add the addon for automation?
If I am not going to automate anything to do with the weather, is the base mod sufficient?
If I remember correctly, it won't crash, but you won't be able to automate off anything weather-based.
Honestly, it would just be easier to add the connector mod than try and figure out whether or not you need it.
Thanks, I will just grab both
IS it possible to put the percentage into a script or must I manually determine the number to add to the script?
You would probably want something like amount/capacity <= 0.8
Percentages must be written in their decimal form.
(and
(ge (sig District.InventoryFillPercent.Logs) 0.8)
)
(act Pausable.Pause)
(and
(le (sig District.InventoryFillPercent.Logs) 0.6)
)
(act Pausable.Unpause)
Would these work to pause at 80% and resume at 60%?
I used chat gpt to run them and pointed to the wiki for reference
Oh, wait, if using lisp, 100 is treated as "1.00"
use 80
Other than that, you have the basic idea. Drop the "and" unless you have multiple input conditions in the same rule.
I did not specify to cgpt what format to use, I guess it preferred lisp because it says that the mod runs natively in lisp
I am getting unknown function because of "ge". I replaced it with ">=" and now get the error because of "sig"
I am currently using
IF (>= (sig District.InventoryFillPercent.Logs) 80)
THEN (act Pausable.Pause)
Is this no good?
I think that I got it just doing this:
District.ResourceCapacity.Log <= 80
Pausable.Pause()
The game supports two different scripting formats, Lisp and Python.
It defaults to Python, but all of the documentation is still written in Lisp
Is it possible to add two requirements, in my case for a gathering flag, if berries district stock <80 AND dandelion district stock <80, THEN... ?
Yes, but you should wrap each argument in parentheses to ensure that they're actually translated correctly.
Wiki was recently refactored for Python syntax. AI agents may not catch it yet. When building promt, direct the agent to "https://github.com/ihsoft/TimberbornMods/wiki/Automation-(scripting)" and ask for Python syntax. In my tests, it was pretty good for the simple cases.
Signal District.InventoryFillPercent.Logs is not existing in district component, but the overall idea is correct. You can calculate the ratio based on the stock and capacity. Just keep in mind that if capacity becomes 0, then it will be a division by zero error.
If you're going to use percentile rules in many places, you can create a custom signal that would be emitting percents. But it's an advanced technique that requires understanding of the custom signals logic (it's explained in Wiki).
Which is why I recommend adding 0.01.
It's trivially less accurate, but prevents divide by zero errors.
ChatGPT: "Use this GitHub wiki for the automation script concept description: https://github.com/ihsoft/TimberbornMods/wiki/Automation-(scripting). Based on it, create a rule that would emit custom signal that returns a percentile of the stock fill ration of good "Log"."
This gave me a prety good solution. But in Lisp π€£
Interesting. ChatGPT gives suggestions for the Lisp syntax, which is not anymore in Wiki! E.g. it suggests using (sig ...), but this is not metioned anywehere in Wiki now. It seems, it's cached it somewhere 
You need to kick AI for using the newer version, lol.
Btw, Gemini sucks in such tasks. ChatGPT at least gives something that is close to the working solution.
I recall seeing in the wiki that the mod uses lisp but Python can be used instead
"the mod originally used Lisp syntax, which is still used internally for templates."
Guessing that it used lisp because of this.
More like Lisp was a lot easier to program an interpreter for.
As for the templates, they simply weren't rewritten in Python because there was no reason to.
Python is not supported in templates π They are always parsed as Lisp.
I used grok to test and it gave a response in the correct python sytax
v3.3.0 (January 22nd, 2026):
- [Feature] Introduce "Copy rule" button to the rules editor to quickly duplicate an existing rule.
- [Feature] Introduce "Invert rule" button to the rules editor that turns rule into the opposite condition/action.
Invert rule sounds great, I've been manually using that to optimise some conditional work across different buildings
And confirmed invert rule is awesome π
Currently there is no way to nest If statements correct (IE conditions)?
split it to multiple signals on multiple buildings?
Not sure what you mean. Constructor doesn't allow more than one logical operator. However, in the script mode you can create condition of any complexity. Or what did you mean by "nesting"?
E.g. these are my rules for the farm house.
Btw, to those who want district resource fill ratio signals. One more way of getting them today without a fear of division by zero is restructuring the condition.
Instead of:
if Stock / Capacity > 0.9 then ...
You can write:
if Stock > Capacity * 0.9 then ...
The effect will be the same, but now you don't care if capacity is 0.
My nesting example: Say in the bakery Bread is maxed out and want it to switch to the lowest global inventory of either maple pastries or cattail crackers.
If District.resourceStock.Bread > 100 Then
If District.resourceStock.Maplepastries<District.resourceStock.Cattailcrackers
Then Manufactory.SetRecipe('MaplePastry') Else
Manufactory.SetRecipe('Cattailcrackers')
End if
A solution below which works.
District.resourceStock.Bread > 100 and (District.resourceStock.Maplepastries<District.resourceStock.Cattailcrackers)
Manufactory.SetRecipe('MaplePastry')
District.resourceStock.Bread > 100 and (District.resourceStock.Maplepastries>District.resourceStock.Cattailcrackers)
Manufactory.SetRecipe('Cattailcrackers')
So, "nesting" in this case is a complex expression with multiple logic operators. For sure, there are cases when you would want to have several levels to not repeat the same condition everywhere. However, this would require a completely new UI. Any idea is welcome, but keep it reasonable - I don't want to spend a month of work to make a new UI π
Yeah, not worth the effort π
in-game dumb editor or vsc / pycharm with proper intellisense and such?
It would be interesting to have scripts synced to disk so that they're editable with an external editor
Dumb editor in game. But the @hybrid hatch idea is interesting.
However, the nice feature of IDE like intelisense won't be working. Since Automation environment will be unknown to the editor. So, syntax highlighting is probably the max you can get of it.
yea, I have no idea how IDEs get their syntax context stuff
unless you added a fake import * from automation at the top of the files and include an automation.py (or .pyi) with the minimal API
@somber dagger 's example of the "nested code" actually gave me an idea. technically, this code can be parsed into the existing rules. And if they are organized based on the order of appearance in the text, it will allow checking/executing rules in order. It will be kind of a Python script.
The only down side would be re-executing the whole "body" if any of the signals changed.
which you would do anyway in the expanded version right?
The voting is about this idea π I'm not going to plugin Python into the game. It would be an overkill.
Folks, I'm trying to make a good UI that is convenient to be used. But I have no feedback, so it's mostly my own vision. Anyone has any ideas? Not every idea can be implemented easily (coding UI is a pain!), but it will at least give me a direction. Anything? How would YOU make the UI in your perfect world?
Any way to integrate using Access operators to pull info from say Shift+Alt+X?
That is a dev menu and should not be considered a feature for integration.
hmm, I know that "write a string/number to log" means player.log, but would it be possible to write to the birth/death log aswell/instead (I think it's a message bus internally). (ref: DS Craters Ep 13 @ 1:45 (also at 53:45))
Access operator works on buildings only. It can't access other game objects.
Well, technically it's doable. But how useful it will be?
10-4
An idea that would probably be pointless and annoying, but it would be cute:
A building that employs a beaver to do automation tasks.
A "Programmer" beaver building... Would have the interface π
This would be an interesting way to "gate" the ability to automate -- that is, you can't do it on day 1, but once you unlock the automation shack, you can do automation π Would feel better for some people who like at least a little more of a challenge, but in the end it probably wouldn't be a major hurdle for most.
(perhaps make it a mod option?)
btw, the new Invert rule option is fantastic!
Hmm, it might be nice to have an option to "add a rule from template" in the rules editing dialog.
Is there a way to hook into the building copy feature and copy the rules at the same time?
Why not just applying the template to the building? Selecting the template from the dialog would be a pain, given there are ~50 of them.
Not sure if I get the idea.
Game default is that when you copy a building, all settings like recipes, priorities etc. are copyed into new building. True will be nice to have rules also copied.
It turned out to be not that hard to support. The copy thing will be in the next release.
Let's say, you can write a normal Python script (with limited functions) for a building. Will you be using it?
7
11
2
Maybe. When there is no good template/rule.
Well, the voting is promising.
hello I am having a problem with a simple script for a badwater pump.
I have the pump sucking up badwater in a 2x3 levee box that separates a water seep from the rest of the pond when there's a badtide.
I also built a gauge inside this box.
I am trying to make 3 simple rules for the pump to operate:
IF season different from Temperate
then pause the pump
If season is Temperate AND Cont1 (that's the contamination signal from the gauge) =>2 THEN unpause the pump
IF season is Temperate AND Cont1 <2 THEN pause the pump
it should be simple enough, I save the rules, it doesn't give me error, but the pump stays paused
Obviously there's something wrong in the logic or the syntax of these 3 rules
what am I doing wrong?
Take the third rule and delete the temperate condition.
Then merge it with the first rule with an OR.
condition: (season != temperate) OR (Cont1 < 2)
action: Pause
condition: (season == temperate) AND (Cont1 >= 2)
action: Unpause
I don't want the pump to start during badtide, that's why I put the IF season temperate etc
I have one rule that's a simple Weather.Season != 'TemperateWeather'
then PAUDE
S
then I have Weather.Season == 'TemperateWeather' and Signals.cont2 >= 2
It won't. The first will remain active during that bad tide.
OR means of either condition is met, return true.
Likewise, the second rule can never be true because it must be during a temperate season to activate.
and Weather.Season == 'TemperateWeather' and Signals.cont2 < 2
but if you use OR instead of AND, doesn't it mean that the pump will follow the action if any of the rules is true?
I get it that the 1st rule is redundand probably
Which is why one rule uses OR and the other uses AND.
Turn off if there is bad weather or the contamination is too high.
Turn on if there is good weather and the contamination is low enough.
Either condition can deactivate it, but both must be met to activate it.
Oh wait, I might have the weather backwards.
Can I see the actual setup?
Not just the scripts.
I eliminated the 1st rule
yes just a sec
it's Spillage, I have 6 setups like this one in every good water seep pond
So the goal is to pump out all bad water?
the sluices are set to open when the contamination is <2
yes, but ONLY after the badtide is gone
I don't want them to pump all the way during badtide
that's my goal
micromanaging 6 of these is hell
you said "Turn off if there is bad weather or the contamination is too high.", no, I want both conditions to be met
that's why I think AND is appropriate
Okay...
Start during temperate if contamination is high.
β¨β¨```
condition: (season = Temperate) AND (contamination >= 2)
action: unpause
Stop if the season is badtide OR the contamination is low.
β¨β¨```
condition: (season = Badtide) OR (contamination < 2)
action: pause
```β©β©
Ignore droughts.
turn on if it's temperate AND =>2, turn off if it's temperate AND <2
okk
aha I see what you did
the 2nd rule
brilliant
it should work?
I have been going crazy all night with this lol, sometimes the solution is just in front of you but you can't see it
You don't need to check the season when turning off; it just gets in the way.
Instead, you can use the season check to block other seasons entirely.
Ignoring droughts simply allows it to keep working if cleanup takes too long.
I'm sorry to report that it's not working
it's day 2 of temperate, and the pump stayed paused
I set the rules as you told me
still the damn pump stays shut π I don't get it
What's the signal value?
13%
I wonder...
I'll have to mess with it myself a bit to figure out what needs to happen.
it really should work, the logic is sound!
I really don't get it why it doesn't pick the signal value
I think contamination might be measured between 0 and 1, so it might need to be 0.02?
and now the pumps pause by themselves!!!
π
so it IS reading the signal, but no idea what it's reading
π
Oh, I should have expected that.
this is brilliant, it works like clockwork
thank you guys for your help, I see so many possibilities with scripting
I didn't see a reference about this on the wiki
Yeah, the problem is in the units. value 2 is 200%. Percents are always less or euqal to 1.0.
When I was making these signals, the human and programmer parts of me were fighting. The human part was telling that regular people would like to work with percent in a natural way, where "10" is 10%. However, the programmer was insisting that "percent value" is actually a ratio, and must be in range 0.0 - 1.0. You now know who won in that discussion π
Checkout what will be in 3.4.0 (releasing soon, I'm running final tests).
Disable individual rules?
Will there be an easy way to disable/enable all rules (for a single building) at once?
There will be a template tool.
btw, is there an easy way to export a custom signal? I'm thinking a value that's used by multiple buildings, but you want to set it by hand (like number of beavers to pause/unpause breeding pods at)
I think you said you could add something at every tick, but that feels wasteful
Every custom signal is global. Or what kind of exporting do you need?
Debug.Ticker is the way to tick on every (physical) frame
err, your Custom Tools mod on mod.io doesn't have a Mod tag, so Mod Manager doesn't know how to install it
I just realized, it's not documented π€¦
I fixed it right now. Thanks for letting me know!
Do you think it makes sense to force Mod Manager to install dependencies before the mod that needs them?
The old logic is install mod first, and then it's dependencies,
which if something fails half way it leaves it in a weird state
I can't get Debug.Ticker to work
β¨If Debug.Tickerβ© gives β¨Condition must be a boolean expressionβ©
checking it β¨== 1β© (or β¨0β©) doesn't do anything
ahh β¨>= 0β© does. If I log it's value, I see it going up
So I'm guessing it's value was β¨0β©, it was never firing, so never became β¨1β©?
The signal returns the frame number. It's monotonically going up.
My bad, I missed it in the docs 
it's also not in the constructor (which is maybe fine)
This is intentional. I don't want people abusing it π If you get to know about this signal, then at least you've read the Wiki (when I update it
). It's not a signal that can be used widely. There are consequences.
yep
but is it the only way to set a signal manually?
i.e. I want to create a signal that is set entirely by hand
hmm, If β¨Debug.Ticker > 0β© Then β¨Debug.LogNum(Signals.Test)β© keeps writing β¨0β© to the log
duh, wrong signal
Any custom signal is made by your hand π The only question is what is the root signal, which triggers your custom signal. If you have no a good choice from the existing signals, then you can tick every frame and check any condition you want. Including the getvalue operator.
I don't want to set or trigger it from another value
What exactly are you trying to make?
Rule on breeding pods: β¨If District.Beavers > Signals.BeaverLimit Then Pausable.Pause()β©, β¨If District.Beavers < Signals.BeaverLimit * 0.9 Then Pausable.Unpause()β©,
This should work as it is. Is it not working?

Will do it now.