From 536f545eda5d8055e6566eeb8c9c59be1d7ef4da Mon Sep 17 00:00:00 2001 From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54> Date: Wed, 25 Nov 2009 10:23:50 +0000 Subject: [PATCH] nice dialogs, special keyhandlers for dialogs git-svn-id: http://svn.net-core.org/repos/t-engine4@39 51575b47-30f0-44d4-a5cc-537603b46e54 --- game/data/gfx/border_1.png | Bin 0 -> 246 bytes game/data/gfx/border_2.png | Bin 0 -> 170 bytes game/data/gfx/border_3.png | Bin 0 -> 227 bytes game/data/gfx/border_4.png | Bin 0 -> 169 bytes game/data/gfx/border_6.png | Bin 0 -> 168 bytes game/data/gfx/border_7.png | Bin 0 -> 206 bytes game/data/gfx/border_8.png | Bin 0 -> 171 bytes game/data/gfx/border_9.png | Bin 0 -> 253 bytes game/engine/Dialog.lua | 41 ++++++++++++++++++++++++++--- game/engine/Game.lua | 1 + game/engine/Key.lua | 2 ++ game/engine/KeyCommand.lua | 8 +++--- game/engine/utils.lua | 10 +++++++ game/modules/tome/dialogs/Quit.lua | 14 +++++++--- 14 files changed, 66 insertions(+), 10 deletions(-) create mode 100644 game/data/gfx/border_1.png create mode 100644 game/data/gfx/border_2.png create mode 100644 game/data/gfx/border_3.png create mode 100644 game/data/gfx/border_4.png create mode 100644 game/data/gfx/border_6.png create mode 100644 game/data/gfx/border_7.png create mode 100644 game/data/gfx/border_8.png create mode 100644 game/data/gfx/border_9.png diff --git a/game/data/gfx/border_1.png b/game/data/gfx/border_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d78094cb84a22e1fcbf7f2019bc15545db9acd2f GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pdfpRr>`sfO>Rj}ON*}J122F=k|nMYCC>S|xv6<249-QVi6yBi3gww4 z84B*6z5(HleBwYw$(}BbArhC9@9Zu<^j|yty|Ij4(Zs~FyO?=iG;}sHDEK;hOkmDq z-DdWSXXZ;rp6YTxhrk0n%AdFV=K+H7b@$Q}fZ)Q#FqhB+2M&CYPusG#*RD;p2PpZ! f@aB1-7z2ajHc9h5ueUKk>li#;{an^LB{Ts54DnCD literal 0 HcmV?d00001 diff --git a/game/data/gfx/border_2.png b/game/data/gfx/border_2.png new file mode 100644 index 0000000000000000000000000000000000000000..08acdb6b556a549a6902d0e9b88393b2985b91dd GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrH!3HFQ?xr?@1d4;)ofy`glX(f`a29w(7Bet# z3xhBt!>l<HKtc8rPhVH|o7|F|7OEfe<`w{jBuiW)N}Tg^b5rw57@Uhz6H8K46v{J8 zG8EiBeFMT9`NV;W#64XcLpZJ{b8r^@IG>We`22w-i`SlDV31wP%=K2FV;)cmgQu&X J%Q~loCIEp|EY1J` literal 0 HcmV?d00001 diff --git a/game/data/gfx/border_3.png b/game/data/gfx/border_3.png new file mode 100644 index 0000000000000000000000000000000000000000..e917cb161cbadb1709b6d257c00ed09063c6920a GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pdfpRr>`sfO>Rj}E0wMB=Tm?}k|nMYCC>S|xv6<249-QVi6yBi3gww4 z84B*6z5(HleBwYw0iG_7ArhC9QxXz>oNr+J_HNFBf~T))+YY<y85tM~Ff7r&vAdWl zkJaF$cKG|lM<Xtj9#G+z-^mf!utth4VN&)r*@T3~!V3pym9k5K07GAg!b9t6N27se OGkCiCxvX<aXaWEo+C@nK literal 0 HcmV?d00001 diff --git a/game/data/gfx/border_4.png b/game/data/gfx/border_4.png new file mode 100644 index 0000000000000000000000000000000000000000..0a8591342fd58477c3fdbfc23525084dae112f8a GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y@!3HFyABb!Laf*Z7ofy`glX(f`a29w(7Bet# z3xhBt!>l<HKtc8rPhVH|o7|F|=H@N_AHD;HBuiW)N}Tg^b5rw57@Uhz6H8K46v{J8 zG8EiBeFMT9`NV;W#5`RbLpZJ{-`QP!=)ZROdt({9qKS+Q7V7NJ`_35t2dZH3boFyt I=akR{07zaeg#Z8m literal 0 HcmV?d00001 diff --git a/game/data/gfx/border_6.png b/game/data/gfx/border_6.png new file mode 100644 index 0000000000000000000000000000000000000000..18d4c24bee37a54a014cf2d33bc5c9b099386abc GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^%s|Y@!3HFyABb!Laf*Z7ofy`glX(f`a29w(7Bet# z3xhBt!>l<HKtc8rPhVH|o7|F|7VN5gccuV^BuiW)N}Tg^b5rw57@Uhz6H8K46v{J8 zG8EiBeFMT9`NV;WL_J*`LpZJ{^KcgZ$j@GUe!=3kCxBWNnAr`#CT;~PVDNPHb6Mw< G&;$UCr74^M literal 0 HcmV?d00001 diff --git a/game/data/gfx/border_7.png b/game/data/gfx/border_7.png new file mode 100644 index 0000000000000000000000000000000000000000..d8061a78e7ea5faa7ccf27740c352169ce9b6852 GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^#^NA%Cx&(BWL^R}oCO|{#S9GG z!XV7ZFl&wkP>{XE)7O>#CbuM~nE|swh$v7<vcxr_#5q4VH#M(>!MP|ku_QG`p**uB zL&4qCHz2%`PaLSo+SA1`gyVX0N&*Pn*j>!Ttd-Ex9k;Ve-jylx%ZG{G1)O3g7foOD rIjGD~5SgXn#N;dD%EbF%3IjuHhqS;8)xCN^V;DSL{an^LB{Ts5eF`;e literal 0 HcmV?d00001 diff --git a/game/data/gfx/border_8.png b/game/data/gfx/border_8.png new file mode 100644 index 0000000000000000000000000000000000000000..1bf00062ae37fbbdcb8aaa238a0058e6a8d7ea18 GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrH!3HFQ?xr?@1d4;)ofy`glX(f`a29w(7Bet# z3xhBt!>l<HKtc8rPhVH|o7|F|7Wx9aOY(q1k|nMYCC>S|xv6<249-QVi6yBi3gww4 z84B*6z5(HleBwYw5}q!OAsp9}Z|p8URKH9+{JpWk=YnE01_rBLY{nL1_sf847(8A5 KT-G@yGywo?&nv$G literal 0 HcmV?d00001 diff --git a/game/data/gfx/border_9.png b/game/data/gfx/border_9.png new file mode 100644 index 0000000000000000000000000000000000000000..31eb00d4b44439baa6e8d2b4526e3b18e731f9d2 GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pdfpRr>`sfO>Rj}YqR*j{kcFP$r9Iy66gHf+|;}h2Ir#G#FEq$h4Rdj z3<Y;j-+=H&K5?L;EKe855Q)plcXk&as%O(VaC2`%BM3Y_b@jKzB&%CpJc^EdJlWS| z6B2khiyRCOUUQodl7IMNVmA*6^Z;=ID@f7ImyA3H!Tj<&PaJ4jQ+;+9bAfh31LyR| g1zHa5ETRkyr6p3SEH77C0BvRPboFyt=akR{0FgONvj6}9 literal 0 HcmV?d00001 diff --git a/game/engine/Dialog.lua b/game/engine/Dialog.lua index c19c13db8d..567ab7e838 100644 --- a/game/engine/Dialog.lua +++ b/game/engine/Dialog.lua @@ -1,8 +1,12 @@ require "engine.class" +require "engine.Tiles" +require "engine.KeyCommand" --- Handles dialog windows module(..., package.seeall, class.make) +tiles = engine.Tiles.new(16, 16) + --- Create a calendar -- @param definition the file to load that returns a table containing calendar months -- @param datestring a string to format the date when requested, in the format "%s %s %s %d %d", standing for, day, month, year, hour, minute @@ -12,9 +16,10 @@ function _M:init(title, w, h, x, y, alpha, font) self.x = x or (game.w - self.w) / 2 self.y = y or (game.h - self.h) / 2 self.font = font - if not font then self.font = core.display.newFont("/data/font/VeraMono.ttf", 12) end + if not font then self.font = core.display.newFont("/data/font/Vera.ttf", 12) end self.surface = core.display.newSurface(w, h) - self.internal_surface = core.display.newSurface(w, h - 5 - self.font:height()) + self.iw, self.ih = w - 2 * 5, h - 8 - 16 - 3 + self.internal_surface = core.display.newSurface(self.iw, self.ih) self.surface:alpha(alpha or 220) self.changed = true end @@ -24,14 +29,42 @@ function _M:display() local s = self.surface s:erase() - s:drawColorString(self.font, self.title, 2, 0, 255,255,255) + + s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_7.png"), 0, 0) + s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_9.png"), self.w - 9, 0) + s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_1.png"), 0, self.h - 9) + s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_3.png"), self.w - 9, self.h - 9) + for i = 8, self.w - 9 do + s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_8.png"), i, 0) + s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_8.png"), i, 20) + s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_8.png"), i, self.h - 3) + end + for i = 8, self.h - 9 do + s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_4.png"), 0, i) + s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_4.png"), self.w - 3, i) + end + + local tw, th = self.font:size(self.title) + s:drawColorString(self.font, self.title, (self.w - tw) / 2, 4, 255,255,255) self.internal_surface:erase() self:drawDialog(self.internal_surface) - s:merge(self.internal_surface, 0, 5 + self.font:height()) + s:merge(self.internal_surface, 5, 20 + 3) return self.surface end function _M:drawDialog(s) end + +function _M:keyCommands(t) + self.old_key = game.key + game.key = engine.KeyCommand.new() + game.key:addCommands(t) + game.key:setCurrent() +end + +function _M:unload() + game.key = self.old_key + game.key:setCurrent() +end diff --git a/game/engine/Game.lua b/game/engine/Game.lua index 75b40cfaa3..f2aa9a1a9c 100644 --- a/game/engine/Game.lua +++ b/game/engine/Game.lua @@ -54,4 +54,5 @@ function _M:unregisterDialog(d) if not self.dialogs[d] then return end table.remove(self.dialogs, self.dialogs[d]) self.dialogs[d] = nil + d:unload() end diff --git a/game/engine/Key.lua b/game/engine/Key.lua index 90c05dfd79..817c74fbd5 100644 --- a/game/engine/Key.lua +++ b/game/engine/Key.lua @@ -271,3 +271,5 @@ _MENU = 319 _POWER = 320 -- Power Macintosh power key _EURO = 321 -- Some european keyboards _UNDO = 322 -- Atari keyboard has Undo + +__DEFAULT = -10000 diff --git a/game/engine/KeyCommand.lua b/game/engine/KeyCommand.lua index 565fcdfc8a..a6f1308ca2 100644 --- a/game/engine/KeyCommand.lua +++ b/game/engine/KeyCommand.lua @@ -10,8 +10,8 @@ function _M:init() end function _M:receiveKey(sym, ctrl, shift, alt, meta, unicode) - if not self.commands[sym] then return end - if (ctrl or shift or alt or meta) and not self.commands[sym].anymod then + if not self.commands[sym] and not self.commands[self.__DEFAULT] then return end + if self.commands[sym] and (ctrl or shift or alt or meta) and not self.commands[sym].anymod then local mods = {} if alt then mods[#mods+1] = "alt" end if ctrl then mods[#mods+1] = "ctrl" end @@ -21,8 +21,10 @@ function _M:receiveKey(sym, ctrl, shift, alt, meta, unicode) if self.commands[sym][mods] then self.commands[sym][mods](sym, ctrl, shift, alt, meta, unicode) end - elseif self.commands[sym].plain then + elseif self.commands[sym] and self.commands[sym].plain then self.commands[sym].plain(sym, ctrl, shift, alt, meta, unicode) + elseif self.commands[self.__DEFAULT] and self.commands[self.__DEFAULT].plain then + self.commands[self.__DEFAULT].plain(sym, ctrl, shift, alt, meta, unicode) end end diff --git a/game/engine/utils.lua b/game/engine/utils.lua index 6ed5608137..aed5486ffd 100644 --- a/game/engine/utils.lua +++ b/game/engine/utils.lua @@ -141,6 +141,9 @@ do local tmps = core.display.newSurface(1, 1) getmetatable(tmps).__index.drawColorString = function(s, font, str, x, y, r, g, b) local list = str:split("#%x%x%x%x%x%x#", true) + r = r or 255 + g = g or 255 + b = b or 255 for i, v in ipairs(list) do local _, _, nr, ng, nb = v:find("^#(%x%x)(%x%x)(%x%x)#") if nr and ng and nb then @@ -152,4 +155,11 @@ getmetatable(tmps).__index.drawColorString = function(s, font, str, x, y, r, g, end end end + +getmetatable(tmps).__index.drawColorStringCentered = function(s, font, str, dx, dy, dw, dh, r, g, b) + local w, h = font:size(str) + local x, y = dx + (dw - w) / 2, dy + (dh - h) / 2 + s:drawColorString(font, str, x, y, r, g, b) +end + end diff --git a/game/modules/tome/dialogs/Quit.lua b/game/modules/tome/dialogs/Quit.lua index 1863c764ac..a45540fa80 100644 --- a/game/modules/tome/dialogs/Quit.lua +++ b/game/modules/tome/dialogs/Quit.lua @@ -4,9 +4,17 @@ require "engine.Dialog" module(..., package.seeall, class.inherit(engine.Dialog)) function _M:init() - engine.Dialog.init(self, "Realy exit ToME?", 200, 150) + engine.Dialog.init(self, "Realy exit ToME?", 300, 100) + self:keyCommands{ + _y = function() + os.exit() + end, + __DEFAULT = function() + game:unregisterDialog(self) + end, + } end -function _M:drawDialog(s) - s:drawString(self.font, "Press Y to quit, any other keys to stay", 2, 2, 255,255,255) +function _M:drawDialog(s, w, h) + s:drawColorStringCentered(self.font, "Press Y to quit, any other keys to stay", 2, 2, self.iw - 2, self.ih - 2) end -- GitLab