From ee827f5ca19cc4c90860fe7de1c42f11d308373e Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Sat, 18 Feb 2023 01:18:15 -0800 Subject: [PATCH] remember mouse pos from before item choosing --- plugins/lua/buildingplan.lua | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/plugins/lua/buildingplan.lua b/plugins/lua/buildingplan.lua index 46d27d626..65bf918ce 100644 --- a/plugins/lua/buildingplan.lua +++ b/plugins/lua/buildingplan.lua @@ -75,11 +75,12 @@ local function is_choosing_area() return uibs.selection_pos.x >= 0 end -local function get_cur_area_dims() +local function get_cur_area_dims(pos) if not is_choosing_area() then return 1, 1, 1 end - return math.abs(uibs.selection_pos.x - uibs.pos.x) + 1, - math.abs(uibs.selection_pos.y - uibs.pos.y) + 1, - math.abs(uibs.selection_pos.z - uibs.pos.z) + 1 + pos = pos or uibs.pos + return math.abs(uibs.selection_pos.x - pos.x) + 1, + math.abs(uibs.selection_pos.y - pos.y) + 1, + math.abs(uibs.selection_pos.z - pos.z) + 1 end local function get_quantity(filter) @@ -716,7 +717,7 @@ function PlannerOverlay:onInput(keys) chosen_items[idx] = items pending = pending - 1 if pending == 0 then - self:place_building(chosen_items) + self:place_building(pos, chosen_items) end end, }:show() @@ -725,7 +726,7 @@ function PlannerOverlay:onInput(keys) end end else - self:place_building() + self:place_building(pos) end return true elseif not is_choosing_area() then @@ -756,11 +757,12 @@ function PlannerOverlay:onRenderFrame(dc, rect) if not is_choosing_area() then return end + local pos = uibs.pos local bounds = { - x1 = math.min(uibs.selection_pos.x, uibs.pos.x), - x2 = math.max(uibs.selection_pos.x, uibs.pos.x), - y1 = math.min(uibs.selection_pos.y, uibs.pos.y), - y2 = math.max(uibs.selection_pos.y, uibs.pos.y), + x1 = math.min(uibs.selection_pos.x, pos.x), + x2 = math.max(uibs.selection_pos.x, pos.x), + y1 = math.min(uibs.selection_pos.y, pos.y), + y2 = math.max(uibs.selection_pos.y, pos.y), } local pen = #uibs.errors > 0 and BAD_PEN or GOOD_PEN @@ -772,18 +774,18 @@ function PlannerOverlay:onRenderFrame(dc, rect) guidm.renderMapOverlay(get_overlay_pen, bounds) end -function PlannerOverlay:place_building(chosen_items) +function PlannerOverlay:place_building(pos, chosen_items) local direction = uibs.direction - local width, height, depth = get_cur_area_dims() + local width, height, depth = get_cur_area_dims(pos) local _, adjusted_width, adjusted_height = dfhack.buildings.getCorrectSize( width, height, uibs.building_type, uibs.building_subtype, uibs.custom_type, direction) -- get the upper-left corner of the building/area at min z-level local has_selection = is_choosing_area() local start_pos = xyz2pos( - has_selection and math.min(uibs.selection_pos.x, uibs.pos.x) or uibs.pos.x - adjusted_width//2, - has_selection and math.min(uibs.selection_pos.y, uibs.pos.y) or uibs.pos.y - adjusted_height//2, - has_selection and math.min(uibs.selection_pos.z, uibs.pos.z) or uibs.pos.z + has_selection and math.min(uibs.selection_pos.x, pos.x) or pos.x - adjusted_width//2, + has_selection and math.min(uibs.selection_pos.y, pos.y) or pos.y - adjusted_height//2, + has_selection and math.min(uibs.selection_pos.z, pos.z) or pos.z ) if uibs.building_type == df.building_type.ScrewPump then if direction == df.screw_pump_direction.FromSouth then @@ -799,7 +801,7 @@ function PlannerOverlay:place_building(chosen_items) and (width > 1 or height > 1 or depth > 1) then max_x = min_x + width - 1 max_y = min_y + height - 1 - max_z = math.max(uibs.selection_pos.z, uibs.pos.z) + max_z = math.max(uibs.selection_pos.z, pos.z) end local blds = {} local subtype = uibs.building_subtype