researchstation.lua (AutoResearch)

Created Diff never expires
9 removals
575 lines
43 additions
609 lines


package.path = package.path .. ";data/scripts/entity/merchants/?.lua;"
package.path = package.path .. ";data/scripts/entity/merchants/?.lua;"
package.path = package.path .. ";data/scripts/lib/?.lua;"
package.path = package.path .. ";data/scripts/lib/?.lua;"


require ("galaxy")
require ("galaxy")
require ("utility")
require ("utility")
require ("faction")
require ("faction")
require ("player")
require ("player")
require ("randomext")
require ("randomext")
require ("stringutility")
require ("stringutility")
require ("autoresearch")
local SellableInventoryItem = require ("sellableinventoryitem")
local SellableInventoryItem = require ("sellableinventoryitem")
local TurretGenerator = require ("turretgenerator")
local TurretGenerator = require ("turretgenerator")
local Dialog = require("dialogutility")
local Dialog = require("dialogutility")


local button
local button


function initialize()
function initialize()
if onClient() and EntityIcon().icon == "" then
if onClient() and EntityIcon().icon == "" then
EntityIcon().icon = "data/textures/icons/pixel/research.png"
EntityIcon().icon = "data/textures/icons/pixel/research.png"
InteractionText().text = Dialog.generateStationInteractionText(Entity(), random())
InteractionText().text = Dialog.generateStationInteractionText(Entity(), random())
end
end
end
end


function interactionPossible(playerIndex, option)
function interactionPossible(playerIndex, option)
return CheckFactionInteraction(playerIndex, -25000)
return CheckFactionInteraction(playerIndex, -25000)
end
end


function initUI()
function initUI()


local res = getResolution()
local res = getResolution()
local size = vec2(800, 600)
local size = vec2(800, 600)


local menu = ScriptUI()
local menu = ScriptUI()
local window = menu:createWindow(Rect(res * 0.5 - size * 0.5, res * 0.5 + size * 0.5))
local window = menu:createWindow(Rect(res * 0.5 - size * 0.5, res * 0.5 + size * 0.5))


window.caption = "Research /* station title */"%_t
window.caption = "Research /* station title */"%_t
window.showCloseButton = 1
window.showCloseButton = 1
window.moveable = 1
window.moveable = 1
menu:registerWindow(window, "Research"%_t);
menu:registerWindow(window, "Research"%_t);


local hsplit = UIHorizontalSplitter(Rect(window.size), 10, 10, 0.4)
local hsplit = UIHorizontalSplitter(Rect(window.size), 10, 10, 0.4)


inventory = window:createInventorySelection(hsplit.bottom, 11)
inventory = window:createInventorySelection(hsplit.bottom, 11)


local vsplit = UIVerticalSplitter(hsplit.top, 10, 10, 0.4)
local vsplit = UIVerticalSplitter(hsplit.top, 10, 10, 0.4)


local hsplitleft = UIHorizontalSplitter(vsplit.left, 10, 10, 0.5)
local hsplitleft = UIHorizontalSplitter(vsplit.left, 10, 10, 0.5)


hsplitleft.padding = 6
hsplitleft.padding = 6
local rect = hsplitleft.top
local rect = hsplitleft.top
rect.width = 220
rect.width = 220
required = window:createSelection(rect, 3)
required = window:createSelection(rect, 3)


local rect = hsplitleft.bottom
local rect = hsplitleft.bottom
rect.width = 150
rect.width = 150
optional = window:createSelection(rect, 2)
optional = window:createSelection(rect, 2)


for _, sel in pairs({required, optional}) do
for _, sel in pairs({required, optional}) do
sel.dropIntoEnabled = 1
sel.dropIntoEnabled = 1
sel.entriesSelectable = 0
sel.entriesSelectable = 0
sel.onReceivedFunction = "onRequiredReceived"
sel.onReceivedFunction = "onRequiredReceived"
sel.onDroppedFunction = "onRequiredDropped"
sel.onDroppedFunction = "onRequiredDropped"
sel.onClickedFunction = "onRequiredClicked"
sel.onClickedFunction = "onRequiredClicked"
end
end


