summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorAlexander Gavrilov2012-09-11 22:46:17 +0400
committerAlexander Gavrilov2012-09-11 22:46:17 +0400
commitb0938d7e0d80720ef1a6fd264418ba20c375d9ba (patch)
treed11f0016953eacaad629b0c60b6c0fc81b8ab4b2 /scripts
parent3a075f4bc716550e0a621a2db40cfa578db1d0fa (diff)
downloaddfhack-b0938d7e0d80720ef1a6fd264418ba20c375d9ba.tar.gz
dfhack-b0938d7e0d80720ef1a6fd264418ba20c375d9ba.tar.bz2
dfhack-b0938d7e0d80720ef1a6fd264418ba20c375d9ba.tar.xz
Allow specifying arbitrary items to use in catapults.
Diffstat (limited to 'scripts')
-rw-r--r--scripts/gui/siege-engine.lua54
1 files changed, 47 insertions, 7 deletions
diff --git a/scripts/gui/siege-engine.lua b/scripts/gui/siege-engine.lua
index 7ad828c9..d10a9df6 100644
--- a/scripts/gui/siege-engine.lua
+++ b/scripts/gui/siege-engine.lua
@@ -12,6 +12,21 @@ local wmap = df.global.world.map
last_target_min = last_target_min or nil
last_target_max = last_target_max or nil
+local item_choices = {
+ { caption = 'boulders (default)', item_type = df.item_type.BOULDER },
+ { caption = 'blocks', item_type = df.item_type.BLOCKS },
+ { caption = 'weapons', item_type = df.item_type.WEAPON },
+ { caption = 'trap components', item_type = df.item_type.TRAPCOMP },
+ { caption = 'bins', item_type = df.item_type.BIN },
+ { caption = 'barrels', item_type = df.item_type.BARREL },
+ { caption = 'anything', item_type = -1 },
+}
+
+local item_choice_idx = {}
+for i,v in ipairs(item_choices) do
+ item_choice_idx[v.item_type] = i
+end
+
SiegeEngine = defclass(SiegeEngine, guidm.MenuOverlay)
SiegeEngine.focus_path = 'siege-engine'
@@ -83,13 +98,8 @@ function SiegeEngine:zoomToTarget()
local cx = math.floor((target_min.x + target_max.x)/2)
local cy = math.floor((target_min.y + target_max.y)/2)
local cz = math.floor((target_min.z + target_max.z)/2)
- for z = cz,target_max.z do
- if plugin.getTileStatus(self.building, xyz2pos(cx,cy,z)) ~= 'blocked' then
- cz = z
- break
- end
- end
- self:centerViewOn(xyz2pos(cx,cy,cz))
+ local pos = plugin.adjustToTarget(self.building, xyz2pos(cx,cy,cz))
+ self:centerViewOn(pos)
end
end
@@ -171,6 +181,19 @@ function SiegeEngine:onRenderBody_main(dc)
dc:string("z",COLOR_LIGHTGREEN):string(": Zoom")
end
+ dc:newline():newline(1)
+ if self.building.type == df.siegeengine_type.Ballista then
+ dc:string("Uses ballista arrows")
+ else
+ local item = plugin.getAmmoItem(self.building)
+ dc:string("u",COLOR_LIGHTGREEN):string(": Use ")
+ if item_choice_idx[item] then
+ dc:string(item_choices[item_choice_idx[item]].caption)
+ else
+ dc:string(df.item_type[item])
+ end
+ end
+
if self.target_select_first then
self:renderTargetView(self.target_select_first, guidm.getCursorPos())
else
@@ -192,6 +215,19 @@ function SiegeEngine:setTargetArea(p1, p2)
end
end
+function SiegeEngine:setAmmoItem(choice)
+ if self.building.type == df.siegeengine_type.Ballista then
+ return
+ end
+
+ if not plugin.setAmmoItem(self.building, choice.item_type) then
+ dlg.showMessage(
+ 'Set Ammo Item',
+ 'Could not set the ammo item', COLOR_LIGHTRED
+ )
+ end
+end
+
function SiegeEngine:onInput_main(keys)
if keys.CUSTOM_R then
self:showCursor(true)
@@ -199,6 +235,10 @@ function SiegeEngine:onInput_main(keys)
self.mode = self.mode_aim
elseif keys.CUSTOM_P and last_target_min then
self:setTargetArea(last_target_min, last_target_max)
+ elseif keys.CUSTOM_U then
+ local item = plugin.getAmmoItem(self.building)
+ local idx = 1 + (item_choice_idx[item] or 0) % #item_choices
+ self:setAmmoItem(item_choices[idx])
elseif keys.CUSTOM_Z then
self:zoomToTarget()
elseif keys.CUSTOM_X then