#Advanced Automation

1 messages Β· Page 3 of 1

timber portal
#

I'll take a look

serene urchin
#

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)
serene urchin
#

also maybe flooded as input?

south wedge
#

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?

serene urchin
#

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
ThinkingIT

timber portal
#

am I correct that even if you used a template for this, you'd have to re-import it when changing the recipe?

south wedge
#

Switching recipe usually changes the range too. Because different recipes assume different output amounts.

serene urchin
#

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

timber portal
#

actual lisp wouldn't use [i] notation fwiw

serene urchin
#

or get it in an other form

south wedge
#

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 πŸ™‚

timber portal
#

you could still resolve it at parse time

serene urchin
#

but feels like i have seen some way to define what good without setting a specific good name
so its set at parse time

timber portal
#

yes, if you use template import you can write a template which queries the single output good

south wedge
timber portal
serene urchin
#

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

south wedge
timber portal
#

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

serene urchin
#

i get an error for SingleGoodAllower

#

ps i used Ruby for my code snippet πŸ˜›

timber portal
#

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

timber portal
#

you should just look at the file Piisfox posted

serene urchin
#

well i tried some i knew and ruby looked good πŸ˜›

#

was easy to read the text

timber portal
#

maybe you can only use these in the import window?

serene urchin
#

maybe

#

ya looks like only when importing scripts ThinkingIT damit

timber portal
#

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

south wedge
#

But it's after the vacation.

timber portal
#

If it were always raw it would be okay, but most of the time it shows the processed value

reef widget
#

@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).

hardy brook
#

thanks

reef widget
serene urchin
hardy brook
#

is there anything to check for breeding progress?

reef widget
#

No.

hardy brook
#

technical limitation?

south wedge
hardy brook
#

ah

#

no rush, thank you

south wedge
#

Keep in mind that getnum doesn't react on the value change. You can use the debug tickers, though.

south wedge
# hardy brook technical limitation?

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.

hardy brook
#

completely understandable

hardy brook
# hardy brook technical limitation?

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

south wedge
#

I'm on vacation, but once back, I'll give some time to address the most important things.

hardy brook
#

my below-freezing-point social IQ usually makes that a risky proposition

south wedge
#

Btw, feel free to file your ideas via github.

magic blaze
#

@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?

reef widget
#

Those rules don't run until the building is complete, unless you specifically check the construction status in the same rule.

magic blaze
reef widget
#

Give me a few minutes and I'll see if I can come up with a working prototype for you.

magic blaze
#

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

reef widget
#

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)
south wedge
#

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.

reef widget
#

I should note that

(ne (sig Constructable.OnUnfinished.State) 'finished')

Does NOT work for this; it seems to fail to update.

magic blaze
south wedge
#

The progress event is different since it's ticking as the progress is being made.

magic blaze
timber portal
#

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

south wedge
#

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.

timber portal
#

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

south wedge
#

What do the logs say?

#

(Enable verbose logging for the best result)

reef widget
#

πŸ›πŸͺ²πŸͺ°πŸπŸžπŸͺ±πŸŒπŸœπŸͺ³πŸ¦ŸπŸ¦—

timber portal
#

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

south wedge
#

Playing with the max logging level enabled is my normal mode in the last 2 years.

#

If debugging mods can be considered "playing" HappyFT

timber portal
#

The performance hit was definitely noticeable

south wedge
timber portal
#

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

south wedge
#

All my drives are nmve, but even with them it impacts performance.

south wedge
#

(I hate mobile for its weird autocomplete)

timber portal
#

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

magic blaze
#

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

south wedge
reef widget
timber portal
#

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

timber portal
south wedge
magic blaze
timber portal
timber portal
#

is there any chance of getting an action to set sluices to automatic?

reef widget
timber portal
#

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

sand thunder
#

Hey, what's happening?

timber portal
#

a conversation

sand thunder
#

did you automate it?

#

if not why?

timber portal
#

the conversation?

sand thunder
#

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

south wedge
south wedge
#

But to the best of my knowledge, there are no critical bugs in the mod. There are feature requests, though.

south wedge
#

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.

reef widget
#

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.

south wedge
#

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.

reef widget
#

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."

south wedge
#

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.

south wedge
#

A first version of something

#

