researchstation.lua (AutoResearch)
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