diff --git a/game/engine/Dialog.lua b/game/engine/Dialog.lua index b2b0b9af494ce9abcd83e29da5873ad59a5f536f..882b86114834b963f8bd6b9b11c676eb05c4bd25 100644 --- a/game/engine/Dialog.lua +++ b/game/engine/Dialog.lua @@ -100,12 +100,9 @@ function _M:drawDialog(s) end function _M:keyCommands(t, b) - self.old_key = game.key - game.key = engine.KeyBind.new() - if t then game.key:addCommands(t) end - if b then game.key:addBinds(b) end - game.key:setCurrent() - self.key = game.key + self.key = engine.KeyBind.new() + if t then self.key:addCommands(t) end + if b then self.key:addBinds(b) end end function _M:mouseZones(t) @@ -117,13 +114,12 @@ function _M:mouseZones(t) end end - self.old_mouse = game.mouse - game.mouse = engine.Mouse.new() - game.mouse:registerZones(t) - game.mouse:setCurrent() + self.mouse = engine.Mouse.new() + self.mouse:registerZones(t) end function _M:unload() +--[[ if self.old_key then game.key = self.old_key game.key:setCurrent() @@ -132,6 +128,7 @@ function _M:unload() game.mouse = self.old_mouse game.mouse:setCurrent() end +]] end function _M:drawWBorder(s, x, y, w) diff --git a/game/engine/Game.lua b/game/engine/Game.lua index 9d5437ddfc6f280a4f8b9e54d21b9777cc7f8d44..50e2d016f814cbd489f886cb72feea1fd928f499 100644 --- a/game/engine/Game.lua +++ b/game/engine/Game.lua @@ -129,6 +129,8 @@ end function _M:registerDialog(d) table.insert(self.dialogs, d) self.dialogs[d] = #self.dialogs + if d.key then d.key:setCurrent() end + if d.mouse then d.mouse:setCurrent() end end --- Undisplay a dialog, removing its own keyhandler if needed @@ -137,6 +139,12 @@ function _M:unregisterDialog(d) table.remove(self.dialogs, self.dialogs[d]) self.dialogs[d] = nil d:unload() + -- Update positions + for i, id in ipairs(self.dialogs) do self.dialogs[id] = i end + + local last = self.dialogs[#self.dialogs] or self + if last.key then last.key:setCurrent() end + if last.mouse then last.mouse:setCurrent() end end --- The C core gives us command line arguments diff --git a/game/engine/Key.lua b/game/engine/Key.lua index d49268f2e4d3b62b00e7c9dcad150140a655a7a4..1d2e1c1937a891e271a3519f1422bf87df45a690 100644 --- a/game/engine/Key.lua +++ b/game/engine/Key.lua @@ -40,7 +40,7 @@ end --- Setups as the current game keyhandler function _M:setCurrent() core.key.set_current_handler(self) - if game then game.key = self end +-- if game then game.key = self end _M.current = self end diff --git a/game/engine/Mouse.lua b/game/engine/Mouse.lua index bd7e9aafdce225a54d90b7861e2370bfcbf54985..585d9f41d0210070e552462ab2c3736614627c1d 100644 --- a/game/engine/Mouse.lua +++ b/game/engine/Mouse.lua @@ -50,7 +50,7 @@ end --- Setups as the current game keyhandler function _M:setCurrent() core.mouse.set_current_handler(self) - if game then game.mouse = self end +-- if game then game.mouse = self end _M.current = self end diff --git a/game/engine/interface/GameMusic.lua b/game/engine/interface/GameMusic.lua index 5477d3caeaee15ae23c75647b9bd0fd579d0a373..cb80dd25f33774fc66f2b1f72e985fb2e58e2f09 100644 --- a/game/engine/interface/GameMusic.lua +++ b/game/engine/interface/GameMusic.lua @@ -32,7 +32,7 @@ function _M:loaded() self.loaded_musics = self.loaded_musics or {} end -function _M:playMusic(name) +function _M:playMusic(name, loop) name = name or self.current_music if not name then return end local m = self.loaded_musics[name] @@ -45,7 +45,7 @@ function _M:playMusic(name) if self.current_music then core.sound.musicStop() end - m:play() + m:play(loop or -1) self.current_music = name self.playing_music = true end diff --git a/game/modules/tome/class/interface/Combat.lua b/game/modules/tome/class/interface/Combat.lua index 84275424f23b45ba0b0c0f55d6fc306a5accfa3e..3e3cc5cdde257eaa3201e2f5164ffd6368b0370d 100644 --- a/game/modules/tome/class/interface/Combat.lua +++ b/game/modules/tome/class/interface/Combat.lua @@ -164,6 +164,7 @@ function _M:archeryShoot(damtype, mult, on_hit, tg, params) local target = game.level.map(tx, ty, game.level.map.ACTOR) if not target then return end + ret.firsttarget = ret.firsttarget or target ammo = ammo.combat damtype = damtype or ammo.damtype or DamageType.PHYSICAL @@ -211,8 +212,8 @@ function _M:archeryShoot(damtype, mult, on_hit, tg, params) -- If we used only one arrow, use it if params.one_shot then self:removeObject(self:getInven("QUIVER"), 1) end - if sound then game:playSoundNear(self, sound) - elseif sound_miss then game:playSoundNear(self, sound_miss) end + if sound then game:playSoundNear(ret.firsttarget or self, sound) + elseif sound_miss then game:playSoundNear(ret.firsttarget or self, sound_miss) end return ret.hitted end