Writing a number of logs to logs is a bit confusing, yes 🀣 But it's very beaver.

south wedge
#

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" πŸ™

hardy brook
#

Can you force the check to trigger less often for this?

#

Asking the obvious, on the off chance you somehow did not consider that

south wedge
hardy brook
#

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

south wedge
reef widget
#

7x is the highest speed that has to be officially supported.

hardy brook
#

IIRC, anyway

#

nevermind, >>> is 7x

#

oops

south wedge
#

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?

timber portal
#

imo it's not a concern, nobody has to go and manually read the stream gauges or operate the floodgates either

south wedge
#

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.

somber dagger
#

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.

south wedge
#

Now, the Forester signal.

south wedge
distant fern
#

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?

south wedge
distant fern
south wedge
#

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.

distant fern
#

Makes sense. Thank you for investigating πŸ™‚

south wedge
#

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.

timber portal
#

you've reinvented just-in-time logistics

finite sapphire
#

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

south wedge
#

I'll think about it. It's not exactly in the design concept, though.

finite sapphire
#

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

finite sapphire
#

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

south wedge
#

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.

finite sapphire
#

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)

south wedge
#

Hmm. Interesting. I'll check this scenario. Not a big deal to add the height check.

finite sapphire
#

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

south wedge
#

I can make a quick version so you could verify if the simpel check helps. Give me 10 minutes.

finite sapphire
#

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

south wedge
#

No moddable weather support in this version, though.

finite sapphire
#

Np, not using that mod

south wedge
#

I plan to release 2.7.0 soon. With all the edges polished. Maybe today.

finite sapphire
#

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

south wedge
#

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.

finite sapphire
#

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

south wedge
#

If I get the game code correctly, it only deletes water that is below the height. I may be wrong. Let's see.

finite sapphire
#

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

south wedge
#

I'll apply the fix to the main build then. Thanks for the report!

finite sapphire
#

(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!

south wedge
#

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 DamFT

finite sapphire
#

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

south wedge
#

Not in this version. I plan to slow down a bit on the new signals/actions and focus on UI.

finite sapphire
#

Yeah, I suspect not everyone reacts with "ooh neat, it's lisp!"

#

but hey, I like lisp ThinkingIT

south wedge
#

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.

finite sapphire
#

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.

south wedge
#

This would not work. Each signal and its listeners must be registered for the system to efficiently work.

finite sapphire
#

Yeah, just conceptually I'd rather register them from the listening end, and have the rule to publish it just be auto-created/hidden

south wedge
#

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.

finite sapphire
#

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 πŸ˜›

reef widget
finite sapphire
#

OK.

#

That's fair

south wedge
south wedge
#

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.Ready signal that tells how many gatherable or cuttable resources are in the range.
  • [Feature] Add Plantable.Ready signal 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] ModdedWeather mod 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.

timber portal
#

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)

south wedge
south wedge
#

FYI, all the confirmation dialogs that Automation shows are from the stock game. The only custom dialog is the rules editor one.

timber portal
#

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

south wedge
#

Ah, now I get it.

south wedge
#

New UI. Prototyping as of now. Trying to find a way to keep it compact, but still informative.

#

Collapsed view.

timber portal
#

oh dedicated signal rules is nice

olive leaf
#

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.

timber portal
#

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

olive leaf
#

I kinda know how to do that, well good luck to me

olive leaf
#

@timber portal do you know how to write scripts?

timber portal
#

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

olive leaf
#

Ok thank you

south wedge
#

Just a dedicated UI to show and setup such rules.

timber portal
#

the ui is still nice

#

even if it's reusing the previous system, which is just prudent

south wedge
#

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".

serene urchin
#
  • 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 πŸ˜›

south wedge
#

The :"disable" button needs two states: enabled=>disabled, and disabled=>enabled. Maybe use different color? ThinkingIT

serene urchin
#

or toggle? -text

next prawn
#

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).

crude kelp
#

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.

reef widget
crude kelp
#

Thanks let me try that

reef widget
#

You might get an error that those signals don't exist. Substitute them for whatever you want.

crude kelp
#

It seems to work, thank you so much for an example I could follow!

south wedge
south wedge
serene urchin
#

😁

#

Noice

south wedge
#

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? ThinkingIT

#

And the Ctrl will of curse be LEFT kekw

