cecell icon

turretfactory.lua

cecell | PRO | 08/31/19 03:52:21 AM UTC | 0 ⭐ | 396 👁️ | Never ⏰ | []
Lua |

34.05 KB

|

None

|

0 👍

/

0 👎

 
package.path = package.path .. ";data/scripts/lib/?.lua"
 
TurretFactory = TurretFactory or {}
local Config = include("elonturretfactoryconfig")
if onClient() then
    TurretFactory.UI = {}
    TurretFactory.UI.lines = {}
    TurretFactory.UI.stat_lines = {}
    TurretFactory.UI.seed_index = 1
    TurretFactory.UI.size = Config.ui_size or vec2(1050, 500)
    TurretFactory.UI.offset = Config.ui_offset or vec2(-185,0)
    TurretFactory.unsorted_Turret_List = {}
    TurretFactory.max_stats = {}
end
 
function TurretFactory.restore(data)
    TurretFactory.max_seed = data.maxSeedAmount
end
 
function TurretFactory.secure()
    local data = {}
    data.maxSeedAmount = TurretFactory.max_seed
    return data
end
 
function TurretFactory.initUI() -- Overriding vanilla
 
    local res = getResolution()
 
    TurretFactory.UI.menu = ScriptUI()
    TurretFactory.UI.window = TurretFactory.UI.menu:createWindow(Rect(res * 0.5 - TurretFactory.UI.size * 0.5 + TurretFactory.UI.offset, res * 0.5 + TurretFactory.UI.size * 0.5 + TurretFactory.UI.offset))
 
    TurretFactory.UI.window.caption = "Turret Factory"%_t
    TurretFactory.UI.window.showCloseButton = 1
    TurretFactory.UI.window.moveable = 1
    TurretFactory.UI.menu:registerWindow(TurretFactory.UI.window, "Build Turrets /*window title*/"%_t);
 
    TurretFactory.UI.container = TurretFactory.UI.window:createContainer(Rect(vec2(0,0), TurretFactory.UI.size));
 
    TurretFactory.UI.horizontal_lister = UIHorizontalLister(Rect(vec2(0,10), TurretFactory.UI.size+vec2(0,-10)),10,10)
 
    --left
    TurretFactory.UI.left = UIHorizontalSplitter(TurretFactory.UI.horizontal_lister:placeCenter(vec2(TurretFactory.UI.size.x/4-10, TurretFactory.UI.size.y-20)),10,0,0.82)
    TurretFactory.UI.container:createFrame(TurretFactory.UI.left.top);
    TurretFactory.UI.container:createFrame(TurretFactory.UI.left.bottom);
 
    TurretFactory.UI.left_lister = UIVerticalLister(TurretFactory.UI.left.top, 10, 10)
    TurretFactory.UI.left_lister.padding = 10 -- add a higher padding as the slider texts might overlap otherwise
 
    TurretFactory.UI.container:createLabel(TurretFactory.UI.left_lister:placeCenter(vec2(TurretFactory.UI.left_lister.inner.width, 15)).lower, "Weapon Type"%_t, 14)
    TurretFactory.UI.turretTypeCombo = TurretFactory.UI.container:createComboBox(Rect(), "onTurretTypeSelect")
    TurretFactory.UI.left_lister:placeElementCenter(TurretFactory.UI.turretTypeCombo)
 
    TurretFactory.UI.container:createLabel(TurretFactory.UI.left_lister:placeCenter(vec2(TurretFactory.UI.left_lister.inner.width, 15)).lower, "Rarity"%_t, 14)
    TurretFactory.UI.rarityCombo = TurretFactory.UI.container:createComboBox(Rect(), "onRaritySelect")
    TurretFactory.UI.left_lister:placeElementCenter(TurretFactory.UI.rarityCombo)
 
    TurretFactory.UI.rarityCombo:addEntry("Common"%_t, Rarity(RarityType.Common).color)
    TurretFactory.UI.rarityCombo:addEntry("Uncommon"%_t, Rarity(RarityType.Uncommon).color)
    TurretFactory.UI.rarityCombo:addEntry("Rare"%_t, Rarity(RarityType.Rare).color)
 
    TurretFactory.UI.container:createLabel(TurretFactory.UI.left_lister:placeCenter(vec2(TurretFactory.UI.left_lister.inner.width, 15)).lower, "Crafting Amount"%_t, 14)
    TurretFactory.UI.bulkTextBox = TurretFactory.UI.container:createTextBox(TurretFactory.UI.left_lister:placeCenter(vec2(TurretFactory.UI.left_lister.inner.width, 30)), "bulkChanged");
    TurretFactory.UI.bulkTextBox.text = TurretFactory.bulk or 1
    TurretFactory.UI.bulkTextBox.allowedCharacters = "0123456789"
 
    TurretFactory.UI.help_checkbox = TurretFactory.UI.container:createCheckBox(Rect(TurretFactory.UI.left.top.topRight+vec2(-75-10,10),TurretFactory.UI.left.top.topRight+vec2(-10,20+10)),"Help?","onHelp")
 
    TurretFactory.UI.help_text_field_rect = TurretFactory.UI.left_lister:placeCenter(vec2(TurretFactory.UI.left_lister.inner.width, 180))
    TurretFactory.UI.container:createFrame(TurretFactory.UI.help_text_field_rect)
    TurretFactory.UI.help_text_field = TurretFactory.UI.container:createTextField(TurretFactory.UI.help_text_field_rect,"",14)
    TurretFactory.UI.help_text_field.text = "To use the search feature check a box for the stat you want included in the sum. The turret factory will then find the max value for every box checked and measure every turrets stat against its max to determine a value out of 1. That number is added to the turrets \"sum\" which is used when sorting turrets. You can invert the value before its added to the sum by adding a \"!\". \n \nThe text box to the right of the stat is used not only for inverting its value as mentioned above but also for punishing turrets for not meeting at-least the value you put inside that box. Putting a \"-\" in will flip that to be at-most instead of at-least. \n\nIt is worth mentioning the ingredients used to make affect the search, so you probably want to check the max box before a search."
 
    TurretFactory.UI.left_horizontal_split = UIHorizontalSplitter(TurretFactory.UI.left.bottom,10,10,0.5)
 
    TurretFactory.UI.left_seed_label_top = TurretFactory.UI.container:createLabel(TurretFactory.UI.left_horizontal_split.top.topLeft+vec2(0,-5),"",14)
    TurretFactory.UI.left_seed_label_bottom = TurretFactory.UI.container:createLabel(TurretFactory.UI.left_horizontal_split.top.bottomLeft+vec2(0,-15),"",14)
 
    if Config.seedsBuyable then
 
        TurretFactory.UI.left_seed_label_top.caption = "Buy more seeds:"
        TurretFactory.UI.left_seed_label_bottom.caption = "Currently Unlocked: 1"
        TurretFactory.UI.upgrade_button = TurretFactory.UI.container:createButton(TurretFactory.UI.left_horizontal_split.bottom,"Upgrade Seeds","onUpgrade")
 
    else
 
        TurretFactory.UI.left_seed_label_top.caption = "Search Start:"
        TurretFactory.UI.left_seed_label_bottom.caption = "From seed x to x+"..Config.sample_size
        TurretFactory.UI.left_seed_text_box = TurretFactory.UI.container:createTextBox(TurretFactory.UI.left_horizontal_split.bottom,"clearTurretList")
        TurretFactory.UI.left_seed_text_box.text = "0"
        TurretFactory.UI.left_seed_text_box.allowedCharacters = "0123456789"
 
    end
 
    --middle
    TurretFactory.UI.middle = UIHorizontalSplitter(TurretFactory.UI.horizontal_lister:placeCenter(vec2(TurretFactory.UI.size.x/4-10, TurretFactory.UI.size.y-20)),10,0,0.82)
    TurretFactory.UI.middle_scroll_frame = TurretFactory.UI.container:createScrollFrame(TurretFactory.UI.middle.top)
    TurretFactory.UI.middle_lister = UIVerticalLister(Rect(vec2(),TurretFactory.UI.middle.top.size+vec2(-15,0)),10,10)
    TurretFactory.UI.container:createFrame(TurretFactory.UI.middle.bottom);
 
    for _ = 1, 50 do
 
        local line = {}
        line.rect = TurretFactory.UI.middle_lister:placeCenter(vec2(TurretFactory.UI.middle_lister.inner.width, 20))
        line.vertical_split = UIArbitraryVerticalSplitter(line.rect, 10, 0, 25, TurretFactory.UI.middle_lister.inner.width/2+15, TurretFactory.UI.middle_lister.inner.width)
 
        local i = 0
        line.checkbox = TurretFactory.UI.middle_scroll_frame:createCheckBox(line.vertical_split:partition(i),"",""); i = i + 1
        line.stat_frame = TurretFactory.UI.middle_scroll_frame:createFrame(line.vertical_split:partition(i))
        line.stat_frame.backgroundColor = ColorARGB(0.7,0,0,0)
        line.stat = TurretFactory.UI.middle_scroll_frame:createLabel(line.vertical_split:partition(i).lower+vec2(2.5,2.5), "Stat", 14)
        line.stat.shortenText = true
        line.stat.size = line.vertical_split:partition(i).size; i = i + 1
        line.text_box = TurretFactory.UI.middle_scroll_frame:createTextBox(line.vertical_split:partition(i),"")
        line.text_box.text = 0
        line.text_box.allowedCharacters = "0123456789!.-"; i = i + 1
 
        line.hide = function(self)
            self.checkbox:hide()
            self.stat_frame:hide()
            self.stat:hide()
            self.text_box:hide()
        end
 
        line.show = function(self)
            self.checkbox:show()
            self.stat_frame:show()
            self.stat:show()
            self.text_box:show()
        end
 
        line:hide()
 
        table.insert(TurretFactory.UI.stat_lines,line)
 
    end
 
    TurretFactory.UI.middle_vertical_split = UIVerticalSplitter(TurretFactory.UI.middle.bottom,10,10,2/3)
    TurretFactory.UI.middle_clear_search = UIHorizontalSplitter(TurretFactory.UI.middle_vertical_split.right,10,0,0.5)
    TurretFactory.UI.clear_button = TurretFactory.UI.container:createButton(TurretFactory.UI.middle_clear_search.bottom, "Clear", "onClear")
    TurretFactory.UI.search_button = TurretFactory.UI.container:createButton(TurretFactory.UI.middle_clear_search.top, "Search", "onSearch")
    TurretFactory.UI.middle_seed_horizontal_split = UIHorizontalSplitter(TurretFactory.UI.middle_vertical_split.left,10,0,0.5)
    TurretFactory.UI.middle_seed_split = UIArbitraryVerticalSplitter(TurretFactory.UI.middle_seed_horizontal_split.bottom, 0, 0, TurretFactory.UI.middle_seed_horizontal_split.bottom.width/5, TurretFactory.UI.middle_seed_horizontal_split.bottom.width/5*4, TurretFactory.UI.middle_seed_horizontal_split.bottom.width)
    TurretFactory.UI.prev_button = TurretFactory.UI.container:createButton(TurretFactory.UI.middle_seed_split:partition(0),"<","onSeedPrev")
    TurretFactory.UI.seed_text_box = TurretFactory.UI.container:createTextBox(TurretFactory.UI.middle_seed_split:partition(1),"onSeedTextBox")
    TurretFactory.UI.seed_text_box.text = "0"
    TurretFactory.UI.seed_text_box.allowedCharacters = "0123456789"
    TurretFactory.UI.next_button = TurretFactory.UI.container:createButton(TurretFactory.UI.middle_seed_split:partition(2),">","onSeedNext")
    TurretFactory.UI.middle_seed_label_top = TurretFactory.UI.container:createLabel(TurretFactory.UI.middle_seed_horizontal_split.top.topLeft+vec2(0,-5), "Sum: 0", 14)
    TurretFactory.UI.middle_seed_label_top.size = TurretFactory.UI.middle_seed_horizontal_split.top.size
    TurretFactory.UI.middle_seed_label_top.shortenText = true
    TurretFactory.UI.middle_seed_label_bottom = TurretFactory.UI.container:createLabel(TurretFactory.UI.middle_seed_horizontal_split.top.bottomLeft+vec2(0,-15), "Current Seed:", 14)
 
    --right
    TurretFactory.UI.right = UIHorizontalSplitter(TurretFactory.UI.horizontal_lister:placeCenter(vec2(TurretFactory.UI.size.x/2-20, TurretFactory.UI.size.y-20)),10,0,0.82)
    TurretFactory.UI.right_scroll_frame = TurretFactory.UI.container:createScrollFrame(TurretFactory.UI.right.top)
    TurretFactory.UI.right_lister = UIVerticalLister(Rect(vec2(),TurretFactory.UI.right.top.size+vec2(-20,0)),10,10)
    TurretFactory.UI.container:createFrame(TurretFactory.UI.right.bottom);
 
    TurretFactory.UI.right_vertical_split = UIArbitraryVerticalSplitter(TurretFactory.UI.right_lister:placeCenter(vec2(TurretFactory.UI.right_lister.inner.width, 30)), 10, 5, 200, 240, 320, 390)
    TurretFactory.UI.parts_label = TurretFactory.UI.right_scroll_frame:createLabel(TurretFactory.UI.right_vertical_split:partition(0).lower, "Parts"%_t, 14)
    TurretFactory.UI.parts_label.size = TurretFactory.UI.right_vertical_split:partition(0).upper
    TurretFactory.UI.max_checkbox = TurretFactory.UI.right_scroll_frame:createCheckBox(TurretFactory.UI.right_vertical_split:partition(2),"Max","onMaxCheckBox")
    TurretFactory.UI.required_label = TurretFactory.UI.right_scroll_frame:createLabel(TurretFactory.UI.right_vertical_split:partition(3).lower, "Req"%_t, 14)
    TurretFactory.UI.required_label.size = vec2(50,30)
    TurretFactory.UI.you_label = TurretFactory.UI.right_scroll_frame:createLabel(TurretFactory.UI.right_vertical_split:partition(4).lower, "You"%_t, 14)
    TurretFactory.UI.you_label.size = vec2(50,30)
    TurretFactory.UI.parts_line = TurretFactory.UI.right_scroll_frame:createLine(vec2(10,40),vec2(TurretFactory.UI.right_lister.inner.width+10,40))
 
    for _ = 1, 20 do
 
        local line = {}
        line.rect = TurretFactory.UI.right_lister:placeCenter(vec2(TurretFactory.UI.right_lister.inner.width, 30))
        line.vertical_split = UIArbitraryVerticalSplitter(line.rect, 10, 7, 20, 250, 280, 310, 320, 390)
 
        line.frame = TurretFactory.UI.right_scroll_frame:createFrame(line.rect)
 
        local i = 0
 
        line.icon = TurretFactory.UI.right_scroll_frame:createPicture(line.vertical_split:partition(i), ""); i = i + 1
        line.material = TurretFactory.UI.right_scroll_frame:createLabel(line.vertical_split:partition(i).lower, "", 14)
        line.material.size = vec2(200,30); i = i + 1
        line.plus = TurretFactory.UI.right_scroll_frame:createButton(line.vertical_split:partition(i), "+", "onPlus"); i = i + 1
        line.minus = TurretFactory.UI.right_scroll_frame:createButton(line.vertical_split:partition(i), "-", "onMinus"); i = i + 2
        line.required = TurretFactory.UI.right_scroll_frame:createLabel(line.vertical_split:partition(i).lower, "", 14)
        line.required.size = vec2(50,30); i = i + 1
        line.you = TurretFactory.UI.right_scroll_frame:createLabel(line.vertical_split:partition(i).lower, "", 14)
        line.you.size = vec2(50,30); i = i + 1
 
        line.icon.isIcon = 1
        line.minus.textSize = 12
        line.plus.textSize = 12
        line.material.fontSize = 14
        line.required.fontSize = 14
        line.you.fontSize = 14
 
        line.hide = function(self)
            self.icon:hide()
            self.frame:hide()
            self.material:hide()
            self.plus:hide()
            self.minus:hide()
            self.required:hide()
            self.you:hide()
        end
 
        line.show = function(self)
            self.icon:show()
            self.frame:show()
            self.material:show()
            self.plus:show()
            self.minus:show()
            self.required:show()
            self.you:show()
        end
 
        line:hide()
 
        table.insert(TurretFactory.UI.lines, line)
 
    end
 
    TurretFactory.UI.buildButton = TurretFactory.UI.container:createButton(Rect(), "Build /*Turret Factory Button*/"%_t, "onBuildButtonPressed")
    TurretFactory.UI.right_organizer = UIOrganizer(TurretFactory.UI.right.bottom)
    TurretFactory.UI.right_organizer.margin = 10
    TurretFactory.UI.right_organizer:placeElementBottomRight(TurretFactory.UI.buildButton)
 
    TurretFactory.UI.priceLabel = TurretFactory.UI.container:createLabel(vec2(TurretFactory.UI.right.bottom.lower.x, TurretFactory.UI.right.bottom.upper.y) + vec2(12, -75), "Manufacturing Price: Too Much"%_t, 16)
 
 
    -- needs a separate counter here, weaponTypes are not strictly numbered from 1 to X
    local c = 0
    for _, type in pairs(weaponTypes) do
        local name = WeaponTypes.nameByType[type]
 
        TurretFactory.UI.turretTypeCombo:addEntry(name)
        weaponsByComboEntry[c] = type
        c = c + 1
    end
 
    TurretFactory.UI.turretTypeCombo.selectedIndex = 0
 
    -- Compatibility
    window = TurretFactory.UI.window
    container = TurretFactory.UI.container
    turretTypeCombo = TurretFactory.UI.turretTypeCombo
    rarityCombo = TurretFactory.UI.rarityCombo
    lines = TurretFactory.UI.lines
    priceLabel = TurretFactory.UI.priceLabel
 
