t4modules-resolvers

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