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