Sets your infinite research based on a circuit signal. Supports all infinite technologies including modded ones.
Mods introducing new content into the game.
Entities which interact with the circuit network.
My current research strategy is to always choose cheapest first of the set of techs I want, but trying to calculate cost of various productivity techs with circuits seems near impossible (can't use fractions (1000×1.5^Level)) so I was wondering if the mod could provide those values somehow? Perhaps Research Analyzer could have alternate output mode?
Would it be acceptable if this was a startup setting and not changeable in game?
Were I start a new game then yes, it would be ok. But I went and installed this mod when my research prod tech is already at level 29, and its cost can be only be calculated up to level 11 using any sane math before overflow becomes limiting factor. So no, startup setting is not really ok option here.
are you looking for cumulative cost of all levels of the tech or the cost for the next level? circuit signals are limited to 2.147 billion
Cost of the next level.
added as a setting in version 1.3.0
Thank you! Now this is truly automated factory.
Now that I have enjoyed this mod a while, I have come in conclusion that I would want to have access to both research cost and levels at same time, as some techs have no effect beyond certain level (such as prod and railgun speed techs). Now this is not complain or anything, as it is relatively simple to blacklist some techs with combinators, but I was wondering if it is possible to have Analyzer output two different logistics groups; one for cost and another for level? It would require user to have two Analyzers to make use of both values.
i have some kind of solution for this: quality
a few small changes are enough (just replace the following two functions and leave the rest as it is):
local function get_current_tech_signals()
local alltechs = game.forces.player.technologies
log_debug(#alltechs.." techs total")
log_debug(#valid_signals.." infinite techs")
local techmap = {}
for _, techname in pairs(valid_signals) do
--log_debug(techname)
if techname then
--log_debug(techstring.." valid")
if game.forces.player.technologies[techname].valid then
log_debug(game.forces.player.technologies[techname].name)
log_debug(game.forces.player.technologies[techname].level)
table.insert(techmap, {
name = techname,
level = game.forces.player.technologies[techname].level,
cost = game.forces.player.technologies[techname].research_unit_count
})
end
end
end
log_debug(#techmap.." mapped")
return techmap
end
local function update_combinators()
if not storage.combinators then
log_debug("no combinators to update")
return
end
local signals = get_current_tech_signals()
local j = 0
for _, combinator in pairs(storage.combinators) do
control = combinator.get_control_behavior(defines.control_behavior.type.constant_combinator)
--log_debug(control.object_name)
for i = control.sections_count,1,-1 do
control.remove_section(i)
end
--log_debug(control.sections_count)
local section_level = control.add_section("[virtual-signal=signal-science-pack]")
local section_cost, section_costk, section_costkk, section_costkkk
if settings.global["research-analyzer-output-setting"].value == true then
section_cost = control.add_section("[virtual-signal=signal-science-pack] Cost")
section_costk = control.add_section("[virtual-signal=signal-science-pack] Cost / 1.000")
section_costkk = control.add_section("[virtual-signal=signal-science-pack] Cost / 1.000.000")
section_costkkk = control.add_section("[virtual-signal=signal-science-pack] Cost / 1.000.000.000")
end
if j==0 then
for i = 1, #signals do
signals[i].cost = math.min(2147483647, signals[i].cost)
local sig_value = { type = "virtual", name = signals[i].name, quality = "normal", comparator = nil }
local lf_level = { value = sig_value, min = signals[i].level, max = signals[i].level }
section_level.set_slot(i, lf_level)
if settings.global["research-analyzer-output-setting"].value == true then
local sig_cost = { type = "virtual", name = signals[i].name, quality = "uncommon", comparator = nil }
local lf_cost = { value = sig_cost, min = signals[i].cost, max = signals[i].cost }
section_cost.set_slot(i, lf_cost)
local sig_cost = { type = "virtual", name = signals[i].name, quality = "rare", comparator = nil }
local lf_costk = { value = sig_cost, min = math.floor(signals[i].cost / 1000), max = math.floor(signals[i].cost / 1000) }
section_costk.set_slot(i, lf_costk)
local sig_cost = { type = "virtual", name = signals[i].name, quality = "epic", comparator = nil }
local lf_costkk = { value = sig_cost, min = math.floor(signals[i].cost / 1000000), max = math.floor(signals[i].cost / 1000000) }
section_costkk.set_slot(i, lf_costkk)
local sig_cost = { type = "virtual", name = signals[i].name, quality = "legendary", comparator = nil }
local lf_costkkk = { value = sig_cost, min = math.floor(signals[i].cost / 1000000000), max = math.floor(signals[i].cost / 1000000000) }
section_costkkk.set_slot(i, lf_costkkk)
end
end
j=1
end
end
end
what does it do?
if the config you used for the switch between cost/level is true, it'll add 4 new sections to the research analyzer: one for each quality.
you only need one of those but since many costs exceed 2³² you can choose between:
uncommon = normal cost
rare = cost / 1 000
epic = cost / 1 000 000 and
legendary = cost / 1 000 000 000
at some point normal or even rare won't be enough to represent the cost so you can switch between them at any time.
why quality and not different signals?
because it's way easier to map a quality signal (cost) to a normal one (level) which is needed to set the next research.
example blueprint to auto research the cheapest one:
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
added a smal fix for numbers >32 bit in the code above^^