inventory.dragFromEnabled = 1
inventory.dragFromEnabled = 1
inventory.onClickedFunction = "onInventoryClicked"
inventory.onClickedFunction = "onInventoryClicked"




vsplit.padding = 30
vsplit.padding = 30
local rect = vsplit.right
local rect = vsplit.right
rect.width = 70
rect.width = 70
rect.height = 70
rect.height = 70
results = window:createSelection(rect, 1)
results = window:createSelection(rect, 1)
results.entriesSelectable = 0
results.entriesSelectable = 0
results.dropIntoEnabled = 0
results.dropIntoEnabled = 0
results.dragFromEnabled = 0
results.dragFromEnabled = 0


vsplit.padding = 10
vsplit.padding = 10
local organizer = UIOrganizer(vsplit.right)
local organizer = UIOrganizer(vsplit.right)
organizer.marginBottom = 5
organizer.marginBottom = 5


button = window:createButton(Rect(), "Research"%_t, "onClickResearch")
button = window:createButton(Rect(), "Research"%_t, "onClickResearch")
button.width = 200
button.width = 200
button.height = 40
button.height = 40
organizer:placeElementBottom(button)
organizer:placeElementBottom(button)
editUI(hsplit, button, window)


end
end


function removeItemFromMainSelection(key)
function removeItemFromMainSelection(key)
local item = inventory:getItem(key)
local item = inventory:getItem(key)
if not item then return end
if not item then return end


if item.amount then
if item.amount then
item.amount = item.amount - 1
item.amount = item.amount - 1
if item.amount == 0 then item.amount = nil end
if item.amount == 0 then item.amount = nil end
end
end


inventory:remove(key)
inventory:remove(key)


if item.amount then
if item.amount then
inventory:add(item, key)
inventory:add(item, key)
end
end


end
end


function addItemToMainSelection(item)
function addItemToMainSelection(item)
if not item then return end
if not item then return end


if item.item.stackable then
if item.item.stackable then
-- find the item and increase the amount
-- find the item and increase the amount
for k, v in pairs(inventory:getItems()) do
for k, v in pairs(inventory:getItems()) do
if v.item == item.item then
if v.item == item.item then
v.amount = v.amount + 1
v.amount = v.amount + 1


inventory:remove(k)
inventory:remove(k)
inventory:add(v, k)
inventory:add(v, k)
return
return
end
end
end
end


item.amount = 1
item.amount = 1
end
end


-- when not found or not stackable, add it
-- when not found or not stackable, add it
inventory:add(item)
inventory:add(item)


end
end


function moveItem(item, from, to, fkey, tkey)
function moveItem(item, from, to, fkey, tkey)
if not item then return end
if not item then return end


if from.index == inventory.index then -- move from inventory to a selection
if from.index == inventory.index then -- move from inventory to a selection
-- first, move the item that might be in place back to the inventory
-- first, move the item that might be in place back to the inventory
if tkey then
if tkey then
addItemToMainSelection(to:getItem(tkey))
addItemToMainSelection(to:getItem(tkey))
to:remove(tkey)
to:remove(tkey)
end
end


removeItemFromMainSelection(fkey)
removeItemFromMainSelection(fkey)


-- fix item amount, we don't want numbers in the upper selections
-- fix item amount, we don't want numbers in the upper selections
item.amount = nil
item.amount = nil
to:add(item, tkey)
to:add(item, tkey)


elseif to.index == inventory.index then
elseif to.index == inventory.index then
-- move from selection to inventory
-- move from selection to inventory
addItemToMainSelection(item)
addItemToMainSelection(item)
from:remove(fkey)
from:remove(fkey)
end
end
end
end


function onRequiredReceived(selectionIndex, fkx, fky, item, fromIndex, toIndex, tkx, tky)
function onRequiredReceived(selectionIndex, fkx, fky, item, fromIndex, toIndex, tkx, tky)
if not item then return end
if not item then return end


