Skip to content
Snippets Groups Projects

Removable egos

Merged Alex Ksandra requested to merge 0player/t-engine4:dynamic_egos into master
+ 182
137
Compare changes
  • Side-by-side
  • Inline
Files
@@ -467,6 +467,76 @@ local pick_ego = function(self, level, e, eegos, egos_list, type, picked_etype,
if egos_list[#egos_list] then print("Picked ego", type.."/"..eegos..":"..etype, ":=>", egos_list[#egos_list].name) else print("Picked ego", type.."/"..eegos..":"..etype, ":=>", #egos_list) end
end
-- Applies a single ego to a (pre-resolved) entity
-- May be in need to resolve afterwards
function _M:applyEgo(e, ego, type, no_name_change)
if not e.__original then e.__original = e:clone() end
print("ego", ego.__CLASSNAME, ego.name, getmetatable(ego))
local orig_ego = ego
ego = ego:clone()
local newname = e.name
if not no_name_change then
if ego.prefix then newname = ego.name .. e.name
else newname = e.name .. ego.name end
end
print("applying ego", ego.name, "to ", e.name, "::", newname, "///", e.unided_name, ego.unided_name)
ego.unided_name = nil
ego.__CLASSNAME = nil
ego.__ATOMIC = nil
-- The ego requested instant resolving before merge ?
if ego.instant_resolve then ego:resolve(nil, nil, e) end
if ego.instant_resolve == "last" then ego:resolve(nil, true, e) end
ego.instant_resolve = nil
-- Void the uid, we dont want to erase the base entity's one
ego.uid = nil
ego.rarity = nil
ego.level_range = nil
-- Merge according to Object's ego rules.
table.ruleMergeAppendAdd(e, ego, self.ego_rules[type] or {})
e.name = newname
e.egoed = true
e.ego_list = e.ego_list or {}
e.ego_list[#e.ego_list + 1] = {orig_ego, type, no_name_change}
end
local function reapplyEgos(e)
if not e.__original then return e end
local brandNew = e.__original -- it will be cloned upon first ego application
if e.ego_list and #e.ego_list > 0 then
for _, ego_args in ipairs(e.ego_list) do
self:applyEgo(brandNew, unpack(ego_args))
end
end
e:replaceWith(brandNew)
end
-- Remove an ego
function _M:removeEgo(e, ego)
local idx = nil
for i, v in ipairs(e.ego_list or {}) do
if v[1] == ego then
idx = i
end
end
if not idx then return end
table.remove(e.ego_list, idx)
reapplyEgos(e)
return ego
end
function _M:getEgoByName(e, ego_name)
for i, v in ipairs(e.ego_list or {}) do
if v[1].name == ego_name then return v[1] end
end
end
function _M:removeEgoByName(e, ego_name)
for i, v in ipairs(e.ego_list or {}) do
if v[1].name == ego_name then return self:removeEgo(e, v[1]) end
end
end
--- Finishes generating an entity
function _M:finishEntity(level, type, e, ego_filter)
e = e:clone()
@@ -480,25 +550,7 @@ function _M:finishEntity(level, type, e, ego_filter)
if #egos_list > 0 then
for ie, ego in ipairs(egos_list) do
print("addon", ego.__CLASSNAME, ego.name, getmetatable(ego))
ego = ego:clone()
local newname
if ego.prefix then newname = ego.name .. e.name
else newname = e.name .. ego.name end
print("applying addon", ego.name, "to ", e.name, "::", newname, "///", e.unided_name, ego.unided_name)
ego.unided_name = nil
ego.__CLASSNAME = nil
ego.__ATOMIC = nil
-- The ego requested instant resolving before merge ?
if ego.instant_resolve then ego:resolve(nil, nil, e) end
if ego.instant_resolve == "last" then ego:resolve(nil, true, e) end
ego.instant_resolve = nil
-- Void the uid, we dont want to erase the base entity's one
ego.uid = nil
-- Merge according to Object's ego rules.
table.ruleMergeAppendAdd(e, ego, self.ego_rules[type] or {})
e.name = newname
e.egoed = true
self:applyEgo(e, ego, type)
end
-- Re-resolve with the (possibly) new resolvers
e:resolve()
@@ -570,25 +622,7 @@ function _M:finishEntity(level, type, e, ego_filter)
if #egos_list > 0 then
for ie, ego in ipairs(egos_list) do
print("ego", ego.__CLASSNAME, ego.name, getmetatable(ego))
ego = ego:clone()
local newname
if ego.prefix then newname = ego.name .. e.name
else newname = e.name .. ego.name end
print("applying ego", ego.name, "to ", e.name, "::", newname, "///", e.unided_name, ego.unided_name)
ego.unided_name = nil
ego.__CLASSNAME = nil
ego.__ATOMIC = nil
-- The ego requested instant resolving before merge ?
if ego.instant_resolve then ego:resolve(nil, nil, e) end
if ego.instant_resolve == "last" then ego:resolve(nil, true, e) end
ego.instant_resolve = nil
-- Void the uid, we dont want to erase the base entity's one
ego.uid = nil
-- Merge according to Object's ego rules.
table.ruleMergeAppendAdd(e, ego, self.ego_rules[type] or {})
e.name = newname
e.egoed = true
self:applyEgo(e, ego, type)
end
-- Re-resolve with the (possibly) new resolvers
e:resolve()
Loading