#

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.

next prawn
south wedge
next prawn
crude kelp
#

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?

reef widget
crude kelp
#

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

reef widget
#

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.

crude kelp
#

in the log (where is says so and so was born or died?)

reef widget
crude kelp
#

like here?

#

I've literally never seen an automation related error

south wedge
# crude kelp if two rules conflict is there a priority system or how does it handle that? lik...

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.

south wedge
south wedge
#

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.

south wedge
#

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 AngryFT If not 100% what

south wedge
south wedge
#

What's not right here? 🀣 How I "like" the edge cases DamFT

south wedge
olive leaf
#

Watch me try it out and make things worse

south wedge
olive leaf
#

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

reef widget
#

I forgot I wanted to test this, but there's so much going on this week that it's probably not going to happen.

green pike
#

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

reef widget
green pike
#

thanks

#

yeah my brain had completely forgetten what lisp rules are

south wedge
south wedge
#

No more panels going outside the screen.

south wedge
south wedge
#

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?

south wedge
#

Like this

green pike
south wedge
#

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.”

south wedge
#

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 concat operator 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.

dusky nebula
keen pier
#
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

serene urchin
keen pier
#

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

south wedge
#

Thanks, for the report. I think I know what's the problem. Will release a fix soon.

south wedge
#

v2.8.3 (October 19th, 2025):

  • [Fix #123] ArgumentException: toExclusive 0 must be greater than fromInclusive 0 when scheduling T
south wedge
#

v2.8.4 (October 19th, 2025):

  • [Fix #124] Copy rules button is not working
south wedge
#

v2.8.5 (October 19th, 2025):

  • [Fix #125] The game frequently crashes when Plantable.Ready is used and paths are changed.

4 updates in one day. It's a record 🀣

south wedge
#

Debugging custom signals turned into a hell AngryFT So, working on some dev tools.

south wedge
#

v2.8.6 (October 20th, 2025):

  • [Fix #126] Game crashes when selecting a building with the "chain" template applied.
deft tulip
#

@south wedge where is the import rule button?

#

never mind got it. the arrows. πŸ˜‹

dusky nebula
#

Seems to be working. Thank you πŸ™

potent verge
south wedge
potent verge
#

Crashed a few times after playing for a few minutes, no specific trigger afaik

south wedge
south wedge
#

@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?

potent verge
#

Scrap, I was using it as an auto off

south wedge
#

THis I never tested. Will check now.

#

Yup! It was scrap. Damn, why didn't I test it?! DamIT

potent verge
#

Lol, to be fair it is one of the least needed uses for that

south wedge
#

Yeah, hard to imagine that new sites will appear, lol. However, you may want to automate workers releasing.

potent verge
#

V easy to avoid triggering tho now that I know

south wedge
#

v2.8.7 (October 22nd, 2025):

  • [Fix #127] Crash when attempting Collectable.Ready signal on ruin scavenger flag.
south wedge
#

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.
south wedge
#

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 } } } } }
potent verge
#

Something smart probably

somber dagger
lime python
#

Nope, it's more likely a Unity version of MathCad 😍

south wedge
#

I managed to make a working parser for the expressions. So, in some future version there will be an alternative script syntax - Python-like.

south wedge
#

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 DamFT So, no updates for Automation for 1.0 for now.

#

And a "side effect " - some formula optimization!

jaunty pumice
#

I am getting some error when I try to load Automation and its requisite mods. did something change?

hidden frigate
#

Are you on the experimental branch?

jaunty pumice
#

yes

deft tulip
south wedge
#

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.

south wedge
#

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.

carmine summit
#

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!

reef widget
#

Sum and count can be used together to get an average.

south wedge
#

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)

south wedge
#

Anyone had a chance to crash the game yet? πŸ™‚ These days, I have very little time for playing, so cannot give good testing.

lime python
#

Sorry, Unity is crashing me first 🀣 , game must have to wait ...

south wedge
#

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.

south wedge
south wedge
#

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, and getlen. They replace getnum and getstr functions, which will be deprecated soon.
#

Now, I will give it a try for TB v1.0.

south wedge
#

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.

south wedge
#

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? ThinkingIT

south wedge
#

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?

floral thicket
south wedge
floral thicket
#

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

south wedge
#

