Research Control Tower


Sets your infinite research based on a circuit signal. Supports all infinite technologies including modded ones.

Content
5 months ago
2.0
552
Circuit network

i Research cost

5 months ago

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?

5 months ago

Would it be acceptable if this was a startup setting and not changeable in game?

5 months ago

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.

5 months ago
(updated 5 months ago)

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

5 months ago

Cost of the next level.

5 months ago

added as a setting in version 1.3.0

5 months ago

Thank you! Now this is truly automated factory.

2 months ago

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.

4 days ago
(updated 4 days ago)

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

New response