summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorAlexander Gavrilov2012-08-25 10:37:03 +0400
committerAlexander Gavrilov2012-08-25 10:37:03 +0400
commit41ad42d0fdeae7d387186e66d9eb4117a3cf9e7d (patch)
treeb4bc91a1b977eb4bf39d7c618ff169b774176c44 /scripts
parent21904fd607d0f2037782e28ff7284300663931ab (diff)
downloaddfhack-41ad42d0fdeae7d387186e66d9eb4117a3cf9e7d.tar.gz
dfhack-41ad42d0fdeae7d387186e66d9eb4117a3cf9e7d.tar.bz2
dfhack-41ad42d0fdeae7d387186e66d9eb4117a3cf9e7d.tar.xz
Expose the liquids plugin engine to lua, and make a wrapper gui script.
Diffstat (limited to 'scripts')
-rw-r--r--scripts/gui/liquids.lua201
1 files changed, 201 insertions, 0 deletions
diff --git a/scripts/gui/liquids.lua b/scripts/gui/liquids.lua
new file mode 100644
index 00000000..27df49e9
--- /dev/null
+++ b/scripts/gui/liquids.lua
@@ -0,0 +1,201 @@
+-- Interface front-end for liquids plugin.
+
+local utils = require 'utils'
+local gui = require 'gui'
+local guidm = require 'gui.dwarfmode'
+
+local liquids = require('plugins.liquids')
+
+local sel_rect = df.global.selection_rect
+
+local brushes = {
+ { tag = 'range', caption = 'Rectangle', range = true },
+ { tag = 'block', caption = '16x16 block' },
+ { tag = 'column', caption = 'Column' },
+ { tag = 'flood', caption = 'Flood' },
+}
+
+local paints = {
+ { tag = 'water', caption = 'Water', liquid = true, key = 'w' },
+ { tag = 'magma', caption = 'Magma', liquid = true, key = 'l' },
+ { tag = 'obsidian', caption = 'Obsidian Wall' },
+ { tag = 'obsidian_floor', caption = 'Obsidian Floor' },
+ { tag = 'riversource', caption = 'River Source' },
+ { tag = 'flowbits', caption = 'Flow Updates' },
+ { tag = 'wclean', caption = 'Clean Salt/Stagnant' },
+}
+
+local flowbits = {
+ { tag = '+', caption = 'Enable Updates' },
+ { tag = '-', caption = 'Disable Updates' },
+ { tag = '.', caption = 'Keep Updates' },
+}
+
+local setmode = {
+ { tag = '.', caption = 'Set Exactly' },
+ { tag = '+', caption = 'Only Increase' },
+ { tag = '-', caption = 'Only Decrease' },
+}
+
+Toggle = defclass(Toggle)
+
+function Toggle:init(items)
+ self:init_fields{
+ items = items,
+ selected = 1
+ }
+ return self
+end
+
+function Toggle:get()
+ return self.items[self.selected]
+end
+
+function Toggle:render(dc)
+ local item = self:get()
+ if item then
+ dc:string(item.caption)
+ if item.key then
+ dc:string(" ("):string(item.key, COLOR_LIGHTGREEN):string(")")
+ end
+ else
+ dc:string('NONE', COLOR_RED)
+ end
+end
+
+function Toggle:step(delta)
+ if #self.items > 1 then
+ delta = delta or 1
+ self.selected = 1 + (self.selected + delta - 1) % #self.items
+ end
+end
+
+LiquidsUI = defclass(LiquidsUI, guidm.MenuOverlay)
+
+LiquidsUI.focus_path = 'liquids'
+
+function LiquidsUI:init()
+ self:init_fields{
+ brush = mkinstance(Toggle):init(brushes),
+ paint = mkinstance(Toggle):init(paints),
+ flow = mkinstance(Toggle):init(flowbits),
+ set = mkinstance(Toggle):init(setmode),
+ amount = 7,
+ }
+ guidm.MenuOverlay.init(self)
+ return self
+end
+
+function LiquidsUI:onDestroy()
+ guidm.clearSelection()
+end
+
+function LiquidsUI:onRenderBody(dc)
+ dc:clear():seek(1,1):string("Paint Liquids Cheat", COLOR_WHITE)
+
+ local cursor = guidm.getCursorPos()
+ local block = dfhack.maps.getTileBlock(cursor)
+ local tile = block.tiletype[cursor.x%16][cursor.y%16]
+ local dsgn = block.designation[cursor.x%16][cursor.y%16]
+
+ dc:seek(2,3):string(df.tiletype.attrs[tile].caption, COLOR_CYAN):newline(2)
+
+ if dsgn.flow_size > 0 then
+ if dsgn.liquid_type == df.tile_liquid.Magma then
+ dc:pen(COLOR_RED):string("Magma")
+ else
+ dc:pen(COLOR_BLUE)
+ if dsgn.water_stagnant then dc:string("Stagnant ") end
+ if dsgn.water_salt then dc:string("Salty ") end
+ dc:string("Water")
+ end
+ dc:string(" ["..dsgn.flow_size.."/7]")
+ else
+ dc:string('No Liquid', COLOR_DARKGREY)
+ end
+
+ dc:newline():pen(COLOR_GREY)
+
+ dc:newline(1):string("b", COLOR_LIGHTGREEN):string(": ")
+ self.brush:render(dc)
+ dc:newline(1):string("p", COLOR_LIGHTGREEN):string(": ")
+ self.paint:render(dc)
+
+ local liquid = self.paint:get().liquid
+
+ dc:newline()
+ if liquid then
+ dc:newline(1):string("Amount: "..self.amount)
+ dc:advance(1):string("("):string("-+", COLOR_LIGHTGREEN):string(")")
+ dc:newline(3):string("s", COLOR_LIGHTGREEN):string(": ")
+ self.set:render(dc)
+ else
+ dc:advance(0,2)
+ end
+
+ dc:newline():newline(1):string("f", COLOR_LIGHTGREEN):string(": ")
+ self.flow:render(dc)
+
+ dc:newline():newline(1):pen(COLOR_WHITE)
+ dc:string("Esc", COLOR_LIGHTGREEN):string(": Back, ")
+ dc:string("Enter", COLOR_LIGHTGREEN):string(": Paint")
+end
+
+function LiquidsUI:onInput(keys)
+ local liquid = self.paint:get().liquid
+ if keys.CUSTOM_B then
+ self.brush:step()
+ elseif keys.CUSTOM_P then
+ self.paint:step()
+ elseif liquid and keys.SECONDSCROLL_UP then
+ self.amount = math.max(0, self.amount-1)
+ elseif liquid and keys.SECONDSCROLL_DOWN then
+ self.amount = math.min(7, self.amount+1)
+ elseif liquid and keys.CUSTOM_S then
+ self.set:step()
+ elseif keys.CUSTOM_F then
+ self.flow:step()
+ elseif keys.LEAVESCREEN then
+ if guidm.getSelection() then
+ guidm.clearSelection()
+ return
+ end
+ self:dismiss()
+ self:sendInputToParent('CURSOR_DOWN_Z')
+ self:sendInputToParent('CURSOR_UP_Z')
+ elseif keys.SELECT then
+ local cursor = guidm.getCursorPos()
+ local sp = guidm.getSelection()
+ local size = nil
+ if self.brush:get().range then
+ if not sp then
+ guidm.setSelectionStart(cursor)
+ return
+ else
+ guidm.clearSelection()
+ cursor, size = guidm.getSelectionRange(cursor, sp)
+ end
+ else
+ guidm.clearSelection()
+ end
+ liquids.paint(
+ cursor,
+ self.brush:get().tag, self.paint:get().tag,
+ self.amount, size,
+ self.set:get().tag, self.flow:get().tag
+ )
+ elseif self:propagateMoveKeys(keys) then
+ return
+ elseif keys.D_LOOK_ARENA_WATER then
+ self.paint.selected = 1
+ elseif keys.D_LOOK_ARENA_MAGMA then
+ self.paint.selected = 2
+ end
+end
+
+if not string.match(dfhack.gui.getCurFocus(), '^dwarfmode/LookAround') then
+ qerror("This script requires the main dwarfmode view in 'k' mode")
+end
+
+local list = mkinstance(LiquidsUI):init()
+list:show()