"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.

south wedge
#

Something is working.

south wedge
#

The mod doesn't support subgroups. But at least it unlocks me in my v1.0 effort.

deft tulip
south wedge
#

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.

deft tulip
south wedge
#

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.

deft tulip
south wedge
#

Tbh, I miss the bindings too. Do you have any use-cases to share? Like, which automation "thing" you would bind to a key?

deft tulip
south wedge
#

But now it's a separate mod. Seems like a feature ThinkingFT

deft tulip
#

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.

south wedge
#

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.

floral thicket
#

I am working on adding generic tool button (and wrap the original buttons with it)

south wedge
#

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:

  1. You don't need TAPI any more.
  2. You won't get any automation tools yet. They will come later.
  3. You CAN set rules via the building UI.
reef widget
#

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.

south wedge
#

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

south wedge
#

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.

warm epoch
#

(link to CustomTools: #1190169064383991858 message )

#

also something's screwy with the dependencies

south wedge
#

My bad, I used local version of CustomTools. Will upload v1.1.1 soon.

#

It's strange that the dep is complaining, though.

south wedge
warm epoch
#

Can confirm! I tested a basic rule on floodgates (set to 1.00 during drought) and it seems to be working!

wicked furnace
reef widget
#

Well, the current version doesn't seem to mind my particularly large rules...
Still need to check the debug functions though.

south wedge
#

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 version v3.0.2 is included to the package for the older game version.
  • [Change] Mod dependency removed: TimberAPI.
  • [Change] New mod dependency added: CustomTools.
smoky timber
south wedge
south wedge
#

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.

south wedge
#

And a small bonus: CustomTools can now attach hotkeys to the pause/resume tools.

deft tulip
#

@south wedge No hotkey for automation tools?

south wedge
#

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 πŸŽ‰

deft tulip
#

Awesome. Enjoy your vacation.

lone juniper
#

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.

south wedge
#

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.

lone juniper
sonic dagger
#

@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.

south wedge
# sonic dagger <@429578251724128278>, I added Automation to easy my irritation at micromanaging...
  1. 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.
  2. 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?
  3. 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.

warm epoch
#

same with gather / woodcutter flags

#
  1. 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
reef widget
warm epoch
sonic dagger
# south wedge 1. I was thinking about a "disabled rule" concept. Didn't see much use of it, th...

Thank you for the insights!

  1. 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.

  2. 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.

  3. 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.....

south wedge
#

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.

hybrid hatch
#

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

south wedge
south wedge
hybrid hatch
reef cypress
#

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.

south wedge
#

The building setup seems awkward, but the game should not crash, anyway. Thanks!

reef cypress
#

YW

south wedge
#

Btw, if the game now allows more than one accessible per building, then the whole path checking algo in Automation is broken.

south wedge
reef cypress
#

It was an IT wood worhshop

south wedge
#

Yup, reproduced.

south wedge
#

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.

reef cypress
#

Appreciate the quick fix!

hybrid hatch
#

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.

south wedge
reef widget
#

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.

hybrid hatch
#

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)

south wedge
#

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 BeaverDabbing Meanwhile, checkout a teaser for the next release:

hybrid hatch
#

πŸ™‚ Trigging all of my ocd, why say 200, when trigger is >=0

south wedge
# hybrid hatch πŸ™‚ 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 kek It always evaluates its value.

hybrid hatch
#

ahhh, I see, capacity is >= 0

reef cypress
south wedge
#

Hmm. The error comes from the water simulation code. Automation doesn't change it. Can you reproduce it on a vanilla+Automation config?

reef cypress
#

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.

south wedge
#

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.

south wedge
reef cypress
#

understood. I'm just checking one more thing.

south wedge
#

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 ThinkingFT

serene urchin
#

Think i have seen it before,
Weird that it fails ParallelizerException

reef cypress
#

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.

south wedge
#

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.

reef cypress
#

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.

south wedge
#

Given the context of the error, I'd be looking at the mods that deal with water simulation. TimberCommons is a good candidate HappyFT But this theory I also checked - I see no relation.

reef cypress
#

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.

south wedge
#

Automation writes pretty much logs in the verbose mode. If you expect the problem to happen, try activating this mode.

reef cypress
#

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?

south wedge
reef cypress
#