-- don't allow dragging from/into the left hand selections
-- don't allow dragging from/into the left hand selections
if fromIndex == optional.index or fromIndex == required.index then
if fromIndex == optional.index or fromIndex == required.index then
return
return
end
end


moveItem(item, inventory, Selection(selectionIndex), ivec2(fkx, fky), ivec2(tkx, tky))
moveItem(item, inventory, Selection(selectionIndex), ivec2(fkx, fky), ivec2(tkx, tky))


refreshButton()
refreshButton()
results:clear()
results:clear()
results:addEmpty()
results:addEmpty()
end
end


function onRequiredClicked(selectionIndex, fkx, fky, item, button)
function onRequiredClicked(selectionIndex, fkx, fky, item, button)
if button == 3 or button == 2 then
if button == 3 or button == 2 then
moveItem(item, Selection(selectionIndex), inventory, ivec2(fkx, fky), nil)
moveItem(item, Selection(selectionIndex), inventory, ivec2(fkx, fky), nil)
refreshButton()
refreshButton()
end
end
end
end


function onRequiredDropped(selectionIndex, kx, ky)
function onRequiredDropped(selectionIndex, kx, ky)
local selection = Selection(selectionIndex)
local selection = Selection(selectionIndex)
local key = ivec2(kx, ky)
local key = ivec2(kx, ky)
moveItem(selection:getItem(key), Selection(selectionIndex), inventory, key, nil)
moveItem(selection:getItem(key), Selection(selectionIndex), inventory, key, nil)
refreshButton()
refreshButton()
end
end


function onInventoryClicked(selectionIndex, kx, ky, item, button)
function onInventoryClicked(selectionIndex, kx, ky, item, button)


if button == 2 or button == 3 then
if button == 2 or button == 3 then
-- fill required first, then, once it's full, fill optional
-- fill required first, then, once it's full, fill optional
local items = required:getItems()
local items = required:getItems()
if tablelength(items) < 3 then
if tablelength(items) < 3 then
moveItem(item, inventory, required, ivec2(kx, ky), nil)
moveItem(item, inventory, required, ivec2(kx, ky), nil)


refreshButton()
refreshButton()
results:clear()
results:clear()
results:addEmpty()
results:addEmpty()
return
return
end
end


local items = optional:getItems()
local items = optional:getItems()
if tablelength(items) < 2 then
if tablelength(items) < 2 then
moveItem(item, inventory, optional, ivec2(kx, ky), nil)
moveItem(item, inventory, optional, ivec2(kx, ky), nil)


refreshButton()
refreshButton()
results:clear()
results:clear()
results:addEmpty()
results:addEmpty()
return
return
end
end
end
end
end
end


function refreshButton()
function refreshButton()
local items = required:getItems()
local items = required:getItems()
button.active = (tablelength(items) == 3)
button.active = (tablelength(items) == 3)


if tablelength(items) ~= 3 then
if tablelength(items) ~= 3 then
button.tooltip = "Place at least 3 items for research!"%_t
button.tooltip = "Place at least 3 items for research!"%_t
else
else
button.tooltip = "Transform into a new item"%_t
button.tooltip = "Transform into a new item"%_t
end
end


for _, items in pairs({items, optional:getItems()}) do
for _, items in pairs({items, optional:getItems()}) do
for _, item in pairs(items) do
for _, item in pairs(items) do
if item.item.itemType ~= InventoryItemType.TurretTemplate
if item.item.itemType ~= InventoryItemType.TurretTemplate
and item.item.itemType ~= InventoryItemType.SystemUpgrade
and item.item.itemType ~= InventoryItemType.SystemUpgrade
and item.item.itemType ~= InventoryItemType.Turret then
and item.item.itemType ~= InventoryItemType.Turret then


button.active = false
button.active = false
button.tooltip = "Invalid items in ingredients."%_t
button.tooltip = "Invalid items in ingredients."%_t
end
end
end
end
end
end


end
end


function onShowWindow()
function onShowWindow()