end
 
function TurretFactory.refreshUI() -- Overriding vanilla
    local ingredients = TurretFactory.getUIIngredients()
    if Config.seedsBuyable then
        if not TurretFactory.max_seed then TurretFactory.syncMaxSeed() return end
        local price = (Config.upgradeBasePrice + (Config.upgradeBasePrice * 0.1 * TurretFactory.max_seed)) * Config.upgradeAmount
        if TurretFactory.max_seed + Config.upgradeAmount > Config.max_buyable then
            TurretFactory.UI.left_seed_label_top.caption = "You've bought all the seeds."
        else
            TurretFactory.UI.left_seed_label_top.caption = "Cost: " .. createMonetaryString(price)
        end
    end
 
    for _, line in pairs(lines) do
        line:hide()
    end
 
    local ship = Entity(Player().craftIndex)
    if not ship then return end
 
    for i, ingredient in pairs(ingredients) do
        local line = TurretFactory.UI.lines[i]
        line:show()
 
        if ingredient.default == nil then ingredient.default = ingredient.amount end
 
        local good = goods[ingredient.name]:good()
 
        local needed = ingredient.amount * (tonumber(TurretFactory.UI.bulkTextBox.text) or 1)
        local have = ship:getCargoAmount(good) or 0
 
        line.icon.picture = good.icon
        line.material.caption = good:displayName(needed)
        line.required.caption = needed
        line.you.caption = have
 
        line.plus.visible = (ingredient.amount < ingredient.maximum)
        line.minus.visible = (ingredient.amount > ingredient.minimum)
 
        if have < needed then
            line.you.color = ColorRGB(1, 0, 0)
        else
            line.you.color = ColorRGB(1, 1, 1)
        end
    end
 
    if not tonumber(TurretFactory.UI.bulkTextBox.text) then TurretFactory.UI.bulkTextBox.text = "1" end
    if tonumber(TurretFactory.UI.bulkTextBox.text) > 1 then
        TurretFactory.UI.priceLabel.caption = "Bulk Cost: $${bulk_money} ($${money})"%_t % {bulk_money = createMonetaryString(price*round(tonumber(TurretFactory.UI.bulkTextBox.text))), money = createMonetaryString(price)}
    else
        TurretFactory.UI.priceLabel.caption = "Manufacturing Cost: $${money}"%_t % {money = createMonetaryString(price)}
    end
 
    for _, line in pairs(TurretFactory.UI.stat_lines) do
        line:hide()
    end
 
    TurretFactory.getUISeed()
    TurretFactory.current_turret = TurretFactory.makeTurret(TurretFactory.getUIWeapon(), TurretFactory.getUIRarity(), TurretFactory.getMaterial(), TurretFactory.getUIIngredients())
    TurretFactory.UI.turret_tooltip = makeTurretTooltip(TurretFactory.current_turret)
    TurretFactory.UI.turret_tooltip_lines = {TurretFactory.UI.turret_tooltip:getLines()}
    local skipped = 0
    for i, tooltip_line in pairs(TurretFactory.UI.turret_tooltip_lines) do
        local exclude = false
        for _, line in pairs(Config.ignore_tooltips) do
            if string.find(tooltip_line.ltext, line) then
                exclude = true
            end
        end
        if TurretFactory.tonumber(tooltip_line.rtext) == nil or exclude then
            skipped = skipped + 1
        else
            local line = TurretFactory.UI.stat_lines[i-skipped]
 
            line.stat.caption = tooltip_line.ltext
 
            line:show()
        end
    end
    local line = TurretFactory.UI.stat_lines[#TurretFactory.UI.turret_tooltip_lines-skipped+1]
    line.stat.caption = "Coaxial"
    line:show()
    --local line = TurretFactory.UI.stat_lines[#TurretFactory.UI.turret_tooltip_lines-skipped+2]
    --line.stat.caption = "Automatic"
    --line:show()
 
    if (TurretFactory.weighted_unsorted_Turret_List == nil or TurretFactory.weighted_unsorted_Turret_List == {}) and TurretFactory.max_seed then TurretFactory.quick_sort_Turrets() end
end
 
--UI Functions
function TurretFactory.renderUI() -- Overriding vanilla (not needed just cheaper)
    if type(TurretFactory.UI.turret_tooltip) == "userdata" then
        local renderer = TooltipRenderer(TurretFactory.UI.turret_tooltip)
        renderer:draw(vec2(window.upper.x, window.lower.y) + vec2(20, 10))
    end
end
 
function TurretFactory.getUISeed()
    TurretFactory.seed = tonumber(TurretFactory.UI.seed_text_box.text) or 0
    return TurretFactory.seed
end
 
function TurretFactory.bulkChanged()
    if not tonumber(TurretFactory.UI.bulkTextBox.text) then return end
    if tonumber(TurretFactory.UI.bulkTextBox.text) == 0 then TurretFactory.UI.bulkTextBox.text = "1" end
    TurretFactory.refreshUI()
end
 
function TurretFactory.onSeedTextBox(_, click)
    local stat_lines_memory = {}
    for _, stat_line in pairs(TurretFactory.UI.stat_lines) do
        local local_line = {}
        local_line.text = stat_line.text_box.text
        local_line.checked = stat_line.checkbox.checked
        stat_lines_memory[stat_line.stat.caption] = local_line
    end
    TurretFactory.onClear()
 
    TurretFactory.UI.seed_index = TurretFactory.UI.seed_index or 1
    TurretFactory.UI.seed_index = math.max(math.min(TurretFactory.UI.seed_index, #TurretFactory.weighted_unsorted_Turret_List),1)
    if (not TurretFactory.UI.seed_text_box.isTypingActive) or click then TurretFactory.UI.seed_text_box.text = TurretFactory.weighted_unsorted_Turret_List[TurretFactory.UI.seed_index].seed end
 
    TurretFactory.UI.middle_seed_label_top.caption = "Sum: " .. TurretFactory.weighted_unsorted_Turret_List[TurretFactory.UI.seed_index].sum
 
    if Config.seedsBuyable then
        if not TurretFactory.max_seed then TurretFactory.syncMaxSeed() end
        if tonumber(TurretFactory.UI.seed_text_box.text) then TurretFactory.UI.seed_text_box.text = math.max(math.min(tonumber(TurretFactory.UI.seed_text_box.text), TurretFactory.max_seed or 0),0) end
    end
 
    TurretFactory.refreshUI()
    for _, stat_line in pairs(TurretFactory.UI.stat_lines) do
        if stat_lines_memory[stat_line.stat.caption] then
            stat_line.text_box.text = stat_lines_memory[stat_line.stat.caption].text
            stat_line.checkbox.checked = stat_lines_memory[stat_line.stat.caption].checked
        end
    end
end
 
function TurretFactory.onSeedNext()
    TurretFactory.UI.seed_index = TurretFactory.UI.seed_index - 1
    TurretFactory.onSeedTextBox(nil, true)
end
 
function TurretFactory.onSeedPrev()
    TurretFactory.UI.seed_index = TurretFactory.UI.seed_index + 1
    TurretFactory.onSeedTextBox(nil, true)
end
 
function TurretFactory.onSearch()
    TurretFactory.quick_sort_Turrets()
    TurretFactory.onSeedTextBox(nil, true)
end
 
function TurretFactory.onClear()
    for _, stat_line in pairs(TurretFactory.UI.stat_lines) do
        stat_line.checkbox.checked = false
        stat_line.text_box.text = 0
    end
end
 
function TurretFactory.clearTurretList()
    TurretFactory.unsorted_Turret_List = {}
end
 
local onTurretTypeSelect_old = TurretFactory.onTurretTypeSelect
function TurretFactory.onTurretTypeSelect() -- vanilla
    TurretFactory.clearTurretList()
    TurretFactory.onClear()
    onTurretTypeSelect_old()
end
 
local onRaritySelect_old = TurretFactory.onRaritySelect
function TurretFactory.onRaritySelect() -- vanilla
    TurretFactory.clearTurretList()
    TurretFactory.onClear()
    onRaritySelect_old()
end
 
local onNext_old = TurretFactory.onNext
function TurretFactory.onNext() -- vanilla
    TurretFactory.clearTurretList()
    onNext_old()
end
 
local onPrev_old = TurretFactory.onPrev
function TurretFactory.onPrev() -- vanilla
    TurretFactory.clearTurretList()
    onPrev_old()
end
 
function TurretFactory.onMaxCheckBox()
    for _, ingredient in pairs(TurretFactory.getUIIngredients()) do
        if not (ingredient.name == "Targeting System") then
            if TurretFactory.UI.max_checkbox.checked then
                ingredient.amount = ingredient.maximum
            else
                ingredient.amount = ingredient.default
            end
        end
    end
    TurretFactory.clearTurretList()
    TurretFactory.refreshUI()
end
 
function TurretFactory.onHelp()
    if TurretFactory.UI.help_checkbox.checked then
        TurretFactory.UI.help_checkbox.tooltip  = "Enables help tooltips for everything. \n(that wants to have a tooltip)"
        TurretFactory.UI.bulkTextBox.tooltip    = "For crafting multiple turrets at once."
        TurretFactory.UI.max_checkbox.tooltip   = "Fills the ingredients \nwhen crafting/searching turrets."
        TurretFactory.UI.seed_text_box.tooltip  = "The current seed selected."
        TurretFactory.UI.clear_button.tooltip   = "Resets all the stats back to default in the above list."
        TurretFactory.UI.search_button.tooltip  = "Searches for turrets with the given traits."
        TurretFactory.UI.middle_seed_label_top.tooltip = "Current overall value of turret, higher is better. \nOnly updates on prev/next."
        for _, line in pairs(TurretFactory.UI.stat_lines) do
            line.checkbox.tooltip   = "Is this stat enabled in the search?"
            line.stat.tooltip       = "The name of the stat."
            line.text_box.tooltip   = "Used to filter out turrets that don't meet the required value. \nCheck help box for more info."
        end
        if Config.seedsBuyable then
            TurretFactory.UI.upgrade_button.tooltip = "Used to buy more seeds."
        else
            TurretFactory.UI.left_seed_text_box.tooltip = "Enter a starting seed to search for turrets between the range."
        end
    else
        TurretFactory.UI.help_checkbox.tooltip  = nil
        TurretFactory.UI.bulkTextBox.tooltip    = nil
        TurretFactory.UI.max_checkbox.tooltip   = nil
        TurretFactory.UI.seed_text_box.tooltip  = nil
        TurretFactory.UI.clear_button.tooltip   = nil
        TurretFactory.UI.search_button.tooltip  = nil
        TurretFactory.UI.middle_seed_label_top.tooltip = nil
        for _, line in pairs(TurretFactory.UI.stat_lines) do
            line.checkbox.tooltip   = nil
            line.stat.tooltip       = nil
            line.text_box.tooltip   = nil
        end
        if Config.seedsBuyable then
            TurretFactory.UI.upgrade_button.tooltip = nil
        else
            TurretFactory.UI.left_seed_text_box.tooltip = nil
        end
    end
end
 
function TurretFactory.onBuildButtonPressed()  -- Overriding vanilla
    invokeServerFunction("syncSeed", TurretFactory.getUISeed())
    invokeServerFunction("buildTurret", TurretFactory.getUIWeapon(), TurretFactory.getUIRarity(), TurretFactory.getMaterial(), TurretFactory.getUIIngredients())
end
 
function TurretFactory.onUpgrade()
    if onClient() then
        invokeServerFunction("onUpgrade")
        return
    end
 
    TurretFactory.max_seed = TurretFactory.max_seed or 0
 
    local buyer, ship, player = getInteractingFaction(callingPlayer, AlliancePrivilege.FoundStations)
    if not buyer then return end
 
    local price = (Config.upgradeBasePrice + (Config.upgradeBasePrice * 0.1 * TurretFactory.max_seed)) * Config.upgradeAmount
 
    local canPay, msg, args = buyer:canPay(price)
    if not canPay then
        sendError(player, msg, unpack(args))
        return
    end
 
    if TurretFactory.max_seed + Config.upgradeAmount > Config.max_buyable then return end
 
    TurretFactory.max_seed = TurretFactory.max_seed + Config.upgradeAmount
    buyer:pay(price)
 
    TurretFactory.syncMaxSeed()
end
callable(TurretFactory,"onUpgrade")
--UI Functions End
 
--Clientside Search Functions
function TurretFactory.find_Max_Values()
    for _, turret_obj in pairs(TurretFactory.unsorted_Turret_List) do
        for _, stat_line in pairs(TurretFactory.UI.stat_lines) do
            if TurretFactory.max_stats[stat_line.stat.caption] == nil then TurretFactory.max_stats[stat_line.stat.caption] = 0 end
            if turret_obj[stat_line.stat.caption] then
                if TurretFactory.max_stats[stat_line.stat.caption] < turret_obj[stat_line.stat.caption] then
                    TurretFactory.max_stats[stat_line.stat.caption] = turret_obj[stat_line.stat.caption]
                end
            end
        end
    end
end
 
function TurretFactory.split(str,sep)
    local sep, fields = sep or ":", {}
    local pattern = string.format("([^%s]+)", sep)
    str:gsub(pattern, function(c) fields[#fields+1] = c end)
    return fields
end
 
function TurretFactory.tonumber(str)
    if string.find(str,"x") then
        local array = TurretFactory.split(str,"x")
        if not tonumber(array[1]) then return nil end
        return tonumber(array[1])*tonumber(array[2])
    end
    return tonumber(string.match(str,"(%d*%.?%d+)"))
end
 
function TurretFactory.generate_Turret_Stat_Obj(seed)
    local turret_obj = {}
    TurretFactory.seed = seed
    local turret = TurretFactory.makeTurret(TurretFactory.getUIWeapon(), TurretFactory.getUIRarity(), TurretFactory.getMaterial(), TurretFactory.getUIIngredients())
    turret_obj.seed = seed
    turret_obj.Coaxial = turret.coaxial and 1 or 0
    --turret_obj.Automatic = turret.automatic and 1 or 0
    --TODO potentially add turningSpeed and damageMultiplier from turret
    local tooltip = makeTurretTooltip(turret)
    for _, tooltip_line in pairs({tooltip:getLines()}) do
        turret_obj[tooltip_line.ltext] = TurretFactory.tonumber(tooltip_line.rtext)
    end
    return turret_obj
end
 
function TurretFactory.generate_Turret_List()
 
    TurretFactory.unsorted_Turret_List = {}
    TurretFactory.weighted_unsorted_Turret_List = {}
    TurretFactory.max_stats = {}
    local oldseed = TurretFactory.seed
 
    if Config.seedsBuyable then
        if TurretFactory.max_seed == nil then
            TurretFactory.syncMaxSeed()
            deferredCallback(0.2, "generate_Turret_list")
            return
        end
 
        for i = 0, TurretFactory.max_seed do
            table.insert(TurretFactory.unsorted_Turret_List, TurretFactory.generate_Turret_Stat_Obj(i))
        end
    else
        local searchrange = tonumber(TurretFactory.UI.left_seed_text_box.text) or 0
        for i = searchrange, searchrange + Config.sample_size do
            table.insert(TurretFactory.unsorted_Turret_List, TurretFactory.generate_Turret_Stat_Obj(i))
        end
    end
 
    TurretFactory.find_Max_Values()
 
    for _, turret_obj in pairs(TurretFactory.unsorted_Turret_List) do -- weighting stats off max
        local weighted_obj = {}
        for stat, value in pairs(TurretFactory.max_stats) do
            if turret_obj[stat] then
                weighted_obj[stat] = turret_obj[stat]/value
            end
        end
        weighted_obj.seed = turret_obj.seed
        table.insert(TurretFactory.weighted_unsorted_Turret_List,weighted_obj)
    end
 
    TurretFactory.seed = oldseed
 
end
 
function TurretFactory.generate_Turret_Weighted_List()
    for _, turret_obj in pairs(TurretFactory.weighted_unsorted_Turret_List) do
        turret_obj.sum = 0
        for _, stat_line in pairs(TurretFactory.UI.stat_lines) do
            if turret_obj[stat_line.stat.caption] then
                if stat_line.checkbox.checked then
                    if string.find(stat_line.text_box.text,"!") then
                        turret_obj.sum = turret_obj.sum + -1*turret_obj[stat_line.stat.caption]
                    else
                        turret_obj.sum = turret_obj.sum + turret_obj[stat_line.stat.caption]
                    end
                end
                if stat_line.text_box.text == "" then stat_line.text_box.text = 0 end
                if turret_obj[stat_line.stat.caption]*TurretFactory.max_stats[stat_line.stat.caption] < TurretFactory.tonumber(stat_line.text_box.text) and not string.find(stat_line.text_box.text, "-") then
                    turret_obj.sum = turret_obj.sum-10
                elseif turret_obj[stat_line.stat.caption]*TurretFactory.max_stats[stat_line.stat.caption] > TurretFactory.tonumber(stat_line.text_box.text) and string.find(stat_line.text_box.text, "-") then
                    turret_obj.sum = turret_obj.sum-10
                end
            end
        end
    end
end
 
function TurretFactory.quickSort(array, p, r)
    p = p or 1
    r = r or #array
    if p < r then
        q = TurretFactory.partition(array, p, r)
        TurretFactory.quickSort(array, p, q - 1)
        TurretFactory.quickSort(array, q + 1, r)
    end
end
 
function TurretFactory.partition(array, p, r)
    local x = array[r].sum
    local i = p - 1
    for j = p, r - 1 do
        if array[j].sum <= x then
            i = i + 1
            local temp = array[i]
            array[i] = array[j]
            array[j] = temp
        end
    end
    local temp = array[i + 1]
    array[i + 1] = array[r]
    array[r] = temp
    return i + 1
end
 
function TurretFactory.quick_sort_Turrets()
    if #TurretFactory.unsorted_Turret_List == 0 then TurretFactory.generate_Turret_List() end
    TurretFactory.generate_Turret_Weighted_List()
    TurretFactory.quickSort(TurretFactory.weighted_unsorted_Turret_List,1, #TurretFactory.weighted_unsorted_Turret_List)
    TurretFactory.UI.seed_index = #TurretFactory.weighted_unsorted_Turret_List
end
--Clientside Search Functions end
 
function TurretFactory.syncSeed(seed)
    if Config.seedsBuyable then
        seed = math.max(math.min(seed, TurretFactory.max_seed or 0),0)
    end
    TurretFactory.seed = seed
end
callable(TurretFactory, "syncSeed")
 
function TurretFactory.syncMaxSeed(max_seed)
 
    if onClient() then
 
        TurretFactory.clearTurretList()
 
        if not max_seed then
            return invokeServerFunction("syncMaxSeed")
        end
 
        TurretFactory.UI.left_seed_label_bottom.caption = "Currently Unlocked: " .. max_seed
        TurretFactory.max_seed = max_seed
        TurretFactory.refreshUI()
        return
 
    end
 
    invokeClientFunction(Player(callingPlayer),"syncMaxSeed",TurretFactory.max_seed or 0)
 
end
callable(TurretFactory, "syncMaxSeed")
 
function TurretFactory.makeTurretBase(weaponType, rarity, material) -- Overriding vanilla
    local station = Entity()
    local x, y = Sector():getCoordinates()
 
    if onClient() and (TurretFactory.seed == nil) then TurretFactory.getUISeed() end
 
    local seed = station.index.number + 123 + x + y * 300 + TurretFactory.seed
 
    TurretGenerator.initialize(Seed(seed))
    local turret = TurretGenerator.generate(x, y, 0, rarity, weaponType, material)
 
    -- automatic turrets must get automatic property removed and damage rebuffed
    -- we don't want the base turrets to have independent targeting since that can mess up the rest of the stats calculation, especially for damage
    if turret.automatic then
        turret.automatic = false
 
        local weapons = {turret:getWeapons()}
        turret:clearWeapons()
 
        for _, weapon in pairs(weapons) do
            weapon.damage = weapon.damage * 2.0
            if weapon.hullRepair > 0.0 then
                weapon.hullRepair = weapon.hullRepair * 2.0
            end
            if weapon.shieldRepair > 0.0 then
                weapon.shieldRepair = weapon.shieldRepair * 2.0
            end
 
            turret:addWeapon(weapon)
        end
    end
 
    return turret
end

Comments