Ah, ok... I assumed you just woke up. Must be west coast with the rest of us.

south wedge
#

Yeah, I'm sitting in California πŸ™‚ This time is my most productive time.

reef cypress
#

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.

south wedge
reef cypress
#

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.

south wedge
#

It used to work with the tool groups too, but in v1.0 it's not (yet?) working.

hybrid hatch
#

Tool Group support is practically done by Moddable Tool Groups now. TimberApi won't be updated for 1.0

south wedge
warm epoch
# south wedge Good point. There can be more than one "opposite" rule.

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

reef cypress
#

@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.

reef cypress
#

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.

reef cypress
#

Ok, it ran for the last two hours without crashing. Let me reenable the automation settings.

reef cypress
#

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.

south wedge
#

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.

reef cypress
#

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.

south wedge
#

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.

hybrid hatch
#

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

south wedge
#

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).

hybrid hatch
#

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)?

south wedge
#

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.

hybrid hatch
#

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

south wedge
#

Still, UI will look differently for the same buildings. It may be frustrating.

hybrid hatch
#

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)?

south wedge
#

If one district has 3 stock items and the other district has 10. You'll get groups for one, but not another.

hybrid hatch
#

ahh, between districts too, sure

south wedge
#

And yes, the manufactories can have different goods, based on recipe.

#

So maybe just make an allowlist for those that can group?

reef cypress
#

@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.

south wedge
reef cypress
#

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.

south wedge
reef cypress
#

Yeah, perfect. I was looking for that today... Not like, seriously, but had it been there it would have been useful.

south wedge
#

Too frequently I found myself exporting/editing/importing rules. Thus, the poll.

reef cypress
#

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.

south wedge
reef cypress
#

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.

south wedge
reef cypress
south wedge
#

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 getnum and getstr. Now, you should use: getvalue, getelement, and getlen. 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? πŸ™‚

hybrid hatch
#

Does it support changing the recipe of a building? I'm wondering if it would be possible to reproduce the AutoRecipe mod with this.

south wedge
#

Any logs to reveal the problem?

hybrid hatch
#

I haven't tried, I don't see anything on the wiki for it.

south wedge
#

What do I need to know about "AutoRecipe"? In nutshell.

hybrid hatch
#

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."

south wedge
#

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.

hybrid hatch
#

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]"

south wedge
#

Ah!

hybrid hatch
#

then with a bit of careful rules writing you might be able to construct something that would approximate the same logic

south wedge
#

So, a switching the recipe action we're talking about.

hybrid hatch
#

right

south wedge
#

A long asked one πŸ™‚

hybrid hatch
#

switching to a specific one

south wedge
#

Okay, you caught me on the mood. I will give it a try right now.

hybrid hatch
#

lol

south wedge
#

Do you need an action or both: singal/action?

#

(signal = recipe changed)

hybrid hatch
#

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)

hybrid hatch
#

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

south wedge
#

Like this?

#

Still need to manage the recipe ids selection. But it works! More or less.

south wedge
#

Manufactory.SetRecipe action

south wedge
lime python
#

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 ?

hybrid hatch
#

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"

south wedge
#

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 kekw

hybrid hatch
#

lol

south wedge
#

Any ideas how we can make rules without ordering? I'm open for the ideas.

hybrid hatch
#

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

south wedge
hybrid hatch
#

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

south wedge
#

Btw, I ended up with making a more extended Log action. In case of you're bored with concat

hybrid hatch
#

(where locking_condition is a signal)

#

but order might be consistent right? (if not determined)

south wedge
#

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?

south wedge
hybrid hatch
#

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

south wedge
hybrid hatch
#

yea, and might not even be persistent between save/load cycle I'd guess

south wedge
#

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.

hybrid hatch
#

yea

#

I know later Python 2 made it randomly change for each program run

south wedge
#

Tbh, I'd avoid "statful rules." It would make a lot of troubles.

hybrid hatch
#

I think in Python 3 it's now insertion order

#

.Net docs say "The order in which the items are returned is undefined"

south wedge
#

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 🀣

hybrid hatch
#

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

south wedge
#

Yup. If there are just few elements in the set, the implementation may choose to iterate instead of doing a lookup.

south wedge
#

