206 lines
5.3 KiB
Lua
206 lines
5.3 KiB
Lua
--- Technology
|
|
-- @classmod Technology
|
|
|
|
local Technology = {
|
|
_class = 'technology'
|
|
}
|
|
setmetatable(Technology, {__index = require('stdlib/data/data')})
|
|
|
|
local Is = require('stdlib/utils/is')
|
|
|
|
function Technology:_get(tech)
|
|
return self:get(tech, 'technology')
|
|
end
|
|
Technology:set_caller(Technology._get)
|
|
|
|
--[[
|
|
type = "technology",
|
|
name = "military",
|
|
icon = "__base__/graphics/technology/military.png",
|
|
effects =
|
|
{
|
|
{
|
|
type = "unlock-recipe",
|
|
recipe = "submachine-gun"
|
|
},
|
|
{
|
|
type = "unlock-recipe",
|
|
recipe = "shotgun"
|
|
},
|
|
{
|
|
type = "unlock-recipe",
|
|
recipe = "shotgun-shell"
|
|
}
|
|
},
|
|
unit =
|
|
{
|
|
count = 10,
|
|
ingredients = {{"science-pack-1", 1}},
|
|
time = 15
|
|
},
|
|
order = "e-a-a"
|
|
|
|
--]]
|
|
-- local function create_technology_prototype(name)
|
|
-- local new = {
|
|
-- type = type,
|
|
-- name = name,
|
|
-- }
|
|
-- data:extend{new}
|
|
-- return true
|
|
-- end
|
|
|
|
function Technology:add_effect(effect, unlock_type)
|
|
Is.Assert(effect)
|
|
|
|
--todo fix for non recipe types
|
|
local add_unlock =
|
|
function(technology, name)
|
|
local effects = technology.effects
|
|
effects[#effects + 1] = {
|
|
type = unlock_type,
|
|
recipe = name
|
|
}
|
|
end
|
|
|
|
if self:valid('technology') then
|
|
local Recipe = require('stdlib/data/recipe')
|
|
unlock_type = (not unlock_type and 'unlock-recipe') or unlock_type
|
|
local r_name = type(effect) == 'table' and effect.name or effect
|
|
if unlock_type == 'unlock-recipe' or not unlock_type then
|
|
if Recipe(effect):valid() then
|
|
add_unlock(self, r_name)
|
|
end
|
|
end
|
|
elseif self:valid('recipe') then
|
|
unlock_type = 'unlock-recipe'
|
|
-- Convert to array and return first valid tech
|
|
local techs = type(effect) == 'string' and {effect} or effect
|
|
for _, name in pairs(techs) do
|
|
local tech = Technology(name)
|
|
if tech:valid('technology') then
|
|
self:set_enabled(false)
|
|
add_unlock(tech, self.name)
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
return self
|
|
end
|
|
|
|
function Technology:remove_effect(tech_name, unlock_type, name)
|
|
if self:valid('technology') then
|
|
return self, name, unlock_type -- TODO finish
|
|
elseif self:valid('recipe') then
|
|
if tech_name then
|
|
local tech = Technology(tech_name)
|
|
if tech:valid() then
|
|
for index, effect in pairs(tech.effects or {}) do
|
|
if effect.type == 'unlock-recipe' and effect.recipe == self.name then
|
|
table.remove(tech.effects, index)
|
|
end
|
|
end
|
|
end
|
|
else
|
|
for _, tech in pairs(data.raw['technology']) do
|
|
for index, effect in pairs(tech.effects or {}) do
|
|
if effect.type == 'unlock-recipe' and effect.recipe == self.name then
|
|
table.remove(tech.effects, index)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
return self
|
|
end
|
|
|
|
function Technology:add_pack(new_pack, count)
|
|
if self:valid('technology') then
|
|
local Item = require('stdlib/data/item')
|
|
if self.table(new_pack) then
|
|
count = new_pack[2] or 1
|
|
new_pack = new_pack[1]
|
|
elseif self.string(new_pack) then
|
|
count = count or 1
|
|
else
|
|
error('new_pack must be a table or string')
|
|
end
|
|
|
|
if Item(new_pack):valid() then
|
|
self.unit.ingredients = self.unit.ingredients or {}
|
|
local ing = self.unit.ingredients
|
|
ing[#ing + 1] = {new_pack, count}
|
|
end
|
|
end
|
|
return self
|
|
end
|
|
|
|
function Technology:remove_pack(pack)
|
|
if self:valid('technology') then
|
|
local ing = self.unit.ingredients
|
|
if ing then
|
|
for i = #ing, 1, -1 do
|
|
if ing[i][1] == pack then
|
|
ing[i] = nil
|
|
break
|
|
end
|
|
end
|
|
end
|
|
end
|
|
return self
|
|
end
|
|
|
|
function Technology:replace_pack(old_pack, new_pack, count)
|
|
if self:valid('technology') then
|
|
local ing = self.unit.ingredients
|
|
if ing then
|
|
for i = #ing, 1, -1 do
|
|
if ing[i][1] == old_pack then
|
|
ing[i][1] = new_pack
|
|
ing[i][2] = count or ing[i][2] or 1
|
|
break
|
|
end
|
|
end
|
|
end
|
|
end
|
|
return self
|
|
end
|
|
|
|
function Technology:add_prereq(tech_name)
|
|
if self:valid('technology') and Technology(tech_name):valid() then
|
|
self.prerequisites = self.prerequisites or {}
|
|
local pre = self.prerequisites
|
|
for _, existing in pairs(pre) do
|
|
if existing == tech_name then
|
|
return self
|
|
end
|
|
end
|
|
|
|
pre[#pre + 1] = tech_name
|
|
end
|
|
return self
|
|
end
|
|
|
|
function Technology:remove_prereq(tech_name)
|
|
if self:valid('technology') then
|
|
local pre = self.prerequisites or {}
|
|
for i = #pre, 1, -1 do
|
|
if pre[i] == tech_name then
|
|
table.remove(pre, i)
|
|
end
|
|
end
|
|
if #pre == 0 then
|
|
self.prerequisites = nil
|
|
end
|
|
end
|
|
return self
|
|
end
|
|
|
|
Technology._mt = {
|
|
__index = Technology,
|
|
__call = Technology._get
|
|
}
|
|
|
|
return Technology
|