v50 Steam/Premium information for editors
- v50 information can now be added to pages in the main namespace. v0.47 information can still be found in the DF2014 namespace. See here for more details on the new versioning policy.
- Use this page to report any issues related to the migration.
This notice may be cached—the current version can be found here.
User:Fleeting Frames/order takeout
Jump to navigation
Jump to search
Save as order_takeout.lua into /hack/scripts folder, run with order_takeout when diplomat gives you "menu" on what to order. Each run adds 1, rolls over to 0. Add "verbose" as an argument to print receipt.
--Finds foods somebody wants to eat when diplomat is taking orders and bumps their priority.
local args = {...}
--AutomagicTables from lua wiki by ThomasWrensch and RiciLake, copied wholesale
do
local auto, assign
function auto(tab, key)
return setmetatable({}, {
__index = auto,
__newindex = assign,
parent = tab,
key = key
})
end
local meta = {__index = auto}
-- The if statement below prevents the table from being
-- created if the value assigned is nil. This is, I think,
-- technically correct but it might be desirable to use
-- assignment to nil to force a table into existence.
function assign(tab, key, val)
if val ~= nil then
local oldmt = getmetatable(tab)
oldmt.parent[oldmt.key] = tab
setmetatable(tab, meta)
tab[key] = val
end
end
function AutomagicTable()
return setmetatable({}, meta)
end
end
function removeMagic(automagictable)
setmetatable(automagictable,nil)
for i,t in pairs(automagictable) do
if type(t)=="table" then removeMagic(t) end
end
end
function order_takeout ()
local scr = dfhack.gui.getCurViewscreen()
if scr._type ~= df.viewscreen_topicmeeting_takerequestsst then
dfhack.error ("This script must be run when the trade order screen is open")
end
local preferences = {}
local entity_resources = df.global.world.entities.all[scr.meeting.civ_id].resources
--[=[
.misc_mat
.meat
.mat_type
.mat_index
.extracts
-"-
.powders
-"-
.cheese
-"-
.booze
-"-
.fish_races --equal to mat_type, mat_index must be -1 to be importable (normally mat_index is race ans mat_type is sub-material)
.fish_castes
.egg_races
.seeds --mat_type varies
.plants --plants
.mat_type = 419 always
.mat_index = variable
.shrub_fruit_plants --garden vegetables mat_index
.shrub_fruit_growths --420+nr = mat_type
--]=]
local entity_resources_table = AutomagicTable()
local function add_resources(category,resource, mat_index_ovr)
if not category or not resource then qerror("wut") end
for index, mat_type in pairs(mat_index_ovr and resource or resource.mat_type) do
entity_resources_table[mat_type][mat_index_ovr or resource.mat_index[index]] = function() return category, index end
end
end
local valid_categories={
"Meat",
"Fish",
"Plants",
"FruitsNuts",--absent on humans
"GardenVegetables",
"Drinks",
"Cheese",
"Extracts",
"Powders",
"Fish",
"Eggs",
"Seeds"
}
add_resources("Meat", entity_resources.misc_mat.meat)
add_resources("Extracts", entity_resources.misc_mat.extracts)
add_resources("Powders", entity_resources.misc_mat.powders)
add_resources("Cheese", entity_resources.misc_mat.cheese)
add_resources("Drinks", entity_resources.misc_mat.booze)
add_resources("Fish", entity_resources.fish_races, -1)
--add_resources("Eggs", entity_resources.egg_races, ??) --egg mat_index = race, mat_type = only eggshell counts?? - 0/1500 dwarves want to eat egg anyway
add_resources("Seeds", entity_resources.seeds)
add_resources("Plants", entity_resources.plants)
for index, mat_index in pairs(entity_resources.shrub_fruit_plants) do
entity_resources_table[entity_resources.shrub_fruit_growths[index]+420][mat_index] = function() return "GardenVegetables", index end
end
for i, unit in ipairs (df.global.world.units.all) do
if dfhack.units.isCitizen (unit) and
dfhack.units.isAlive (unit) and
unit.status.current_soul then
for k, preference in ipairs (unit.status.current_soul.preferences) do
if preference.active then
if preference.type == df.unit_preference.T_type.LikeFood then
if preferences[preference.mattype] then
preferences[preference.mattype][preference.matindex] = true
else
preferences[preference.mattype]= {[preference.matindex] = true}
end
end
end
end
end
end
local function order(category,index)
scr.meeting.sell_requests.priority[category][index] = (scr.meeting.sell_requests.priority[category][index] + 1) % 4
end
removeMagic(entity_resources_table)
for mat_type, indextable in pairs(preferences) do
for mat_index, _ in pairs(indextable) do
if entity_resources_table[mat_type] and entity_resources_table[mat_type][mat_index] then
if args[1] == "verbose" then print(entity_resources_table[mat_type][mat_index]()) end
order(entity_resources_table[mat_type][mat_index]())
end
end
end
end
order_takeout ()