inventory:clear()
inventory:clear()
required:clear()
required:clear()
optional:clear()
optional:clear()


required:addEmpty()
required:addEmpty()
required:addEmpty()
required:addEmpty()
required:addEmpty()
required:addEmpty()


optional:addEmpty()
optional:addEmpty()
optional:addEmpty()
optional:addEmpty()


results:addEmpty()
results:addEmpty()


refreshButton()
refreshButton()


for i = 1, 50 do
for i = 1, 50 do
inventory:addEmpty()
inventory:addEmpty()
end
end


local items = {}
local player = Player()
local player = Player()
local ship = player.craft
local ship = player.craft
local alliance = player.alliance
local alliance = player.alliance


if alliance and ship.factionIndex == player.allianceIndex then
if alliance and ship.factionIndex == player.allianceIndex then
inventory:fill(alliance.index)
inventory:fill(alliance.index)
else
else
inventory:fill(player.index)
inventory:fill(player.index)
end
end
for index, slot in pairs(Player():getInventory():getItems()) do
local item = SellableInventoryItem(slot.item, index, player)
table.insert(items, item)
end

table.sort(items, SortSellableInventoryItems)

for i, p in pairs(items) do
local item = InventorySelectionItem()
item.item = p.item
item.uvalue = p.index -- use the uvalue uservalue to store the index of the item in the inventory

-- show numbers for stackable items
if p.item.stackable then
item.amount = p.amount
else
item.amount = nil
end

inventory:add(item)
end
if cbAutoResearch.checked then
button.active = true
end


end
end


function checkRarities(items) -- items must not be more than 1 rarity apart
function checkRarities(items) -- items must not be more than 1 rarity apart
local min = math.huge
local min = math.huge
local max = -math.huge
local max = -math.huge


for _, item in pairs(items) do
for _, item in pairs(items) do
if item.rarity.value < min then min = item.rarity.value end
if item.rarity.value < min then min = item.rarity.value end
if item.rarity.value > max then max = item.rarity.value end
if item.rarity.value > max then max = item.rarity.value end
end
end


if max - min <= 1 then
if max - min <= 1 then
return true
return true
end
end


return false
return false
end
end


function getRarityProbabilities(items)
function getRarityProbabilities(items)


local probabilities = {}
local probabilities = {}


-- for each item there is a 20% chance that the researched item has a rarity 1 better
-- for each item there is a 20% chance that the researched item has a rarity 1 better
for _, item in pairs(items) do
for _, item in pairs(items) do
-- next rarity cannot exceed legendary
-- next rarity cannot exceed legendary
local nextRarity = math.min(RarityType.Legendary, item.rarity.value + 1)
local nextRarity = math.min(RarityType.Legendary, item.rarity.value + 1)


local p = probabilities[nextRarity] or 0
local p = probabilities[nextRarity] or 0
p = p + 0.2
p = p + 0.2
probabilities[nextRarity] = p
probabilities[nextRarity] = p
end
end


