diff options
| author | Alexander Gavrilov | 2012-08-25 10:37:03 +0400 |
|---|---|---|
| committer | Alexander Gavrilov | 2012-08-25 10:37:03 +0400 |
| commit | 41ad42d0fdeae7d387186e66d9eb4117a3cf9e7d (patch) | |
| tree | b4bc91a1b977eb4bf39d7c618ff169b774176c44 /scripts | |
| parent | 21904fd607d0f2037782e28ff7284300663931ab (diff) | |
| download | dfhack-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.lua | 201 |
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() |
