Combiner 2.0 Feedback
Posted: Fri Nov 10, 2023 7:31 pm
Loving the new changes so far to Combinator but I definitely feel like there are some key missing parts. I started thinking about how this will affect the design of train stops and think that adding a few different options could help a lot for new players. Also, additions to the Arithmetic Combinator and chests I am super sad to not see added.
Arithmetic Combinator or the Decider Combinator NEEDS to have at minimum support for Min and Max. Ideally it would have the clamp operator as well but at minimum please add min/max. To make a min operator you need two Decider and a multiplier. On top of that you need to hardcode the constant value in each or wire up a constant combinator to all three. Its complex and annoying and very error prone. Also you need to understand the wire merge/addition mechanic which merges the two branching signals back together. Its the most difficult part for a noob to understand when making train stops. Please add that functionality to the Arithmetic Combinator. Adding this alone would simplify train stops by almost half the complexity and number of operators.
Unloader stations/item request stations are annoying and hard to build. Please add additional functionality to make this better. Some useful tools for that would be for chests to emit signals around how empty the chest is such as number of empty slots or the number of selected items that can fit in the chest. AKA you select copper ore or 100 copper ore, and it tells you how much more copper ore is needed to full up to that amount (both a full chest or a constant amount). This would make calculating the number of missing items a stop much easier and automatic.
Also please add an option for the chest to output a constant value(aka 1 chest) so you can count how many chests are connected. A count of how many chests are connected at a train stop plus the stack size operator seems very powerful. Mostly i just want it to make sure that all my chests at a train stop are connected to a wire. I think this would make it much easier to build unloader stations and stations requesting items.
Next let's look at calculating the inventory at loader train stations.
Stack size is great, but for train stops, really not what you want. I imagine you would use the stack size operator to calculate the train capacity then calculate the # of trains. something like:
Input------------------------------------------------------------------------------------------------------->
Input->Selector(Stack Size)----------------------------------------->mul(items per train)->div(# trains)
Constant Combinator 160------------------------------------------>
This works and it is much better then vanilla because it offers a much more robust solution not needing to manually edit the constant combinator for item types but it also has a lot very complex wiring. I think it also has noob unfriendly features like the Constant Combinator is representing both the number of cargo wagons per train and number of stacks per wagon and it only works for stack based loading.
Alternatively, if we had Cargo Wagon Capacity as an option for the selector:
Input----------------------------------------------------------------------------------------------->
Input->Selector(Cargo Wagon Capacity)------------------->mul(items/train)->div(# trains)
Constant Combinator 4(wagon/train)----------------------->
I think is this much more noob friendly because all simplification of the constant combinator and it also it works for liquids. Also, when building this setup you are working with simple understandable intermediate values, Cargo wagon capacity, number of wagons per train, number of items per train. Selector could even offer a number modifier to the cargo wagon capacity so it would provide 4x cargo wagon capacity if you wanted to remove the need for a constant combinator and multiply.
A different approach would be to provide a more robust divide operator. This would likely be an additional option in the Arithmetic Combinator operators instead of a selector operator. Two useful examples would be converting a signal into the number of stacks of that signal or the number of cargo wagons of that signal. Both of these operators would be equivalent to dividing the signal by the Stack size or Cargo wagon capacity which make sense as an option when selecting the constant value of the Arithmetic Combinator's divide. The Arithmetic Combinator already allows you to select a constant or a signal value. This might be going too far in simplifying, however.
Example for Number of stacks in a signal:
Input->selector(Number of stacks in inventory)--------------------------------->div(# trains)
Constant Combinator 160(40 stacks per wagon * number of trains 4)->
This method saves only one multiply but simplifies the wiring significantly (only three wire connections). But only works for non-liquids. Note that you don't need to wire the original input into the div which is much simpler to figure out for a noob. I think this is going too far in simplifying but i though i would include it.
Finally, if we had Number of Cargo Wagons:
Input->Selector(number of Cargo Wagons)->
Constant Combinator 4(Number of trains)->div(# trains)
This is the simplest and works for both liquids and non-liquids. It is however probably too simple.
Conclusions on the Selector:
I think that the number of stacks per signal is not really in the spirt of the selector but if simplify is the goal it helps a lot. If it were up to me i think adding "Cargo Wagon Capacity" is a no brainer as it is very simpler to "Rocket Capacity" which is a function of the selector already and allows for a train stop to support both liquids and non-liquids very easily.
TLDR: Please add
"Cargo Wagon Capacity" to the selector and maybe even "Steel Chest Capacity"
min/max/clamp operators to Arithmetic Combinator or Decider Combinator.
Add option for chests to output a signal for empty space or missing items from chest.
Add option for chest to emit constant value for chest counting.
Arithmetic Combinator or the Decider Combinator NEEDS to have at minimum support for Min and Max. Ideally it would have the clamp operator as well but at minimum please add min/max. To make a min operator you need two Decider and a multiplier. On top of that you need to hardcode the constant value in each or wire up a constant combinator to all three. Its complex and annoying and very error prone. Also you need to understand the wire merge/addition mechanic which merges the two branching signals back together. Its the most difficult part for a noob to understand when making train stops. Please add that functionality to the Arithmetic Combinator. Adding this alone would simplify train stops by almost half the complexity and number of operators.
Unloader stations/item request stations are annoying and hard to build. Please add additional functionality to make this better. Some useful tools for that would be for chests to emit signals around how empty the chest is such as number of empty slots or the number of selected items that can fit in the chest. AKA you select copper ore or 100 copper ore, and it tells you how much more copper ore is needed to full up to that amount (both a full chest or a constant amount). This would make calculating the number of missing items a stop much easier and automatic.
Also please add an option for the chest to output a constant value(aka 1 chest) so you can count how many chests are connected. A count of how many chests are connected at a train stop plus the stack size operator seems very powerful. Mostly i just want it to make sure that all my chests at a train stop are connected to a wire. I think this would make it much easier to build unloader stations and stations requesting items.
Next let's look at calculating the inventory at loader train stations.
Stack size is great, but for train stops, really not what you want. I imagine you would use the stack size operator to calculate the train capacity then calculate the # of trains. something like:
Input------------------------------------------------------------------------------------------------------->
Input->Selector(Stack Size)----------------------------------------->mul(items per train)->div(# trains)
Constant Combinator 160------------------------------------------>
This works and it is much better then vanilla because it offers a much more robust solution not needing to manually edit the constant combinator for item types but it also has a lot very complex wiring. I think it also has noob unfriendly features like the Constant Combinator is representing both the number of cargo wagons per train and number of stacks per wagon and it only works for stack based loading.
Alternatively, if we had Cargo Wagon Capacity as an option for the selector:
Input----------------------------------------------------------------------------------------------->
Input->Selector(Cargo Wagon Capacity)------------------->mul(items/train)->div(# trains)
Constant Combinator 4(wagon/train)----------------------->
I think is this much more noob friendly because all simplification of the constant combinator and it also it works for liquids. Also, when building this setup you are working with simple understandable intermediate values, Cargo wagon capacity, number of wagons per train, number of items per train. Selector could even offer a number modifier to the cargo wagon capacity so it would provide 4x cargo wagon capacity if you wanted to remove the need for a constant combinator and multiply.
A different approach would be to provide a more robust divide operator. This would likely be an additional option in the Arithmetic Combinator operators instead of a selector operator. Two useful examples would be converting a signal into the number of stacks of that signal or the number of cargo wagons of that signal. Both of these operators would be equivalent to dividing the signal by the Stack size or Cargo wagon capacity which make sense as an option when selecting the constant value of the Arithmetic Combinator's divide. The Arithmetic Combinator already allows you to select a constant or a signal value. This might be going too far in simplifying, however.
Example for Number of stacks in a signal:
Input->selector(Number of stacks in inventory)--------------------------------->div(# trains)
Constant Combinator 160(40 stacks per wagon * number of trains 4)->
This method saves only one multiply but simplifies the wiring significantly (only three wire connections). But only works for non-liquids. Note that you don't need to wire the original input into the div which is much simpler to figure out for a noob. I think this is going too far in simplifying but i though i would include it.
Finally, if we had Number of Cargo Wagons:
Input->Selector(number of Cargo Wagons)->
Constant Combinator 4(Number of trains)->div(# trains)
This is the simplest and works for both liquids and non-liquids. It is however probably too simple.
Conclusions on the Selector:
I think that the number of stacks per signal is not really in the spirt of the selector but if simplify is the goal it helps a lot. If it were up to me i think adding "Cargo Wagon Capacity" is a no brainer as it is very simpler to "Rocket Capacity" which is a function of the selector already and allows for a train stop to support both liquids and non-liquids very easily.
TLDR: Please add
"Cargo Wagon Capacity" to the selector and maybe even "Steel Chest Capacity"
min/max/clamp operators to Arithmetic Combinator or Decider Combinator.
Add option for chests to output a signal for empty space or missing items from chest.
Add option for chest to emit constant value for chest counting.