-- if the amount of items is < 5 then add their own rarities as a result as well
-- if the amount of items is < 5 then add their own rarities as a result as well
if #items < 5 then
if #items < 5 then
local left = (1.0 - #items * 0.2)
local left = (1.0 - #items * 0.2)
local perItem = left / #items
local perItem = left / #items


for _, item in pairs(items) do
for _, item in pairs(items) do
local p = probabilities[item.rarity.value] or 0
local p = probabilities[item.rarity.value] or 0
p = p + perItem
p = p + perItem
probabilities[item.rarity.value] = p
probabilities[item.rarity.value] = p
end
end
end
end


local sum = 0
local sum = 0
for _, p in pairs(probabilities) do
for _, p in pairs(probabilities) do
sum = sum + p
sum = sum + p
end
end


return probabilities
return probabilities
end
end


function getTypeProbabilities(items)
function getTypeProbabilities(items)
local probabilities = {}
local probabilities = {}


for _, item in pairs(items) do
for _, item in pairs(items) do
local p = probabilities[item.itemType] or 0
local p = probabilities[item.itemType] or 0
p = p + 1
p = p + 1
probabilities[item.itemType] = p
probabilities[item.itemType] = p
end
end


return probabilities
return probabilities
end
end


-- since there are no more exact weapon types in the finished weapons,
-- since there are no more exact weapon types in the finished weapons,
-- we have to gather the weapon types by their stats, such as icons
-- we have to gather the weapon types by their stats, such as icons
function getWeaponTypesByIcon()
function getWeaponTypesByIcon()
if weaponTypes then return weaponTypes end
if weaponTypes then return weaponTypes end
weaponTypes = {}
weaponTypes = {}


local weapons = Balancing_GetWeaponProbability(0, 0)
local weapons = Balancing_GetWeaponProbability(0, 0)


for weaponType, _ in pairs(weapons) do
for weaponType, _ in pairs(weapons) do
local turret = GenerateTurretTemplate(Seed(1), weaponType, 15, 5, Rarity(RarityType.Common), Material(MaterialType.Iron))
local turret = GenerateTurretTemplate(Seed(1), weaponType, 15, 5, Rarity(RarityType.Common), Material(MaterialType.Iron))
weaponTypes[turret.weaponIcon] = weaponType
weaponTypes[turret.weaponIcon] = weaponType
end
end


return weaponTypes
return weaponTypes
end
end


function getWeaponProbabilities(items)
function getWeaponProbabilities(items)
local probabilities = {}
local probabilities = {}
local typesByIcons = getWeaponTypesByIcon()
local typesByIcons = getWeaponTypesByIcon()


for _, item in pairs(items) do
for _, item in pairs(items) do
if item.itemType == InventoryItemType.Turret
if item.itemType == InventoryItemType.Turret
or item.itemType == InventoryItemType.TurretTemplate then
or item.itemType == InventoryItemType.TurretTemplate then


local weaponType = typesByIcons[item.weaponIcon]
local weaponType = typesByIcons[item.weaponIcon]
local p = probabilities[weaponType] or 0
local p = probabilities[weaponType] or 0
p = p + 1
p = p + 1
probabilities[weaponType] = p
probabilities[weaponType] = p
end
end
end
end


return probabilities
return probabilities
end
end


function getWeaponMaterials(items)
function getWeaponMaterials(items)
local probabilities = {}
local probabilities = {}


for _, item in pairs(items) do
for _, item in pairs(items) do
if item.itemType == InventoryItemType.Turret
if item.itemType == InventoryItemType.Turret
or item.itemType == InventoryItemType.TurretTemplate then
or item.itemType == InventoryItemType.TurretTemplate then


local p = probabilities[item.material.value] or 0
local p = probabilities[item.material.value] or 0
p = p + 1
p = p + 1
probabilities[item.material.value] = p
probabilities[item.material.value] = p
end
end
end
end


return probabilities
return probabilities
end
end


function getAutoFires(items)
function getAutoFires(items)
local probabilities = {}
local probabilities = {}


for _, item in pairs(items) do
for _, item in pairs(items) do
if item.itemType == InventoryItemType.Turret
if item.itemType == InventoryItemType.Turret
or item.itemType == InventoryItemType.TurretTemplate then
or item.itemType == InventoryItemType.TurretTemplate then


local p = probabilities[item.automatic] or 0
local p = probabilities[item.automatic] or 0
p = p + 1
p = p + 1
probabilities[item.automatic] = p
probabilities[item.automatic] = p
end
end
end
end


return probabilities
return probabilities
end
end


function getSystemProbabilities(items)
function getSystemProbabilities(items)
local probabilities = {}
local probabilities = {}


for _, item in pairs(items) do
for _, item in pairs(items) do
if item.itemType == InventoryItemType.SystemUpgrade then
if item.itemType == InventoryItemType.SystemUpgrade then
local p = probabilities[item.script] or 0
local p = probabilities[item.script] or 0
p = p + 1
p = p + 1
probabilities[item.script] = p
probabilities[item.script] = p
end
end
end
end


return probabilities
return probabilities
end
end










function onClickResearch()
function onClickResearch()


local items = {}
local items = {}
local itemIndices = {}
local itemIndices = {}


for _, item in pairs(required:getItems()) do
for _, item in pairs(required:getItems()) do
table.insert(items, item.item)
table.insert(items, item.item)


local amount = itemIndices[item.index] or 0
local amount = itemIndices[item.uvalue] or 0
amount = amount + 1
amount = amount
itemIndices[item.index] = amount
itemIndices[item.uvalue] = amount
end
end
for _, item in pairs(optional:getItems()) do
for _, item in pairs(optional:getItems()) do
table.insert(items, item.item)
table.insert(items, item.item)


local amount = itemIndices[item.index] or 0
local amount = itemIndices[item.uvalue] or 0
amount = amount + 1
amount = amount
itemIndices[item.index] = amount
itemIndices[item.uvalue] = amount
end
end


if not checkRarities(items) then
if not checkRarities(items) then
displayChatMessage("Your items cannot be more than one rarity apart!"%_t, Entity().title, 1)
displayChatMessage("Your items cannot be more than one rarity apart!"%_t, Entity().title, 1)
return
return
end
end


invokeServerFunction("research", itemIndices)
invokeServerFunction("research", itemIndices)
end
end


function research(itemIndices)
function research(itemIndices)


local buyer, ship, player = getInteractingFaction(callingPlayer, AlliancePrivilege.SpendResources)
local buyer, ship, player = getInteractingFaction(callingPlayer, AlliancePrivilege.SpendResources)
if not buyer then return end
if not buyer then return end


-- check if the player has enough of the items
-- check if the player has enough of the items
local items = {}
local items = {}


for index, amount in pairs(itemIndices) do
for index, amount in pairs(itemIndices) do
local item = buyer:getInventory():find(index)
local item = buyer:getInventory():find(index)
local has = buyer:getInventory():amount(index)
local has = buyer:getInventory():amount(index)


if not item or has < amount then
if not item or has < amount then
player:sendChatMessage(Entity().title, 1, "You dont have enough items!"%_t)
player:sendChatMessage(Entity().title, 1, "You dont have enough items!"%_t)
return
return
end
end


for i = 1, amount do
for i = 1, amount do
table.insert(items, item)
table.insert(items, item)
end
end
end
end


if #items < 3 then
if #items < 3 then
player:sendChatMessage(Entity().title, 1, "You need at least 3 items to do research!"%_t)
player:sendChatMessage(Entity().title, 1, "You need at least 3 items to do research!"%_t)
return
return
end
end


if not checkRarities(items) then
if not checkRarities(items) then
player:sendChatMessage(Entity().title, 1, "Your items cannot be more than one rarity apart!"%_t)
player:sendChatMessage(Entity().title, 1, "Your items cannot be more than one rarity apart!"%_t)
return
return
end
end


local station = Entity()
local station = Entity()


local errors = {}
local errors = {}
errors[EntityType.Station] = "You must be docked to the station to research items."%_T
errors[EntityType.Station] = "You must be docked to the station to research items."%_T
errors[EntityType.Ship] = "You must be closer to the ship to research items."%_T
errors[EntityType.Ship] = "You must be closer to the ship to research items."%_T
if not CheckPlayerDocked(player, station, errors) then
if not CheckPlayerDocked(player, station, errors) then
return
return
end
end


local result = transform(items)
local result = transform(items)


if result then
if result then
for index, amount in pairs(itemIndices) do
for index, amount in pairs(itemIndices) do
for i = 1, amount do
for i = 1, amount do
buyer:getInventory():take(index)
buyer:getInventory():take(index)
end
end
end
end


buyer:getInventory():add(result)
buyer:getInventory():add(result)


invokeClientFunction(player, "receiveResult", result)
invokeClientFunction(player, "receiveResult", result)
else
else
print ("no result")
print ("no result")
end
end




end
end


function receiveResult(result)
function receiveResult(result)
receivedResult()
results:clear();
results:clear();


local item = InventorySelectionItem()
local item = InventorySelectionItem()
item.item = result
item.item = result


results:add(item)
results:add(item)
onShowWindow()
if not cbAutoResearch.checked then
onShowWindow()
end
end
end


function transform(items)
function transform(items)


local transformToKey
local transformToKey


if items[1].itemType == InventoryItemType.SystemUpgrade
if items[1].itemType == InventoryItemType.SystemUpgrade
and items[2].itemType == InventoryItemType.SystemUpgrade
and items[2].itemType == InventoryItemType.SystemUpgrade
and items[3].itemType == InventoryItemType.SystemUpgrade
and items[3].itemType == InventoryItemType.SystemUpgrade
and items[1].rarity.value == RarityType.Legendary
and items[1].rarity.value == RarityType.Legendary
and items[2].rarity.value == RarityType.Legendary
and items[2].rarity.value == RarityType.Legendary
and items[3].rarity.value == RarityType.Legendary then
and items[3].rarity.value == RarityType.Legendary then


local inputKeys = 0
local inputKeys = 0
for _, item in pairs(items) do
for _, item in pairs(items) do
if string.match(item.script, "systems/teleporterkey") then
if string.match(item.script, "systems/teleporterkey") then
inputKeys = inputKeys + 1
inputKeys = inputKeys + 1
end
end
end
end


if inputKeys <= 1 then
if inputKeys <= 1 then
transformToKey = true
transformToKey = true
end
end
end
end


local result
local result


if transformToKey then
if transformToKey then
result = SystemUpgradeTemplate("data/scripts/systems/teleporterkey2.lua", Rarity(RarityType.Legendary), random():createSeed())
result = SystemUpgradeTemplate("data/scripts/systems/teleporterkey2.lua", Rarity(RarityType.Legendary), random():createSeed())
else
else
local rarities = getRarityProbabilities(items)
local rarities = getRarityProbabilities(items)
local types = getTypeProbabilities(items, "type")
local types = getTypeProbabilities(items, "type")


local itemType = selectByWeight(random(), types)
local itemType = selectByWeight(random(), types)
local rarity = Rarity(selectByWeight(random(), rarities))
local rarity = Rarity(selectByWeight(random(), rarities))




if itemType == InventoryItemType.Turret
if itemType == InventoryItemType.Turret
or itemType == InventoryItemType.TurretTemplate then
or itemType == InventoryItemType.TurretTemplate then


local weaponTypes = getWeaponProbabilities(items)
local weaponTypes = getWeaponProbabilities(items)
local materials = getWeaponMaterials(items)
local materials = getWeaponMaterials(items)
local autoFires = getAutoFires(items)
local autoFires = getAutoFires(items)


local weaponType = selectByWeight(random(), weaponTypes)
local weaponType = selectByWeight(random(), weaponTypes)
local material = Material(selectByWeight(random(), materials))
local material = Material(selectByWeight(random(), materials))
local autoFire = selectByWeight(random(), autoFires)
local autoFire = selectByWeight(random(), autoFires)


local x, y = Sector():getCoordinates()
local x, y = Sector():getCoordinates()
result = TurretGenerator.generate(x, y, -5, rarity, weaponType, material)
result = TurretGenerator.generate(x, y, -5, rarity, weaponType, material)


if itemType == InventoryItemType.Turret then
if itemType == InventoryItemType.Turret then
result = InventoryTurret(result)
result = InventoryTurret(result)
end
end


result.automatic = autoFire or false
result.automatic = autoFire or false


elseif itemType == InventoryItemType.SystemUpgrade then
elseif itemType == InventoryItemType.SystemUpgrade then
local scripts = getSystemProbabilities(items)
local scripts = getSystemProbabilities(items)


local script = selectByWeight(random(), scripts)
local script = selectByWeight(random(), scripts)


result = SystemUpgradeTemplate(script, rarity, random():createSeed())
result = SystemUpgradeTemplate(script, rarity, random():createSeed())
end
end
end
end


return result
return result
end
end