Resolvers
To add resolvers, first open up load.lua and put this near the top of the file:
-- Additional entities resolvers
dofile("/mod/resolvers.lua")
Next create a file called resolvers.lua
A generic resolver takes the form:
--- Generic resolver, takes a function and executes it
function resolvers.name(fct)
return {__resolver="genericlast", __resolve_last=true, fct}
end
function resolvers.calc.genericlast(t, e)
<function goes here>
end
The resolver takes it's argument and gives it to the resolver calc as t.
One thing resolvers can be used for is added objects to an actor. We have added objects and created an inventory. Now we can add objects at birth ucing resolvers.
Equipments Resolver
Open resolvers.lua and add the following code:
--- Resolves equipment creation for an actor
function resolvers.equip(t)
return {__resolver="equip", __resolve_last=true, t}
end
--- Actually resolve the equipment creation
function resolvers.calc.equip(t, e)
print("Equipment resolver for", e.name)
-- Iterate of object requests, try to create them and equip them
for i, filter in ipairs(t[1]) do
print("Equipment resolver", e.name, filter.type, filter.subtype)
local o
if not filter.defined then
o = game.zone:makeEntity(game.level, "object", filter, nil, true)
else
o = game.zone:makeEntityByName(game.level, "object", filter.defined)
end
if o then
print("Zone made us an equipment according to filter!", o:getName())
-- Auto alloc some stats to be able to wear it
if filter.autoreq and rawget(o, "require") and rawget(o, "require").stat then
print("Autorequire stats")
for s, v in pairs(rawget(o, "require").stat) do
print(s,v)
if e:getStat(s) < v then
e.unused_stats = e.unused_stats - (v - e:getStat(s))
e:incStat(s, v - e:getStat(s))
end
end
end
e:wearObject(o, true, false)
-- Do not drop it unless it is an ego or better
if not o.egoed and not o.unique then o.no_drop = true end
if filter.force_drop then o.no_drop = nil end
game.zone:addEntity(game.level, o, "object")
end
end
-- Delete the origin field
return nil
end
This will allow us to add objects to an Actor at birth. Let's say we want to add the battle axe we made to one of our descriptors. Add the follow code to copy in one of the descriptors:
resolvers.equip{ {type="weapon", subtype="battleaxe", name="iron battleaxe", autoreq=true, },
Inventory Resolver
Thats all well and good, but what if we wanted to add an object to the inventory at birth. Simple, add the following code to resolvers.lua:
--- Resolves inventory creation for an actor
function resolvers.inventory(t)
return {__resolver="inventory", __resolve_last=true, t}
end
--- Actually resolve the inventory creation
function resolvers.calc.inventory(t, e)
-- Iterate of object requests, try to create them and equip them
for i, filter in ipairs(t[1]) do
print("Inventory resolver", e.name, filter.type, filter.subtype)
local o
if not filter.defined then
o = game.zone:makeEntity(game.level, "object", filter, nil, true)
else
o = game.zone:makeEntityByName(game.level, "object", filter.defined)
end
if o then
print("Zone made us an inventory according to filter!", o:getName())
e:addObject(e.INVEN_INVEN, o)
game.zone:addEntity(game.level, o, "object")
end
end
e:sortInven()
-- Delete the origin field
return nil
end
We can then add objects to the inventory. The following code will add three battle axes to the inventory.
resolvers.inventory{ id=true,
{type = "weapon", subtype = "battleaxe", name = "iron battle axe"},
{type = "weapon", subtype = "battleaxe", name = "iron battle axe"},
{type = "weapon", subtype = "battleaxe", name = "iron battle axe"},
},
Drop Resolver
If we want enemies to drop objects on death, we can add the following to resolvers.lua
--- Resolves drops creation for an actor
function resolvers.drops(t)
return {__resolver="drops", __resolve_last=true, t}
end
--- Actually resolve the drops creation
function resolvers.calc.drops(t, e)
t = t[1]
if not rng.percent(t.chance or 100) then return nil end
-- Iterate of object requests, try to create them and drops them
for i = 1, (t.nb or 1) do
local filter = t[rng.range(1, #t)]
print("Drops resolver", e.name, filter.type, filter.subtype, filter.defined)
local o
if not filter.defined then
o = game.zone:makeEntity(game.level, "object", filter, nil, true)
else
o = game.zone:makeEntityByName(game.level, "object", filter.defined)
end
if o then
print("Zone made us an drop according to filter!", o:getName())
e:addObject(e.INVEN_INVEN, o)
game.zone:addEntity(game.level, o, "object")
end
end
-- Delete the origin field
return nil
end