diff --git a/game/engines/default/engine/ui/List.lua b/game/engines/default/engine/ui/List.lua index 5a321ca62579751d53e1ef49952054c6992f8b3b..963803010185e9579f5567e18112b7b34b285623 100644 --- a/game/engines/default/engine/ui/List.lua +++ b/game/engines/default/engine/ui/List.lua @@ -33,6 +33,7 @@ function _M:init(t) self.fct = t.fct self.display_prop = t.display_prop or "name" self.scrollbar = t.scrollbar + self.all_clicks = t.all_clicks Base.init(self, t) end @@ -103,7 +104,7 @@ function _M:generate() elseif button == "wheeldown" and event == "button" then self.scroll = util.bound(self.scroll + 1, 1, self.max - self.max_display + 1) end self.sel = util.bound(self.scroll + math.floor(by / self.fh), 1, self.max) - if button == "left" and event == "button" then self:onUse() end + if (self.all_clicks or button == "left") and event == "button" then self:onUse(button) end end) self.key:addBinds{ ACCEPT = function() self:onUse() end, @@ -130,11 +131,11 @@ function _M:generate() } end -function _M:onUse() +function _M:onUse(...) local item = self.list[self.sel] if not item then return end if item.fct then item:fct() - else self.fct(item, self.sel) end + else self.fct(item, self.sel, ...) end end function _M:display(x, y) diff --git a/game/engines/default/engine/ui/ListColumns.lua b/game/engines/default/engine/ui/ListColumns.lua index 54aa327431cf9455b17ed4b392380884073aab9d..ffc288d5ca34d2938c1fa1e290dfaa744f6afcb9 100644 --- a/game/engines/default/engine/ui/ListColumns.lua +++ b/game/engines/default/engine/ui/ListColumns.lua @@ -35,6 +35,7 @@ function _M:init(t) self.scrollbar = t.scrollbar self.fct = t.fct self.select = t.select + self.all_clicks = t.all_clicks local w = self.w if self.scrollbar then w = w - 10 end @@ -154,7 +155,7 @@ function _M:generate() self.sel = util.bound(self.scroll + math.floor(by / self.fh), 1, self.max) self:onSelect() - if button == "left" and event == "button" then self:onUse() end + if (self.all_clicks or button == "left") and event == "button" then self:onUse(button) end end) self.key:addBinds{ ACCEPT = function() self:onUse() end, @@ -183,6 +184,8 @@ function _M:generate() self:onSelect() end, } + + self:onSelect() end function _M:onSelect() diff --git a/game/modules/tome/dialogs/LevelupStatsDialog.lua b/game/modules/tome/dialogs/LevelupStatsDialog.lua index 69c517a91c4dbe96dd48b3af8bcddbc247f361ef..859dff6dbae0cd800617a11b166273d82e8a1247 100644 --- a/game/modules/tome/dialogs/LevelupStatsDialog.lua +++ b/game/modules/tome/dialogs/LevelupStatsDialog.lua @@ -18,28 +18,58 @@ -- darkgod@te4.org require "engine.class" -require "engine.Dialog" + +local Dialog = require "engine.ui.Dialog" +local ListColumns = require "engine.ui.ListColumns" +local Textzone = require "engine.ui.Textzone" +local Separator = require "engine.ui.Separator" + local LevelupTalentsDialog = require "mod.dialogs.LevelupTalentsDialog" -module(..., package.seeall, class.inherit(engine.Dialog)) +module(..., package.seeall, class.inherit(Dialog)) function _M:init(actor, on_finish) self.actor = actor self.actor_dup = actor:clone() self.unused_stats = self.actor.unused_stats - engine.Dialog.init(self, "Stats Levelup: "..actor.name, 500, 300) + Dialog.init(self, "Stats Levelup: "..actor.name, 500, 300) self.sel = 1 - self:keyCommands(nil, { - MOVE_UP = function() self.changed = true; self.sel = util.boundWrap(self.sel - 1, 1, 6) end, - MOVE_DOWN = function() self.changed = true; self.sel = util.boundWrap(self.sel + 1, 1, 6) end, - MOVE_LEFT = function() self.changed = true; self:incStat(-1) end, - MOVE_RIGHT = function() self.changed = true; self:incStat(1) end, - ACCEPT = "EXIT", + self.c_tut = Textzone.new{width=math.floor(self.iw / 2 - 10), height=1, auto_height=true, no_color_bleed=true, text=[[ +Keyboard: #00FF00#up key/down key#FFFFFF# to select a stat; #00FF00#right key#FFFFFF# to increase stat; #00FF00#left key#FFFFFF# to decrease a stat. +Mouse: #00FF00#Left click#FFFFFF# to increase a stat; #00FF00#right click#FFFFFF# to decrease a stat. +]]} + self.c_desc = Textzone.new{width=math.floor(self.iw / 2 - 10), height=self.ih - self.c_tut.h - 20, no_color_bleed=true, text=""} + + self.c_list = ListColumns.new{width=math.floor(self.iw / 2 - 10), height=self.ih - 10, columns={ + {name="Stat", width=70, display_prop="name"}, + {name="Value", width=30, display_prop="val"}, + }, list={ + {name="Strength", val=self.actor:getStr(), zone=Textzone.new{width=self.c_desc.w, height=self.c_desc.h, no_color_bleed=true, text=self.actor.stats_def[self.actor.STAT_STR].description}}, + {name="Dexterity", val=self.actor:getDex(), zone=Textzone.new{width=self.c_desc.w, height=self.c_desc.h, no_color_bleed=true, text=self.actor.stats_def[self.actor.STAT_DEX].description}}, + {name="Magic", val=self.actor:getMag(), zone=Textzone.new{width=self.c_desc.w, height=self.c_desc.h, no_color_bleed=true, text=self.actor.stats_def[self.actor.STAT_MAG].description}}, + {name="Willpower", val=self.actor:getWil(), zone=Textzone.new{width=self.c_desc.w, height=self.c_desc.h, no_color_bleed=true, text=self.actor.stats_def[self.actor.STAT_WIL].description}}, + {name="Cunning", val=self.actor:getCun(), zone=Textzone.new{width=self.c_desc.w, height=self.c_desc.h, no_color_bleed=true, text=self.actor.stats_def[self.actor.STAT_CUN].description}}, + {name="Constitution", val=self.actor:getCon(), zone=Textzone.new{width=self.c_desc.w, height=self.c_desc.h, no_color_bleed=true, text=self.actor.stats_def[self.actor.STAT_CON].description}}, + }, fct=function(item, _, v) + self:incStat(v and 1 or -1) + end, select=function(item, sel) self.sel = sel if self.uis[2] then self.uis[2].ui = item.zone end end} + + self:loadUI{ + {left=0, top=0, ui=self.c_list}, + {right=0, top=self.c_tut.h + 20, ui=self.c_desc}, + {right=0, top=0, ui=self.c_tut}, + {hcenter=0, top=5, ui=Separator.new{dir="horizontal", size=self.ih - 10}}, + } + self:setFocus(self.c_list) + self:setupUI() + + self:update() + + self.key:addBinds{ EXIT = function() game:unregisterDialog(self) - self:finish() -- if talents to spend, do it now @@ -48,20 +78,6 @@ function _M:init(actor, on_finish) game:registerDialog(dt) end end, - }) - self:mouseZones{ - { x=0, y=0, w=game.w, h=game.h, mode={button=true}, norestrict=true, fct=function(button) if button == "left" then self.key:triggerVirtual("EXIT") end end}, - { x=2, y=25, w=130, h=self.font_h*6, fct=function(button, x, y, xrel, yrel, tx, ty, event) - self.changed = true - if button ~= "wheelup" and button ~= "wheeldown" then - self.sel = 1 + math.floor(ty / self.font_h) - end - if button == "left" and event == "button" then self:incStat(1) - elseif button == "right" and event == "button" then self:incStat(-1) - elseif button == "wheelup" and event == "button" then self.key:triggerVirtual("MOVE_UP") - elseif button == "wheeldown" and event == "button" then self.key:triggerVirtual("MOVE_DOWN") - end - end }, } end @@ -109,8 +125,22 @@ function _M:incStat(v) end end - self.actor:incStat(self.sel, v) + local sel = self.sel + self.actor:incStat(sel, v) self.actor.unused_stats = self.actor.unused_stats - v + self.c_list.list[sel].val = self.actor:getStat(sel) + self.c_list:generate() + self.c_list.sel = sel + self.c_list:onSelect() + self:update() +end + +function _M:update() + self.c_list.key:addBinds{ + ACCEPT = function() self.key:triggerVirtual("EXIT") end, + MOVE_LEFT = function() self:incStat(-1) end, + MOVE_RIGHT = function() self:incStat(1) end, + } end function _M:drawDialog(s)