v3.2.1 (January 5st, 2026):

  • [Feature] Support district signals for stock value and capacity: District.ResourceStock.<GoodId> and District.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 getnum and getstr. Now, you should use: getvalue, getelement, and getlen. 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.
somber dagger
#

Getting good ID errors setting up the Grill. No matter what I choose or using the script function I get the error.

south wedge
south wedge
# somber dagger

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.

somber dagger
#

10-4

#

Thanks for looking into it

south wedge
#

v3.2.2 (January 5st, 2026):

  • [Fix] New game crashes on save.
south wedge
#

v3.2.3 (January 5st, 2026):

  • [Fix] Recipe selection in the action UI is not working.
south wedge
# south wedge
poll_question_text

Do you want to edit rules as a script text? Kind-of the import dialog, but pre-populated with the rules text.

victor_answer_votes

4

total_votes

5

victor_answer_id

1

victor_answer_text

Yes. I find it a good feature.

flint quail
#

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?

reef widget
flint quail
#

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

south wedge
#

Yeah, sorry for that. I'm delaying Wiki update using every reason DamFT 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.

south wedge
flint quail
#

on the bright side, I now have a better understanding of Lisp. Thanks lol

exotic hemlock
#

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

hybrid hatch
#

Another input similar to beaver/bot/bed count, would be the "number jobs without a worker" and "number of workers without a job".

hybrid hatch
#

The signal is < 5, but the stream gauge shows 49% contamination.

#

Previously the signal was 0-100, is it now 0-1?

south wedge
#

I don't recall changing this signal, but it could happen unintentionally, though.

south wedge
hybrid hatch
#

I didn't check anything personally, just noticed in their video.

south wedge
#

Hmm. It's worth checking.

hybrid hatch
#

I think they used the constructor to make the rules.

south wedge
#

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.

hybrid hatch
#

ahhh, this was the first badtide after setting it up

south wedge
#

In the old (Lisp) syntax, 5 would be 0.05 or 5%. In Python, 5.0 is 500%.

hybrid hatch
#

so it never worked

#

but if you're using the constructor mode, why does the language matter?

south wedge
#

If you use constructor, it shouldn't.

#

Checking right now. Maybe I messed with UI.

hybrid hatch
#

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.

south wedge
#

Checked. The signal propagation seems good to me.

hybrid hatch
#

yea, the rules were just never set correctly

south wedge
hybrid hatch
#

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

south wedge
hybrid hatch
#

yea, this would only be for signals pushed by other objects,

south wedge
hybrid hatch
#

mmm, but I see that you could override the signal value

#

that would cause weird things to happen anyways

south wedge
#

And imagine a race condition: you defined "just custom signal" abc. Then, you try to bind it to a building.

hybrid hatch
#

You could have two different types of signals, exported/derived (from other buildings) and custom (can be set manually)

south wedge
hybrid hatch
#

gotcha

south wedge
#

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 ThinkingIT

#

Sounds crazzy, but it may be fun.

#

Or maybe introduce a derived type after all. And restict using the signal in any other means.

hybrid hatch
#

oh, I see -- is exporting from the gauge still implemented as Signals.Set("foo", StreamGauge.Depth) internally?

south wedge
#
condition:(eq (sig StreamGauge.Contamination) (sig StreamGauge.Contamination))
action:(act Signals.Set 'testCont' (sig StreamGauge.Contamination))

Yup

hybrid hatch
#

what happens if two gauges set the same signal?

#

(If no aggregator is used)

south wedge
#

What can probably be done, is a new action Signals.BubbleUp('StreamGauge.Contamination'). This way, the source signals definition can be tracked.

hybrid hatch
#

it would still need a custom name,

#

but yea,

south wedge
hybrid hatch
#

so if you had two stream gauges, it would be random?

south wedge
hybrid hatch
#

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

south wedge
#

Kind of District.ResourceRatio?

hybrid hatch
#

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 πŸ™

south wedge
#

And what would be the ratio then? πŸ™‚

#

Mathematically, it should be infinite.

hybrid hatch
#

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

south wedge
#

"x/0.1", "x/0.01", etc.

hybrid hatch
#

yea, but limit is not guaranteed to be infinite, it might be -1/12th

south wedge
#

The limit of (x/y) as y approaches zero is infinity. That's what I was taught at university. 30 years ago 🀣

