|
|
@ -180,6 +180,21 @@ local function dwarfmode_feed_input(...)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local function dwarfmode_step_frames(count)
|
|
|
|
|
|
|
|
local screen = screen_dwarfmode()
|
|
|
|
|
|
|
|
if not df.isvalid(screen) then
|
|
|
|
|
|
|
|
qerror('could not retrieve dwarfmode screen')
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for i = 1,(count or 1) do
|
|
|
|
|
|
|
|
gui.simulateInput(screen, 'D_ONESTEP')
|
|
|
|
|
|
|
|
if screen.keyRepeat ~= 1 then
|
|
|
|
|
|
|
|
qerror('Could not step one frame: . did not work')
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
screen:logic()
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
local function dwarfmode_to_top()
|
|
|
|
local function dwarfmode_to_top()
|
|
|
|
if not can_feed() then
|
|
|
|
if not can_feed() then
|
|
|
|
return false
|
|
|
|
return false
|
|
|
@ -241,9 +256,33 @@ local function feed_list_choice(count,upkey,downkey)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
else
|
|
|
|
else
|
|
|
|
print(' Please select the first list item.')
|
|
|
|
print(' Please select the first list item.')
|
|
|
|
if not utils.prompt_yes_no(' Proceed?') then
|
|
|
|
if not utils.prompt_yes_no(' Proceed?', true) then
|
|
|
|
|
|
|
|
return false
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
return true, 0
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local function feed_menu_bool(enter_seq, exit_seq)
|
|
|
|
|
|
|
|
return function(idx)
|
|
|
|
|
|
|
|
if idx == 0 then
|
|
|
|
|
|
|
|
if not utils.prompt_yes_no(' Proceed?', true) then
|
|
|
|
|
|
|
|
return false
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
return true, 0
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
if idx == 5 then
|
|
|
|
|
|
|
|
print(' Please resize the game window.')
|
|
|
|
|
|
|
|
if not utils.prompt_yes_no(' Proceed?', true) then
|
|
|
|
return false
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
if idx%2 == 1 then
|
|
|
|
|
|
|
|
dwarfmode_feed_input(table.unpack(enter_seq))
|
|
|
|
|
|
|
|
return true, 1
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
dwarfmode_feed_input(table.unpack(exit_seq))
|
|
|
|
return true, 0
|
|
|
|
return true, 0
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
@ -880,14 +919,32 @@ local function building_item_list_count()
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
local function find_ui_building_item_cursor()
|
|
|
|
local function find_ui_building_item_cursor()
|
|
|
|
local addr = searcher:find_menu_cursor([[
|
|
|
|
local addr
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if dwarfmode_to_top() then
|
|
|
|
|
|
|
|
dwarfmode_feed_input('D_BUILDITEM')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
addr = searcher:find_interactive([[
|
|
|
|
|
|
|
|
Auto-searching for ui_building_item_cursor. Please highlight a
|
|
|
|
|
|
|
|
workshop, trade depot or other building with at least 5 contained
|
|
|
|
|
|
|
|
items, and select as instructed:]],
|
|
|
|
|
|
|
|
'int32_t',
|
|
|
|
|
|
|
|
feed_list_choice(building_item_list_count),
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if not addr then
|
|
|
|
|
|
|
|
addr = searcher:find_menu_cursor([[
|
|
|
|
Searching for ui_building_item_cursor. Please activate the 't'
|
|
|
|
Searching for ui_building_item_cursor. Please activate the 't'
|
|
|
|
mode, find a cluttered workshop, trade depot, or other building
|
|
|
|
mode, find a cluttered workshop, trade depot, or other building
|
|
|
|
with many contained items, and select as instructed:]],
|
|
|
|
with many contained items, and select as instructed:]],
|
|
|
|
'int32_t',
|
|
|
|
'int32_t',
|
|
|
|
list_index_choices(building_item_list_count),
|
|
|
|
list_index_choices(building_item_list_count),
|
|
|
|
ordinal_names
|
|
|
|
ordinal_names
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
ms.found_offset('ui_building_item_cursor', addr)
|
|
|
|
ms.found_offset('ui_building_item_cursor', addr)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
@ -896,17 +953,37 @@ end
|
|
|
|
--
|
|
|
|
--
|
|
|
|
|
|
|
|
|
|
|
|
local function find_ui_workshop_in_add()
|
|
|
|
local function find_ui_workshop_in_add()
|
|
|
|
local addr = searcher:find_menu_cursor([[
|
|
|
|
local addr
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if dwarfmode_to_top() then
|
|
|
|
|
|
|
|
dwarfmode_feed_input('D_BUILDJOB')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
addr = searcher:find_interactive([[
|
|
|
|
|
|
|
|
Auto-searching for ui_workshop_in_add. Please select a
|
|
|
|
|
|
|
|
workshop, e.g. Carpenters or Masons.]],
|
|
|
|
|
|
|
|
'int8_t',
|
|
|
|
|
|
|
|
feed_menu_bool(
|
|
|
|
|
|
|
|
{ 'BUILDJOB_CANCEL', 'BUILDJOB_ADD' },
|
|
|
|
|
|
|
|
{ 'SELECT', 'SELECT', 'SELECT', 'SELECT', 'SELECT' }
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if not addr then
|
|
|
|
|
|
|
|
addr = searcher:find_menu_cursor([[
|
|
|
|
Searching for ui_workshop_in_add. Please activate the 'q'
|
|
|
|
Searching for ui_workshop_in_add. Please activate the 'q'
|
|
|
|
mode, find a workshop without jobs (or delete jobs),
|
|
|
|
mode, find a workshop without jobs (or delete jobs),
|
|
|
|
and do as instructed below.
|
|
|
|
and do as instructed below.
|
|
|
|
|
|
|
|
|
|
|
|
NOTE: If not done after first 3-4 steps, resize the game window.]],
|
|
|
|
NOTE: If not done after first 3-4 steps, resize the game window.]],
|
|
|
|
'int8_t',
|
|
|
|
'int8_t',
|
|
|
|
{ 1, 0 },
|
|
|
|
{ 1, 0 },
|
|
|
|
{ [1] = 'enter the add job menu',
|
|
|
|
{ [1] = 'enter the add job menu',
|
|
|
|
[0] = 'add job, thus exiting the menu' }
|
|
|
|
[0] = 'add job, thus exiting the menu' }
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
ms.found_offset('ui_workshop_in_add', addr)
|
|
|
|
ms.found_offset('ui_workshop_in_add', addr)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
@ -919,13 +996,30 @@ local function workshop_job_list_count()
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
local function find_ui_workshop_job_cursor()
|
|
|
|
local function find_ui_workshop_job_cursor()
|
|
|
|
local addr = searcher:find_menu_cursor([[
|
|
|
|
local addr
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if dwarfmode_to_top() then
|
|
|
|
|
|
|
|
dwarfmode_feed_input('D_BUILDJOB')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
addr = searcher:find_interactive([[
|
|
|
|
|
|
|
|
Auto-searching for ui_workshop_job_cursor. Please highlight a
|
|
|
|
|
|
|
|
workshop with at least 5 contained jobs, and select as instructed:]],
|
|
|
|
|
|
|
|
'int32_t',
|
|
|
|
|
|
|
|
feed_list_choice(workshop_job_list_count),
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if not addr then
|
|
|
|
|
|
|
|
addr = searcher:find_menu_cursor([[
|
|
|
|
Searching for ui_workshop_job_cursor. Please activate the 'q'
|
|
|
|
Searching for ui_workshop_job_cursor. Please activate the 'q'
|
|
|
|
mode, find a workshop with many jobs, and select as instructed:]],
|
|
|
|
mode, find a workshop with many jobs, and select as instructed:]],
|
|
|
|
'int32_t',
|
|
|
|
'int32_t',
|
|
|
|
list_index_choices(workshop_job_list_count),
|
|
|
|
list_index_choices(workshop_job_list_count),
|
|
|
|
ordinal_names
|
|
|
|
ordinal_names
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
ms.found_offset('ui_workshop_job_cursor', addr)
|
|
|
|
ms.found_offset('ui_workshop_job_cursor', addr)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
@ -934,17 +1028,39 @@ end
|
|
|
|
--
|
|
|
|
--
|
|
|
|
|
|
|
|
|
|
|
|
local function find_ui_building_in_assign()
|
|
|
|
local function find_ui_building_in_assign()
|
|
|
|
local addr = searcher:find_menu_cursor([[
|
|
|
|
local addr
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if dwarfmode_to_top() then
|
|
|
|
|
|
|
|
dwarfmode_feed_input('D_BUILDJOB')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
addr = searcher:find_interactive([[
|
|
|
|
|
|
|
|
Auto-searching for ui_building_in_assign. Please select a room,
|
|
|
|
|
|
|
|
i.e. a bedroom, tomb, office, dining room or statue garden.]],
|
|
|
|
|
|
|
|
'int8_t',
|
|
|
|
|
|
|
|
feed_menu_bool(
|
|
|
|
|
|
|
|
{ { 'BUILDJOB_STATUE_ASSIGN', 'BUILDJOB_COFFIN_ASSIGN',
|
|
|
|
|
|
|
|
'BUILDJOB_CHAIR_ASSIGN', 'BUILDJOB_TABLE_ASSIGN',
|
|
|
|
|
|
|
|
'BUILDJOB_BED_ASSIGN' } },
|
|
|
|
|
|
|
|
{ 'LEAVESCREEN' }
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if not addr then
|
|
|
|
|
|
|
|
addr = searcher:find_menu_cursor([[
|
|
|
|
Searching for ui_building_in_assign. Please activate
|
|
|
|
Searching for ui_building_in_assign. Please activate
|
|
|
|
the 'q' mode, select a room building (e.g. a bedroom)
|
|
|
|
the 'q' mode, select a room building (e.g. a bedroom)
|
|
|
|
and do as instructed below.
|
|
|
|
and do as instructed below.
|
|
|
|
|
|
|
|
|
|
|
|
NOTE: If not done after first 3-4 steps, resize the game window.]],
|
|
|
|
NOTE: If not done after first 3-4 steps, resize the game window.]],
|
|
|
|
'int8_t',
|
|
|
|
'int8_t',
|
|
|
|
{ 1, 0 },
|
|
|
|
{ 1, 0 },
|
|
|
|
{ [1] = 'enter the Assign owner menu',
|
|
|
|
{ [1] = 'enter the Assign owner menu',
|
|
|
|
[0] = 'press Esc to exit assign' }
|
|
|
|
[0] = 'press Esc to exit assign' }
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
ms.found_offset('ui_building_in_assign', addr)
|
|
|
|
ms.found_offset('ui_building_in_assign', addr)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
@ -953,17 +1069,39 @@ end
|
|
|
|
--
|
|
|
|
--
|
|
|
|
|
|
|
|
|
|
|
|
local function find_ui_building_in_resize()
|
|
|
|
local function find_ui_building_in_resize()
|
|
|
|
local addr = searcher:find_menu_cursor([[
|
|
|
|
local addr
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if dwarfmode_to_top() then
|
|
|
|
|
|
|
|
dwarfmode_feed_input('D_BUILDJOB')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
addr = searcher:find_interactive([[
|
|
|
|
|
|
|
|
Auto-searching for ui_building_in_resize. Please select a room,
|
|
|
|
|
|
|
|
i.e. a bedroom, tomb, office, dining room or statue garden.]],
|
|
|
|
|
|
|
|
'int8_t',
|
|
|
|
|
|
|
|
feed_menu_bool(
|
|
|
|
|
|
|
|
{ { 'BUILDJOB_STATUE_SIZE', 'BUILDJOB_COFFIN_SIZE',
|
|
|
|
|
|
|
|
'BUILDJOB_CHAIR_SIZE', 'BUILDJOB_TABLE_SIZE',
|
|
|
|
|
|
|
|
'BUILDJOB_BED_SIZE' } },
|
|
|
|
|
|
|
|
{ 'LEAVESCREEN' }
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if not addr then
|
|
|
|
|
|
|
|
addr = searcher:find_menu_cursor([[
|
|
|
|
Searching for ui_building_in_resize. Please activate
|
|
|
|
Searching for ui_building_in_resize. Please activate
|
|
|
|
the 'q' mode, select a room building (e.g. a bedroom)
|
|
|
|
the 'q' mode, select a room building (e.g. a bedroom)
|
|
|
|
and do as instructed below.
|
|
|
|
and do as instructed below.
|
|
|
|
|
|
|
|
|
|
|
|
NOTE: If not done after first 3-4 steps, resize the game window.]],
|
|
|
|
NOTE: If not done after first 3-4 steps, resize the game window.]],
|
|
|
|
'int8_t',
|
|
|
|
'int8_t',
|
|
|
|
{ 1, 0 },
|
|
|
|
{ 1, 0 },
|
|
|
|
{ [1] = 'enter the Resize room mode',
|
|
|
|
{ [1] = 'enter the Resize room mode',
|
|
|
|
[0] = 'press Esc to exit resize' }
|
|
|
|
[0] = 'press Esc to exit resize' }
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
ms.found_offset('ui_building_in_resize', addr)
|
|
|
|
ms.found_offset('ui_building_in_resize', addr)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
@ -971,13 +1109,40 @@ end
|
|
|
|
-- window_x
|
|
|
|
-- window_x
|
|
|
|
--
|
|
|
|
--
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local function feed_window_xyz(dec,inc,step)
|
|
|
|
|
|
|
|
return function(idx)
|
|
|
|
|
|
|
|
if idx == 0 then
|
|
|
|
|
|
|
|
for i = 1,30 do dwarfmode_feed_input(dec) end
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
dwarfmode_feed_input(inc)
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
return true, nil, step
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
local function find_window_x()
|
|
|
|
local function find_window_x()
|
|
|
|
local addr = searcher:find_counter([[
|
|
|
|
local addr
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if dwarfmode_to_top() then
|
|
|
|
|
|
|
|
addr = searcher:find_interactive(
|
|
|
|
|
|
|
|
'Auto-searching for window_x.',
|
|
|
|
|
|
|
|
'int32_t',
|
|
|
|
|
|
|
|
feed_window_xyz('CURSOR_LEFT_FAST', 'CURSOR_RIGHT', 10),
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dwarfmode_feed_input('D_HOTKEY1')
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if not addr then
|
|
|
|
|
|
|
|
addr = searcher:find_counter([[
|
|
|
|
Searching for window_x. Please exit to main dwarfmode menu,
|
|
|
|
Searching for window_x. Please exit to main dwarfmode menu,
|
|
|
|
scroll to the LEFT edge, then do as instructed:]],
|
|
|
|
scroll to the LEFT edge, then do as instructed:]],
|
|
|
|
'int32_t', 10,
|
|
|
|
'int32_t', 10,
|
|
|
|
'Please press Right to scroll right one step.'
|
|
|
|
'Please press Right to scroll right one step.'
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
ms.found_offset('window_x', addr)
|
|
|
|
ms.found_offset('window_x', addr)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
@ -986,12 +1151,28 @@ end
|
|
|
|
--
|
|
|
|
--
|
|
|
|
|
|
|
|
|
|
|
|
local function find_window_y()
|
|
|
|
local function find_window_y()
|
|
|
|
local addr = searcher:find_counter([[
|
|
|
|
local addr
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if dwarfmode_to_top() then
|
|
|
|
|
|
|
|
addr = searcher:find_interactive(
|
|
|
|
|
|
|
|
'Auto-searching for window_y.',
|
|
|
|
|
|
|
|
'int32_t',
|
|
|
|
|
|
|
|
feed_window_xyz('CURSOR_UP_FAST', 'CURSOR_DOWN', 10),
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dwarfmode_feed_input('D_HOTKEY1')
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if not addr then
|
|
|
|
|
|
|
|
addr = searcher:find_counter([[
|
|
|
|
Searching for window_y. Please exit to main dwarfmode menu,
|
|
|
|
Searching for window_y. Please exit to main dwarfmode menu,
|
|
|
|
scroll to the TOP edge, then do as instructed:]],
|
|
|
|
scroll to the TOP edge, then do as instructed:]],
|
|
|
|
'int32_t', 10,
|
|
|
|
'int32_t', 10,
|
|
|
|
'Please press Down to scroll down one step.'
|
|
|
|
'Please press Down to scroll down one step.'
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
ms.found_offset('window_y', addr)
|
|
|
|
ms.found_offset('window_y', addr)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
@ -1000,14 +1181,30 @@ end
|
|
|
|
--
|
|
|
|
--
|
|
|
|
|
|
|
|
|
|
|
|
local function find_window_z()
|
|
|
|
local function find_window_z()
|
|
|
|
local addr = searcher:find_counter([[
|
|
|
|
local addr
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if dwarfmode_to_top() then
|
|
|
|
|
|
|
|
addr = searcher:find_interactive(
|
|
|
|
|
|
|
|
'Auto-searching for window_z.',
|
|
|
|
|
|
|
|
'int32_t',
|
|
|
|
|
|
|
|
feed_window_xyz('CURSOR_UP_Z', 'CURSOR_DOWN_Z', -1),
|
|
|
|
|
|
|
|
30
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dwarfmode_feed_input('D_HOTKEY1')
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if not addr then
|
|
|
|
|
|
|
|
addr = searcher:find_counter([[
|
|
|
|
Searching for window_z. Please exit to main dwarfmode menu,
|
|
|
|
Searching for window_z. Please exit to main dwarfmode menu,
|
|
|
|
scroll to a Z level near surface, then do as instructed below.
|
|
|
|
scroll to a Z level near surface, then do as instructed below.
|
|
|
|
|
|
|
|
|
|
|
|
NOTE: If not done after first 3-4 steps, resize the game window.]],
|
|
|
|
NOTE: If not done after first 3-4 steps, resize the game window.]],
|
|
|
|
'int32_t', -1,
|
|
|
|
'int32_t', -1,
|
|
|
|
"Please press '>' to scroll one Z level down."
|
|
|
|
"Please press '>' to scroll one Z level down."
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
ms.found_offset('window_z', addr)
|
|
|
|
ms.found_offset('window_z', addr)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
@ -1056,6 +1253,27 @@ function stop_autosave()
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function step_n_frames(cnt, feed)
|
|
|
|
|
|
|
|
local world = df.global.world
|
|
|
|
|
|
|
|
local ctick = world.frame_counter
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if feed then
|
|
|
|
|
|
|
|
print(" Auto-stepping "..cnt.." frames.")
|
|
|
|
|
|
|
|
dwarfmode_step_frames(cnt)
|
|
|
|
|
|
|
|
return world.frame_counter-ctick
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local more = ''
|
|
|
|
|
|
|
|
while world.frame_counter-ctick < cnt do
|
|
|
|
|
|
|
|
print(" Please step the game "..(cnt-world.frame_counter+ctick)..more.." frames.")
|
|
|
|
|
|
|
|
more = ' more'
|
|
|
|
|
|
|
|
if not utils.prompt_yes_no(' Proceed?', true) then
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
return world.frame_counter-ctick
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
local function find_cur_year_tick()
|
|
|
|
local function find_cur_year_tick()
|
|
|
|
local zone
|
|
|
|
local zone
|
|
|
|
if os_type == 'windows' then
|
|
|
|
if os_type == 'windows' then
|
|
|
@ -1070,12 +1288,21 @@ local function find_cur_year_tick()
|
|
|
|
|
|
|
|
|
|
|
|
stop_autosave()
|
|
|
|
stop_autosave()
|
|
|
|
|
|
|
|
|
|
|
|
local addr = zone:find_counter([[
|
|
|
|
local feed = dwarfmode_to_top()
|
|
|
|
Searching for cur_year_tick. Please exit to main dwarfmode
|
|
|
|
local addr = zone:find_interactive(
|
|
|
|
menu, then do as instructed below:]],
|
|
|
|
'Searching for cur_year_tick.',
|
|
|
|
'int32_t', 1,
|
|
|
|
'int32_t',
|
|
|
|
"Please press '.' to step the game one frame."
|
|
|
|
function(idx)
|
|
|
|
|
|
|
|
if idx > 0 then
|
|
|
|
|
|
|
|
if not step_n_frames(1, feed) then
|
|
|
|
|
|
|
|
return false
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
return true, nil, 1
|
|
|
|
|
|
|
|
end,
|
|
|
|
|
|
|
|
20
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
ms.found_offset('cur_year_tick', addr)
|
|
|
|
ms.found_offset('cur_year_tick', addr)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
@ -1083,20 +1310,6 @@ end
|
|
|
|
-- cur_season_tick
|
|
|
|
-- cur_season_tick
|
|
|
|
--
|
|
|
|
--
|
|
|
|
|
|
|
|
|
|
|
|
function step_n_frames(cnt)
|
|
|
|
|
|
|
|
local world = df.global.world
|
|
|
|
|
|
|
|
local ctick = world.frame_counter
|
|
|
|
|
|
|
|
local more = ''
|
|
|
|
|
|
|
|
while world.frame_counter-ctick < cnt do
|
|
|
|
|
|
|
|
print(" Please step the game "..(cnt-world.frame_counter+ctick)..more.." frames.")
|
|
|
|
|
|
|
|
more = ' more'
|
|
|
|
|
|
|
|
if not utils.prompt_yes_no(' Done?', true) then
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
return world.frame_counter-ctick
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local function find_cur_season_tick()
|
|
|
|
local function find_cur_season_tick()
|
|
|
|
if not (is_known 'cur_year_tick') then
|
|
|
|
if not (is_known 'cur_year_tick') then
|
|
|
|
dfhack.printerr('Cannot search for cur_season_tick - prerequisites missing.')
|
|
|
|
dfhack.printerr('Cannot search for cur_season_tick - prerequisites missing.')
|
|
|
@ -1105,13 +1318,14 @@ local function find_cur_season_tick()
|
|
|
|
|
|
|
|
|
|
|
|
stop_autosave()
|
|
|
|
stop_autosave()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local feed = dwarfmode_to_top()
|
|
|
|
local addr = searcher:find_interactive([[
|
|
|
|
local addr = searcher:find_interactive([[
|
|
|
|
Searching for cur_season_tick. Please exit to main dwarfmode
|
|
|
|
Searching for cur_season_tick. Please exit to main dwarfmode
|
|
|
|
menu, then do as instructed below:]],
|
|
|
|
menu, then do as instructed below:]],
|
|
|
|
'int32_t',
|
|
|
|
'int32_t',
|
|
|
|
function(ccursor)
|
|
|
|
function(ccursor)
|
|
|
|
if ccursor > 0 then
|
|
|
|
if ccursor > 0 then
|
|
|
|
if not step_n_frames(10) then
|
|
|
|
if not step_n_frames(10, feed) then
|
|
|
|
return false
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
@ -1133,6 +1347,7 @@ local function find_cur_season()
|
|
|
|
|
|
|
|
|
|
|
|
stop_autosave()
|
|
|
|
stop_autosave()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local feed = dwarfmode_to_top()
|
|
|
|
local addr = searcher:find_interactive([[
|
|
|
|
local addr = searcher:find_interactive([[
|
|
|
|
Searching for cur_season. Please exit to main dwarfmode
|
|
|
|
Searching for cur_season. Please exit to main dwarfmode
|
|
|
|
menu, then do as instructed below:]],
|
|
|
|
menu, then do as instructed below:]],
|
|
|
@ -1142,7 +1357,7 @@ menu, then do as instructed below:]],
|
|
|
|
local cst = df.global.cur_season_tick
|
|
|
|
local cst = df.global.cur_season_tick
|
|
|
|
df.global.cur_season_tick = 10079
|
|
|
|
df.global.cur_season_tick = 10079
|
|
|
|
df.global.cur_year_tick = df.global.cur_year_tick + (10079-cst)*10
|
|
|
|
df.global.cur_year_tick = df.global.cur_year_tick + (10079-cst)*10
|
|
|
|
if not step_n_frames(10) then
|
|
|
|
if not step_n_frames(10, feed) then
|
|
|
|
return false
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
@ -1203,7 +1418,7 @@ end
|
|
|
|
--
|
|
|
|
--
|
|
|
|
|
|
|
|
|
|
|
|
local function find_pause_state()
|
|
|
|
local function find_pause_state()
|
|
|
|
local zone
|
|
|
|
local zone, addr
|
|
|
|
if os_type == 'linux' or os_type == 'darwin' then
|
|
|
|
if os_type == 'linux' or os_type == 'darwin' then
|
|
|
|
zone = zoomed_searcher('ui_look_cursor', 32)
|
|
|
|
zone = zoomed_searcher('ui_look_cursor', 32)
|
|
|
|
elseif os_type == 'windows' then
|
|
|
|
elseif os_type == 'windows' then
|
|
|
@ -1213,13 +1428,33 @@ local function find_pause_state()
|
|
|
|
|
|
|
|
|
|
|
|
stop_autosave()
|
|
|
|
stop_autosave()
|
|
|
|
|
|
|
|
|
|
|
|
local addr = zone:find_menu_cursor([[
|
|
|
|
if dwarfmode_to_top() then
|
|
|
|
|
|
|
|
addr = zone:find_interactive(
|
|
|
|
|
|
|
|
'Auto-searching for pause_state',
|
|
|
|
|
|
|
|
'int8_t',
|
|
|
|
|
|
|
|
function(idx)
|
|
|
|
|
|
|
|
if idx%2 == 0 then
|
|
|
|
|
|
|
|
dwarfmode_feed_input('D_ONESTEP')
|
|
|
|
|
|
|
|
return true, 0
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
screen_dwarfmode():logic()
|
|
|
|
|
|
|
|
return true, 1
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
end,
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if not addr then
|
|
|
|
|
|
|
|
addr = zone:find_menu_cursor([[
|
|
|
|
Searching for pause_state. Please do as instructed below:]],
|
|
|
|
Searching for pause_state. Please do as instructed below:]],
|
|
|
|
'int8_t',
|
|
|
|
'int8_t',
|
|
|
|
{ 1, 0 },
|
|
|
|
{ 1, 0 },
|
|
|
|
{ [1] = 'PAUSE the game',
|
|
|
|
{ [1] = 'PAUSE the game',
|
|
|
|
[0] = 'UNPAUSE the game' }
|
|
|
|
[0] = 'UNPAUSE the game' }
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
ms.found_offset('pause_state', addr)
|
|
|
|
ms.found_offset('pause_state', addr)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|