diff --git a/game/data/gfx/border_1.png b/game/data/gfx/border_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d78094cb84a22e1fcbf7f2019bc15545db9acd2f Binary files /dev/null and b/game/data/gfx/border_1.png differ diff --git a/game/data/gfx/border_2.png b/game/data/gfx/border_2.png new file mode 100644 index 0000000000000000000000000000000000000000..08acdb6b556a549a6902d0e9b88393b2985b91dd Binary files /dev/null and b/game/data/gfx/border_2.png differ diff --git a/game/data/gfx/border_3.png b/game/data/gfx/border_3.png new file mode 100644 index 0000000000000000000000000000000000000000..e917cb161cbadb1709b6d257c00ed09063c6920a Binary files /dev/null and b/game/data/gfx/border_3.png differ diff --git a/game/data/gfx/border_4.png b/game/data/gfx/border_4.png new file mode 100644 index 0000000000000000000000000000000000000000..0a8591342fd58477c3fdbfc23525084dae112f8a Binary files /dev/null and b/game/data/gfx/border_4.png differ diff --git a/game/data/gfx/border_6.png b/game/data/gfx/border_6.png new file mode 100644 index 0000000000000000000000000000000000000000..18d4c24bee37a54a014cf2d33bc5c9b099386abc Binary files /dev/null and b/game/data/gfx/border_6.png differ diff --git a/game/data/gfx/border_7.png b/game/data/gfx/border_7.png new file mode 100644 index 0000000000000000000000000000000000000000..d8061a78e7ea5faa7ccf27740c352169ce9b6852 Binary files /dev/null and b/game/data/gfx/border_7.png differ diff --git a/game/data/gfx/border_8.png b/game/data/gfx/border_8.png new file mode 100644 index 0000000000000000000000000000000000000000..1bf00062ae37fbbdcb8aaa238a0058e6a8d7ea18 Binary files /dev/null and b/game/data/gfx/border_8.png differ diff --git a/game/data/gfx/border_9.png b/game/data/gfx/border_9.png new file mode 100644 index 0000000000000000000000000000000000000000..31eb00d4b44439baa6e8d2b4526e3b18e731f9d2 Binary files /dev/null and b/game/data/gfx/border_9.png differ diff --git a/game/engine/Dialog.lua b/game/engine/Dialog.lua index c19c13db8dbae84e7dc51bb9d22009eb8be30f21..567ab7e83815d2423628f8d385b7b531e07596a1 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 75b40cfaa3dd85bb128feb2a479f5e6cf94c91bd..f2aa9a1a9c51719046411364e7025f0d13fdfdf7 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 90c05dfd7930d20cb938cb5818daa6730728dcd9..817c74fbd5b4e8f68e18e183ac6205b0d970fa1a 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 565fcdfc8acedba21d3801a70d78c8098c5b7fe5..a6f1308ca2e955b749b72e516cdcf74e2d6942c9 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 6ed5608137b2ecf609dbcc46e2468c87b798e59c..aed5486ffd87d84a83a200e3afee9e6c121327b4 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 1863c764acab90547ca5f564c3802264bdb0aa78..a45540fa8085b9bad69af44c34e0cd29a17c3a3d 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