@@ -55,26 +55,12 @@ function weightedChoice(choices)
5555 return nil -- never reached on well-formed input
5656end
5757
58- --- create a new linked job
59- --- @return df.job
60- function make_job ()
61- local job = df .job :new ()
62- dfhack .job .linkIntoWorld (job , true )
63- return job
64- end
65-
66- function assignToWorkshop (job , workshop )
67- job .pos = xyz2pos (workshop .centerx , workshop .centery , workshop .z )
68- dfhack .job .addGeneralRef (job , df .general_ref_type .BUILDING_HOLDER , workshop .id )
69- workshop .jobs :insert (" #" , job )
70- end
71-
7258--- make totem at specified workshop
7359--- @param unit df.unit
7460--- @param workshop df.building_workshopst
7561--- @return boolean
7662function makeTotem (unit , workshop )
77- local job = make_job ()
63+ local job = dfhack . job . createLinked ()
7864 job .job_type = df .job_type .MakeTotem
7965 job .mat_type = - 1
8066
@@ -89,7 +75,7 @@ function makeTotem(unit, workshop)
8975 jitem .flags2 .body_part = true
9076 job .job_items .elements :insert (' #' , jitem )
9177
92- assignToWorkshop (job , workshop )
78+ dfhack . job . assignToWorkshop (job , workshop )
9379 return dfhack .job .addWorker (job , unit )
9480end
9581
9884--- @param workshop df.building_workshopst
9985--- @return boolean
10086function makeHornCrafts (unit , workshop )
101- local job = make_job ()
87+ local job = dfhack . job . createLinked ()
10288 job .job_type = df .job_type .MakeCrafts
10389 job .mat_type = - 1
10490 job .material_category .horn = true
@@ -114,7 +100,7 @@ function makeHornCrafts(unit, workshop)
114100 jitem .flags2 .body_part = true
115101 job .job_items .elements :insert (' #' , jitem )
116102
117- assignToWorkshop (job , workshop )
103+ dfhack . job . assignToWorkshop (job , workshop )
118104 return dfhack .job .addWorker (job , unit )
119105end
120106
123109--- @param workshop df.building_workshopst
124110--- @return boolean
125111function makeBoneCraft (unit , workshop )
126- local job = make_job ()
112+ local job = dfhack . job . createLinked ()
127113 job .job_type = df .job_type .MakeCrafts
128114 job .mat_type = - 1
129115 job .material_category .bone = true
@@ -139,7 +125,7 @@ function makeBoneCraft(unit, workshop)
139125 jitem .flags2 .body_part = true
140126 job .job_items .elements :insert (' #' , jitem )
141127
142- assignToWorkshop (job , workshop )
128+ dfhack . job . assignToWorkshop (job , workshop )
143129 return dfhack .job .addWorker (job , unit )
144130end
145131
148134--- @param workshop df.building_workshopst
149135--- @return boolean
150136function makeShellCraft (unit , workshop )
151- local job = make_job ()
137+ local job = dfhack . job . createLinked ()
152138 job .job_type = df .job_type .MakeCrafts
153139 job .mat_type = - 1
154140 job .material_category .shell = true
@@ -164,7 +150,7 @@ function makeShellCraft(unit, workshop)
164150 jitem .flags2 .body_part = true
165151 job .job_items .elements :insert (' #' , jitem )
166152
167- assignToWorkshop (job , workshop )
153+ dfhack . job . assignToWorkshop (job , workshop )
168154 return dfhack .job .addWorker (job , unit )
169155end
170156
173159--- @param workshop df.building_workshopst
174160--- @return boolean " "
175161function makeRockCraft (unit , workshop )
176- local job = make_job ()
162+ local job = dfhack . job . createLinked ()
177163 job .job_type = df .job_type .MakeCrafts
178164 job .mat_type = 0
179165
@@ -187,7 +173,7 @@ function makeRockCraft(unit, workshop)
187173 jitem .flags3 .hard = true
188174 job .job_items .elements :insert (' #' , jitem )
189175
190- assignToWorkshop (job , workshop )
176+ dfhack . job . assignToWorkshop (job , workshop )
191177 return dfhack .job .addWorker (job , unit )
192178end
193179
@@ -291,13 +277,8 @@ local STONE_CRAFT = df.unit_labor['STONE_CRAFT']
291277--- @param value_if_absent T
292278--- @return number | T
293279function getCraftingNeed (unit , value_if_absent )
294- local needs = unit .status .current_soul .personality .needs
295- for _ , need in ipairs (needs ) do
296- if need .id == CraftObject then
297- return - need .focus_level
298- end
299- end
300- return value_if_absent
280+ local focus_penalty = dfhack .units .getFocusPenalty (unit , CraftObject )
281+ return focus_penalty > 1000 and value_if_absent or - focus_penalty
301282end
302283
303284local function stop ()
@@ -334,27 +315,6 @@ function canAccessWorkshop(unit, workshop)
334315 return dfhack .maps .canWalkBetween (unit .pos , workshop_position )
335316end
336317
337- --- unit is ready to take jobs
338- --- @param unit df.unit
339- --- @return boolean
340- function unitIsAvailable (unit )
341- if unit .job .current_job then
342- return false
343- elseif # unit .specific_refs > 0 then -- activities such as "Conduct Meeting"
344- return false
345- elseif # unit .social_activities > 0 then
346- return false
347- elseif # unit .individual_drills > 0 then
348- return false
349- elseif unit .military .squad_id ~= - 1 then
350- local squad = df .squad .find (unit .military .squad_id )
351- -- this lookup should never fail
352- --- @diagnostic disable-next-line : need-check-nil
353- return # squad .orders == 0 and squad .activity == - 1
354- end
355- return true
356- end
357-
358318--- select crafting job based on available resources
359319--- @param workshop df.building_workshopst
360320--- @return (fun ( unit : df.unit , workshop : df.building_workshopst ): boolean )?
@@ -397,7 +357,7 @@ local function processUnit(workshop, idx, unit_id)
397357 elseif not canAccessWorkshop (unit , workshop ) then
398358 -- dfhack.print('-')
399359 return false
400- elseif not unitIsAvailable (unit ) then
360+ elseif not dfhack . units . isJobAvailable (unit ) then
401361 -- dfhack.print('.')
402362 return false
403363 end
0 commit comments