Advfort improvements

* forbid doing anything in non-sites unless you are (-c)heating
* a bit more documentation and tidying
* add a deadlock fix
develop
Warmist 2015-09-09 22:14:06 +03:00
parent 6643b43d2b
commit 72b7a19425
1 changed files with 89 additions and 38 deletions

@ -1,8 +1,12 @@
-- allows to do jobs in adv. mode.
--[==[
version: 0.021
version: 0.03
changelog:
*0.03
- forbid doing anything in non-sites unless you are (-c)heating
- a bit more documentation and tidying
- add a deadlock fix
*0.021
- advfort_items now autofills items
- tried out few things to fix gather plants
@ -39,6 +43,7 @@
- burning charcoal crashed game
- gem thingies probably broken
- custom reactions semibroken
- gathering plants still broken
--]==]
@ -66,6 +71,7 @@ build_filter.HUMANish={
forbid={}
}
--economic stone fix: just disable all of them
--[[ FIXME: maybe let player select which to disable?]]
for k,v in ipairs(df.global.ui.economic_stone) do df.global.ui.economic_stone[k]=0 end
@ -116,14 +122,16 @@ for k,v in ipairs({...}) do --setting parsing
if v=="-c" or v=="--cheat" then
settings.build_by_items=true
settings.df_assign=false
settings.cheat=true
elseif v=="-i" or v=="--inventory" then
settings.check_inv=true
settings.df_assign=false
elseif v=="-a" or v=="--nodfassign" then
settings.df_assign=false
elseif v=="-h" or v=="--help" then
settings.help=true
else
mode_name=v
end
end
@ -158,6 +166,12 @@ function showHelp()
Disclaimer(helptext)
dialog.showMessage("Help!?!",helptext)
end
if settings.help then
showHelp()
return
end
--[[ Util functions ]]--
function advGlobalPos()
local map=df.global.world.map
@ -785,10 +799,10 @@ function find_suitable_items(job,items,job_items)
end
end
end
return item_suitability,item_counts
end
function AssignJobItems(args)
--print("----")
if settings.df_assign then --use df default logic and hope that it would work
return true
end
@ -802,8 +816,6 @@ function AssignJobItems(args)
job.items:erase(#job.items-1)
end]]
if settings.gui_item_select and #job.job_items>0 then
local item_dialog=require('hack.scripts.gui.advfort_items')
local ret=item_dialog.showItemEditor(job,item_suitability)
@ -829,8 +841,6 @@ function AssignJobItems(args)
return true
end
end
CheckAndFinishBuilding=function (args,bld)
@ -903,6 +913,7 @@ function ContinueJob(unit)
--unit.path.dest:assign(c_job.pos) -- FIXME: job pos is not always the target pos!!
addJobAction(c_job,unit)
end
--TODO: in far far future maybe add real linking?
-- function assign_link_refs(args )
-- local job=args.job
-- --job.general_refs:insert("#",{new=df.general_ref_building_holderst,building_id=args.building.id})
@ -924,7 +935,7 @@ function fake_linking(lever,building,slots)
qerror("failed to move item to building")
end
if not dfhack.items.moveToBuilding(item2,building,2) then
qerror("failed to move item2 to building")
qerror("failed to move item2 to building")
end
item2.general_refs:insert("#",{new=df.general_ref_building_triggerst,building_id=lever.id})
item1.general_refs:insert("#",{new=df.general_ref_building_triggertargetst,building_id=building.id})
@ -976,10 +987,6 @@ function LinkBuilding(args)
mat_type = -1,
mat_index = -1,
flags1 = {},
-- Instead of noting those that allow artifacts, mark those that forbid them.
-- Leaves actually enabling artifacts to the discretion of the API user,
-- which is the right thing because unlike the game UI these filters are
-- used in a way that does not give the user a chance to choose manually.
flags2 = { allow_artifact = true },
flags3 = {},
flags4 = 0,
@ -1003,7 +1010,7 @@ function LinkBuilding(args)
--genref for triggertarget
end
--[[ Plant gathering attemped fix No. 35]]
--[[ Plant gathering attemped fix No. 35]] --[=[ still did not work!]=]
function get_design_block_ev(blk)
for i,v in ipairs(blk.block_events) do
if v:getType()==df.block_square_event_type.designation_priority then
@ -1073,6 +1080,22 @@ function usetool:getModeName()
end
function usetool:update_site()
local site=inSite()
self.current_site=site
local site_label=self.subviews.siteLabel
if site then
site_label:itemById("site").text=dfhack.TranslateName(site.name)
else
if settings.cheat then
site_label:itemById("site").text="<none, changes will not persist>"
else
site_label:itemById("site").text="<none, advfort disabled>"
end
end
end
function usetool:init(args)
self:addviews{
wid.Label{
@ -1094,7 +1117,6 @@ function usetool:init(args)
wid.Label{
view_id="siteLabel",
frame = {t=1,xalign=-1,yalign=0},
visible=false,
text={
{id="text1", text="Site:"},{id="site", text="name"}
}
@ -1104,6 +1126,7 @@ function usetool:init(args)
for i,v in ipairs(labors) do
labors[i]=true
end
self:update_site()
end
MOVEMENT_KEYS = {
A_CARE_MOVE_N = { 0, -1, 0 }, A_CARE_MOVE_S = { 0, 1, 0 },
@ -1216,9 +1239,7 @@ function usetool:onWorkShopButtonClicked(building,index,choice)
local adv=df.global.world.units.active[0]
local args={unit=adv,building=building}
if df.interface_button_building_new_jobst:is_instance(choice.button) then
print("pre-click")
choice.button:click()
print("post-click",#building.jobs)
if #building.jobs>0 then
local job=building.jobs[#building.jobs-1]
args.job=job
@ -1484,6 +1505,13 @@ function usetool:setupFields()
ui.site_id=site.id
end
end
function usetool:siteCheck()
if self.site ~= nil or settings.cheat then --TODO: add check if it's correct site (the persistant ones)
return true
end
return false, "You are not on site"
end
--movement and co... Also passes on allowed keys
function usetool:fieldInput(keys)
local adv=df.global.world.units.active[0]
local cur_mode=actions[(mode or 0)+1]
@ -1491,9 +1519,18 @@ function usetool:fieldInput(keys)
for code,_ in pairs(keys) do
--print(code)
if MOVEMENT_KEYS[code] then
local state={unit=adv,pos=moddedpos(adv.pos,MOVEMENT_KEYS[code]),dir=MOVEMENT_KEYS[code],
from_pos={x=adv.pos.x,y=adv.pos.y, z=adv.pos.z},post_actions=cur_mode[4],pre_actions=cur_mode[5],job_type=cur_mode[2],screen=self}
if code=="SELECT" then
local state={
unit=adv,
pos=moddedpos(adv.pos,MOVEMENT_KEYS[code]),
dir=MOVEMENT_KEYS[code],
from_pos={x=adv.pos.x,y=adv.pos.y, z=adv.pos.z},
post_actions=cur_mode[4],
pre_actions=cur_mode[5],
job_type=cur_mode[2],
screen=self}
if code=="SELECT" then --do job in the distance, TODO: check if you can still cheat-mine (and co.) remotely
if df.global.cursor.x~=-30000 then
state.pos={x=df.global.cursor.x,y=df.global.cursor.y,z=df.global.cursor.z}
else
@ -1501,11 +1538,18 @@ function usetool:fieldInput(keys)
end
end
for _,p in pairs(cur_mode[3] or {}) do
local ok,msg=p(state)
if ok==false then
dfhack.gui.showAnnouncement(msg,5,1)
failed=true
--First check site
local ok,msg=self:siteCheck() --TODO: some jobs might be possible without a site?
if not ok then
dfhack.gui.showAnnouncement(msg,5,1)
failed=true
else
for _,p in pairs(cur_mode[3] or {}) do --then check predicates
local ok,msg=p(state)
if not ok then
dfhack.gui.showAnnouncement(msg,5,1)
failed=true
end
end
end
@ -1534,23 +1578,25 @@ function usetool:fieldInput(keys)
end
end
function usetool:onInput(keys)
self:update_site()
local adv=df.global.world.units.active[0]
if keys.LEAVESCREEN then
if df.global.cursor.x~=-30000 then
self:sendInputToParent("LEAVESCREEN")
if df.global.cursor.x~=-30000 then --if not poiting at anything
self:sendInputToParent("LEAVESCREEN") --leave poiting
else
self:dismiss()
self:dismiss() --leave the adv-tools all together
CancelJob(adv)
end
elseif keys[keybinds.nextJob.key] then
elseif keys[keybinds.nextJob.key] then --next job with looping
mode=(mode+1)%#actions
elseif keys[keybinds.prevJob.key] then
elseif keys[keybinds.prevJob.key] then --prev job with looping
mode=mode-1
if mode<0 then mode=#actions-1 end
--elseif keys.A_LOOK then
-- self:sendInputToParent("A_LOOK")
elseif keys["A_SHORT_WAIT"] then
--ContinueJob(adv)
self:sendInputToParent("A_SHORT_WAIT")
@ -1568,14 +1614,7 @@ function usetool:onInput(keys)
self:fieldInput(keys)
end
end
local site=inSite()
if site then
self.subviews.siteLabel.visible=true
self.subviews.siteLabel:itemById("site").text=dfhack.TranslateName(site.name)
else
self.subviews.siteLabel.visible=false
end
end
function usetool:onIdle()
@ -1583,7 +1622,19 @@ function usetool:onIdle()
local job_ptr=adv.job.current_job
local job_action=findAction(adv,df.unit_action_type.Job)
if self.long_wait and self.long_wait_timer==nil then
self.long_wait_timer=1000 --TODO tweak this
end
if job_ptr and self.long_wait and not job_action then
if self.long_wait_timer<=0 then --fix deadlocks with force-canceling of waiting
self.long_wait_timer=nil
self.long_wait=false
else
self.long_wait_timer=self.long_wait_timer-1
end
if adv.job.current_job.completion_timer==-1 then
self.long_wait=false
end