hybrid hatch
#

Right, I was thinking about the limit of x/x

south wedge
#

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 πŸ™‚

hybrid hatch
#

limit(x->0) of (x/x) is 1

south wedge
#

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".

hybrid hatch
#

yea, it would just cause no rules to trigger?

south wedge
hybrid hatch
#

So if ratio < 0.3 would trigger if capacity is 0

south wedge
#

So, if you need to react on "no resource in the district" case, you have to explicitly check for -1.

south wedge
hybrid hatch
#

does district capacity include manufactory output storage?

south wedge
#

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.

hybrid hatch
#

My only concern is that it doesn't crash the game

south wedge
#

You can always check capacity for 0 before dividing πŸ™‚

hybrid hatch
#

but "Ratio" would give you the post-divided value

south wedge
#

However, something like "has resource" would be a convinient shortcut.

south wedge
hybrid hatch
#

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

south wedge
#

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.

south wedge
#

For the stockpile signals, the good in transit is not counted. But there is a feature request to start accounting it.

tiny badger
south wedge
#

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!

torn orbit
reef widget
wicked furnace
torn orbit
#

Thanks guys, appreciate the response. Now I just gotta wait for the mods to update for the new patch.

rose dawn
#

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.

wicked furnace
south wedge
#

I forgot to update Mod.IO HappyIT Will do it now.

rose dawn
south wedge
#

I spent an hour trying to convince AI making a nice Wiki text 🀣 Not sure if it's a right usage of AI kekw

#

AI in my hands always looks like teaching math to my 7-years old daughter.

hybrid hatch
#

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

south wedge
south wedge
hybrid hatch
south wedge
#

Capacity signal - yes, can be event driven on the recipe change.

hybrid hatch
#

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

south wedge
#

Hmm. I maybe misunderstand the concept. What would exactly return District.Resource{Stock,Capacity}.CurrentRecipeInput ?

#

What would be the value?

hybrid hatch
#

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

south wedge
#

Wait, prefix District assumes it's a district wide signal. Did you mean Manufactory.ResourceStock.CurrentRecipeOutputs?

hybrid hatch
#

I don't think so

south wedge
#

But you can have many different manufactories in the district. How will they all fit just one signal?

hybrid hatch
#

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)

south wedge
#

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.

hybrid hatch
#

yea, it would require the binding? (is that the right term) to be recompiled when the recipe is changed,

south wedge
hybrid hatch
#

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%}?

south wedge
south wedge
hybrid hatch
#

(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

south wedge
#

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.

hybrid hatch
#

i.e. the user must just manually re-apply the template

south wedge
#

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.

hybrid hatch
#

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?)

south wedge
#

How will it help to deal with lists?

hybrid hatch
#

blegh, still need a "foreach" operator,

south wedge
#

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?

hybrid hatch
#

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 Zzz

south wedge
#

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

tiny badger
#

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.

south wedge
torn orbit
#

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.

tiny badger
torn orbit
tiny badger
#

Ah ok, I don't use the buttons.

reef widget
south wedge
half lichen
south wedge
#

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.

south wedge
#

Okay, the first playthrough in 2026 today HappyFT Let's see what the mod does to it...

south wedge
#

Indeed, we need a "disable automation" feature.

#

This doesn't look nice. Any UX ideas?

south wedge
#

So, it seems we need a pair of signals: "district needs more" and "district has enough". For the resources.

tiny badger
#

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.

reef widget
tiny badger
#

I dont really use the templates except the builders not blocking one πŸ™‚

torpid schooner
#

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.

torpid schooner
#

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?

reef widget
torpid schooner
#

Thanks, I will just grab both

torpid schooner
#

IS it possible to put the percentage into a script or must I manually determine the number to add to the script?

reef widget
torpid schooner
#

(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

reef widget
#

Other than that, you have the basic idea. Drop the "and" unless you have multiple input conditions in the same rule.

torpid schooner
#

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()

reef widget
torpid schooner
#

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... ?

reef widget
#

Yes, but you should wrap each argument in parentheses to ensure that they're actually translated correctly.

south wedge
south wedge
#

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).

reef widget
south wedge
#

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 ThinkingFT

#

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.

torpid schooner
#

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.

reef widget
#

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.

