2012-03-18 14:34:39 +01:00
GameInterface = { }
2012-01-03 21:41:00 +01:00
2012-03-18 14:34:39 +01:00
local WALK_AUTO_REPEAT_DELAY = 90
local gameRootPanel
local gameMapPanel
local gameRightPanel
local gameLeftPanel
local gameBottomPanel
local logoutButton
2012-03-29 21:25:04 +02:00
local mouseGrabberWidget
2012-03-18 14:34:39 +01:00
function GameInterface . init ( )
connect ( g_game , { onGameStart = GameInterface.show } , true )
connect ( g_game , { onGameEnd = GameInterface.hide } , true )
gameRootPanel = displayUI ( ' gameinterface.otui ' )
gameRootPanel : hide ( )
gameRootPanel : lower ( )
2012-03-29 21:25:04 +02:00
mouseGrabberWidget = gameRootPanel : getChildById ( ' mouseGrabber ' )
mouseGrabberWidget.onMouseRelease = GameInterface.onUseWithMouseRelease
2012-03-18 14:34:39 +01:00
gameMapPanel = gameRootPanel : getChildById ( ' gameMapPanel ' )
gameRightPanel = gameRootPanel : getChildById ( ' gameRightPanel ' )
gameLeftPanel = gameRootPanel : getChildById ( ' gameLeftPanel ' )
gameBottomPanel = gameRootPanel : getChildById ( ' gameBottomPanel ' )
logoutButton = TopMenu.addRightButton ( ' logoutButton ' , ' Logout ' , ' images/logout.png ' , GameInterface.tryLogout )
logoutButton : hide ( )
Keyboard.bindKeyPress ( ' Up ' , function ( ) g_game.walk ( North ) end , gameRootPanel , WALK_AUTO_REPEAT_DELAY )
Keyboard.bindKeyPress ( ' Right ' , function ( ) g_game.walk ( East ) end , gameRootPanel , WALK_AUTO_REPEAT_DELAY )
Keyboard.bindKeyPress ( ' Down ' , function ( ) g_game.walk ( South ) end , gameRootPanel , WALK_AUTO_REPEAT_DELAY )
Keyboard.bindKeyPress ( ' Left ' , function ( ) g_game.walk ( West ) end , gameRootPanel , WALK_AUTO_REPEAT_DELAY )
Keyboard.bindKeyPress ( ' Numpad8 ' , function ( ) g_game.walk ( North ) end , gameRootPanel , WALK_AUTO_REPEAT_DELAY )
Keyboard.bindKeyPress ( ' Numpad9 ' , function ( ) g_game.walk ( NorthEast ) end , gameRootPanel , WALK_AUTO_REPEAT_DELAY )
Keyboard.bindKeyPress ( ' Numpad6 ' , function ( ) g_game.walk ( East ) end , gameRootPanel , WALK_AUTO_REPEAT_DELAY )
Keyboard.bindKeyPress ( ' Numpad3 ' , function ( ) g_game.walk ( SouthEast ) end , gameRootPanel , WALK_AUTO_REPEAT_DELAY )
Keyboard.bindKeyPress ( ' Numpad2 ' , function ( ) g_game.walk ( South ) end , gameRootPanel , WALK_AUTO_REPEAT_DELAY )
Keyboard.bindKeyPress ( ' Numpad1 ' , function ( ) g_game.walk ( SouthWest ) end , gameRootPanel , WALK_AUTO_REPEAT_DELAY )
Keyboard.bindKeyPress ( ' Numpad4 ' , function ( ) g_game.walk ( West ) end , gameRootPanel , WALK_AUTO_REPEAT_DELAY )
Keyboard.bindKeyPress ( ' Numpad7 ' , function ( ) g_game.walk ( NorthWest ) end , gameRootPanel , WALK_AUTO_REPEAT_DELAY )
Keyboard.bindKeyPress ( ' Ctrl+Up ' , function ( ) g_game.turn ( North ) end , gameRootPanel , WALK_AUTO_REPEAT_DELAY )
Keyboard.bindKeyPress ( ' Ctrl+Right ' , function ( ) g_game.turn ( East ) end , gameRootPanel , WALK_AUTO_REPEAT_DELAY )
Keyboard.bindKeyPress ( ' Ctrl+Down ' , function ( ) g_game.turn ( South ) end , gameRootPanel , WALK_AUTO_REPEAT_DELAY )
Keyboard.bindKeyPress ( ' Ctrl+Left ' , function ( ) g_game.turn ( West ) end , gameRootPanel , WALK_AUTO_REPEAT_DELAY )
Keyboard.bindKeyPress ( ' Ctrl+Numpad8 ' , function ( ) g_game.turn ( North ) end , gameRootPanel , WALK_AUTO_REPEAT_DELAY )
Keyboard.bindKeyPress ( ' Ctrl+Numpad6 ' , function ( ) g_game.turn ( East ) end , gameRootPanel , WALK_AUTO_REPEAT_DELAY )
Keyboard.bindKeyPress ( ' Ctrl+Numpad2 ' , function ( ) g_game.turn ( South ) end , gameRootPanel , WALK_AUTO_REPEAT_DELAY )
Keyboard.bindKeyPress ( ' Ctrl+Numpad4 ' , function ( ) g_game.turn ( West ) end , gameRootPanel , WALK_AUTO_REPEAT_DELAY )
Keyboard.bindKeyPress ( ' Escape ' , function ( ) g_game.cancelAttackAndFollow ( ) end , gameRootPanel , WALK_AUTO_REPEAT_DELAY )
2012-03-30 12:21:24 +02:00
Keyboard.bindKeyPress ( ' Ctrl+= ' , function ( ) gameMapPanel : zoomIn ( ) end , gameRootPanel , 250 )
2012-03-23 23:19:53 +01:00
Keyboard.bindKeyPress ( ' Ctrl+- ' , function ( ) gameMapPanel : zoomOut ( ) end , gameRootPanel , 250 )
2012-03-18 14:34:39 +01:00
if g_game.isOnline ( ) then
GameInterface.show ( )
end
2012-01-13 01:31:39 +01:00
end
2012-03-18 14:34:39 +01:00
function GameInterface . terminate ( )
disconnect ( g_game , { onGameStart = GameInterface.show } )
disconnect ( g_game , { onGameEnd = GameInterface.hide } )
logoutButton : destroy ( )
logoutButton = nil
gameRootPanel : destroy ( )
gameRootPanel = nil
gameMapPanel = nil
gameRightPanel = nil
gameLeftPanel = nil
gameBottomPanel = nil
2012-03-29 21:25:04 +02:00
mouseGrabberWidget = nil
2012-03-18 14:34:39 +01:00
GameInterface = nil
2012-01-13 01:31:39 +01:00
end
2012-03-18 14:34:39 +01:00
function GameInterface . show ( )
g_app.onClose = GameInterface.tryExit
logoutButton : show ( )
Background.hide ( )
gameRootPanel : show ( )
gameRootPanel : focus ( )
gameMapPanel : followCreature ( g_game.getLocalPlayer ( ) )
end
2012-01-12 02:21:59 +01:00
2012-03-18 14:34:39 +01:00
function GameInterface . hide ( )
gameRootPanel : hide ( )
logoutButton : hide ( )
Background.show ( )
g_app.onClose = nil
end
2012-01-12 02:21:59 +01:00
2012-03-18 14:34:39 +01:00
function GameInterface . tryExit ( )
if g_game.isOnline ( ) then
g_game.forceLogout ( )
scheduleEvent ( exit , 10 )
2012-01-09 21:54:37 +01:00
end
end
2012-03-18 14:34:39 +01:00
function GameInterface . tryLogout ( )
if g_game.isOnline ( ) then
g_game.safeLogout ( )
return true
end
end
2012-01-09 21:54:37 +01:00
2012-03-29 01:19:28 +02:00
function GameInterface . onUseWithMouseRelease ( self , mousePosition , mouseButton )
if GameInterface.selectedThing == nil then return false end
if mouseButton == MouseLeftButton then
local clickedWidget = gameRootPanel : recursiveGetChildByPos ( mousePosition , false )
if clickedWidget then
if clickedWidget : getClassName ( ) == ' UIMap ' then
local tile = clickedWidget : getTile ( mousePosition )
if tile then
g_game.useWith ( GameInterface.selectedThing , tile : getTopMultiUseThing ( ) )
end
elseif clickedWidget : getClassName ( ) == ' UIItem ' and not clickedWidget : isVirtual ( ) then
g_game.useWith ( GameInterface.selectedThing , clickedWidget : getItem ( ) )
end
end
end
GameInterface.selectedThing = nil
Mouse.restoreCursor ( )
self : ungrabMouse ( )
return true
end
function GameInterface . startUseWith ( thing )
GameInterface.selectedThing = thing
2012-03-29 21:25:04 +02:00
mouseGrabberWidget : grabMouse ( )
2012-03-29 01:19:28 +02:00
Mouse.setTargetCursor ( )
end
2012-03-18 14:34:39 +01:00
function GameInterface . createThingMenu ( menuPosition , lookThing , useThing , creatureThing )
2012-01-03 21:41:00 +01:00
local menu = createWidget ( ' PopupMenu ' )
2012-01-12 02:21:59 +01:00
2012-01-04 14:02:35 +01:00
if lookThing then
2012-02-08 22:23:15 +01:00
menu : addOption ( ' Look ' , function ( ) g_game.look ( lookThing ) end )
2012-01-04 14:02:35 +01:00
end
2012-01-03 21:41:00 +01:00
2012-01-04 14:02:35 +01:00
if useThing then
if useThing : isContainer ( ) then
2012-03-23 14:48:05 +01:00
if useThing : getParentContainer ( ) then
2012-04-03 01:09:47 +02:00
menu : addOption ( ' Open ' , function ( ) g_game.open ( useThing , useThing : getParentContainer ( ) ) end )
menu : addOption ( ' Open in new window ' , function ( ) g_game.open ( useThing , nil ) end )
2012-01-13 01:31:39 +01:00
else
2012-04-03 01:09:47 +02:00
menu : addOption ( ' Open ' , function ( ) g_game.open ( useThing , nil ) end )
2012-01-13 01:31:39 +01:00
end
2012-01-03 23:27:31 +01:00
else
2012-01-04 14:02:35 +01:00
if useThing : isMultiUse ( ) then
2012-03-29 01:19:28 +02:00
menu : addOption ( ' Use with ... ' , function ( ) GameInterface.startUseWith ( useThing ) end )
2012-01-03 23:27:31 +01:00
else
2012-02-08 22:23:15 +01:00
menu : addOption ( ' Use ' , function ( ) g_game.use ( useThing ) end )
2012-01-03 23:27:31 +01:00
end
end
2012-01-12 02:21:59 +01:00
2012-01-04 14:02:35 +01:00
if useThing : isRotateable ( ) then
2012-02-08 22:23:15 +01:00
menu : addOption ( ' Rotate ' , function ( ) g_game.rotate ( useThing ) end )
2012-01-03 23:27:31 +01:00
end
2012-01-12 02:21:59 +01:00
2012-01-09 01:43:36 +01:00
end
2012-01-12 02:21:59 +01:00
2012-01-09 01:43:36 +01:00
if lookThing and not lookThing : asCreature ( ) and not lookThing : isNotMoveable ( ) and lookThing : isPickupable ( ) then
menu : addSeparator ( )
menu : addOption ( ' Trade with ... ' , function ( ) print ( ' trade with ' ) end )
2012-01-04 14:02:35 +01:00
end
2012-01-12 02:21:59 +01:00
2012-01-09 01:43:36 +01:00
-- check for move up
2012-01-12 02:21:59 +01:00
2012-01-04 14:02:35 +01:00
if creatureThing then
2012-01-03 23:27:31 +01:00
menu : addSeparator ( )
2012-01-12 02:21:59 +01:00
2012-01-04 14:02:35 +01:00
if creatureThing : asLocalPlayer ( ) then
2012-02-08 22:23:15 +01:00
menu : addOption ( ' Set Outfit ' , function ( ) g_game.requestOutfit ( ) end )
2012-01-12 02:21:59 +01:00
2012-03-18 14:34:39 +01:00
if creatureThing : isPartyMember ( ) --[[and not fighting]] then
if creatureThing : isPartyLeader ( ) then
if creatureThing : isPartySharedExperienceActive ( ) then
2012-02-08 22:23:15 +01:00
menu : addOption ( ' Disable Shared Experience ' , function ( ) g_game.partyShareExperience ( false ) end )
2012-01-11 00:38:32 +01:00
else
2012-02-08 22:23:15 +01:00
menu : addOption ( ' Enable Shared Experience ' , function ( ) g_game.partyShareExperience ( true ) end )
2012-01-11 00:38:32 +01:00
end
end
2012-02-08 22:23:15 +01:00
menu : addOption ( ' Leave Party ' , function ( ) g_game.partyLeave ( ) end )
2012-01-11 00:38:32 +01:00
end
2012-01-12 02:21:59 +01:00
2012-01-03 23:27:31 +01:00
else
2012-02-08 22:23:15 +01:00
local localPlayer = g_game.getLocalPlayer ( )
2012-01-07 23:24:29 +01:00
if localPlayer then
2012-02-08 22:23:15 +01:00
if g_game.getAttackingCreature ( ) ~= creatureThing then
menu : addOption ( ' Attack ' , function ( ) g_game.attack ( creatureThing ) end )
2012-01-07 23:24:29 +01:00
else
2012-02-08 22:23:15 +01:00
menu : addOption ( ' Stop Attack ' , function ( ) g_game.cancelAttack ( ) end )
2012-01-07 23:24:29 +01:00
end
2012-01-12 02:21:59 +01:00
2012-02-08 22:23:15 +01:00
if g_game.getFollowingCreature ( ) ~= creatureThing then
menu : addOption ( ' Follow ' , function ( ) g_game.follow ( creatureThing ) end )
2012-01-07 23:24:29 +01:00
else
2012-02-08 22:23:15 +01:00
menu : addOption ( ' Stop Follow ' , function ( ) g_game.cancelFollow ( ) end )
2012-01-07 23:24:29 +01:00
end
2012-01-12 02:21:59 +01:00
2012-01-11 00:38:32 +01:00
if creatureThing : asPlayer ( ) then
menu : addSeparator ( )
2012-03-29 15:45:40 +02:00
local creatureName = creatureThing : getName ( )
menu : addOption ( ' Message to ' .. creatureName , function ( ) g_game.openPrivateChannel ( creatureName ) end )
2012-04-24 13:20:14 +02:00
if Console.getOwnPrivateTab ( ) then
menu : addOption ( ' Invite to private chat ' , function ( ) g_game.inviteToOwnChannel ( creatureName ) end )
menu : addOption ( ' Exclude from private chat ' , function ( ) g_game.excludeFromOwnChannel ( creatureName ) end ) -- [TODO] must be removed after message's popup labels been implemented
end
2012-03-29 15:45:40 +02:00
menu : addOption ( ' Add to VIP list ' , function ( ) g_game.addVip ( creatureName ) end )
2012-01-12 02:21:59 +01:00
2012-01-11 00:38:32 +01:00
local localPlayerShield = localPlayer : asCreature ( ) : getShield ( )
local creatureShield = creatureThing : getShield ( )
2012-01-12 02:21:59 +01:00
2012-01-11 00:38:32 +01:00
if localPlayerShield == ShieldNone or localPlayerShield == ShieldWhiteBlue then
if creatureShield == ShieldWhiteYellow then
2012-02-08 22:23:15 +01:00
menu : addOption ( ' Join ' .. creatureThing : getName ( ) .. ' \' s Party ' , function ( ) g_game.partyJoin ( creatureThing : getId ( ) ) end )
2012-01-11 00:38:32 +01:00
else
2012-02-08 22:23:15 +01:00
menu : addOption ( ' Invite to Party ' , function ( ) g_game.partyInvite ( creatureThing : getId ( ) ) end )
2012-01-11 00:38:32 +01:00
end
elseif localPlayerShield == ShieldWhiteYellow then
if creatureShield == ShieldWhiteBlue then
2012-02-08 22:23:15 +01:00
menu : addOption ( ' Revoke ' .. creatureThing : getName ( ) .. ' \' s Invitation ' , function ( ) g_game.partyRevokeInvitation ( creatureThing : getId ( ) ) end )
2012-01-11 00:38:32 +01:00
end
elseif localPlayerShield == ShieldYellow or localPlayerShield == ShieldYellowSharedExp or localPlayerShield == ShieldYellowNoSharedExpBlink or localPlayerShield == ShieldYellowNoSharedExp then
if creatureShield == ShieldWhiteBlue then
2012-02-08 22:23:15 +01:00
menu : addOption ( ' Revoke ' .. creatureThing : getName ( ) .. ' \' s Invitation ' , function ( ) g_game.partyRevokeInvitation ( creatureThing : getId ( ) ) end )
2012-01-11 00:38:32 +01:00
elseif creatureShield == ShieldBlue or creatureShield == ShieldBlueSharedExp or creatureShield == ShieldBlueNoSharedExpBlink or creatureShield == ShieldBlueNoSharedExp then
2012-02-08 22:23:15 +01:00
menu : addOption ( ' Pass Leadership to ' .. creatureThing : getName ( ) , function ( ) g_game.partyPassLeadership ( creatureThing : getId ( ) ) end )
2012-01-11 00:38:32 +01:00
else
2012-02-08 22:23:15 +01:00
menu : addOption ( ' Invite to Party ' , function ( ) g_game.partyInvite ( creatureThing : getId ( ) ) end )
2012-01-11 00:38:32 +01:00
end
end
end
2012-01-05 15:24:38 +01:00
end
2012-01-03 23:27:31 +01:00
end
menu : addSeparator ( )
2012-01-05 13:48:10 +01:00
menu : addOption ( ' Copy Name ' , function ( ) g_window.setClipboardText ( creatureThing : getName ( ) ) end )
2012-01-12 02:21:59 +01:00
2012-01-03 21:41:00 +01:00
end
2012-01-12 02:21:59 +01:00
2012-01-03 21:41:00 +01:00
menu : display ( menuPosition )
end
2012-01-13 01:31:39 +01:00
2012-03-18 14:34:39 +01:00
function GameInterface . processMouseAction ( menuPosition , mouseButton , autoWalk , lookThing , useThing , creatureThing , multiUseThing )
local keyboardModifiers = g_window.getKeyboardModifiers ( )
if autoWalk and keyboardModifiers == KeyboardNoModifier and mouseButton == MouseLeftButton then
-- todo auto walk
return true
end
2012-03-23 15:48:00 +01:00
if not Options.getOption ( ' classicControl ' ) then
2012-03-18 14:34:39 +01:00
if keyboardModifiers == KeyboardNoModifier and mouseButton == MouseRightButton then
GameInterface.createThingMenu ( menuPosition , lookThing , useThing , creatureThing )
return true
elseif lookThing and keyboardModifiers == KeyboardShiftModifier and ( mouseButton == MouseLeftButton or mouseButton == MouseRightButton ) then
g_game.look ( lookThing )
return true
elseif useThing and keyboardModifiers == KeyboardCtrlModifier and ( mouseButton == MouseLeftButton or mouseButton == MouseRightButton ) then
if useThing : isContainer ( ) then
2012-03-23 14:48:05 +01:00
if useThing : getParentContainer ( ) then
2012-04-03 01:09:47 +02:00
g_game.open ( useThing , useThing : getParentContainer ( ) )
2012-03-18 14:34:39 +01:00
return true
else
2012-04-03 01:09:47 +02:00
g_game.open ( useThing , nil )
2012-03-18 14:34:39 +01:00
return true
end
elseif useThing : isMultiUse ( ) then
2012-03-29 01:19:28 +02:00
GameInterface.startUseWith ( useThing )
2012-03-18 14:34:39 +01:00
return true
else
g_game.use ( useThing )
return true
end
return true
elseif creatureThing and keyboardModifiers == KeyboardAltModifier and ( mouseButton == MouseLeftButton or mouseButton == MouseRightButton ) then
g_game.attack ( creatureThing )
return true
end
else
if multiUseThing and keyboardModifiers == KeyboardNoModifier and mouseButton == MouseRightButton then
if multiUseThing : asCreature ( ) then
g_game.attack ( multiUseThing : asCreature ( ) )
return true
elseif multiUseThing : isContainer ( ) then
2012-03-23 14:48:05 +01:00
if multiUseThing : getParentContainer ( ) then
2012-04-03 01:09:47 +02:00
g_game.open ( multiUseThing , multiUseThing : getParentContainer ( ) )
2012-03-18 14:34:39 +01:00
return true
else
2012-04-03 01:09:47 +02:00
g_game.open ( multiUseThing , nil )
2012-03-18 14:34:39 +01:00
return true
end
elseif multiUseThing : isMultiUse ( ) then
2012-03-29 01:19:28 +02:00
GameInterface.startUseWith ( useThing )
2012-03-18 14:34:39 +01:00
return true
else
g_game.use ( multiUseThing )
end
return true
elseif lookThing and keyboardModifiers == KeyboardShiftModifier and ( mouseButton == MouseLeftButton or mouseButton == MouseRightButton ) then
g_game.look ( lookThing )
return true
elseif useThing and keyboardModifiers == KeyboardCtrlModifier and ( mouseButton == MouseLeftButton or mouseButton == MouseRightButton ) then
GameInterface.createThingMenu ( menuPosition , lookThing , useThing , creatureThing )
return true
elseif creatureThing and keyboardModifiers == KeyboardAltModifier and ( mouseButton == MouseLeftButton or mouseButton == MouseRightButton ) then
g_game.attack ( creatureThing )
return true
end
end
return false
end
2012-03-29 15:45:40 +02:00
function GameInterface . moveStackableItem ( item , toPos )
local count = item : getCount ( )
local countWindow = createWidget ( ' CountWindow ' , rootWidget )
local spinbox = countWindow : getChildById ( ' countSpinBox ' )
local scrollbar = countWindow : getChildById ( ' countScrollBar ' )
spinbox : setMaximum ( count )
spinbox : setMinimum ( 1 )
spinbox : setValue ( count )
scrollbar : setMaximum ( count )
scrollbar : setMinimum ( 1 )
scrollbar : setValue ( count )
scrollbar.onValueChange = function ( self , value ) spinbox : setValue ( value ) end
spinbox.onValueChange = function ( self , value ) scrollbar : setValue ( value ) end
local okButton = countWindow : getChildById ( ' buttonOk ' )
local moveFunc = function ( )
g_game.move ( item , toPos , spinbox : getValue ( ) )
okButton : getParent ( ) : destroy ( )
end
countWindow.onEnter = moveFunc
okButton.onClick = moveFunc
end
2012-03-18 14:34:39 +01:00
function GameInterface . getRootPanel ( )
return gameRootPanel
end
function GameInterface . getMapPanel ( )
return gameMapPanel
end
function GameInterface . getRightPanel ( )
return gameRightPanel
end
function GameInterface . getLeftPanel ( )
return gameLeftPanel
end
function GameInterface . getBottomPanel ( )
return gameBottomPanel
end