@@ -10,172 +10,6 @@ function migrate_old_config()
1010 end
1111end
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-
17913local function do_set (setting_name , arg )
18014 local numarg = tonumber (arg )
18115 if setting_name ~= ' fps' or not numarg then
0 commit comments