south wedge
somber dagger
south wedge
#

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.
tiny badger
#

Invert rule sounds great, I've been manually using that to optimise some conditional work across different buildings

tiny badger
#

And confirmed invert rule is awesome πŸ‘

somber dagger
#

Currently there is no way to nest If statements correct (IE conditions)?

serene urchin
south wedge
#

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.

somber dagger
#

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')

south wedge
somber dagger
#

Yeah, not worth the effort πŸ™‚

south wedge
warm epoch
#

in-game dumb editor or vsc / pycharm with proper intellisense and such?

hybrid hatch
#

It would be interesting to have scripts synced to disk so that they're editable with an external editor

south wedge
#

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.

hybrid hatch
#

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

south wedge
#

@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.

hybrid hatch
#

which you would do anyway in the expanded version right?

south wedge
south wedge
#

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?

somber dagger
#

Any way to integrate using Access operators to pull info from say Shift+Alt+X?

reef widget
#

That is a dev menu and should not be considered a feature for integration.

hybrid hatch
#

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

south wedge
south wedge
reef widget
#

An idea that would probably be pointless and annoying, but it would be cute:
A building that employs a beaver to do automation tasks.

somber dagger
#

A "Programmer" beaver building... Would have the interface πŸ™‚

half lichen
#

(perhaps make it a mod option?)

hybrid hatch
#

btw, the new Invert rule option is fantastic!

hybrid hatch
#

Hmm, it might be nice to have an option to "add a rule from template" in the rules editing dialog.

hybrid hatch
#

Is there a way to hook into the building copy feature and copy the rules at the same time?

south wedge
lime python
#

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.

south wedge
#

It turned out to be not that hard to support. The copy thing will be in the next release.

south wedge
# south wedge
poll_question_text

Let's say, you can write a normal Python script (with limited functions) for a building. Will you be using it?

victor_answer_votes

7

total_votes

11

victor_answer_id

2

victor_answer_text

Maybe. When there is no good template/rule.

south wedge
#

Well, the voting is promising.

cold orchid
#

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?

reef widget
cold orchid
#

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

reef widget
cold orchid
#

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

reef widget
#

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.

cold orchid
#

this is how I thought it would work

#

what do you think?

reef widget
#

Can I see the actual setup?
Not just the scripts.

cold orchid
#

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

reef widget
#

So the goal is to pump out all bad water?

cold orchid
#

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

reef widget
#

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.
cold orchid
#

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

reef widget
#

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.

cold orchid
#

yes

#

thank you very much

#

I'll let you know next badtide if all is good πŸ™‚

cold orchid
#

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

reef widget
#

What's the signal value?

cold orchid
#

13%

reef widget
#

I wonder...

I'll have to mess with it myself a bit to figure out what needs to happen.

cold orchid
#

it really should work, the logic is sound!

#

I really don't get it why it doesn't pick the signal value

hybrid hatch
#

I think contamination might be measured between 0 and 1, so it might need to be 0.02?

cold orchid
#

and now the pumps pause by themselves!!!

hybrid hatch
cold orchid
#

so it IS reading the signal, but no idea what it's reading

cold orchid
#

I see!

#

lets change it and see

reef widget
#

Oh, I should have expected that.

cold orchid
#

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

south wedge
#

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).

hybrid hatch
#

Disable individual rules?

#

Will there be an easy way to disable/enable all rules (for a single building) at once?

hybrid hatch
#

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

south wedge
south wedge
hybrid hatch
#

err, your Custom Tools mod on mod.io doesn't have a Mod tag, so Mod Manager doesn't know how to install it

south wedge
#

I just realized, it's not documented 🀦

south wedge
hybrid hatch
#

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⁩?

south wedge
#

The signal returns the frame number. It's monotonically going up.

#

My bad, I missed it in the docs DamFT

hybrid hatch
#

it's also not in the constructor (which is maybe fine)

south wedge
hybrid hatch
#

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

south wedge
hybrid hatch
#

I don't want to set or trigger it from another value

south wedge
hybrid hatch
#

Rule on breeding pods: ⁨If District.Beavers > Signals.BeaverLimit Then Pausable.Pause()⁩, ⁨If District.Beavers < Signals.BeaverLimit * 0.9 Then Pausable.Unpause()⁩,

south wedge