Skip to content

Commit b436cc5

Browse files
committed
finish porting timestream business logic
1 parent 19438b4 commit b436cc5

2 files changed

Lines changed: 278 additions & 172 deletions

File tree

plugins/lua/timestream.lua

Lines changed: 0 additions & 166 deletions
Original file line numberDiff line numberDiff line change
@@ -10,172 +10,6 @@ function migrate_old_config()
1010
end
1111
end
1212

13-
--[[
14-
15-
------------------------------------
16-
-- business logic
17-
18-
local function increment_counter(obj, counter_name, timeskip)
19-
if obj[counter_name] <= 0 then return end
20-
obj[counter_name] = obj[counter_name] + timeskip
21-
end
22-
23-
local function decrement_counter(obj, counter_name, timeskip)
24-
if obj[counter_name] <= 0 then return end
25-
obj[counter_name] = math.max(1, obj[counter_name] - timeskip)
26-
end
27-
28-
local function adjust_unit_counters(unit, timeskip)
29-
local c1 = unit.counters
30-
decrement_counter(c1, 'think_counter', timeskip)
31-
decrement_counter(c1, 'job_counter', timeskip)
32-
decrement_counter(c1, 'swap_counter', timeskip)
33-
decrement_counter(c1, 'winded', timeskip)
34-
decrement_counter(c1, 'stunned', timeskip)
35-
decrement_counter(c1, 'unconscious', timeskip)
36-
decrement_counter(c1, 'suffocation', timeskip)
37-
decrement_counter(c1, 'webbed', timeskip)
38-
decrement_counter(c1, 'soldier_mood_countdown', timeskip)
39-
decrement_counter(c1, 'pain', timeskip)
40-
decrement_counter(c1, 'nausea', timeskip)
41-
decrement_counter(c1, 'dizziness', timeskip)
42-
local c2 = unit.counters2
43-
decrement_counter(c2, 'paralysis', timeskip)
44-
decrement_counter(c2, 'numbness', timeskip)
45-
decrement_counter(c2, 'fever', timeskip)
46-
decrement_counter(c2, 'exhaustion', timeskip * 3)
47-
increment_counter(c2, 'hunger_timer', timeskip)
48-
increment_counter(c2, 'thirst_timer', timeskip)
49-
local job = unit.job.current_job
50-
if job and job.job_type == df.job_type.Rest then
51-
decrement_counter(c2, 'sleepiness_timer', timeskip * 200)
52-
elseif job and job.job_type == df.job_type.Sleep then
53-
decrement_counter(c2, 'sleepiness_timer', timeskip * 19)
54-
else
55-
increment_counter(c2, 'sleepiness_timer', timeskip)
56-
end
57-
decrement_counter(c2, 'stomach_content', timeskip * 5)
58-
decrement_counter(c2, 'stomach_food', timeskip * 5)
59-
decrement_counter(c2, 'vomit_timeout', timeskip)
60-
-- stored_fat wanders about based on other state; we can likely leave it alone and
61-
-- not materially affect gameplay
62-
end
63-
64-
-- need to manually adjust job completion_timer values for jobs that are controlled by unit actions
65-
-- with a timer of 1, which are destroyed immediately after they are created. longer-lived unit
66-
-- actions are already sufficiently handled by dfhack.units.subtractGroupActionTimers().
67-
-- this will also decrement timers for jobs with actions that have just expired, but on average, this
68-
-- should balance out to be correct, since we're losing time when we subtract from the action timers
69-
-- and cap the value so it never drops below 1.
70-
local function adjust_job_counter(unit, timeskip)
71-
local job = unit.job.current_job
72-
if not job then return end
73-
for _,action in ipairs(unit.actions) do
74-
if action.type == df.unit_action_type.Job or action.type == df.unit_action_type.JobRecover then
75-
return
76-
end
77-
end
78-
decrement_counter(job, 'completion_timer', timeskip)
79-
end
80-
81-
-- unit needs appear to be incremented on season ticks, so we don't need to worry about those
82-
-- since the TICK_TRIGGERS check makes sure that we never skip season ticks
83-
local function adjust_units(timeskip)
84-
for _, unit in ipairs(df.global.world.units.active) do
85-
if not dfhack.units.isActive(unit) then goto continue end
86-
decrement_counter(unit, 'pregnancy_timer', timeskip)
87-
dfhack.units.subtractGroupActionTimers(unit, timeskip, df.unit_action_type_group.All)
88-
if not dfhack.units.isOwnGroup(unit) then goto continue end
89-
adjust_unit_counters(unit, timeskip)
90-
adjust_job_counter(unit, timeskip)
91-
::continue::
92-
end
93-
end
94-
95-
-- behavior ascertained from in-game observation
96-
local function adjust_activities(timeskip)
97-
for i, act in ipairs(df.global.world.activities.all) do
98-
for _, ev in ipairs(act.events) do
99-
if df.activity_event_training_sessionst:is_instance(ev) then
100-
-- no counters
101-
elseif df.activity_event_combat_trainingst:is_instance(ev) then
102-
-- has organize_counter at a non-zero value, but it doesn't seem to move
103-
elseif df.activity_event_skill_demonstrationst:is_instance(ev) then
104-
-- can be negative or positive, but always counts towards 0
105-
if ev.organize_counter < 0 then
106-
ev.organize_counter = math.min(-1, ev.organize_counter + timeskip)
107-
else
108-
decrement_counter(ev, 'organize_counter', timeskip)
109-
end
110-
decrement_counter(ev, 'train_countdown', timeskip)
111-
elseif df.activity_event_fill_service_orderst:is_instance(ev) then
112-
-- no counters
113-
elseif df.activity_event_individual_skill_drillst:is_instance(ev) then
114-
-- only counts down on season ticks, nothing to do here
115-
elseif df.activity_event_sparringst:is_instance(ev) then
116-
decrement_counter(ev, 'countdown', timeskip * 2)
117-
elseif df.activity_event_ranged_practicest:is_instance(ev) then
118-
-- countdown appears to never move from 0
119-
decrement_counter(ev, 'countdown', timeskip)
120-
elseif df.activity_event_harassmentst:is_instance(ev) then
121-
if DEBUG >= 1 then
122-
print('activity_event_harassmentst ready for analysis at index', i)
123-
end
124-
elseif df.activity_event_encounterst:is_instance(ev) then
125-
if DEBUG >= 1 then
126-
print('activity_event_encounterst ready for analysis at index', i)
127-
end
128-
elseif df.activity_event_reunionst:is_instance(ev) then
129-
if DEBUG >= 1 then
130-
print('activity_event_reunionst ready for analysis at index', i)
131-
end
132-
elseif df.activity_event_conversationst:is_instance(ev) then
133-
increment_counter(ev, 'pause', timeskip)
134-
elseif df.activity_event_guardst:is_instance(ev) then
135-
-- no counters
136-
elseif df.activity_event_conflictst:is_instance(ev) then
137-
increment_counter(ev, 'inactivity_timer', timeskip)
138-
increment_counter(ev, 'attack_inactivity_timer', timeskip)
139-
increment_counter(ev, 'stop_fort_fights_timer', timeskip)
140-
elseif df.activity_event_prayerst:is_instance(ev) then
141-
decrement_counter(ev, 'timer', timeskip)
142-
elseif df.activity_event_researchst:is_instance(ev) then
143-
-- no counters
144-
elseif df.activity_event_playst:is_instance(ev) then
145-
increment_counter(ev, 'down_time_counter', timeskip)
146-
elseif df.activity_event_worshipst:is_instance(ev) then
147-
increment_counter(ev, 'down_time_counter', timeskip)
148-
elseif df.activity_event_socializest:is_instance(ev) then
149-
increment_counter(ev, 'down_time_counter', timeskip)
150-
elseif df.activity_event_ponder_topicst:is_instance(ev) then
151-
decrement_counter(ev, 'timer', timeskip)
152-
elseif df.activity_event_discuss_topicst:is_instance(ev) then
153-
decrement_counter(ev, 'timer', timeskip)
154-
elseif df.activity_event_teach_topicst:is_instance(ev) then
155-
decrement_counter(ev, 'time_left', timeskip)
156-
elseif df.activity_event_readst:is_instance(ev) then
157-
decrement_counter(ev, 'timer', timeskip)
158-
elseif df.activity_event_writest:is_instance(ev) then
159-
decrement_counter(ev, 'timer', timeskip)
160-
elseif df.activity_event_copy_written_contentst:is_instance(ev) then
161-
decrement_counter(ev, 'timer', timeskip)
162-
elseif df.activity_event_make_believest:is_instance(ev) then
163-
decrement_counter(ev, 'time_left', timeskip)
164-
elseif df.activity_event_play_with_toyst:is_instance(ev) then
165-
decrement_counter(ev, 'time_left', timeskip)
166-
elseif df.activity_event_performancest:is_instance(ev) then
167-
increment_counter(ev, 'current_position', timeskip)
168-
elseif df.activity_event_store_objectst:is_instance(ev) then
169-
if DEBUG >= 1 then
170-
print('activity_event_store_objectst ready for analysis at index', i)
171-
end
172-
end
173-
end
174-
end
175-
end
176-
177-
]]
178-
17913
local function do_set(setting_name, arg)
18014
local numarg = tonumber(arg)
18115
if setting_name ~= 'fps' or not numarg then

0 commit comments

Comments
 (0)